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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 30.04.2012, 15:55   #11
Землянин
Пользователь
 
Регистрация: 29.04.2012
Сообщений: 30
По умолчанию

Все же не получается и с последним кодом. Программа пропускает уже вторую точку или же не замечает ввод букв, завершаясь успешно и пытаясь перевести буквы в тип float. Опишу с комментариями опять что происходит в моей программе (по идее):

Код:
char m[10]; //массив-строка, которая будет содержать число.
int pp,i,k;
float x;
do
	  {
		printf("\n\nVvedite chislo ");
		scanf("%s",&m); // считываем строку в целом.

		k=0;
		for(i=0;i<10;i++) //проверка строки на наличие мусора
		{      
                if (m[0]==46) {k=-1; break;} //Если первый символ числа  "." (т.е. ошибка) остановить проверку 
			if (m[i+1]==46) k++;//если нет, то проверять далее на наличие точек
		}
		for(i=0;i<10;i++)
		{
			if ((k<2) && (k!=-1) && m[i]>45 && m[i]<58 && (m[i]!=47)) {x=m; pp=1;} else pp=0; //если в массиве количество точек
//не более одной, а если есть, то лишь со второй позиции, а также если в массиве только числа от 0 до 9 без "/", ТО все верно и pp=1. 
		}
		if (pp==1) {x=m; printf("\n\n\nSimvoli vvedeni pravilno. Eto %f",x);//если pp=1, то завершить программу успешно, выполнив неявное
//преобразование строки-массива в действительное число.
		else printf("\n\n Oshibka, vvedite zanovo");// запустить do..while вновь в случае ошибки.
	  } while(pp!=1);
При проверке на работоспособность, программа замечательно защищает от любого, даже правильного ввода. Помогите, ребята.

Последний раз редактировалось Stilet; 30.04.2012 в 21:28.
Землянин вне форума Ответить с цитированием
Старый 30.04.2012, 16:24   #12
ERAGORN
Пользователь
 
Аватар для ERAGORN
 
Регистрация: 02.01.2012
Сообщений: 46
По умолчанию

опешите просто на словах, что вам нужно(по конкретней)
Неявно не переводится строка в число.

Код выше переписал.

Последний раз редактировалось ERAGORN; 30.04.2012 в 17:03.
ERAGORN вне форума Ответить с цитированием
Старый 30.04.2012, 17:00   #13
Землянин
Пользователь
 
Регистрация: 29.04.2012
Сообщений: 30
По умолчанию

Необходимо написать программу, где при вводе вещественного числа х, процесс защищается от некорректного ввода. Например допускается вводить числа типа "5" или "5.2354" и нельзя вводить нечто вроде "5w", "5.ц2354", ".212" и т.д. В последнем случае программа должна выдавать нечто вроде "Повторите ввод" и запускаться заново. Был бы очень признателен)

Цитата:
Сообщение от ERAGORN Посмотреть сообщение
опешите просто на словах, что вам нужно(по конкретней)
Неявно не переводится строка в число.

Код выше переписал.
Спасибо, все отлично работает, вот только один нюанс: ввод не кончается пока не будет достигнута вся длина строки SIZE. А если к примеру нужно ввести только 12.5; Как это исправить? И можно ли?

Не сможете объяснить вкратце логику вашего кода?

Последний раз редактировалось Stilet; 30.04.2012 в 21:30.
Землянин вне форума Ответить с цитированием
Старый 30.04.2012, 18:05   #14
ERAGORN
Пользователь
 
Аватар для ERAGORN
 
Регистрация: 02.01.2012
Сообщений: 46
По умолчанию

Код:

//  переписал
#include<stdio.h>
#include<stdlib.h>
#include <conio.h> // getch()
#include <ctype.h> // isdigit()


int main( void ){
    const int SIZE = 10;
    char str[SIZE];
    char ch;
    float number;
    int i;

    for ( i = 0; i < SIZE - 1 && (ch = getch()) != '\n' && ch != '.'; )
        if ( isdigit(ch){
            str[i++] = ch;
            putchar(ch);
        }
    if ( ch == '.' ){
        str[i++] = ch;
        putchar(ch);
    }

    if ( ch != '\n' )
        for (; i < SIZE - 1; )
            if ( isdigit(ch = getch()) ){
                str[i++] = ch;
                putchar(ch);
            }
    str[i] = '\0';

    number = atof(str);

    printf("\"%s\" = %f\n", str, number );

    system("PAUSE");

    return 0;
}



// или так
#include<stdio.h>
#include<stdlib.h>
#include <ctype.h> // isdigit()

int proverka( const char *);

int main( void ){
    const int SIZE = 10;
    char str[SIZE];
    char ch;
    float number;

    printf("Enter:");
    fgets(str, SIZE, stdin);

    while ( !proverka(str) ){
        printf("Nepravilno ische raz: ");
        fgets(str, SIZE, stdin );
    }

    number = atof(str);

    printf("\"%s\" = %f\n", str, number );

    system("PAUSE");

    return 0;
}

int proverka( const char *s ){
    if ( !s ) return 0;
    if ( *s == '.' ) return 0;

    for (; *s && *s != '.'; ++s )
        if ( !isdigit(*s) ) return 0;

    if ( *s == '.' ) ++s;

    for (; *s; ++s )
        if ( !isdigit(*s) ) return 0;

    return 1;
}
ERAGORN вне форума Ответить с цитированием
Старый 30.04.2012, 18:26   #15
Землянин
Пользователь
 
Регистрация: 29.04.2012
Сообщений: 30
По умолчанию

Я дико извиняюсь, но последний код не позволяет ничего вводить((( Я поменял в функции "проверка" !isdigit(*s) на isdigit(*s), заработало, но начинает пропускать ошибочный ввод вроде we223.23, присваивая переменной number значение 0.

ERAGORN, если у вас будет время, буду признателен, если код будет доработан. Что-то сам я заплутал.

Я бы с удовольствием ответил взаимностью, но моя область - математический анализ, общая физика и теория цепей (первый курс). Если необходимо разобрать пример в одном из этих направлений, буду рад помочь чем смогу.
Код:
(P.S. Конечно же, если администраторы не будут особо против что на форуме программистов обсуждают вопросы иных областей)

Последний раз редактировалось Stilet; 30.04.2012 в 21:33.
Землянин вне форума Ответить с цитированием
Старый 30.04.2012, 21:15   #16
ERAGORN
Пользователь
 
Аватар для ERAGORN
 
Регистрация: 02.01.2012
Сообщений: 46
По умолчанию

дело в том, что нет возможности проверить код который пишу - нет компьютера, пишу с смартфона.

Код:
#include<stdlib.h>
#include <ctype.h> // isdigit()
#include <string.h>

int proverka( const char *);

int main( void ){
    const int SIZE = 10;
    char str[SIZE];
    int len;
    float number;

    printf("Enter:");
    fgets(str, SIZE, stdin);

    len = strlen(str);
    if ( str[len -1] == '\n' ) str[len - 1] = '\0';

    while ( !proverka(str) ){
        printf("Nepravilno ische raz: ");
        fgets(str, SIZE, stdin );
    }

    number = atof(str);

    printf("\"%s\" = %f\n", str, number );

    system("PAUSE");

    return 0;
}

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;
}

Последний раз редактировалось ERAGORN; 30.04.2012 в 22:05.
ERAGORN вне форума Ответить с цитированием
Старый 30.04.2012, 21:37   #17
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
fgets(str, SIZE, stdin);
Ругнется на несовместимость. Может стоит scanf() использовать?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 30.04.2012, 21:58   #18
ERAGORN
Пользователь
 
Аватар для ERAGORN
 
Регистрация: 02.01.2012
Сообщений: 46
По умолчанию

Но scanf неконтролирует выход за пределы массива. Если пользователь захочит ввести 20 символов, а у нас размер 10(тоже самое относится к gets).
А в fgets желательное количество символов указывается вторым аргументом(фактически n - 1). Тоесть ввод будет правильный в отношении количества символов.

Изменил код выше(поменял тип массива и тип параметра функции с int на char)

Последний раз редактировалось ERAGORN; 30.04.2012 в 22:10.
ERAGORN вне форума Ответить с цитированием
Старый 30.04.2012, 23:00   #19
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
А в fgets желательное количество символов указывается вторым аргументом
А если ввод будет больше? Есть ведь риск на переполнение буфера. Думаю что не ошибусь, если скажу что fgets() одна из опаснейших и нерекомендуемых функций, допускающих переполение стека. или ошибаюсь?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 30.04.2012, 23:32   #20
ERAGORN
Пользователь
 
Аватар для ERAGORN
 
Регистрация: 02.01.2012
Сообщений: 46
По умолчанию

Вы наверное перепутали fgets с gets.
http://uk.m.wikipedia.org/wiki/Fgets
ERAGORN вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 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