Форум программистов, компьютерный форум, киберфорум
C для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.86/7: Рейтинг темы: голосов - 7, средняя оценка - 4.86
0 / 0 / 0
Регистрация: 19.11.2016
Сообщений: 28
1

Программирование на С. двойной запрос ввода

19.11.2016, 22:42. Показов 1368. Ответов 17
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте!
Когда нужно ввести значение N, если ввести какую-то букву, то программа виснет. Нужно поставить ограничение на ввод исключительно чисел (что бы буквы вводить было нельзя)
Нашла в сети такой нехитрый способ и у себя на сроке 27 применил его.
проблема решилась- если ввести букву, то выползает предупреждение как и полагается, НО если вводишь число, то что бы программа сработала его нужно ввести два раза.
Раньше, (до этого способа запрета на буквы) Нужно что бы после ввода числа, нажал интер, и программа сразу отработала, а теперь приходится ввести число, нажать интер, после чего тебя перебрасывает на новую строку, потом еще раз ввести число, нажать интер и только после этого она отработает.

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
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <conio.h>
 
int main()
{
        int i = 0;
        int j = 0;
        int N = 0;
        unsigned int mass[21];
 
        printf("Vvedite znachenie massiva ot 8 do 20: ");
        scanf_s("%d",&i);
        printf("\n");
 
        if ((i < 8) || (i>20)){
                printf("Error! razmernost zadana neverno!\n");
                printf("Press any key to exit");
                _getch();
                exit(0);
        }
        printf("Vvedite chislo N: ");
        scanf_s("%d", &N);
        printf("\n");
 
        if (scanf_s("%d", &N) != 1){
                printf("Error! razmernost zadana nevernooo!\n");
                printf("Press any key to exit");
                _getch();
                exit(0);
        }
        else{
 
                for (j = 0; j <= i; j++){
                        mass[j] = rand() % N;
                }
        }
 
        for (j = 0; j <= i; j++){
                printf("mass[ %d", j);
                printf("]= %d", mass[j]);
                printf("\n");
        }
        printf("Press any key to exit");
        _getch();
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
19.11.2016, 22:42
Ответы с готовыми решениями:

Двойной запрос
Здравствуйте. Подскажите, пожалуйста как сделать запрос к &quot;самому себе&quot;. Есть таблица. В ней...

двойной запрос
есть форма которая отправлять POST запросом данные. вот так выглядит запрос mysql_query(&quot;SELECT *...

Двойной ajax запрос
Имеется аякс скрипт, к примеру это будет форма для добавления комментария. Когда мы нажимаем...

Создать двойной запрос
Нужна Ваша помощь! имеется таблица art_catalog: catalog_id &lt;---------&gt; catalog_name...

17
7792 / 6559 / 2984
Регистрация: 14.04.2014
Сообщений: 28,669
19.11.2016, 23:22 2
Ну так зачем ты 2 раза функцию вызываешь?
C++
1
2
3
4
5
6
7
        printf("Vvedite chislo N: ");
        if (scanf_s("%d", &N) != 1){
                printf("Error! razmernost zadana nevernooo!\n");
                printf("Press any key to exit");
                _getch();
                exit(0);
        }
0
53 / 43 / 22
Регистрация: 29.05.2016
Сообщений: 214
19.11.2016, 23:30 3
C
1
unsigned int mass[21];
Хм. Вот оно как.

Добавлено через 2 минуты
Как вариант можно читать значения как char и потом применить функцию atoi
https://ru.wikipedia.org/wiki/Atoi
0
0 / 0 / 0
Регистрация: 19.11.2016
Сообщений: 28
20.11.2016, 07:33  [ТС] 4
Пробовал ее полностью убрать, но проблема не решилась- все так же нужно два раза вводить переменную N
0
1786 / 1036 / 445
Регистрация: 12.05.2016
Сообщений: 2,550
20.11.2016, 09:29 5
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
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
 
int getint(const char* msg)
{
    int value = 0;
    while ( printf(msg) && scanf_s("%d",&value) != 1) {
        fprintf(stderr, "Vvedite chislo!\n");
        fflush(stdin);
    }
    return value;
}
int main(void)
{
    int i = 0;
    int j = 0;
    int N = 0;
    unsigned int mass[21];
 
    while (1) {
        i = getint("Vvedite znachenie massiva ot 8 do 20: ");
        if (i>8 && i<20) break;
        fprintf(stderr, "Error! razmernost zadana nevernooo!\n");
    }
    
    N = getint("Vvedite chislo N: ");
    for (j = 0; j <= i; j++)
        mass[j] = rand() % N;
 
 
    for (j = 0; j <= i; j++){
        printf("mass[ %d", j);
        printf("]= %d", mass[j]);
        printf("\n");
    }
    printf("Press any key to exit");
    getchar();
}
0
53 / 43 / 22
Регистрация: 29.05.2016
Сообщений: 214
20.11.2016, 10:17 6
shvyrevvg, Не работает! Введите букву и посмотрите результат.
0
1786 / 1036 / 445
Регистрация: 12.05.2016
Сообщений: 2,550
20.11.2016, 10:32 7
Цитата Сообщение от matveev1512 Посмотреть сообщение
shvyrevvg, Не работает! Введите букву и посмотрите результат.
Вы бы хоть скрин показали

Добавлено через 8 минут
MasterYoda, если хотите заморочиться( чтобы и 34fdsf обрабатывалось), то почитайте https://www.cyberforum.ru/blogs/42536/blog278.html
0
53 / 43 / 22
Регистрация: 29.05.2016
Сообщений: 214
20.11.2016, 10:40 8
функция scanf возвращает true если ввод был верный и false если была ошибка
вот вам решение этой проблемы
C
1
2
3
4
int a;
            
    while (!(scanf("%d", &a)));
    printf("%d", a);
0
7792 / 6559 / 2984
Регистрация: 14.04.2014
Сообщений: 28,669
20.11.2016, 10:51 9
matveev1512, она возвращает количество введённых полей, а не bool.
1
53 / 43 / 22
Регистрация: 29.05.2016
Сообщений: 214
20.11.2016, 10:53 10
точно ))) Спасибо! Не знал)) Тогда это моё решение не верно
0
7792 / 6559 / 2984
Регистрация: 14.04.2014
Сообщений: 28,669
20.11.2016, 11:14 11
Ну в случае одного параметра, может, и верно, только надо очищать ввод.
0
0 / 0 / 0
Регистрация: 19.11.2016
Сообщений: 28
20.11.2016, 11:41  [ТС] 12
shvyrevvg, спасибо!
Единственное, вы практически весь код переписали. Да, по функционалу она получился даже лучше, да и ошибок с текстом нет.
Но мне бы еще хотелось узнать, возможно ли в моем коде решить проблему с вводом текста? и из-за чего приходится этот косяк с двойным вводом N?
Выше советовали функцию atoi, но как-то о ней не очень хорошо отзываются.
0
53 / 43 / 22
Регистрация: 29.05.2016
Сообщений: 214
20.11.2016, 12:01 13
Проверял разные варианты. В любом случае если не Число то scanf возвращает ноль . И да нужно очистить ввод, все верно!

Добавлено через 12 минут
Попробуйте вот так
C
1
2
    
            scanf_s("%*[^\n]");
Добавлено через 1 минуту
чистка ввода
0
1786 / 1036 / 445
Регистрация: 12.05.2016
Сообщений: 2,550
20.11.2016, 12:12 14
Лучший ответ Сообщение было отмечено MasterYoda как решение

Решение

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
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <conio.h>
 
int main()
{
        int i = 0;
        int j = 0;
        int N = 0;
        unsigned int mass[21];
 
        printf("Vvedite znachenie massiva ot 8 do 20: ");
        if (scanf_s("%d",&i) != 1) {
                printf("Error! razmernost zadana nevernooo!\n");
                printf("Press any key to exit");
                _getch();
                exit(1);
        }
        printf("\n");
 
        if ((i < 8) || (i>20)){
                printf("Error! razmernost zadana neverno!\n");
                printf("Press any key to exit");
                _getch();
                exit(1);
        }
        printf("Vvedite chislo N: ");
        //scanf_s("%d", &N); //- лишняя строка
        //printf("\n"); - это тоже необязательно после Enter и так перевод строки будет
 
        if (scanf_s("%d", &N) != 1) { // Вы же тут вводите N 
                printf("Error! razmernost zadana nevernooo!\n");
                printf("Press any key to exit");
                _getch();
                exit(1);
        }
       // else{ //не нужен, т.к. в случае ошибки вы закрываете программу
 
                for (j = 0; j <= i; j++){
                        mass[j] = rand() % N;
                }
       // }
 
        for (j = 0; j <= i; j++){
                printf("mass[ %d", j);
                printf("]= %d", mass[j]);
                printf("\n");
        }
        printf("Press any key to exit");
        _getch();
}
Добавлено через 3 минуты
Цитата Сообщение от MasterYoda Посмотреть сообщение
и из-за чего приходится этот косяк с двойным вводом N?
Вы два раза scanf_s("%d", &N) вызываете перед ифом и в ифе.
Цитата Сообщение от MasterYoda Посмотреть сообщение
Выше советовали функцию atoi, но как-то о ней не очень хорошо отзываются.
Только не atoi, strtol можно.
1
0 / 0 / 0
Регистрация: 19.11.2016
Сообщений: 28
20.11.2016, 12:17  [ТС] 15
shvyrevvg, Огромное спасибо.
Я тоже как раз только что от статьи пришел, на которую вы ссылку давали. Там как раз ваш метод, который вы здесь применили, рассматривался.
0
53 / 43 / 22
Регистрация: 29.05.2016
Сообщений: 214
20.11.2016, 12:19 16
Лучший ответ Сообщение было отмечено MasterYoda как решение

Решение

Я думаю вот так будет то что вам нужно
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
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <conio.h>
 
int main()
{
    int i = 0, j = 0, N = 0, _check;
    int mass[20];
 
    printf("Vvedite znachenie massiva ot 8 do 20: ");
    do {
        _check = scanf_s("%d", &i);
        if (!_check) {
            printf("Error\n");
            scanf_s("%*[^\n]");
        }
    } while (!_check);
    printf("\n");
 
    if ((i < 8) || (i>20)) {
        printf("Error! razmernost zadana neverno!\n");
        printf("Press any key to exit");
        _getch();
        exit(0);
    }
    printf("Vvedite chislo N: ");
    do {
        _check = scanf_s("%d", &N);
        if (!_check) {
            printf("Error\n");
            scanf_s("%*[^\n]");
        }
 
    } while (!_check);
    printf("\n");
 
    for (j = 0; j < i; j++) {
            mass[j] = rand() % N;
        }
    
 
    for (j = 0; j < i; j++) {
        printf("mass[ %d", j);
        printf("]= %d", mass[j]);
        printf("\n");
    }
    printf("Press any key to exit");
    _getch();
}
1
1786 / 1036 / 445
Регистрация: 12.05.2016
Сообщений: 2,550
20.11.2016, 12:20 17
Цитата Сообщение от MasterYoda Посмотреть сообщение
Там как раз ваш метод, который вы здесь применили, рассматривался.
Ну это не мой метод, сам скомуниздил из этой статьи В статье более универсальный.
0
0 / 0 / 0
Регистрация: 19.11.2016
Сообщений: 28
20.11.2016, 12:35  [ТС] 18
matveev1512, спасибо! Это тоже отлично подходит.
0
20.11.2016, 12:35
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
20.11.2016, 12:35
Помогаю со студенческими работами здесь

Двойной запрос в mysql
Доброго времени суток. Столкнулся с проблемой. При выполнении запроса в базу данных, происходит...

Запрос с двойной сортировкой
SELECT catalog.image_catalog, catalog.chpu AS cchpu, catalog.param2 as cparam2, catalog.id AS cid,...

Двойной запрос с поиском
Есть две таблицы, нужно сделать запрос и вывести только что требуется. Первая таблица: id - 1...

Двойной запрос на поиск
Как сделать двойной запрос на поиск? SELECT * FROM TABLE WHERE Atrib1 LIKE 'Na_meste' or Atrib2...


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

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru