Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Потрепаться";
Текущий архив: 2004.04.25;
Скачать: [xml.tar.bz2];

Вниз

Распечатка собственного кода программы   Найти похожие ветки 

 
Aristarh ©   (2004-03-30 22:56) [0]

Можно ли сделать так, чтобы программа распечатывала свой исходный код.
Естественно, доступа к исходникам быть не должно, один экзешник.


 
SPeller ©   (2004-03-30 22:59) [1]

Тексты зашифруй и в ресурс. Можешь воспользоваться методикой Dmitry O., зашифровать текст в БМП и вставить в прогу. Потом на лету расшифровать и выдать на печать :-))


 
Aristarh ©   (2004-03-30 23:02) [2]

>SPeller ©   (30.03.04 22:59) [1]

Это задание на экзамен в одном учебном заведении.
Экзамен по с++ (консоль)


 
Gero ©   (2004-03-30 23:11) [3]

program Kursovaya;

{$APPTYPE CONSOLE}

Var
 q : Char ;
 i : Integer ;
 s : Array [ 1 .. 17 ] Of String ;
begin

 q := """" ;
 s [ 1 ] := " ;" ;
 s [ 2 ] := "  s [ " ;
 s [ 3 ] := " ] := " ;
 s [ 4 ] := "  q := " ;
 s [ 5 ] := "Var" ;
 s [ 6 ] := "  q : Char ;" ;
 s [ 7 ] := "  i : Integer ;" ;
 s [ 8 ] := "  s : Array [ 1 .. 17 ] Of String ;" ;
 s [ 9 ] := "Begin" ;
 s [ 10 ] := "  For i := 5 To 9 Do" ;
 s [ 11 ] := "    WriteLn ( s [ i ] ) ;" ;
 s [ 12 ] := "  WriteLn ( s [ 4 ] , q , q , q , q , s [ 1 ] ) ;" ;
 s [ 13 ] := "  For i := 1 To 17 Do" ;
 s [ 14 ] := "    WriteLn ( s [2] , i , s [3] , q , s [i] , q , s [1] ) ;" ;
 s [ 15 ] := "  For i := 10 To 17 Do" ;
 s [ 16 ] := "    WriteLn ( s [ i ] )" ;
 s [ 17 ] := "End ." ;
 For i := 5 To 9 Do
   WriteLn ( s [ i ] ) ;
 WriteLn ( s [ 4 ] , q , q , q , q , s [ 1 ] ) ;
 For i := 1 To 17 Do
   WriteLn ( s [2] , i , s [3] , q , s [i] , q , s [1] ) ;
 For i := 10 To 17 Do
   WriteLn ( s [ i ] );
 Readln;
end.


 
SPeller ©   (2004-03-30 23:11) [4]

Хм... В любом случае надо как-то хранить их внутри бинарника. С++ компиляторы максимум ресурсы позволят включить, поэтому остаётся либо через ресурсы, либо никак. Можно, конечно, извратиться и дизассемблированный код выдать, но, полагаю, что это будет совсем не то чего ждут.


 
SPeller ©   (2004-03-30 23:12) [5]

ЗЫ: Кончено, если прога посолиднее, чем та что привел Gero ©   (30.03.04 23:11) [3]


 
syte_ser78 ©   (2004-03-31 14:25) [6]


> [3] Gero ©   (30.03.04 23:11)
> program Kursovaya;
>
> {$APPTYPE CONSOLE}

Меня тоже этот вопрос интересовал. Твой исходник не выведет
s [ 1 ] := " ;" ;
s [ 2 ] := "  s [ "
и т.д.


 
Verg ©   (2004-03-31 15:05) [7]

Так на С или на PASCAL?


 
Rouse_ ©   (2004-03-31 15:18) [8]

Удалено модератором


 
Verg ©   (2004-03-31 15:22) [9]

#include <stdlib.h>
char* program[] = {
"#include <stdlib.h>",
"char* program[] = {",
"        NULL};",
"printquotas(char *s) {",
"  printf(\"\\t\\\"\");",
"  while(*s){",
"    if(*s == "\"")        printf(\"\\\\\\\"\");",
"    else if(*s == "\\\\") printf(\"\\\\\\\\\");",
"    else putchar(*s);",
"    ++s;",
"  }",
"  printf(\"\\\",\\n\");",
"}",
"int main(){",
       "  int i;",
"  puts(program[0]);",
       "  puts(program[1]);",
"  for(i=0; program[i]; i++) printquotas(program[i]);",
"  for(i=2; program[i]; i++) puts(program[i]);",
       "  getchar();",
"}",
       NULL};
printquotas(char *s) {
 printf("\t\"");
 while(*s){
   if(*s == """)       printf("\\\"");
   else if(*s == "\\") printf("\\\\");
   else putchar(*s);
   ++s;
 }
 printf("\",\n");
}
int main(){
 int i;
 puts(program[0]);
 puts(program[1]);
 for(i=0; program[i]; i++) printquotas(program[i]);
 for(i=2; program[i]; i++) puts(program[i]);
 getchar();
}


Ага, значит проксик глючит - WinGate


 
KSergey ©   (2004-03-31 15:23) [10]

>  [2] Aristarh ©   (30.03.04 23:02)
> Это задание на экзамен в одном учебном заведении.

Да уж... Это же репу сломишь на таком экзамене...
Сделать конечно можно, по-моему такие "забавы прогеров" ходят годов с... (как компы появились).
В инете эпизодически всптывают воспоминания "как это было" или вновь наваятые примеры на всех, наверное, языках...
Вот только для экзамена... А времени сколько?


 
Aristarh ©   (2004-03-31 16:54) [11]

>KSergey ©   (31.03.04 15:23) [10]
>А времени сколько?

180 минут грязного времени.
За вычетом времени на организационные моменты и проверку результатов.


 
SPeller ©   (2004-03-31 16:58) [12]

Тогда уж лучше пишешь за пару минут утилитку, которая в нужных файлах в начале и в конце каждой строки ставит двойный кавычки и заводит некую строковыю переменную, содержащую всю эту строку, и подключаешь через инклуд. Пишешь нужный код, который потом должен появиться на экране, запускаешь утилитку, компилишь. И всё.


 
ДедушкаКо ©   (2004-03-31 17:12) [13]

вроде от Кнута пошло


 
Verg ©   (2004-03-31 17:15) [14]


> ДедушкаКо ©   (31.03.04 17:12) [13]
> вроде от Кнута пошло


ДА кто его читает нынче? Ты оглянись, Деда!

Достоевского, понимаешь, к черту, а тут "какой-то" Кнут...


 
Piter ©   (2004-03-31 19:53) [15]

SPeller (30.03.04 23:11) [4]
В любом случае надо как-то хранить их внутри бинарника. С++ компиляторы максимум ресурсы позволят включить, поэтому остаётся либо через ресурсы, либо никак. Можно, конечно, извратиться и дизассемблированный код выдать, но, полагаю, что это будет совсем не то чего ждут.


Как же ты не понимаешь... программа должна вывести саму себя!!! Не вывести что-то хранящееся где-то, а именно операторами вывода вывести программу на экран, понятно?
Это сложная задача... с первого взгляда создается ощущение, что это невозможно, пишешь:

PROGRAM Prg;
BEGIN
 writeln("PROGRAM Prg");
 writeln("BEGIN");
 writeln("writeln(""PROGRAM Prg"");");
 writeln("writeln(""BEGIN"");");
 writeln("writeln("writeln(""PROGRAM Prg"");");").....

и понимаешь что попадаешь в бесконечную рекурсию... таким способом никогда себя не выведешь... но все таки можно это сделать...


 
Gero ©   (2004-03-31 19:59) [16]


> [6] syte_ser78 ©   (31.03.04 14:25)
> Твой исходник не выведет
>
> s [ 1 ] := " ;" ;
> s [ 2 ] := "  s [ "
> и т.д.

А Вы проверьте.
Кстати, исходник не мой.


 
P.N.P. ©   (2004-03-31 20:06) [17]

main(a){printf(a,34,a="main(a)
{printf(a,34,a=%c%s%c,34);}",34);}
© Рашид Тархеев и Влад Таиров


 
Ihor Osov'yak ©   (2004-03-31 20:10) [18]

В общем то видел где-то в инете сайт, на котором юыли собраны решения этой забачи на примерно двух десятках языков..

PS. Лично я не понимаю пользы от такого рода задач. Если уж на развитие сообразительности - ради бога, математика, физика, етс..
А такого рода задачи на экзаменах - маразм, имхо..


 
Verg ©   (2004-03-31 20:21) [19]


> Ihor Osov"yak ©   (31.03.04 20:10) [18]


Главное забыл - логика


> А такого рода задачи на экзаменах - маразм, имхо..


Эт-точно :)))) При том полный маразм.


 
P.N.P. ©   (2004-03-31 20:36) [20]


> При том полный маразм

Не согласен - если человек 6(?) лет учился думать головой
то почему же тогда маразм? Это вполне нормально, если к тому же
работодатели поджидают за порогом (у нас так :))


 
Aristarh ©   (2004-04-01 15:21) [21]

>Не согласен - если человек 6(?) лет учился думать головой

Курс с++ 5 месяцев.


 
KSergey ©   (2004-04-01 15:27) [22]

>  [17] P.N.P. ©   (31.03.04 20:06)
> main(a){printf(a,34,a="main(a)
> {printf(a,34,a=%c%s%c,34);}",34);}
> © Рашид Тархеев и Влад Таиров

Занятно..
Я конечно не знаю для каких условий они ее писали, вот только где гарантия, что в буфере, переданном через аргумент, будет место под результирующий буфер?


 
KSergey ©   (2004-04-01 15:28) [23]

> [20] P.N.P. ©   (31.03.04 20:36)
> работодатели поджидают за порогом (у нас так :))

Бывает же...


 
_Alanjuk   (2004-04-01 15:29) [24]

Pascal.
Но различны размеры файла и того, что он выводит на экран.

Const
a="Const";
b="Var i:byte";
c="t: array[1..15] of string";
d="begin";
Var i:byte;
t: array[1..15] of string;
begin
t[1]:="writeln(a)";
t[2]:="writeln(#97#61#39,a,#39#59)";
t[3]:="writeln(#98#61#39,b,#39#59)";
t[4]:="writeln(#99#61#39,c,#39#59)";
t[5]:="writeln(#100#61#39,d,#39#59)";
t[6]:="writeln(b,#59)";
t[7]:="writeln(c,#59)";
t[8]:="writeln(d)";
t[9]:="for i:=1 to 15 do begin";
t[10]:="writeln(#116#91,i,#93#58#61#39,t[i],#39#59)";
t[11]:="end";
t[12]:="for i:=1 to 15 do begin";
t[13]:="writeln(t[i],#59)";
t[14]:="end";
t[15]:="end.";
writeln(a);
writeln(#97#61#39,a,#39#59);
writeln(#98#61#39,b,#39#59);
writeln(#99#61#39,c,#39#59);
writeln(#100#61#39,d,#39#59);
writeln(b,#59);
writeln(c,#59);
writeln(d);
for i:=1 to 15 do begin;
writeln(#116#91,i,#93#58#61#39,t[i],#39#59);
end;
for i:=1 to 15 do begin;
writeln(t[i],#59);
end;
end.;


 
KSergey ©   (2004-04-01 15:31) [25]

> [22] KSergey ©   (01.04.04 15:27)
> будет место под результирующий буфер?

Чета я недодумал как обычно...

Да там, похоже, вообще места достаточного не выдерено. Расчет на то, что вокруг будет пусто... Мдя...


 
Kerk ©   (2004-04-01 15:34) [26]

на gwbasic"е намного короче можно:

10 LIST


 
KSergey ©   (2004-04-01 15:35) [27]

>  [26] Kerk ©   (01.04.04 15:34)

Да, помнится на басике все признавали, что это просто ;)


 
SPeller ©   (2004-04-01 15:41) [28]


> Piter ©   (31.03.04 19:53) [15]
> Как же ты не понимаешь...

Да я то всё понимаю. А вот ты нет. Я думал что будет понятно что той утилитке нужно скормить файл с тем кодом, который и является кодом программы. Могу на пальцах объяснить. Пишем программу (ту, которая потом на экран выведет свой текст). Сохраняем её в файле MyPuperProgram.cpp, и запускаем утилитку, скармливая ей файл MyPuperProgram.cpp. Она генерит файл , в котором теперь содержится объявление строковой переменной, и её значением является текст, который был в файле MyPuperProgram.cpp. Теперь подключаем inc файл к программе (#include "MyPuperProgram.inc") и вуаля! cout >> MyPuperStr;


 
SPeller ©   (2004-04-01 15:43) [29]

Очепятался..

> Она генерит файл , в котором теперь

Она генерит файл MyPuperProgram.inc, в котором теперь...



Страницы: 1 вся ветка

Форум: "Потрепаться";
Текущий архив: 2004.04.25;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.52 MB
Время: 0.037 c
7-1077650405
Pavel74
2004-02-24 22:20
2004.04.25
если ето doc то открыть его в worde а если ето pdf то в аcrob ...


1-1081243534
Intruder
2004-04-06 13:25
2004.04.25
Ini файл и TTree View


1-1081282711
Leon1234
2004-04-07 00:18
2004.04.25
Почему D6 не позволяет работать с указателями?


1-1081233763
Stas
2004-04-06 10:42
2004.04.25
Как скрыть кнопку с панели задач


11-1065002302
Ал
2003-10-01 13:58
2004.04.25
PopUp меню, открываемое при щелчке по иконке в трее





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский