Форум «Всё о Паскале» _ Задачи _ Задача со строками.
Автор: piplkall 2.07.2005 0:27
Написал программу со следующим условием - 1)выделить из каждой строки и напечатать подстроки разделённые одной или несколькими цифрами. 2)среди выделенных подстрок найти подстроку содержащюю минимальное число латинских букв. 3)преобразовать исходную строку, которой принадлежит найденная подстрока, следующим образом: заменить цифры на латинские буквы с соответствующим номером в алфавите ('0'->'A', '1'->'B', '2'->'c'). Но есть проблема, 3 задание не работает и я никак не могу понять почему. Помогите пожалуйста.
Код
var str, str1, str2: array [1..100] of string; num: array [1..100] of integer; i, j, t, k, n, m, h, num1, l: integer; p: set of char; begin (*Vvod*)
write ('Vvedite kollichestvo strok: '); readln (k); for i:=1 to k do begin write ('Vvedite ',i, ' stroky: '); readln (str[i]); end; p:=['1','2','3','4','5','6','7','8','9','0'];
(*Telo*) n:=0; for i:=1 to k do begin t:=0; for j:=1 to length (str[i]) do begin if (str[i][j] in p) then begin if (j-t)>1 then begin inc (n); str1[n]:=copy(str[i], t+1, j-t-1); num[n]:=i; end; t:=j; end; end; end; (*Vuvod*) for i:=1 to n do begin writeln ('Rezyltat: ', str1[i]); writeln ('Num: ', num[i]); end;
(*Zadanie 2*) h:=32768; for i:=1 to n do begin m:=0; for j:=1 to length (str1[i]) do begin if (str1[i][j]>'a') AND (str1[i][j]<'z') then begin inc(m);
end; end; if h>m then begin h:=m; num1:=i; end; end; (*Vuvod 2*) writeln ('Rezyltat 2: Chislo latinskih simvolov: ' , h, ' Num: ', num1, ' Str: ', str1[num1]);
(*Zadanie 3*) l:=0; for i:=1 to length (str[num[num1]]) do begin str2[i]:=str[num[num1]]; end; for i:=1 to n do begin if str2[i]='1' then begin str2[i]:='A'; end;
if str2[i]='2' then begin str2[i]:='B'; end;
if str2[i]='3' then begin str2[i]:='C'; end;
if str2[i]='4' then begin str2[i]:='D'; end;
if str2[i]='5' then begin str2[i]:='E'; end;
if str2[i]='6' then begin str2[i]:='F'; end;
if str2[i]='7' then begin str2[i]:='G'; end;
if str2[i]='8' then begin str2[i]:='H'; end;
if str2[i]='9' then begin str2[i]:='I'; end;
end; for i:=1 to n do begin writeln ('Rezyltat 3: ', str2[i]); end; end.
Автор: volvo 2.07.2005 4:02
piplkall, у меня такой ощущение, что ты что-то недоговорил в условии... Начнем отсюда:
Цитата
1) выделить из каждой строки и напечатать подстроки разделённые одной или несколькими цифрами.
Что это значит? Сколько есть исходных строк, и не проще ли обрабатывать их по-отдельности (одну за одной, сразу по всем 3-м пунктам), а не вводить все сразу?
Просто у тебя очень большие массивы задействованы для хранения информации, и программа даже не компилируется (на 16-битном Паскале, во всяком случае)...
Автор: piplkall 2.07.2005 4:40
Да нет, вроде всё договорил, а компилировал я на Delphi 6. Первое и второе задание в условии я выполнил, там всё работает. Не работает только третье.
А чего же тему в Паскале создал? Для Дельфи есть свой раздел... Предупреждать надо
Автор: volvo 2.07.2005 5:31
Значит, смотри что я сделал (вроде работает, проверь на своих тестах):
var zadanie3: string; { тебе же надо обрабатывать только одну строку... }
{ соответственно определение str2 можешь убрать, и эта программа будет компилироваться и в TP тоже } ... (*Zadanie 3*) zadanie3 := str[num[num1]]; for i := 1 to length(zadanie3) do if zadanie3[i] in p then zadanie3[i] := chr( ord(zadanie3[i]) - (chr(ord('A')-Ord('0')-1)) );
writeln('result #3: ', zadanie3);
И еще. Я компилил не на Дельфи, а на FPC поэтому увидел еще кое-что:
(*Zadanie 2*) h:=32768;
Не делай так... Твоя программа - пример, когда на другом компиляторе это приведет к неверным вычислениям. При использовании FPC я получил во втором задании h = -32767, и соответственно пустую строку в результате. Но как только ты сделаешь так:
(*Zadanie 2*) h:=maxInt;
это будет правильно работать при использовании любого компилятора...
Автор: piplkall 2.07.2005 7:32
Большое спасибо, всё работает. Замечания усвоил.
Автор: klem4 2.07.2005 13:41
а так не нельзя ?
if zadanie3[i] in p then zadanie3[i]:=chr(ord(zadanie3[i])+49);
Автор: Guest 2.07.2005 13:52
Ну, во-первых,
chr(ord('A')-Ord('0')-1)
так или иначе будет еще при компиляции преобразовано к 49 (для ДОС-кодировки, но ведь есть и другие !!!). А во вторых, я же привел пример, как задание конкретных значений может сослужить очень плохую службу... Или нужно обязательно столкнуться с этим, НАЙТИ эту ошибку самому, и только потом понять, что это не совсем корректный способ?