Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Задачи _ литеры...я не проходил...а вы?

Автор: Archie 18.10.2007 0:16

integer, real, boolean, литеры.
Литеры в операторах ветвления, цикла. Ввод/вывод литерных дан-
ных.Ребят...помогите плиз - я эти литеры не проходил и не знаю даж что это...
Используя только литерный ввод, ввести задан-
ное вещественное число (за ним - пробел), записанное по
правилам языка Паскаль, и присвоить его вещественной
переменной X.

Автор: volvo 18.10.2007 0:47

Цитата
я эти литеры не проходил и не знаю даж что это
Символы это... Char-ы, в смысле...

"используя только литерный ввод" - имеется в виду, что тебе нельзя пользоваться оператором Read/Readln читающим Real, можно читать только по одному символу с консоли...

Автор: Archie 18.10.2007 2:23

ну а кто нить может решитЬ?

Автор: volvo 18.10.2007 2:28

Может... А ты можешь сам хотя бы начать? Если за тебя все решить, тебе что, это как-то поможет?

Автор: Archie 18.10.2007 2:42

я просто даже не представляю...мы такое не делали...лекция по этой теме будет в понедельник а сдать нужно в субботу...йа чо т даж логически не могу додуматься как это сделать

Автор: Ozzя 19.10.2007 13:07

В цикле пока не пробел
читать символ (readkey)
если символ цифра (in '0'..'9') или точка или 'E' или '+' или '-' то
добавить символ в строку
конец цикла
перевести строку в число (val)
У val есть возможность отследить ошибку. (есть примечание от Volvo по поводу глюков/фичей val'а, но я его подзабцл)

Такая задача уже решалась. Ищите.

Автор: Archie 19.10.2007 19:59

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

Автор: Айра 19.10.2007 23:24

Можно приблизительно так:

var ch: char;
x,d: real;
f: boolean;
begin
x:=0;
f:=false;
d:=0.1;
while ch<>' ' do
begin
readln(ch);
if ch='-' then d:=d*(-1);
case ch of
'0': x:=x*10+0;
'1': x:=x*10+1;
'2': x:=x*10+2;
'3': x:=x*10+3;
'4': x:=x*10+4;
'5': x:=x*10+5;
'6': x:=x*10+6;
'7': x:=x*10+7;
'8': x:=x*10+8;
'9': x:=x*10+9;
end;
if f then d:=d*10;
if (ch='.') or (ch=',') then f:=true;
end;
if f then x:=x/d; //исправлено
writeln(x:6:4);
end.

Автор: Lapp 20.10.2007 16:09

Цитата(Айра @ 19.10.2007 20:24) *

Можно приблизительно так:

Вот результат работы твоей программы:
Код
Running "h:\home\ak\_pas\h\h048\h048.exe "
1
2
3

1230.0000

Что-то не так.. sad.gif

А что, ReadKey тоже нельзя использовать? blink.gif Некрасиво выходит... sad.gif

Автор: Айра 20.10.2007 20:52

Цитата
Что-то не так..

Я даже знаю что wink.gif
x:=x/d;

надо заменить на
if f then  x:=x/d;

Исправила))

Цитата
А что, ReadKey тоже нельзя использовать? Некрасиво выходит...

Если б я знала, что это и с чем его едят unsure.gif не проходили мы ето еще, у нас символов вообще еще нет))

Автор: Archie 21.10.2007 20:17

спс.выручили)

Автор: Lapp 22.10.2007 2:44

Цитата(Айра @ 20.10.2007 17:52) *

Если б я знала, что это и с чем его едят

Это совсем нетрудно. Посмотри, я немного модифицировал твою программку.. До кучи, ввел простенькую диагностику ошибок.
Обрати внимание на использование CRT
uses
CRT;

var
ch: char;
x,d: real;
e,f,g: boolean;

begin
x:=0;
e:=false;
f:=false;
g:=false;
d:=10;
repeat
ch:=ReadKey;
Write(ch);
case ch of
'0'..'9': x:=x*10+Ord(ch)-48;
'.': if f then e:=true else f:=true;
'-': if g then e:=true else d:=-d;
' ': break;
else e:=true
end;
if f then d:=d*0.1;
g:=true;
until false;
if f then x:=x*d;
if e then WriteLn('Error') else WriteLn(x:6:4);
ReadLn
end.