Форум программистов, компьютерный форум, киберфорум
Наши страницы
C для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.50/2: Рейтинг темы: голосов - 2, средняя оценка - 4.50
Генрисон
4 / 3 / 1
Регистрация: 30.10.2012
Сообщений: 299
1

Ошибка

05.05.2013, 16:58. Просмотров 456. Ответов 5
Метки нет (Все метки)

Задание,нужно написать простейший калькулятор для действий с дробями-сложение,вычитание,умножение,деление. Я сделал функцию сложения,работает функция вычитания,но одна проблема,когда задаю дроби с разными знаменателями и в ответе получается отрицательная дробь,то вылазит вот такая ошибка:
Необработанное исключение в "0x004113c9" в "calc.exe": 0xC00000FD: Stack overflow.
Вот сам код программы:
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
80
81
82
83
84
85
86
#include <stdio.h>
#include <stdlib.h>
typedef long long num_t;
int nod(int n,int d){
if (d==0)
return n;
if(n>=d)
return nod(d,n%d);
else
return nod(n,d%n);
}
class Fract{
public:
Fract(num_t num ,num_t den){
n=num;
d=den;
}
void print(){
printf("%lld/%lld\n",n,d);
}
void reduce(){
x=nod(n,d);
n=n/x;
d=d/x;
}
num_t n,d;
num_t x;
};
Fract operator+(Fract a,Fract b)
{
    Fract t(0,0);
    t.d=a.d+b.d;
    if(a.d != b.d){
        a.n=a.n*b.d;
        b.n=b.n*a.d;
        t.n=a.n+b.n;
        t.d=a.d*b.d;
    }
    else if (a.d = b.d){
        t.n=a.n+b.n;
        t.d=a.d+b.d;
    }
    return t;
 
 
}
Fract operator-(Fract a,Fract b)
{
    Fract z(0,0);
    z.d=a.d-b.d;
    if(a.d != b.d)
    {
        a.n=a.n*b.d;
        b.n=b.n*a.d;
        z.n=a.n-b.n;
        z.d=a.d*b.d;
    }
    if (z.n && z.d <0){
        printf("-%lld/%lld",a,b);
    }
    return z;
}
int main()
{
 
Fract a(20,50);
a.print();
a.reduce();
a.print();
Fract b(6,7);
b.print();
b.reduce();
b.print();
Fract c(0,0);
c = a+b;
c.print();
c.reduce();
c.print();
Fract d(0,0);
d=a-b;
d.print();
d.reduce();
d.print();
system("pause");
 
}
Когда вылезает ошибка стрелочкой показывает на строчку
C
1
int nod(int n,int d)
Подскажите пожалуйста,в чем может быть дело?
0
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.05.2013, 16:58
Ответы с готовыми решениями:

IIS- asp ошибка: HTTP 500.100 - Внутренняя ошибка сервера - ошибка ASP Internet Information Services
Привет! Конфигурация win2000pro sp2, стандартный IIS, IE 5. При попытке обратиться к...

Ошибка при чтении изменений при обмене РИБ: Ошибка при вызове метода контекста (ПрочитатьИзменения): Ошибка записи!
Доброго всем времени суток! подскажи пожалуйста как исправить ошибку: Ошибка при чтении изменений...

Ошибка при добавлении в файл. Ошибка 101: Ошибка записи на диск (Error 101: Disk write error).
Здравствуйте, возникла проблема такого плана. Нужно произвести добавление записи в файл, но после...

Ошибка HTTP 500 - внутреняя ошибка сервера при отправке почты.
Я пытаюсь отправить почту и присоединяю к ней письма Вот часть страницы Dim myMail Set myMail =...

Ошибка разбора XML/ Ошибка при вызове метода контекста (Прочитать)
1C 8.2 Документооборот КОРП 1.2 Текст ошибки...

5
anydevelop
168 / 49 / 20
Регистрация: 20.10.2011
Сообщений: 232
05.05.2013, 21:42 2
Ошибка говорит, что функция запускается рекурсивно слишком много раз и стек переполняется. Скорее всего она работает так, что не может остановиться (зависает).

Если компилировать код, компилятор сразу показывает ряд предупреждений, которые в вашем случае являются ошибками:
1).
C
1
2
3
4
    else if (a.d = b.d){
        t.n=a.n+b.n;
        t.d=a.d+b.d;
    }
Вряд ли вы хотели присвоить переменной a.d значение b.d. Так как это условие находится в ветке else, его вообще можно убрать.
2).
C
1
2
3
    if (z.n && z.d <0){
        printf("-%lld/%lld",a,b);
    }
Функция printf не умеет выводить структуры Fract. Вывод их как чисел long long приведёт к непредсказуемым результатам.

Вернёмся к ошибке Stack overflow. Я не стал вдаваться в подробности, как написана ваша функция nod - она слишком громоздка. Я предлагаю вам свой более короткий вариант, с которым ваша программа отлично работает:
C
1
2
3
int nod(int a, int b) {
    return b ? a % b : a;
}
Очевидно, она основана на том же алгоритме, что и ваша.

Добавлено через 3 минуты
Ну и, чтобы вы знали, хоть это и не критично, этот раздел форума предназначен для вопросов по языку Си. Си не поддерживает классы, а ваша программа написана на C++.
1
Генрисон
4 / 3 / 1
Регистрация: 30.10.2012
Сообщений: 299
15.05.2013, 18:59  [ТС] 3
anydevelop, простите пожалуйста,а вы не могли бы сказать что-нибудь по рациональности моего кода,может быть существуют более красивые способы решения? Просто мне нужны функции сложения,умножения,вычитания,деления для этого калькулятора + то,что если получаемое число больше 1,то разбивать его на целую часть и оставшуюся дробь.
0
anydevelop
168 / 49 / 20
Регистрация: 20.10.2011
Сообщений: 232
15.05.2013, 19:06 4
Генрисон, с рациональностью у вас всё в порядке, идеи правильные, я бы написал также. По-моему, решение получится достаточно красивым.
0
Генрисон
4 / 3 / 1
Регистрация: 30.10.2012
Сообщений: 299
15.05.2013, 19:13  [ТС] 5
anydevelop, подскажите,а как лучше реализовать проверку на то,что дробь больше единицы и в случае,если она больше,то записать целую часть и остаток в виде обыкновенной дроби.
0
anydevelop
168 / 49 / 20
Регистрация: 20.10.2011
Сообщений: 232
15.05.2013, 19:25 6
Генрисон, рассмотрим, например, случай положительных чисел. Тогда дробь больше единицы, если числитель больше знаменателя, а целой частью является результат целочисленного деления числителя на знаменатель.
1
15.05.2013, 19:25
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.05.2013, 19:25

Ошибка SQL запроса , в базе работает, а через IBQuery в Delphi ошибка
В Combobox загружены имена организаций. Нужно выполнить запрос на вывод всех полей таблицы...

Django Ошибка доступа (403) Ошибка проверки CSRF. Запрос отклонён
На хостинге разместил сайт и не могу войти в админку, т.к. возникает 403 ошибка &quot;Ошибка доступа...

ASP: Response.Redirect - не работает, ошибка `500 - Внутренняя ошибка сервера'
Всем привет! Есть в ASP-сраничке такой код: Response.Redirect 'page1.asp?ReturnTo=page2.asp' ...


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

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

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