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

Матрицы. Классы. Проверка ввода - C++

Восстановить пароль Регистрация
 
bgm313
12 / 12 / 2
Регистрация: 27.07.2012
Сообщений: 208
02.08.2012, 23:40     Матрицы. Классы. Проверка ввода #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
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
#include <iostream>
#include <time.h>
#include <conio.h>
using namespace std;
 
class Matrix{
    int max_val;      //максимальное значение элемента матрицы
    int size;         //размер матрицы
    int ** mtx;       //двумерный массива для хранения матрицы
public:
    Matrix() {};                //конструктор по умолчанию
    Matrix(int s, char type);   //параметрический конструктор
    
    //сумма матриц
    Matrix Add(Matrix op);
 
    //произведение матриц
    Matrix Mul(Matrix op);
    
    //вывод матрицы в консоль
    void Show();
 
    //изменяет значение элемента матрицы с адресом (i,j) на val
    void Correct(int i, int j ,double val){
        mtx[i][j] = val;
    }
    
    //функция доступа для размера матрицы
    int get_size(){ return size; }
    
    //выбор операции
    static char chose_operations();
 
    //выбор способа заполнения 
    static char chose_fill();
   
    //запрос на коректировку элементов матрицы
    bool chose_correct();
 
    //проверка находится ли индекс в пределах размера матрицы
    bool valid_index(int i){ 
        if(i < 0 || i > (size - 1)) return false;
        else return true;
    }
};
 
int main(){
    char ch, fill;
    int size;
    
    setlocale(LC_ALL,"Rus");
 
    for(;;){
        ch = Matrix::chose_operations();
        if(ch == '0') break;
        
        cout << "\n";
 
        do{
            fflush(stdin);
            cout << "Введите размер матриц: ";
            cin >> size;
        }while(cin.rdbuf()->in_avail()!=1);
        
        cout << "\nМатрица 1:\n";
        Matrix op1(size, Matrix::chose_fill());
        for(;;){
            cout << "\nВы ввели матрицу 1:\n";
            op1.Show();
            if(!op1.chose_correct()) break;
        }
        
        cout << "\nМатрица 2:\n";
        Matrix op2(size,Matrix::chose_fill());
        for(;;){
            cout << "\nВы ввели матрицу 2:\n";
            op2.Show();
            if(!op2.chose_correct()) break;
        }
        
        Matrix result;
 
        switch(ch){
        case'1':
            result = op1.Mul(op2);
            cout << "\nРезультат умножения:\n";
            result.Show();  
            break;
        case'2':
            result = op1.Add(op2);
            cout << "Результат сложения:\n";
            result.Show();  
            break;
        }
        
        cout << "\nДля продолжения нажмите любую кнопку.";
        getch();
        system("cls");
    }
}
 
Matrix::Matrix(int s, char type){
    int i,j;    //переменные для доступа к элемента матрицы
        
    //установка максимального значение элементов матрицы
    max_val = 1000;
 
    //установка размера матрицы
    if(s > 10) size = 10;
    else if(s < 1) size = 1;
    else size = s;
 
    //динамическое выделение памяти под двумерный массив для матрицы
    mtx = new int*[size];
    for(i=0; i<size; i++)
        mtx[i] = new int[size];
 
    //заполнение матрицы в соответствие с выбором пользователя
    switch(type){
        case '0':
        case '1':
            for(i=0; i<size; i++)
                for(j=0; j<size; j++)
                    mtx[i][j] = (i == j)? type - 48:0;
            break;
        case 'r':
            srand(time(NULL));
 
            for(i=0; i<size; i++)
                for(j=0; j<size; j++)
                    mtx[i][j] = rand() % max_val;
            break;
        case 'm':
            for(i=0; i<size; i++)
                for(j=0; j<size; j++){
                    do{
                        fflush(stdin);
                        cout << "Введите mtx [" << i << "][" << j << "]: "; 
                        cin >> mtx[i][j];
                        mtx[i][j] = mtx[i][j] % max_val;
                    }while(cin.rdbuf()->in_avail()!=1);
                }
            cout << "\n";
            break;
    }
}
 
Matrix Matrix::Add(Matrix op){
    int i, j;
    Matrix result(size,'0');    //создали матрицу для суммы матриц заполненную нулями
    
    for(i=0; i<size; i++)
        for(j=0; j<size; j++)
            result.mtx[i][j] = mtx[i][j] + op.mtx[i][j];
 
    return result;
}
 
Matrix Matrix::Mul(Matrix op){
    int i, j, k;
    Matrix result(size,'0');    //создали матрицу для произведения матриц заполненную нулями
 
    for(k=0; k<size; k++)
        for(i=0; i<size; i++)
            for(j=0; j<size; j++)
                result.mtx[k][i]+=(mtx[k][j] * op.mtx [j][i]);
 
    return result;
}
 
bool Matrix::chose_correct(){
    int ch,i,j,change_val;
 
    do{
        fflush(stdin);
        cout << "Коректировать элементы матрицы (0-нет, 1-да): ";
        cin >> ch;
    }while(cin.rdbuf()->in_avail()!=1 || ch!=0 && ch!=1);
    
    if(!ch) return false;
    else {
        do{
            fflush(stdin);
            cout << "Введите номер строки: ";
            cin >> i;
        }while(cin.rdbuf()->in_avail()!=1 || !valid_index(i) );
 
        do{
            fflush(stdin);
            cout << "Введите номер столбца: ";
            cin >> j;
        }while(cin.rdbuf()->in_avail()!=1 || !valid_index(j));
 
        do{
            fflush(stdin);
            cout << "Введите значение элемента mtx[" << i << "][" << j << "]: ";
            cin >> change_val;
        }while(cin.rdbuf()->in_avail()!=1);
            
        Correct(i,j,change_val);
    }
}
 
char Matrix::chose_fill(){
    char ch;
    
    cout << "Способ заполнения:\n"
         << " Рандом - r\n"
         << " Вручную - m\n"
         << " Единичная - 1\n";
    
    do{
        fflush(stdin);
        cout << "сделайте выбор: ";
        cin >> ch;
    }while(ch != 'r' && ch != 'm' && ch!= '1' || cin.rdbuf()->in_avail()!=1);
    
    return ch;
}
 
char Matrix::chose_operations(){
    char ch;
 
    cout << "Меню:\n"
        << " 1.Умножение матриц\n"
        << " 2.Сложение матриц\n";
    do{
        fflush(stdin);
        cout << "Выберите действие (0 - выход): ";
        cin >> ch;
    }while(ch < '0' || ch > '2' || cin.rdbuf()->in_avail()!=1);
 
    return ch;
}
 
void Matrix::Show(){
    for(int i=0; i<size; i++){
        for(int j=0; j<size; j++){
            cout.width(6);
            cout.setf(ios::right);
            cout << mtx[i][j] << ' ';
        }
        cout << "\n";
    }
}
Миниатюры
Матрицы. Классы. Проверка ввода  
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.08.2012, 23:40     Матрицы. Классы. Проверка ввода
Посмотрите здесь:

Проверка ввода C++
C++ проверка ввода C++
Проверка ввода C++
Проверка ввода C++
C++ Матрицы. Бесконечный цикл. Проверка ввода
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Intel~lect
 Аватар для Intel~lect
135 / 124 / 2
Регистрация: 03.07.2012
Сообщений: 355
03.08.2012, 11:14     Матрицы. Классы. Проверка ввода #2
Цитата Сообщение от bgm313 Посмотреть сообщение
C++
1
2
cout << "Введите размер матриц: ";
cin >> size;
Но так ведь переменная size целого типа, а вы вводите букву Q. Здесь и должна быть ошибка.
Можно сделать проверку на правильный ввод:
C++
1
2
3
4
5
if (!cin)
{
   cin.clear();
   while ( cin.get() != '\n' ) ;
}
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
03.08.2012, 13:01     Матрицы. Классы. Проверка ввода #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
bool Matrix::chose_correct(){
    int ch,i,j,change_val;
 
    do{
        fflush(stdin);
        cout << "Коректировать элементы матрицы (0-нет, 1-да): ";
        cin >> ch;
    }while(cin.rdbuf()->in_avail()!=1 || ch!=0 && ch!=1);
    
    if(!ch) return false;
    else {
        do{
            fflush(stdin);
            cout << "Введите номер строки: ";
            cin >> i;
        }while(cin.rdbuf()->in_avail()!=1 || !valid_index(i) );
 
        do{
            fflush(stdin);
            cout << "Введите номер столбца: ";
            cin >> j;
        }while(cin.rdbuf()->in_avail()!=1 || !valid_index(j));
 
        do{
            fflush(stdin);
            cout << "Введите значение элемента mtx[" << i << "][" << j << "]: ";
            cin >> change_val;
        }while(cin.rdbuf()->in_avail()!=1);
            
        Correct(i,j,change_val);
    }
}
Что этот метод возвращает, при согласии на корректировку?
bgm313
12 / 12 / 2
Регистрация: 27.07.2012
Сообщений: 208
03.08.2012, 22:17  [ТС]     Матрицы. Классы. Проверка ввода #4
Цитата Сообщение от Intel~lect Посмотреть сообщение
Но так ведь переменная size целого типа, а вы вводите букву Q. Здесь и должна быть ошибка.
Можно сделать проверку на правильный ввод:
C++
1
2
3
4
5
if (!cin)
{
   cin.clear();
   while ( cin.get() != '\n' ) ;
}
Я делаю проверку, но по какой -то причине в 1 случае она работает, а во втором тоже работает, но почему-то не запрашивает ввод у пользователя хотя должна, как-будто я ввел много символов и не очистил поток, а я очистил же или нет?

Вот код этого ужасного момента (случай 2)

C++
1
2
3
4
5
 do{
            fflush(stdin);     //очистили поток
            cout << "Введите размер матриц: ";
            cin >> size;         //иногда при неверно вводе запрашивает заново ввод, а иногда автоматически записывает неизвестное значение и цикл уходит в бесконечнготь
        }while(cin.rdbuf()->in_avail()!=1);
Вот случай 1 в котором всё ок

C++
1
2
3
4
5
6
7
8
9
10
char ch;
 
    cout << "Меню:\n"
        << " 1.Умножение матриц\n"
        << " 2.Сложение матриц\n";
    do{
        fflush(stdin);
        cout << "Выберите действие (0 - выход): ";
        cin >> ch;
    }while(ch < '0' || ch > '2' || cin.rdbuf()->in_avail()!=1);
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
04.08.2012, 09:06     Матрицы. Классы. Проверка ввода #5
Цитата Сообщение от Intel~lect Посмотреть сообщение
Но так ведь переменная size целого типа, а вы вводите букву Q. Здесь и должна быть ошибка.
В первом случае, у вас должно вводиться int (int size), а вы вводите символ, поэтому cin >> выдаёт ошибку. Во втором случае, у вас должно вводиться char (char ch), поэтому при любом символе ошибки не будет, но обработка будет неопределённая. И добавьте в функцию chose_correct(), после 202 строки: return true; . У вас в for() происходит проверка, возвращаемого этой функцией, значения. Работает и без этого, но это дело случая.
Код
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
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
#include <iostream>
#include <time.h>
#include <conio.h>
using namespace std;
 
class Matrix{
    int max_val;      //максимальное значение элемента матрицы
    int size;         //размер матрицы
    int ** mtx;       //двумерный массива для хранения матрицы
public:
    Matrix() {};                //конструктор по умолчанию
    Matrix(int s, char type);   //параметрический конструктор
    
    //сумма матриц
    Matrix Add(Matrix op);
 
    //произведение матриц
    Matrix Mul(Matrix op);
    
    //вывод матрицы в консоль
    void Show();
 
    //изменяет значение элемента матрицы с адресом (i,j) на val
    void Correct(int i, int j ,double val){
        mtx[i][j] = val;
    }
    
    //функция доступа для размера матрицы
    int get_size(){ return size; }
    
    //выбор операции
    static char chose_operations();
 
    //выбор способа заполнения 
    static char chose_fill();
   
    //запрос на коректировку элементов матрицы
    bool chose_correct();
 
    //проверка находится ли индекс в пределах размера матрицы
    bool valid_index(int i){ 
        if(i < 0 || i > (size - 1)) return false;
        else return true;
    }
};
 
int main(){
    char ch, fill;
    int size;
    
    setlocale(LC_ALL,"Rus");
 
    for(;;){
        ch = Matrix::chose_operations();
        if(ch == '0') break;
        
        cout << "\n";
        cout << "Введите размер матриц: ";
        while (!(cin >> size))
            {
                if (!cin)
                {
                    cin.clear();
                    while (cin.get() != '\n');
                    cout << "Неверный ввод. Повторите.\n";
                    cout << "Введите размер матриц: ";
                }
            } 
        
        cout << "\nМатрица 1:\n";
        Matrix op1(size, Matrix::chose_fill());
        for(;;){
            cout << "\nВы ввели матрицу 1:\n";
            op1.Show();
            if(!op1.chose_correct()) break;
        }
        
        cout << "\nМатрица 2:\n";
        Matrix op2(size,Matrix::chose_fill());
        for(;;){
            cout << "\nВы ввели матрицу 2:\n";
            op2.Show();
            if(!op2.chose_correct()) break;
        }
        
        Matrix result;
 
        switch(ch){
        case'1':
            result = op1.Mul(op2);
            cout << "\nРезультат умножения:\n";
            result.Show();  
            break;
        case'2':
            result = op1.Add(op2);
            cout << "Результат сложения:\n";
            result.Show();  
            break;
        }
        
        cout << "\nДля продолжения нажмите любую кнопку.";
        getch();
        system("cls");
    }
}
 
Matrix::Matrix(int s, char type){
    int i,j;    //переменные для доступа к элемента матрицы
        
    //установка максимального значение элементов матрицы
    max_val = 1000;
 
    //установка размера матрицы
    if(s > 10) size = 10;
    else if(s < 1) size = 1;
    else size = s;
 
    //динамическое выделение памяти под двумерный массив для матрицы
    mtx = new int*[size];
    for(i=0; i<size; i++)
        mtx[i] = new int[size];
 
    //заполнение матрицы в соответствие с выбором пользователя
    switch(type){
        case '0':
        case '1':
            for(i=0; i<size; i++)
                for(j=0; j<size; j++)
                    mtx[i][j] = (i == j)? type - 48:0;
            break;
        case 'r':
            srand(time(NULL));
 
            for(i=0; i<size; i++)
                for(j=0; j<size; j++)
                    mtx[i][j] = rand() % max_val;
            break;
        case 'm':
            for(i=0; i<size; i++)
                for(j=0; j<size; j++){
                    
                        fflush(stdin);
                        cout << "Введите mtx [" << i << "][" << j << "]: "; 
                        while (!(cin >> mtx[i][j]))
                        {
                            if (!cin)
                            {
                                cin.clear();
                                while (cin.get() != '\n');
                                cout << "Неверный ввод. Повторите.\n";
                                cout << "Введите mtx [" << i << "][" << j << "]: ";
                            }
                        }
                        mtx[i][j] = mtx[i][j] % max_val;
                    }
            cout << "\n";
            break;
        }
}
 
Matrix Matrix::Add(Matrix op){
    int i, j;
    Matrix result(size,'0');    //создали матрицу для суммы матриц заполненную нулями
    
    for(i=0; i<size; i++)
        for(j=0; j<size; j++)
            result.mtx[i][j] = mtx[i][j] + op.mtx[i][j];
 
    return result;
}
 
Matrix Matrix::Mul(Matrix op){
    int i, j, k;
    Matrix result(size,'0');    //создали матрицу для произведения матриц заполненную нулями
 
    for(k=0; k<size; k++)
        for(i=0; i<size; i++)
            for(j=0; j<size; j++)
                result.mtx[k][i]+=(mtx[k][j] * op.mtx [j][i]);
 
    return result;
}
 
bool Matrix::chose_correct(){
    int i, j, change_val;
    char ch;
 
    do{
        fflush(stdin);
        cout << "Коректировать элементы матрицы (0-нет, 1-да): ";
        cin >> ch;
        if (ch != '0' && ch != '1') 
        {
            cout << "Неверный ввод. Повторите.\n";
        }
      } while(ch != '0' && ch != '1');
    
     if(ch == '0') return false;
     else {
            fflush(stdin);
            cout << "Введите номер строки: ";
            while (!(cin >> i))
            {
                if (!cin)
                {
                    cin.clear();
                    while (cin.get() != '\n');
                    cout << "Неверный ввод. Повторите.\n";
                    cout << "Введите номер строки: ";
                }
            } 
 
            fflush(stdin);
            cout << "Введите номер столбца: ";
            while (!(cin >> j))
            {
                if (!cin)
                {
                    cin.clear();
                    while (cin.get() != '\n');
                    cout << "Неверный ввод. Повторите.\n";
                    cout << "Введите номер столбца: ";
                }
            } 
 
            fflush(stdin);
            cout << "Введите значение элемента mtx[" << i << "][" << j << "]: ";
            while (!(cin >> change_val))
            {
                if (!cin)
                {
                    cin.clear();
                    while (cin.get() != '\n');
                    cout << "Неверный ввод. Повторите.\n";
                    cout << "Введите значение элемента mtx[" << i << "][" << j << "]: ";
                }
            } 
            
            Correct(i,j,change_val);
          }
          return true;
}
 
char Matrix::chose_fill(){
    char ch;
    
    cout << "Способ заполнения:\n"
         << " Рандом - r\n"
         << " Вручную - m\n"
         << " Единичная - 1\n";
    
    do{
        fflush(stdin);
        cout << "сделайте выбор: ";
        cin >> ch;
        if (ch != 'r' && ch != 'm' && ch != '1') 
        {
            cout << "Неверный ввод. Повторите.\n";
        }
    } while(ch != 'r' && ch != 'm' && ch!= '1');
    
    return ch;
}
 
char Matrix::chose_operations(){
    char ch;
 
    cout << "Меню:\n"
        << " 1.Умножение матриц\n"
        << " 2.Сложение матриц\n";
    do{
        fflush(stdin);
        cout << "Выберите действие (0 - выход): ";
        cin >> ch;
        if (ch != '0' && ch != '2' && ch != '1') 
        {
            cout << "Неверный ввод. Повторите.\n";
        }
    } while(ch != '0' && ch != '2' && ch != '1');
 
    return ch;
}
 
void Matrix::Show(){
    for(int i=0; i<size; i++){
        for(int j=0; j<size; j++){
            cout.width(6);
            cout.setf(ios::right);
            cout << mtx[i][j] << ' ';
        }
        cout << "\n";
    }
}
Yandex
Объявления
04.08.2012, 09:06     Матрицы. Классы. Проверка ввода
Ответ Создать тему
Опции темы

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