Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.04.25;
Скачать: CL | DM;

Вниз

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

 
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;
Скачать: CL | DM;

Наверх




Память: 0.55 MB
Время: 0.034 c
6-1077164853
CASPER
2004-02-19 07:27
2004.04.25
Игра по сети


9-1067583979
Bobrik
2003-10-31 10:06
2004.04.25
Свет в OpenGL


8-1074241238
Darlock
2004-01-16 11:20
2004.04.25
Порезка изображений експортированых из TImageList


3-1080725353
JibSkeart
2004-03-31 13:29
2004.04.25
Интерестно а можно узнать в ADOConnection у какого обьекта ...


3-1080034879
TSa
2004-03-23 12:41
2004.04.25
Сохранание данных из БД ф файл