Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 20.03.2012, 15:12   #1
Nataly026
Пользователь
 
Регистрация: 17.12.2011
Сообщений: 12
Печаль Проверка на ввод целых чисел в Паскале посимвольно

Написана программа вычисления суммы/разницы целых чисел с рекурсией (например, "99+23-3+48="). Помогите пожалуйста добавить проверку на посимвольный ввод именно целых чисел(от 0 до 999) и знаков "+" и "-". Конец ввода - "=". У меня только для чисел от 0 до 9 получается...
Код:
uses crt;
function Calculate(s: string): integer;
begin
if Length(s)=1 then Calculate:= Ord(s[1])-Ord('0')
else case s[Length(s)-1] of
'+': Calculate:= Calculate(Copy(s,1,Length(s)-2))+Ord(s[Length(s)])-Ord('0');
'-': Calculate:= Calculate(Copy(s,1,Length(s)-2))-Ord(s[Length(s)])+Ord('0');
end
end;
var
Str: string;
Chr: char;
begin
repeat
read(Chr);
Str:=Str+Chr;
until (Chr = '=');
writeln('Введенное выражение: ', Str);
str:= copy(str,1,length(str)-1); {убрали =}
writeln('Результат: ', Calculate(Str));
end.


___________
Код нужно оформлять по правилам:
тегом [CODE]..[/СODE] (это кнопочка с решёточкой #)
Не забывайте об этом!
Модератор.

Последний раз редактировалось Serge_Bliznykov; 20.03.2012 в 16:21.
Nataly026 вне форума Ответить с цитированием
Старый 20.03.2012, 17:17   #2
ByAlex
Форумчанин
 
Аватар для ByAlex
 
Регистрация: 15.03.2011
Сообщений: 465
По умолчанию

Начиная с начала строки проверяешь на правильность ввода. Если символ не лежит в нужных диапазонах, то выводишь сообщение.
Код:
var
   Symbols:set of char;
begin
   Symbols:=['+','-','='];
   if (not (str[i] in ['0'..'9'])) or (not (str[i] in Symbols)) then
      вывод ошибки.
   ...
end;
Помог - жми на весы!
ByAlex89@mail.ru
ByAlex вне форума Ответить с цитированием
Старый 20.03.2012, 19:37   #3
Plague
Забанен
Форумчанин Подтвердите свой е-майл
 
Аватар для Plague
 
Регистрация: 01.11.2006
Сообщений: 420
По умолчанию

не знаю нужна ли тут посивольная проверка на ввод строки.
но я бы предложил такой вариант решения задачи с рекурсией:
Код:
const d='-+'; 
function f(s:string):longint;
var i,a:longint;
    err:integer;
begin
  if s='' then f:=0 else
  if pos('+',s)+pos('-',s)<1 then 
      begin
        val(s,a,err); // f:=strtoint(s);
        f:=a;
       end
    else 
      begin
        i:=length(s);
        repeat dec(i);until pos(s[i],d)>0;
        val(copy(s,i,length(s)-i+1),a,err);        
        f:=f(copy(s,1,i-1))+a; //+strtoint(copy(s,i,length(s)-i+1));
      end;
end;
begin
  writeln(f('11+121-231+11-442+1-23-9-92'));
end.
Если ничто другое не помогает, прочтите, наконец, инструкцию! Аксиома Кана
Plague вне форума Ответить с цитированием
Старый 21.03.2012, 16:15   #4
Nataly026
Пользователь
 
Регистрация: 17.12.2011
Сообщений: 12
По умолчанию

Цитата:
Сообщение от Plague Посмотреть сообщение
не знаю нужна ли тут посивольная проверка на ввод строки.
но я бы предложил такой вариант решения задачи с рекурсией:
Код:
...   begin
        i:=length(s);
        repeat dec(i);until pos(s[i],d)>0;
        val(copy(s,i,length(s)-i+1),a,err);        
        f:=f(copy(s,1,i-1))+a;
      end;
Может я не понимаю, но тут только "+ а". А вычитание?


Извините, протупила - я разобралась с отр.числами...

Последний раз редактировалось Nataly026; 21.03.2012 в 17:02.
Nataly026 вне форума Ответить с цитированием
Старый 21.03.2012, 17:11   #5
Plague
Забанен
Форумчанин Подтвердите свой е-майл
 
Аватар для Plague
 
Регистрация: 01.11.2006
Сообщений: 420
По умолчанию

+(-231) сколько будет?
Если ничто другое не помогает, прочтите, наконец, инструкцию! Аксиома Кана
Plague вне форума Ответить с цитированием
Старый 21.03.2012, 23:44   #6
ByAlex
Форумчанин
 
Аватар для ByAlex
 
Регистрация: 15.03.2011
Сообщений: 465
По умолчанию

Цитата:
Сообщение от Plague Посмотреть сообщение
не знаю нужна ли тут посивольная проверка на ввод строки.
Посимвольная проверка в таких программах обязательна, так как в строке для расчетов не должно быть ничего, кроме таких символов как - ('.','/','*','+','-','(',')','%','^' ... и так далее). Если в строке будет не нужный символ, то программа просто тупанет и все, считать не будет.
Помог - жми на весы!
ByAlex89@mail.ru
ByAlex вне форума Ответить с цитированием
Старый 22.03.2012, 08:47   #7
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

ByAlex,
во-первых, откуда Вы столько знаков набрали то?! В исходной задаче допускается только плюс и минус!
а во-вторых, достаточно в коде, предложенном Plague добавить две проверки на то, что переменная err не равна нулю, как мы "автоматически" получим контроль на то, что введены допустимые символы.
в-третьих, пройтись по строке, проверяя, что она состоит только из нужных символов - это дело одной минуты программирования (я тут пост дольше пишу, чем код проверки писать)

p.s. правда, конечно, это будет не проверка в процессе ввода...

p.p.s. могу набросать код ввода строки, с разрешением ввода только правильных символов, это элементарно!

Последний раз редактировалось Serge_Bliznykov; 22.03.2012 в 08:49.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 22.03.2012, 19:02   #8
ByAlex
Форумчанин
 
Аватар для ByAlex
 
Регистрация: 15.03.2011
Сообщений: 465
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
ByAlex,
во-первых, откуда Вы столько знаков набрали то?! В исходной задаче допускается только плюс и минус!
Я имел ввиду программы подобного содержания, там же не только + и -, а много много всяких действий производится. Но посимвольная проверка все равно необходима в таких прогах, если, конечно, не ведется контроль на правильность введенных символов в процессе ввода(можно разрешать ввод только разрешенных символов). А в данном случае программа простая.
Помог - жми на весы!
ByAlex89@mail.ru
ByAlex вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Найти количество положительных чисел среди четырёх целых чисел. teac2011 Помощь студентам 0 01.12.2011 19:58
Дана последовательность вещественных чисел. каждая пара чисел задает границы отрезка. Найти количество целых чисел на отрезках 'studentka' Помощь студентам 6 30.11.2011 18:35
Задание с циклами: ввод и проверка чисел.(Pascal) swillrocker Помощь студентам 4 04.05.2011 20:37
Ввод с клавиатуры целых десятичных чисел Илья555 Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 0 26.04.2011 09:12
Сложение двух десятичных положительных чисел. целых чисел))) PEro_man Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 6 01.12.2010 12:40