Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 30.04.2012, 23:58   #21
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

Может быть. Я все равно не рискнул бы использовать и эту функцию, предпочитая ей iostream-овские фишки.
Или посимвольная считка и анализ над каждым символом.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 01.05.2012, 00:10   #22
ERAGORN
Пользователь
 
Аватар для ERAGORN
 
Регистрация: 02.01.2012
Сообщений: 46
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Может быть. Я все равно не рискнул бы использовать и эту функцию, предпочитая ей iostream-овские фишки.
Или посимвольная считка и анализ над каждым символом.
Согласен__.
ERAGORN вне форума Ответить с цитированием
Старый 01.05.2012, 11:53   #23
Землянин
Пользователь
 
Регистрация: 29.04.2012
Сообщений: 30
По умолчанию

ERAGORN, сама программа составлена как нельзя лучше, но из-за того маленького недочета она слетает на втором прогоне. Я понял почему проверка на ошибку работает только в первый раз, потом , в случае любого неверного ввода программа зацикливается и что бы вы не вводили выдает "Nepravilno eshe raz". Так и будет, ведь функция proverka вызывается лишь раз, после чего цикл while зависает. Я попробовал внести следующие маленькие изменения в цикле while:
Код:
#include <stdlib.h>
#include <ctype.h> 
#include <string.h>
#include <stdio.h>
#include <conio.h>

int proverka( const char *s)
{
    if ( !s ) return 0;
    if ( *s == '.' ) return 0;
    for (; (*s != '\0') && (*s != '.'); ++s) 
       if ( !isdigit(*s) ) return 0;
       if ( *s == '.' ) ++s;
    for (; *s != '\0'; ++s )
       if ( !isdigit(*s) ) return 0;
    return 1;
}
int main()
{
    const int SIZE = 10;
    char str[SIZE];
    int len;
    float number;
    clrscr();
    printf("Enter:");
    fgets(str, SIZE, stdin);
    len = strlen(str);
    if (str[len -1] == '\n' ) str[len - 1] = '\0';

    while (1)
    {
	if (proverka(str)==0) printf("Nepravilno ische raz: "); else break;
	fgets(str, SIZE, stdin);
    }

    number = atof(str);
    printf("\"%s\" = %f\n", str, number );
    system("PAUSE");
    return 0;
}
Но это не исправило проблему. Все работает также. Следовательно ошибка не в том, что цикл проверяет выполнение функции proverka на истинность, а в чем-то другом. Почему же он лишь в самый первый раз позволяет выйти из цикла... Быть может эту функцию переделать в процедуру (хотя в си нет процедур, я имею в виду функцию типа void, которую можно так объявить) и каждый раз в цикле проверять её на истинность?
Землянин вне форума Ответить с цитированием
Старый 01.05.2012, 15:59   #24
ERAGORN
Пользователь
 
Аватар для ERAGORN
 
Регистрация: 02.01.2012
Сообщений: 46
По умолчанию

Блин забыл в цикле повторить:
len = strlen(str);
if ( str[len -1] == '\n' ) str[len - 1] = '\0';
Код удаляет символ '\n' (перевод каретки на новую строку, появляется после нажатия Enter) из строки, если он там есть. А он будет, если не заполнить полностью массив.

Чтобы не повторятся попробуй заменить на такой цикл:
Код:
do{
    printf("Enter: ");

    fgets(str, SIZE, stdin);
    len = strlen(str);
    if ( str[len -1] == '\n' ) str[len - 1] = '\0';
}while(!proverka(str));
ERAGORN вне форума Ответить с цитированием
Старый 01.05.2012, 17:05   #25
Землянин
Пользователь
 
Регистрация: 29.04.2012
Сообщений: 30
Хорошо

Отлично, прекрасно. Великолепная работа. Если у кого-то возникнет подобный вопрос, оставлю твою программу в итоговом варианте здесь. Всем спасибо за отданное время. Надеюсь еще обсудим что-либо интересное. Доброго времени суток, господа!

Язык Си. Программа защиты от неправильного ввода:
Код:
#include <stdlib.h>
#include <ctype.h> 
#include <string.h>
#include <stdio.h>
#include <conio.h>

int proverka( const char *s)
{
    if ( !s ) return 0;
    if ( *s == '.' ) return 0;
    for (; (*s != '\0') && (*s != '.'); ++s) 
       if ( !isdigit(*s) ) return 0;
       if ( *s == '.' ) ++s;
    for (; *s != '\0'; ++s )
       if ( !isdigit(*s) ) return 0;
    return 1;
}
int main()
{
    const int SIZE = 10;
    char str[SIZE];
    int len;
    float number;
    clrscr();

    do
       {
        printf("Enter: ");
        fgets(str, SIZE, stdin);
        len = strlen(str);
        if (str[len-1] == '\n' ) str[len-1] = '\0';
        }
    while(!proverka(str));

    number = atof(str);
    printf("\"%s\" = %f\n", str, number );
    system("PAUSE");
    return 0;
}
Землянин вне форума Ответить с цитированием
Старый 03.05.2012, 21:12   #26
Землянин
Пользователь
 
Регистрация: 29.04.2012
Сообщений: 30
По умолчанию

Я не сразу заметил, что отрицательные числа данным кодом не воспринимаются. Небольшая, легко устранимая ошибка. Кому интересна будет данная программа, ввести в начале функции "proverka":

Код:
if ( *s == '-' ) ++s;
Землянин вне форума Ответить с цитированием
Старый 16.05.2012, 13:20   #27
Землянин
Пользователь
 
Регистрация: 29.04.2012
Сообщений: 30
По умолчанию

Кстати, вот такая проблемка, которую я не могу устранить. Но думаю, что она не большая. ERAGORN, код не позволяет присваивать 0, как число. Не удается ввести, блокирует как ошибку. Как это исправить, не подскажешь? Заранее спасибо.
Землянин вне форума Ответить с цитированием
Старый 18.05.2012, 15:20   #28
Землянин
Пользователь
 
Регистрация: 29.04.2012
Сообщений: 30
Восклицание

Ребята, помогите до конца решить вопрос, если возможно.
Землянин вне форума Ответить с цитированием
Старый 21.05.2012, 18:22   #29
Землянин
Пользователь
 
Регистрация: 29.04.2012
Сообщений: 30
По умолчанию

ERAGORN, у меня не получается исправить ошибку. Функция proverka( const char *s) не позволяет ввести просто 0. Прошу помощи.
Землянин вне форума Ответить с цитированием
Старый 22.05.2012, 13:00   #30
Землянин
Пользователь
 
Регистрация: 29.04.2012
Сообщений: 30
По умолчанию

Все, разобрался, но все-равно спасибо.
Землянин вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Защита от неправильного ввода Obey177 Общие вопросы Delphi 11 19.03.2012 15:57
Запрет нажатия кнопки и запрет неправильного ввода данных De_Kurlzz Помощь студентам 1 15.06.2011 15:14
onKeyPress. Защита от неправильного ввода. Антон Лысенко Помощь студентам 5 23.02.2011 17:20
Защита от неправильного ввода Christina_2010 PHP 2 09.06.2010 13:28
Защита от кривого ввода на С++ survavior Помощь студентам 4 13.04.2010 17:56