program calc;
var c, stroka: real;
a, b:integer;
const
a1=a+b;
begin
writeln ('Samii primitivnii kalkulator!!!');
write ('>>>');
read (stroka);
if stroka=a1 then
BEGIN
C:=a+b;
writeln ('>>>',C,'');
readln (C);
end;
if stroka=a-b then
BEGIN
C:=a-b;
writeln ('>>>',C,'');
readln (C);
end;
if stroka=a/b then
BEGIN
C:=a/b;
writeln ('>>>',C,'');
readln (C);
end;
if stroka=a*b then
BEGIN
C:=a*b;
writeln ('>>>',C,'');
readln (C);
end;
end.
Помогите, плз
у меня короч проблема с ниписанием обычного калькулятора...
1. В разделе Const должны быть определены константы.
Const
pi=3.14;
dx=10;
...
У тебя же мы видим какие-то переменные: a1,a,b
2. Лучше все же для начала написать парсер выражений, строящий деревья, а потом уже от узла к узлу выполнять арифметические действия.
3. Переменные a,b нигде не объявлены.
Если я где-то не прав, то не пинайте.
Код:
[FONT=Courier New]program z1;
uses crt;[/FONT]
[FONT=Courier New]var op1, op2, result : real;
chOp : char;[/FONT]
[FONT=Courier New]begin
clrscr;
write([COLOR=blue]'Enter, please, first operand: '[/COLOR]);
readln(op1);
write([COLOR=blue]'Enter, please, second operand: '[/COLOR]);
readln(op2);
write([COLOR=blue]'Enter, please, operation (+, -, *, /): '[/COLOR]);
readln(chOp);
case chOp of
[COLOR=blue]'+'[/COLOR]: result := op1 + op2;
[COLOR=blue]'-'[/COLOR]: result := op1 - op2;
[COLOR=blue]'/'[/COLOR]: result := op1 / op2;
[COLOR=blue]'*'[/COLOR]: result := op1 * op2;
else writeln([COLOR=blue]'Invalid operator'[/COLOR]);
end;
writeln([COLOR=blue]'Result = '[/COLOR], result:[COLOR=blue]5[/COLOR]:[COLOR=blue]2[/COLOR]);
repeat[/FONT] [FONT=Courier New]until keypressed;
end.[/FONT]
uses crt;[/FONT]
[FONT=Courier New]var op1, op2, result : real;
chOp : char;[/FONT]
[FONT=Courier New]begin
clrscr;
write([COLOR=blue]'Enter, please, first operand: '[/COLOR]);
readln(op1);
write([COLOR=blue]'Enter, please, second operand: '[/COLOR]);
readln(op2);
write([COLOR=blue]'Enter, please, operation (+, -, *, /): '[/COLOR]);
readln(chOp);
case chOp of
[COLOR=blue]'+'[/COLOR]: result := op1 + op2;
[COLOR=blue]'-'[/COLOR]: result := op1 - op2;
[COLOR=blue]'/'[/COLOR]: result := op1 / op2;
[COLOR=blue]'*'[/COLOR]: result := op1 * op2;
else writeln([COLOR=blue]'Invalid operator'[/COLOR]);
end;
writeln([COLOR=blue]'Result = '[/COLOR], result:[COLOR=blue]5[/COLOR]:[COLOR=blue]2[/COLOR]);
repeat[/FONT] [FONT=Courier New]until keypressed;
end.[/FONT]
Советую почитать какаю-нибуть книгу по Pascal с компилятором в руках. Например Фролова, вроде так. Обрати внимание на понятие тип данных, преобразования типов данных. И удачи в познаниях)
Классный у вас калькулятор получается))Все же надо строить деревья,ИМХО. Хотя это же все-таки простейший))
Код:
[FONT=Courier New]program z1;
uses crt;[/FONT]
[FONT=Courier New]var op1, op2, result : real;
chOp : char;[/FONT]
[FONT=Courier New]begin
clrscr;
write([COLOR=blue]'Enter, please, first operand: '[/COLOR]);
readln(op1);
write([COLOR=blue]'Enter, please, second operand: '[/COLOR]);
readln(op2);
write([COLOR=blue]'Enter, please, operation (+, -, *, /): '[/COLOR]);
readln(chOp);
case chOp of
[COLOR=blue]'+'[/COLOR]: result := op1 + op2;
[COLOR=blue]'-'[/COLOR]: result := op1 - op2;
[COLOR=blue]'/'[/COLOR]: result := op1 / op2;
[COLOR=blue]'*'[/COLOR]: result := op1 * op2;
else writeln([COLOR=blue]'Invalid operator'[/COLOR]);
end;
writeln([COLOR=blue]'Result = '[/COLOR], result:[COLOR=blue]5[/COLOR]:[COLOR=blue]2[/COLOR]);
repeat[/FONT] [FONT=Courier New]until keypressed;
end.[/FONT]
uses crt;[/FONT]
[FONT=Courier New]var op1, op2, result : real;
chOp : char;[/FONT]
[FONT=Courier New]begin
clrscr;
write([COLOR=blue]'Enter, please, first operand: '[/COLOR]);
readln(op1);
write([COLOR=blue]'Enter, please, second operand: '[/COLOR]);
readln(op2);
write([COLOR=blue]'Enter, please, operation (+, -, *, /): '[/COLOR]);
readln(chOp);
case chOp of
[COLOR=blue]'+'[/COLOR]: result := op1 + op2;
[COLOR=blue]'-'[/COLOR]: result := op1 - op2;
[COLOR=blue]'/'[/COLOR]: result := op1 / op2;
[COLOR=blue]'*'[/COLOR]: result := op1 * op2;
else writeln([COLOR=blue]'Invalid operator'[/COLOR]);
end;
writeln([COLOR=blue]'Result = '[/COLOR], result:[COLOR=blue]5[/COLOR]:[COLOR=blue]2[/COLOR]);
repeat[/FONT] [FONT=Courier New]until keypressed;
end.[/FONT]
Мне надо не такой, такой я и сам напишу, мне надо что бы вводить в одной строке, тип-2*3-а в ледуюшей строке выводитса ответ...
а:
Цитата:
Классный у вас калькулятор получается))Все же надо строить деревья,ИМХО. Хотя это же все-таки простейший))
что означают Деревья??? Вы могли бы мне помочь?
Кто-то может не коментировать типа:
Цитата:
Советую почитать какаю-нибуть книгу по Pascal с компилятором в руках. Например Фролова, вроде так. Обрати внимание на понятие тип данных, преобразования типов данных. И удачи в познаниях)
а реально помочь??? Спасибо заранее...;)
http://algolist.manual.ru Кури раздел "Разбор выражений"
Либо надо почитать литературу, связанную с бинарными деревьями. В узлах таких деревьев(в вашем случае) будут арифметические операции
Ну вот, товарищи!!Я был прав насчет деревьев. Для реализации этой цели вам понадобится разработать разборщик(парсер) выражений, строящий деревья налету. Лучше всего продумать алгоритм на бумаге, расставить приоритеты, продумать вид деревьев. Вообще-то это уже реализовано и не раз))Так что google.com вам в руки. Хороший сайт:
Либо надо почитать литературу, связанную с бинарными деревьями. В узлах таких деревьев(в вашем случае) будут арифметические операции
Ты прав, а вот ответ был странный, ты можешь подсказать какойто нормальный ответ? Прямой, иль прямую ссылку дать можешь?
В константу ты вставил выражение. :eek:
Почитай литературку перед тем как будеш ещо чтото писать.
Но не парься, со всеми бывает...:D
В константу ты вставил выражение. :eek:
Почитай литературку перед тем как будеш ещо чтото писать.
Но не парься, со всеми бывает...:D[/quote]
Хм... сор, я просто забыл поменять, у меня его небыло, а я попробовал и забросил, а сюда скинул исходник с ошибкой, сор:o , но не вано, главное что понятно что я хотел, что так-что так, серовно не пашет:-(
http://algolist.manual.ru/syntax/revpn.php[/quote]
Вообшето спасибо, но в первых: Это на С/С++, а во вторых там 1 ошибка, он сейровно не пашет...
Можешь дать без ошибки, иль на ТР...?
[quote=Ginza9]
Вообшето спасибо, но в первых: Это на С/С++, а во вторых там 1 ошибка, он сейровно не пашет...
Можешь дать без ошибки, иль на ТР...?
Поишу материал.
P.S.
Как начинающему тебе лучше пока остановиться на TP и книгу найди обязательно.
P.P.S
Попробуй если будешь выкладывать мыло еще раз и во всех деталях рассказать о задаче(возможно помогут причины подталкнувшие тя на это).
Читай структуры данных в любой книге по TP.
Читай структуры данных в любой книге по TP.[/quote]
Хм... у меня в книге такого вообше нет...
1. Откройте окно
2. Как следует размахнитесь
3. Выбросьте эту книгу в окно
Нет, так нет. Читайте здесь: http://www.pascaler.ru/dynamics/
Хм... сенкс, а почему бы ишё и полный кон не дать?
Не принято на таких форумах давать полное решение...
Хм... А ты в личку скинь плз... Я те буду очень признателен...
Самый простой вариант это:
1. Считываешь 1 строку, допустим, это будет "23+7".
2. Пускаешь цикл, определяющий позицию оператора.
Пример:
for i:=0 to (length(str)-1) step 1 do begin
if (str='+') or (str='-') then pos=i;
end;
Я написал for, потому, что не помню, как пишуться остальные циклы, но можно как угодно. Главное, чтобы работало!
3. В итоге, получишь цифру 2(нумерация с нуля).
Теперь создаешь пустую стринговую переменную str1 и конкатишь в нее по-очереди все символы строки str, идущие до оператора.
4. Таким же образом, создаешь строковые переменные, в которые загоняешь значение второго значения и, естественно, знак действия.
5. Конвертишь два строковых значения в челочисленные(есть такая функция, как точно зовется - не помню).
6. А дальше используешь уже описанный наверху метод с case'ом!
Конечно, у этого способа есть проблема: он выполняет только одно действие, но если это - не важно, то проблем нет!:D
Код:
var
S: String;
sA, sB: String;
I: Integer;
A, B, C: Real;
Code: Integer;
begin
Write('>'); Readln(S);
I := Pos('+', S);
if I = 0 then I := Pos('-', S);
if I = 0 then I := Pos('*', S);
if I = 0 then I := Pos('/', S);
if I > 0 then begin
sA := Copy(S, 1, I - 1);
sB := S;
Delete(sB, 1, I);
Val(sA, A, Code);
Val(sB, B, Code);
case S of
'+': C := A + B;
'-': C := A - B;
'*': C := A * B;
'/': C := A / B;
end;
Writeln(C);
end;
end.
S: String;
sA, sB: String;
I: Integer;
A, B, C: Real;
Code: Integer;
begin
Write('>'); Readln(S);
I := Pos('+', S);
if I = 0 then I := Pos('-', S);
if I = 0 then I := Pos('*', S);
if I = 0 then I := Pos('/', S);
if I > 0 then begin
sA := Copy(S, 1, I - 1);
sB := S;
Delete(sB, 1, I);
Val(sA, A, Code);
Val(sB, B, Code);
case S of
'+': C := A + B;
'-': C := A - B;
'*': C := A * B;
'/': C := A / B;
end;
Writeln(C);
end;
end.
5*5=2,5
а 10*10=1,00
А насчет второго:
В-первых: программа работает правильно и отображает ответ правильно
Во-вторых: потрудитесь хоть чуть чуть напрячся и что-то почитать по Паскалю.
ну допустим прочиталь (не первый раз, но вспомнил забытое) и всёже я не могу понять, вроде прога должна выводить точный ответ как в первых примерах любой книги... Я не могу понять смысл неправельного вывода ответа... Можете пожайлуста открыть секрет(желательно в приват иль асе 327-812-180
для вещественных чисел используется представление числа с плавающей запятой в виде #.#############Е*##
Что понимать надо примерно так:
если 5*5
ответ 2,50000000000000Е*01
это надо понимать так : 2,5(умножить на)10(в степени)01
получим 25.
ДЛя того чтобы представить числа в удобоваримом свете, надо использовать форматы вывода.
PS если в строке
Код:
A, B, C: Real;
тип переменных на integer;
и заремить строчку
Код:
'/': C := A / B;
то будет все как вы хотите, за исключением операции деление
Код:
Writeln(C);
Writeln(C:0:2);
Writeln(C:0:2);
b и ё вопрос, как сделать что бы выводило не так:
5*5
25, а 5*5=25, тойсть в дной строке...
5*5
25, а 5*5=25, тойсть в дной строке...[/quote]
Измени кода на:
Код:
[FONT=Courier New]var[/FONT][FONT=Courier New]
[LEFT]S: String;
sA, sB: String;
I: Integer;
A, B, C: Real;
Code: Integer;
begin
Write('>'); Read(S);
I := Pos('+', S);
if I = 0 then I := Pos('-', S);
[LEFT]if I = 0 then I := Pos('*', S);
if I = 0 then I := Pos('/', S);
if I > 0 then begin
sA := Copy(S, 1, I - 1);
sB := S;
Delete(sB, 1, I);
Val(sA, A, Code);
Val(sB, B, Code);
case S of
'+': C := A + B;
'-': C := A - B;
'*': C := A * B;
'/': C := A / B;
end;[/LEFT]
ClrScr; [LEFT]Write(S,'=', C:2:5);[/LEFT]
[/LEFT]
[/FONT][LEFT][LEFT][FONT=Courier New]repeat until keypressed;[/FONT] [LEFT][FONT=Courier New]end;[/FONT][FONT=Courier New]end.[/FONT][/LEFT]
[/LEFT]
[/LEFT]
[LEFT]S: String;
sA, sB: String;
I: Integer;
A, B, C: Real;
Code: Integer;
begin
Write('>'); Read(S);
I := Pos('+', S);
if I = 0 then I := Pos('-', S);
[LEFT]if I = 0 then I := Pos('*', S);
if I = 0 then I := Pos('/', S);
if I > 0 then begin
sA := Copy(S, 1, I - 1);
sB := S;
Delete(sB, 1, I);
Val(sA, A, Code);
Val(sB, B, Code);
case S of
'+': C := A + B;
'-': C := A - B;
'*': C := A * B;
'/': C := A / B;
end;[/LEFT]
ClrScr; [LEFT]Write(S,'=', C:2:5);[/LEFT]
[/LEFT]
[/FONT][LEFT][LEFT][FONT=Courier New]repeat until keypressed;[/FONT] [LEFT][FONT=Courier New]end;[/FONT][FONT=Courier New]end.[/FONT][/LEFT]
[/LEFT]
[/LEFT]
Program calc;
label
exit;
var
oper: char;
a,b,c: real;
begin
writeln(' Calculator');
write('Vvedite Perviy operand:');
readln(a);
write('Vvedite vtoroy operand:');
readln(b);
Write('Vvedite nugnoe deystvie ("+","-","*","/"):');
read(oper);
case oper of
'+' :c:=a+b;
'-' :c:=a-b;
'*' :c:=a*b;
If b=0 then begin
write(' Oshibka deleniya na noll');
Goto exit;
'/' :c:=a/b;
write(' Rezultat= ',c:8:4);
exit:
write(' Dlya vihoda nagmite lubuu klavishu ');
readln;
readln; {?}
end.
Если еще нужно что-нибудь посложнее пишите [email]artysokolov@yandex.ru[/email]! Отвечу!!!
Program calc;
label
exit;
var
oper: char;
a,b,c: real;
begin
writeln(' Calculator');
write('Vvedite Perviy operand:');
readln(a);
write('Vvedite vtoroy operand:');
readln(b);
Write('Vvedite nugnoe deystvie ("+","-","*","/"):');
read(oper);
case oper of
'+' :c:=a+b;
'-' :c:=a-b;
'*' :c:=a*b;
If b=0 then begin
write(' Oshibka deleniya na noll');
Goto exit;
'/' :c:=a/b;
write(' Rezultat= ',c:8:4);
exit:
write(' Dlya vihoda nagmite lubuu klavishu ');
readln;
readln; {?}
end.
Если еще нужно что-нибудь посложнее пишите [EMAIL="artysokolov@yandex.ru"]artysokolov@yandex.ru[/EMAIL]! Отвечу!!![/quote]
По-большому счёту от предложенного варианта в №3 посте он ничем не отличается (да ещё и с меткой и goto....брррр).
Думаю, что вопрос уже разжёван до однородной субстанции и поэтому тему закрываю.