Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 26, средняя оценка - 4.73
Delm
#1

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

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

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

Вроде легко,но никак не дружу с C++
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.10.2011, 20:12
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Составить программу для деления дроби на дробь (C++):

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

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

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

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

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

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

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

а Thinker спасибо за алгоритмы Евклида)
0
alkagolik
Заблокирован
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
Thinker
Эксперт С++
4228 / 2202 / 150
Регистрация: 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
alkagolik
Заблокирован
18.10.2011, 22:33 #11
Thinker, безусловно. я просто не ставил задачи оптимизировать. как-то "наскоро" нацарапал. Оптимизацией пусть ТС занимается
0
Thinker
Эксперт С++
4228 / 2202 / 150
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
18.10.2011, 22:35 #12
Цитата Сообщение от alkagolik Посмотреть сообщение
Thinker, безусловно. я просто не ставил задачи оптимизировать. как-то "наскоро" нацарапал. Оптимизацией пусть ТС занимается

Не по теме:

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

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

Не по теме:

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

0
alkagolik
Заблокирован
18.10.2011, 23:23 #15
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
начальное 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
18.10.2011, 23:23
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.10.2011, 23:23
Привет! Вот еще темы с ответами:

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

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

Написать программу для вычисления цепной дроби (использовать цикл с известным числом повторений) - C++
Здравствуйте!Необходимо написать программу для вычисления цепной дроби(использовать цикл с известным числом повторений), код составила,все...

Для двух целых чисел найти остаток и частное от целочисленного деления, частное от вещественного деления - C++
Уважаемые форумчане помогите пожалуйста с двумя программами. Это вопрос жизни и отчисления, я очень плохо понимаю программирование. В...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru