Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

ПЕРОВА САБАЕВА

.pdf
Скачиваний:
190
Добавлен:
11.03.2016
Размер:
1.4 Mб
Скачать

Рис. 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