Структуры, описание рационального числа - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Ввести структуру с полями «числитель» и «знаменатель» для описания понятия «рациональное число». Составить и протестировать функции: – ввода и вывода на экран рационального числа; – сокращения рационального числа; – вычисления произведения двух рациональных чисел. Никак не работает 2 и 3 функции. Все вроде правильно. Выводит абсолютно неверные числа, особенно в знаменателе, хотя бывает и числитель глючит. Название переменной Тип Назначение Входные данные s int переключающее выражение chr struct структура для хранения числителя и знаменателя дроби ch.numerator int элемент структуры chr для хранения числителя ch.denominator int элемент структуры chr для хранения знаменателя Выходные данные sokr(ch) struct структура для хранения числителя и знаменателя сокращенной дроби chr_rez struct структура для хранения числителя и знаменателя дроби, полученной в результате произведения двух дробей
#include <stdio.h>
#include <conio.h>
#include <iostream>
 
    struct chislo
    {
        unsigned int chislitel, znamenatel;
    };
    chislo ch;
 
void io ()
{
    printf("Введите числитель  ");
    scanf("%d", &ch.chislitel);
    printf("Введите знаменатель  ");
    scanf("%d", &ch.znamenatel);
    if (ch.znamenatel==0)
    {
        printf("На 0 делить нельзя, введите другой знаменатель\n\n");
        io();
    }
    else
        printf("\n\n%d/%d\n\n", ch.chislitel, ch.znamenatel);
}
 
chislo sokr(chislo ch)
{
    chislo ch_sokr;
    if (ch.chislitel==ch.znamenatel)
    {
        ch_sokr.chislitel=1;
        ch_sokr.znamenatel=1;
    }
    if (ch.chislitel<ch.znamenatel){
    for(int i=ch.chislitel; i>=2; i--)
    {
        if(ch.chislitel%i==0 && ch.znamenatel%i==0)
        {
            ch_sokr.chislitel=ch.chislitel/i;
            ch_sokr.znamenatel=ch.znamenatel/i;
            break;
        }
        else
            {
                ch_sokr.chislitel=ch.chislitel;
                ch_sokr.znamenatel=ch.znamenatel;
            }
    }
    }
    else
        for(int i=ch.znamenatel; i>=2; i--)
    {
        if(ch.chislitel%i==0 && ch.znamenatel%i==0)
        {
            ch_sokr.chislitel=ch.chislitel/i;
            ch_sokr.znamenatel=ch.znamenatel/i;
            break;
        }
        else
            {
                ch_sokr.chislitel=ch.chislitel;
                ch_sokr.znamenatel=ch.znamenatel;
            }
    }
    return(ch_sokr);
}
 
chislo proizv()
{
    chislo ch1, ch2, ch_rez;
    io();
    ch1=ch;
    io();
    ch2=ch;
    ch_rez.chislitel=ch1.chislitel*ch2.chislitel;
    ch_rez.znamenatel=ch1.znamenatel*ch2.znamenatel;
    return(ch_rez);
}
 
int main()
{   
    setlocale(0, "Russian");
    int s=0, n;
    
    do
    {
        printf("Выберите функцию:\n");
    printf("1 - Ввод/вывод числа\n");
    printf("2 - Сокращение числа\n");
    printf("3 - Произведение двух чисел\n");
    scanf("%d", &s);
    switch (s)
    {
        case 1: io(); break;
        case 2: {io(); printf("Сокращенная дробь = %d/%d", sokr(ch)); break;}
        case 3: printf("Произведение дробей = %d/%d", proizv()); break;
        default: printf("Такой ф-ии не существует"); break;
    }
    }
    while (s<1 && s>3);
    
    getch();
}

Решение задачи: «Структуры, описание рационального числа»

textual
Листинг программы
#include <stdlib.h>
int gcd(int a, int b) { // НОД алгоритм Эвклида
  int t;
  while (b != 0) {
    t = b;
    b = a % b;
    a = t;
  }
  return a;
}
chislo Reduction (chislo   ch) {  //  лучше использовать англоязычные названия для всего, транслит невозможно читать и тяжело писать
   chislo ans;
   unsigned divisor;
   if (ch.znamenatel == 0 ){
      printf("O-ops, devided by zero, aborting execution ! \n");
      exit (-1);
   }
   if (ch.chislitel == 0 ){
      ans.chislitel = ans.znamenatel = 0;
      return ans;
   }
   if (ch.chislitel == ch.znamenatel){
      ans.chislitel = 1;
      ans.znamenatel = 1;
      return ans;
   }
   else {
      divisor = gcd (ch.chislitel, ch.znamenatel) ;
      ans.chislitel /= divisor;
      ans.znamenatel /= divisor;
      return ans;
   }

Объяснение кода листинга программы

  1. Программа находит наибольший общий делитель (НОД) двух целых чисел с помощью алгоритма Эвклида.
  2. Если делитель равен нулю, программа выводит сообщение об ошибке и завершает работу.
  3. Если делитель и числитель равны нулю, программа возвращает ноль.
  4. Если делитель равен числителю, программа возвращает единицу.
  5. В противном случае программа находит наибольший общий делитель числителя и знаменателя, затем делит числитель на этот делитель и знаменатель на этот делитель.
  6. Возвращает полученные результаты.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

6   голосов , оценка 3.667 из 5
Похожие ответы