Оформить с использованием меню с вызовом соответствующих функций. В задачах, которые предусматривают обработку списка записей (студенты, читатели, автомобили и т.п.), предусмотреть ввод первоначальной информации из файла.
Ввести структуру с полями ЧИСЛИТЕЛЬ и ЗНАМЕНАТЕЛЬ для описания понятия РАЦИОНАЛЬНОЕ ЧИСЛО. Составить и протестировать функции
а. ввода и вывода на экран рационального числа;
b. поиска в массиве X[N] рациональных чисел всех, равных заданному, и подсчета их количества (с учетом возможности сокращений, например, дроби 2/4 и 4/8 равны)
На языке Си.
Ответы
Ответ:
#include <stdio.h>
#include <stdlib.h>
typedef struct {
int numerator;
int denominator;
} Rational;
void printRational(Rational r) {
printf("%d/%d", r.numerator, r.denominator);
}
void readRational(Rational *r) {
printf("Enter the numerator: ");
scanf("%d", &r->numerator);
printf("Enter the denominator: ");
scanf("%d", &r->denominator);
}
int gcd(int a, int b) {
if (b == 0) {
return a;
} else {
return gcd(b, a % b);
}
}
void reduceRational(Rational *r) {
int gcd_num = gcd(r->numerator, r->denominator);
r->numerator /= gcd_num;
r->denominator /= gcd_num;
}
int isEqual(Rational r1, Rational r2) {
reduceRational(&r1);
reduceRational(&r2);
return r1.numerator == r2.numerator && r1.denominator == r2.denominator;
}
int countEqual(Rational arr[], int n, Rational r) {
int count = 0;
for (int i = 0; i < n; i++) {
if (isEqual(arr[i], r)) {
count++;
}
}
return count;
}
int main() {
int n = 10; // размер массива
Rational arr[n]; // массив рациональных чисел
FILE *file = fopen("input.txt", "r"); // открытие файла для чтения
if (file == NULL) {
printf("Failed to open file.");
exit(1);
}
for (int i = 0; i < n; i++) {
fscanf(file, "%d/%d", &arr[i].numerator, &arr[i].denominator);
}
fclose(file); // закрытие файла
int choice = 0;
Rational r;
int count = 0;
while (choice != 3) {
printf("\nMENU\n");
printf("1. Enter a rational number\n");
printf("2. Count rational numbers equal to a given one\n");
printf("3. Quit\n");
printf("Enter your choice: ");
scanf("%d", &choice);
switch (choice) {
case 1:
readRational(&r);
printf("You entered: ");
printRational(r);
printf("\n");
break;
case 2:
readRational(&r);
count = countEqual(arr, n, r);
printf("Number of rational numbers equal to ");
printRational(r);
printf(" is %d\n", count);
break;
case 3:
printf("Exiting...\n");
break;
default:
printf("Invalid choice.\n");
break;
}
}
return 0;
}