Блок задач

3. Структуры данных

Темы
Сложность 5

Задача «Рациональные числа»

Пусть рациональное число представлено в виде

typedef struct _Rational {
    int numer;  /* numerator, числитель */
    int denom; /* denominator, знаменатель */
} Rational;

Реализовать арифметику:

void rat_add(Rational *result, Rational *a, Rational *b);
void rat_sub(Rational *result, Rational *a, Rational *b);
void rat_mul(Rational *result, Rational *a, Rational *b);
void rat_div(Rational *result, Rational *a, Rational *b);
/* возведение в целочисленную степень. power может быть отрицательным! */
void rat_power(Rational *result, Rational *r, int power);

После арифметических операций результат должен приводиться к каноническому виду (числитель и знаменатель сокращаются, т.е. делятся на их наибольший общий делитель, см. задачу «Наибольший общий делитель»).

Для реализации rat_power можно использовать быстрое возведение в степень (см. задачу «Целая степень»).

Конструирование:

void rat_create(Rational *res, int a, int b);

Сравнение:

/* возвращает -1 (a < b), 0 (a == b), 1 (a > b) */
int rat_compare(Rational *a, Rational *b);

Преобразование:

int rat_to_i(Rational *a); /* округление до ближ. целого */
double rat_to_d(Rational *a); /* преобразование в число с плав. точкой */

Вывод:

void rat_print(Rational *a, FILE *fp);  /*выводит в формате p/q */

Примечание. Создать файлы:

  • rational.h, в котором будет содержаться объявление структуры Rational и прототипы функций.
  • rational.c с телами функций.
  • test_rational.c, который будет содержать тесты функций из rational.c.