0 / 0 / 0
Регистрация: 18.05.2008
Сообщений: 21
1

Задача на строки, немогу разобраться

19.05.2008, 18:39. Показов 1498. Ответов 8
Метки нет (Все метки)

В строке заданы через двоеточие 2 оператора присваивания общего вида: "первый:=число1+число2:второй:=число3-число4" (например:"A:=3+4:B:=7-2"). Вычислить значения переменых и распечатать их.

Вот решение задачи примерно такова типа только для знаков +,-,*,/ и выражения вида "первый:=число1 знак число2"

Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
program expression;
var s:string[50];ss:string[4];si:Char;a1,a2,is,i,p1,p2:integer;res:real;
begin
  writeln('‚ўҐ¤ЁвҐ бва®Єг б ўла ¦Ґ*ЁҐ¬.');
  readln(S);
  ss:='+-*/';si:=' ';
  for i:=1 to 4 do
  if pos(ss[i],s)>0then
   begin is:=pos(ss[i],s);
   si:=ss[i]
   end;
  if si=''then
   writeln('ЌҐЇа ўЁ«м*®Ґ ўла ¦Ґ*ЁҐ!')
  else
   begin
    val(copy(s,1,is-1),a1,p1);
    val(copy(s,is+1,length(s)-is),a2,p2);
    if (p1<>0) or (p2<>0) then
     writeln('ЌҐЇа ўЁ«м*®Ґ ўла ¦Ґ*ЁҐ!')
    else
     begin
      case si of
       '+': res:=a1+a2;
       '-': res:=a1-a2;
       '*': res:=a1*a2;
       '/': res:=a1 div a2
      end;
     writeln(s,'=',res)
    end
   end
  end.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
19.05.2008, 18:39
Ответы с готовыми решениями:

Задача по теории вероятности, немогу разобраться
Доброе время суток, помогите пожалуйста решить задачку.. Два игрока А и В поочередно бросают...

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

Немогу разобраться
Нужно записать в файл массив строк #include &quot;stdafx.h&quot; #include &quot;iostream&quot; #include &lt;windows.h&gt;...

Немогу разобраться с директивами
Люди есть проблема. (с++) Значит учусь я в универе. А там IDE у нас короче очень древняя...

8
Почетный модератор
64275 / 47574 / 32739
Регистрация: 18.05.2008
Сообщений: 115,182
19.05.2008, 21:21 2
Подправил вашу программу. Во-первых в приведенном коде выражение не "первый:=число1 знак число2", а число1 знак число2". Поскольку у вас два выражения, поэтому чтобы не писать два раза длинный код, оформил определение результата в процедуру, поэтому поменял некоторые переменные. Оставил два знака.
Код
[SIZE=2]
uses crt;
var s,s1:string;
i,k,rez:integer;
Procedure Rezult(a:string;var rz:integer);
var ss:string[2]; //строка знаков
si:char; //сам знак
is,a1,a2,p1,p2,res:integer;
begin
ss:='+-';
for i:=1 to 2 do
if pos(ss[i],a)>0 then
begin
is:=pos(ss[i],a);//находим позицию знака в выражении
si:=ss[i] //определяем знак
end;
if si=''then writeln('Nevernoe vyrazenie!')
else
begin
val(copy(a,4,is-4),a1,p1); //превращаем числа из строк в [/SIZE][FONT=Courier New][SIZE=2]integer
[/SIZE][/FONT][SIZE=2]val(copy(a,is+1,length(s)-is),a2,p2);
if (p1<>0) or (p2<>0) then
writeln('Nevernoe vyrazenie!')
else
begin
case si of /выполняем децствия
'+': rz:=a1+a2;
'-': rz:=a1-a2;
end;
end;
end;
end;
begin //начало программы
clrscr;
writeln('Vvedite vyrazenie:');//типа [/SIZE][FONT=Courier New][SIZE=2]a:=12+56:b:104-56
[/SIZE][/FONT][SIZE=2]readln(S);
for i:=1 to length(s)do
if (s[i]=':')and(s[i+1]<>'=')then
begin
s1:=copy(s,1,i-1);[/SIZE][FONT=Courier New][SIZE=2] //[/SIZE][/FONT][SIZE=2]выделяем первое выражение
delete(s,1,i); //удаляем его, остается второе
end;
writeln('Rezultat:');
Rezult(s1,rez); //вызываем процедуру для первого выражения
writeln(s1[1]+'=',rez);
Rezult(s,rez); //вызываем процедуру для второго выражения
writeln(s[1]+'=',rez);
readln
end.
[/SIZE][FONT=Arial CYR][/FONT]
0
0 / 0 / 0
Регистрация: 18.05.2008
Сообщений: 21
19.05.2008, 23:18  [ТС] 3
Мне кажеться программа выводит совсем не то что нужно?
Миниатюры
Задача на строки, немогу разобраться  
0
Почетный модератор
64275 / 47574 / 32739
Регистрация: 18.05.2008
Сообщений: 115,182
20.05.2008, 06:50 4
В строке заданы через двоеточие 2 оператора присваивания общего вида: "первый:=число1+число2:второй:=число3-число4" (например:"A:=3+4:B:=7-2"). Вычислить значения переменых и распечатать их.
У вас же написано, что нужно вводить типа a:=5+9:b:=6-3, а вы вводите 5+9:6-3, поэтому неправильно и выводит. Если вам нужно вводить, так как вы хотите, надо немного переделать.
0
0 / 0 / 0
Регистрация: 18.05.2008
Сообщений: 21
21.05.2008, 21:27  [ТС] 5
А ну да точно, спасибо огромное всё отлично работает.

Добавлено через 22 часа 19 минут
Подскажи плиз как эту задачу записать без процедур и функций?
0
Почетный модератор
64275 / 47574 / 32739
Регистрация: 18.05.2008
Сообщений: 115,182
21.05.2008, 22:10 6
Во-первых без процедур и функций вообще практически программ не бывает, особенно при работе со строками. Например в этой программе использованы функции pos и copy. Если вы имеете в виду подпрограммы, то подпрограмм-функций нет, а только одна подпрограмма-процедура. Можно, если пальцы не отнимутся, написать и без нее, только то, что в ней написано, нужно будет написать два раза, что совершенно бессмысленно.
Если есть желание займись, ничего сложного.
0
0 / 0 / 0
Регистрация: 18.05.2008
Сообщений: 21
21.05.2008, 23:35  [ТС] 7
Просто тут такая ситуация, процедуры мы ещё непроходили, и когда эту задачу показываеш учителю она говорит "переделывай без процедур" её не волнует что она правильно работет. вот так вот.
Глянь я попробовал переделать но неправильно работать стала помоги плиз.

Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
ss:='+-';
for i:=1 to 2 do
if pos(ss[i],a)>0 then
begin
is:=pos(ss[i],a);{находим позицию знака в выражении}
si:=ss[i] {определяем знак}
end;
if si=''then writeln('Nevernoe vyrazenie!')
else
begin
val(copy(a,4,is-4),a1,p1); {превращаем числа из строк в integer}
val(copy(a,is+1,length(s)-is),a2,p2);
if (p1<>0) or (p2<>0) then
writeln('Nevernoe vyrazenie!')
else
begin
case si of {выполняем децствия}
'+': rz:=a1+a2;
'-': rz:=a1-a2;
end;
end;
end;
Добавлено через 6 минут
Просто тут такая ситуация, процедуры мы ещё непроходили, и когда эту задачу показываеш учителю она говорит "переделывай без процедур" её не волнует что она правильно работет. вот так вот.
Глянь я попробовал переделать но неправильно работать стала помоги плиз.
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
program wersadfg;
uses crt;
var s,s1:string;
i,k,rez:integer;
a:string;var rz:integer;
var ss:string[2]; {строка знаков}
si:char; {сам знак}
is,a1,a2,p1,p2,res:integer;
begin {начало программы}
clrscr;
writeln('Vvedite vyrazenie:');{типа a:=12+56:b:104-56}
readln(S);
for i:=1 to length(s)do
if (s[i]=':')and(s[i+1]<>'=')then
begin
s1:=copy(s,1,i-1); {выделяем первое выражение}
delete(s,1,i); {удаляем его, остается второе}
end;
writeln('Rezultat:');
ss:='+-';
for i:=1 to 2 do
if pos(ss[i],a)>0 then
begin
is:=pos(ss[i],a);{находим позицию знака в выражении}
si:=ss[i] {определяем знак}
end;
if si=''then writeln('Nevernoe vyrazenie!')
else
begin
val(copy(a,4,is-4),a1,p1); {превращаем числа из строк в integer}
val(copy(a,is+1,length(s)-is),a2,p2);
if (p1<>0) or (p2<>0) then
writeln('Nevernoe vyrazenie!')
else
begin
case si of {выполняем децствия}
'+': rz:=a1+a2;
'-': rz:=a1-a2;
end;
end;
end; 
writeln(s1[1]+'=',rez);
ss:='+-';
for i:=1 to 2 do
if pos(ss[i],a)>0 then
begin
is:=pos(ss[i],a);{находим позицию знака в выражении}
si:=ss[i] {определяем знак}
end;
if si=''then writeln('Nevernoe vyrazenie!')
else
begin
val(copy(a,4,is-4),a1,p1); {превращаем числа из строк в integer}
val(copy(a,is+1,length(s)-is),a2,p2);
if (p1<>0) or (p2<>0) then
writeln('Nevernoe vyrazenie!')
else
begin
case si of {выполняем децствия}
'+': rz:=a1+a2;
'-': rz:=a1-a2;
end;
end;
end;
writeln(s[1]+'=',rez);
readln
end.
0
Почетный модератор
64275 / 47574 / 32739
Регистрация: 18.05.2008
Сообщений: 115,182
22.05.2008, 06:40 8
Переписывать тоже с умом надо. Переменная a это формальный параметр процедуры, а раз убрал процедуру, то вместо него нужно писать фактические переменные: сначала s1. когда для нее все сделаем, то второй раз s. И результат для каждой строки разный, значит нужно две переменных. Я сказал что писать нужно два раза, для каждой строки-формулы отдельно, как бы две программы, а не дословно переписывать процедуру два раза.
Код
[SIZE=2]
uses crt;
var s,s1:string;
i,k,rez,rez1:integer;
ss:string[2];
si:char;
is,a1,a2,p1,p2:integer;
begin
clrscr;
writeln('Vvedite vyrazenie:'); {делим строку на две}
readln(S);
for i:=1 to length(s)do
if (s[i]=':')and(s[i+1]<>'=')then
begin
s1:=copy(s,1,i-1);
delete(s,1,i);
end;
ss:='+-';      {обрабатываем певое выражение}
for i:=1 to 2 do
if pos(ss[i],s1)>0 then
begin
is:=pos(ss[i],s1);
si:=ss[i]
end;
if si=''then writeln('Nevernoe vyrazenie!')
else
begin
val(copy(s1,4,is-4),a1,p1);
val(copy(s1,is+1,length(s1)-is),a2,p2);
if (p1<>0) or (p2<>0) then
writeln('Nevernoe vyrazenie!')
else
begin
case si of
'+': rez1:=a1+a2;
'-': rez1:=a1-a2;
end;
end;
end;
for i:=1 to 2 do    {обрабатываем второе выражение}
if pos(ss[i],s)>0 then
begin
is:=pos(ss[i],s);
si:=ss[i]
end;
if si=''then writeln('Nevernoe vyrazenie!')
else
begin
val(copy(s,4,is-4),a1,p1);
val(copy(s,is+1,length(s)-is),a2,p2);
if (p1<>0) or (p2<>0) then
writeln('Nevernoe vyrazenie!')
else
begin
case si of
'+': rez:=a1+a2;
'-': rez:=a1-a2;
end;
end;
end;
writeln('Rezultat:');
writeln(s1[1]+'=',rez1);
writeln(s[1]+'=',rez);
readln;
end.
Procedure Rezult(a:string;var rz:integer);
var ss:string[2];
si:char;
is,a1,a2,p1,p2,res:integer;
begin
ss:='+-';
for i:=1 to 2 do
if pos(ss[i],a)>0 then
begin
is:=pos(ss[i],a);
si:=ss[i]
end;
if si=''then writeln('Nevernoe vyrazenie!')
else
begin
val(copy(a,4,is-4),a1,p1);
val(copy(a,is+1,length(s)-is),a2,p2);
if (p1<>0) or (p2<>0) then
writeln('Nevernoe vyrazenie!')
else
begin
case si of
'+': rz:=a1+a2;
'-': rz:=a1-a2;
end;
end;
end;
end;
begin
clrscr;
writeln('Vvedite vyrazenie:');
readln(S);
for i:=1 to length(s)do
if (s[i]=':')and(s[i+1]<>'=')then
begin
s1:=copy(s,1,i-1);
delete(s,1,i);
end;
writeln('Rezultat:');
Rezult(s1,rez);
writeln(s1[1]+'=',rez);
Rezult(s,rez);
writeln(s[1]+'=',rez);
readln
end.
[/SIZE]
0
0 / 0 / 0
Регистрация: 18.05.2008
Сообщений: 21
22.05.2008, 22:21  [ТС] 9
Благодарю, круче учителя обьясняеш
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
22.05.2008, 22:21
Помогаю со студенческими работами здесь

немогу разобраться с переменной C++
Объясните пожалуйста, вот есть переменные int, char, float и т.д а, в некоторых функциях есть...

Немогу разобраться с делегатом!
Привет всем! Помогите разобраться с делегатом : monitor.NotifyOnChanged(delegate { ...

Немогу разобраться с прогой
Подскажите как сделать необходимо В Форме данные1) при открытии поля сосписком Наити ФИО и чтобы те...

Немогу разобраться с кодом..
помогите разобраться с кодом! по идеи должно копировать только поля имя и фам, а копируется вся...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru