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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 01.11.2011, 15:16   #1
torren108
Пользователь
 
Регистрация: 28.09.2011
Сообщений: 17
По умолчанию Замена goto.

Первый раз в первый класс.
Итак, пишу первую программу. Ситуация:

Код:
S:	printf("Введите длинну массива:\n");
	scanf("%d", &l);
	
		if (l <= 0)
		{
                        printf("Неверная длинна!\n");
			goto S;
                }
Начиналось все, разумеется, с void main(), все переменные - интовые.
Собственно, проблема: конструкция goto, как мне объяснили, крайне непрактична, и при сдаче заданий в плюс мне ее использование не пойдет. Объясните, как можно реализовать возврат на несколько позиций вперед? (Желательно на примере данного фрагмента).
torren108 вне форума Ответить с цитированием
Старый 01.11.2011, 15:22   #2
_Alerter_
Пользователь
 
Регистрация: 25.05.2011
Сообщений: 89
По умолчанию

Это делается с помощью циклов. В данном случае больше подходит do while:
Код:
do
{
    printf("Введите длинну массива:\n");
    scanf("%d", &l);
} while (l <= 0);
_Alerter_ вне форума Ответить с цитированием
Старый 01.11.2011, 15:24   #3
Sweta
Форумчанин
 
Регистрация: 22.11.2007
Сообщений: 664
По умолчанию

Код:
l=0;
while(l <= 0)
{
	printf("Введите длинну массива:\n");
	scanf("%d", &l);
		if (l <= 0)
	              printf("Неверная длинна!\n");
                }
Неприятности приходят и уходят, а жизнь продолжается!
Sweta вне форума Ответить с цитированием
Старый 01.11.2011, 15:30   #4
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

"Возврат вперёд" - это типа как "назад в будущее"?
Конструкция "делать, пока не станет хорошо":
Код:
do{
    /*Что там надо сделать*/
}while(/*условие того, что нас результат не устраивает*/);
В данном случае мы ещё хотим вывести сообщение, поэтому:
Код:
do{
    printf("Введите длину массива:\n");
    //scanf возвращает число прочитанных переменных
    //Если ввели вообще не число, а чепуху, нам вернут ноль
    if(scanf("%d", &l) != 1){
        printf("Эй, длина - это число!\n");
        //Повторить
        continue;
    }
    //Если имели наглость ввести отрицательное число или ноль
    if(l <= 0){
        printf("Неверная длина!\n");
        //Повторить
        continue;
    }
//Последнего continue можно было и не писать
//Условие того, что мы уходим на новый круг
}while(l <= 0);
//Всё, раз мы добрались досюда, то l>0
Abstraction вне форума Ответить с цитированием
Старый 01.11.2011, 16:23   #5
torren108
Пользователь
 
Регистрация: 28.09.2011
Сообщений: 17
По умолчанию

Цитата:
Сообщение от Abstraction;906302
[CODE
do{
printf("Введите длину массива:\n");
//scanf возвращает число прочитанных переменных
//Если ввели вообще не число, а чепуху, нам вернут ноль
if(scanf("%d", &l) != 1){
printf("Эй, длина - это число!\n");
//Повторить
continue;
}
//Если имели наглость ввести отрицательное число или ноль
if(l <= 0){
printf("Неверная длина!\n");
//Повторить
continue;
}
//Последнего continue можно было и не писать
//Условие того, что мы уходим на новый круг
}while(l <= 0);
//Всё, раз мы добрались досюда, то l>0
[/CODE]
попробовал, все почти отлично, но при вводе символа или дробного значение - программа зацикливается, постоянное "неверная длинна!". что подправить нужно?

Последний раз редактировалось torren108; 01.11.2011 в 17:01.
torren108 вне форума Ответить с цитированием
Старый 01.11.2011, 17:27   #6
_Alerter_
Пользователь
 
Регистрация: 25.05.2011
Сообщений: 89
По умолчанию

Цитата:
Сообщение от torren108 Посмотреть сообщение
попробовал, все почти отлично, но при вводе символа или дробного значение - программа зацикливается, постоянное "неверная длинна!". что подправить нужно?
Нужно очистить буфер ввода функцией fflush(stdin), т.к. scanf() будет считывать только числа, а остальное пропускать.
_Alerter_ вне форума Ответить с цитированием
Старый 01.11.2011, 17:55   #7
An1ka
C++,DirectX/OpenGL
Форумчанин
 
Регистрация: 09.01.2011
Сообщений: 422
По умолчанию

Цитата:
Сообщение от torren108 Посмотреть сообщение
Первый раз в первый класс.
Итак, пишу первую программу. Ситуация:
Код:
S:	printf("Введите длинну массива:\n");
	scanf("%d", &l);
	
		if (l <= 0)
		{
                        printf("Неверная длинна!\n");
			goto S;
                }
С очисткой буфера будет так:
Код:
    while ( fflush(stdin), printf("Введите длину массива:\n"), scanf("%d", &l), l <= 0) 
       printf("Неверная длина!\n");
An1ka вне форума Ответить с цитированием
Старый 01.11.2011, 18:01   #8
torren108
Пользователь
 
Регистрация: 28.09.2011
Сообщений: 17
По умолчанию

Все, программа готова. Всем большое спасибо Можно закрывать.
torren108 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ошибка GoTo valerij Microsoft Office Excel 3 16.07.2011 17:15
Goto Avvakymova Паскаль, Turbo Pascal, PascalABC.NET 4 09.05.2011 16:25
goto Serg12 Помощь студентам 12 14.06.2010 17:31
goto gagen Общие вопросы C/C++ 18 05.04.2010 13:24
GoTo Diego__ Microsoft Office Word 3 13.03.2010 19:55