Помогите найти ошибку в коде

**

  1. Задача из Книги Песни о Паскале:

** Подойдя к перекрестку, пешеход решает, переходить ли ему улицу или остановиться. На решение влияет характер пешехода и ещё два фактора: сигнал светофора и близость опасно движущегося транспорта. Напишите программу с процедурой, которая принимает и печатает решение в зависимости от переданных в неё трех параметров, а именно. · Параметр A = true, если горит зеленый; · Параметр B = true, если поблизости опасно движется транспорт; · Параметр C – это число, определяющее характер пешехода так: 1 - послушный и осторожный — учитывает и светофор и опасность; 2 - послушный, но беспечный — смотрит только на светофор; 3 - хитрый вольнодумец — идет только на красный, если это ничем не грозит; 4 - непримиримый вольнодумец — идет только на красный; 5 - экстремал — идет только на красный, и так, чтобы грозила опасность; 6 - «безбашенный» — идет, несмотря ни на что; 7 - запуганный — никогда не идет через дорогу, а ищет подземный переход. А вот код: Program Пешеход; var A,B,N,M:boolean; C:integer; s:string; t:string; d:string; procedure perehod(A:boolean;B:boolean;C:integer;s:string;t:string;N:boolean;d:string;M:boolean); begin If s=‘Зеленый’ then begin A:=True; end; if (s=‘Красный’) or (s=‘Желтый’) then begin A:=False; end; If (t=‘движется транспорт’) or (t=‘едет машина’) or (t=‘едет автомобиль’) then begin B:=true; end; If (t=‘не движется транспорт’) or (t=‘не едет машине’) or (t=‘не едет автомобиль’) then begin B:=False; end; If (d=‘переходит’) or (d=‘да’) then begin N:=true; end; If (d=‘не переходит’) or (d=‘нет’) then //1)(not A and not B and not N) O:=‘Послушный и осторожный учитывает и светофор и опасность’// begin N:=False; end; while C<=7 do begin case C of 1:begin M:=(not A and B and not N); writeln(‘Послушный и осторожный. Учитывает и светофор и опасность.’); end; 2: begin M:=(A and B and N); writeln(‘Послушный, но беспечный. Учитывает только светофор.’); end; 3: begin M:=(not A and not B and N); writeln(‘Хитрый и вольнодумец. Идет на красный, если нет транспорта.’); end; 4: begin M:=(not A) and (B or not B) and (N); writeln(‘Непримермый вольнодумец. Идет только на красный.’); end; 5:begin M:= (not A and B and N); writeln(‘Экмтремал. Идет на красный и так чтобы грозила опасность’); end; 6:begin M:=((A or not A) and (B or not B) and (N)); writeln(‘Безбашенный. Идет несмотря ни начто.’); end; 7:begin M:=((A or not A) and (B or not B) and (not N)); writeln(‘Запуганный. Пользуестя подземным переходом.’); end; end; end; end; begin writeln(‘Какой знак светофора горит?’); readln(s); writeln(‘Движется ли опасный транспорт?’); readln(t); Writeln(‘Введите цифру определяющую характер пшехода.’); readln(d); perehod(A,B,C,s,t,d,N,M); readln; end. Ошибка такая: нельзя преобразовать тип string к boolean. Как исправить эту ошибку?

Порядок неправильный в вызове функции, нужно написать так: perehod(A,B,C,s,t,N,d,M);

Спасибо.Эта ошибка устранена. Теперь другая ошибка: Программа задает вопросы и получает ответы, а конечный результат не выводит. Цикл while я убрал. Где-то алгоритмическая ошибка.

Здравствуйте.Возможно ошибка вот в чем. У вас в коде есть такие строчки. Writeln(‘Введите цифру определяющую характер пшехода.’); readln(d); хотя за характер пешехода отвечает параметр С,тем более как я понял из вашего кода вы хотите сделать параметр d как решение задачи,такой вывод я сделал из вот этих строчек If (d=‘переходит’) or (d=‘да’) then begin N:=true; end; If (d=‘не переходит’) or (d=‘нет’) then //1)(not A and not B and not N) O:=‘Послушный и осторожный учитывает и светофор и опасность’// begin N:=False; end; ибо вопрос задачи перейдет или нет.Отсюда ошибки следующие:видимо для вашей процедуры нужно лишь 3 входных параметра описанных в задаче,а выходным параметром будет число 0 или 1,которое будет говорить о том переходит ли пешеход дорогу или нет.

и еще если вы уберете цикл while,то как же будет работать добрая часть кода с case ибо С нигде не инициализируется и case попросту не отработает.

Спасибо за ответ. Вот я ее уже написал но только для четырех действий пешехода.Программа работает. Остальные три я не знаю как определить. Эти три параметра следующие: 1)Идет на красный независимо от движения транспорта; 2) Идет при любом цвете светофора и движении либо отсутствии транспорта; 3) Не идет при любом раскладе. Цикл while убрал. Program Пешеход; var A,B,N:boolean;//логические переменные цвет светофора, едет ли автомобиль и идет ли пешеход// C:integer;//число определяющее характер пешехода// cvet:string; avto:string; pesh:string; H:string; procedure perehod (A:boolean;B:boolean;N:boolean;C:integer); begin If cvet=‘зеленый’ then A:=True; If cvet=‘красный’ then A:=False; Writeln(A); If avto=‘да’ then B:=True; If avto=‘нет’ then B:=False; Writeln(B); If pesh = ‘да’ then N:=true; If pesh = ‘нет’ then N:= false; Writeln(N); If (not A and B and not N) then C:=1; If (A and B and N) then C:=2; If (not A and not B and N) then C:=3; If (not A and B and N) then C:=4; Case C of 1:H:=(‘послушный и осторожный — учитывает и светофор и опасность.’); 2:H:=(‘послушный, но беспечный — смотрит только на светофор.’); 3:H:=(‘хитрый вольнодумец — идет только на красный, если это ничем не грозит.’); 4:H:=(‘экстремал — идет только на красный, и так, чтобы грозила опасность.’); end; end; begin writeln(‘Какой сигнал светофора красный или зеленый?’); readln(cvet); writeln(‘Движется ли машина?’); readln(avto); Writeln(‘Идет ли пещеход?’); readln(pesh); perehod(A,B,N,C); writeln(H); end.

Мне кажется вы не совсем правильно поняли задачу,у вас параметр С как вычисляемый,а он у вас должен быть входным.Обратите внимание на вот эти строчки задачи "Напишите программу с процедурой, которая принимает и печатает решение в зависимости от переданных в неё трех параметров, а именно…"Решение относительно того,будет переходить через дорогу или нет. т.е ваша процедура принимает 3 параметра A,B,C потом посредством case через селектор С,вы работаете с конкретным типажом пешехода и для каждого типажа пишете код,где на выходе будет только фраза или число означающая переходит ли дорогу или нет. Если не прав поправьте.

В принципе да. Как это на практике реализовать? Это число С должен пользователь вводить? И как быть с логическими выражениями в данном случае?

Число С будет вводить пользователь.работать будем через case.Входить в процедуру будем от 3 параметров. Будет нечто такое. К примеру А=1, В=0,а С=1 то в case вы провалимся по 1(ибо С=1),а проверка будет такой if A=1 and B=0 then writeln(‘Переходит’); else writeln(‘Не переходит’); Поясню,1 типаж согласно которому пешеход переходит на Зеленый и только когда нет машин,ибо написано “послушный и осторожный — учитывает и светофор и опасность;” мы это и проверили.И так со всеми 7-ю типажами.

То есть мы привязываем A- светофор, B-машина, которая едет или едет и C- пешеход, который переходит или не переходит. А вы 4-й, 6-й и 7-й типаж напишите пожалуйста.

Я постараюсь написать. Я кажется понял.

4: if (A=0) then writeln(‘Переходит’); else writeln(‘Не переходит’); 6:writeln(‘Переходит’); 7:writeln(‘Не переходит.Ищет подземный переход’);

Да,вы правильно поняли.

Вот это наверное: Program Пещеход_2; var A,B:Boolean; C:integer; Procedure perehod(A:boolean;B:boolean;C:integer); begin case C of 1:if (A=False) and (B=true) then writeln(‘Не переходит.’); 2:If (A=True) and (B=False) then writeln(‘Переходит.’); 3:If (A=False) and (B=False) then writeln(‘Переходит.’); 4:If (A=False) then writeln(‘Переходит’) else writeln(‘Не переходит.’); 5:If (A=False) and (B=True) then writeln(‘Переходит’); 6:writeln(‘Переходит’); 7:writeln(‘Переходи’); end end; begin Writeln(‘Введите цифру определяющую характер пешехода.От одного до 7’); Readln©; perehod(A,B,C); end.

Там в 7-м ошибка была. Program Пещеход_2; var A,B:Boolean; C:integer; Procedure perehod(A:boolean;B:boolean;C:integer); begin case C of 1:if (A=False) and (B=true) then writeln(‘Не переходит.’); 2:If (A=True) and (B=False) then writeln(‘Переходит.’); 3:If (A=False) and (B=False) then writeln(‘Переходит.’); 4:If (A=False) then writeln(‘Переходит’) else writeln(‘Не переходит.’); 5:If (A=False) and (B=True) then writeln(‘Переходит’); 6:writeln(‘Переходит’); 7:writeln(‘Не Переходи’); end end; begin Writeln(‘Введите цифру определяющую характер пешехода.От одного до 7’); Readln©; perehod(A,B,C); end.

да,речь шла об этом,только я не понял почему для 1,2,3,5 типажей сделано не полное ветвление.Не могли бы вы пояснить почему именно так написали?

Можно доделать.

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

Ну только так я думаю: Program Пещеход_2; var A,B:Boolean; C:integer; Procedure perehod(A:boolean;B:boolean;C:integer); begin case C of 1:if (A=False) and (B=true) then writeln(‘Не переходит.’) else writeln(‘Переходит.’); 2:If (A=True) and (B=False) then writeln(‘Переходит.’) else writeln (‘Не переходит.’); 3:If (A=False) and (B=False) then writeln(‘Переходит.’) else writeln (‘Не переходит’); 4:If (A=False) then writeln(‘Переходит’) else writeln(‘Не переходит.’); 5:If (A=False) and (B=True) then writeln(‘Переходит’) else writeln(‘Не переходит.’); 6:writeln(‘Переходит’); 7:writeln(‘Не Переходит’); end end; begin Writeln(‘Введите цифру определяющую характер пешехода.От одного до 7’); Readln©; perehod(A,B,C); end

я решил уже переделать блок case сам,ибо есть ошибки,думаю так будет проще. 1:if (A=True) and (B=False) then writeln(‘Переходит.’) else writeln(‘Не переходит.’); 2:If (A=True) then writeln(‘Переходит.’) else writeln (‘Не переходит.’); 3:If (A=False) and (B=False) then writeln(‘Переходит.’) else writeln (‘Не переходит’); 4:If (A=False) then writeln(‘Переходит’) else writeln(‘Не переходит.’); 5:If (A=False) and (B=True) then writeln(‘Переходит’) else writeln(‘Не переходит.’); 6:writeln(‘Переходит’); 7:writeln(‘Не Переходит’);