Помощь - Поиск - Пользователи - Календарь
Полная версия: литеры...я не проходил...а вы?
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
Archie
integer, real, boolean, литеры.
Литеры в операторах ветвления, цикла. Ввод/вывод литерных дан-
ных.Ребят...помогите плиз - я эти литеры не проходил и не знаю даж что это...
Используя только литерный ввод, ввести задан-
ное вещественное число (за ним - пробел), записанное по
правилам языка Паскаль, и присвоить его вещественной
переменной X.
volvo
Цитата
я эти литеры не проходил и не знаю даж что это
Символы это... Char-ы, в смысле...

"используя только литерный ввод" - имеется в виду, что тебе нельзя пользоваться оператором Read/Readln читающим Real, можно читать только по одному символу с консоли...
Archie
ну а кто нить может решитЬ?
volvo
Может... А ты можешь сам хотя бы начать? Если за тебя все решить, тебе что, это как-то поможет?
Archie
я просто даже не представляю...мы такое не делали...лекция по этой теме будет в понедельник а сдать нужно в субботу...йа чо т даж логически не могу додуматься как это сделать
Ozzя
В цикле пока не пробел
читать символ (readkey)
если символ цифра (in '0'..'9') или точка или 'E' или '+' или '-' то
добавить символ в строку
конец цикла
перевести строку в число (val)
У val есть возможность отследить ошибку. (есть примечание от Volvo по поводу глюков/фичей val'а, но я его подзабцл)

Такая задача уже решалась. Ищите.
Archie
Ребят, нужно решить задачу только с использованием того что перечислено. без строк.я не знаю как вообще это решить - завтра сдавать...напишите плис прогу эту...
Айра
Можно приблизительно так:
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
Цитата(Айра @ 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
Айра
Цитата
Что-то не так..

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

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

Исправила))

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

Если б я знала, что это и с чем его едят unsure.gif не проходили мы ето еще, у нас символов вообще еще нет))
Archie
спс.выручили)
Lapp
Цитата(Айра @ 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.
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.