Другие языки программирования и технологии

pascal не выполняет команду read(h);

program calkylator;varc,b,a: real ;h:char;beginread(a);{readln;}read(h);{readln;}if h='+' then begin read(b); c:=a+b; write('=',c:10:4); readln; end;if h='-' then begin read(b); c:=a-b; write('=',c:10:4); readln; end;if h='*' then begin read(b); c:=a*b; write('=',c:10:4); readln; end;if h='/' then begin read(b); c:=a/b; write('=',c:10:4); readln; end;{writeln('');writeln('_____________________');writeln('');writeln (a:5:4,' ',h,' ',b:5:4,' = ',c:5:4);writeln('');writeln('______________________');writeln('');}readln;end.{ума не приложу!почему read(h); не выполняет?а вот если readln; перед и после поставить, то выполняет!!!из-за этого оформление примера сильно падает,(риходится отдельно выписывать....)}
Димон 777
Димон 777
288
да ну паскль слишком строг, я за раздолбаев, я за бэйсик. да и во многом удобней паскаля, при тех же возможностях
artem.polyak.89
artem.polyak.89
9 646
Лучший ответ
Потому что когда ты вводишь число и жмешь энтер - паскаль читает число, затем следующий за ним символ, коим является перевод строки. Считывай строку и производи ее разбор, и будет тебе счастье.
Хм, забавный пример. Никогда на это не обращал внимание.
Чтобы работало как задумано просто замени read(a) и read(h) на readln(a) и readln(h), и всё будет работать.

А прикол, если объяснять на пальцах, вот в чем:
Дело в том, что когда ты вводишь с клавиатуры строку и нажимаешь Enter, то передается не только непосредственно введенная строка, но и сам Enter т. е. спецсимвол с кодом 13, который обозначает снос каретки и не отображается на экране. Так вот, read как бы передает этот самый "лишний" спецсимвол в следующую команду read или readln. А вот readln на этом символе просто останавливается (игнорирует).. . Приведу поясняющий пример:

var
a,b: char;
begin
read(a);
read(b);
writeln('a=',a);
writeln('b=',b);
readln;
end.

Допустим при запуске программы на строке read(a) ввели число 1 и нажали Enter. В этом случае считывается не только 1 но и нажатый Enter. Так вот, так как тип char вмещает в себя только 1 символ, то в переменную a передается первый символ строки т. е. единица, а "невлезающий" в нее Enter посылается в следующую команду read т. е. на строку read(b); и соответственно присваивается переменной b. Поэтому и не будет запроса на ввод b. Если бы мы ввели 12 и нажали Enter, то 1 пошло бы в a, 2 пошло бы в b, а Enter пошел бы в последний readln; и поэтому программа сразу бы завершилась ничего не выводя экран. С типом real то же самое с той лишь разницей, что в него считвается сразу всё введенное число, а не только первый символ, а Enter посылается дальше.. .
В общем, для считывания переменных лучше использовать readln, а не read :) С ним таких заморочек нет.
AA
Aldiar Abilov
8 596
Я тебе вот что скажу - у тебя много муссора. Напиши так и уже будет красивее!
program calkylator;
uses crt;
var
c,b,a: real ;
h:char;
begin
ClrScr;
Write('a -> '); readln(a);
Write('Znak -> ); readln(h);
Write('b -> '); Readln(b);
writeln;
if h='+' c:=a+b;
if h='-' c:=a-b;
if h='*' c:=a*b;
if h='/' c:=a*b;
writeln (a:5:4,h,b:5:4,'=',c:5:4);
Readkey;
end.
И писанины меньше и зачем столько кавычек просто так? И зачем было описывать одни и те же действия четыре раза?
Насихат *
Насихат *
1 830
Можно пойти в раздел СЕРВИС, НАСТРОЙКИ, там поле пути куда сохраняется временный образ программы; здесь поменять путь с корневой папки на какую-нибудь свою. У меня заработало сразу.