Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.61/74: Рейтинг темы: голосов - 74, средняя оценка - 4.61
Delm
1

Составить программу для деления дроби на дробь

18.10.2011, 20:12. Показов 15049. Ответов 15
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Помогите плз:
Даны две дроби A/B и C/D (А, В, С, D — натуральные числа). Составить программу для деления дроби на дробь. Результат должен быть несократимой дробью.

Вроде легко,но никак не дружу с C++
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
18.10.2011, 20:12
Ответы с готовыми решениями:

Составить программу для деления дроби на дробь
6.1.1. Помогите, пожалуйста, решить задачу в С++, с помощью функций. Даны две дроби A/B и C/D...

Составить программу для умножения дроби на дробь с использованием пользовательских функций
Помогите пожалуйста!) Даны две дроби A/B и C/D (A, B, C, D – натуральные числа). Составить...

N и M числитель и знаменатель дроби, составить программу, позволяющая сократить эту дробь.
помогите пожалуйста

Как написать класс «несократимая дробь» (т.е. дроби 2/4, 4/8 и т.п. есть дробь 1/2)?
Я только начанаю знакомство с C++. В классе реализовать следующие методы: конструкторы (по...

15
0 / 0 / 0
Регистрация: 29.09.2011
Сообщений: 36
18.10.2011, 20:30 2
С++ вроде все округляет до 5 знаков после точки?(сам пока не силен, но могу попробовать)
0
Delm
18.10.2011, 20:54 3
Даже незнаю насчет округления в Си...
Я в нем полный 0 ^_^
Поразбирался бы сам,да времени нет совсем...
448 / 211 / 21
Регистрация: 07.10.2011
Сообщений: 462
18.10.2011, 21:43 4
Здесь не нужно округление
По правилам деления дробей А/В на C/D ты получишь дробь с числителем AD и знаменателем BC. Находишь НОД(AD, BC) и делишь на него числитель и знаменатель
2
0 / 0 / 0
Регистрация: 01.10.2011
Сообщений: 27
18.10.2011, 22:01 5
Вот. так?
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#include "stdafx.h"
#include <iostream>
#include<stdio.h>
#include <stdlib.h>
#include <Windows.h>
#include <math.h>
#include <cmath>
 
int main()
{
SetConsoleCP(1251);
SetConsoleOutputCP(1251);
double chesl,znamen,chesl1,znamen1,s,s1,r,r1,e;
printf("Введите числитель 1 -ой дроби: ");
scanf("%lf",&chesl);
printf("Введите знаменатель 1 - ой дроби: ");
scanf("%lf",&znamen);
printf("Введите числитель 2 -ой дроби ");
scanf("%lf",&chesl1);
printf("Введите знаменатель 2 - ой дроби ");
scanf("%lf",&znamen1);
 
s = chesl / znamen;
s1 = chesl1 / znamen1;
 
r= chesl * znamen1;
r1 = chesl1 * znamen;
e = r /r1;
    
 
    printf("%.2lf \n",r);
    printf("-----\n");
    printf("%.2lf \n",r1);
 
    printf("|Ответ: ");
    printf("%.4lf \n",e);
return 0;
}
0
0 / 0 / 0
Регистрация: 29.09.2011
Сообщений: 36
18.10.2011, 22:02 6
Цитата Сообщение от aeshes Посмотреть сообщение
Здесь не нужно округление
По правилам деления дробей А/В на C/D ты получишь дробь с числителем AD и знаменателем BC. Находишь НОД(AD, BC) и делишь на него числитель и знаменатель
А может быть так?
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include<stdio.h>
#include<iostream.h>
#include<math.h>
main()
{
      int a,b,c,d;
      double r;
     printf("a=");
     scanf("%d",&a);
     printf("b=");
     scanf("%d",&b);
     printf("c=");
     scanf("%d",&c);
     printf("d=");
     scanf("%d",&d);
          r=(a/b)/(c/d);
      printf("\nR=%f",r);
      }
0
Эксперт С++
4267 / 2241 / 203
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
18.10.2011, 22:10 7
aeshes абсолютно верно весь алгоритм сказала. Делить не надо, надо получить числитель и знаменатель несократимой дроби. Если нужны алгоритмы для НОД, то вот
https://www.cyberforum.ru/cpp-... 65854.html
2
448 / 211 / 21
Регистрация: 07.10.2011
Сообщений: 462
18.10.2011, 22:11 8
MonteCristo, fsp2112, в своих решениях вы получаете десятичную дробь вида 0.5
А по условию задачи нужно из дробей 1/8 и 1/4 получить дробь вида 1/2 (т.е. обыкновенную дробь), а не 0.5

а Thinker спасибо за алгоритмы Евклида)
0
Заблокирован
18.10.2011, 22:21 9
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
#include <stdio.h>
#include <stdlib.h>
 
typedef struct ratcz
{
    int chislit;
    int znamenat;
};
 
struct ratcz *delenie(struct ratcz *delimoe, struct ratcz *delitel)
{
    struct ratcz *z;
    int n = 1;
    z = (struct ratcz*) malloc(sizeof(struct ratcz));
    z->chislit = delimoe->chislit * delitel->znamenat;
    z->znamenat = delimoe->znamenat * delitel->chislit;
 
    if (delimoe->chislit < 0 && delitel->chislit < 0)
    {
        z->chislit = ~z->chislit + 1;
        z->znamenat = ~z->znamenat + 1;
    }
 
    while ( (n <= z->chislit / 2) || (n <= z->znamenat / 2) )
    {
        if ( !(z->chislit % n) && !(z->znamenat % n) )
        {
            z->chislit /= n;
            z->znamenat /= n;
            n = 1;
        }
        ++n;
    }
    return z;
}
 
int main ()
{
    struct ratcz   x, y, *z;
 
    printf("введите дробь х, если число отрицательное, то числитель со знаком \"-\"\n");
    printf("числитель = ");
    scanf("%i", &x.chislit);
    printf("\nзнаменатель = ");
    while ((scanf("%u", &x.znamenat) == 1) && x.znamenat <= 0)
        printf("\nзнаменатель не может равняться 0\n");
 
    printf("введите дробь y, если число отрицательное, то числитель со знаком \"-\"\n");
    printf("числитель = ");
    scanf("%i", &y.chislit);
    printf("\nзнаменатель = ");
    while ((scanf("%u", &y.znamenat) == 1) && y.znamenat <= 0)
        printf("\nзнаменатель не может равняться 0\n");
 
    z = delenie(&x, &y);
 
    printf("%i/%i : ", x.chislit, x.znamenat);
    printf("%i/%i = ", y.chislit, y.znamenat);
    printf("%i/%i\n", z->chislit, z->znamenat);
    free(z);
    return 0;
}
0
Эксперт С++
4267 / 2241 / 203
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
18.10.2011, 22:25 10
Цитата Сообщение от alkagolik Посмотреть сообщение
C
1
2
3
4
5
6
7
        if ( !(z->chislit % n) && !(z->znamenat % n) )
        {
            z->chislit /= n;
            z->znamenat /= n;
            n = 1;
        }
        ++n;
По-моему оптимальнее так:

C
1
2
3
4
5
6
7
        if ( !(z->chislit % n) && !(z->znamenat % n) )
        {
            z->chislit /= n;
            z->znamenat /= n;
        }
        else
            ++n;
Зачем с начала деление начинать. И бежать можно до корня из минимума двух значений - числителя и знаменателя
0
Заблокирован
18.10.2011, 22:33 11
Thinker, безусловно. я просто не ставил задачи оптимизировать. как-то "наскоро" нацарапал. Оптимизацией пусть ТС занимается
0
Эксперт С++
4267 / 2241 / 203
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
18.10.2011, 22:35 12
Цитата Сообщение от alkagolik Посмотреть сообщение
Thinker, безусловно. я просто не ставил задачи оптимизировать. как-то "наскоро" нацарапал. Оптимизацией пусть ТС занимается

Не по теме:

Лукавите немного, как мне кажется, вы сами любите более оптимальные алгоритмы писать:) Это уже в крови должно быть:)

0
Заблокирован
18.10.2011, 22:41 13
Thinker, болен я может сказывается. верите, вскакиваю ночью весь в жару и начинаю править указатели у себя в заголовках надо срочно в отпуск.
0
Thinker
18.10.2011, 22:43
  #14

Не по теме:

Ну вот... Сочувствую... Выздоравливайте!!!

0
Заблокирован
18.10.2011, 23:23 15
Лучший ответ Сообщение было отмечено ForEveR как решение

Решение

начальное n = 2
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
struct ratcz *delenie(struct ratcz *delimoe, struct ratcz *delitel)
{
    struct ratcz *z;
    int n = 2;
    z = (struct ratcz*) malloc(sizeof(struct ratcz));
    z->chislit = delimoe->chislit * delitel->znamenat;
    z->znamenat = delimoe->znamenat * delitel->chislit;
 
    if (delimoe->chislit < 0 && delitel->chislit < 0)
    {
        z->chislit = ~z->chislit + 1;
        z->znamenat = ~z->znamenat + 1;
    }
 
    while ( (n <= z->chislit / 2) || (n <= z->znamenat / 2) )
    {
        if ( !(z->chislit % n) && !(z->znamenat % n) )
        {
            z->chislit /= n;
            z->znamenat /= n;
        }
        else
            ++n;
    }
    return z;
}
1
0 / 0 / 1
Регистрация: 20.01.2016
Сообщений: 45
21.01.2016, 10:54 16
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
// some exercises
 
#include <iostream>
#include <cmath>
#include <process.h>
 
using namespace std;
 
//---------------------------------------------
 
class fraction
{
private:
    int chis;
    int znam;
public:
    fraction (): chis (0), znam (1)
    {  }
    fraction (int ch, int zn): chis (ch), znam (zn)
    {  }
    void getfrac ()
    {
        cout << "Введите числитель: "; cin >> chis;
        while (true)
        {
            cout << "Введите знаменатель: "; cin >> znam;
            if (znam == 0)
                cout << "Попытка деления на 0!!!\n";
            else
                break;
        }
    }
    void showfrac () const
    { cout << chis << '/' << znam; }
    fraction operator / (const fraction& f1) const
    {
        int chtemp = chis * f1.znam;
        int zntemp = znam * f1.chis;
        return lowterms (fraction(chtemp, zntemp));
    }
    fraction lowterms (fraction) const;
};
 
fraction fraction::lowterms (fraction f1) const
{
    int chtemp, zntemp, temp;
    chtemp = abs (f1.chis);
    zntemp = abs (f1.znam);
    if (zntemp == 0)
    {
        cout << "\nОшибка! Попытка деления на 0!!!\n";
        exit (1);
    }
    if (chtemp == 0)
    { return fraction (0, 1); }
    while (chtemp != 0)
    {
        if (chtemp < zntemp)
        { temp = chtemp; chtemp = zntemp; zntemp = temp; }
        chtemp -= zntemp;
    }
    return fraction (f1.chis / zntemp, f1.znam / zntemp); 
}
 
//---------------------------------------------
 
int main ()
{
    setlocale (LC_ALL, "Rus");
    fraction f1, f2, f3;
    cout << "Введите дробь f1:\n";
    f1.getfrac ();
    cout << "Введите дробь f2:\n";
    f2.getfrac ();
    f3 = f1 / f2;
    cout << "Результат деления f1 на f2: "; f3.showfrac ();
    cout << endl;
    return 0;
}
0
21.01.2016, 10:54
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
21.01.2016, 10:54
Помогаю со студенческими работами здесь

Составить программу для нахождения суммы в виде несократимой дроби.
Составить программу для нахождения суммы 1/2+2/3+1/4+...+1/n в виде несократимой дроби!!! ...

Составить программу , позволющую сократить дробь.
M и N - числитель и знаменатель обыкновенной дроби. Составить программу , позволющую сократить...

составить программу печати n-го элемента в виде обыкновенной несократимой дроби
Столкнулся с такой вот задачей, не подскажете как это провернуть??? Для последовательности а1 =...

Составить программу печати n-го элемента в виде обыкновенной несократимой дроби
Для последовательности а1 = 1, an+1 = an + 1/(1 + an) составить программу печати n-го элемента в...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru