tishkir ТС
|
 |
« : 27 Января 2005, 08:42:40 » |
|
Давно, ещё в школе, я столкнулся с одной задачей. Решить не смог, ответа не нашел. Теперь она у меня периодически чешется...  Задача такая : Написать программу, которая печатает свой собственный текст. Без доступа к файлам и прочих заморочек. Задача эта из книги Ч.Уэзерэла "Этюды для программистов". Пример такой программы на бейсике : 10 LIST Всё.  На си тоже знаю. Кто подскажет, как написать такую программу на паскале (Delphi) ?
|
|
|
Записан
|
Ежики - это не только 300-400 грамм нежного диетического мяса, но и 2000 одноразовых иголок.
|
|
|
Жека
Ветеран форума
    
Карма +480/-0
Offline
Пол: 
Сообщений: 1285
Москва, ЮАО
ИЖ 2126-30 синий 2000г; турбоШНива млечка 2008г
|
 |
« Ответ #1 : 27 Января 2005, 10:43:23 » |
|
сообщение tishkir Пример такой программы на бейсике : 10 LIST
Сразу вспомнил ZX-Спектрум м-м-м  ностальгия прям. 
|
|
|
Записан
|
|
|
|
Dimis
Частый гость
 
Карма +1/-0
Offline
Сообщений: 181
Москва
|
 |
« Ответ #2 : 27 Января 2005, 15:31:58 » |
|
сообщение tishkir На си тоже знаю. Может, расскажешь? Любопытно. А про паскаль подумаем.
|
|
|
Записан
|
|
|
|
tishkir ТС
|
 |
« Ответ #3 : 27 Января 2005, 16:01:13 » |
|
/* Программа, печатающая свой собственный текст */ main ( ) { int i; puts(text[0]); puts(text[1]); for(i=0; text; i++) putq(text); for(i=2; text; i++) puts(text); } putq(s) char *s; { printf("\t\""); while(*s){ if(*s == '"') printf("\\\""); else if(*s == '\\') printf("\\\\"); else putchar(*s); s++; } printf("\",\n"); }
|
|
|
Записан
|
Ежики - это не только 300-400 грамм нежного диетического мяса, но и 2000 одноразовых иголок.
|
|
|
tishkir ТС
|
 |
« Ответ #4 : 27 Января 2005, 16:22:57 » |
|
main(){char *c="main(){char *c=%c%s%c;printf(c,34,c,34);}";printf(c,34,c,34);}
|
|
|
Записан
|
Ежики - это не только 300-400 грамм нежного диетического мяса, но и 2000 одноразовых иголок.
|
|
|
Dimis
Частый гость
 
Карма +1/-0
Offline
Сообщений: 181
Москва
|
 |
« Ответ #5 : 27 Января 2005, 21:12:40 » |
|
Ну, для Delphi решение абсолютно аналогично. Только длиннее. Поэтому для удобства чтения пишу с переносами строк. Если записать в одну строку, то получится искомая программа.
program p; {$APPTYPE CONSOLE} uses SysUtils; var s: String; begin s := 'program p; {$APPTYPE CONSOLE} uses SysUtils; var s: String; begin s := %s%s%s; write(format(s, [char(39),s,char(39)])); end.'; write(format(s, [char(39),s,char(39)])); end.
Для классического Паскаля решение не годится, т.к. в нем нет функции format. Тут надо еще подумать.
P.S. Если собираешься запускать пример под Delphi, то чтобы консольное окно сразу не закрывалось, можно удлинить программу на readln перед end (и внести эту коррективу в строку s).
|
|
|
Записан
|
|
|
|
harvester
Главный по наклейкам
Ветеран форума
    
Карма +507/-0
Offline
Пол: 
Сообщений: 6566
Москва
2126-030 ДВ/КПП ВАЗ
|
 |
« Ответ #6 : 27 Января 2005, 21:24:44 » |
|
|
|
|
Записан
|
|
|
|
Andruishka
Монстр Форума
Мастер
    
Карма +802/-0
Offline
Пол: 
Сообщений: 12382
Москва
Был трижды ижевод ©
Москва Peugeot 207
|
 |
« Ответ #7 : 28 Января 2005, 01:02:29 » |
|
сообщение tishkir main(){char *c="main(){char *c=%c%s%c;printf(c,34,c,34);}";printf(c,34,c,34);} А кто вам сказал, что эта программа, будучи скомпилированной, будет выводить на экран свой текст, а не область памяти, в которой в данный момент находится программа?? А в первой программе, что есть переменная text?? Или программа рассчитана на сверхинтеллектуальный компилятор, который должен догадаться по комментарию всунуть в переменную text, искходный текст программы  
|
|
|
Записан
|
ИЖ — это победа разума над тщеславием... ©
|
|
|
924
Ветеран форума
    
Карма +498/-0
Offline
Пол: 
Сообщений: 1284
Москва,ЮВАО
Иж2126-030(Кпп-ВАЗ), Skoda A5 MPI 1,6
|
 |
« Ответ #8 : 28 Января 2005, 07:37:12 » |
|
Ребята! Вы... это.... завязывайте с наркотиками. А то привыкните...
|
|
|
Записан
|
|
|
|
tishkir ТС
|
 |
« Ответ #9 : 28 Января 2005, 09:45:55 » |
|
To Andruishka : Я си не знаю. Нашел готовое решение в инете.  To harvester : Мы о своём, о девичьем.  To 924 : Неа. Не завяжем. Мы ещё программу по расчёту счастливых билетов не написали. гы-гы. To Dimis : Спасибо. Попробую.
|
|
|
Записан
|
Ежики - это не только 300-400 грамм нежного диетического мяса, но и 2000 одноразовых иголок.
|
|
|
Sergey_A
Ветеран форума
    
Карма +515/-0
Offline
Пол: 
Сообщений: 4333
Свердловская обл.
НУ, ЗА НАС....
Santa Fe 2.4 4х4 бизин
|
 |
« Ответ #10 : 28 Января 2005, 14:43:07 » |
|
Так и скзали б, что наболело, все кипит, хочется выговориться, а цензура не разрешает.... ! А то ПАСКАЛЬ, СИ.... !:P:P:P:P:D:D:D
|
|
|
Записан
|
Берегите себя. Кушайте мед. Удачи на дорогах.
|
|
|
Dimis
Частый гость
 
Карма +1/-0
Offline
Сообщений: 181
Москва
|
 |
« Ответ #11 : 28 Января 2005, 18:23:01 » |
|
сообщение Andruishkaсообщение tishkir main(){char *c="main(){char *c=%c%s%c;printf(c,34,c,34);}";printf(c,34,c,34);} А кто вам сказал, что эта программа, будучи скомпилированной, будет выводить на экран свой текст, а не область памяти, в которой в данный момент находится программа?? А в первой программе, что есть переменная text?? Или программа рассчитана на сверхинтеллектуальный компилятор, который должен догадаться по комментарию всунуть в переменную text, искходный текст программы  Первая программа действительно некорректна: переменная text - вообще непонятно что. А вторая программа будет работать как надо и выводить не какую-то "область памяти", а переменную c, которая объявлена и корректно проинициализирована таким образом, чтобы результатом вывода являлся текст программы.
|
|
|
Записан
|
|
|
|
Andruishka
Монстр Форума
Мастер
    
Карма +802/-0
Offline
Пол: 
Сообщений: 12382
Москва
Был трижды ижевод ©
Москва Peugeot 207
|
 |
« Ответ #12 : 28 Января 2005, 18:51:38 » |
|
сообщение Dimis А вторая программа будет работать как надо и выводить не какую-то "область памяти", а переменную c, которая объявлена и корректно проинициализирована таким образом, чтобы результатом вывода являлся текст программы. Да, точно... кавычки в тексте программы не заметил  Все равно, она выдает текст не программы, а заранее подготовленной переменной с копией текста программы. И это единственно возможное решение.
|
|
|
Записан
|
ИЖ — это победа разума над тщеславием... ©
|
|
|
Dimis
Частый гость
 
Карма +1/-0
Offline
Сообщений: 181
Москва
|
 |
« Ответ #13 : 28 Января 2005, 19:29:54 » |
|
сообщение Andruishka Все равно, она выдает текст не программы, а заранее подготовленной переменной с копией текста программы. И это единственно возможное решение. А что еще можно вывести, кроме как заранее подготовленную переменную (в принцыпе, не только в этой задаче)? А содержание переменной не является точной копией текста программы. Да это было бы и невозможно - это повергло бы нас в бесконечную рекурсию. Содержание переменной таково, что результатом вывода будет полный текст программы, включая объявление и инициализацию этой самой переменной. Т.е. если запустить программу, то она выведет буквально следующее: main(){char *c="main(){char *c=%c%s%c;printf(c,34,c,34);}";printf(c,34,c,34);} т.е. вывод программы будет полностью совпадать с ее исходным текстом.
|
|
|
Записан
|
|
|
|
Dimis
Частый гость
 
Карма +1/-0
Offline
Сообщений: 181
Москва
|
 |
« Ответ #14 : 28 Января 2005, 19:41:45 » |
|
program p; {$APPTYPE CONSOLE} const c='program p; {$APPTYPE CONSOLE} const c=begin write(copy(c,1,38)+#39+c+#39#59+copy(c,39,58)); end.'; begin write(copy(c,1,38)+#39+c+#39#59+copy(c,39,58)); end.
Для чистоты решения следует написать все в одну строку.
P.S. При запуске непосредственно из Delphi консольное окно сразу закрывается. Можно добавить readln, как я написал раньше. А можно в Delphi только откомпилировать, а запускать из командной строки. Кстати, я попробовал направить вывод в файл, потом этот файл откомпилировал и запустил - работает.
|
|
|
Записан
|
|
|
|
|