ПЕРОВА САБАЕВА
.pdfРис. 6.4. Результат работы программы листинга 6.2
Листинг 6.3. В файле с именем «input.txt» содержится информация о количестве чисел и сами числа (рис. 6.5). Необходимо сформировать массив, не содержащий повторяющихся значений. Этот алгоритм был рассмотрен в главе 1. При работе с файлом он выглядит следующим образом.
//L6_3.cpp
#include <string.h> #include <fstream> #include <iostream> using namespace std; int main( )
{
setlocale(LC_CTYPE,"russian"); int n,i,m=0,*x,tmp;
fstream ff("input.txt"),f1; //Открытие файла "input.txt"
ff>>n; |
//Чтение n |
x=new int[n]; |
//Запрос памяти под массив |
ff>>tmp; |
|
while(!ff.eof()) |
|
{ |
|
for(i=0;i<m;i++) |
|
if(x[i]==tmp)
|
break; |
if(i==m) |
//Если такого элемента еще не было, |
|
//дополняем его и увеличиваем индекс |
|
53 |
//элемента массива. x[m++]=tmp;
ff>>tmp;
}
ff.close(); //Закрытие файла
//Открываем файл "input.txt" для пополнения f1.open("input.txt", ios::app);
f1<<"\nПолученный вектор размерностью "<<m<<'\n'; for(i=0;i<m;i++)
{
f1.width(5); |
//Под выводимый объект выделяем 5 позиций |
f1.setf(ios::left); |
//В поле вывода значение прижать к левому краю |
f1<<x[i]; |
|
} |
|
f1.close(); |
//Закрытие файла |
return 0; |
|
}
Содержимое файла "input.txt"
Рис. 6.5. Информация, находящаяся в файле «input.txt»
На рис. 6.6 представлен результат выполнения программы листинга 6.3.
Рис. 6.6. Результат работы программы листинга 6.3
УПРАЖНЕНИЯ
1.Даны два массива целых чисел a и b, каждый их которых не содержит повторяющихся элементов. Исходная информация записана в файле. Построить пересечение массивов a и b.
2.Даны два массива целых чисел a и b, каждый их которых не содержит повторяющихся элементов. Исходная информация записана в файле. Построить объединение массивов a и b.
54
3.Даны два массива целых чисел a и b, каждый их которых не содержит повторяющихся элементов. Исходная информация записана в файле. Построить симметричную разность массивов a и b.
4.Даны два массива целых чисел a и b, каждый их которых не содержит повторяющихся элементов. Исходная информация записана в файле. Построить дополнение массива a до массива b.
5.Задан произвольный массив. Исходная информация записана в файле. Построить массив только из значений, входящих в него один раз.
6.Задан произвольный массив. Исходная информация записана в файле. Построить массив только из значений, входящих в него более одного раза.
7.В файле задан список сотрудников с указанием фамилии, отдела, названия месяца и заработанной сотрудником за этот месяц заработнойя платы. Создать список отделов и вычислить общую сумму заработной платы сотрудников каждого отдела.
8.В файле задан список сотрудников с указанием фамилии, отдела, названия месяца и заработанной сотрудником за этот месяц заработной платы. Создать список сотрудников и вычислить общую сумму их заработной платы.
9.В файле задан список сотрудников с указанием фамилии, отдела,
названия месяца и заработанной сотрудником за этот месяц заработной платы. Создать список отделов и вычислить общую сумму заработной платы за каждый месяц.
10.В файле задан список студентов с указанием предмета и оценки за экзамен. Составить список студентов с указанием их среднего балла за сессию.
11.В файле задан список студентов с указанием предмета и оценки за экзамен. Составить список предметов с указанием среднего балла по этому предмету в сессию.
12.Задан произвольный массив. Исходная информация записана в файле. Построить массив только из уникальных значений, с указанием, сколько раз элемент входит в исходный массив.
13.В файле задан список слов. Составить список уникальных слов с указанием, сколько раз они встречаются в исходном списке.
14.В файле задан список слов. Составить список слов, встречающихся в списке только один раз.
15. В файле задан список слов. Составить список слов, встречающихся в списке более одного раза.
16.В файле задан произвольный набор чисел. Создать массив неповторяющихся чисел с указанием о том, сколько раз число встречается в исходном массиве, и упорядочить числа по возрастанию частоты повторяемости.
17.В файле задан произвольный набор чисел. Создать массив неповторяющихся положительных чисел с указанием о том, сколько раз
55
число встречается в исходном массиве, и упорядочить числа по убыванию частоты повторяемости.
18.Даны два массива целых чисел a и b, каждый их которых не содержит повторяющихся элементов. Исходная информация записана в файле. Построить симметричную разность массивов a и b и упорядочить ее по убыванию.
19.Даны два массива целых чисел a и b, каждый их которых не содержит повторяющихся элементов. Исходная информация записана в файле. Построить пересечение массивов a и b, исключая отрицательные элементы.
20.В файле содержится список налоговой инспекции с указанием фамилии, года и суммы задолженностей за указанный год. Построить список должников с указанием их суммарной задолженности.
21.В файле содержится список налоговой инспекции с указанием фамилии, года и суммы задолженностей за указанный год. Построить список годов с указанием суммарной задолженности и определить год с максимальной задолженностью.
22.В файле задан список студентов с указанием предмета и оценки за экзамен. Составить список оценок с указанием их повторяемости за сессию. Определить наиболее часто встречающиея оценки.
23.В файле задан список сотрудников с указанием фамилии, отдела, названия месяца и заработанной сотрудником за этот месяц заработной платы. Создать список отделов и общего количества сотрудников в отделе. Определить отдел с максимальным числом сотрудников.
24.В файле задан текст. Определить частоту повторяемости входящих в текст латинских букв. Строчные и прописные буквы считать одинаковыми.
25.В файле задан текст. Определить частоту повторяемости входящих в текст цифр.
56
ГЛАВА 7. ОБРАБОТКА ПОСЛЕДОВАТЕЛЬНОСТИ СИМВОЛОВ
При обработке последовательности символов наиболее часто используются следующие три алгоритма [26]:
алгоритм выделения слова из строки;
выбор слов, подходящих под шаблон;
перевод прописных символов в строчные.
7.1.Алгоритм выделения слова из строки
Алгоритм выделения слова из строки заключается в нахождении индекса, соответствующего началу слова (первый не пробельный символ), и индекса первого после окончания слова пробела или признака конца строки (символ ‘\0’). Существование слова гарантируется отличной от нуля разностью между вторым и первым символом.
Листинг 7.1. Определить число слов в тексте, записанном в файле.
//L7_1.cpp
#include <fstream> #include <iostream> using namespace std;
int sum_word(char*st);//Прототип функции int main( )
{
int sum=0; |
|
char s[81]; |
|
fstream f("input.txt"),f1; |
|
f.getline(s,80); |
//Читаем строку из файла |
while(!f.eof()) |
//Проверка достижения конца файла |
{ |
|
sum+=sum_word(s); |
//Добавляем в сумму число |
|
//слов в текущей строке. |
f.getline(s,80); |
//Чистим следующую строку |
}
f.close();
f1.open("input.txt",ios::app); //Открываем файл для пополнения f1<<"\n\nЧисло слов в тексте = "<<sum<<'\n';
f1.close(); return 0;
}
//Функция, определяющая число слов в строке: int sum_word(char *st)
57
{
int s=0,b,e=0; while(st[e] != '\0')
{
//Пропускаем ведущие пробелы: while(st[e] != '\0' && st[e] == ' ')
e++;
b=e;
//Пропускаем символы слова: while(st[e] != '\0' && st[e]!=' ')
e++;
if(e-b>0) //Слово выделено s++;
}
return s;
}
Результат работы программы листинга 7.1 приведен на рис. 7.1.
В файле с именем “input.txt” содержится информация о количестве чисел и сами числа.
Необходимо сформировать массив, не содержащий повторяющихся значений.
Этот алгоритм был рассмотрен в главе 1. При работе с файлом он выглядит следующим образом.
Число слов в тексте = 35
Рис. 7.1. Результат работы программы листинга 7.1
7.2. Выбор слов, подходящих под шаблон
Выбор слов, подходящих под шаблон, является одним из наиболее применяемых алгоритмов. Например, задано слово, в котором встречаются символы ‘*’ и ‘?’. Такие слова будем называть шаблоном. Если в произвольном слове символы совпадают с символами шаблона, а вместо символа ‘*’ можно использовать любую последовательность символов и вместо ‘?’ – любой символ, то говорят, что слово подходит под шаблон. Например, пароход и паропровод подходят под шаблон паро*од. В первом случае под ‘*’ скрывается последова-
58
тельность “х”, а во втором – “пров”. Под шаблон ?а?а подходят слова мама и папа.
Листинг 7.2. Функция shablon ( ) проверяет, подходит ли слово под шаблон вида ‘*’.
//L7_2.cpp
int shablon(char *word, char *sh)
{
int b, e, si=0, ls;
while(sh[si] != '\0' && sh[si] != '*') si++; //Если символ ‘*’ отсутствует:
if(si == strlen(sh) && strcmp(word, sh) == 0) return 1;
if(si == strlen(sh) && strcmp(word, sh) != 0) return 0;
//si – индекс символа ‘*’ в шаблоне. //Проверяем совпадение до ‘*’: for(b=0; b<si; b++)
if(word[b] != sh[b]) break;
if(b<si) |
//Символы не совпали |
return 0; |
|
else
{
//Проверяем совпадение после ‘*’:
for(e=strlen(word)-1, ls = strlen(sh)-1; sh[ls] != '*'; e--, ls--) if(word[e] != sh[ls])
break;
if(sh[ls] != '*') //Символы не совпали с символом ‘*’ return 0;
else |
//Символы совпали до и после ‘*’ |
|
return 1; |
}
7.3. Перевод прописных символов в строчные
При обработке последовательности символов также часто используется процедура – перевод символов верхнего регистра (прописные символы) в символы нижннего регистра (строчные символы).
Листинг 7.3. Функция A_to_a ( ) переводит прописные символы в строч-
ные.
59
//L7_3.cpp
char A_to_a(char c)
{
if(c >='А' && c <= 'Я') c = c + 'а ' - 'А';
return c;
}
УПРАЖНЕНИЯ
1.В файле задан текст. Определить количество слов в тексте, которые начинаются и заканчиваются на одну и ту же букву.
2.В файле задан текст. Создать массив из уникальных слов в тексте, подходящих под заданный шаблон, включающий в себя символы “?”.
3.В файле задан текст. Определить количество слов в тексте, которые являются палиндромами. Слово называется палиндромом, если чтение слева направо и справа налево дает один и тот же результат. Строчные и прописные буквы не различать.
4.В файле задан текст. Создать массив из уникальных слов в тексте, подходящих под заданный шаблон, включающий в себя символы “*”.
5.В файле задан текст. Определить количество строк в тексте, которые являются палиндромами, если игнорировать пробелы. Строчные и прописные буквы не различать.
6.Используя функцию из раздела 7.3, которая переводит прописные буквы в строчные буквы, преобразовать текст, находящийся в файле.
7.Написать функцию, определяющую число гласных букв в слове. В тексте, записанном в файле, определить слово с максимальным числом гласных букв.
8.Написать функцию, определяющую число гласных букв в слове. В тексте, записанном в файле, определить слово с минимальным числом гласных букв.
9.В файле задан текст. Написать функцию, определяющую длину слова. С помощью этой функции определить количество слов в тексте, имеющих заданную длину. Найденные слова записать в выходной файл.
10.В файле задан текст. Написать функцию, определяющую длину слова. С помощью этой функции определить слова максимальной длины. Найденные слова записать в исходный файл.
11.В файле задан текст. Создать массив из слов этого текста, являющихся палиндромами, которые подходят под заданный шаблон, включающий в себя символы “?”.
12.В файле задан текст. Записать в новый файл четные строки исходного текста с указанием их номера в исходном тексте.
60
13.В файле задан текст. Написать функцию, определяющую длину слова. Применяя эту функцию, в выходной файл записать слова с указанием их длины.
14.В файле задан текст. Написать функцию, определяющую длину слова. С помощью этой функции определить, сколько слов в тексте имеют длину, больше заданной длины. Найденные слова записать в выходной файл.
15.В файле задан текст. Написать функцию, определяющую длину слова. С помощью этой функции определить, сколько слов в тексте имеют длину, меньше заданной длины. Найденные слова записать в выходной файл.
16.В файле задан текст. Определить строки, количество слов в которых совпадает с заданным числом. Найденные строки записать в выходной файл с указанием их номера в исходном файле.
17.В файле задан текст. Определить строки, количество слов в которых меньше заданного числа. Найденные строки записать в выходной файл с указанием их номера в исходном файле.
18.В файле задан текст. Определить строки, количество слов в которых больше заданного числа. Найденные строки записать в выходной файл с указанием их номера в исходном файле.
19.В файле задан текст. Написать функцию, определяющую, подходит ли слово под заданный шаблон, содержащий символ ‘?’. Определить число слов в тексте файла, которые подходят под заданный шаблон.
20.В файле задан текст. Написать функцию, определяющую, подходит ли слово под заданный шаблон, содержащий символ ‘*’. Определить число слов в тексте файла, которые подходят под заданный шаблон.
21.В файле задан текст. Написать функцию, определяющую, подходит ли слово под заданный шаблон, содержащий символ ‘*’. Найти слова в тексте файла, подходящие под заданный шаблон, и имеющие длину меньше заданной.
22.В файле задан текст. Написать функцию, определяющую, подходит ли слово под заданный шаблон, содержащий символ ‘*’. Найти слова в тексте файла, подходящие под заданный шаблон, и имеющие длину больше заданной.
23.В файле задан текст. Написать функцию, определяющую, подходит ли слово под заданный шаблон, содержащий символ ‘?’. Найти слова в тексте файла, подходящие под заданный шаблон, и имеющие длину меньше заданной.
24.В файле задан текст. Написать функцию, определяющую, подходит ли слово под заданный шаблон, содержащий символ ‘?’. Найти слова в тексте файла, подходящие под заданный шаблон, и имеющие длину, больше заданной.
25.Написать функцию, определяющую длину слова. В тексте, записанном в файле, определить число слов с нечетным числом букв. Найденные слова с указанием их длины записать в выходной файл.
61
ГЛАВА 8. ПОБИТОВЫЕ ОПЕРАЦИИ
Побитовые операции можно применять только к целочисленным операндам типа char, short, int, long. Они действуют на отдельные разряды двоичного представления чисел. В С++ определены следующие побитовые операции [32]:
| – побитовое логическое ИЛИ;
&– побитовое логическое И;
^– побитовое исключающее ИЛИ;
~ – побитовое логическое отрицание; << – сдвиг влево;
>>– сдвиг вправо.
Результаты действия побитовых операций на операнды a и b представлены в табл. 8.1.
Таблица 8.1
Побитовые операции
a |
b |
a|b |
a&b |
a^b |
~a |
1 |
1 |
1 |
1 |
0 |
0 |
0 |
1 |
1 |
0 |
1 |
1 |
1 |
0 |
1 |
0 |
1 |
0 |
0 |
0 |
0 |
0 |
0 |
1 |
Операция побитового логического отрицания (~) является унарной. В результате этой операции каждый бит, имеющий значение 1, становится равным 0 и наоборот. Данная операция называется также дополнением до единицы или
инверсией.
Результатом операции сдвига влево (<<) является левый операнд, сдвинутый влево на число позиций, которое указано в правом операнде. Освобождающиеся младшие разряды заполняются нулями [24, 25]. Данная операция может применяться для умножения на число, равное степени числа 2, в соответствии с правилом:
x << n эквивалентно умножению х на 2 в степени n.
Результатом операции сдвига вправо (>>) является левый операнд, сдвинутый вправо на число позиций, которое указано в правом операнде. Освобождающиеся старшие разряды заполняются нулями для переменных типа unsigned либо значением старшего (знакового) бита для данных другого типа [24, 25]. Данная операция может применяться для деления на число, равное степени числа 2, в соответствии с правилом:
x >> n эквивалентно делению х на 2 в степени n.
62