помогите написать программу

Форум для изучающих FPC и их учителей.

Модератор: Модераторы

помогите написать программу

Сообщение rebel » 14.02.2011 20:06:26

Ребят срочно помоги если знаете!! как сделать из этого кода чтобы при нажатии на кнопку он выводил эти данные по порядку при одном нажатии date при другом нажатии time и т.д
Код: Выделить всё
action=date - скрипт возвращает текущую дату
       action=time - скрипт возвращает текущее время
       action=datetime - скрипт возвращает текущие дату и время
       action=serverinfo - скрипт возвращает информацию о сервере
       action=selfinfo - скрипт возвращает информацию о себе (метод запроса, версия CGI, местоположение скрипта)
       action=userinfo - скрипт возвращает информацию о пользователе (IP-адрес пользователя, информацию о браузере)
       action=readfile, info="имя файла" - скрипт возвращает содержимое текстового файла, имя которого задано в параметре "info"
       action=relocate, info="имя ресурса" - скрипт перенаправляет клиента к ресурсу, имя которого задано в параметре "info"


вот код программы:

Код: Выделить всё
{$mode objfpc}
{$H+}
Uses SysUtils,cgivars,DateUtils;

function first():string;
begin
result:='<form method="get"><input name="action"><br><br>'
       +'<form method="get"><input name="info"><br><br>'
       +'<input type="submit" value="Oтправить"></form>'
end;

function ac(s:string):string;
var c,b:integer;
begin
c:=pos('=',s);
b:=pos('&',s);
result:=copy(s,c+1,b-c-1);
end;       

function inf(s:string):string;
var c,b:integer;
begin
c:=pos('&',s);
b:=length(s);
result:=copy(s,c+6,b-c+5);
end;

var h:string;action,info:string;
   f:text; i,n:integer;
   a:real;
begin
writeln('status: 200 ok');
writeln('Content-type:text/html');
writeln;
h:=getEnvironmentVariable('QUERY_STRING');
if h='' then
   writeln(first)
   else
begin
   action:=ac(h);
   info:=inf(h);

   if action='time' then
      writeln('Time is:',TimeToStr(TimeOf(Now)))

   else if action='date' then
      writeln('Date is:',DateTimeToStr(DateOf(Now)))

   else if action='datetime' then begin
           writeln('DateTime is:',TimeToStr(TimeOf(Now)),' ',DatetimeToStr(DateOf(Now)));

   end

   else if action='serverinfo' then begin
      writeln(GetEnvironmentVariable('SERVER_NAME'));
      writeln(GetEnvironmentVariable('SERVER_PORT'));
      writeln(GetEnvironmentVariable('SERVER_PROTOCOL'));
      writeln(GetEnvironmentVariable('SERVER_SOFTWARE'));
   end

   else if action='selfinfo' then begin
      writeln(GetEnvironmentVariable('SCRIPT_NAME'));
      writeln(GetEnvironmentVariable('REQUEST_METHOD'));
      writeln(GetEnvironmentVariable('GATEWAY_INTERFACE'));
   end

   else if action='userinfo' then begin
      writeln(GetEnvironmentVariable('REMOTE_ADDR'));
      writeln(GetEnvironmentVariable('HTTP_USER_AGENT'));
   end


   else if action='readfile'then begin       
      Assign(f,info);
      reset(f);
      while not eof(f) do begin
         readln(f,info);
         writeln(info);
      end;
      close(f);
      
   end
   else if action='relocate' then begin
      writeln('location://',info);
      end;


end;                               
end.
rebel
незнакомец
 
Сообщения: 6
Зарегистрирован: 14.02.2011 19:59:45

Re: Free Pascal!!!!!!

Сообщение Ism » 14.02.2011 22:21:03

положите список в базу данных и получите обратно сортированный список. Sqlite вам в руки

Кроме того непонятно вообще о чем речь ? какие кнопки ? Судя по всему у вас генерация html. Опишите задачу подробно
Ism
энтузиаст
 
Сообщения: 908
Зарегистрирован: 06.04.2007 17:36:08

Re: Free Pascal!!!!!!

Сообщение Kitayets » 15.02.2011 09:49:31

Тут нужно:
1. иметь HTML страничку с кнопкой[ами] которые отправляют разные action'ы (описанные в задании) методом get на сервер cgi программе
2. Скомпилированную выше программу с помощью freepascal
3. WEB сервер с настроенными путями к html страничке (из пункта 1) и настроенными cgi (для пункта 2)

---
в качестве web сервера предлагаю взять apache

итак для решения необходимо:
1. определится с платформой (windows/linux/unix). тут скорее всего виндоус, тогда апач можно взять отсюда http://www.sai.msu.su/apache//httpd/binaries/win32/httpd-2.2.17-win32-x86-no_ssl.msi
2. компилим программу с помощью fpc (можно взять отсюда - ftp://ftp.chg.ru/pub/lang/pascal/fpc/dist/2.4.2/i386-win32/fpc-2.4.2.i386-win32.exe). После установки - <куда установили>binfpc <программа.pas>
получаем экзешник который кладём в каталог для cgi apache (из пнкта 1) и настраиваем согласно документации (http://httpd.apache.org/docs/2.2/howto/cgi.html по ссылке описывается cgi для perl ".pl" - нужно по аналогии настроить для ".exe")
3. написать заглавную страничку html с кнопками (можно и с формами) примерно как в этом туторе - http://www.htmlcodetutorial.com/forms/index_famsupp_6.html
положить эту страничку в нужный каталог apache и настроить по доке http://httpd.apache.org/docs/2.2/platform/windows.html
4. запустить apache - зайти браузером на localhost
5. PROFIT!

дополнительная информация http://wiki.lazarus.freepascal.org/CGI_Web_Programming
http://www.freepascal.ru/forum/viewtopic.php?f=3&t=105

Добавлено спустя 3 минуты 56 секунд:
ааа, страничку HTML писать не нужно, она уже есть в функции first !!!

нужно настроить apache так, чтобы при заходе на сайт - сразу отдавался выхлоп cgi программы !
Kitayets
постоялец
 
Сообщения: 171
Зарегистрирован: 05.05.2010 21:15:24

Re: Free Pascal!!!!!!

Сообщение rebel » 26.02.2011 14:32:27

[вырезано] если кого не заруднит помогите с решением(ну типо сделать задачу помогите) просто код сделайте аааа, вообще по зарез(2 дня и все мне пи***ц будет, выгонят(((( :cry: :cry: :cry: :cry: :cry: )
rebel
незнакомец
 
Сообщения: 6
Зарегистрирован: 14.02.2011 19:59:45

Re: Free Pascal!!!!!!

Сообщение ev » 26.02.2011 14:49:17

rebel писал(а):[вырезано]

нарушение п. 1.2 правил форума
ev
долгожитель
 
Сообщения: 1772
Зарегистрирован: 27.04.2005 23:19:06
Откуда: Москва

Re: помогите написать программу

Сообщение rebel » 27.02.2011 14:47:17

(сорри) Ребят если кого не заруднит помогите с решением(ну типо сделать задачу помогите) просто код сделайте аааа, вообще по зарез(2 дня и все мне пи***ц будет, выгонят(((( :cry: :cry: :cry: :cry: :cry: )
rebel
незнакомец
 
Сообщения: 6
Зарегистрирован: 14.02.2011 19:59:45

Re: помогите написать программу

Сообщение Андрей Варкентин » 28.02.2011 09:05:10

С таким подходом к делу - пусть лучше вовремя выгонят. Это я серьезно, займетесь хоть тем что получается и больше нравится.
Андрей Варкентин
новенький
 
Сообщения: 21
Зарегистрирован: 17.09.2010 11:56:14

Re: помогите написать программу

Сообщение Kitayets » 01.03.2011 01:57:40

2rebel

даже не знаю что тебе посоветовать. У тебя уже есть программа, которая делает то, что требуется в задании.

Дело в том, что эта программа не предназначена для исполнения сама по себе, она должна работать в паре с WEB сервером (любым который поддерживает CGI http://ru.wikipedia.org/wiki/CGI).

т.е. нужно:
1. установить web сервер (например apache)
2. скомпилировать программу (используя компилятор freepascal)
3. настроить web сервер на работу с программой в качестве cgi, и запустить его (web сервер)
4. зайти на web сервер с помощью браузера (например internet explorer)
5. всё

напиши конкретно, с каким пунктом у тебя проблема!
Kitayets
постоялец
 
Сообщения: 171
Зарегистрирован: 05.05.2010 21:15:24

Re: помогите написать программу

Сообщение rebel » 09.03.2011 22:48:16

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

:D :D :D :D :D :D :D :D :D поздно уже 4 курс

Добавлено спустя 2 минуты 22 секунды:
if ((pos(h,CgiVarNames[i])<>0) or (h='')) then begin
if (copy(CgiVarNames[i],1,length(h))=h) then begin ребят вот две строки одна выводит переменные окружения по любому символу(букве), другая по первому символу(букве), а мне надо вывести с последнего символа(буквы) может кто знает помогите с кодом!!!!
rebel
незнакомец
 
Сообщения: 6
Зарегистрирован: 14.02.2011 19:59:45

Re: помогите написать программу

Сообщение Kitayets » 10.03.2011 01:06:54

if ((pos(h,CgiVarNames[i])<>0) or (h='')) then begin
if (copy(CgiVarNames[i],1,length(h))=h) then begin
ребят вот две строки одна выводит переменные окружения по любому символу(букве), другая по первому символу(букве), а мне надо вывести с последнего символа(буквы) может кто знает помогите с кодом!!!!


эээ, то что ты нарисовал это:
1. условие - если в имени присутствует h, либо h пустое то ...
2. условие - если начало имени соответствует содержанию переменной h то...

т.е. это два УСЛОВИЯ. они ничего не выводят!

Я так понимаю твою задачу - у тебя есть массив текстовых строк - CgiVarNames, тебе надо найти(выбрать) строки по какому то условию? Сформулируй условие, а то что ты написал - это просто поток сознания.

Ещё раз - что по твоему значит - "а мне надо вывести с последнего символа(буквы)"?

ЗЫ В любом случае это похоже на поиск подстроки - посмотри в http://lazarus-ccr.sourceforge.net/fpcdoc/rtl/strutils/index-5.html

например интересная функция
RPos - Find last occurrence of substring or character in a string (найти последнее вхождение подстроки или символа)
вполне возможно что это то, что тебе нужно...
Kitayets
постоялец
 
Сообщения: 171
Зарегистрирован: 05.05.2010 21:15:24

Re: помогите написать программу

Сообщение rebel » 10.03.2011 06:37:48

вот полная задача Uses SysUtils,cgivars;

var
i:integer; h:string;
begin
writeln('status: 200 ok');
writeln('Content-type:text/html');
writeln;
writeln('<TABLE border="4">');
h:=getEnvironmentVariable('QUERY_STRING');
For I:=1 to CGIVarCount do
begin

if ((pos(h,CgiVarNames[i])<>0) or (h='')) then begin
//if (copy(CgiVarNames[i],1,length(h))=h) then begin
writeln('<tr>','<td>');
writeln(CgiVarNames[i],' : ','<td>',GetEnvironmentVariable(CgiVarNames[i]));
end;
end;
writeln('</td>','</td>','</tr>','</TABLE>');
end.
rebel
незнакомец
 
Сообщения: 6
Зарегистрирован: 14.02.2011 19:59:45

Re: помогите написать программу

Сообщение Kitayets » 10.03.2011 10:35:13

to rebel

это замечательно, но что тебе то нужно?

ладно, включим телепатию, вот как ты должен был сформулировать задачу:
=====================
нужно найти все строки массива CgiVarNames которые удовлетворяют следующему условию - строка включает в себя подстроку получаемую в переменой h таким образом, что подстрока ограничивает строку справа.

Например: если в массиве CgiVarNames есть элементы:
'HTTP_ACCEPT',
'HTTP_ACCEPT_CHARSET'
то при h = 'ACCEPT' - в вывод должно попасть значение переменной из первой строки.
а при h = 'T' - в вывод должны попасть значения переменной ОБОИХ строк
при h = '' в вывод ничего не выводится
=====================

такому заданию соответствует следующее условие:
Код: Выделить всё
if (length(CgiVarNames[i]) >= length(h)) and (copy(CgiVarNames[i], length(CgiVarNames[i]) - length(h) + 1, length(h)) = h) then begin

-------------
это конечно не самый изящный вариант, но должен работать.
Kitayets
постоялец
 
Сообщения: 171
Зарегистрирован: 05.05.2010 21:15:24

Re: помогите написать программу

Сообщение rebel » 10.03.2011 11:07:37

спасибо!! проверим))
rebel
незнакомец
 
Сообщения: 6
Зарегистрирован: 14.02.2011 19:59:45


Вернуться в Обучение Free Pascal

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 20

Рейтинг@Mail.ru