ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 04.12.2023
Просмотров: 933
Скачиваний: 9
ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
#include
#include
…
ifstream F("k7.txt");
string s;
getline( F, s );
-
алгоритм обработки строки тот же, что и в программах на языках Python и Pascal, рассмотренных выше, однако проверка того, что символ – один из набора A, B, C записывается по-другому
if( s[i]=='A' || s[i]=='B' || s[i]=='C' )
-
Полная программа на языке С++:
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.
Решение:
-
сначала нужно открыть файл и прочитать все символы в символьную строку:
with open("k7.txt", "r") as F:
s = F.readline()
-
теперь задача свелась к определению наибольшего количества подряд идущих букв C в символьной строке s (этот алгоритм приведён в начале файла) -
полная программа на языке 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):
-
далее мы будем использовать язык PascalABC.NET, который обладает двумя важными достоинствами, упрощающими решение таких задач:
-
позволяет легко переключать входной поток с консоли на нужный файл:
assign( input, 'k7.txt' );
теперь можно писать программу так же, как и при вводе данных с клавиатуры, а она на самом деле будет читать их из указанного файла;
-
не имеет ограничения на длину строк (переменных типа string); в устаревших версиях языка Pascal длина строки не может превышать 255 символов
-
читаем одну строку из файла в строковую переменную s:
readln(s);
-
теперь можно в цикле перебрать все символы строки s:
for i:=1 to Length(s) do
обработать s[i]
-
обработка символа выполняется по алгоритму, описанному выше (см. программу на Python) -
полная программа на языке 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++):
-
в C++ удобно работать с файлами через файловые потоки; для того, чтобы использовать эту возможность, нужно подключить заголовочный файл fstream:
#include
-
для того чтобы читать всю строку целиком с помощью функции getline, нужно подключить заголовочный файл string:
#include
-
теперь можно открыть файловый поток, связать его с нужным файлом и прочитать из потока строку в переменную типа string:
ifstream F("k7.txt");
string s;
getline( F, s );
-
алгоритм обработки строки тот же, что и в программах на языках Python и Pascal, рассмотренных выше -
поскольку в программе используется много объектов из пространства имён std, имеет смысл подключить его в начале программы:
using namespace std;
-
полная программа на языке 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;
}
Решение методом грубой силы (Б.С. Михлин):
-
если решить красиво не получается, можно применить метод грубой силы, использующий встроенную функцию поиска подстроки: ищём строку из одного символа C, потом – из двух символов, из трёх и т.д.; в какой-то момент поиск не даст результата, значит ответ – это длина предыдущей цепочки, которая короче текущей на единицу -
вот решение на Python:
with open( "k7.txt", "r" ) as F:
s = F.readline()
cc = 'C'
while cc in s:
cc += 'C'
print( len(cc)-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.
-
решение на 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;
}
-
эту задачу можно решать вообще без программирования, используя функцию поиска в любом текстовом редакторе или процессоре; для ускорения можно сначала удваивать длину искомой цепочки, а после того, как поиск закончится неудачно, применять двоичный поиск в интервале -
конечно, нужно понимать, что эффективность (скорость работы) этого алгоритма крайне низкая в сравнении с описанным выше однопроходным поиском, но на небольших файлах и этот метод вполне может сработать.
Решение в электронных таблицах (Б.С. Михлин):
-
можно применить тот же метод грубой силы, использующий электронные таблицы. Сначала откроем файл в текстовом редакторе и скопируем все его содержимое в буфер обмена. Затем откроем новую электронную таблицу и вставим строку из буфера обмена в какую-нибудь ячейку (в примере ниже это ячейка А2). Затем в окне «Найти» вбиваем один символ «С» и нажимаем кнопку «Найти все», потом два символа «С», три и т.д., пока не появится сообщение «…не удается найти искомые данные». Значит максимальная длина подцепочки из символов «С», входящая в заданную цепочку, на единицу меньше. При большой длине максимальной подцепочки при подсчете в ней количества символов легко ошибиться. -
можно также использовать встроенные текстовые функции электронных таблиц: FIND (НАЙТИ) или SEARCH (ПОИСК) и REPT (ПОВТОР). Меняя в функции ПОВТОР коэффициент повторения символа "C" мы повторяем идею п. 1. Для ускорения поиска можно коэффициент повторения менять сперва с крупным шагом, а затем с более мелким. Также можно обойтись только одной ячейкой с формулой.
Функции НАЙТИ и ПОИСК выводят положение начала искомой подцепочки в заданной цепочке символов или сообщение #ЗНАЧ!, если подцепочка не найдена. Если поиск надо осуществлять с начала цепочки, то третий параметр функций НАЙТИ и ПОИСК можно не указывать. Функция НАЙТИ учитывает регистр символов. Функция ПОИСК не учитывает регистр символов и в ней можно использовать подстановочные символы (* и ?).
Вот решение задачи в OpenOffice Calc:
и в русской версии Excel:
Задачи для тренировки:
-
В текстовом файле1 k7-0.txt находится цепочка из символов латинского алфавита A, B, C. Найдите длину самой длинной подцепочки, состоящей из символов C. -
В текстовом файле k7-3.txt находится цепочка из символов латинского алфавита A, B, C. Найдите длину самой длинной подцепочки, состоящей из символов C. -
В текстовом файле k7-5.txt находится цепочка из символов латинского алфавита A, B, C. Найдите длину самой длинной подцепочки, состоящей из символов C. -
В текстовом файле k7-20.txt находится цепочка из символов латинского алфавита A, B, C. Найдите длину самой длинной подцепочки, состоящей из символов C. -
В текстовом файле k7-25.txt находится цепочка из символов латинского алфавита A, B, C. Найдите длину самой длинной подцепочки, состоящей из символов C. -
В текстовом файле k7-29.txt находится цепочка из символов латинского алфавита A, B, C. Найдите длину самой длинной подцепочки, состоящей из символов C. -
В текстовом файле k7-40.txt находится цепочка из символов латинского алфавита A, B, C. Найдите длину самой длинной подцепочки, состоящей из символов C. -
В текстовом файле k7-42.txt находится цепочка из символов латинского алфавита A, B, C. Найдите длину самой длинной подцепочки, состоящей из символов C. -
В текстовом файле k7-44.txt находится цепочка из символов латинского алфавита A, B, C. Найдите длину самой длинной подцепочки, состоящей из символов C. -
В текстовом файле k7-45.txt находится цепочка из символов латинского алфавита A, B, C. Найдите длину самой длинной подцепочки, состоящей из символов C. -
В текстовом файле k7-53.txt находится цепочка из символов латинского алфавита A, B, C. Найдите длину самой длинной подцепочки, состоящей из символов C. -
В текстовом файле k7-70.txt находится цепочка из символов латинского алфавита A, B, C. Найдите длину самой длинной подцепочки, состоящей из символов C. -
В текстовом файле k7-75.txt находится цепочка из символов латинского алфавита A, B, C. Найдите длину самой длинной подцепочки, состоящей из символов C. -
В текстовом файле k7-80.txt находится цепочка из символов латинского алфавита A, B, C. Найдите длину самой длинной подцепочки, состоящей из символов C. -
В текстовом файле k7-84.txt находится цепочка из символов латинского алфавита A, B, C. Найдите длину самой длинной подцепочки, состоящей из символов C. -
В текстовом файле k7-91.txt находится цепочка из символов латинского алфавита A, B, C. Найдите длину самой длинной подцепочки, состоящей из символов C. -
В текстовом файле k7-94.txt находится цепочка из символов латинского алфавита A, B, C. Найдите длину самой длинной подцепочки, состоящей из символов C. -
В текстовом файле k7-96.txt находится цепочка из символов латинского алфавита A, B, C. Найдите длину самой длинной подцепочки, состоящей из символов C. -
В текстовом файле k7-97.txt находится цепочка из символов латинского алфавита A, B, C. Найдите длину самой длинной подцепочки, состоящей из символов C. -
В текстовом файле k7-100.txt находится цепочка из символов латинского алфавита A, B, C. Найдите длину самой длинной подцепочки, состоящей из символов C. -
(А.М. Кабанов) В текстовом файле k7a-1.txt находится цепочка из символов латинского алфавита A, B, C, D, E. Найдите длину самой длинной подцепочки, состоящей из символов A, B или C (в произвольном порядке). -
(А.М. Кабанов) В текстовом файле k7a-2.txt находится цепочка из символов латинского алфавита A, B, C, D, E, F. Найдите длину самой длинной подцепочки, состоящей из символов A, C, D (в произвольном порядке). -
(А.М. Кабанов) В текстовом файле k7a-3.txt находится цепочка из символов латинского алфавита A, B, C, D, E, F. Найдите длину самой длинной подцепочки, состоящей из символов A, B, E, F (в произвольном порядке). -
(А.М. Кабанов) В текстовом файле k7a-4.txt находится цепочка из символов латинского алфавита A, B, C, D, E, F. Найдите длину самой длинной подцепочки, не содержащей символа D. -
(А.М. Кабанов) В текстовом файле k7a-5.txt находится цепочка из символов латинского алфавита A, B, C, D, E, F. Найдите длину самой длинной подцепочки, не содержащей символов C и F. -
(А.М. Кабанов) В текстовом файле k7a-6.txt находится цепочка из символов латинского алфавита A, B, C, D, E, F. Найдите длину самой длинной подцепочки, не содержащей гласных букв. -
(А.М. Кабанов) В текстовом файле k7b-1.txt находится цепочка из символов латинского алфавита A, B, C, D, E. Найдите максимальную длину цепочки вида EABEABEABE... (состоящей из фрагментов EAB, последний фрагмент может быть неполным). -
(А.М. Кабанов) В текстовом файле k7b-2.txt находится цепочка из символов латинского алфавита A, B, C, D, E, F. Найдите максимальную длину цепочки вида DBACDBACDBAC.... (состоящей из фрагментов DBAC, последний фрагмент может быть неполным). -
(А.М. Кабанов) В текстовом файле k7b-3.txt находится цепочка из символов латинского алфавита A, B, C, D, E, F. Найдите максимальную длину цепочки вида BAFEBAFEBAFE... (состоящей из фрагментов BAFE, последний фрагмент может быть неполным). -
(А.М. Кабанов) В текстовом файле k7b-4.txt находится цепочка из символов латинского алфавита A, B, C, D, E, F. Найдите максимальную длину цепочки вида EBCFEBCFEBCF.... (состоящей из фрагментов EBCF, последний фрагмент может быть неполным). -
(А.М. Кабанов) В текстовом файле k7b-5.txt находится цепочка из символов латинского алфавита A, B, C, D, E, F. Найдите максимальную длину цепочки вида CACACA.... (состоящей из фрагментов CA, последний фрагмент может быть неполным). -
(А.М. Кабанов) В текстовом файле k7b-6.txt находится цепочка из символов латинского алфавита A, B, C, D, E, F. Найдите максимальную длину цепочки вида DAFDAFDAF.... (состоящей из фрагментов DAF, последний фрагмент может быть неполным). -
(А.М. Кабанов) В текстовом файле k7c-1.txt находится цепочка из символов латинского алфавита A, B, C, D, E. Найдите количество цепочек длины 3, удовлетворяющих следующим условиям:
-
1-й символ – один из символов B, C или D; -
2-й символ – один из символов B, D, E, который не совпадает с первым; -
3-й символ – один из символов B, C, E, который не совпадает со вторым.
-
(А.М. Кабанов) В текстовом файле k7c-2.txt находится цепочка из символов латинского алфавита A, B, C, D, E, F. Найдите количество цепочек длины 3, удовлетворяющих следующим условиям:
-
1-й символ – один из A, C, E; -
2-й символ – один из A, D, F, который не совпадает с первым; -
3-й символ – один из A, B, F, который не совпадает со вторым.
-
(А.М. Кабанов) В текстовом файле k7c-3.txt находится цепочка из символов латинского алфавита A, B, C, D, E, F. Найдите количество цепочек длины 3, удовлетворяющих следующим условиям:
-
2-й символ – один из B, D, E; -
3-й символ – один из A, C, D, который не совпадает со вторым; -
1-й символ – совпадает с третьим.
-
(А.М. Кабанов) В текстовом файле k7c-4.txt находится цепочка из символов латинского алфавита A, B, C, D, E, F. Найдите количество цепочек длины 3, удовлетворяющих следующим условиям:
-
3-й символ – один из C, D, F; -
1-й символ – один из A, D, F, который не совпадает с третьим; -
2-й символ – один из C, D, F, который не совпадает с третьим.
-
(А.М. Кабанов) В текстовом файле k7c-5.txt находится цепочка из символов латинского алфавита A, B, C, D, E, F. Найдите количество цепочек длины 5, в которых соседние символы не совпадают. -
(А.М. Кабанов) В текстовом файле k7c-6.txt находится цепочка из символов латинского алфавита A, B, C, D, E, F. Найдите количество цепочек длины 3, в которых символы не совпадают. -
(Б.С. Михлин) В текстовом файле k7-m1.txt находится цепочка из прописных (заглавных) символов латинского алфавита A, B, C. Найдите длину самой короткой подцепочки, состоящей из символов C (C-подцепочки). В ответе через пробел укажите: длину найденной подцепочки (если C-подцепочек нет, то 0), количество C-подцепочек и длину исходной цепочки. -
(Б.С. Михлин) В текстовом файле k7-m2.txt находится цепочка из прописных (заглавных) символов латинского алфавита A, B, C. Найдите длину самой длинной подцепочки, состоящей из символов C (C-подцепочки). В ответе через пробел укажите: длину найденной подцепочки (если C-подцепочек нет, то 0), количество C-подцепочек и длину исходной цепочки. -
(Б.С. Михлин) В текстовом файле k7-m3.txt находится цепочка из прописных (заглавных) символов латинского алфавита A, B, C. Найдите все подцепочки, состоящие из символов C (C-подцепочки) длиной не более четырех. В ответе через пробел укажите: порядковый номер найденной подцепочки (начиная с единицы) при проходе по исходной цепочке слева направо, длину подцепочки и саму подцепочку, заменив в ней, начиная со второго символа «С», большие «С» на «с» строчные (маленькие). Гарантируется, что в исходной цепочке есть C-подцепочки. -
(Б.С. Михлин) В текстовом файле k7-m4.txt находится цепочка из прописных (заглавных) символов латинского алфавита A, B, C. Найдите все подцепочки, состоящие из символов C (C-подцепочки) длиной не менее шести. В ответе через пробел укажите: порядковый номер найденной подцепочки (начиная с единицы) при проходе по исходной цепочке СПРАВА НАЛЕВО, ее длину и саму подцепочку, заменив в ней все символы «С» слева от правого символа «С» на «с» строчное (маленькое). Гарантируется, что в исходной цепочке есть C-подцепочки. -
(Б.С. Михлин) В текстовом файле k7-m5.txt находится цепочка из прописных (заглавных) символов латинского алфавита A, B, C. В исходной цепочке замените все найденные C-подцепочки на подцепочки, содержащие длину текущей С-подцепочки с последующей текущей C-подцепочкой с замененными символами «С» большими на «с» маленькие. В ответе в трех строчках выведите: