МЕТОДИЧЕСКИЕ УКАЗАНИЯ ПО ВЫПОЛНЕНИЮ ЛАБОРАТОРНЫХ РАБОТ по учебной дисциплине «Основы алгоритмизации и программирования» код, специальность 09.02.06 Сетевое и системное администрирование
методическая разработка
АННОТАЦИЯ
Выполнение лабораторных работ является обязательной частью обучения по дисциплине «Основы алгоритмизации и программирования» специальности Целью занятий является: систематизация, закрепление и углубление теоретических 09.02.06 Сетевое и системное администрирование знаний по дисциплине и составляющих ее профессиональных компетенций.
Задачи лабораторных работ содержат 25 вариантов, отличающихся друг от друга исходными данными и содержанием работ.
Скачать:
Вложение | Размер |
---|---|
![]() | 130.56 КБ |
Предварительный просмотр:
Министерство образования и науки Российской Федерации
Федеральное государственное бюджетное образовательное учреждение высшего образования
«Московский государственный технический университет имени Н.Э. Баумана»
(национальный исследовательский университет)
Московский техникум космического приборостроения
МЕТОДИЧЕСКИЕ УКАЗАНИЯ ПО ВЫПОЛНЕНИЮ ЛАБОРАТОРНЫХ РАБОТ
по учебной дисциплине «Основы алгоритмизации и программирования»
код, специальность 09.02.06 Сетевое и системное администрирование
Москва
2022
СОГЛАСОВАНО: Предметно-цикловой комиссией специальности 09.02.07 Информационные системы и программирование Протокол № ___ от _________ 2022 года Председатель предметно-цикловой комиссии Е.А. Митрошенкова Подпись Инициалы Фамилия | Разработано на основе Федерального государственного образовательного стандарта по специальности среднего профессионального образования 09.02.06 Сетевое и системное администрирование Заместитель директора по учебной (учебно-методической) работе
Подпись Инициалы Фамилия | |
Составитель (автор): Тамахина И.А., преподаватель ФГБОУ МГТУ имени Н.Э. Баумана
Ф.И.О., ученая степень, звание, должность, наименование ФГБОУ
______________________И.А. Тамахина
Подпись Инициалы Фамилия
СОДЕРЖАНИЕ
Лабораторная работа № 1 «Оператор выбора» 5
Лабораторная работа № 2 «Оператор цикла» 8
Лабораторная работа № 3 «Работа с массивами» 14
Лабораторная работа № 5 «Работа с файлами» 20
Лабораторная работа № 6 «Подпрограммы» 27
Лабораторная работа № 7 «Разработка оконного приложения» 32
АННОТАЦИЯ
Выполнение лабораторных работ является обязательной частью обучения по дисциплине «Основы алгоритмизации и программирования» специальности Целью занятий является: систематизация, закрепление и углубление теоретических 09.02.06 Сетевое и системное администрирование знаний по дисциплине и составляющих ее профессиональных компетенций.
Задачи лабораторных работ содержат 25 вариантов, отличающихся друг от друга исходными данными и содержанием работ.
Лабораторная работа № 1 «Оператор выбора»
Цель работы:
- сформировать навыки по решению задач, используя оператор выбора;
- научиться выделять из множества вариантов решения задачи группы значений, объединенных одинаковыми условиями.
Постановка задачи: Составить программу выбора соответствующего решения из несколько возможных.
Содержание задания:
- Составить схему алгоритма и программу на языке программирования с использованием оператора множественного выбора switch;
- Выполнить ручной просчет.
- Отладить и протестировать программу для различных значений исходных данных.
- Оформить отчет.
Содержание отчета:
- Тема (название) лабораторной работы.
- Постановка конкретной задачи (вариант задания).
- Схема алгоритма решаемой задачи.
- Листинг программы.
- Результаты ручного просчета.
- Результаты работы программы (скриншоты).
Теоретические сведения:
Оператор выбора предназначен для организации выбора одной из любого количества ветвей алгоритма в зависимости от значения некоторого выражения. Оператор выбора обычно используется, когда требуется выполнять много проверок и использование вложенных операторов if слишком громоздко.
Оператор множественного выбора switch имеет следующую форму:
switch (/* переменная или выражение*/)
{
case /* константное выражение1*/
{ /*группа операторов*/; break; }
case /* константное выражение2*/
{ /*группа операторов*/; break; }
// . . .
default;
{ /*группа операторов*/; break; }
}
Алгоритм работы оператора следующий:
- На начальном этапе анализируется выражение или переменная.
2. После чего осуществляется переход к той ветви программы, для которой значение переменной или выражения совпадает с указанным константным выражением.
3. Далее выполняется оператор или группа операторов пока не встретится зарезервированное слово break или закрывающая фигурная скобка. В случае отсутствия break, происходит переход на следующую ветвь.
4. Если выражение переменной или выражения не совпадает ни с одним константным выражением, то передается управление ветви программы, содержащей зарезервированное слово default (по умолчанию). После чего выполняется оператор или группа операторов данной ветви.
Пример:
В игре «Поле чудес» Вам предлагают 5 шкатулок. Одна из них пустая, а в остальных четырех находится какая-то сумма денег. Составить программу, которая по выбранному номеру определяет Ваш выигрыш/невыигрыш. Программа может иметь следующий вид:
int main()
{int s1=100, s2=5000, s3=1000, s4=0, s5=500,N;
cout<<”\n\n\nKakoi nomer shkatulki vybiraete?”;
cin>>N;
switch(N)
{
case 1: cout<<”\n Vyigrush = “<
case 2: cout<<”\n Vyigrush = “<
case 3: cout<<”\n Vyigrush = “<
case 4: cout<<”\n Vyigrush = “<
case 5: cout<<”\n Vyigrush = “<
default: cout<<”\n Takogo nomera net\n\n”;
}
system(“pause”);
return 0;
}
Решение:
Kakoi nomer shkatulki vybiraete?3
Vyigrush = 1000 rublei
Для продолжения нажмите любую клавишу . . .
Управляющий символ “\n” используется для перехода на новую строку.
Индивидуальные задания:
1. Написать программу, которая по номеру дня недели выдает в качестве результата количество уроков в вашем классе в этот день.
2. Составить программу, которая по заданным году и номеру месяца m, определяет количество дней в этом месяце.
3. Для каждой введенной цифры (0 — 9) вывести соответствующее ей название на английском языке (0 — zero, 1 — one, 2 — two,... ).
Контрольные вопросы:
- Какие знаки операции сравнения в С++ используются в операциях выбора?
- Какие специальные символы С++ используются для обозначения логических операций?
- Расскажите о структуре выбора if (ЕСЛИ)
- Расскажите о структуре выбора Структура выбора if/else (ЕСЛИ-ИНАЧЕ)
- Расскажите о структуре выбора switch
- Для чего в структуре выбора switch используется зарезервированное слово break?
- Для чего в структуре выбора switch используется зарезервированное слово case?
- В каких случаях в программе на С++ ставится двоеточие «:»?
- Что происходит, если не поставлен оператор break в структуре выбора switch?
Лабораторная работа № 2 «Оператор цикла»
Цель работы: приобретение навыков программирования циклических процессов. Изучение циклов с параметром, постусловием и предусловием.
Содержание задания:
- Составить схему алгоритма и программу на языке программирования с использованием операторов цикла.
- Выполнить ручной просчет.
- Отладить и протестировать программу.
- Оформить отчет.
Содержание отчета:
- Тема (название) лабораторной работы.
- Постановка конкретной задачи (вариант задания).
- Схема алгоритма решаемой задачи.
- Листинг программы.
- Результаты ручного просчета.
6. Результаты работы программы (скриншоты).
Методические указания:
Циклы в C++
Иногда необходимо повторять одно и то же действие несколько раз подряд. Для этого используют циклы. В этом уроке мы научимся программировать циклы на C++, после чего посчитаем сумму всех чисел от 1 до 1000.
Цикл for
Если мы знаем точное количество действий (итераций) цикла, то можем использовать цикл for. Синтаксис его выглядит примерно так:
for (действие до начала цикла;
условие продолжения цикла;
действия в конце каждой итерации цикла) {
инструкция цикла;
инструкция цикла 2;
инструкция цикла N;
}
Итерацией цикла называется один проход этого цикла
Существует частный случай этой записи, который сегодня и разберем:
for (счетчик = значение; счетчик < значение; шаг цикла) {
тело цикла;
}
Счетчик цикла — это переменная, в которой хранится количество проходов данного цикла.
Описание синтаксиса
- Сначала присваивается первоначальное значение счетчику, после чего ставится точка с запятой.
- Затем задается конечное значение счетчика цикла. После того, как значение счетчика достигнет указанного предела, цикл завершится. Снова ставим точку с запятой.
- Задаем шаг цикла. Шаг цикла — это значение, на которое будет увеличиваться или уменьшаться счетчик цикла при каждом проходе.
Пример кода
Напишите программу, вычисляющую сумму цифр от 1 до1000. Результат вычислений вывести в консоль.
Решение задачи
#include
using namespace std ;
int main ( )
{
setlocale (LC_ALL, "rus" ) ;
// s − суммы , i − счетчик
int s , i ;
s = 0 ;
//цикл , вычисляющий сумму от 1 до 1000
for ( i = 0 ; i <= 1000 ; i++)
{
s = s + i ;
}
//вывод информации в консоль
cout << "Сумма чисел от 1 до 1000 равна " << s ;
}
Если мы скомпилируем этот код и запустим программу, то она покажет нам ответ: 500500. Это и есть сумма всех целых чисел от 1 до 1000. Если считать это вручную, понадобится очень много времени и сил. Цикл выполнил всю рутинную работу за нас.
Конечное значение счетчика задано нестрогим неравенством ( <= — меньше либо равно), но, если бы был поставлен знак меньше, то цикл произвел бы 999 итераций, т.е. на одну меньше, чем требуется Значение шага цикла задано равное единице. i++ — это тоже самое, что и i = i + 1.
В теле цикла, при каждом проходе программа увеличивает значение переменной sum на i. Еще один очень важный момент — в начале программы было присвоено переменной sum значение нуля. Если бы этого не сделать, то программа вылетела вы в сегфолт (ошибка сегментации). При объявлении переменной без ее инициализации что эта переменная будет хранить «мусор».
Естественно к мусору мы ничего прибавить не можем. Некоторые компиляторы инициализирует переменную нулем при ее объявлении.
Цикл while
Когда мы не знаем, сколько итераций должен произвести цикл, нам понадобится цикл while или do...while. Синтаксис цикла while в C++ выглядит следующим образом.
while (Условие)
{
Тело цикла;
}
#include
using namespace std:
int main()
{
setlocale(0,” “);
int i=0; // инициализируем счетчик цикла
int sum=0; // инициализируем счетчик суммы
while(i<1000)
{
i++;
sum+=i;
}
cout<<” Сумма чисел от 1 до 1000 = “<
return 0;}
После компиляции программа выдаст результат, аналогичный результату работы предыдущей программы. Но поясним несколько важных моментов. Я задал строгое неравенство в условии цикла и инициализировал счетчик i нулем, так как в цикле while происходит на одну итерацию больше, потому он будет выполняться, до тех пор, пока значение счетчика перестает удовлетворять условию, но данная итерация все равно выполнится. Если бы мы поставили нестрогое неравенство, то цикл бы закончился, когда переменная i стала бы равна 1001 и выполнилось бы на одну итерацию больше.
Теперь давайте рассмотрим по порядку исходный код нашей программы. Сначала мы инициализируем счетчик цикла и переменную, хранящую сумму чисел.
В данном случае мы обязательно должны присвоить счетчику цикла какое-либо значение, т.к. в предыдущей программе мы это значение присваивали внутри цикла for, здесь же, если мы не инициализируем счетчик цикла, то в него попадет «мусор» и компилятор выдаст нам ошибку. Затем мы описываем условие цикла — «пока переменная i меньше 1000 — выполняй цикл». При каждой итерации цикла значение переменной-счетчика i увеличивается на единицу внутри цикла.
Когда выполнится 1000 итераций цикла, счетчик станет равным 999 и следующая итерация уже не выполнится, поскольку 1000 не меньше 1000.
Выражение sum += i является укороченной записью sum = sum + i.
После окончания выполнения цикла, выводим сообщение с ответом.
Пример
Напишите программу, выводящую N раз число K (N и K вводятся в консоли пользователем).
#include
using namespace std ;
int main ( )
{
s e t l o c a l e (LC_ALL, "rus" ) ;
// i − счетчик
int n , k , i =1;
cout << "Какое число будем выводить в консоли?" << endl ;
//ввод чисел k и n
cin >> k ;
cout << "Сколько раз будем выводить число?" << endl ;
cin >> n ;
//цикл выводит число k до тех пор, пока
//счетчик меньше n
while ( i <= n)
{
cout << k<<" " ;
i++;
}
return 0 ;
}
Цикл do while
Цикл do while очень похож на цикл while. Единственное их различие в том, что при выполнении цикла do while один проход цикла будет выполнен независимо от условия. Решение задачи на поиск суммы чисел от 1 до 1000, с применением цикла do while.
#include
using namespace std:
int main()
{
setlocale(0,” “);
int i=0; //инициализация счетчика цикла
int sum=0; //инициализация счетчика суммы
do { //выполняем цикл
i++;
sum+=i;
} while (i<1000); //пока выполняется условие
cout<< “Сумма чисел от 1 до 1000 = “<
return 0;
}
Принципиального отличия нет, но если присвоить переменной i значение, большее, чем 1000, то цикл все равно выполнит хотя бы один проход.
Как прервать цикл в с++?
Чтобы прервать выполнение цикла и выйти из него, используется оператор break; чтобы прервать и вернуться к его началу - оператор continue.
Пример цикла с постусловием:
Написать программу, выводящую в консоль n первых четных положительных чисел (включая 0).
#include
2 using namespace std ;
4int main ( ) {
s e t l o c a l e (LC_ALL, "rus" ) ;
int n , i = 0 ;
cout << "Сколько четных чисел необходимо вывести?" << endl ;
cout << "n = " ; c in >> n ;
do {
cout << i++ ∗ 2 << " " ;
} while ( i < n) ;
cout << endl ;
return 0 ;}
Индивидуальные задания:
Написать программу на языке С++ решения задачи согласно своему варианту.
Задание 1. Написать программу, вычисляющую значение функции
𝑓(𝑥) = 0.5 * 𝑒 + 𝑠𝑖𝑛(𝑥) на отрезке [−1; 1] с шагом ℎ = 0.1.
Задание 2.
- Составить таблицу умножения для заданного числа N, которая содержит результаты умножения 1×N, 2×N, ..., N×N, где N - целое число.
- Вывести на экран таблицу значений функции y=x3 при изменении x в интервале от A до B с шагом h.
- Вывести на экран таблицу значений функций y=x2+1 и g=1/x на отрезке [0,5…1,5] с шагом 0,1. Значения х вывести с одной цифрой в дробной части, значения y и g - с тремя цифрами в дробной части.
- Вычислить сумму первых N натуральных чисел.
- Вычислить сумму
, где n∈N.
Контрольные вопросы:
- Формат оператора цикла с предусловием.
- Какой из циклов может не выполниться ни разу?
- Какой из циклов выполнится хотя бы один раз?
- Формат оператора цикла с постусловием.
- Формат оператора цикла с параметром.
- Объясните смысл элементов заголовка оператора цикла for в примере программы.
- Что задает первое выражение оператора цикла с параметром?
- Что задает второе выражение оператора цикла с параметром?
- Что задает третье выражение оператора цикла с параметром?
Лабораторная работа № 3 «Работа с массивами»
Цель работы: изучение массивов в языке С++. Знакомство с основными алгоритмами работы с массивами.
Содержание задания:
- Составить схему алгоритма и программу ввода массива, используя подсказки и комментарии.
- Вывод массива организовать с помощью арифметического цикла в наглядной форме.
- Выполнить отладку и тестирование программы для массивов разных типов.
- Оформить отчет.
- Ответить на контрольные вопросы.
Содержание отчета:
- Тема (название) лабораторной работы.
- Постановка конкретной задачи (вариант задания).
- Схема алгоритма решаемой задачи.
- Листинг программы.
- Результаты работы программы (скриншоты).
Методические указания:
Массив представляет набор однотипных данных. Формальное определение массива выглядит следующим образом:
тип_переменной название_массива [длина_массива] |
После типа переменной идет название массива, а затем в квадратных скобках его размер. Например, определим массив из 4 чисел:
int numbers[4]; |
Число элементов массива также можно определять через константу:
const int n = 4; int numbers[n]; // содержит 4 элемента |
Некоторые компиляторы также поддерживают установку размера с помощью переменных.
Данный массив имеет четыре числа, но все эти числа имеют неопределенное значение. Чтобы установить значения элементов массива, указываются фигурные скобки (инициализатор), внутри которых перечисляются значения для элементов массива:
int numbers[4] {}; // {0, 0, 0, 0} |
В данном случае фигурные скобки пусты, поэтому все элементы массива получают нулевые значения.
Также мы можем указать конкретные значения для всех элементов массива:
int numbers[4] {1, 2, 3, 4}; |
В данном случае в памяти выделяется некоторая область из четырех ячеек по 4 байта (размер типа int), где каждая ячейка содержит определенный элемент массива:
numbers[0] | numbers[1] | numbers[2] | numbers[3] |
1 | 2 | 3 | 4 |
Если значений в инициализаторе меньше, чем элементов в массиве, то значения передаются первым элементам, а остальные получают нулевые значения:
int numbers[4] {1, 2}; // {1, 2, 0, 0} |
Если значений в инициализаторе больше, чем элементов в массиве, то при компиляции возникнет ошибка:
int numbers[4] {1, 2, 3, 4, 5, 6}; // ! Ошибка |
Здесь массив имеет размер 4, однако ему передается 6 значений.
Если размер массива не указан явно, то он выводится из количества переданных значений:
int numbers[] {1, 2, 3, 4, 5, 6}; |
В данном случае в массиве есть 6 элементов.
При этом не допускается присвоение одному массиву другого массива:
int nums1[] {1,2,3,4,5}; int nums2[] = nums1; // ошибка |
Индексы. Получение и изменение элементов массива
После определения массива мы можем обратиться к его отдельным элементам по индексу. Индексы начинаются с нуля, поэтому для обращения к первому элементу необходимо использовать индекс 0. Обратившись к элементу по индексу, мы можем получить его значение, либо изменить его. Например, получим второй элемент (индекс 1):
1 | int n = numbers[1]; |
Изменение значения второго элемента:
1 | numbers[1] = 123; |
Например, получим и изменим значения элементов:
1 2 3 4 5 6 7 | #include int main() { int numbers[4]{1,2,3,4}; int first = numbers[0]; // получаем первый элемент std::cout << first << std::endl; // 1 numbers[0] = 34; / изменяем значение элемента std::cout << numbers[0] << std::endl; // 34 } |
При обращении по индексу следует учитывать, что мы не можем обратиться по несуществующему индексу. Так, если в массиве 4 элемента, то мы можем использовать индексы с 0 до 3 для обращения к его элементам. Использование любого другого индекса приведет к ошибке:
1 2 | int numbers[4]{1,2,3,4}; int forth = numbers[4]; // !Ошибка - в массиве только 4 элемента |
Константные массивы
Если необходимо, чтобы нельзя было изменять значения элементов массива, то такой массив можно определить как константный с помощью ключевого слова const
const int numbers[4]{1,2,3,4}; // numbers[1] = 23;//ошибка–значения элементов массива изменить нельзя |
Длина массива
Длина массива не всегда бывает известна. Однако может потребоваться получить ее. Для этого можно использовать несколько способов. Первый способ, который пришел из языка С, представляет применение оператора sizeof:
#include int main() { int numbers[]{11, 12, 13, 14}; std::cout<<"Length:" < } |
По сути, длина массива равна совокупной длине его элементов. Все элементы представляют один и тот же тип и занимают один и тот же размер в памяти. Поэтому с помощью выражения sizeof(numbers) находим длину всего массива в байтах, а с помощью выражения sizeof(numbers[0]) - длину одного элемента в байтах. Разделив два значения, можно получить количество элементов в массиве.
Второй способ представляет применение встроенной библиотечной функции std::size():
#include int main() { int numbers[]{11, 12, 13, 14}; int count = std::size(numbers); std::cout << "Length: " << count << std::endl; // Length: 4 } |
Перебор массивов
Используя циклы, можно пробежаться по всему массиву и через индексы обратиться к его элементам:
#include
Using namespace std;
Int main()
{
Const int n=4;
Int numbers[n] {11, 12, 13, 14};
For (int i=0; i
{
Cout<
}
} |
Чтобы пройтись по массиву в цикле, надо знать его длину. Здесь длина задана константой n. Вначале надо найти длину массива. И в цикле for перебираем все элементы, пока счетчик i не станет равным длине массива. В итоге на консоль будут выведены все элементы массива:
Другой пример - вычислим сумму элементов массива:
#include
int main(){
int numbers[]{1, 2, 3, 4};
int sum {};
for (int i {}; i < std::size(numbers); sum += numbers[i++]);
std::cout << "Sum: " << sum << std::endl; // Sum: 10
}
Здесь длина массива вычисляется динамически - с помощью функции std::size().
Перебор элементов в стиле for-each
Используем другую форму цикла for, которая предназначена специально для перебора последовательностей, в том числе для массивов
#include
using name space std:
int main()
{
int numbers[4] {1,2,3,4};
for(int n : numbers)
{
std::cout << n << std::endl;
}
}
При переборе массива каждый перебираемый элемент будет помещаться в переменную number, значение которой в цикле выводится на консоль.
Если нам неизвестен тип объектов в массиве, то мы можем использовать спецификатор auto для определения типа:
for(auto n : numbers)
{
std::cout << n << std::endl;
}
Ввод значений массива с консоли
Подобно тому, как вводятся данные для отдельных переменных, можно вводить значения для отдельных элементов массива. Например, пусть пользователь вводит значения числового массива:
#include
using name space std:
int main()
{
const int max {6}; // максимальная длина массива - не больше 6 чисел
int numbers[max]; // массив для ввода чисел
int i{}; // счетчик введенных чисел
std::cout << "Enter numbers" << std::endl;
while(i < max)
{
std::cin >> numbers[i]; // вводим число
i++;
}
// выводим массив
for (i =0; i < max; ++i)
{
std::cout << numbers[i] << "\t";
}
std::cout << std::endl; }
Здесь в цикле сначала вводятся шесть чисел для каждого элемента массива, затем выводим этот массив.
Варианты заданий
1. Напишите программу, в которой определен одномерный массив чисел int. Пользователь должен вводить с консоли значения для всех элементов массива. После завершения ввода всех чисел программа должна вывести элементы массива в обратном порядке.
2. Даны x1, x2, …, x8.
Определить N – количество xi с чётными номерами, меньшими x1 и xmax/2.
3. Даны x1, x2, …, x15. Сформировать массив Y по формуле .
Определить сумму yi с нечётными индексами.
4. Задан ряд x1, x2, …, x20. Построить новый ряд, где на месте xmin и xmax стоит сумма (x1 + x20)/2. Определить сумму элементов нового ряда.
5. Дана квадратная матрица X (4х4). Получить скалярное произведение соответствующих строк и столбцов. Номера строки и столбца ввести с клавиатуры.
6. Дана матрица X (3х4). Определить максимальный элемент в каждой строке матрицы.
7. Дана матрица Y (5х5). Сформировать вектор, состоящий из элементов главной диагонали
Контрольные вопросы:
- Массивы. Виды массивов.
- Правила объявления и обработки.
- Алгоритмы ввода и вывода массивов
- Поиск максимального и минимального элементов массива
- Поиск элемента массива по заданному признаку.
- Поиск суммы и произведения элементов массива
- Задание и обработка индексов элементов массива
Лабораторная работа № 4 «Символы и строки»
Цель работы: изучить основные принципы программной обработки символьной и строковой информации и научиться применять для решения задач некоторые функции из библиотеки string.
Чаще всего одномерные массивы используются для создания символьных строк.
В C++ строка определяется как символьный массив, который завершается нулевым символом ('\0'). При определении длины символьного массива, необходимо учитывать признак ее завершения и задавать его длину на единицу больше длины самой большой строки из тех, которые предполагается хранить в этом массиве.
Строка — это символьный массив, который завершается нулевым символом.
Например, объявляя массив str, предназначенный для хранения 10-символьной строки, следует использовать следующую инструкцию.
char str [11];
Заданный здесь размер (11) позволяет зарезервировать место для нулевого символа в конце строки. C++ позволяет определять строковые литералы.
Строковый литерал — это список символов, заключенный в двойные кавычки.
Вот несколько примеров.
"Привет"
"Мне нравится C++"
"#$%@@#$"
""
Строка, приведенная последней (""), называется нулевой. Она состоит только из одного нулевого символа (признака завершения строки). Нулевые строки используются для представления пустых строк.
Вам не нужно вручную добавлять в конец строковых констант нулевые символы. С++- компилятор делает это автоматически.
Считывание строк с клавиатуры
Проще всего считать строку с клавиатуры, создав массив, который примет эту строку с помощью инструкции cin. Считывание строки, введенной пользователем с клавиатуры, отображено в следующей программе.
// Использование cin-инструкции для считывания строки с
клавиатуры.
#include
using namespace std;
int main()
{
char str[80];
cout << "Введите строку: ";
cin >> str; // Считываем строку с клавиатуры.
cout << "Вот ваша строка: ";
cout << str;
return 0;
}
Несмотря на то, что эта программа формально корректна, она не лишена недостатков.
Рассмотрим следующий результат ее выполнения.
Введите строку: Это проверка
Вот ваша строка: Это
Как видите, при выводе строки, введенной с клавиатуры, программа отображает только слово "Это", а не всю строку. Дело в том, что оператор ">>" прекращает считывание строки, как только встречает символ пробела, табуляции или новой строки (будем называть эти символы пробельными). Для решения этой проблемы можно использовать еще одну библиотечную функцию gets(). Общий формат ее вызова таков. gets(имя_массива); Если в программе необходимо считать строку с клавиатуры, вызовите функцию gets(), а в качестве аргумента передайте имя массива, не указывая индекса. После выполнения этой функции заданный массив будет содержать текст, введенный с клавиатуры. Функция gets() считывает вводимые пользователем символы до тех пор, пока он не нажмет клавишу
// Использование функции gets() для считывания строки с
клавиатуры.
#include
#include
using namespace std;
int main()
{
char str[80];
cout << "Введите строку: ";
gets(str); // Считываем строку с клавиатуры.
cout << "Вот ваша строка: ";
cout << str;
return 0;
}
На этот раз, после запуска новой версии программы на выполнение, и ввода с клавиатуры текста "Это простой тест", строка считывается полностью, а затем, так же полностью и отображается. Введите строку: Это простой тест. Вот ваша строка: Это простой тест. В этой программе следует обратить внимание на следующую инструкцию. cout << str;.
Здесь (вместо привычного литерала) используется имя строкового массива. Имя символьного массива, который содержит строку, можно использовать везде, где допустимо применение строкового литерала.
При этом ни оператор ">>", ни функция gets() не выполняют граничной проверки (на отсутствие нарушения границ массива). Поэтому, если пользователь введет строку, длина которой превышает размер массива, возможны ошибки.
Некоторые библиотечные функции обработки строк
Язык C++ поддерживает множество функций обработки строк. Самыми распространенными из них являются следующие.
strcpy()
strcat()
strlen()
strcmp()
Для вызова всех этих функций в программу необходимо включить заголовок
Функция strcpy()
Общий формат вызова функции strcpy() таков:
strcpy (to, from);
Функция strcpy() копирует содержимое строки from в строку to. Помните, что массив, используемый для хранения строки to, должен быть достаточно большим, чтобы в него можно было поместить строку из массива from. В противном случае массив to переполнится, т.е. произойдет выход за его границы, что может привести к разрушению программы.
Использование функции strcpy() демонстрируется в следующей программе, которая копирует строку "Привет" в строку str.
#include
#include
using namespace std;
int main()
{
char str[80];
strcpy(str, "Привет");
cout << str;
return 0;
}
Функция strcat()
Обращение к функции strcat() имеет следующий формат.
strcat(s1, s2);
Функция strcat() присоединяет строку s2 к концу строки s1, при этом строка s2 не изменяется. Обе строки должны завершаться нулевым символом. Результат вызова этой функции, т.е. результирующая строка s1 также будет завершаться нулевым символом.
Использование функции strcat() демонстрируется в следующей программе, которая должна вывести на экран строку "Привет всем!".
#include
#include
using namespace std;
int main()
{
char s1[20], s2[10];
strcpy(s1, "Привет");
strcpy(s2, " всем!");
strcat (s1, s2);
cout << s1;
return 0;
}
Функция strcmp()
Обращение к функции strcmp() имеет следующий формат: strcmp(s1, s2); Функция strcmp() сравнивает строку s2 со строкой s1 и возвращает значение 0, если они равны. Если строка s1 лексикографически (т.е. в соответствии с алфавитным порядком) больше строки s2, возвращается положительное число. Если строка s1 лексикографически меньше строки s2, возвращается отрицательное число.
Использование функции strcmp() демонстрируется в следующей программе, которая служит для проверки правильности пароля, введенного пользователем (для ввода пароля с клавиатуры и его верификации служит функция password()).
#include
#include
#include
using namespace std;
bool password();
int main()
{
if(password()) cout << "Вход разрешен.\n";
else cout << "В доступе отказано.\n";
return 0;
}
// Функция возвращает значение true, если пароль принят, и значение false в противном случае.
bool password()
{
char s[80];
cout << "Введите пароль: ";
gets(s);
if(strcmp(s, "пароль")) { // Строки различны.
cout << "Пароль недействителен.\n";
return false;
}
// Сравниваемые строки совпадают.
return true;
}
При использовании функции strcmp() важно помнить, что она возвращает число 0 (т.е. значение false), если сравниваемые строки равны. Следовательно, если вам необходимо выполнить определенные действия при условии совпадения строк, вы должны использовать оператор НЕ (!). Например, при выполнении следующей программы, запрос входных данных продолжается до тех пор, пока пользователь не введет слово "Выход".
#include
#include
#include
using namespace std;
int main()
{
char s [80];
for(;;) {
cout << "Введите строку: ";
gets (s);
if(!strcmp("Выход", s)) break;
}
return 0;
}
Функция strlen()
Общий формат вызова функции strlen() таков: strlen(s);
Здесь s — строка. Функция strlen() возвращает длину строки, указанной аргументом s. При выполнении следующей программы будет показана длина строки, введенной с клавиатуры.
#include
#include
#include
using namespace std;
int main()
{
char str[80];
cout << "Введите строку: "; gets(str);
cout << "Длина строки равна: " << strlen(str);
return 0;
}
Если пользователь введет строку "Привет всем!", то программа выведет на экране число 12. При подсчете символов, составляющих заданную строку, признак завершения строки (нулевой символ) не учитывается.
А при выполнении этой программы строка, введенная с клавиатуры, будет отображена на экране в обратном порядке. Например, при вводе слова "привет" программа отобразит слово "тевирп". Помните, что строки представляют собой символьные массивы, которые позволяют ссылаться на каждый элемент (символ) в отдельности.
// Отображение строки в обратном порядке.
#include
#include
#include
using namespace std;
int main()
{
char str[80];
int i;
cout << "Введите строку: ";
gets(str);
for(i=strlen(str)-1; i>=0; i--)
cout << str[i];
return 0;
}
Индивидуальные задания:
- Дана строка символов. Группы символов, разделённые пробелами (одним или несколькими) и не содержащие пробелов внутри себя, будем называть словами. Подсчитать количество слов, начинающихся с буквы «б».
- Дана строка символов. Группы символов, разделённые пробелами (одним или несколькими) и не содержащие пробелов внутри себя, будем называть словами. Подсчитать количество слов, заканчивающихся буквой «т».
- Дана строка символов. Группы символов, разделённые пробелами (одним или несколькими) и не содержащие пробелов внутри себя, будем называть словами. Подсчитать количество слов, у которых первый и последний символы совпадают.
- Дана строка символов. Группы символов, разделённые пробелами (одним или несколькими) и не содержащие пробелов внутри себя, будем называть словами. Подсчитать количество слов, начинающихся с буквы «а» и заканчивающихся буквой «я».
- Дана строка символов. Группы символов, разделённые пробелами (одним или несколькими) и не содержащие пробелов внутри себя, будем называть словами. Найти длину самого короткого слова.
Контрольные вопросы
- Что такое строка с точки зрения языка С++?
- В чем отличие строки от массива символов?
- Можно ли работать поэлементно со строкой?
- Как изменить конкретный символ в строке?
- Назовите самые распространенные функции обработки строк?
Лабораторная работа № 5 «Работа с файлами»
Цель работы: ознакомиться с понятием файла, изучить правила программной работы с файлами для манипуляции данными.
Содержание задания:
- Составить схему алгоритма и программу работы с файлом на языке программирования.
- Выполнить отладку и тестирование программы.
- Оформить отчет.
Содержание отчета:
- Тема (название) лабораторной работы.
- Постановка конкретной задачи (вариант задания).
- Схема алгоритма программы.
- Листинг программы.
Методические указания:
Файлом называют способ хранения информации на физическом устройстве. Файл – это понятие, которое применимо ко всему – от файла на диске до терминала.
В C++ отсутствуют операторы для работы с файлами. Все необходимые действия выполняются с помощью функций, включенных в стандартную библиотеку. Они позволяют работать с различными устройствами, такими как диски, принтер, коммуникационные каналы и т.д. Эти устройства сильно отличаются друг от друга. Однако файловая система преобразует их в единое абстрактное логическое устройство, называемое потоком.
Текстовый поток – это последовательность символов. При пере- даче символов из потока на экран часть из них не выводится (например, символ возврата каретки, перевода строки).
Двоичный поток – это последовательность байтов, которые однозначно соответствуют тому, что находится на внешнем устройстве.
Организация работы с файлами средствами C
Объявление файла
FILE *идентификатор;
Пример
FILE *f;
Открытие файла:
fopen(имя физического файла, режим доступа);
Режим доступа – строка, указывающая режим открытия и тип файла (табл. 7).
Типы файла: бинарный (b); текстовый (t).
Таблица 7
Режимы работы с файлами
Значение | Описание |
r | Файл открывается только для чтения |
w | Файл открывается только для записи. Если соответствующий физический файл существует, он будет перезаписан |
a | Файл открывается для записи в конец (для дозаписи) или создается, если не существует |
r+ | Файл открывается для чтения и записи |
w+ | Файл открывается для записи и чтения. Если соответствующий физический файл существует, он будет перезаписан |
a+ | Файл открывается для записи в конец (для дозаписи) или создается, если не существует |
Например,
f = fopen(s, "wb");
k = fopen("h:\ex.dat", "rb");
Неформатированный файловый ввод-вывод
Запись в файл:
fwrite(адрес записываемой величины, размер одного экземпляра, количество записываемых величин, имя ло- гического файла);
Например,
fwrite(&dat, sizeof(int), 1, f);
Чтение из файла:
fread(адрес величины, размер одного экземпляра, количество считываемых величин, имя логического файла);
Например,
fread(&dat, sizeof(int), 1, f);
Закрытие файла:
fclose(имя логического файла);
Пример
Заполнить файл некоторым количеством целых случайных чисел.
#include
#include
using namespace std;
int main()
{
FILE *f; int dat; srand(time(0));
int n=rand()%30 + 1; /*генерируем количество чисел*/
cout << "File name? "; char s[20];
cin.getline(s, 20); //вводим имя файла f=fopen(s, "wb"); /*открываем файл для бинарной записи*/
for (int i=1; i<=n; i++)
{
dat = rand()%101 - 50; /*генерируем случайное число*/
cout << dat << " "; /*выводим на экран для контроля*/
fwrite(&dat, sizeof(int), 1, f); /*записываем число в файл*/
}
cout << endl;
fclose(f); //закрываем файл system("pause");
return 0;
}
Пример
Найти сумму и количество целых чисел, записанных в бинарный файл.
#include
#include
int main()
{
FILE *f;
int dat, n=0, sum=0;
cout << "File name? ";
char s[20];
cin.getline(s, 20); /*вводим имя файла*/
f=fopen(s, "rb"); /*открываем файл*/
/*далее в цикле до тех пор, пока считываются числа из файла*/
while (fread(&dat, sizeof(int), 1, f))
{
n++; //считаем количество чисел
cout << dat << " "; /*выводим на экран для проверки корректности расчетов*/
sum+=dat;
}
cout << endl;
cout << "Сумма: " << sum << "; Количество "<< n <
fclose(f); //закрываем файл system("pause");
return 0;
}
Форматированный файловый ввод-вывод
- Функции fgetc() и fputc() позволяют соответственно осуществить ввод-вывод символа.
- Функции fgets() и fputs() позволяют соответственно осуществить ввод-вывод строки.
- Функции fscanf() и fprintf() позволяют соответственно осуще- ствить форматированный ввод-вывод и аналогичный соответствую- щим функциям форматированного ввода-вывода, только делают это при- менительно к файлу.
Организация работы с файлами средствами C++
Файловый ввод-вывод с использованием потоков
Библиотека потокового ввода-вывода fstream.
Связь файла с потоком вывода:
ofstream имя логического файла;
Связь файла с потоком ввода:
ifstream имя логического файла;
Открытие файла:
Имя логического файла.open(имя физического файла);
Закрытие файла:
имя логического файла.close();
Пример
Заполнить файл значениями функции y = x cos x .
#include
#include
#include
#include
using namespace std;
double fun(double x);
int main()
{
double a, b, h, x; char s[20];
cout << "Enter the beginning and end of the segment, / /step-tabulation: ";
cin >> a >> b >> h;
cout << "File name? "; cin >> s;
ofstream f;
f.open(s);
for (x=a; x<=b; x+=h)
{
f.width(10); f << x;
f.width(15); f << fun(x) << endl;
}
f.close();
system("pause"); return 0;
}
double fun(double x)
{
return x*cos(x);
}
Пример
Файл содержит несколько строк, в каждой из которых записано единственное выражение вида a#b (без ошибок), где a, b – целочисленные величины, # ‒ операция +, ‒, /, *. Вывести каждое из выражений и их значения.
#include
{
long a, b;
char s[256], c; int i;
cout << "File name? "; cin >> s;
ifstream f; f.open(s);
while (!f.eof())
{
f.getline(s, 256); i=0;
a=0;
while (s[i]>='0'&&s[i]<='9')
{
a=a*10+s[i]-'0'; i++;
}
c=s[i++]; b=0;
while (s[i]>='0'&&s[i]<='9')
{
b=b*10+s[i]-'0'; i++;
}
switch (c){
case | '+': | a+=b; | break; |
case | '-': | a-=b; | break; |
case | '/': | a/=b; | break; |
case | '*': | a*=b; | break; |
} |
cout << s << " = " << a << endl;
}
f.close();
system("pause"); return 0;
}
Задания для самостоятельного выполнения:
1. Напишите программу, которая считывает текст из файла и выводит на экран только строки, содержащие двузначные числа.
2. Напишите программу, которая считывает английский текст из файла и выводит на экран слова, начинающиеся с гласных букв.
3. Напишите программу, которая считывает текст из файла и выводит его на экран, меняя местами каждые два соседних слова.
4. Напишите программу, которая считывает текст из файла и выводит на экран только предложения, не содержащие запятых.
5. Напишите программу, которая считывает текст из файла и определяет, сколько в нём слов, состоящих из не более чем четырёх букв.
6. Напишите программу, которая считывает текст из файла и выводит на экран только цитаты, то есть предложения, заключённые в кавычки.
7. Напишите программу, которая считывает текст из файла и выводит на экран только предложения, состоящие из заданного количества слов.
8. Напишите программу, которая считывает английский текст из файла и выводит на экран слова текста, начинающиеся или оканчивающиеся на гласные буквы.
Контрольные вопросы и задания
- Что такое файл?
- Приведите отличия логического и физического файлов.
- Перечислите типы файлов.
- Приведите классификацию файлов по способам доступа к ин- формации.
- Какие действия необходимо совершить для работы с файлом?
- Какая функция используется для открытия файла? Опишите параметры функции.
- Каким образом можно определить, достигнут ли конец файла?
- Напишите программу, которая считывает из текстового файла три предложения и выводит их в обратном порядке.
- Если требуется быстро выполнить копирование файлов неизвестной структуры, какого типа файл нужно использовать?
Лабораторная работа № 6 «Подпрограммы»
Цель работы: изучение правил составления и использования функций в программах на С++.
Содержание задания:
- Составить схему алгоритма и программу выполнения индивидуальных заданий.
- Выполнить отладку и тестирование программы.
- Оформить отчет.
Содержание отчета:
- Тема (название) лабораторной работы.
- Постановка конкретной задачи (вариант задания).
- Схема алгоритма решаемой задачи.
- Листинг программы.
- Результаты ручного просчета.
- Результаты работы программы (скриншоты).
Методические указания:
В практике программирования часто складываются ситуации, когда одну и ту же группу операторов, реализующих определённую цель, требуется повторить без изменений в нескольких местах программы.
Для избавления от столь нерациональной траты времени была предложена концепция подпрограммы.
Подпрограмма — именованная, логически законченная группа операторов языка, которую можно вызвать для выполнения любое количество раз из различных мест программы. В языке C++ подпрограммы реализованы в виде функций.
Функция — это поименованный набор описаний и операторов, выполняющих определённую задачу. Функция может принимать параметры и возвращать значение.
Информация, передаваемая в функцию для обработки, называется параметром, а результат вычисления функции её значением. Обращение к функции называют вызовом. Описание функции состоит из заголовка и тела функции:
тип имя_функции(список_переменных)
{
тело_функции
}
Заголовок функции содержит:
- – тип возвращаемого функцией значения, он может быть любым; если функция не возвращает значения, указывают тип void;
- – имя_функции;
- – список_переменных — перечень передаваемых в функцию величин (аргументов), которые отделяются друг от друга запятыми; для каждой переменной из списка указывается тип и имя; если функция не имеет аргументов, то в скобках указывают либо тип void, либо ничего.
Тело функции представляет собой последовательность описаний операторов, заключённых в фигурные скобки.
В общем виде структура программы на C++ может иметь вид:
директивы компилятора
тип имя_1(список_переменных)
{
тело_функции_1;
}
тип имя_2(список_переменных)
{
тело_функции_2;
}
...
тип имя_n(список_переменных)
{
тело_функции_n;
}
int main (список_переменных)
{
//Тело функции может содержать операторы вызова
//функций имя_1, имя_2, ..., имя_n
тело_основной_функции;
}
Однако допустима и другая форма записи программного кода :
директивы компилятора
тип имя_1(список_переменных);
тип имя_2(список_переменных);
...
тип имя_n(список_переменных);
int main (список_переменных)
{
//Тело функции может содержать операторы вызова
// функций имя_1, имя_2, ..., имя_n
тело_основной_функции;
}
тип имя_1(список_переменных)
{
тело_функции_1;
}
тип имя_2(список_переменных)
{
тело_функции_2;
}
...
тип имя_n(список_переменных)
{
тело_функции_n;
}
Здесь функции описаны после функции main(), однако до неё перечислены заголовки всех функций. Такого рода опережающие заголовки называют прототипами функций.
Прототип указывает компилятору тип данных, возвращаемых функцией, тип переменных, выступающих в роли аргументов, и порядок их следования. Прототипы используются для проверки правильности вызова функций в основной программе.
Вызвать функцию можно в любом месте программы. Для вызова функции необходимо указать её имя и в круглых скобках, через запятую перечислить имена или значения аргументов, если таковые имеются:
имя_функции(список_переменных);
Рассмотрим пример. Создадим функцию f(), которая не имеет входных значений и не формирует результат. При вызове этой функции на экран выводится строка символов "С Новым Годом, ".
#include
using namespace std;
void f ( ) //Описание функции.
{
cout << "С Новым Годом, ";
}
int main ( )
{
f ( ); //Вызов функции.
cout <<"Студент!" << endl;
f ( ); //Вызов функции.
cout <<"Преподаватель!" << endl;
f ( ); //Вызов функции.
cout <<"Народ!" << endl;
}
Результатом работы программы будут три строки:
С Новым Годом, Студент!
С Новым Годом, Преподаватель!
С Новым Годом, Народ!
Далее приведён пример программы, которая вычисляет значение выражения (α) при заданном значении α. Здесь функция radian выполняет перевод градусной меры угла в радианную1.
Переменные, описанные внутри функции, а также переменные из списка аргументов, являются локальными. Например, если программа содержит пять разных функций, в каждой из которых описана переменная N, то для C++ это пять различных переменных. Область действия локальной переменной не выходит за рамки функции. Значения локальных переменных между вызовами одной и той же функции не сохраняются.
Переменные, определённые до объявления всех функций и доступные всем функциям, называют глобальными. В функции глобальную переменную можно отличить, если не описана локальная переменная с теми же именем. Глобальные переменные применяют для передачи данных между функциями, но это затрудняет отладку программы. Для обмена данными между функциями используют параметры функций и значения, возвращаемые функциями.
Пример выполнения задания.
Задание. Найти максимальную сумму элементов строк матрицы 3×5 с использованием функций.
Пример программы:
#include
const int m=3, n=5;
//функция ввода
void inparr(int a[m][n])
{
int i,j;
for (i=0;i
for (j=0;j
scanf("%d",&a[i][j]);
}
//функция вывода
void outarr (int a[m][n])
{
int i,j;
printf("Matrica:\n");
for (i=0; i
{
for (j=0; j
printf("%5d", a[i][j]);
printf("\n");
}
}
int processarr(int a[m][n])
{
int i,j,s,max;
for(i=0;i
{
s=0;
for (j=0;j
s+=a[i][j];
if (i==0) max=s;
else if (max
}
return max;
}
int main()
{
int b[m][n];
inparr(b);
outarr(b);
printf("Maximalnaya summa stroki = %d", processarr(b));
}
Индивидуальные задания:
1.Напишите функцию, которая возводит число в определенную степень. В качестве параметров функция должна принимать само число и показатель степени. А в качестве результата возвращать результат возведения числа в степень. Степень может быть как положительной, так и отрицательной.
2. Реализовать функцию, которая принимает массив (плюс его длину), а также число n , и возвращает индекс числа в массиве или -1 , если такого числа нет.
Структура : int Search (int a [], const int n, const int key);
3. Реализовать функцию, которая принимает массив и возвращает индекс его максимального элемента.
4.Найти наибольший общий делитель 3 чисел.
5. Описать процедуру Mean(X, Y, AMean, GMean), вычисляющую среднее арифметическое AMean = (X + Y)/2 и среднее геометрическое GMean = √(X * Y) двух положительных чисел X и Y (X и Y — входные, AMean и GMean — выходные параметры вещественного типа). С помощью этой процедуры найти среднее арифметическое и среднее геометрическое для пар (A, B), (A, C), (A, D), если даны A, B, C, D.
6. Описать функцию Quarter(x, y) целого типа, определяющую номер координатной четверти, в которой находится точка с ненулевыми вещественными координатами (x, y). С помощью этой функции найти номера координатных четвертей для трех точек с данными ненулевыми координатами.
Лабораторная работа № 7 «Разработка оконного приложения»
Цель работы: Изучить методику разработки оконных приложений в среде Qt. Изучить свойства и методы текстовых компонент и кнопок и использовать их при разработке программного интерфейса.
Содержание задания:
- Составить программу по разработке оконного приложения.
- Выполнить отладку и тестирование программы.
- Оформить отчет.
Содержание отчета:
- Тема (название) лабораторной работы.
- Постановка конкретной задачи (вариант задания).
- Схема алгоритма программы.
- Листинг программы.
- Результаты работы программы (скриншоты).
Методические указания:
Оконные приложения являются основными видами приложений, запускаемых в операционных системах с графическим интерфейсом
Qt представляет кроссплатформенный фреймворк для создания графических приложений для десктопа, мобильных и встроенных устройств. Он предоставляет разработчикам отличный набор инструментов для проектирования и создания отличных приложений, не беспокоясь о зависимости от платформы. С помощью Qt разработчики могут легко создавать высокопроизводительные масштабируемые приложения с гибким пользовательским интерфейсом.
Цель фреймворка Qt - предоставить единый графический интерфейс пользователя (GUI) с единообразным внешним видом и функциональностью на разных платформах. А набор поддерживаемых фреймворком платформ довольно широк - это Windows, Linux, macOS, VxWorks, QNX, Android, iOS и ряд других.
Qt – это библиотека классов C++ и набор инструментального программного обеспечения, предназначенные для построения многоплатформенных приложений с графическим интерфейсом. Она позволяет создавать приложения, которые могут работать под управлением Windows 95/98/Me/2000/XP/Vista/Windows 7, Mac OS X, Linux, Solaris, HP-UX и других версий Unix.
В состав библиотеки классов Qt входят:
- классы, обеспечивающие построение оконного графического интерфейса пользователя;
- классы для работы с 2-х и 3-х мерной графикой;
- классы, реализующие поддержку основных графических форматов хранения изображений;
- классы-шаблоны динамических массивов и других структурных типов данных;
- классы для работы с процессами и потоками;
- классы для работы с XML и пр.
1.Структура простейшей программы с Qt интерфейсом
Создание интерфейса с применением средств библиотеки Qt продемонстрируем на программе, выдающей на экран традиционное приветствие «Hello!» или в русскоязычном варианте «Привет!».
1.1 Создание интерфейса из совокупности объектов библиотечных классов
Библиотека Qt предоставляет разработчику множество уже готовых интерфейсных компонентов, которые в Qt, как и в Linux, принято называть виджетами.
В простейшем случае виджеты Qt могут встраиваться в программный код без построения специального класса, объект которого соответствовал бы окну.
Традиционно интерфейс приложения Hello выдает на экран приветствие и ожидает сигнала завершения работы. В оконном варианте это предполагает использование некоторого элемента, который может визуализировать строку приветствия, например метки, и кнопки завершения. При нажатии на эту кнопку приложение должно завершать свою работу (см. рисунок).
Рисунок - Вид окна приложения
Пример Приложение Hello. Интеграция объектов классов Qt без построения специального класса окна.
В начале программы посредством оператора #include подключаем заголовочный файл модуля, содержащего описание используемых интерфейсных классов Qt.
Аналогично любой, построенной по объектной технологии и событийно управляемой программе приложение Hello минимально должно включать два объекта:
- объект-приложение;
- объект-окна приложения.
Объект-приложение создается как объект класса QApplication. Объекты этого класса отвечают за создание и инициализацию главного окна, а также за запуск цикла обработки сообщений от операционной системы.
В качестве окна приложения будем использовать объект класса QWidget. Класс QWidget – базовый класс всех виджетов. Его объекты обладают свойствами контейнера, который управляет виджетами визуальных компонентов: метками, кнопками и др., размещенными в окне.
Кроме этого нам понадобится объект класса QLabel – метка – виджет, с помощью которого высвечивается текст приветствия и объект класса QPushButton – кнопка – виджет, который используется для закрытия приложения.
Текст программы выглядит следующим образом:
#include
int main(int argc,char *argv[])
{
QApplication app(argc,argv); // создание объекта-приложения
QWidget win; // создание объекта управления окном
win.setWindowTitle("Hello"); // изменение заголовка окна
QLabel *helloLabel=new QLabel("Hello!",&win); // создание метки
QPushButton *exitButton=new QPushButton("Close",&win);
// создание кнопки
QHBoxLayout *layout = new QHBoxLayout(&win); // создание
// менеджера компоновки для управления размещением метки и кнопки в окне win
layout->addWidget(helloLabel); // добавление метки к компоновщику
layout->addWidget(exitButton); // добавление кнопки к компоновщику
// связь сигнала нажатия кнопки с закрытием окна win
QObject::connect(exitButton,SIGNAL(clicked(bool)),
&win,SLOT(close()));
win.show(); // визуализация окна win
app.exec(); // запуск цикла обработки сообщений приложения
}
Помимо уже указанных объектов окна, метки и кнопки приложение включает также объект класса QHBoxLayout – горизонтальный менеджер компоновки, отвечающий за размещение и масштабирование подчиненных виджетов: метки и кнопки в окне приложения. Этот объект срезу при создании связывается с оконным объектом win:
QVBoxLayout *layout = new QVBoxLayout(&win);
А затем ему передается управление размерами и размещением метки и кнопки:
layout->addWidget(helloLabel);
layout->addWidget(exitButton);
Особого внимания заслуживает оператор (макрос) Qt connect, который связывает сигнал нажатия кнопки exitButton– clicked(bool)с его обработчиком:
QObject::connect(exitButton,SIGNAL(clicked(bool)), &win,SLOT(close()));
Таким обработчиком – слотом окна win– является метод закрытия окна win– close(). По правилам оконных приложений этот метод обеспечивает не только закры-тие окна, но и завершение приложения, если закрываемое окно – последнее.
Все объекты создаются в основной программе но при этом виджет окна назначается контейнером для всех остальных и управляет видимостью виджетов и памятью всех объектов Qt. Поэтому для визуализации окна с меткой и кнопкой достаточно вызвать метод Show()окна win, который обеспечит визуализацию, как самого окна, так и управляемых им виджетов.
После визуализации окна выполняется метод app.exec(), который запускается цикл обработки сообщений, организуя работу приложения.
Менеджер компоновки окна, как и само окно, является контейнером, но только для включенных в него виджетов метки и кнопки. Он управляет изменением размеров подчиненных виджетов при изменении размеров окна
После завершения программы для освобождения всей динамически распределенной памяти достаточно посредством оператора deleteзапросить освобождение памяти окна win. Деструктор этого объекта-контейнера автоматически освободит все управляемые им виджеты и прочие компоненты.
Индивидуальные задания:
1. Разработать оконное приложение «Простой калькулятор» для выполнения операций сложения, вычитания, умножения, деления.
2. Разработать оконное приложение для просмотра фотографий.
3. Разработать оконное приложение имитирующее работу продавца в магазине. Покупатель запрашивает цену товара. При покупке товара продавец при необходимости возвращает сдачу.
4. Разработать оконное приложение с кнопками по клику на которых форма окрашивается в различные цвета (красный, зеленый, желтый).
5. Разработать оконное приложение, которое запрашивает Ваше имя и фамилию и дату рождения, а затем здоровается с Вами и называет Ваш возраст.
Контрольные вопросы:
- Структура функции в языке С++, ее заголовок.
- Вызов функции.
- Способы передачи параметров.
- Оператор return (2 формы записи).
- Описание функции (прототип).
- Каковы некоторые преимущества ООП перед процедурным программированием?
- Что собой представляет тип данных класс?
- Для чего предназначен класс?
- С какого ключевого слова начинается в программе описание класса?
- Что называется полями класса?
- Что является методами класса?
По теме: методические разработки, презентации и конспекты

Тест по дисциплине «Основы алгоритмизации и программирования» Раздел: «Программирование на языке СИ/СИ++» специальности 230401 "Информационные системы (по отраслям)"
Тест по дисциплине «Основы алгоритмизации и программирования» Раздел: «Программирование на языке СИ/СИ++» специальности 230401 "Информационные системы (по отраслям)"...

Методические указания по выполнению контрольной работы дисциплина "Основы экономической теории"
Методические указания по выполнению контрольной работы дисциплина "Основы экономической теории"...

КОМПЛЕКС МЕТОДИЧЕСКИХ УКАЗАНИЙ ПО ВЫПОЛНЕНИЮ ЛАБОРАТОРНЫХ РАБОТ МДК 05.01 ТЕХНОЛОГИЯ ПОШИВА ШВЕЙНЫХ ИЗДЕЛИЙ ПО ИНДИВИДУАЛЬНЫМ ЗАКАЗАМ РАЗДЕЛ 1. ОСНОВЫ ТЕХНОЛОГИИ ОДЕЖДЫ для специальности среднего профессионального образования: 54.02.01(072501) Дизайн (п
КОМПЛЕКС МЕТОДИЧЕСКИХ УКАЗАНИЙ ПО ВЫПОЛНЕНИЮ ЛАБОРАТОРНЫХ РАБОТМДК 05.01 ТЕХНОЛОГИЯ ПОШИВА ШВЕЙНЫХ ИЗДЕЛИЙ ПО ИНДИВИДУАЛЬНЫМ ЗАКАЗАМРАЗДЕЛ 1. ОСНОВЫ ТЕХНОЛОГИИ ОДЕЖДЫдля специальности среднего професс...

КОМПЛЕКС МЕТОДИЧЕСКИХ УКАЗАНИЙ ПО ВЫПОЛНЕНИЮ ЛАБОРАТОРНЫХ РАБОТ МДК 01.01 ОСНОВЫ ХУДОЖЕСТВЕННОГО ОФОРМЛЕНИЯ ОДЕЖДЫ Раздел 1.Основы композиции и художественного проектирования костюма для специальности среднего профессионального образования: 29.02.04 Ко
КОМПЛЕКС МЕТОДИЧЕСКИХ УКАЗАНИЙ ПО ВЫПОЛНЕНИЮ ЛАБОРАТОРНЫХ РАБОТМДК 01.01 ОСНОВЫ ХУДОЖЕСТВЕННОГО ОФОРМЛЕНИЯ ОДЕЖДЫРаздел 1.Основы композиции и художественного проектирования костюмадля специальности ср...
Методические указания к выполнению лабораторных и практических работ по модулю ПМ 03. специальности 09.02.03
Сборник содержит описание лабораторных и практических работ профессионального модуля «Участие в интеграции программных модулей», раздел 1 «Технология разработки программного обеспече...
Методические указания к выполнению лабораторных работ по предмету ЕН.02 «Информатика» для специальности: 15.02.08 Технология машиностроения входящей в состав УГС 15.00.00 Машиностроение
Методические указания содержат материал для организации лабораторных работ. Методические указания включают:ОглавлениеВведениеОсновная частьЗаключениеПо дисциплине «Информатика» учебным пла...

РАБОЧАЯ ПРОГРАММА УЧЕБНОЙ ДИСЦИПЛИНЫ ОП.04 Основы алгоритмизации и программирования Код, специальность: 09.02.06 Сетевое и системное администрирование
1 ОБЩАЯ ХАРАКТЕРИСТИКА РАБОЧЕЙ ПРОГРАММЫ УЧЕБНОЙ ДИСЦИПЛИНЫ «ОП.04 Основы алгоритмизации и программирования»1.1 Область применения рабочей программыРабочая программа учебной дисциплины явл...