Помощь - Поиск - Пользователи - Календарь
Полная версия: 4+4=8
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
Rossi
При в воде на экрна 4+4 после нажатия на ентер все должно посщитатся и вывести в таком формате 4+4=8.
Правильно ли я реализовал эту программу ?
uses crt;
var a,b,s,c:integer;
	begin
	write('>'); readln(a,c,b);
	write(a);
	s:=a+b;
		case c of
		'+':write('+');
		end;
	write(b);	
	writeln('=',s);
	end.
Urnix
Цитата(Rossi @ 20.06.2007 17:14) *

Правильно ли я реализовал эту программу ?

Так и быть поработаю debug'ером: ERROR 74: Constant and CASE types do not match.
Rossi
Цитата(Urnix @ 20.06.2007 17:29) *

Так и быть поработаю debug'ером: ERROR 74: Constant and CASE types do not match.

???
compiler
Цитата(Rossi @ 20.06.2007 16:37) *
???
добавь еще варианты или используй if ... then...
Rossi
Ошибку нашел... забыл c:char;
program pas;
uses crt;
var
a,b,s:integer;
c:char;
begin
write('>'); readln(a,c,b);
write(a);
case c of
'+':write('+');
end;
write(b);
s:=a+b;
writeln('=',s);
end.
всеравно почемута не работает пишет invalid mega_chok.gif
compiler
вводится всегда буде с однозначные числа?
Rossi
Да.
compiler
и всегда использываться операция сложения?
volvo
Цитата
всеравно почемута не работает
Потому, что ты наверняка вводишь так: Число+Число, т.е., между числом и знаком пробела нет... Так не пойдет, компилятор читает число до первого символа табуляции (пробел или #9 или #13). То есть, единственный вариант для тебя -

program pas;
uses crt;
var
  a,b,s:integer;
  c, ch:char;
begin
  write('>');
  read(a); { <-- Читаешь первое число }
  read(ch, c); { <-- пробел между первым числом и знаком, и сам знак }
  readln(ch, b); { <-- пробел между знаком и вторым числом и второе число }

  write(a);
  case c of
    '+':write('+');
  end;
  write(b);
  s:=a+b;
  writeln('=',s);
end.


Вводить надо, соответственно, с пробелами:
2 + 3

P.S. Если с учетом последнего поста, то читать введенные числа в виде символов, и обрабатывать их через Ord(a) - Ord('0') ...
compiler
Цитата(volvo @ 20.06.2007 17:01) *

P.S. Если с учетом последнего поста, то читать введенные числа в виде символов, и обрабатывать их через Ord(a) - Ord('0') ...

Э, это моя идея :lol:
вот код
uses crt;
var s:integer;
c,a,b:char;
begin
	write('>'); 
	a:=readkey; write(a);
	c:=readkey;write( с );    //что с ним делать незнаю :)
	b:=readkey;write(b);
	s:=ord(a) + ord(b)-(48*2); //до Ord('0') не додумался :(
	writeln('=',s);
	readln;
	read;
end.

Urnix
А я бы сделал так

uses crt;
const
  GoodChars =  ['0'..'9','+','-','*','/','.'];
  ActionChars =  ['+','-','*','/'];
var
  s:string;
  error:boolean;
  i,ActionNum,val_err:integer;
  ActionChar:char;
  a,b:real;
begin
  clrscr;
  writeln('vvedite arifmeticheskoe virazhenie:');
  readln(s);
  clrscr;
  error:=false;
  for i:=1 to length(s) do
    if not (s[i] in GoodChars)
      then error:=true;
  ActionNum:=0;
  for i:=1 to length(s) do
    if s[i] in ActionChars
      then
        begin
          ActionChar:=s[i];
          inc(ActionNum);
        end;
  if (ActionNum<>1) or (pos(ActionChar,s)=1) or (pos(ActionChar,s)=length(s))
    then error:=true;
  if not error
    then
      begin
        val(copy(s,1,pos(ActionChar,s)-1),a,val_err);
        val(copy(s,pos(ActionChar,s)+1,length(s)-pos(ActionChar,s)),b,val_err);
        case ActionChar of
          '+': writeln(s,'=',a+b:1:2);
          '-': writeln(s,'=',a-b:1:2);
          '*': writeln(s,'=',a*b:1:2);
          '/': if b=0
                 then writeln('na nol delit'' nel''za')
                 else writeln(s,'=',a/b:5:2);
        end;
      end
    else  writeln('Vvedenniy tekst ne yavlaetsa arifmeticheskim virazheniem');
  readln;
end.

//это для общего случая
Rossi
Спасибо огромнишое всем!!!
Теперь у меня появился вопрос что такое read? lol.gif
хз мне преподователь про него нечего не говорил хммм(((
volvo
Цитата
это моя идея
Я и не присваивал... А вот реализовал ты свою идею из рук вон плохо: зачем лишил пользователя возможности редактировать строку при ее вводе? Что, нельзя было сделать так:

program pas;
uses crt;
var
s:integer;
a, b, c:char;
begin
  write('>');
  readln(a, c, b);
  write(a);
  case c of
    '+':write('+');
  end;
  write(b);
  s:=ord(a)+ord(b) - 2*ord('0');
  writeln('=',s);
end.



?
compiler
Цитата(Rossi @ 20.06.2007 17:14) *
Теперь у меня появился вопрос что такое read
справка в помощ... вообще это readln без перевода каретки...


Добавлено через 7 мин.
Цитата(volvo @ 20.06.2007 17:16) *
Я и не присваивал...
там же был смайлик
Цитата(volvo @ 20.06.2007 17:16) *
зачем лишил пользователя возможности редактировать строку при ее вводе?

зато не надо вводить с пробелами...
Цитата(volvo @ 20.06.2007 17:16) *
Что, нельзя было сделать так:
как то программка твоя не коректно работает...
volvo
Цитата
как то программка твоя не коректно работает...
Ты еще не научился? Я больше повторять не буду - я голословные заявления НЕ принимаю! Как значения вводишь, то и получаешь. Больше мне сказать нечего (пока нет примеров ввода вывода)... А как будет пример - я ЕГО же протестирую на ТВОЕЙ программе, договорились? А потом приведу СВОЙ пример некорректной работы ТВОЕЙ программы (заметь, начал ТЫ. dry.gif )
Urnix
Цитата(compiler @ 20.06.2007 18:16) *

как то программка твоя не коректно работает...


Цитата(volvo @ 20.06.2007 18:30) *

Ты еще не научился? Я больше повторять не буду - я голословные заявления НЕ принимаю! Как значения вводишь, то и получаешь. Больше мне сказать нечего (пока нет примеров ввода вывода)... А как будет пример - я ЕГО же протестирую на ТВОЕЙ программе, договорились? А потом приведу СВОЙ пример некорректной работы ТВОЕЙ программы (заметь, начал ТЫ. dry.gif )


Ребята вы загнались, и я тоже.

Вот такая фигня вполне будет работать...

var
  s:string;
  val_err:integer;
  a,b:byte;
begin
  write('>');
  readln(s);
  val(s[1],a,val_err);
  val(s[3],b,val_err);
  writeln(s,'=',a+b);
  readln;
end.



А ведь забавно: завести тему и устроить в ней дисскуссию на предмет "как решить в Паскале 4+4", хорошо, хоть не 2+2 lol.gif
compiler
Цитата(volvo @ 20.06.2007 17:30) *
Как значения вводишь, то и получаешь. Больше мне сказать нечего (пока нет примеров ввода вывода)...
пример в названии темы(только с пробелами иначе не работает) ввожу 4 + 4 получаю 4+=-1(не выводится второе число+ неправильный результат (чесно говоря сам не зная почему))
Цитата(volvo @ 20.06.2007 17:30) *
А как будет пример - я ЕГО же протестирую на ТВОЕЙ программе, договорились?
договорились smile.gif только без пробелов
Цитата(volvo @ 20.06.2007 17:30) *
А потом приведу СВОЙ пример некорректной работы ТВОЕЙ программы
жду...
Цитата(volvo @ 20.06.2007 17:30) *
(заметь, начал ТЫ. dry.gif )
что начал?
Rossi
Воть подумал можно ли модефицировть нашу программку от volva с помощью if и then ?
compiler
Цитата(Urnix @ 20.06.2007 17:35) *
Ребята вы загнались, и я тоже.
я пока не нашел число что б получить не верный результат(если использовать сложение и положительные числа да десяти) жду...
Цитата(Urnix @ 20.06.2007 17:35) *
А ведь забавно: завести тему и устроить в ней дисскуссию на предмет "как решить в Паскале 4+4", хорошо, хоть не 2+2 lol.gif
smile.gif


Добавлено через 2 мин.
Цитата(Rossi @ 20.06.2007 17:45) *
Воть подумал можно ли модефицировть нашу программку от volva с помощью if и then ?
пишеш
if c='+' then write('+');

volvo
Цитата
только с пробелами иначе не работает
Очень интересно... Тогда смотри сюда:
Нажмите для просмотра прикрепленного файла

А в своем примере набери 3, потом подними глаза выше, посмотри на название темы, и попробуй сделать так, чтобы посчиталось 4+4 ...

P.S.
Цитата
договорились только без пробелов
То есть, МОЮ программу, которая выполняет ТО ЖЕ самое, что и твоя (и это написано в посте №13), только с сохранением возможности редактирования, ты гоняешь с пробелами, и когда она не работает, ты меня в это тыкаешь носом, а когда ТВОЯ программа не работает по той же (да и не только, см. выше) причине - то это ее несомненный плюс?
compiler
я тестировал твою программу с пробелами(как было сказано в 9 посте)...
Цитата(volvo @ 20.06.2007 17:50) *
не работает... да и не только
вторая причина не есть причина по которой она не работает... возможность редактирования может и хорошо, но необезательна(см. заданее)...

думаю тема закрыта... четыре сложили с четырьмя smile.gif
Malice
Вот так я думаю вернее будет yes2.gif
var s:string;
begin
write ('>');
readln (s);
while pos (' ',s)>0 do delete (s,pos(' ',s),1);
if s='4+4' then writeln ('4 + 4 = ', 4+4) else
writeln ('Введенные данные не соответствуют заданию..');
end.

lol.gif
Fanat
Извините,не удержался...
Malice,тогда проверить ещё не мешало бы, что 4+4=8... respect2.gif ...
Rossi
Народ воть я и доработал калькулятор терь он умнажает че хош кароче делает )))
Мне не много помог преподовтель мой ^_^.
Как вам реализация ???
program cal;
uses crt;
var
   code:integer;
   sa,sb,s:string;
   f,a,b:real;
   c:byte;
begin
  textcolor(2);
  clrscr;

  write('>');
  readln(s);
  if pos('+',s)<>0 then c:=pos('+',s);
  if pos('-',s)<>0 then c:=pos('-',s);
  if pos('*',s)<>0 then c:=pos('*',s);
  if pos('/',s)<>0 then c:=pos('/',s);

  sa:=copy(s,1,c-1);
  sb:=copy(s,c+1,length(s)-c);

  val(sa,a,code);
  val(sb,b,code);

  write(sa);

  case s[c] of
    '+':f:=a+b;
    '-':f:=a-b;
    '*':f:=a*b;
    '/':f:=a/b;
  end;
  writeln(s[c],sb,'=',f:1:2);
  readkey;
end.

Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.