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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 09.03.2008, 07:41   #1
Gorychev
Участник клуба
 
Аватар для Gorychev
 
Регистрация: 08.03.2008
Сообщений: 1,603
По умолчанию Программа, выводящая сама себя

Вычитал в одной книжице следующее - цитата "Многие годы мы предлагаем один и тот же программистский тест каждому разработчику. Он не требует никакого оборудования или обращения к справочникам. Кандидатов просят написать программу, отображающую на экране свой собственный исходный текст, не обращаясь к чтению файлов". У каго какие мысли.
Gorychev вне форума Ответить с цитированием
Старый 09.03.2008, 09:17   #2
alexBlack
Участник клуба
 
Регистрация: 12.10.2007
Сообщений: 1,204
По умолчанию

Да, задача уже стала классикой.
Вот мой вариант. Правда, вывод в файл. Так было удобнее делать проверку, но суть от этого не меняется.
78 строк. Может у кого-то есть вариант короче ?

Код:

program SelfWrite;

uses Classes, Windows;

var F:TextFile;
    Buffer : TStringList;
procedure Init;
begin
   Assign(F, 'Test.pas'); ReWrite(F);
   Buffer := TStringList.Create;
end;

procedure Done;
var i:integer;
begin
   Buffer.Add('   Done;');
   Buffer.Add('end.');
   for i:=0 to Buffer.Count-1 do WriteLn(F, Buffer[i]);
   Buffer.Free;
   Close(F);
end;

procedure NewStr(S:String);
var S1:String;
    i:integer;
begin
   WriteLn(F, S);
   S1 := ';
   for i:=1 to length(S) do begin
      if S[i] = ''
      then S1 := S1 + '''
      else S1 := S1 + S[i];
   end;
   Buffer.Add('   NewStr('''+S+''');');
end;

begin
   Init;
   NewStr('program SelfWrite;');
   NewStr('');
   NewStr('uses Classes, Windows;');
   NewStr('');
   NewStr('var F:TextFile;');
   NewStr('    Buffer : TStringList;');
   NewStr('procedure Init;');
   NewStr('begin');
   NewStr('   Assign(F, ''Test.pas''); ReWrite(F);');
   NewStr('   Buffer := TStringList.Create;');
   NewStr('end;');
   NewStr('');
   NewStr('procedure Done;');
   NewStr('var i:integer;');
   NewStr('begin');
   NewStr('   Buffer.Add(''   Done;'');');
   NewStr('   Buffer.Add(''end.'');');
   NewStr('   for i:=0 to Buffer.Count-1 do WriteLn(F, Buffer[i]);');
   NewStr('   Buffer.Free;');
   NewStr('   Close(F);');
   NewStr('end;');
   NewStr('');
   NewStr('procedure NewStr(S:String);');
   NewStr('var S1:String;');
   NewStr('    i:integer;');
   NewStr('begin');
   NewStr('   WriteLn(F, S);');
   NewStr('   S1 := '';');
   NewStr('   for i:=1 to length(S) do begin');
   NewStr('      if S[i] = ''''');
   NewStr('      then S1 := S1 + ''''''');
   NewStr('      else S1 := S1 + S[i];');
   NewStr('   end;');
   NewStr('   Buffer.Add(''   NewStr(''''''+S+'''''');'');');
   NewStr('end;');
   NewStr('');
   NewStr('begin');
   NewStr('   Init;');
   Done;
end.
alexBlack вне форума Ответить с цитированием
Старый 09.03.2008, 09:44   #3
andrey4623
Форумчанин
 
Аватар для andrey4623
 
Регистрация: 31.05.2007
Сообщений: 266
По умолчанию

в смысле, просто "вручную" набить файл? А чтоб автоматом?
andrey4623 вне форума Ответить с цитированием
Старый 09.03.2008, 09:50   #4
alexBlack
Участник клуба
 
Регистрация: 12.10.2007
Сообщений: 1,204
По умолчанию

Цитата:
Сообщение от andrey4623 Посмотреть сообщение
в смысле, просто "вручную" набить файл? А чтоб автоматом?

Программа__| Результат
которую____| работы программы
нужно______| на экране
написать____| == тексту
____________| самой программы
Использует__|
write(ln)_____|
alexBlack вне форума Ответить с цитированием
Старый 09.03.2008, 10:04   #5
andrey4623
Форумчанин
 
Аватар для andrey4623
 
Регистрация: 31.05.2007
Сообщений: 266
По умолчанию

не понял
у alexBlack программа просто печатает тот текст, который забил автор. А если я изменю какую-нибудь строчку в процедуре NewStr(S:String); программа это не напечатает!
andrey4623 вне форума Ответить с цитированием
Старый 09.03.2008, 11:26   #6
alexBlack
Участник клуба
 
Регистрация: 12.10.2007
Сообщений: 1,204
По умолчанию

Цитата:
Сообщение от andrey4623 Посмотреть сообщение
не понял
у alexBlack программа просто печатает тот текст, который забил автор.
Может станет понятней, если сам попытаешься сделать ?

Представь, что ты пришел устраиваться на работу. Перечитай пост #1. Задание сформулировано. Работодатель ждет адекватного ответа.

Цитата:
А если я изменю какую-нибудь строчку в процедуре NewStr(S:String); программа это не напечатает!
???
В любой программе можно изменить строчку и она перестанет работать
???

Если так будет понятней: нужно сделать exe-шник, который выдает текст, компиляция которого дает тот-же exe-шник.

Последний раз редактировалось alexBlack; 09.03.2008 в 11:54.
alexBlack вне форума Ответить с цитированием
Старый 09.03.2008, 12:01   #7
andrey4623
Форумчанин
 
Аватар для andrey4623
 
Регистрация: 31.05.2007
Сообщений: 266
По умолчанию

текст программы печатаешь сам, программа этого не делает!
andrey4623 вне форума Ответить с цитированием
Старый 09.03.2008, 12:23   #8
alexBlack
Участник клуба
 
Регистрация: 12.10.2007
Сообщений: 1,204
По умолчанию

Цитата:
Сообщение от andrey4623 Посмотреть сообщение
текст программы печатаешь сам, программа этого не делает!

Хмм...

Согласен, сам, но только для того, чтобы программа потом делала то, что я хочу, точнее то, что указано в задании. Попробуй ее скомпилить. Получишь exe-шник. (2) Запускаем exe-шник - получаем текст. Компилим этот текст - получаем тот самый exe-ник. goto (2)
alexBlack вне форума Ответить с цитированием
Старый 09.03.2008, 12:25   #9
Квэнди
Старожил
 
Аватар для Квэнди
 
Регистрация: 13.12.2006
Сообщений: 3,859
По умолчанию

На pascal-совместимых языках это не вохзможно.
На Basic это возможно, вот текст программы:


не удивляйтесь почему он пуст именно это и ответ.
ICQ не для вопросов, а для предложений. Для вопросов используйте форум
IRC канал клуба программистов|Мои статьи
Квэнди вне форума Ответить с цитированием
Старый 09.03.2008, 12:32   #10
alexBlack
Участник клуба
 
Регистрация: 12.10.2007
Сообщений: 1,204
По умолчанию

2Квэнди

Я уже начал сомневаться. Еще немного и убедите меня что земля плоская. А как-же код в после #2 ?
alexBlack вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
InjHdc – программа выводящая время в окне игры. mikityak Gamedev - cоздание игр: Unity, OpenGL, DirectX 3 09.04.2013 00:26
Программа сама управляет курсором. Как её сделать? Alinghor Свободное общение 3 04.07.2008 16:06
Программа печатающая саму себя :o K@$K@ Паскаль, Turbo Pascal, PascalABC.NET 7 09.04.2008 16:24
Прога может удалить сама себя?? UnD)eaD)Snake Софт 5 18.08.2007 00:46