Задача 9 Урок 18
Primary tabs
Задана последовательность символов, имеющая следующий вид: p1q1p2q2p3...qn-1pn,
где pi - цифра, а qi - знак арифметического действия из набора {+, -, *}.
Вычислите значение выражения, предполагая, что действия выполняются согласно
правилам арифметики.
Входные данные: На вход программе подается строка указанного вида, состоящая
не более чем из 9 чисел, разделенных символами арифметических операций.
Выходные данные: Выведите значение арифметического выражения.
Примеры:
Входные данные Результат5+2 7 1-2*5+2 -7 5*6+7-3*2+11 42 5*6+7-3*2*3+11 30Как решать: Выделите массив операций и массив значений, сначала посчитайте все
умножения, а потом все остальное
type iArr = array[1..9] of integer; cArr = array[1..8] of char; var inputString: string; intArr: iArr; charArr: cArr; intCount, charCount: integer; procedure getNumsAndChar(inputString: string; var intArr: iArr; var charArr: cArr; var intCount, charCount: integer); //процедура разбирает строку на массив чисел и массив знаков, и считает, сколько было каждого из них; var loopCount, errorCode: integer; toString2: string; flag: boolean; begin intCount := 0; charCount := 0; flag := false; toString2 := ''; for loopCount := 1 to length(inputString) do begin if (inputString[loopCount] >= '0') and (inputString[loopCount] <= '9') then begin toString2 := toString2 + inputString[loopCount]; flag := true; end else if flag and (inputString[loopCount] <> ' ') then begin flag := false; inc(intCount); val(toString2, intArr[intCount], errorCode); toString2 := ''; end; if (inputString[loopCount] = '-') then begin flag := false; inc(charCount); charArr[charCount] := '-'; end else if (inputString[loopCount] = '+') then begin flag := false; inc(charCount); charArr[charCount] := '+'; end else if (inputString[loopCount] = '*') then begin flag := false; inc(charCount); charArr[charCount] := '*'; end; end; inc(intCount); val(toString2, intArr[intCount], errorCode); writeln('Массив чисел: '); for loopCount := 1 to length(intArr) do write(intArr[loopCount], ' '); writeln('Массив знаков: '); for loopCount := 1 to length(charArr) do write(charArr[loopCount], ' '); writeln(); writeln('Чисел: ', intCount, '; Знаков: ', charCount, ';'); end; function algebra(num1, num2: integer; char1: string): integer; begin if (char1 = '+') then algebra := num1 + num2 else if (char1 = '-') then algebra := num1 - num2 else if (char1 = '*') then algebra := num1 * num2; end; procedure proCut(var intArr: iArr; var charArr: cArr; charCount, loopCount: integer);// сокращение массивов при умножении var i: integer; begin for i := loopCount to charCount do begin charArr[i] := charArr[i + 1]; intArr[i + 1] := intArr[i + 2]; end; end; function multiplicator(var intArr: iArr; var charArr: cArr; var intCount, charCount: integer): integer; //умножение var loopCount: integer; begin { writeln('Массив чисел до операций: '); for loopCount := 1 to length(intArr) do write(intArr[loopCount], ' '); writeln('Массив знаков: '); for loopCount := 1 to length(charArr) do write(charArr[loopCount], ' '); writeln(); writeln('Чисел: ', intCount, '; Знаков: ', charCount, ';'); } loopCount := 1; while (loopCount <= charCount) do begin if charArr[loopCount] = '*' then begin intArr[loopCount] := algebra((intArr[loopCount]), (intArr[loopCount + 1]), (charArr[loopCount])); proCut(intArr, charArr, charCount, loopCount); intCount := intCount - 1; charCount := charCount - 1; loopCount := loopCount - 1; end; inc(loopCount); end; { writeln('Массив чисел после умножения: '); for loopCount := 1 to length(intArr) do write(intArr[loopCount], ' '); writeln('Массив знаков: '); for loopCount := 1 to length(charArr) do write(charArr[loopCount], ' '); writeln(); writeln('Чисел: ', intCount, '; Знаков: ', charCount, ';'); } for loopCount := 1 to charCount do intArr[loopCount + 1] := algebra(intArr[loopCount], intArr[loopCount + 1], charArr[loopCount]); { writeln('Массив чисел после арифметики: '); for loopCount := 1 to length(intArr) do write(intArr[loopCount], ' '); writeln('Массив знаков: '); for loopCount := 1 to length(charArr) do write(charArr[loopCount], ' '); writeln(); writeln('Чисел: ', intCount, '; Знаков: ', charCount, ';'); } // writeln(intArr[intCount]); multiplicator := intArr[intCount]; end; begin writeln('Введите строку'); // readln(inputString); inputString := '5*6+7-3*2*3+11'; writeln(inputString); getNumsAndChar(inputString, intArr, charArr, intCount, charCount); writeln('Ответ (30): ', multiplicator(intArr, charArr, intCount, charCount)); readln(); end.
КОНСОЛЬ
Введите строку 5*6+7-3*2*3+11 Массив чисел: 5 6 7 3 2 3 11 0 0 Массив знаков: * + - * * + Чисел: 7; Знаков: 6; Ответ (30): 30
- Log in to post comments
- 624 reads
vedro-compota
Wed, 12/29/2021 - 18:13
Permalink
засчитано
засчитано
_____________
матфак вгу и остальная классика =)