Решение №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
- 3581 reads
vedro-compota
Sat, 08/01/2020 - 20:36
Permalink
Сделать решение, в котором
Сделать решение, в котором массив чисел и массив знаков получаются за один проход исходной строки (получение двух массивов можно вынести в процедуру)
_____________
матфак вгу и остальная классика =)
sergio
Tue, 08/04/2020 - 21:36
Permalink
исправил
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: integer ); var i, j, k, n, number, code : 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 = '-' ) then begin arr_str[n] := symbol; // первый массив n += 1; // увеличиваем индекс fix_sign += 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: integer ); var l, count, lab, value_arr1, value_arr2, code, f : integer; str_value : string; begin // начало тела процедуры l := 1; // начальный индекс массива count := 0; // счетчик цикла lab := 0; f := 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 ); f += 1; lab += 1; count += 1; end else 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[l] := in_int[l] + in_int[l+1]; 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; 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 : integer; begin // начало тела основной программы fix_number_sign := 0; fix_number_int := 0; writeln( 'input string: ' ); readln( str ); fill_mmas_array( str, str_arr, int_arr, fix_number_sign, fix_number_int ); get_print_arr( str_arr, int_arr, fix_number_sign, fix_number_int ); readln(); end. //завершение тела основной программыvedro-compota
Wed, 08/05/2020 - 19:22
Permalink
решение засчитано
решение засчитано
_____________
матфак вгу и остальная классика =)