IMHO.WS

IMHO.WS (http://www.imho.ws/index.php)
-   Программирование (http://www.imho.ws/forumdisplay.php?f=40)
-   -   Компилятор для программ на Pascal (http://www.imho.ws/showthread.php?t=124721)

Gamer2100 14.10.2007 10:18

Компилятор для программ на Pascal
 
Здрасте, подскажите пожалуйста компилятор для программ написанных на Pascal, я просто проги пишу в Pascal ABC а при переводе в Turbo Pascal вместо русских букв вылазиет иероглифы!!:help::молись::idontnow:

Borland 14.10.2007 14:21

Gamer2100, проблема стара как мир...
Турбо работает с кодировкой DOS (cp-866), Pascal ABC - с кодировкой Windows (cp-1251). Достаточно просто перед запуском проги на компиляцию конвертировать cp-1251->cp-866.
Проще говоря, кодировка русского в исходном файле должна совпадать с кодировкой его же в среде исполнения (для ДОС и консоли Win - 866, для GUI Win - 1251).
Или, как вариант, перед запуском на выполнение проги в NT-консоли можно менять кодовую страницу: chcp 1251.
Более современный компилятор есть тут: _http://www.freepascal.org/

Gamer2100 14.10.2007 18:25

Работает, тока вот в нём не плучается произвести следующие действа:
x:=round(y/4)
где x,y:integer
прога доходит до этого места и пишет ошипку!!!

Gamer2100 14.10.2007 19:45

не стал парится с Апсалютными числами, поставил реал, округлил до сотых, но вот другая проблема, написал такую прогу:
program pass;
var a,b,c,d,e,f,g:string;
p: string;
label 1;
begin
writeln('Эта программы покажет вам мои пороли, если вы правильно ответите на 3 вопроса.');
writeln('Готовы?(Введите "да" или "нет").');
readln(a);
if (a='да') then writeln('Дата моего рождения в формате ДД/ММ/ГГГГ') else writeln('Как хотите.');
if (a='нет') then goto 1;
readln(b);
if (b='25.12.1993') then writeln('Правильно, теперь введите один из моих ников.') else writeln('Ошибка. Прощайте.');
if not (b='25.12.1993') then goto 1;
readln(c);
if (c='Walkman') or (c='walkman')
or (c='Dreamer') or (c='dreamer')
or (c='X3M-NRG') or (c='x3m-nrg')
then writeln('Правильно, теперь назовите мой любимый инструмент.')
else writeln('Ошибка. Прощайте.');
if not (c='Walkman') or (c='walkman')
or (c='Dreamer') or (c='dreamer')
or (c='X3M-NRG') or (c='x3m-nrg')
then goto 1;
readln(d);
if (d='Create_thread') or (d='Create_thread')
then write('Правильно, но это ещё не всё, не думайте что всё так просто, назовите мою любимую актрису(на английском пожалуйста).')
else writeln('Ошибка. Прощайте.');
if not (d='Create_thread') or (d='Create_thread')
then goto 1;
readln(e);
if (e='Emma Wotson')
then writeln('Правильно!!!Последний(это правда) вопрос. Какая фамилия у человека составившего учебник по алгебре для 7, 8, 9 класса?')
else writeln('Ошибка. Прощайте.');
if not (e='Emma Wotson')
then goto 1;
readln(f);
if (f='Мордкович') then writeln('Молодец, все слои защиты пройдены, вот мои ники и пароли:') else writeln('Ошибка. Прощайте.');
if not (f='Мордкович') then goto 1;
if (f='Мордкович') then writeln('"WebMoney"');
if (f='Мордкович') then writeln('код: 099087336262');
if (f='Мордкович') then writeln('пароль: ***');
if (f='Мордкович') then writeln('код доступа к фаилу ключей:***');
if (f='Мордкович') then writeln('"E-mail"');
if (f='Мордкович') then writeln('login:sergey1993@bk.ru');
if (f='Мордкович') then writeln('pass:***');
if (f='Мордкович') then writeln('"Мой сайт"');
if (f='Мордкович') then writeln('login:young-gamedev');
if (f='Мордкович') then writeln('pass:***');
if (f='Мордкович') then writeln('"GTAMaps"');
if (f='Мордкович') then writeln('login:X3M-NRG');
if (f='Мордкович') then writeln('pass:***');
if (f='Мордкович') then writeln('Есть ещё, но я их забыл.:-(');
if (f='Мордкович') then writeln('Вы закончили?');
1: readln(g);
end.
но она после третьего вопроса выходит, почему это может быть?:idontnow::help:
ЗЫ я знаю что goto это признак плохого програмирования, но пока я с ним не разобрался буду его юзать!!!

Hubbitus 15.10.2007 00:01

Цитата:

Сообщение от Gamer2100 (Сообщение 1470196)
прога доходит до этого места и пишет ошипку!!!

Какую ошибку-то? Или это сообщение было для ясновидящих?

добавлено через 8 минут
Цитата:

Сообщение от Gamer2100 (Сообщение 1470219)
ЗЫ я знаю что goto это признак плохого програмирования, но пока я с ним не разобрался буду его юзать!!!

Знаете - замените на вызов функции или процедуры!

Третий впорос это про ники? В остальных все работает как и ожидалось??

P.S. И вообще, кто Вас так учил программировать? Надеюсь это просто Ваша первая программа??

Gamer2100 15.10.2007 09:35

В смысле не ошибку а просто прога выходит, после ответа прога завершается, причём не важно какой вопрос третий.
ЗЫ нет, программа вторая:p

Priest 15.10.2007 14:12

Цитата:

Сообщение от Gamer2100 (Сообщение 1470219)
буду его юзать!!!

Нинада!!! Разбирайся с процедурами и функциями, такой код просто нечитаем.

Зачем столько if-ов с одинаковым условием идущих подряд? Если не специально — замени их на конструкцию вида:
Код:

if f = … then begin
  WriteLn(…);
  WriteLn(…);
  …
  WriteLn(…);
end;

Т. о. этот блок должен выглядеть так:
Код:

if f = 'Мордкович' then begin
  WriteLn('Молодец, все слои защиты пройдены, вот мои ники и пароли:');
  WriteLn('"WebMoney"');
  WriteLn('код: 099087336262');           
  WriteLn('пароль: ***');                 
  WriteLn('код доступа к фаилу ключей:***');
  WriteLn('"E-mail"');                     
  WriteLn('login:sergey1993@bk.ru');       
  WriteLn('pass:***');                     
  WriteLn('"Мой сайт"');                   
  WriteLn('login:young-gamedev');         
  WriteLn('pass:***');                     
  WriteLn('"GTAMaps"');                   
  WriteLn('login:X3M-NRG');               
  WriteLn('pass:***');                     
  WriteLn('Есть ещё, но я их забыл.:-('); 
  WriteLn('Вы закончили?');               
end
else begin
  WriteLn('Ошибка. Прощайте.');
  goto 1;
end;

f, кстати, — плохое имя для переменной, лучше использовать «говорящие» имена.

По более раннему вопросу. В коде:
Код:

var x, y: Integer;

x := round(y / 4);

происходит ошибка, т. к. компилятор промежуточное значение операции деления сохраняет в переменную y, а она целочисленная. Через это вот такое выходит. Ergo, вводить временную переменную натурального типа для операции.
Цитата:

Сообщение от Gamer2100 (Сообщение 1470405)
программа вторая

Это, в общем-то, заметно. Повторюсь, вне понятий процедур и функций паскаля не существует. Еще маленько помарализаторствую — структурируй текст, делай отступы.
Цитата:

Сообщение от Gamer2100 (Сообщение 1470405)
просто прога выходит, после ответа прога завершается

Вот видишь. Текст так запутан, что ты сам не можешь понять, где в нем логическая ошибка. И вряд-ли кто-то захочет разбираться в таком коде, если автор сам для себя не сделал его удобным.

Впрочем, с опытом это придет.

Ща я тебе даже накидаю скелет этой твоей проги. Если че — не обессудь, паскаля я уже давно в глаза не видел:
Код:

program Pass;

function AccessGranted: boolean;
begin
  {Здесь асякие вопросы-распросы}
  {Если все ответы верны — присваиваешь функции значение «True»}
end;

function ExitConfirmed: boolean;
var
  Ch: Char;
begin
  while KeyPressed do ReadKey; {чистим буфер клавы}
  WriteLn('Do ya rly wanna to exit (Y/N)?');
  repeat                               
    repeat until KeyPressed;
    Ch := ReadKey;
  until (Ch = #89) or (Ch = #78); {с кодами мог напутать}
  ExitConfirmed := (Ch = #89);
end;

procedure OutPasswords;
begin
  {Здесь вывод паролей}
end;

begin
  repeat
    if AccessGranted then OutPasswords else WriteLn('Ошибка. Покедава.');
  until ExitConfirmed;
end.

Итого, тебе остается только заполнить одну процедуру и одну функцию. Дерзай.

Gamer2100 15.10.2007 22:06

Спасибо, мне уже помогли, советов послушался и код изменил, а ошибка была только в этом:
не
if not (c='Walkman') or (c='walkman')
or (c='Dreamer') or (c='dreamer')
or (c='X3M-NRG') or (c='x3m-nrg')
ндо было писать, а
if not ((c='Walkman') or (c='walkman')
or (c='Dreamer') or (c='dreamer')
or (c='X3M-NRG') or (c='x3m-nrg'))
то-есть всё взять в скобки

добавлено через 46 минут
хех, всё работает, вот финальный вариант:
Код:

program pass;
var a,b,c,d,e,f,g:string;
    p: string;
label 1;
begin
 writeln('Эта программа покажет вам мои пароли, если вы правильно ответите на 3 вопроса.');
 writeln('Готовы?(введите "да" или "нет").');
 readln(a);
 if (a='да') then writeln('Введите дату моего рождения в формате ДД/ММ/ГГГГ')
            else begin
            writeln('Как хотите.');
            goto 1;
            end;
 readln(b);
 if (b='25.12.1993') then writeln('Правильно, теперь введите один из моих ников.')
                    else begin
                    writeln('Ошибка. Прощайте.');
                    goto 1;
                    end;
 readln(c);
 if (c='Walkman') or (c='walkman')
    or (c='Dreamer') or (c='dreamer')
    or (c='X3M-NRG') or (c='x3m-nrg')
    then writeln('Правильно, теперь назовите мой любимый инструмент.')
    else begin
          writeln('Ошибка. Прощайте');
          goto 1;
          end;
 readln(d);
 if (d='begin') or (d='Begin')
    then writeln('Правильно, но это ещё не всё, не думайте что всё так просто, назовите мою любимую актрису(на английском пожалуйста).')
    else begin
          writeln('Ошибка. Прощайте.');
          goto 1;
          end;
readln(e);
if (e='Emma Wotson')
    then writeln('Правильно!!!, Последний(это правда) вопрос. Какая фамилия у человека, составившего учебник по алгебре для 7,8,9 класса?')
    else begin
        writeln('Ошибка. Прощайте.');
        goto 1;
        end;
readln(f);
if (f='Мордкович') then begin
                  writeln('Молодец, все слои защиты пройдены, вот мои ники и пароли:');
 writeln('"WebMoney"');
 writeln('код: 099087336262');
 writeln('пароль:***');
 writeln('код доступа к фаилу ключей:***');
 writeln('"E-mail"');
 writeln('login:sergey1993@bk.ru');
 writeln('pass:***');
 writeln('"Мой сайт"');
 writeln('login:young-gamedev');
 writeln('pass:***');
 writeln('"GTAMaps"');
 writeln('login:X3M-NRG');
 writeln('pass:***');
 writeln('Есть и ещё но я их забыл:-(');
 writeln('Закончили переписывать;-)?');
                        end
                  else begin
                  writeln('Ошибка. Прощайте');
                  goto 1;
                  end;
1: readln(g);
end.


sflash 26.10.2007 14:48

Цитата:

if not ((c='Walkman') or (c='walkman')
or (c='Dreamer') or (c='dreamer')
or (c='X3M-NRG') or (c='x3m-nrg'))
лучше так
c:=UpCase(c); // или UpString давно не юзал дососвский паскаль
if not ((c=('WALKMAN') or (c='DREAMER') or (c='X3M-NRG') )


Далее

Цитата:

if (a='да') then writeln('Введите дату моего рождения в формате ДД/ММ/ГГГГ')
else begin
writeln('Как хотите.');
goto 1;
end;
readln(b);
if (b='25.12.1993') then writeln('Правильно, теперь введите один из моих ников.')
else begin
writeln('Ошибка. Прощайте.');
goto 1;
end;
Запрос идет в формате 'ДД/ММ/ГГГГ' а ответ проверяется в формате 'ДД.ММ.ГГГГ'

И еще одно, но важное - никогда не используй GoTo!!!! Отвыкнешь, сам же спасибо скажешь :beer:

Gamer2100 28.10.2007 12:24

почему?!?!?!?

sflash 26.11.2007 08:35

Если когда нить будешь писать достаточно большой проект. То его надо будет разбить на более мелкие блоки. Их на еще более мелкие. И отлаживать всю программу на 5000+ строк будет ой как тяжело если переходы GOTO идут. А так отладил блок - забыл про него, следующий, а потом используй их в виде процедур и функций. Останется в самой программе всего несколько строк :) См. исходники прог на Delphi.

Твоя прога например может выглядеть так.

function MyQuery1:Boolean
begin
writeln('Готовы?(Введите "да" или "нет").');
readln(a);
if (a='да') then MyQuery1:=True else MyQuery1:=False;
end;

procedure ShowWelcomeMessage;
begin
writeln('Здравствуйте.');
end;

procedure EndError;
begin
writeln('Ошибка. Прощайте.');
Exit;
end;

procedure ShowTrueMessage;
begin
writeln('Все правильно и т.д.');
Exit;
end;

begin
ShowWelcomeMessage; - вывод приветсвия
If Not MyQuery1 then EndError;
If Not MyQuery2 then EndError;
If Not MyQuery3 then EndError;
If Not MyQuery4 then EndError;
If Not MyQuery5 then EndError;
ShowTrueMessage;
end.

вот типа такого наброска и должна выглядеть правильная программа. никаких GOTO. Будут вопросы пиши.

vindows93 10.03.2009 21:35

памагите
 
моя первая прога памагите вылетает

program z;
Var a,b,s:integer;
begin
a:=read;
b:=read;
s:=a+b;
writeln (s);
writeln (s);
end.

как вводить данные и вообще все проги вылетают не тока эта (имею в виду написанные мною на паскале плиз информатичка незнает хелп)

Emelman 11.03.2009 00:29

vindows93, во время вылета программы обычно указывается в какой строке ошибка и её описание. Так ты бы хоть указал их здесь. А по коду программы: по-моему, ты некорректно вводишь данные (если вообще неверно). Правильно будет:
Код:

readln (a);
readln (b);

И не совсем понятно зачем ты выводишь на экран результат суммирования два раза (writeln (s);).

vindows93 11.03.2009 13:25

И не совсем понятно зачем ты выводишь на экран результат суммирования два раза (writeln (s);).
информатичка говорила типа чтобы подольше текст задержать
вводи что угодно всёравно рухает ошибок нет в екзе уже
a:=2 b:=3 нихрена
a=2 b=3 то;t
skdhjdfsbvsdlkfvklsvkjsdbfkjbds тоже самое ентер нажимаешь и крендец

albo 11.03.2009 15:33

вводить надо значения a <enter>, потом b <enter>
например
2
3

добавлено через 1 минуту
задерживать можно той же функцией readln; - надо нажать enter для продолжения

vindows93 11.03.2009 16:15

СПАСИБООО ПОМОГЛО
помагите информатичка задолбала прога нужна но я сам хочу написать
кароче КВАДРАТНОЕ УРАВНЕНИЕ
program z;
Var a,b,d,c,e,f,:integer;
begin
readln (a);
readln (b);
readln (c);
d:=(b*b)-((4*a)*c);
writeln (d);
e:=((b*b)-(sqrt(d)))/(2*a); типа первое значение икс
f:=((b*b)+(sqrt(d)))/(2*a); типа второе
writeln (e);
writeln (f);
happy end.
исправьте ошибку плиз неработает неверное значение неверное выражение неверная структура блин!!!!!!!!!!!!!!!!!!!!!!!!

EvroStandart 11.03.2009 16:34

По одной строке добавлять в программу и компилировать не пробовал?
Тогда сразу будет видно с добавлением какой строки перестаёт работать.

Var a,b,d,c,e,f,:integer;
запятая лишняя :p

vindows93 11.03.2009 17:44

Цитата:

Сообщение от EvroStandart (Сообщение 1639801)
По одной строке добавлять в программу и компилировать не пробовал?
Тогда сразу будет видно с добавлением какой строки перестаёт работать.

Var a,b,d,c,e,f,:integer;
запятая лишняя :p

не в запятой дело из паскаля коп нельзя писал случ поставил блин
не работает она сама

EvroStandart 11.03.2009 17:53

Ну так закомментируй всё и по строчке открывай-запускай.

Emelman 11.03.2009 20:51

vindows93, так как ты опять не указал какую именно ошибку выдаёт компилятор, могу только предположить. Integer - это целочисленное значение, а переменные "e" и "f" у тебя скорее всего получатся дробные (Float). Попробуй пропиши:
Код:

Var a,b,d,c: integer;
e,f: float;

Если не получится, то действительно следуй совету EvroStandart'а (как звучит :biggrin:).
И всё же, ты должен запускать программу из под компилятора, а не готовый exe'шник. А компилятор обычно выдаёт код и описание ошибки. Поэтому будет на много проще тебе помогать, если ты так же будешь здесь указывать эти данные. :contract:

vindows93 11.03.2009 21:24

program z;
Var a,b,d,c,e,f:real;

begin
readln (a);
readln (b);
readln (c);
d:=(b*b)-((4*a)*c);
writeln (d);
e:=((b*b)-(sqrt(d)))/(2*a);
f:=((b*b)+(sqrt(d)))/(2*a);
writeln (e);
writeln (f);
end.

не флоат а реал но всёравно спс
а как условие типа
d>0 то
e:=((b*b)-(sqrt(d)))/(2*a);
f:=((b*b)+(sqrt(d)))/(2*a);
d<0 типа хрен тебе
d=0 то (-b)/(2*a)

плиз срочна чере 12 ч школа и информатика

Emelman 11.03.2009 22:31

Цитата:

Сообщение от vindows93 (Сообщение 1639890)
не флоат а реал

Точно!!! Вот что значит без практики... :rolleyes:
По условию:
Код:

if (d>0) do begin
e:=((b*b)-(sqrt(d)))/(2*a);
f:=((b*b)+(sqrt(d)))/(2*a);
end;
if (d<0) do writeln ('Хрен тебе в обе руки!');
if (d=0) do [какая-нибудь переменная]:=(-b)/(2*a);

С учётом моих последних ошибок, лучше бы чтобы кто-нибудь ещё проверил. ;)

albo 12.03.2009 05:47

скорее
Код:

if d>= 0 then
 begin
 e:=[...]
 writeln(e);
 writeln(f);
 end
else
 Writeln('дискриминант отрицательный');


vindows93 12.03.2009 08:42

Спасибо спасли

добавлено через 4 минуты
Рано обрадовался заболел..
ОШИБКА
if (d>0) do begin неверное выражение

Emelman 12.03.2009 10:03

У меня в голове уже все языки перемешались в кашу. Пишу галиматью и ввожу тебя в заблуждение.
Код:

if d>0 then begin
e:=((b*b)-(sqrt(d)))/(2*a);
f:=((b*b)+(sqrt(d)))/(2*a);
end;
if d<0 then writeln ('Хрен тебе в обе руки!');
if d=0 then [какая-нибудь переменная]:=(-b)/(2*a);

Дабы больше не обманывать, наверное, больше советов давать пока не буду, пока не восстановлю познания языков. :rolleyes:

vindows93 12.03.2009 10:58

program z;
Var a,b,d,c,e,f:real;

begin
readln (a);
readln (b);
readln (c);
d:=(b*b)-((4*a)*c);
writeln (d);
if d>= 0 then
begin
e:=((b*b)-(sqrt(d)))/(2*a);
f:=((b*b)+(sqrt(d)))/(2*a);
writeln(e);
writeln(f);
Writeln('дискриминант отрицательный').
end.
else

if здесь требует елсе или точка с запятой ставил нихрена таже ошибка.......
d=0 then
begin
e:=(-b)/(2*a);
writeln(e);
Writeln('одно решение');
end
else

if d<=0 then
begin
Writeln('дискриминант отрицательный хрен тебе в руки');
end.

памагите напутал с операторами сказано блин надоело уже!!!!
плиз всё проверьте а то !!!!!!!!

Emelman 12.03.2009 12:15

Вот готовая программа:
Код:

program z;
Var a,b,d,c,e,f:real;

begin
readln (a);
readln (b);
readln (c);
d:=(b*b)-((4*a)*c);
writeln (d);
if d>0 then
begin
e:=((b*b)-(sqrt(d)))/(2*a);
f:=((b*b)+(sqrt(d)))/(2*a);
writeln(e);
writeln(f);
Writeln('дискриминант отрицательный');
end;

if d=0 then
begin
e:=(-b)/(2*a);
writeln(e);
Writeln('одно решение');
end;

if d<0 then
Writeln('дискриминант отрицательный хрен тебе в руки');
End.

Только результаты отображаются некрасиво, округлить бы их наверное надо.

albo 12.03.2009 17:19

не надо при условии d>0 писать про отрицательный дискриминант

пробуй выводить результаты так: writeln(e:4:2);

vindows93 12.03.2009 21:40

СПС всем изучать буду ПАСКАЛЬ
ТОКА уже изучил питона и басик !!)

добавлено через 37 минут
в редакторе работает а в екзешнике падает почему???
program z;
Var a,b,d,c,e,f:real;

begin
readln (a);
readln (b);
readln (c);
d:=(b*b)-((4*a)*c);
writeln (d);
if d>0 then
begin
e:=((b*b)-(sqrt(d)))/(2*a);
f:=((b*b)+(sqrt(d)))/(2*a);
writeln(e);
writeln(f);
Writeln('дискриминант отрицательный');
Writeln('дискриминант отрицательный');
end;

if d=0 then
begin
e:=(-b)/(2*a);
writeln(e);
Writeln('одно решение');
Writeln('одно решение');
end;

if d<0 then
Writeln('дискриминант отрицательный !!!!лузер!!!');
Writeln('дискриминант отрицательный !!!!лузер!!!');
End.

albo 13.03.2009 14:00

код ошибки? вообще код неправильный, но падать не должно. разве что при a=0

vindows93 13.03.2009 20:40

ошибки нет просто падает ввёл 666 через ентер и падает
НАПИШИ ПРАВИЛЬНЫЙ КОД ПЛИЗ!!!!!!!

albo 14.03.2009 05:32

Код:

var
 a,b,c,d,x1,x2: Real;

begin
 writeln('Решение квадратных уравнений (ax^2+bx+c=0)');
 write('a=');
 readln(a);
 if a=0 then
  begin
  writeln('это уравнение не является квадратным, a но должно быть равно 0');
  Halt;
  end;
 write('b=');
 readln(b);
 write('c=');
 readln(c);

 d:=(b*b)-((4*a)*c);
 writeln('D=', d:0:2);

 if d>=0 then
  begin
  x1:=((b*b)-(sqrt(d)))/(2*a);
  x2:=((b*b)+(sqrt(d)))/(2*a);
  writeln('x1=', x1:0:2);
  writeln('x2=', x2:0:2);
  end
 else
  writeln('дискриминант отрицательный - нет вещественных решений');
end.


vindows93 14.03.2009 10:54

СПС а чё делает 0:2 вот эти в d x1 x2

Borland 14.03.2009 12:29

Цитата:

Сообщение от vindows93 (Сообщение 1640480)
а чё делает 0:2 вот эти в d x1 x2

Форматирование вывода.


Часовой пояс GMT +4, время: 18:52.

Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.