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

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

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 04.04.2010, 21:54   #1
gagen
Новичок
Джуниор
 
Регистрация: 04.03.2010
Сообщений: 2
По умолчанию goto

Имеется программа на определение областей . Немного вот не соображу , куда здесь нужно вставить команду подобного типа goto VvediR , то-есть у меня в данном случае вводится радиус , потом за ним далее координаты x и y , и мне нужно чтобы после завершение сеанса програмы (Ctrl+Z) программа не прерывалась , а сново запрашивала радиус . И только при двойном завершение сеанса подряд завершалась . Я новичок в этой области , надеюсь здесь ответ получу .
Код:
#include<stdio.h>
main()
{
double x,y,R;
printf("Input radius R: ");
if(scanf("%lg",&R)==EOF)
{return 0;}
else
{
while(1)
{
printf("Input x and y coordinate: ");
if(scanf("%lg%lg",&x,&y)==EOF){return 0;}
else
{if((((x<=0) && (x>=-R)) && ((y>=0)&&(y<=(x+R)))) || (((x>0)&&(x<=R)) && ((y>=(x-R))&&(y*y<=(R*R-x*x)))))
{printf("Tochka popala!\n");}
else
{printf("Tochka ne popala!\n");}
}
}
}
}

Последний раз редактировалось MaTBeu; 04.04.2010 в 23:16.
gagen вне форума Ответить с цитированием
Старый 04.04.2010, 22:30   #2
Гром
Старожил
 
Аватар для Гром
 
Регистрация: 21.03.2009
Сообщений: 2,193
По умолчанию

Вообще-то goto - это зло, и об этом очень часто говорят. Так что если у вас есть возможность отказаться от него в пользу другого языкового средства, то это настоятельно рекомендуется сделать. Ну а если уж вас заставляют непременно его использовать, то зря то (если я вас правильно понял) сделайте счетчик количества раз, когда был введен радиус, инициализируйте его нулем и после ввода радиуса увеличьте его на единицу, а если после очередного ввода он равен единице (или другому нужному числу), то переходите к метке, поставленной прямо перед запросом на ввод.
А вообще-то то же самое можно сделать с помощью цикла:
Код:
#include<stdio.h>
main()
{
double x,y,R;
int i = 0;
while (i < 1)
{
printf("Input radius R: ");
if(scanf("%lg",&R)==EOF)
 i++;
else
 {
  printf("Input x and y coordinate: ");
  if(scanf("%lg%lg",&x,&y)==EOF)
   return 0;
  else
   {
   if(x * x + y * y <= R * R)
    printf("Tochka popala!\n");
   else
    printf("Tochka ne popala!\n");
   }
  }
}
}
С goto не написал по идеологическим соображениям, но, надеюсь, суть уясните)
Да, и не забывайте про тег CODE!
Простые и красивые программы - коды программ + учебник C++
Создание игры - взгляд изнутри - сайт проекта
Тема на форуме, посвященная ему же
Гром вне форума Ответить с цитированием
Старый 04.04.2010, 22:45   #3
pproger
C++ hater
СтарожилДжуниор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,333
По умолчанию

2Гром
ну про goto ты не прав.... есть моменты, где его использовать крайне удобно. например что то типо..
Код:
void foo(int n)
{
	int *pi = new int[50];

	switch (n) {
	case 1:
		cout << "some message" << endl;
		goto END_FOO;
		break;
	case 2:
		cout << "some message1" << endl;
		cout << "some message2" << endl;
		goto END_FOO;
		break;
	case 3:
		goto END_FOO;
		break;
	}

    /* some another code here */

END_FOO:
	cout << "blalba1" << endl;
	cout << "blalba2" << endl;
	cout << "blalba3" << endl;
	delete [] pi;
}
можно конечно сделать функцию с общим кодом, можно просто накопировать этот код во все места, где нужно, но имхо, тут с goto смотрится очень понятно и естественно. поправьте, если кто так не считает
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay

My other car is cdr.

Q: Whats the object-oriented way to become wealthy?
A: Inheritance

Последний раз редактировалось pproger; 04.04.2010 в 22:54.
pproger вне форума Ответить с цитированием
Старый 04.04.2010, 22:52   #4
ROD
Linux C++ Qt ARM
Старожил
 
Аватар для ROD
 
Регистрация: 30.11.2008
Сообщений: 3,030
По умолчанию

Цитата:
есть моменты, где его использовать крайне удобно. например что то типо..
Что-то я не понял, зачем так делать?

Так и так после break; мы выйдем из switch`а. и окажемся в END_FOO:
Дилетант широкого профиля.

"Слова ничего не стоят - покажите мне код!" © Линус Торвальдс
ROD вне форума Ответить с цитированием
Старый 04.04.2010, 22:53   #5
pproger
C++ hater
СтарожилДжуниор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,333
По умолчанию

2ROD
ну я надумал просто этот код, представь, что после switch еще куча кода, а выйти надо именно тут
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay

My other car is cdr.

Q: Whats the object-oriented way to become wealthy?
A: Inheritance
pproger вне форума Ответить с цитированием
Старый 04.04.2010, 23:05   #6
Гром
Старожил
 
Аватар для Гром
 
Регистрация: 21.03.2009
Сообщений: 2,193
По умолчанию

pproger, согласен, в некоторых случаях goto можно использовать эффективнее других обычных средств, например, для выхода из вложенных циклов. (Впрочем, и тут можно извратиться, но по-другому - сгенерировать исключение и перехватить ниже этих циклов).
Но в любом случае метка должна располагаться ниже goto, иначе может такая путаница начаться...
Словом, тут есть всякие нюансы, но в целом goto лучше не пользоваться и лучше, чтобы новички сначала усвоили это, и только в случае необходимости приходили к тому, что вот в такой ситуации его можно и использовать)
Простые и красивые программы - коды программ + учебник C++
Создание игры - взгляд изнутри - сайт проекта
Тема на форуме, посвященная ему же
Гром вне форума Ответить с цитированием
Старый 04.04.2010, 23:10   #7
pproger
C++ hater
СтарожилДжуниор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,333
По умолчанию

2Гром
ну я считаю, если оператор goto в функции один, метки располагаются ниже, это логично, то почему бы и нет. я им не пользуюсь только из за сложившихся стереотипов. хотя те же самые setjump/longjump тоже функции (не, не операторы) безусловного перехода, делают фактически то же самое (даже больше), вот тока скачут они по стеку, и что то никто не жалуется

пс. код (примерный, по памяти писал) из книги "Совершенный код", Стив Макконнелл
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay

My other car is cdr.

Q: Whats the object-oriented way to become wealthy?
A: Inheritance

Последний раз редактировалось pproger; 04.04.2010 в 23:13.
pproger вне форума Ответить с цитированием
Старый 04.04.2010, 23:23   #8
MaTBeu
Eclipse Foundation
Старожил
 
Аватар для MaTBeu
 
Регистрация: 19.09.2007
Сообщений: 2,604
По умолчанию

Код:
void foo(int n)
{
	int *pi = new int[50];

	switch (n) {
	case 1:
		cout << "some message" << endl;
		goto END_FOO;
		break;
	case 2:
		cout << "some message1" << endl;
		cout << "some message2" << endl;
		goto END_FOO;
		break;
	case 3:
		goto END_FOO;
		break;
	}

    /* some another code here */

END_FOO:
	cout << "blalba1" << endl;
	cout << "blalba2" << endl;
	cout << "blalba3" << endl;
	delete [] pi;
}
Не вижу смысла. Зачем вставлять после свитча недосягаемый код? И еще - функцию лучше перестроить согласно задаче. С++ очень избыточный язык - любую задачу можно реализовать без goto.
MaTBeu вне форума Ответить с цитированием
Старый 04.04.2010, 23:32   #9
pproger
C++ hater
СтарожилДжуниор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,333
По умолчанию

2MaTBeu
с чего ты взял что он недосягаем? при параметре n > 3?
еще раз говорю, я привел это в качестве примера. да, можно переписать, я это уже сказал, но в ДАННОМ КОНКРЕТНОМ случае goto тут действительно к месту. не согласен? приведи пример более удобочитаемого кода. если задание не ясно, объясню еще раз.
в функции есть несколько точек завершения. перед каждой этой точкой необходимо выполнить какой либо код, который будет освобождать память, выводить какое либо сообщение и тп.

пс. не надо только приводить пример с дополнительной фунцией помощником. это и так всем ясно, но это не всегда удобно
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay

My other car is cdr.

Q: Whats the object-oriented way to become wealthy?
A: Inheritance
pproger вне форума Ответить с цитированием
Старый 05.04.2010, 00:04   #10
Vago
Форумчанин
 
Регистрация: 15.01.2010
Сообщений: 948
По умолчанию

Цитата:
Сообщение от pproger Посмотреть сообщение
при параметре n > 3?
Код:
void foo(int n) {

    int *pi = new int[50];

    switch (n) {
        case 1:
            cout << "some message" << endl;
//d        goto END_FOO;
            break;
        case 2:
            cout << "some message1" << endl;
            cout << "some message2" << endl;
//d        goto END_FOO;
            break;
        case 3:
//d        goto END_FOO;
            break;
        default:
    /* some another code here */
        break;
    }  
//d END_FOO:
    cout << "blalba1" << endl;
    cout << "blalba2" << endl;
    cout << "blalba3" << endl;
    delete [] pi;

}
Vago вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Assembler'ные вставки и goto coNsept C++ Builder 22 21.06.2010 15:22
goto Serg12 Помощь студентам 12 14.06.2010 17:31
GoTo Diego__ Microsoft Office Word 3 13.03.2010 19:55
чем заменить goto? Agronom Общие вопросы C/C++ 3 19.12.2009 19:43
php goto TDrive PHP 10 28.07.2009 00:04