Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
XIRURG_
0 / 0 / 0
Регистрация: 24.12.2017
Сообщений: 67
1

Написал алгоритм для сортировки рациональных чисел, но есть траблы с выводом их

23.12.2018, 22:32. Просмотров 290. Ответов 4

В общем есть массив из пяти элементов
C++
1
    Rational A[size] = {3/2,1/3,1/4,2/4,3/4};
и при сортировке программа выдает не верные значения, подскажите в чем проблема?
Вот полный код

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
#include "rational.h"
#include <iostream>
#include <iomanip>
using namespace std;
 
Rational::Rational(int ch, int zn)
{
    setRational(ch, zn);
}
 
Rational::Rational(Rational &arg)
{
    setRational(arg.numer, arg.denom);
}
 
Rational::~Rational() {};
 
int Rational::nodR(int x, int y)
{
    if (y == 0)
        return x;
    else
        return nodR(y, x % y);
}
 
int Rational::nokR(int x, int y)
{
    for (int i = 1; i > 0; i++)
        if (i % x == 0 && i % y == 0)
            return i;
    return 1;
}
 
void Rational::setRational(int ch, int zn)
{
    int nod;
 
    if (ch >= zn)
        nod = nodR(ch, zn);
    else
        nod = nodR(zn, ch);
 
    if (ch == 0 && zn ==0)
    {
        numer = ch;
 
    }
 
    if (!zn)
        cout << "Деление на \"0\" невозможно." << endl;
    else
        if (ch < 0 && zn < 0)
        {
            numer = (ch / nod) * -1;
            denom = (zn / nod) * -1;
        }
        else
        {
            numer = ch / nod;
            denom = zn / nod;
        }
 
}
 
void Rational::printRational()
{
    cout << numer << "/" << denom;
}
 
void Rational::printDoubleRational()
{
    cout << setprecision(6) << setiosflags(ios::fixed | ios::showpoint)
        << (double)numer / (double)denom;
}
 
ostream &operator << (ostream &output, Rational &right)
{
    right.printRational();
    return output;
}
 
istream &operator >> (istream &input, Rational &right)
{
    input >> right.numer;
    cin.get();
    input >> right.denom;
    right.setRational(right.numer, right.denom);
    return input;
}
 
 
bool operator >(Rational x, Rational y)
{
    return ((x.numer / x.denom) > (y.numer / y.denom));
}
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
// Структуры и алгоритмы. Метод Шейкера.cpp: определяет точку входа для консольного приложения.
//
 
#include "stdafx.h"
#include <iostream>
#include "rational.cpp"
using namespace std;
 
//ф-ция для обмена значений ячеек
void replace_element(Rational *array, int i)
{
    Rational buff;
    buff = array[i];
    array[i] = array[i - 1];
    array[i - 1] = buff;
}
 
 
 
//ф-ция "шейкер"-сортировки
void Shaker_Sort(Rational *array, int size)
{
    int leftMark = 1;
    int rightMark = size - 1;
    while (leftMark <= rightMark)
    {
        for (int i = rightMark; i >= leftMark; i--)
            if (array[i - 1] > array[i]) 
                replace_element(array, i);
        leftMark++;
 
 
        for (int i = leftMark; i <= rightMark; i++)
            if (array[i - 1] > array[i])
                replace_element(array, i);
        rightMark--;
 
        cout << "\nИтерация: " << leftMark - 1; // просмотр количества итераций
    }
}
 
void Sort(Rational *array, int size)
{
 
    int leftMark = 1;
    int rightMark = size - 1;
    while (leftMark <= rightMark)
    {
        for (int i = rightMark; i >= leftMark; i--)
            //if (array[i]>10)
            if (array[i - 1] > array[i]) 
                replace_element(array, i);
        leftMark++;
 
        cout << "\nИтерация: " << leftMark - 1; // просмотр количества итераций
    }
}
int main()
{
    setlocale(LC_ALL, "rus");
    int  a;
    cin >> a;
    const int size = 5;
    cout << "Размер массива: ";
    Rational A[size] = {3/2,1/3,1/4,2/4,3/4};
 
    cout << "Bведите массив\n";
     
 
 
    if (a == 1)
    {
    Shaker_Sort(A, size); // сортировка
    }
    else
    {
        Sort(A, size);
    }
    cout << "\nМассив после сортировки:\n";
    for (int i = 0; i < size; i++)
    {
        cout << A[i] << " | ";
    }
    cout << endl;
    system("pause");
    return 0;
}
0
Миниатюры
Написал алгоритм для сортировки рациональных чисел, но есть траблы с выводом их  
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.12.2018, 22:32
Ответы с готовыми решениями:

Определить, есть ли среди 50 рациональных чисел равные
Приняв способ изображения рационального числа в виде записи с двумя полями: числ, знам : integer,...

написать программу, позволяющую определить, есть ли среди 3 рациональных чисел равные
Приняв способ изображения рационального числа в виде записи с двумя полями: числитель, знаменатель...

Реализуйте алгоритм сортировки для массива, содержащего указатели на объекты-множества целых чисел
Помогите сделать лабу, Я даже не знаю с чего начинать. Пользователь вводит в программу...

Траблы с выводом времени
&lt;?php If(isset($_COOKIE)){ $time=$_COOKIE; $NowTime=time(); $a=$NowTime-$time;...

Определить класс для рациональных чисел
Начало изучения понятия класса и объекта в С++, для меня много не ясного. Помогите, пожалуйста. ...

4
Yetty
2129 / 1505 / 1053
Регистрация: 18.12.2017
Сообщений: 5,045
23.12.2018, 22:50 2
Цитата Сообщение от XIRURG_ Посмотреть сообщение
в чем проблема?
целочисленное деление
Цитата Сообщение от XIRURG_ Посмотреть сообщение
A[size] = {3/2,1/3,1/4,2/4,3/4};
тоже самое что и A[size] = {1,0,0,0,0};
для исправления поставьте точки: A[size] = {3./2.,1./3.,1./4.,2./4.,3./4.};
0
XIRURG_
0 / 0 / 0
Регистрация: 24.12.2017
Сообщений: 67
23.12.2018, 23:02  [ТС] 3
Цитата Сообщение от Yetty Посмотреть сообщение
тоже самое что и A[size] = {1,0,0,0,0};
для исправления поставьте точки: A[size] = {3./2.,1./3.,1./4.,2./4.,3./4.};
Попробовал, нет результат тот же
0
Yetty
2129 / 1505 / 1053
Регистрация: 18.12.2017
Сообщений: 5,045
23.12.2018, 23:48 4
всё работает, если Rational заменить на double:
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
#include <iostream>
using namespace std;
 
//ф-ция для обмена значений ячеек
void replace_element(double *array, int i)
{
    double buff;
    buff = array[i];
    array[i] = array[i - 1];
    array[i - 1] = buff;
}
 
//ф-ция "шейкер"-сортировки
void Shaker_Sort(double *array, int size)
{
    int leftMark = 1;
    int rightMark = size - 1;
    while (leftMark <= rightMark)
    {
        for (int i = rightMark; i >= leftMark; i--)
            if (array[i - 1] > array[i]) 
                replace_element(array, i);
        leftMark++;
 
 
        for (int i = leftMark; i <= rightMark; i++)
            if (array[i - 1] > array[i])
                replace_element(array, i);
        rightMark--;
 
        cout << "\nIter: " << leftMark - 1; // просмотр количества итераций
    }
}
 
void Sort(double *array, int size)
{
 
    int leftMark = 1;
    int rightMark = size - 1;
    while (leftMark <= rightMark)
    {
        for (int i = rightMark; i >= leftMark; i--)
            //if (array[i]>10)
            if (array[i - 1] > array[i]) 
                replace_element(array, i);
        leftMark++;
 
        cout << "\nIter: " << leftMark - 1; // просмотр количества итераций
    }
}
int main()
{
    int  a;
    cin >> a;
    const int size = 5;
 
    double A[size] = {3./2.,1./3.,1./4.,2./4.,3./4.}; 
 
    if (a == 1)
    {
    Shaker_Sort(A, size); // сортировка
    }
    else
    {
        Sort(A, size);
    }
    cout << "\nSorted matrix:\n";
    for (int i = 0; i < size; i++)
    {
        cout << A[i] << " | ";
    }
    cout << endl;
    system("pause");
    return 0;
}
0
XIRURG_
0 / 0 / 0
Регистрация: 24.12.2017
Сообщений: 67
23.12.2018, 23:58  [ТС] 5
Цитата Сообщение от Yetty Посмотреть сообщение
всё работает, если Rational заменить на double:
Дело в том что задача стоит описать класс рациональных чисел и сделать на основе его сортировку шейкера, double это не то что мне надо
0
23.12.2018, 23:58
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.12.2018, 23:58

Траблы с выводом даных в отображенную память
Вот кусок кода: std::string s = &quot;Nachalo: &quot;; for (int op = 0; op &lt;ii; op++) { s+= masuv + &quot;...

Создать файл для определения класса рациональных чисел с перегрузкой операторов
Добрый день. Нужно создать файл для определения класса рациональных чисел с перегрузкой операторов....

Доказать верность высказываний для гомоморфизма над группой рациональных чисел
Само задание: пусть ({\mathbf{Q}}^{2}, +) - группа пар рациональных чисел с покомпонентным...


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

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

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