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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 12, средняя оценка - 4.67
TROOZZ
0 / 0 / 0
Регистрация: 07.01.2012
Сообщений: 10
#1

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

07.01.2012, 16:09. Просмотров 1631. Ответов 14
Метки нет (Все метки)

Программа полностью рабочая, только нужно написать защиту от некорректного ввода, и не знаю как это сделать
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;
 
}
} 
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.01.2012, 16:09
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Защита от некорректного ввода для действительных чисел (C++):

Защита от некорректного ввода - C++
Подскажите пожалуйста как доработать защиту от некорректного ввода: // ConsoleApplication4.cpp : Defines the entry point for the console...

Защита от некорректного ввода - C++
Здравствуйте! Нужно осуществить контроль при заполнении матрицы, если введены не корректные данные, вывести сообщение, и переспросить...

Защита от некорректного ввода - C++
Помогите, пожалуйста, с защитой от некорректного ввода! Программа выполняет задания с помощью рекурсии. Хотел написать защиту на ввод...

Защита от некорректного ввода - C++
Помогите сделать так, что при вводе букв программа продолжала работать: запрещала ввод букв(только цифры) или просто не учитывала их. Как...

Защита от некорректного ввода - C++
Приветствую, помогите, пожалуйста, реализовать защиту от некорректного ввода. Должны быть допустимы только числовые значения. double...

Защита от некорректного ввода - C++
Будьте добры, помогите написать защиту от дурака на ввод массива элементы которого тип float Буду очень благодарен.

14
go
Эксперт С++
3586 / 1366 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
07.01.2012, 16:12 #2
TROOZZ, scanf возвращает число, равное кол-во успешных присвоений. Вот его и проверяйте.
0
IFree Host
Заблокирован
07.01.2012, 16:15 #3
А ты проверяй на какие кнопки там человек нажимает.
Если не на цифры то по рукам ему. Если на запятую или точку, то ругайся: мол я только целые понимаю.
0
TROOZZ
0 / 0 / 0
Регистрация: 07.01.2012
Сообщений: 10
07.01.2012, 16:32  [ТС] #4
дак как его проверить-то?)) и да, как сделать так, что если 2 или 3 пункт выберут до ввода данных, просило выбрать пункт еще раз
0
Evg
Эксперт CАвтор FAQ
18029 / 6261 / 427
Регистрация: 30.03.2009
Сообщений: 17,200
Записей в блоге: 27
07.01.2012, 16:34 #5
Единственный нормальный способ - ВЕСЬ ввод делать в строковом виде и дальше анализировать строку
0
IFree Host
Заблокирован
07.01.2012, 16:38 #6
Дык, ты что проверить хочешь? Какой пункт меню будет вызван? Или ввод целочисленных данных?
0
TROOZZ
0 / 0 / 0
Регистрация: 07.01.2012
Сообщений: 10
07.01.2012, 16:47  [ТС] #7
IFree Host
и то, и то
0
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)
{
тогда делать...
}
0
TROOZZ
0 / 0 / 0
Регистрация: 07.01.2012
Сообщений: 10
07.01.2012, 18:04  [ТС] #9
в общем, нужно сделать защиту на ввод значений в матрицу, и что бы если пункты 2 или 3 выбраны раньше 1, то возвращало бы к выбору пункта, а защита на меню у меня вроде работает, там просто бесконечный цикл. А я понятия не имею как это сделать....

Добавлено через 35 минут
кто-нибудь поможет?
0
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);
}
0
TROOZZ
0 / 0 / 0
Регистрация: 07.01.2012
Сообщений: 10
07.01.2012, 19:42  [ТС] #11
зачем do while добавил? меню и так работает, или в чем его смысл здесь?
0
IFree Host
Заблокирован
07.01.2012, 23:43 #12
В том, чтобы возвращаться назад к меню если балбес на вводе давит двойку вместо 1 и выйти из программы по 6
0
Evg
Эксперт CАвтор FAQ
18029 / 6261 / 427
Регистрация: 30.03.2009
Сообщений: 17,200
Записей в блоге: 27
08.01.2012, 16:19 #13
Цитата Сообщение от Evg Посмотреть сообщение
Единственный нормальный способ - ВЕСЬ ввод делать в строковом виде и дальше анализировать строку
scanf'ом ты вводишь в int'овую переменную, а вводить нужно в строковой буфер. А дальше уже анализировать на предмет того, введено у тебя в буфере чистое число (типа "1.234") или есть какой-то мусор (типа "1.234jghjk"). Такие серьёзные проверки в "домашних" программах являются избыточными, а потому можно обойтись более грубой проверкой, о которой тебе писали в посте #2
0
NinGAZ
14 / 14 / 1
Регистрация: 27.07.2011
Сообщений: 162
08.01.2012, 16:22 #14
а почему бы не сделать пункт 1 без case? меньше проблем и какая-никакая оптимизация програмы.
0
TROOZZ
0 / 0 / 0
Регистрация: 07.01.2012
Сообщений: 10
08.01.2012, 19:20  [ТС] #15
Evg
В том-то и дело, что требуют серьезную проверку. Ну собственно идею я понял, только не знаю, как ее реализовать
0
08.01.2012, 19:20
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.01.2012, 19:20
Привет! Вот еще темы с ответами:

Защита от некорректного ввода double - C++
Прошу помощи с защитой от некорректного ввода. Сам студент 1 курса - на лекциях ничего толком не объясняли - просто дали задание и довольно...

Как написать защиту от некорректного ввода для моей проги? - C++
void task_1(int **A, int M, int N) { int i=0, sum=0; //1.) сумму элементов в тех строках, которые содержат хотя бы один отрицательный...

Дано 8 действительных чисел. Вычислить сумму квадратов разностей корней из модулей действительных чисел - C++
Дано 8 действительных чисел. Вычислить сумму квадратов разностей корней из модулей действительных чисел.

Для 8-ми введенных действительных чисел вычислить сумму отрицательных чисел - C++
Используя в программе цикл while, Для 8-ми введенных действительных чисел вычислить сумму отрицательных чисел.


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

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