Файл: Обработка символьных строк.doc

ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 06.11.2023

Просмотров: 813

Скачиваний: 15

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.




ifstream F("k7.txt");

string s;

getline( F, s );

  1. алгоритм обработки строки тот же, что и в программах на языках Python и Pascal, рассмотренных выше, однако проверка того, что символ – один из набора A, B, C записывается по-другому

if( s[i]=='A' || s[i]=='B' || s[i]=='C' )

  1. Полная программа на языке С++:

using namespace std;

#include

#include

#include

int main(){

ifstream F("k7.txt");

string s;

getline( F, s );

int count = 0, maxCount = 0;

for( int i = 0; i < s.length(); i++ )

if( s[i] == 'A' || s[i] == 'B' || s[i] == 'C' ) {

count ++;

if( count > maxCount )

maxCount = count;

}

else count = 0;

cout << maxCount;

}

Ещё пример задания:


Р-01. В текстовом файле k7.txt находится цепочка из символов латинского алфавита A, B, C. Найдите длину самой длинной подцепочки, состоящей из символов C.

Решение:

  1. сначала нужно открыть файл и прочитать все символы в символьную строку:

with open("k7.txt", "r") as F:

s = F.readline()

  1. теперь задача свелась к определению наибольшего количества подряд идущих букв C в символьной строке s (этот алгоритм приведён в начале файла)

  2. полная программа на языке Python:

with open( "k7.txt", "r" ) as F:

s = F.readline()

maxLen, cLen = 0, 0

for c in s:

if c == 'C':

cLen += 1

if cLen > maxLen:

maxLen = cLen

else:

cLen = 0

print( maxLen )

Решение (программа на языке Pascal):

  1. далее мы будем использовать язык PascalABC.NET, который обладает двумя важными достоинствами, упрощающими решение таких задач:

  • позволяет легко переключать входной поток с консоли на нужный файл:

assign( input, 'k7.txt' );

теперь можно писать программу так же, как и при вводе данных с клавиатуры, а она на самом деле будет читать их из указанного файла;

  • не имеет ограничения на длину строк (переменных типа string); в устаревших версиях языка Pascal длина строки не может превышать 255 символов

  1. читаем одну строку из файла в строковую переменную s:

readln(s);

  1. теперь можно в цикле перебрать все символы строки s:

for i:=1 to Length(s) do

обработать s[i]

  1. обработка символа выполняется по алгоритму, описанному выше (см. программу на Python)

  2. полная программа на языке Pascal:

var maxLen, cLen, i: integer;

s: string;

begin

assign(input, 'k7.txt');

readln(s);

maxLen := 0;


cLen := 0;

for i:=1 to Length(s) do

if s[i] = 'C' then begin

cLen := cLen + 1;

if cLen > maxLen then maxLen := cLen;

end

else

cLen := 0;

writeln(maxLen);

end.

Решение (программа на языке C++):

  1. в C++ удобно работать с файлами через файловые потоки; для того, чтобы использовать эту возможность, нужно подключить заголовочный файл fstream:

#include

  1. для того чтобы читать всю строку целиком с помощью функции getline, нужно подключить заголовочный файл string:

#include

  1. теперь можно открыть файловый поток, связать его с нужным файлом и прочитать из потока строку в переменную типа string:

ifstream F("k7.txt");

string s;

getline( F, s );

  1. алгоритм обработки строки тот же, что и в программах на языках Python и Pascal, рассмотренных выше

  2. поскольку в программе используется много объектов из пространства имён std, имеет смысл подключить его в начале программы:

using namespace std;

  1. полная программа на языке C++:

#include

#include

#include

using namespace std;

int main()

{

ifstream F("k7.txt");

string s;

getline( F, s );

int maxLen = 0, cLen = 0;

for( int i = 0; i < s.length(); i++ )

if( s[i] == 'C' ) {

cLen ++;

if( cLen > maxLen )

maxLen = cLen;

}

else cLen = 0;

cout << maxLen;

}

Решение методом грубой силы (Б.С. Михлин):

  1. если решить красиво не получается, можно применить метод грубой силы, использующий встроенную функцию поиска подстроки: ищём строку из одного символа C, потом – из двух символов, из трёх и т.д.; в какой-то момент поиск не даст результата, значит ответ – это длина предыдущей цепочки, которая короче текущей на единицу

  2. вот решение на Python:

with open( "k7.txt", "r" ) as F:

s = F.readline()

cc = 'C'

while cc in s:

cc += 'C'

print( len(cc)-1 )

  1. решение на Паскале:

var cc, s: string;

begin

assign(input, 'k7.txt');

readln(s);

cc := 'C';

while Pos(cc, s) > 0 do

cc := cc + 'C';

writeln( Length(cc)-1 );

end.

  1. решение на C++:

#include

#include

#include

using namespace std;

int main()

{

ifstream F("k7.txt");

string s, cc;

getline( F, s );

cc = 'C';

while( s.find(cc) != string::npos )

cc += 'C';

cout << cc.length()-1;

}

  1. эту задачу можно решать вообще без программирования, используя функцию поиска в любом текстовом редакторе или процессоре; для ускорения можно сначала удваивать длину искомой цепочки, а после того, как поиск закончится неудачно, применять двоичный поиск в интервале

  2. конечно, нужно понимать, что эффективность (скорость работы) этого алгоритма крайне низкая в сравнении с описанным выше однопроходным поиском, но на небольших файлах и этот метод вполне может сработать.


Решение в электронных таблицах (Б.С. Михлин):

  1. можно применить тот же метод грубой силы, использующий электронные таблицы. Сначала откроем файл в текстовом редакторе и скопируем все его содержимое в буфер обмена. Затем откроем новую электронную таблицу и вставим строку из буфера обмена в какую-нибудь ячейку (в примере ниже это ячейка А2). Затем в окне «Найти» вбиваем один символ «С» и нажимаем кнопку «Найти все», потом два символа «С», три и т.д., пока не появится сообщение «…не удается найти искомые данные». Значит максимальная длина подцепочки из символов «С», входящая в заданную цепочку, на единицу меньше. При большой длине максимальной подцепочки при подсчете в ней количества символов легко ошибиться.

  2. можно также использовать встроенные текстовые функции электронных таблиц: FIND (НАЙТИ) или SEARCH (ПОИСК) и REPT (ПОВТОР). Меняя в функции ПОВТОР коэффициент повторения символа "C" мы повторяем идею п. 1. Для ускорения поиска можно коэффициент повторения менять сперва с крупным шагом, а затем с более мелким. Также можно обойтись только одной ячейкой с формулой.

Функции НАЙТИ и ПОИСК выводят положение начала искомой подцепочки в заданной цепочке символов или сообщение #ЗНАЧ!, если подцепочка не найдена. Если поиск надо осуществлять с начала цепочки, то третий параметр функций НАЙТИ и ПОИСК можно не указывать. Функция НАЙТИ учитывает регистр символов. Функция ПОИСК не учитывает регистр символов и в ней можно использовать подстановочные символы (* и ?).

Вот решение задачи в OpenOffice Calc:



и в русской версии Excel:



Задачи для тренировки:


  1. В текстовом файле1 k7-0.txt находится цепочка из символов латинского алфавита A, B, C. Найдите длину самой длинной подцепочки, состоящей из символов C.

  2. В текстовом файле k7-3.txt находится цепочка из символов латинского алфавита A, B, C. Найдите длину самой длинной подцепочки, состоящей из символов C.

  3. В текстовом файле k7-5.txt находится цепочка из символов латинского алфавита A, B, C. Найдите длину самой длинной подцепочки, состоящей из символов C.

  4. В текстовом файле k7-20.txt находится цепочка из символов латинского алфавита A, B, C. Найдите длину самой длинной подцепочки, состоящей из символов C.

  5. В текстовом файле k7-25.txt находится цепочка из символов латинского алфавита A, B, C. Найдите длину самой длинной подцепочки, состоящей из символов C.

  6. В текстовом файле k7-29.txt находится цепочка из символов латинского алфавита A, B, C. Найдите длину самой длинной подцепочки, состоящей из символов C.

  7. В текстовом файле k7-40.txt находится цепочка из символов латинского алфавита A, B, C. Найдите длину самой длинной подцепочки, состоящей из символов C.

  8. В текстовом файле k7-42.txt находится цепочка из символов латинского алфавита A, B, C. Найдите длину самой длинной подцепочки, состоящей из символов C.

  9. В текстовом файле k7-44.txt находится цепочка из символов латинского алфавита A, B, C. Найдите длину самой длинной подцепочки, состоящей из символов C.

  10. В текстовом файле k7-45.txt находится цепочка из символов латинского алфавита A, B, C. Найдите длину самой длинной подцепочки, состоящей из символов C.

  11. В текстовом файле k7-53.txt находится цепочка из символов латинского алфавита A, B, C. Найдите длину самой длинной подцепочки, состоящей из символов C.

  12. В текстовом файле k7-70.txt находится цепочка из символов латинского алфавита A, B, C. Найдите длину самой длинной подцепочки, состоящей из символов C.

  13. В текстовом файле k7-75.txt находится цепочка из символов латинского алфавита A, B, C. Найдите длину самой длинной подцепочки, состоящей из символов C.

  14. В текстовом файле k7-80.txt находится цепочка из символов латинского алфавита A, B, C. Найдите длину самой длинной подцепочки, состоящей из символов C.

  15. В текстовом файле k7-84.txt находится цепочка из символов латинского алфавита A, B, C. Найдите длину самой длинной подцепочки, состоящей из символов C.

  16. В текстовом файле k7-91.txt находится цепочка из символов латинского алфавита A, B, C. Найдите длину самой длинной подцепочки, состоящей из символов C.

  17. В текстовом файле k7-94.txt находится цепочка из символов латинского алфавита A, B, C. Найдите длину самой длинной подцепочки, состоящей из символов C.

  18. В текстовом файле k7-96.txt находится цепочка из символов латинского алфавита A, B, C. Найдите длину самой длинной подцепочки, состоящей из символов C.

  19. В текстовом файле k7-97.txt находится цепочка из символов латинского алфавита A, B, C. Найдите длину самой длинной подцепочки, состоящей из символов C.

  20. В текстовом файле k7-100.txt находится цепочка из символов латинского алфавита A, B, C. Найдите длину самой длинной подцепочки, состоящей из символов C.

  21. (А.М. Кабанов) В текстовом файле k7a-1.txt находится цепочка из символов латинского алфавита A, B, C, D, E. Найдите длину самой длинной подцепочки, состоящей из символов A, B или C (в произвольном порядке).

  22. (А.М. Кабанов) В текстовом файле k7a-2.txt находится цепочка из символов латинского алфавита A, B, C, D, E, F. Найдите длину самой длинной подцепочки, состоящей из символов A, C, D (в произвольном порядке).

  23. (А.М. Кабанов) В текстовом файле k7a-3.txt находится цепочка из символов латинского алфавита A, B, C, D, E, F. Найдите длину самой длинной подцепочки, состоящей из символов A, B, E, F (в произвольном порядке).

  24. (А.М. Кабанов) В текстовом файле k7a-4.txt находится цепочка из символов латинского алфавита A, B, C, D, E, F. Найдите длину самой длинной подцепочки, не содержащей символа D.

  25. (А.М. Кабанов) В текстовом файле k7a-5.txt находится цепочка из символов латинского алфавита A, B, C, D, E, F. Найдите длину самой длинной подцепочки, не содержащей символов C и F.

  26. (А.М. Кабанов) В текстовом файле k7a-6.txt находится цепочка из символов латинского алфавита A, B, C, D, E, F. Найдите длину самой длинной подцепочки, не содержащей гласных букв.

  27. (А.М. Кабанов) В текстовом файле k7b-1.txt находится цепочка из символов латинского алфавита A, B, C, D, E. Найдите максимальную длину цепочки вида EABEABEABE... (состоящей из фрагментов EAB, последний фрагмент может быть неполным).

  28. (А.М. Кабанов) В текстовом файле k7b-2.txt находится цепочка из символов латинского алфавита A, B, C, D, E, F. Найдите максимальную длину цепочки вида DBACDBACDBAC.... (состоящей из фрагментов DBAC, последний фрагмент может быть неполным).

  29. (А.М. Кабанов) В текстовом файле k7b-3.txt находится цепочка из символов латинского алфавита A, B, C, D, E, F. Найдите максимальную длину цепочки вида BAFEBAFEBAFE... (состоящей из фрагментов BAFE, последний фрагмент может быть неполным).

  30. (А.М. Кабанов) В текстовом файле k7b-4.txt находится цепочка из символов латинского алфавита A, B, C, D, E, F. Найдите максимальную длину цепочки вида EBCFEBCFEBCF.... (состоящей из фрагментов EBCF, последний фрагмент может быть неполным).

  31. (А.М. Кабанов) В текстовом файле k7b-5.txt находится цепочка из символов латинского алфавита A, B, C, D, E, F. Найдите максимальную длину цепочки вида CACACA.... (состоящей из фрагментов CA, последний фрагмент может быть неполным).

  32. (А.М. Кабанов) В текстовом файле k7b-6.txt находится цепочка из символов латинского алфавита A, B, C, D, E, F. Найдите максимальную длину цепочки вида DAFDAFDAF.... (состоящей из фрагментов DAF, последний фрагмент может быть неполным).

  33. (А.М. Кабанов) В текстовом файле k7c-1.txt находится цепочка из символов латинского алфавита A, B, C, D, E. Найдите количество цепочек длины 3, удовлетворяющих следующим условиям:


  • 1-й символ – один из символов B, C или D;

  • 2-й символ – один из символов B, D, E, который не совпадает с первым;

  • 3-й символ – один из символов B, C, E, который не совпадает со вторым.

  1. (А.М. Кабанов) В текстовом файле k7c-2.txt находится цепочка из символов латинского алфавита A, B, C, D, E, F. Найдите количество цепочек длины 3, удовлетворяющих следующим условиям:

  • 1-й символ – один из A, C, E;

  • 2-й символ – один из A, D, F, который не совпадает с первым;

  • 3-й символ – один из A, B, F, который не совпадает со вторым.

  1. (А.М. Кабанов) В текстовом файле k7c-3.txt находится цепочка из символов латинского алфавита A, B, C, D, E, F. Найдите количество цепочек длины 3, удовлетворяющих следующим условиям:

  • 2-й символ – один из B, D, E;

  • 3-й символ – один из A, C, D, который не совпадает со вторым;

  • 1-й символ – совпадает с третьим.

  1. (А.М. Кабанов) В текстовом файле k7c-4.txt находится цепочка из символов латинского алфавита A, B, C, D, E, F. Найдите количество цепочек длины 3, удовлетворяющих следующим условиям:

  • 3-й символ – один из C, D, F;

  • 1-й символ – один из A, D, F, который не совпадает с третьим;

  • 2-й символ – один из C, D, F, который не совпадает с третьим.

  1. (А.М. Кабанов) В текстовом файле k7c-5.txt находится цепочка из символов латинского алфавита A, B, C, D, E, F. Найдите количество цепочек длины 5, в которых соседние символы не совпадают.

  2. (А.М. Кабанов) В текстовом файле k7c-6.txt находится цепочка из символов латинского алфавита A, B, C, D, E, F. Найдите количество цепочек длины 3, в которых символы не совпадают.

  3. (Б.С. Михлин) В текстовом файле k7-m1.txt находится цепочка из прописных (заглавных) символов латинского алфавита A, B, C. Найдите длину самой короткой подцепочки, состоящей из символов C (C-подцепочки). В ответе через пробел укажите: длину найденной подцепочки (если C-подцепочек нет, то 0), количество C-подцепочек и длину исходной цепочки.

  4. (Б.С. Михлин) В текстовом файле k7-m2.txt находится цепочка из прописных (заглавных) символов латинского алфавита A, B, C. Найдите длину самой длинной подцепочки, состоящей из символов C (C-подцепочки). В ответе через пробел укажите: длину найденной подцепочки (если C-подцепочек нет, то 0), количество C-подцепочек и длину исходной цепочки.

  5. (Б.С. Михлин) В текстовом файле k7-m3.txt находится цепочка из прописных (заглавных) символов латинского алфавита A, B, C. Найдите все подцепочки, состоящие из символов C (C-подцепочки) длиной не более четырех. В ответе через пробел укажите: порядковый номер найденной подцепочки (начиная с единицы) при проходе по исходной цепочке слева направо, длину подцепочки и саму подцепочку, заменив в ней, начиная со второго символа «С», большие «С» на «с» строчные (маленькие). Гарантируется, что в исходной цепочке есть C-подцепочки.

  6. (Б.С. Михлин) В текстовом файле k7-m4.txt находится цепочка из прописных (заглавных) символов латинского алфавита A, B, C. Найдите все подцепочки, состоящие из символов C (C-подцепочки) длиной не менее шести. В ответе через пробел укажите: порядковый номер найденной подцепочки (начиная с единицы) при проходе по исходной цепочке СПРАВА НАЛЕВО, ее длину и саму подцепочку, заменив в ней все символы «С» слева от правого символа «С» на «с» строчное (маленькое). Гарантируется, что в исходной цепочке есть C-подцепочки.

  7. (Б.С. Михлин) В текстовом файле k7-m5.txt находится цепочка из прописных (заглавных) символов латинского алфавита A, B, C. В исходной цепочке замените все найденные C-подцепочки на подцепочки, содержащие длину текущей С-подцепочки с последующей текущей C-подцепочкой с замененными символами «С» большими на «с» маленькие. В ответе в трех строчках выведите: