Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 25.07.2012, 15:15   #1
Volgemut
Новичок
Джуниор
 
Регистрация: 25.07.2012
Сообщений: 3
Печаль Помочь с исправлением задачи

Добрый день! Столкнулся со следующей проблемой. Дано условие задачи: На вход программе подаются строчные английские буквы. Ввод этих символов заканчивается точкой (другие символы, отличные от и букв а...z, во входных данных отсутствуют;точка).

Требуется написать эффективную программу

-:оторая будет печатать в алфавитном порядке только те буквы, которые хотя бы однократно ровно три раза подряд встретились во входной последовательности. Каждая буква должна быть распечатана только один раз. Точка при этом не учитывается.

Например, пусть на вход подаются следующие символы: bbbffjrtatbbbamaaa.

В данном случае программа должна вывести: ab

Далее приведён сам код программы:
program zadacha1;

{$APPTYPE CONSOLE}
uses
SysUtils;

var
myFile : TextFile;
text1 :string;
i, kk, j, result,result2:Integer;
b :array of string;
c: array of integer;
begin
i:=1;
AssignFile(myFile, 'letters.txt');
Reset(myFile);
Read(myfile, text1);

kk:=length(text1);
SetLength(b, 27);
SetLength(c, 27);
for i:=1 to 26 do begin
c[i]:=0;
end;
b[1]:='a';
b[2]:='b';
b[3]:='c';
b[4]:='d';
b[5]:='e';
b[6]:='f';
b[7]:='g';
b[8]:='h';
b[9]:='i';
b[10]:='j';
b[11]:='k';
b[12]:='l';
b[13]:='m';
b[14]:='n';
b[15]:='o';
b[16]:='p';
b[17]:='q';
b[18]:='r';
b[19]:='s';
b[20]:='t';
b[21]:='u';
b[22]:='v';
b[23]:='w';
b[24]:='x';
b[25]:='y';
b[26]:='z';

for i:=0 to kk-1 do
begin result:= AnsiCompareStr(text1[i], text1[i+1]);
result2:= AnsiCompareStr(text1[i+1], text1[i+2]);
if result=result2
then c[i]:=c[i]+1
end;

for i:=1 to 26 do begin
if c[i]>=1 then begin
write(b[i]);
end;
end;
readln;
end.

Суть проблемы заключается в следующем:программа запускает считает, но выдаёт совершенно не те значения, а конкретно aefkrp. Подскажите пожалуйста где нужно поправить, а то уже второй день ломаю голову.
Volgemut вне форума Ответить с цитированием
Старый 25.07.2012, 15:30   #2
AlexMas
Пользователь
 
Аватар для AlexMas
 
Регистрация: 30.05.2012
Сообщений: 69
По умолчанию

Код:
result:= AnsiCompareStr(text1[i], text1[i+1]);
result2:= AnsiCompareStr(text1[i+1], text1[i+2]);
if result=result2
берем abc
result = сравним a <> b
result2 = сравним b <> c
итог: с[i] увеличится

if (text[i]=text[i+1]) and (text[i+1]=text[i+2]) then

ну и b можно заменить на
const
b='abcdefg..xyz'
и так же обращаться по индексу.

upd:
Алгоритм "в лоб"
берем каждый символ, смотрим, что это за символ(определяем его номер в алфавите), смотрим в массиве индексов, если там уже 1, то не проверяем, если 0, то проверяем на равенство со следующими двумя. если равенство - пишем в массив индексов 1, берем следующий символ из строки и ...

Последний раз редактировалось AlexMas; 25.07.2012 в 15:39.
AlexMas вне форума Ответить с цитированием
Старый 25.07.2012, 15:54   #3
Volgemut
Новичок
Джуниор
 
Регистрация: 25.07.2012
Сообщений: 3
По умолчанию

Цитата:
Сообщение от AlexMas Посмотреть сообщение
Код:
result:= AnsiCompareStr(text1[i], text1[i+1]);
result2:= AnsiCompareStr(text1[i+1], text1[i+2]);
if result=result2
берем abc
result = сравним a <> b
result2 = сравним b <> c
итог: с[i] увеличится

if (text[i]=text[i+1]) and (text[i+1]=text[i+2]) then

ну и b можно заменить на
const
b='abcdefg..xyz'
и так же обращаться по индексу.

upd:
Алгоритм "в лоб"
берем каждый символ, смотрим, что это за символ(определяем его номер в алфавите), смотрим в массиве индексов, если там уже 1, то не проверяем, если 0, то проверяем на равенство со следующими двумя. если равенство - пишем в массив индексов 1, берем следующий символ из строки и ...
а можно немного попродробней пожалуйста, а то я совсем Дно и понабрал еле еле отовсюду(
Volgemut вне форума Ответить с цитированием
Старый 25.07.2012, 16:01   #4
AlexMas
Пользователь
 
Аватар для AlexMas
 
Регистрация: 30.05.2012
Сообщений: 69
По умолчанию

Код:
alf := 'abcdefghijklmnopqrstuvwxyz';

for i:=1 to kk do
begin
    p := pos(text1[i], alf);//какой символ в алфавите, а=1; z=26  
    if c[p]=0 then //еще не находили ряд таких символов в последовательности?
    begin
       if (text1[i]=text[i+1]) and (text1[i+1]=text1[i+2]) then //сравниваем текущий и 2 последующих символа на совпадение
            c[p]:=1; //если они совпали устанавливаем для этого символа 1
    end;
end;
alf - используется вместо b

Последний раз редактировалось AlexMas; 25.07.2012 в 16:06.
AlexMas вне форума Ответить с цитированием
Старый 25.07.2012, 16:05   #5
Volgemut
Новичок
Джуниор
 
Регистрация: 25.07.2012
Сообщений: 3
По умолчанию

спасибо большое
Volgemut вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
ребят я не могу понять как решать эти задачи!может кто помочь в решении представленной задачи? Andrusha07 Помощь студентам 0 09.03.2012 23:08
Очень прошу помочь решить задачи shugurmax Паскаль, Turbo Pascal, PascalABC.NET 8 24.11.2011 11:09
может сможете мне помочь с решением задачи ангелочик Помощь студентам 4 13.11.2010 09:54
[Pascal]: задачи на массивы, прошу помочь решить Knife Помощь студентам 7 19.04.2009 12:30
Поиск с исправлением файлов Dekster Помощь студентам 7 12.01.2009 17:15