Вопрос к программистам-фанатам
Форумы Автоклуба ИЖ.2126.ru
23 Мая 2025, 03:51:19 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
Новости: ВНИМАНИЕ Почта на домене 2126.ru прекращает свою работу
   Начало   Главная Поиск Правила Камасутра Блоги Чат (1) Галерея Войти Регистрация  
Страниц: [1]   Вниз
  Печать  
Автор Тема: Вопрос к программистам-фанатам  (Прочитано 1689 раз)
0 Пользователей и 1 Гость смотрят эту тему.
tishkir ТС
Ветеран форума
******

Карма +465/-0
Offline Offline

Пол: Мужской
Сообщений: 3431


« : 27 Января 2005, 08:42:40 »

Давно, ещё в школе, я столкнулся с одной задачей. Решить не смог, ответа не нашел. Теперь она у меня периодически чешется... sad Wink
Задача такая :
Написать программу, которая печатает свой собственный текст. Без доступа к файлам и прочих заморочек. Задача эта из книги Ч.Уэзерэла "Этюды для программистов".
Пример такой программы на бейсике :
10 LIST
Всё. Smile
На си тоже знаю. Кто подскажет, как написать такую программу на паскале (Delphi) ?
Записан

Ежики - это не только 300-400 грамм нежного диетического мяса, но и 2000 одноразовых иголок.
Жека
Ветеран форума
******

Карма +480/-0
Offline Offline

Пол: Мужской
Сообщений: 1285

Москва, ЮАО

ИЖ 2126-30 синий 2000г; турбоШНива млечка 2008г

« Ответ #1 : 27 Января 2005, 10:43:23 »

Цитировать
сообщение  tishkir
Пример такой программы на бейсике :
10 LIST


Сразу вспомнил ZX-Спектрум м-м-м Smile ностальгия прям. Big Grin
Записан
Dimis
Частый гость
***

Карма +1/-0
Offline Offline

Сообщений: 181

Москва


« Ответ #2 : 27 Января 2005, 15:31:58 »

Цитировать
сообщение  tishkir
На си тоже знаю.

Может, расскажешь? Любопытно.
А про паскаль подумаем.
Записан
tishkir ТС
Ветеран форума
******

Карма +465/-0
Offline Offline

Пол: Мужской
Сообщений: 3431


« Ответ #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 ТС
Ветеран форума
******

Карма +465/-0
Offline Offline

Пол: Мужской
Сообщений: 3431


« Ответ #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 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 Offline

Пол: Мужской
Сообщений: 6566

Москва


2126-030 ДВ/КПП ВАЗ

« Ответ #6 : 27 Января 2005, 21:24:44 »

павпЅ
Записан

Andruishka
Монстр Форума
Мастер

******

Карма +802/-0
Offline 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, искходный текст программы павпЅBig Grin
Записан

ИЖ — это победа разума над тщеславием... ©
924
Ветеран форума
******

Карма +498/-0
Offline Offline

Пол: Мужской
Сообщений: 1284

Москва,ЮВАО


Иж2126-030(Кпп-ВАЗ), Skoda A5 MPI 1,6

« Ответ #8 : 28 Января 2005, 07:37:12 »

Ребята! Вы... это.... завязывайте с наркотиками. А то привыкните...
Записан
tishkir ТС
Ветеран форума
******

Карма +465/-0
Offline Offline

Пол: Мужской
Сообщений: 3431


« Ответ #9 : 28 Января 2005, 09:45:55 »

To Andruishka :
Я си не знаю. Нашел готовое решение в инете. Wink

To harvester :
Мы о своём, о девичьем. Big Grin

To 924 :
Неа. Не завяжем. Мы ещё программу по расчёту счастливых билетов не написали. гы-гы.

To Dimis :
Спасибо. Попробую.
Записан

Ежики - это не только 300-400 грамм нежного диетического мяса, но и 2000 одноразовых иголок.
Sergey_A
Ветеран форума
******

Карма +515/-0
Offline 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 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, искходный текст программы павпЅBig Grin

Первая программа действительно некорректна: переменная text - вообще непонятно что. А вторая программа будет работать как надо и выводить не какую-то "область памяти", а переменную c, которая объявлена и корректно проинициализирована таким образом, чтобы результатом вывода являлся текст программы.
Записан
Andruishka
Монстр Форума
Мастер

******

Карма +802/-0
Offline Offline

Пол: Мужской
Сообщений: 12382

Москва


Был трижды ижевод ©



Москва
Peugeot 207
« Ответ #12 : 28 Января 2005, 18:51:38 »

Цитировать
сообщение  Dimis
 А вторая программа будет работать как надо и выводить не какую-то "область памяти", а переменную c, которая объявлена и корректно проинициализирована таким образом, чтобы результатом вывода являлся текст программы.

Да, точно... кавычки в тексте программы не заметил Big Grin Все равно, она выдает текст не программы, а заранее подготовленной переменной с копией текста программы. И это единственно возможное решение.
Записан

ИЖ — это победа разума над тщеславием... ©
Dimis
Частый гость
***

Карма +1/-0
Offline 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 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 только откомпилировать, а запускать из командной строки. Кстати, я попробовал направить вывод в файл, потом этот файл откомпилировал и запустил - работает.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  

Powered by SMF 1.1.21 | SMF © 2006-2009, Simple Machines

Яндекс.Метрика

Google последней посетил эту страницу 22 Июня 2024, 14:11:31