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

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

Восстановить пароль Регистрация
 
genock94
 Аватар для genock94
19 / 19 / 1
Регистрация: 16.11.2012
Сообщений: 348
15.01.2014, 17:26     Оператор cin. Задать ширину для вывода нескольких значений #1
Добрый вечер, уважаемые программисты.
Проблема заключается в следующем:
При выводе таблицы столбцы получаются неровными. Вот код:
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. Задать ширину для вывода нескольких значений
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
AnDrew_LP
160 / 162 / 9
Регистрация: 29.05.2010
Сообщений: 435
15.01.2014, 17:30     Оператор cin. Задать ширину для вывода нескольких значений #2
Несколько раз использовать setw
genock94
 Аватар для genock94
19 / 19 / 1
Регистрация: 16.11.2012
Сообщений: 348
15.01.2014, 18:17  [ТС]     Оператор cin. Задать ширину для вывода нескольких значений #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. Задать ширину для вывода нескольких значений
genock94
 Аватар для genock94
19 / 19 / 1
Регистрация: 16.11.2012
Сообщений: 348
15.01.2014, 19:57  [ТС]     Оператор cin. Задать ширину для вывода нескольких значений #4
Решил сделать так:
C++
1
2
3
4
5
        void vivod() const {
            
            cout << right << setw(10) << chisl << "/";
            cout << left << setw(2) << znam;
        }
Результат:
Оператор cin. Задать ширину для вывода нескольких значений
Yandex
Объявления
15.01.2014, 19:57     Оператор cin. Задать ширину для вывода нескольких значений
Ответ Создать тему
Опции темы

Текущее время: 08:11. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru