Решение №9 из главы 17.Задана последовательность символов, имеющая следующий вид: p1q1p2q2p3...qn–1pn , где pi — цифра, а qi — з
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
program pascal_expression_sum_delete; type mas_str = array [1..10] of string; // секция обьявления типов { процедура заполнения двух массивов } procedure fill_mmas_array( s: string; var arr_str, arr_int: mas_str; var fix_sign,fix_int,sign_mult: integer ); var i, k, n : integer; symbol, acc_str : string; begin // начало тела процедуры i := 1; k := 1; n := 1; while( i <= length( s ) ) do // пока истинно условие выполняем begin acc_str := ' ' ; // пустая строка symbol := s[i]; // первый символ строки while( symbol >= '0' ) and ( symbol <= '9' ) do begin acc_str += symbol; // прибавляем в переменную элемент строки i += 1; if( i <= length( s ) ) then // если не вышли за длинну строки symbol := s[i] // символ равен символу строки с индексом i else break; // иначе завершаем end; if( symbol = '+' ) or ( symbol = '-' ) or ( symbol = '*' ) then begin arr_str[n] := symbol; // первый массив n += 1; // увеличиваем индекс fix_sign += 1; // считаем кол-во знаков if( symbol = '*' ) then sign_mult += 1; end; if ( acc_str <> ' ' ) then // если строка не пуста begin arr_int[k] := acc_str; // второй массив k += 1; // увеличиваем индекс массива fix_int += 1; // считаем кол-во чисел end; i += 1; end; end; // завершение тела процедуры { функция сдвига массива } function change_arr( arr : mas_str; len_fix, number, number2 : integer ) : mas_str; var i : integer; begin // начало тела функции for i := number to ( len_fix - 1 - number2 ) do arr[i] := arr[i+1]; arr[len_fix - number2 ] := ''; change_arr := arr; // возврат функции end; //завершение тела функции { процедура подсчета и вывода результата } procedure get_print_arr( in_str, in_int: mas_str; sign_fix, int_fix, in_mult: integer ); var l, count, lab, value_arr1, value_arr2, sign_mult, code, f : integer; str_value : string; begin // начало тела процедуры l := 1; // начальный индекс массива count := 0; // счетчик цикла lab := 0; f := 0; // кол-во сдвигов массивов для уменьшения обхода в цикле sign_mult := 0; while( count < sign_fix ) do begin if( in_str[l] = '*' ) then begin val( in_int[l], value_arr1, code ); val( in_int[l + 1], value_arr2, code ); value_arr1 := value_arr1 * value_arr2; str( value_arr1, str_value ); in_int[l] := str_value; in_int := change_arr( in_int, int_fix, l + 1, f ); in_str := change_arr( in_str, sign_fix, l, f ); sign_mult += 1; // cчитает кол-во умножений f += 1; lab += 1; count += 1; end else begin if( in_str[l] = '+' ) and ( sign_mult = in_mult ) then begin val( in_int[l], value_arr1, code ); val( in_int[l + 1], value_arr2, code ); value_arr1 := value_arr1 + value_arr2; str( value_arr1, str_value ); in_int[l] := str_value; in_int := change_arr( in_int, int_fix, l + 1, f ); in_str := change_arr( in_str, sign_fix, l, f ); f += 1; lab += 1; count += 1; end else if( in_str[l] = '-' ) and ( sign_mult = in_mult ) then begin val( in_int[l], value_arr1, code ); val( in_int[l + 1], value_arr2, code ); value_arr1 := value_arr1 - value_arr2; str( value_arr1, str_value ); in_int[l] := str_value; in_int := change_arr( in_int, int_fix, l + 1, f ); in_str := change_arr( in_str, sign_fix, l, f ); f += 1; lab += 1; count += 1; end; end; if( lab = 1 ) then begin l := 1; lab := 0; end else l += 1; end; writeln( in_int[1] ); end; // завершение тела процедуры var str : string; str_arr : mas_str; int_arr : mas_str; fix_number_sign, fix_number_int, mult_sign : integer; begin // начало тела основной программы fix_number_sign := 0; fix_number_int := 0; mult_sign := 0; writeln( 'input expression :' ); readln( str ); fill_mmas_array( str, str_arr, int_arr, fix_number_sign, fix_number_int, mult_sign ); get_print_arr( str_arr, int_arr, fix_number_sign, fix_number_int, mult_sign ); readln(); end. //завершение тела основной программы
- Log in to post comments
- 4265 reads
vedro-compota
Wed, 08/05/2020 - 19:46
Permalink
Рекомендации:
Рекомендации:
_____________
матфак вгу и остальная классика =)
vedro-compota
Wed, 08/05/2020 - 20:02
Permalink
провести сравнение
провести сравнение с решением: http://fkn.ktu10.com/?q=node/11652
Как это сделать:
_____________
матфак вгу и остальная классика =)
sergio
Mon, 08/10/2020 - 22:42
Permalink
добавил в одну процедуру
sergio
Wed, 08/12/2020 - 18:58
Permalink
исправил
vedro-compota
Wed, 08/12/2020 - 19:16
Permalink
обшая схема замера времени:
обшая схема замера времени:
_____________
матфак вгу и остальная классика =)
sergio
Sun, 08/16/2020 - 22:36
Permalink
исправил на функцию вместо процедуры