Упрощение дробей (НОД) на C

CBeginner
Практиковаться сейчас

Введение

В этом лабораторном практикуме вы научитесь упрощать дроби, используя алгоритм наибольшего общего делителя (НОД) на языке программирования C. Практикум охватывает следующие шаги: ввод числителя и знаменателя с помощью пользовательского ввода, вычисление НОД и затем деление и числителя, и знаменателя на НОД для получения упрощенной дроби. Этот практикум призван помочь вам понять концепцию упрощения дробей и реализовать её с помощью методов программирования на языке C.

Чтение числителя и знаменателя

В этом шаге вы узнаете, как читать числитель и знаменатель из пользовательского ввода в программе на C для упрощения дробей.

Сначала создадим новый файл C для нашей программы упрощения дробей:

cd ~/project
nano fraction_simplify.c

Теперь добавьте следующий код для чтения числителя и знаменателя:

#include <stdio.h>

int main() {
    int numerator, denominator;

    printf("Enter the numerator: ");
    scanf("%d", &numerator);

    printf("Enter the denominator: ");
    scanf("%d", &denominator);

    printf("Numerator: %d\n", numerator);
    printf("Denominator: %d\n", denominator);

    return 0;
}

Теперь скомпилируем и запустим программу:

gcc fraction_simplify.c -o fraction_simplify
./fraction_simplify

Пример вывода:

Enter the numerator: 12
Enter the denominator: 18
Numerator: 12
Denominator: 18

Описание кода:

  • scanf() используется для чтения целочисленного ввода от пользователя
  • %d — спецификатор формата для целых чисел
  • &numerator и &denominator передают адреса памяти для хранения введённых значений
  • printf() используется для отображения введённого числителя и знаменателя

Вычисление НОД и деление

В этом шаге вы реализуете алгоритм наибольшего общего делителя (НОД) и используете его для упрощения дроби.

Давайте изменим предыдущую программу, добавив функцию вычисления НОД:

cd ~/project
nano fraction_simplify.c

Обновите код следующим реализацией:

#include <stdio.h>

// Функция для вычисления НОД с помощью алгоритма Евклида
int computeGCD(int a, int b) {
    // Обеспечение положительных значений
    a = (a > 0) ? a : -a;
    b = (b > 0) ? b : -b;

    // Алгоритм Евклида
    while (b != 0) {
        int temp = b;
        b = a % b;
        a = temp;
    }

    return a;
}

int main() {
    int numerator, denominator, gcd;

    printf("Enter the numerator: ");
    scanf("%d", &numerator);

    printf("Enter the denominator: ");
    scanf("%d", &denominator);

    // Вычисление НОД
    gcd = computeGCD(numerator, denominator);

    // Упрощение дроби
    int simplified_numerator = numerator / gcd;
    int simplified_denominator = denominator / gcd;

    printf("Original Fraction: %d/%d\n", numerator, denominator);
    printf("Simplified Fraction: %d/%d\n", simplified_numerator, simplified_denominator);

    return 0;
}

Скомпилируйте и запустите программу:

gcc fraction_simplify.c -o fraction_simplify
./fraction_simplify

Пример вывода:

Enter the numerator: 12
Enter the denominator: 18
Original Fraction: 12/18
Simplified Fraction: 2/3

Описание кода:

  • computeGCD() реализует алгоритм Евклида для нахождения наибольшего общего делителя
  • Функция обрабатывает как положительные, так и отрицательные числа
  • Дробь упрощается путём деления числителя и знаменателя на их НОД
  • Обрабатываются крайние случаи, такие как нулевые и отрицательные значения.

Вывод упрощенной дроби

В этом шаге вы улучшите программу упрощения дробей, чтобы она обрабатывала различные сценарии ввода и предоставляла четкий формат вывода.

Обновим программу, включив более надёжный вывод дробей:

cd ~/project
nano fraction_simplify.c

Обновите код следующим реализацией:

#include <stdio.h>

// Функция для вычисления НОД с помощью алгоритма Евклида
int computeGCD(int a, int b) {
    a = (a > 0) ? a : -a;
    b = (b > 0) ? b : -b;

    while (b != 0) {
        int temp = b;
        b = a % b;
        a = temp;
    }

    return a;
}

// Функция для вывода дроби с обработкой особых случаев
void printFraction(int numerator, int denominator) {
    // Обработка деления на ноль
    if (denominator == 0) {
        printf("Error: Деление на ноль недопустимо.\n");
        return;
    }

    // Вычисление НОД
    int gcd = computeGCD(numerator, denominator);

    // Упрощение дроби
    int simplified_numerator = numerator / gcd;
    int simplified_denominator = denominator / gcd;

    // Обработка знака
    if (simplified_denominator < 0) {
        simplified_numerator = -simplified_numerator;
        simplified_denominator = -simplified_denominator;
    }

    // Вывод результатов
    printf("Original Fraction: %d/%d\n", numerator, denominator);

    // Разный вывод для целых чисел и дробей
    if (simplified_denominator == 1) {
        printf("Simplified Fraction: %d\n", simplified_numerator);
    } else {
        printf("Simplified Fraction: %d/%d\n",
               simplified_numerator, simplified_denominator);
    }
}

int main() {
    int numerator, denominator;

    printf("Enter the numerator: ");
    scanf("%d", &numerator);

    printf("Enter the denominator: ");
    scanf("%d", &denominator);

    // Вызов функции вывода дроби
    printFraction(numerator, denominator);

    return 0;
}

Скомпилируйте и запустите программу:

gcc fraction_simplify.c -o fraction_simplify
./fraction_simplify

Примеры вывода:

Enter the numerator: 12
Enter the denominator: 18
Original Fraction: 12/18
Simplified Fraction: 2/3

Enter the numerator: 15
Enter the denominator: 5
Original Fraction: 15/5
Simplified Fraction: 3

Enter the numerator: -12
Enter the denominator: 18
Original Fraction: -12/18
Simplified Fraction: -2/3

Описание кода:

  • Добавлена функция printFraction() для обработки вывода дроби
  • Обрабатываются особые случаи, такие как деление на ноль
  • Управляется знак упрощенной дроби
  • Выводятся целые числа, когда знаменатель равен 1
  • Сохраняется исходный знак дроби

Резюме

В этом лабораторном практикуме вы научитесь считывать числитель и знаменатель из пользовательского ввода, вычислять наибольший общий делитель (НОД) с помощью алгоритма Евклида и затем упрощать дробь, разделив числитель и знаменатель на НОД. Упрощенная дробь будет выведена в качестве результата.

Ключевые шаги: 1) считывание числителя и знаменателя из пользовательского ввода, 2) реализация алгоритма Евклида для нахождения наибольшего общего делителя и 3) деление числителя и знаменателя на НОД для получения упрощенной дроби.