Помощь - Поиск - Пользователи - Календарь
Полная версия: Задача со строками.
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
piplkall
Написал программу со следующим условием - 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
piplkall, у меня такой ощущение, что ты что-то недоговорил в условии... Начнем отсюда:
Цитата
1) выделить из каждой строки и напечатать подстроки разделённые одной или несколькими цифрами.
Что это значит? Сколько есть исходных строк, и не проще ли обрабатывать их по-отдельности (одну за одной, сразу по всем 3-м пунктам), а не вводить все сразу?

Просто у тебя очень большие массивы задействованы для хранения информации, и программа даже не компилируется (на 16-битном Паскале, во всяком случае)...
piplkall
Да нет, вроде всё договорил, а компилировал я на Delphi 6. Первое и второе задание в условии я выполнил, там всё работает. Не работает только третье.

А чего же тему в Паскале создал? Для Дельфи есть свой раздел... Предупреждать надо smile.gif
volvo
Значит, смотри что я сделал (вроде работает, проверь на своих тестах):
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
Большое спасибо, всё работает. Замечания усвоил.
klem4
а так не нельзя ? blink.gif

if zadanie3[i] in p then
zadanie3[i]:=chr(ord(zadanie3[i])+49);
Guest
Ну, во-первых,
chr(ord('A')-Ord('0')-1)

так или иначе будет еще при компиляции преобразовано к 49 (для ДОС-кодировки, но ведь есть и другие !!!).
А во вторых, я же привел пример, как задание конкретных значений может сослужить очень плохую службу... Или нужно обязательно столкнуться с этим, НАЙТИ эту ошибку самому, и только потом понять, что это не совсем корректный способ?
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.