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

Защита от некорректного ввода для действительных чисел - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 12, средняя оценка - 4.67
TROOZZ
0 / 0 / 0
Регистрация: 07.01.2012
Сообщений: 10
07.01.2012, 16:09     Защита от некорректного ввода для действительных чисел #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
#include <stdafx.h>
#include <stdio.h>
#include <locale.h>
#include <conio.h>
#include <math.h>
#include <malloc.h>
#include <stdlib.h>
 
 
 
void menu()
{
system ("cls");
printf("1. Ввод");
printf("\n 2. Решение");
printf("\n 3. Вывод");
printf("\n 4. Abbout");
printf("\n 5. Help");
printf("\n 6. Выход");
}
int ** Vvod(int n)
{
int **A;
int i,j;
A=(int **)calloc(n, sizeof(int *));
for(i=0; i<n; i++)
A[i]=(int *)calloc(n, sizeof(int));
for (i=0;i<n;i++)
for (j=0;j<n;j++){ 
printf ("\n Введите элементы A[%d][%d]= ",i+1,j+1);
scanf("%i", &A[i][j]);
}
return A;
}
int Reshenie(int **A, int n)
{
int i,j,j_max,i_max;
float d;
d=A[0][0];
for (i=0; i<n; i++)
{
for (j=0; j<n; j++)
{
if 
(d<(abs(A[i][j])))
{d=(abs(A[i][j]));
i_max=i;
j_max=j;}
}
}
 
for (j=0; j<n; j++)
{
int tmp1;
tmp1=A[0][j];
A[0][j]=A[i_max][j];
A[i_max][j]=tmp1;
}
for (i=0; i<n; i++)
{
int tmp2;
tmp2=A[i][0];
A[i][0]=A[i][j_max];
A[i][j_max]=tmp2;
}
return **A;}
float Vivod(int **A, int n)
{
int i,j;
for(i=0;i<n;i++) 
{printf("\n");
for (j=0;j<n;j++)
printf("A[%d][%d]=%d ", i+1, j+1, A[i][j]);}
return NULL;
}
 
int _tmain(int argc, _TCHAR* argv[])
{
setlocale( LC_ALL, "Russian" );
int **A;
menu();
int n;
bool flag=false;
char ch;
while(true){
printf("\n Введите нужный номер пункта меню");
ch=_getche();
printf("\n");
switch(ch){
case '1': 
{if(flag==false){
printf("Введите размер квадратной матрицы n");
scanf("%d", &n);
A=Vvod(n); break;}}
case '2': 
{{Reshenie(A, n); printf("Идет решение"); break;}}
case '3': 
{Vivod(A, n); break;}
case '4': 
printf("ывфывы"); break;
case '5': 
printf("Назовем допустимым преобразованием матрицы перестановку двух строк или двух столбцов.\nДана действительная квадратная матрица порядка n с помощью допустимых преобразований \nдобиться того, что бы один из элементов матрицы, обладающий большим по модулю значением,\nрасполагался в верхнем левом углу матрицы"); break;
case '6':
return 0;
 
}
} 
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
go
Эксперт C++
3582 / 1362 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
07.01.2012, 16:12     Защита от некорректного ввода для действительных чисел #2
TROOZZ, scanf возвращает число, равное кол-во успешных присвоений. Вот его и проверяйте.
IFree Host
Заблокирован
07.01.2012, 16:15     Защита от некорректного ввода для действительных чисел #3
А ты проверяй на какие кнопки там человек нажимает.
Если не на цифры то по рукам ему. Если на запятую или точку, то ругайся: мол я только целые понимаю.
TROOZZ
0 / 0 / 0
Регистрация: 07.01.2012
Сообщений: 10
07.01.2012, 16:32  [ТС]     Защита от некорректного ввода для действительных чисел #4
дак как его проверить-то?)) и да, как сделать так, что если 2 или 3 пункт выберут до ввода данных, просило выбрать пункт еще раз
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16843 / 5264 / 323
Регистрация: 30.03.2009
Сообщений: 14,159
Записей в блоге: 26
07.01.2012, 16:34     Защита от некорректного ввода для действительных чисел #5
Единственный нормальный способ - ВЕСЬ ввод делать в строковом виде и дальше анализировать строку
IFree Host
Заблокирован
07.01.2012, 16:38     Защита от некорректного ввода для действительных чисел #6
Дык, ты что проверить хочешь? Какой пункт меню будет вызван? Или ввод целочисленных данных?
TROOZZ
0 / 0 / 0
Регистрация: 07.01.2012
Сообщений: 10
07.01.2012, 16:47  [ТС]     Защита от некорректного ввода для действительных чисел #7
IFree Host
и то, и то
IFree Host
Заблокирован
07.01.2012, 16:54     Защита от некорректного ввода для действительных чисел #8
Тогда напиши так:

Это для меню:

int input

input = getch();

switch(input)
{
case 49: делать то-то; break; // это для нажатия на клавишу 1
case 50: делать то-то; break; // это для нажатия на клавишу 2
case 51: делать то-то; break; // это для нажатия на клавишу 3
case 52: делать то-то; break; // это для нажатия на клавишу 4
case 53: делать то-то; break; // это для нажатия на клавишу 5
case 54: делать то-то; break; // это для нажатия на клавишу 6
}

И так же можно для числа, мол если код ввода не число то ничего не делать:

if (input >= 49 && input <= 57)
{
тогда делать...
}
TROOZZ
0 / 0 / 0
Регистрация: 07.01.2012
Сообщений: 10
07.01.2012, 18:04  [ТС]     Защита от некорректного ввода для действительных чисел #9
в общем, нужно сделать защиту на ввод значений в матрицу, и что бы если пункты 2 или 3 выбраны раньше 1, то возвращало бы к выбору пункта, а защита на меню у меня вроде работает, там просто бесконечный цикл. А я понятия не имею как это сделать....

Добавлено через 35 минут
кто-нибудь поможет?
IFree Host
Заблокирован
07.01.2012, 19:05     Защита от некорректного ввода для действительных чисел #10
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
#include <stdafx.h>
#include <stdio.h>
#include <locale.h>
#include <conio.h>
#include <math.h>
#include <malloc.h>
#include <stdlib.h>
 
void menu()
{
system ("cls");
printf("1. Ввод");
printf("\n 2. Решение");
printf("\n 3. Вывод");
printf("\n 4. Abbout");
printf("\n 5. Help");
printf("\n 6. Выход");
}
 
int ** Vvod(int n)
{
    int **A;
    int i,j;
    A=(int **)calloc(n, sizeof(int *));
    for(i=0; i<n; i++)
    A[i]=(int *)calloc(n, sizeof(int));
    for (i=0;i<n;i++)
    for (j=0;j<n;j++)
    { 
        printf ("\n Введите элементы A[%d][%d]= ",i+1,j+1);
        scanf("%i", &A[i][j]);
    }
    return A;
}
 
int Reshenie(int **A, int n)
{
    int i,j,j_max,i_max;
    float d;
    d=A[0][0];
 
    for (i=0; i<n; i++)
    {
        for (j=0; j<n; j++)
        {
            if (d<(abs(A[i][j]))){
                d=(abs(A[i][j]));
                i_max=i;
                j_max=j;
            }
        }
    }
         
    for (j=0; j<n; j++)
    {
        int tmp1;
        tmp1=A[0][j];
        A[0][j]=A[i_max][j];
        A[i_max][j]=tmp1;
    }
 
    for (i=0; i<n; i++)
    {
        int tmp2;
        tmp2=A[i][0];
        A[i][0]=A[i][j_max];
        A[i][j_max]=tmp2;
    }
    return **A;
}
 
float Vivod(int **A, int n)
{
    int i,j;
    for(i=0;i<n;i++) 
    {printf("\n");
    for (j=0;j<n;j++)
    printf("A[%d][%d]=%d ", i+1, j+1, A[i][j]);}
    return NULL;
    getchar();
}
 
int _tmain(int argc, _TCHAR* argv[])
{
    setlocale( LC_ALL, "Russian" );
    int **A;
    menu();
    int n;
    bool b_punkt1_bil_wibran = 0;
    bool b_exite = 0;
    bool flag=false;
    char ch;
 
    do
    {
        printf("\n Введите нужный номер пункта меню");
        ch=_getche();
        printf("\n");
        switch(ch)
        {
            case '1': 
                b_punkt1_bil_wibran = 1;
                if(flag==false)
                {
                    printf("Введите размер квадратной матрицы n");
                    scanf("%d", &n);
                    A=Vvod(n); break;
                }
            case '2':
                if(b_punkt1_bil_wibran){Reshenie(A, n); printf("Идет решение");}
                else{ system("cls"); menu(); }break;
            case '3': 
                if(b_punkt1_bil_wibran){Vivod(A, n); getchar();}
                else{ system("cls"); menu(); }break;
            case '4': 
                printf("ывфывы"); break;
            case '5': 
                printf("Назовем допустимым преобразованием матрицы перестановку двух строк или двух столбцов.\nДана действительная квадратная матрица порядка n с помощью допустимых преобразований \nдобиться того, что бы один из элементов матрицы, обладающий большим по модулю значением,\nрасполагался в верхнем левом углу матрицы"); break;
            case '6':
                b_exite = 1;
            return 0;
         
        } 
    } while(!b_exite);
}
TROOZZ
0 / 0 / 0
Регистрация: 07.01.2012
Сообщений: 10
07.01.2012, 19:42  [ТС]     Защита от некорректного ввода для действительных чисел #11
зачем do while добавил? меню и так работает, или в чем его смысл здесь?
IFree Host
Заблокирован
07.01.2012, 23:43     Защита от некорректного ввода для действительных чисел #12
В том, чтобы возвращаться назад к меню если балбес на вводе давит двойку вместо 1 и выйти из программы по 6
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16843 / 5264 / 323
Регистрация: 30.03.2009
Сообщений: 14,159
Записей в блоге: 26
08.01.2012, 16:19     Защита от некорректного ввода для действительных чисел #13
Цитата Сообщение от Evg Посмотреть сообщение
Единственный нормальный способ - ВЕСЬ ввод делать в строковом виде и дальше анализировать строку
scanf'ом ты вводишь в int'овую переменную, а вводить нужно в строковой буфер. А дальше уже анализировать на предмет того, введено у тебя в буфере чистое число (типа "1.234") или есть какой-то мусор (типа "1.234jghjk"). Такие серьёзные проверки в "домашних" программах являются избыточными, а потому можно обойтись более грубой проверкой, о которой тебе писали в посте #2
NinGAZ
13 / 13 / 1
Регистрация: 27.07.2011
Сообщений: 162
08.01.2012, 16:22     Защита от некорректного ввода для действительных чисел #14
а почему бы не сделать пункт 1 без case? меньше проблем и какая-никакая оптимизация програмы.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.01.2012, 19:20     Защита от некорректного ввода для действительных чисел
Еще ссылки по теме:

Работает для целых чисел, надо чтоб работало для действительных, не добавляя библиотек C++
Защита от некорректного ввода double C++
Защита от некорректного ввода C++

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

Или воспользуйтесь поиском по форуму:
TROOZZ
0 / 0 / 0
Регистрация: 07.01.2012
Сообщений: 10
08.01.2012, 19:20  [ТС]     Защита от некорректного ввода для действительных чисел #15
Evg
В том-то и дело, что требуют серьезную проверку. Ну собственно идею я понял, только не знаю, как ее реализовать
Yandex
Объявления
08.01.2012, 19:20     Защита от некорректного ввода для действительных чисел
Ответ Создать тему
Опции темы

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