Добавил:
ivanov666
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Программирование на С++ в среде разработки Qt Creator. Учебно-методическое пособие
.pdf
51
21
Массив Z[20]
сформировать по
правилу
i
x
z
i
i
2
2
=
x=1.2
Определить сумму первых восьми элементов и
количеств элементов, удовлетворяющих
условию zi>3.6
22
Массив B [20] целых
элементов задать
датчиком случайных
чисел..
Переписать в массив Х нечетные элементы
массива В, уменьшенные на 2.5 и найти сумму
элементов массива В.
23
Массив А[30]
нецелых элементов
задать датчиком
случайных чисел.
Вычислить сумму тех элементов, для которых
справедливо i+1<Ai<i+2 и произведение
отрицательных.
24
Массив С[20] целых
элементов вводят с
клавиатуры.
Определить количество элементов кратных 5 и
количество элементов, кратных 7 и сумму этих
элементов.
25
Массив Х[30]
нецелых элементов
задать датчиком
случайных чисел.
Переписать в массив Y подряд элементы
массива Х, удовлетворяющие условию 1.5<
i
x
<
5 и найти их среднее арифметическое.
26
Массив С[15]
нецелых элементов
вводят с клавиатуры.
Определить минимальный элемент массива С и
его порядковый номер. Заменить минимальный
элемент на 0.
27
Массив Х [16] целых
элементов вводят с
клавиатуры.
Переписать подряд в массив Y положительные
элементы массива Х, а и массив Zотрицательные элементы массива Х и
определить, сколько в массиве Y четных
элементов.
28
Массив А[30]
нецелых элементов
задать датчиком
случайных чисел.
Определить среднее арифметическое элементов
массива и подсчитать, сколько элементов
находится в пределах от -2.8 до 3.8.
29
Массив Z [30]
нецелых элементов
задать датчиком
случайных чисел.
Расположить в массиве R сначала
положительные, а затем отрицательные
элементы массива Z.
Содержание отчета
1.Номер и тема лабораторной работы.
2.Вариант задания.
3.Результаты подготовки:

52
- схема алгоритма обработки элементов массива,
- программа на заданном алгоритмическом языке.
4.Итоги работы:
- результаты расчета с текстовыми комментариями.
5. Ответы на контрольные вопросы.
Показать отчет преподавателю.
Контрольные вопросы
1.Какие ограничения накладываются на индексы элементов массивов?
2.Способы описания массивов на языке С++. Понятия размерности массивов,
описание размерности массивов.
3.Задание типов элементов массива. Могут ли элементы массива иметь
разный тип?
4.Как располагаются элементы массива в памяти?
5.Чем отличаются алгоритмы поиска максимального и минимального
элемента массива?
6.Что является общим во всех алгоритмах формирования и обработки
массивов?
7. Чем отличаются алгоритмы расчета суммы и подсчета числа элементов
массива?

53
Лабораторная работа №7
ОБРАБОТКА СИМВОЛЬНОЙ ИНФОРМАЦИИ
Цель работы: приобрести навыки разработки программ для обработки
символьной информации.
Подготовка к лабораторной работе
1. Подготовить текст исходного предложения в соответствии с вариантом
задачи, указанным в таблице (предложение должно заканчиваться
точкой, разделитель слов в предложении – пробел).
2. Составить две программы в стиле С и в стиле С++ для обработки
предложения согласно варианту задания и выполнить их на ПК
Работа со строками в стиле С
В языке С символьная строка – это одномерный массив типа char,
заканчивающийся нулевым байтом. Для нулевого байта определена
специальная символьная константа \0. Это необходимо учитывать при
описании соответствующего символьного массива. То есть, если строка
должна содержать N символов, то в описании массива необходимо указать
N+1 элемент. Например, описание char str[12] предполагает, что строка
содержит 11 символов, а последний байт зарезервирован под \0.
Строковая константа – это последовательность литер, заключенных в
двойные кавычки. Например, "Изучаем программирование". В конец
строковой константы не надо ставить символ \0. Это сделает сам компилятор,
и строка “Изучаем программирование” в памяти будет выглядеть так:
И з у ч а е м п р о г р…. \0
Есть два простых способа ввести строку с клавиатуры.
Первый способ воспользоваться функцией scanf()с форматом ввода %s.
Надо помнить, что функция scanf() вводит символы до первого
пробельного символа.
Второй способ воспользоваться функцией gets(), объявленной в файле
stdio.h. Функция gets() позволяет вводить строки, содержащие пробелы.
Ввод заканчивается нажатием клавиши Enter. Обе функции автоматически
добавляют в конце строки нулевой байт. В качестве параметра в этих
функциях используется имя массива.

54
Вывод строк производится с помощью функций printf() и puts(). Обе
функции выводят содержимое массива до первого нулевого байта. Функция
puts() добавляет в конце выводимой строки символ перехода на новую
строку экрана. В функции printf() переход на новую строку нужно
предусматривать в строке формата самим. Рассмотрим пример:
Ввод строки с клавиатуры и вывод ее на экран
# include <stdio.h>
int main()
{
char str[80];
printf("Введите строку длиной не более 80 символов");
gets(str);
printf(" Вы ввели строку %s\n",str);
printf("Введите еще одну строку ");
scanf("%s",str);
printf(" Вы ввели строку ");
puts(str);
}
Для работы со строками в стиле С существует специальная библиотека,
заголовочный файл которой называется string.h. Рассмотрим некоторые
функции из этой библиотеки.
strcmp(str1,str2) – сравнивает две строки str1 и str2 и возвращает 0, если
они одинаковы; результат отрицателен, если str1<str2 и положителен, если
str1>str2.
strncmp(str1, str2, kol) – сравниваются части строк str1 и str2 из kol
символов. Результат равен 0, если они одинаковы.
Сравнение двух строк выполняется последовательно слева неправо с учетом
кодировки символов. Например, сравнивая стоки st1 и st2
char st1[10]="Пример";
char st2[10]="ПPимер";
int a;
if (strcmp(st1,st2)>0) a=1;
else a=2;
переменной а будет присвоено значение 1, так как сравниваемые строки не
одинаковы, а код символа 'р' больше кода символа 'Р'.
strcat(str1,str2) - сцепление строк в порядке их перечисления.
strncat(str1,str2,kol) – приписывает kol символов строки str2 к строке str1.
Функция служит для объединения двух строк в одну. Например, в результате
выполнения операторов:

55
char fam[] = "Андреева С.В. ";
char pr[7]= " "; //7 пробелов
strcat(fam ,pr);
printf(“|%20s|”, fam);
на экран выведется строка:
|Андреева С.В. |
Заметим, что строка вывода занимает поле в 20 позиций, а переменная fam
располагается в левой части поля.
strlen(str) – определяет длину строки str.
Пример. Определить длину строки
char fam[] = "Андреева С.В.";
printf("%d",strlen(fam));
функция strlen() вернёт значение равное 13 (символов).
strcpy(str1,str2) – копирует строку str2 в строку str1.
strncpy(str1, str2, kol) – копирует kol символов строки str2 в строку str1.
Пример. Скопировать фамилию сотрудника в переменную fam и вывести на
экран.
#include "stdio.h"
#include <string.h>
int main()
{ char fam[15];
char *str = " АндрееваС.В.";
strcpy(fam, str);
printf("|%s|\n", fam);
return 0;
}
В результате выполнения данных операторов на экран будет выведена
строка:
|Андреева С.В.|
strchr(st, ch) - функция поиска адреса символа ch в строке st. Результатом
выполнения поиска является адрес найденного символа в строке st, иначе
возвращается нулевой адрес. Чтобы вычислить порядковый номер символа
ch в строке, можно из адреса P вычесть адрес начала строки.

56
Пример. В заданной фамилии определить порядковый номер символа ‘n’.
#include "stdio.h"
#include <string.h>
int main()
{ char fam[] = "Ivanov";
char a='n';
char *p;
p=strchr(fam,a);
if(p) //если указатель p не ноль,т.е символ n найден
printf("|%s|%d\n", fam, p-fam);
else
printf("нет такого символа в фамилии!\n");
return 0;
}
Основы работы со строками в C++
В языке C++ для удобной работы со строками есть класс string, для
использования которого необходимо подключить заголовочный файл cstring.
Строки можно объявлять и одновременно присваивать им значения:
string S1, S2 = "Hello";
Строка S1 будет пустой, строка S2 будет состоять из 5 символов.
К отдельным символам строки можно обращаться по индексу, как к
элементам массива или C-строк. Например S[0] – это первый символ строки.
Для того, чтобы узнать длину строки можно использовать метод size()
строки. Например, последний символ строки S это S[S.size() - 1].
Конструкторы строк
Строки можно создавать с использованием следующих конструкторов:
Конструкторы можно вызывать явно, например, так:
S += string(10, 'z');
В этом примере явно вызывается конструктор string для создания строки,
состоящей из 10 символов 'z'.
Неявно конструктор вызывается при объявлении строки с указанием
дополнительных параметров. Например, так:
string S(10, 'z');

57
Ввод-вывод строк
Строка выводится точно так же, как и числовые значения:
cout << S;
Для считывания строки можно использовать операцию ">>" для объекта cin:
cin >> S;
В этом случае считывается строка из не пробельных символов, пропуская
пробелы и концы строк. Это удобно для того, чтобы разбивать текст на слова,
или чтобы читать данные до конца файла при помощи while (cin >> S).
Можно считывать строки до появления символа конца строки при помощи
функции getline. Сам символ конца строки считывается из входного потока,
но к строке не добавляется:
getline(cin , S);
Арифметические операторы
Со строками можно выполнять следующие арифметические операции:
= - присваивание значения;
+= - добавление в конец строки другой строки или символа;
+ - конкатенация двух строк, конкатенация строки и символа;
==, != - посимвольное сравнение;
<, >, <=, >= - лексикографическое сравнение.
То есть можно скопировать содержимое одной строки в другую при помощи
операции S1 = S2, сравнить две строки на равенство при помощи S1 == S2,
сравнить строки в лексикографическом порядке при помощи S1 < S2, или
сделать сложение (конкатенацию) двух строк в виде S = S1 + S2.
Методы строк
У строк есть разные методы, многие из них можно использовать
несколькими разными способами (с разным набором параметров).
Рассмотрим эти методы подробней.
size
Метод size() возвращает длину строки. Возвращаемое значение является
беззнаковым типом (как и во всех случаях, когда функция возвращает
значение, равное длине строки или индексу элемента – эти значения
беззнаковые). Поэтому нужно аккуратно выполнять операцию вычитания из

58
значения, которое возвращает size(). Например, ошибочным будет запись
цикла, перебирающего все символы строки, кроме последнего, в виде for (int
i = 0; i < S.size() - 1; ++i).
Кроме того, у строк есть метод length(), который также возвращает длину
строки.
clear
S.clear() - очищает строчку, строка становится пустой.
empty
S.empty() - возвращает true, если строка пуста, false - если непуста.
push_back
S.push_back(c) - добавляет в конец строки символ c, вызывается с одним
параметром типа char.
append
Добавляет в конец строки несколько символов, другую строку или фрагмент
другой строки. Имеет много способов вызова.
S.append(n, c) - добавляет в конец строки n одинаковых символов, равных
с. n имеет целочисленный тип, c - char.
S.append(T) - добавляет в конец строки S содержимое строки T. T может
быть объектом класса string или C-строкой.
S.append(T, pos, count) - добавляет в конец строки S символы строки T
начиная с символа с индексом pos количеством count.
erase
S.erase(pos) - удаляет из строки S подстроку, начиная с символа с
индексом pos и до конца строки.
S.erase(pos, count) - удаляет из строки S подстроку, содержащую count
символов, начиная с символа с индексом pos или до конца строки, если pos
+ count > S.size().
insert
Вставляет в середину строки несколько символов, другую строку или
фрагмент другой строки. Способы вызова аналогичны способам вызова

59
метода append, только первым параметром является значение i - позиция, в
которую вставляются символы. Первый вставленный символ будет иметь
индекс i, а все символы, которые ранее имели индекс i и более сдвигаются
вправо.
S.insert(i, n, c) - вставить n одинаковых символов, равных с. n имеет
целочисленный тип, c - char.
S.insert(i, T) - вставить содержимое строки T. T может быть объектом
класса string или C-строкой.
S.insert(i, T, pos, count) - вставить символы строки T начиная с
символа с индексом pos количеством count.
substr
S.substr(pos) - возвращает подстроку данной строки начиная с символа с
индексом pos и до конца строки.
S.substr(pos, count) - возвращает подстроку данной строки начиная с
символа с индексом pos количеством count или до конца строки, если pos +
count > S.size().
replace
Заменяет фрагмент строки на несколько равных символов, другую строку
или фрагмент другой строки. Способы вызова аналогичны способам вызова
метода append, только первыми двумя параметрами являются два числа: pos
и count. Из данной строки удаляется count символов, начиная с символа pos,
и на их место вставляются новые символы.
S.replace(pos, count, n, c) - вставить n одинаковых символов, равных
с. n имеет целочисленный тип, c - char.
S.replace(pos, count, T) - вставить содержимое строки T. T может быть
объектом класса string или C-строкой.
S.replace(pos, count, T, pos2, count2) - вставить символы строки T
начиная с символа с индексом pos количеством count.
find
Ищет в данной строке первое вхождение другой строки str. Возвращается
номер первого символа, начиная с которого далее идет подстрока, равная
строке str. Если эта строка не найдена, то возвращается константа string::npos

60
(которая равна -1, но при этом является беззнаковой, то есть на самом деле
является большим беззнаковым положительным числом).
Если задано значение pos, то поиск начинается с позиции pos, то есть
возращаемое значение будет не меньше, чем pos. Если значение pos не
указано, то считается, что оно равно 0 - поиск осуществляется с начала
строки.
S.find(str, pos = 0) - искать первое входение строки str начиная с
позиции pos. Если pos не задано - то начиная с начала строки S.
S.find(str, pos, n) - искать в данной строке подстроку, равную первым n
символам строки str. Значение pos должно быть задано.
Порядок выполнения работы
1. Получить допуск к работе у преподавателя (показать домашние
заготовки).
2. Загрузить среду Qt Creator и создайте проект соответствующего типа.
3. Ввести текст программы.
4. Провести отладку программы.
5. Выполнить программу, провести анализ результатов и убедившись в
правильности решения, предъявить их преподавателю для проверки.
6. Занести результаты расчета в отчет.
7. Выйти из среды.
Составить две программы в стиле С и в стиле С++.
Таблица 6- Варианты заданий
Вариант
Условие задачи
1
Из заданного предложения, начиная с первой встретившейся
буквы 'а', переписать в новый массив все символы до первой
встретившейся буквы ' к'.
2
В исходном предложении удалить все символы пробела, создав
из оставшихся символов новый массив. Вывести
преобразованный текст и количество удаленных пробелов.
3
Определить, сколько раз в заданном предложении встречается
сочетание двух первых символов.
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
