IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения.
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

 
 Ответить  Открыть новую тему 
> Задача со строками.
сообщение
Сообщение #1





Группа: Пользователи
Сообщений: 9
Пол: Мужской

Репутация: -  0  +


Написал программу со следующим условием - 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.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Гость






piplkall, у меня такой ощущение, что ты что-то недоговорил в условии... Начнем отсюда:
Цитата
1) выделить из каждой строки и напечатать подстроки разделённые одной или несколькими цифрами.
Что это значит? Сколько есть исходных строк, и не проще ли обрабатывать их по-отдельности (одну за одной, сразу по всем 3-м пунктам), а не вводить все сразу?

Просто у тебя очень большие массивы задействованы для хранения информации, и программа даже не компилируется (на 16-битном Паскале, во всяком случае)...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3





Группа: Пользователи
Сообщений: 9
Пол: Мужской

Репутация: -  0  +


Да нет, вроде всё договорил, а компилировал я на Delphi 6. Первое и второе задание в условии я выполнил, там всё работает. Не работает только третье.

А чего же тему в Паскале создал? Для Дельфи есть свой раздел... Предупреждать надо smile.gif

Сообщение отредактировано: volvo -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Гость






Значит, смотри что я сделал (вроде работает, проверь на своих тестах):
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;

это будет правильно работать при использовании любого компилятора...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5





Группа: Пользователи
Сообщений: 9
Пол: Мужской

Репутация: -  0  +


Большое спасибо, всё работает. Замечания усвоил.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


Perl. Just code it!
******

Группа: Пользователи
Сообщений: 4 100
Пол: Мужской
Реальное имя: Андрей

Репутация: -  44  +


а так не нельзя ? blink.gif

if zadanie3[i] in p then
zadanie3[i]:=chr(ord(zadanie3[i])+49);


--------------------
perl -e 'print for (map{chr(hex)}("4861707079204E6577205965617221"=~/(.{2})/g)), "\n";'
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #7


Гость






Ну, во-первых,
chr(ord('A')-Ord('0')-1)

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

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 29.04.2024 22:45
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name