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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 04.11.2010, 16:11   #1
guz
Пользователь
 
Регистрация: 29.10.2010
Сообщений: 29
По умолчанию Является ли С без goto тьюринг-полным?

Дано:
1) Основываясь на Википедии тьюринг-полный язык программирования (такого термина вообще-то нет, есть "исполнитель (множество вычисляющих элементов)", но это видимо одно и то же) этот тот, на котором можно запрограммировать любую вычислимую функцию. Как ни старался, не осилил понятие вычислимости. (Может кто объяснит?)
2) Все тру отцы программисты утверждают, что goto - это плохо.
3) Меж тем наличествует море алгоритмов, которые нельзя запрогать без goto, не изменив сам алгоритм (без дополнительных флагов и пр.).

Вопрос 1: Существует ли такой алгоритм с goto, который нельзя преобразовать в эквивалентный без goto (путём добавления флагов и пр.)?

Вопрос 2: В чём различие между сабжем и первым вопросом?

Последний раз редактировалось guz; 04.11.2010 в 16:20.
guz вне форума Ответить с цитированием
Старый 04.11.2010, 16:36   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
море алгоритмов
Алгоритмы в студию.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 04.11.2010, 16:52   #3
guz
Пользователь
 
Регистрация: 29.10.2010
Сообщений: 29
По умолчанию

Может я не уместно употребил слово "алгоритм", я имел в виду что-то вроде алгоритмичской конструкции на С с одним входом и одним выходом.
Лучше было бы конечно нарисовать, но что-то лень, напишу скелеты кода:

Например такая "бабочка":

Код:
if(){

	while(){

		if() goto label2;
		label1:	

	}

}else{

	while(){

		if() goto label1;
		label2:
	
	}

}
Или такая "ерунда":

Код:
if(){
	if(){
		
	}else{	
		
		label:
		
	}
}else{
	goto label;
}

Последний раз редактировалось guz; 04.11.2010 в 16:55.
guz вне форума Ответить с цитированием
Старый 04.11.2010, 16:59   #4
guz
Пользователь
 
Регистрация: 29.10.2010
Сообщений: 29
По умолчанию

Знаете, в процессе обсуждения пришел к выводу, что перепутал понятия алгоритм с реализацией алогритма, когда говорил про море. Прошу прощения.

Тем не менее, даже если полностью вычеркнуть "Дано", ответы на вопросы 1 и 2 остаются.
guz вне форума Ответить с цитированием
Старый 04.11.2010, 17:30   #5
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Например такая "бабочка":
Такая бабочка в принципе "невозможна", ибо это верный крах системы.
Так что goto тут ни при чем.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 04.11.2010, 18:15   #6
guz
Пользователь
 
Регистрация: 29.10.2010
Сообщений: 29
По умолчанию

Ой, да что Вы говорите!

Два потока, читаем, обрабатываем, пишем, переключаемся между потоками по команде, которую получаем из потока, и после переключения должны отправить приглашение в тот поток, на который переключились. Как это сделать без переменной-идентификатора потока и флага отправки приглашения?
Я, конечно, понимаю, что проблема надуманная, но дело ведь не в "бабочке".
И за море я извинился.
А вопрос-то остался открытым.

ЗЫ: Да, а что по поводу второго примера?
guz вне форума Ответить с цитированием
Старый 04.11.2010, 19:27   #7
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Два потока
Где? Последовательное переключение между блоками программы уже потоками называться стало?
С таким же успехом можно написать понадежнее
Код:
void first(){	printf("1");}
void second(){	printf("2");}

int _tmain(int argc, _TCHAR* argv[])
{
	while(true){first();second();}

	return 0;
}
И коду меньше, и блоки четко фиксированны в функции.
Но это не два разных потока, тут параллельными вычислениями и не пахнет.
Проблема действительно надуманная.
Цитата:
а что по поводу второго примера?
Этого который:
Цитата:
Или такая "ерунда":
Запусти его. Он выполнится только один раз.
IF() тут точно не помошник. с while() тебе повезло.
Цитата:
Все тру отцы программисты утверждают, что goto - это плохо.
Ерунда. JMP в Ассемблере никогда не отменят.

По сабжу ИМХО понятие "вычислимости" предполагает любые действия процессора, ибо при любых действиях в нем происходят вычисления.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 04.11.2010, 22:21   #8
Enchance
Пользователь
 
Регистрация: 20.10.2009
Сообщений: 23
По умолчанию

Цитата:
Код:
if(){
	if(){
		
	}else{	
		
		label:
		
	}
}else{
	goto label;
}
А зачем кому-то может понадобиться телепортироваться внутрь if-ов?! Какая реальная потребность может заставить пойти на это? Имхо, здесь через функции можно такое реализовать.
Лично я слышал, что доказано, язык С - тьюринг-полный и без goto (пруф не просите, я давно это читал и пруфа у меня нету). Goto плох считается потому, что очень трудно читать код, в котором слижком много переходов, но иногда использование оператора безусловного перехода позволяет увеличить быстродействие программы, и сократить время написания программы.

Кстати, а как реализовать такое без goto?
Код:
main:
cin >> i;
if (i==1) { [instruction1]; goto main;}
if (i==2) { [instruction2]; goto main;}
if (i==3) { [instruction3]; goto main;}
if (i==4) { [instruction4]; goto main;}

if (i==N) { [instructionN]; goto quit;}
quit:
Enchance вне форума Ответить с цитированием
Старый 04.11.2010, 23:37   #9
Гром
Старожил
 
Аватар для Гром
 
Регистрация: 21.03.2009
Сообщений: 2,193
По умолчанию

Цитата:
Кстати, а как реализовать такое без goto?
Код:
bool quit = false;
while (!quit)
 {
 cin >> i;
 if (i==1) { [instruction1];}
 if (i==2) { [instruction2];}
 if (i==3) { [instruction3];}
 if (i==4) { [instruction4];} 
 }
Допустим, что внутри [] может меняться i и потому обойдемся без else и switch.
Простые и красивые программы - коды программ + учебник C++
Создание игры - взгляд изнутри - сайт проекта
Тема на форуме, посвященная ему же
Гром вне форума Ответить с цитированием
Старый 05.11.2010, 04:37   #10
Morkonwen
Пользователь
 
Регистрация: 27.06.2010
Сообщений: 44
По умолчанию

Или такая "ерунда":

Код:
if(усл1){
	if(усл2){
		блок1
	}else{	
		 блок2
		label:
                      блок3
		
	}
}else{
            блок4
	goto label;
            здесь пусто, т.к. после goto
}
[/QUOTE]

можно переписать и без go to

мне мой вариант кажется понятнее=)

Код:
if(улс1&&улс2)
{
   блок1
} else 
{
      if (!(усл1))

     {
		 блок4
     } else 
    {
                      блок2
    }

блок3
}
Morkonwen вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
тьюринг в delphi gulsana-89@mail.ru Помощь студентам 0 16.09.2010 14:12
Связь двух книг с полным форматированием tns-ka Microsoft Office Excel 7 14.05.2010 07:01
помогите решить задачи на паскале, если можно с полным решением вадимкО Помощь студентам 4 13.12.2009 13:04
Поиск с полным совподением. Rom1k06 Microsoft Office Excel 2 13.10.2009 10:27
экспорт отчетов аксесс в эксель с полным форматированием kate158 Помощь студентам 1 11.03.2009 17:52