Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.63/8: Рейтинг темы: голосов - 8, средняя оценка - 4.63
 Аватар для NRX
22 / 19 / 9
Регистрация: 22.09.2015
Сообщений: 161

Перегрузка оператора вывода

10.10.2016, 17:54. Показов 1647. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте. Я пишу учебную программу реализующая арифметику обыкновенных дробей. И в данный момент перезагружаю оператор вывода.
C++
1
2
3
4
5
std::ostream & operator<<(std::ostream & os, const Fraction & dt)
{
    os <<'(' << dt.data.num << ')' << '/' << '(' <<dt.data.denum << ')';
    return os;
}
И в данный момент это на экране выглядит не привлекательно. Я бы хотел чтобы числитель и знаменатель выводились друг под другом, и разные дроби выводились рядом. Как такое реализовать или вообще это возможно? На первом скрине как сейчас выводится, на втором скрине как мне бы хотелось чтобы это выводилось при такой записи
C++
1
2
Fraction p(12, 5), c(58, 19);
cout << p << '+' << c;
Миниатюры
Перегрузка оператора вывода   Перегрузка оператора вывода  
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
10.10.2016, 17:54
Ответы с готовыми решениями:

Перегрузка оператора вывода в С++ (для вывода данных вектора)
Как правильно перегрузить оператор вывода для вектора чтобы он выводил все данные из вектора ? Для этого класса есил можно помогите. ...

Перегрузка оператора вывода
Здравствуйте! При вызове перегруженного оператора возникает ошибка. Подскажите, как её исправить. #include &quot;stdafx.h&quot; #include...

Перегрузка оператора вывода
Доброго всем времени суток! Разрабaтал класс dig и реализовал перегрузку оператора вывода для него, но столкнулся с проблемой. Когда пишу...

10
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
10.10.2016, 18:02
Лучший ответ Сообщение было отмечено NRX как решение

Решение

Возможно. Используй позиционирование курсора - SetConsoleCursorPosition(), и расчёт ширины чисел.
1
 Аватар для NRX
22 / 19 / 9
Регистрация: 22.09.2015
Сообщений: 161
10.10.2016, 18:44  [ТС]
спасибо, только у меня не очень получается сделать выравнивание
0
Любитель чаепитий
 Аватар для GbaLog-
3745 / 1801 / 566
Регистрация: 24.08.2014
Сообщений: 6,020
Записей в блоге: 1
10.10.2016, 18:47
NRX, Кол-во символов '-' == кол-ву чисел числителя/знаменателя, смотря что больше символов занимает.
0
 Аватар для NRX
22 / 19 / 9
Регистрация: 22.09.2015
Сообщений: 161
10.10.2016, 19:43  [ТС]
Я сделал следующим образом
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
void Fraction::my_gotoxy(int x, int y) const
{       HANDLE hConsole;
        hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
        COORD mycoord;
        mycoord.X = x;
        mycoord.Y = y;
        SetConsoleCursorPosition(hConsole, mycoord);
}
 
 
std::ostream & operator<<(std::ostream & os, const Fraction & dt)
{
    int num = dt.data.num, denum = dt.data.num;
    int snum = 0, sdenum = 0;
    while (num % 10 != 0)
    {
        num /= 10;
        snum++;
    }
    while (denum % 10 != 0)
    {
        denum /= 10;
        sdenum++;
    }
    HANDLE hConsole;
    hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
    CONSOLE_SCREEN_BUFFER_INFO c;
    static int s = 0;
    int ss = 0;
    if (s != 0)  
    {
        s += max(snum, sdenum);
        
        if (s < 3) s += 3;
    }
    ss = max(snum, sdenum);
    GetConsoleScreenBufferInfo(hConsole, &c);
    dt.my_gotoxy(s, c.dwCursorPosition.Y - 1);
    os << dt.data.num;
    GetConsoleScreenBufferInfo(hConsole, &c);
    dt.my_gotoxy(s, c.dwCursorPosition.Y + 1);
    for (int i = 0; i <= ss; i++)
    os << "-";
    GetConsoleScreenBufferInfo(hConsole, &c);
    dt.my_gotoxy(s, c.dwCursorPosition.Y + 1);
    os << dt.data.denum;
    GetConsoleScreenBufferInfo(hConsole, &c);
 
     s += ss+1;
    dt.my_gotoxy(s, c.dwCursorPosition.Y - 1);
    return os;
}
Еще вопрос. Как определить что был вызван endl? Так как есть проблема, если сделать так
C++
1
2
3
        Fraction p(12, 5), c(58, 19), l(41, 22), q(5, 3), f(14, 13);
        cout << p << '+' << c << '+' << l << '+' << q << '+' << f <<  endl << endl << endl;
        cout << p << '+' << c << '+' << l << '+' << q << '+' << f << endl << endl;
проблема на скрине, Второй cout не начинается с начала строки и куча endl;
Миниатюры
Перегрузка оператора вывода  
0
 Аватар для NRX
22 / 19 / 9
Регистрация: 22.09.2015
Сообщений: 161
10.10.2016, 19:50  [ТС]
насколько мне известно, endl сбрасывает буфер. Можно ли как-то узнать размер этого буфера. Или я сказал какой-то бред?
0
79 / 79 / 34
Регистрация: 26.10.2011
Сообщений: 220
10.10.2016, 19:55
Цитата Сообщение от NRX Посмотреть сообщение
Еще вопрос. Как определить что был вызван endl? Так как есть проблема, если сделать так
Мне кажется тебе нужно определить свой перенос строки для использования с классом Fraction.
1
 Аватар для NRX
22 / 19 / 9
Регистрация: 22.09.2015
Сообщений: 161
10.10.2016, 19:57  [ТС]
sergestus, Ага. Понял. А endl перегрузить можно? для удобства
0
79 / 79 / 34
Регистрация: 26.10.2011
Сообщений: 220
10.10.2016, 20:04
Цитата Сообщение от NRX Посмотреть сообщение
А endl перегрузить можно? для удобства
можно, если бы он был оператором
0
Любитель чаепитий
 Аватар для GbaLog-
3745 / 1801 / 566
Регистрация: 24.08.2014
Сообщений: 6,020
Записей в блоге: 1
10.10.2016, 20:27
Цитата Сообщение от NRX Посмотреть сообщение
А endl перегрузить можно?
Можно только свой манипулятор написать.
http://en.cppreference.com/w/cpp/io/manip
1
 Аватар для NRX
22 / 19 / 9
Регистрация: 22.09.2015
Сообщений: 161
10.10.2016, 20:44  [ТС]
Ох. Лучше я сделаю просто функцию, как-то запутано. И времени разбираться нету. спасибо за расширение кругозора
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
10.10.2016, 20:44
Помогаю со студенческими работами здесь

Перегрузка оператора вывода
Здравствуйте. Помогите пожалуйста понять, что нужно передать в качестве параметра при перегрузке оператора вывода? Мне нужно удалить...

Перегрузка оператора вывода
Допустим я перегружаю оператор вывода: std::ostream&amp; operator&lt;&lt;(std::ostream&amp; os,Drobi const &amp;d) { ...

Перегрузка оператора вывода
В чем ошибка, пытаюсь вывести Цену а он мне выводит ошибку в сроке 23: Ошибка C3867 &quot;Cat:: price&quot;: нестандартный синтаксис;...

Перегрузка оператора вывода
Здравствуйте! Подскажите пожалуйста как можно решить проблему с перегрузкой оператора. В моем коде выдает ошибку: error C2440: '=' :...

Перегрузка оператора вывода
Здравствуйте. Не могу понять в чем ошибка. При выводе пишет: warning C4717: operator&lt;&lt;: рекурсия на всех путях выполнения, функция вызовет...


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а привычная функция main(). . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь(не выше 3-го порядка) постоянного тока с элементами R, L, C, k(ключ), U, E, J. Программа находит переходные токи и напряжения на элементах схемы классическим методом(1 и 2 з-ны. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru