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

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

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

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

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

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

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

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

15
 Аватар для fsp2112
0 / 0 / 0
Регистрация: 29.09.2011
Сообщений: 36
18.10.2011, 20:30
С++ вроде все округляет до 5 знаков после точки?(сам пока не силен, но могу попробовать)
0
Delm
18.10.2011, 20:54
Даже незнаю насчет округления в Си...
Я в нем полный 0 ^_^
Поразбирался бы сам,да времени нет совсем...
 Аватар для aeshes
448 / 211 / 21
Регистрация: 07.10.2011
Сообщений: 462
18.10.2011, 21:43
Здесь не нужно округление
По правилам деления дробей А/В на C/D ты получишь дробь с числителем AD и знаменателем BC. Находишь НОД(AD, BC) и делишь на него числитель и знаменатель
2
0 / 0 / 0
Регистрация: 01.10.2011
Сообщений: 27
18.10.2011, 22:01
Вот. так?
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
 Аватар для fsp2112
0 / 0 / 0
Регистрация: 29.09.2011
Сообщений: 36
18.10.2011, 22:02
Цитата Сообщение от 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
Эксперт С++
 Аватар для Thinker
4267 / 2241 / 203
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
18.10.2011, 22:10
aeshes абсолютно верно весь алгоритм сказала. Делить не надо, надо получить числитель и знаменатель несократимой дроби. Если нужны алгоритмы для НОД, то вот
https://www.cyberforum.ru/cpp-... 65854.html
2
 Аватар для aeshes
448 / 211 / 21
Регистрация: 07.10.2011
Сообщений: 462
18.10.2011, 22:11
MonteCristo, fsp2112, в своих решениях вы получаете десятичную дробь вида 0.5
А по условию задачи нужно из дробей 1/8 и 1/4 получить дробь вида 1/2 (т.е. обыкновенную дробь), а не 0.5

а Thinker спасибо за алгоритмы Евклида)
0
 Аватар для alkagolik
1599 / 622 / 113
Регистрация: 15.07.2011
Сообщений: 3,548
18.10.2011, 22:21
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
Эксперт С++
 Аватар для Thinker
4267 / 2241 / 203
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
18.10.2011, 22:25
Цитата Сообщение от 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
 Аватар для alkagolik
1599 / 622 / 113
Регистрация: 15.07.2011
Сообщений: 3,548
18.10.2011, 22:33
Thinker, безусловно. я просто не ставил задачи оптимизировать. как-то "наскоро" нацарапал. Оптимизацией пусть ТС занимается
0
Эксперт С++
 Аватар для Thinker
4267 / 2241 / 203
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
18.10.2011, 22:35
Цитата Сообщение от alkagolik Посмотреть сообщение
Thinker, безусловно. я просто не ставил задачи оптимизировать. как-то "наскоро" нацарапал. Оптимизацией пусть ТС занимается

Не по теме:

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

0
 Аватар для alkagolik
1599 / 622 / 113
Регистрация: 15.07.2011
Сообщений: 3,548
18.10.2011, 22:41
Thinker, болен я может сказывается. верите, вскакиваю ночью весь в жару и начинаю править указатели у себя в заголовках надо срочно в отпуск.
0
18.10.2011, 22:43

Не по теме:

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

0
 Аватар для alkagolik
1599 / 622 / 113
Регистрация: 15.07.2011
Сообщений: 3,548
18.10.2011, 23:23
Лучший ответ Сообщение было отмечено 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
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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
21.01.2016, 10:54
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Новые блоги и статьи
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка. Рецензия / Мнение Это мой обзор планшета X220 с точки зрения школьника. Недавно я решила попытаться уменьшить свой. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru