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

Знак числа и десятичный вывод

29.04.2015, 16:33. Показов 3560. Ответов 7
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Всем добрый вечер. У меня, в процессе выполнения программы происходит следующие ошибки:
1. Нужно выводить знак числа, то есть если число отрицательное - нужно выводить отрицательное, если положительное - положительное, а не положительное в любом случае.
Я знаю, что модуль - это функция abs, но просто убрать её не получается, пишет ошибку, error C2665: abs: ни одна из 6 перегрузок не может преобразовать все типы аргументов
2. На выводе должно быть последнее значение в виде рационального числа а не дроби, а у меня выводит дробь. Я так понял, это из-за параметра (%d/%d), но в случае, если убрать 2 часть параметра, то есть оставить просто %d, то выведется только число, которое стоит в числителе.
Хэлп ми)
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
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
// pervaia.cpp: определяет точку входа для консольного приложения.
//
 
#include "stdafx.h"
#include <iostream>
#include <math.h>
#include <conio.h>
#include <stdio.h>
#include <windows.h>
using namespace std;
 
    class Rat
    {
     public:       //общедоступные элементы
          int x, y;
              Rat() {}; // Конструктор по умолчанию
          Rat(int x1, int y1=1): x(x1), y(y1) //конструктор
        {
                          //if(y==0) y=1;
          //if(y<0) {x=-x; y=-y;}
 
                  int sign = 1;
                  if (y==0) {printf("Некорректный параметр");
                  x = 0; y = 0; return;}
                  if (x==0) {x=0; y=1; return;}
                  else if (y<0) sign = -sign;
                  if (x<0) sign = -sign;
                  int a=(x), b=abs(y);
                 //x=sign*x; y=y;
                  while (a!=b){if (a>b) a-=b;
                  else b-=a;}
                  x/=a; y/=a;
                  x=sign*x;
        }
                ~Rat() {}   // Деструктор
                 Rat operator= (Rat r){Rat q(r.x, r.y); return q;}
           friend Rat operator+(Rat, Rat);   //перегрузка операции +
           friend Rat operator-(Rat, Rat);   //перегрузка операции -
           friend Rat operator*(Rat, Rat);   //перегрузка операции *
          // Перегрузка оператора << для вывода в десятичной форме
          friend ostream &operator<<(ostream &, Rat &);
    };
 
// Перегрузка оператора << для вывода в десятичной форме
ostream &operator<<(ostream &v, Rat &w)
{
    Rat q(w.x, w.y);
         v << q.x<< "/" <<q.y;
    return v;
}
 
Rat operator+(Rat v, Rat w) //перегрузим операцию сложения
{
       v.x=v.x*w.y+w.x*v.y;    //формируем числитель дроби
    v.y=v.y*w.y;        //формируем знаменатель дроби
    Rat p(v.x,v.y);
        return p;
}
 
Rat operator-(Rat v, Rat w)     //перегрузим операцию вычитания
{
    v.x=v.x*w.y-w.x*v.y;    //числитель дроби
    v.y=v.y*w.y;        //знаменатель дроби
    Rat p(v.x,v.y);
        return p;
}
 
Rat operator*(Rat v, Rat w)     //перегрузим операцию умножения
{
    v.x=v.x*w.x;
    v.y=v.y*w.y;
    Rat p(v.x,v.y);
        return p;
}
//Перегрузим операцию значения по модулю
Rat abs(Rat &v)         
{
    if(v.x<0) v.x*=-1;
    if(v.y<0) v.y*=-1;
    return v;
}
    void main()
    {
    SetConsoleCP(1251);
  SetConsoleOutputCP(1251);
    system("cls");
        /*Rat p(2,4);
        printf("p=(%d,%d)",p.x, p.y);*/
    printf("Класс рациональных несократимых дробей\n");
    Rat v(1),w(1);
    printf ("\nВходные данные:\nv = ");
    scanf("%d/%d",&v.x, &v.y);
    printf("w = ");
    scanf("%d/%d",&w.x,&w.y);
    //Проверка на несократимость
    if(v.x%v.y!=0 && w.x%w.y!=0)
       {
    Rat t=v+w;
    printf("\nРезультат сложения   v+w={%d/%d}=",t.x, t.y);
    cout<<t;
    Rat t1=v-w;
    printf("\nРезультат вычитания  v-w={%d/%d}=",t1.x, t1.y);
    cout<<t1;
    Rat t2=v*w;
        printf("\nРезультат умножения  v*w={%d/%d}=",t2.x, t2.y);
    cout<<t2;
    printf("\nМодуль рационального числа аbs(v)={%d/%d}",abs(v)); //модуль
      }
    else printf("\nОшибка при вводе рационального числа");
    getch();
    }
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
29.04.2015, 16:33
Ответы с готовыми решениями:

Алгоритм перевода шестнадцатеричного числа в десятичный код
помогите написать программу &quot;алгоритм перевода шестнадцатиличного числа в десятичный код&quot;

Даны два числа A и B. Разработать и описать алгоритм, в результате которого числа меняют свой знак на противоположный, е
Даны два числа A и B. Разработать и описать алгоритм, в результате которого числа меняют свой...

Неверный вывод структур знак зодиака
Доброго времени суток! Нуждаюсь в помощи. Необходимо сделать программу, что-то вроде базы данных....

Знак числа
Вот сама задача Вот сам код #include &lt;iostream&gt; using namespace std; int main() { int n;...

7
7793 / 6560 / 2984
Регистрация: 14.04.2014
Сообщений: 28,672
29.04.2015, 17:44 2
abs() понимает только стандартные типы.
0
4 / 4 / 0
Регистрация: 10.01.2014
Сообщений: 94
29.04.2015, 18:09  [ТС] 3
Я понимаю, но не могли вы подсказать, что именно нужно переделать ( желательно и как ), что бы в последнем случае была не дробь а рациональное число, и знак был всегда, а не модуль.
0
7793 / 6560 / 2984
Регистрация: 14.04.2014
Сообщений: 28,672
29.04.2015, 18:31 4
А дробь не может быть рациональным числом? Ты десятичную дробь хочешь?
C++
1
(double)v.x / v.y
0
4 / 4 / 0
Регистрация: 10.01.2014
Сообщений: 94
30.04.2015, 08:16  [ТС] 5
Блин, я не понимаю, куда это нужно вставить:
C++
1
 (double)v.x / v.y
И должно получиться так:
1. Результат сложения, вычитания, и умножения - это десятичные дроби НО СО ЗНАКОМ, а не как у меня без знака, и я не знаю, как исправить. Я думал что дело в функции abs, но мои попытки исправить знаки не к чему не привели.
2. Модуль рационального числа - НЕ десятичная дробь, а число с плавающей точкой, то есть double.
Вот результат работы программы:

Знак числа и десятичный вывод


Как видно, что результаты выводятся всегда положительными, даже если и должны быть отрицательными.
А в последнем случае выводится дробь. Хотя нужно число, например ( 1.24 ).
0
7793 / 6560 / 2984
Регистрация: 14.04.2014
Сообщений: 28,672
30.04.2015, 08:42 6
Ну у тебя x - числитель, y - знаменатель, правильно? Значит нужно разделить первое на второе. Вот умножение:
C++
1
printf("\nРезультат умножения  v*w={%d/%d}=", (double)t2.x / t2.y);
Или сделай в классе функцию, которая будет возвращать дробь именно в таком виде.
0
4 / 4 / 0
Регистрация: 10.01.2014
Сообщений: 94
30.04.2015, 08:57  [ТС] 7
А со знаками что делать? Что бы все числа в результате имели не положительное значение, а значение, которое должно быть. То есть в программе всегда знак +, даже если значение отрицательное.
А кстати, вот только что проверил, в результате он вообще перестал считать умножение.
0
7793 / 6560 / 2984
Регистрация: 14.04.2014
Сообщений: 28,672
30.04.2015, 09:45 8
Забыл тип поменять.
C++
1
printf("\nРезультат умножения  v*w={%f}=", (double)t2.x / t2.y);
Добавлено через 10 минут
Для чего строки 28-32? Что там за цикл?
0
30.04.2015, 09:45
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
30.04.2015, 09:45
Помогаю со студенческими работами здесь

Миллионный знак числа Пи
using namespace std; int _tmain(int argc, _TCHAR* argv) { double e = 0.0000000001; double...

Как узнать знак числа?
как узнать знак числа для float или double. пишу в win32.

Функция, возвращающая знак числа
Определите значение z=sign(x)+sign(y), где sign(a) — функция, возвращающая знак числа a, то есть ...

Вывод на экран сначала предложений, оканчивающиеся на ?, а затем на восклицательный знак
Здравствуйте! Имеется такая задача: Написать программу, которая считывает текст из файла и выводит...


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

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