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

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

Войти
Регистрация
Восстановить пароль
 
genock94
20 / 20 / 1
Регистрация: 16.11.2012
Сообщений: 348
#1

Оператор cin. Задать ширину для вывода нескольких значений - C++

15.01.2014, 17:26. Просмотров 455. Ответов 3
Метки нет (Все метки)

Добрый вечер, уважаемые программисты.
Проблема заключается в следующем:
При выводе таблицы столбцы получаются неровными. Вот код:
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
112
113
114
115
116
117
/**/
#include <iostream>
#include <iomanip>
#include <cstdlib>
#include <conio.h>
 
using namespace std;
/////////////ÃëîáГ*ëüГ*ûå ïåðåìåГ*Г*ûå, ГЄГ«Г*Г±Г±Г», ñòðóêòóðû/////////
class fraction {
    private: 
        int chisl;
        int znam;
    public:
        fraction(): chisl(0), znam(1) {
            
        }
        fraction(int a, int b): chisl(a), znam (b) {
            
        }
        void vvod() {       
            char ch;
            cin >> chisl >> ch >> znam;
        }
        void vivod() const {
            cout << setw(10) << chisl << "/" << znam;
        }
        void lowterms() {
            long tnum, tden, temp, gcd;
            
            tnum = labs(chisl);
            tden = labs(znam);
            if (tden==0) {
                cout << "Nedopustimiy znamenatel'!";
                exit(1);
            }
            else if (tnum==0) {
                chisl=0;
                znam=1;
                return;
            }
            while (tnum != 0) {
                if (tnum < tden) {
                    temp=tnum;
                    tnum=tden;
                    tden=temp;
                }
                tnum=tnum-tden;
            }
            gcd=tden;
            chisl=chisl/gcd;
            znam=znam/gcd;
            
        }
        void set(int a, int b) {
            chisl = a;
            znam = b;
            lowterms();
        }
        void add(const fraction &a, const fraction &b) {
            chisl = a.chisl*b.znam + b.chisl*a.znam;
            znam = a.znam*b.znam;
            lowterms();
        }
        void sub(const fraction &a, const fraction &b) {
            chisl = a.chisl*b.znam - b.chisl*a.znam;
            znam = a.znam*b.znam;
            lowterms();
        }
        void mul(const fraction &a, const fraction &b) {
            chisl = a.chisl*b.chisl;
            znam = a.znam*b.znam;
            lowterms();
        }
        void div(const fraction &a, const fraction &b) {
            chisl = a.chisl*b.znam;
            znam = a.znam*b.chisl;
            lowterms();
        }
};
/////////////Ïðîòîòèïû ГґГіГ*êöèé////////////////////////////////
void writechar(char ch, int n);
//////////////////////////////////////////////////////////////
int main()
{
    fraction f1, f2, f3;
    int z;
    
    cout << "Vvedite znamenatel': ";
    cin >> z;
    
    for (int i=1; i<z; i++) {
        f1.set(i,z);
        f1.vivod();
    }
    
    cout << endl;
    writechar('-',80);
    
    for (int i=1; i<z; i++) {
        for (int j=1; j<z; j++) {
            f1.set(i,z);
            f2.set(j,z);
            f3.mul(f1,f2);
            f3.vivod();
        }
        cout << endl;
    }
    
    
    return 0;
}
//////////////////////////////////////////////////////////////
void writechar(char ch, int n) {
    for (int i=0; i<n; i++) {
        cout << ch;
    }
}
Таблицу выводят два цикла for (один в другом).
C++
1
void vivod();
- метод вывода дроби. В нём находится оператор вывода значений числителя и знаменателя дроби:
C++
1
cout << setw(10) << chisl << "/" << znam;
Но.. манипулятор setw(10) выделяет 10 знаков лишь под значение числителя, а не под "chisl/znam", из-за чего вся таблица становится кривой.
Вопрос: Как сделать так, чтобы 10 знаков выделялось под "всю дробь"?
Вот скрин работы программы:
Оператор cin. Задать ширину для вывода нескольких значений
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.01.2014, 17:26
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Оператор cin. Задать ширину для вывода нескольких значений (C++):

Оператор cin. Ввод нескольких переменных через делитель - C++
Всем доброго времени суток. Я начинаю работать с C++ и столкнулся с такой проблемой при написании программы. Мне надо ввести в консольном...

Для шаблонного класса перегрузить оператор присваивания, copy-конструктор, объекты cin и cout, оператор * - C++
Помогите в следующем: Для класса шаблона следует перегрузить оператор присваивания, конструктор копирования, бинарный оператор суммы «*»,...

Ввод нескольких значений, поток cin - C++
Привет :) Хотел бы узнать, как можно считать подряд несколько пар значений (например какое то слово и число, Slovo 39 Slovo2 43) чтобы...

Std:cin ввод нескольких значений - C++
Нужно ввести строку с параметром cin &gt;&gt; command; //ввели add_int 5 далее в command у нас остается add_int нужно...

Расчитать значения переменных y и z по заданным формулам, используя для ввода/вывода cin и cout - C++
Расчитать значения переменных y и z по заданным формулам (табл. 1). Для ввода/вывода использовать объекты cin и cout. Определить...

Расчитать значения переменных y и z по заданным формулам, используя для ввода/вывода cin и cout - C++
Расчитать значения переменных y и z по заданным формулам . Для ввода/вывод использовать объекты cin и cout. Определить разность между...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
AnDrew_LP
160 / 162 / 9
Регистрация: 29.05.2010
Сообщений: 435
15.01.2014, 17:30 #2
Несколько раз использовать setw
0
genock94
20 / 20 / 1
Регистрация: 16.11.2012
Сообщений: 348
15.01.2014, 18:17  [ТС] #3
AnDrew_LP, придётся каждый раз учитывать кол-во знаков в знаменателе, и в зависимости от этого менять аргумент манипулятора.
Я попробовал сделать так:
C++
1
2
3
4
5
void vivod() const {
            
            cout << setiosflags(ios::right) << setw(10) << chisl << "/";
            cout << setiosflags(ios::left) << setw(2) << znam;
        }
чтобы числитель выводился по правому краю в рамке из 10 знаков, потом вывелся символ "/", а затем вывелся знаменатель по левому краю в рамке из 2 знаков. Однако, почему-то знаменатель не выводится по левому краю, а выводится по правому.
Вопрос: Почему?(
Вот скрин с выше приведённым методом:
Оператор cin. Задать ширину для вывода нескольких значений
0
genock94
20 / 20 / 1
Регистрация: 16.11.2012
Сообщений: 348
15.01.2014, 19:57  [ТС] #4
Решил сделать так:
C++
1
2
3
4
5
        void vivod() const {
            
            cout << right << setw(10) << chisl << "/";
            cout << left << setw(2) << znam;
        }
Результат:
Оператор cin. Задать ширину для вывода нескольких значений
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.01.2014, 19:57
Привет! Вот еще темы с ответами:

Оператор вывода для иерархии - C++
Добрый вечер всем, Имеется класс Person, от него отнаследован класс Student. Есть 2 оператора чтения из потока std::istream&amp;...

Можно ли задать оператор сравнения (< или >) для string - C++
задача - создание шаблонного класса. и в нем используется оператор сравнения в одном из методов, задача предполагает использование инт,...

Не получается перегрузить оператор вывода для дружественной функции - C++
Не могу понять почему пытаясь перегрузить оператор вывода использую дружественную функцию, я не могу передать объект по значению, это...

Как перегрузить оператор вывода в поток для вектора? - C++
Стало интересно реализовать подобный функционал, и конечно же ничего не работает. При этом коде: template&lt;class T&gt; ...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
15.01.2014, 19:57
Ответ Создать тему
Опции темы

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