Решение №8 из главы 17.На вход вашей программы подается строка вида:5 + 6 -34 + 56 - 7 + 2
Primary tabs
На вход вашей программы подается строка вида:
5 + 6 -34 + 56 - 7 + 2("сколько угодно" чисел с операциями суммы и разности в любом порядке). Вычислите результат (пробелов между символом операции и числом может и не быть)
program pascal_expression_sum_delete; type mmas = array[1..4,1..10] of string; type int_arr = array[1..10] of integer; type str_arr = array[1..10] of string; { функция заполнения масссива } function fill_mmas_array( s : string ): mmas; var i, k, n, m, l : integer; symbol, acc_str, str1, str2 : string; arr_int_sign : mmas; begin // начало тела функции i := 1; k := 1; n := 1; m := 0; l := 0; 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 = '-' ) then begin arr_int_sign [1,n] := symbol; // первый массив n += 1; // индекс массива m += 1; // количество знаков end; if ( acc_str <> ' ' ) then // если строка не пуста begin arr_int_sign[2,k] := acc_str; // второй массив k += 1; // индекс массива l += 1; // количество чисел end; i += 1; end; str( m, str1 ); // преобразование в строку str( l, str2 ); // преобразование в строку arr_int_sign[3,1] := str1; // третий массив arr_int_sign[4,1] := str2; // четвертый массив fill_mmas_array := arr_int_sign; // возвращение значения функции end; { функция сдвига массива с числами } function change_arr_int( arr : int_arr; len, numb, numb2 : integer ): int_arr; var i : integer; begin // начало тела функции for i := numb to len - 1 - numb2 do arr[i] := arr[i+1]; arr[len - numb2] := 0; change_arr_int := arr; // возвращение значения функции end; { функция сдвига массива со знаками } function change_arr_str( str_in : str_arr; len, number, number2 : integer ): str_arr; var i : integer; begin for i := number to ( len - 1 - number2 ) do str_in[i] := str_in[i + 1]; str_in[len - number2] := ''; change_arr_str := str_in; // возвращение значения функции end; // завершение тела функции { функция извлечения массива с числами из многомерного массива } function extract_int_arr( in_arr : mmas ): int_arr; var new_arr : int_arr; // новый массив i, int_number1, int_number2, code : integer; begin // начало тела функции val( in_arr[4,1], int_number1, code ); // преобразование в число for i := 1 to int_number1 do // обход до значения количества чисел begin val( in_arr[2,i], int_number2, code ); // преобразование в число new_arr[i] := int_number2; // присваивание элемента массива end; extract_int_arr := new_arr; // возвращение значения функции end; // завершение тела функции { функция извлечения массива со знаками из многомерного массива } function extract_str_arr( in_arr : mmas ): str_arr; var new_arr_str : str_arr; // новый массив i, int_number1, code : integer; begin // начало тела функции val( in_arr[3,1], int_number1, code ); // преобразование в число for i := 1 to int_number1 do // обход до значения количества знаков begin new_arr_str[i] := in_arr[1,i]; // присваивание элемента массива end; extract_str_arr := new_arr_str; // возвращение значения функции end; // завершение тела функции { процедура подсчета и вывода результата } procedure get_print_arr( in_str : str_arr; l_int : int_arr; len_arr_3, len_arr_4: string ); var l, count, count1, f, code, fix_len_three_arr, fix_len_four_arr : integer; begin // начало тела процедуры l := 1; count := 0; count1 := 0; f := 0; val( len_arr_3, fix_len_three_arr, code ); // преобразование в число val( len_arr_4,fix_len_four_arr, code ); // преобразование в число while( count < fix_len_three_arr ) do begin if( in_str[l] = '+' ) then begin l_int[l] := l_int[l] + l_int[l+1]; l_int := change_arr_int( l_int, fix_len_four_arr, l + 1, f ); in_str := change_arr_str( in_str, fix_len_three_arr, l, f ); f += 1; count1 += 1; count += 1; end else if( in_str[l] = '-' ) then begin l_int[l] := l_int[l] - l_int[l+1]; l_int := change_arr_int( l_int, fix_len_four_arr, l + 1, f ); in_str := change_arr_str( in_str, fix_len_three_arr, l, f ); f += 1; count1 += 1; count += 1; end; if( count1 = 1 ) then begin l := 1; count1 := 0; end else l += 1; end; writeln( l_int[1] ); end; // завершение тела процедуры var str : string; arr : mmas; arr_integer : int_arr; arr_string : str_arr; begin // начало тела основной программы writeln( 'input string: ' ); readln( str );; arr := fill_mmas_array( str ); arr_integer := extract_int_arr( arr ); arr_string := extract_str_arr( arr ); get_print_arr( arr_string, arr_integer, arr[3,1], arr[4,1] ); readln(); end. // завершение тела основной программы
- Log in to post comments
- 3080 reads
vedro-compota
Sat, 08/01/2020 - 20:36
Permalink
Сделать решение, в котором
Сделать решение, в котором массив чисел и массив знаков получаются за один проход исходной строки (получение двух массивов можно вынести в процедуру)
_____________
матфак вгу и остальная классика =)
sergio
Tue, 08/04/2020 - 21:36
Permalink
исправил
vedro-compota
Wed, 08/05/2020 - 19:22
Permalink
решение засчитано
решение засчитано
_____________
матфак вгу и остальная классика =)