на общественных началах при МГТУ им. Н. Э. Баумана
Программа лабораторных работ по курсу “Информатика и программирование”
Москва 2018
Семестр 1
1. Лабораторная работа №1: (2-3 занятие)
1.1. Составить программу для решения квадратного уравнения ax2+ bx+ c=0, где a,b,cвводятся с клавиатуры. Результаты вывести в консоль.
1.2. Создать заголовочный и два исполняемых файла(например, func.h,и main.cpp, extra.cpp). В extra.cppопределяем функции: add(сложение целых чисел), sub(вычитание целых чисел), pow(возведение в степень). В func.h создаем прототипы всех функций из extra.cpp, и добавляем в него “headerguards”. В main.cpp подключаем заголовочный файл с помощью includeи используем эти функциив mainдля подтверждения работоспособности. Результаты тестирования выводим в консоль в понятном для человека виде.
P.S. Headerguards-вот такая конструкция, которая не позволяет коду внутри выполняться повторно если мы будем несколько раз подключатьэтот файлс помощью #includeв другие свои файлы:
#ifndefQWERTY//где QWERTY- любое название константы, которую вы создаете
#defineQWERTY
//здесь будет находится код, который должен
//выполняться только один раз
#endif
В последних версияхкомпиляторов c++ существует более удобная директива препроцессору #pragmaonce, которая делает то же самое и работает на весь файл сразу, но она поддерживается не везде
2. Лабораторная работа №2: (3-4 занятие)
2.1. С клавиатуры вводится число N. Вывести в консоль пирамидку из звездочек высотойN
Пример: N=3
*
* **
* ****
2.2. С клавиатуры вводятся 10 целых чисел в цикле. Требуется найти их сумму, среднее, минимальное и максимальное, и вывести результаты в консоль.
3. Лабораторная работа №3: (4-5 занятие)
3.1. Создание простой текстовой игры со случайными событиями(обязательные условия: использование enumдля хранения возможных вариантов событий, использование struct для сущностей игры, использование функций для повторяющихся вызовов)
Например:
enum Events
{
Spider_num,
Zombie_num,
Vampire_num,
HPpotion_num,
Bonus_damage_num,
};
struct Spider {
int Health;
int Damage;
}
4. Лабораторная работа №4: (5-6 занятие)
4.1. Сортировка массивов из 10 и 100 случайных элементов методом выбора, методом пузырька, и непрактичным Bogosort(функция random_shuffle для перемешивания массива, include<algorithm>). Подсчитать и вывести в консоль количество перестановок и сравнений для первых двух алгоритмов, и количество сравнений для последнего.
5. Лабораторная работа №5: (6-7 занятие)
5.1. Написать функцию вычисления длины строки C-style. На вход функции подается указатель на строку. Завершающий нулевой символ считать не нужно.
5.2. Нужно реализовать функцию resize. Функция resize принимает на вход три аргумента: указатель на область памяти, выделенную с помощью оператора new[], размер области (size) и новый размер (new_size). Функция должна выделить память размера new_size, скопировать в нее данные из переданной области памяти, освободить старую область памяти и вернуть выделенную область памяти нового размера со скопированными данными.
6. Лабораторная работа №6: (7-8 занятие)
6.1. Реализовать игру в кости, в которой имитируется бросание кубиков компьютером и пользователем. В игре 2 кубика и на каждом из них может выпасть от 1 до 6 очков. В начале игры у игрока просят ввести имя, затем случайным образом выбирается первый ходящий. Во время хода пользователя его просят ввести символ с клавиатуры для броска(например символ!,или любой другой). После бросков выводить в консоль нарисованные символами кубики(например из *), а также вспомогательную информацию(чей сейчас ход, промежуточный счет). В конце выводить победителя и проигравшего(или ничью!!).
Условия: использование функций везде где их использованием можно избежать нагромождения кодав одном месте; Отрисовка кубиков в консоль должна быть реализована через switch.
Switch(“параметр числа выпавших очков”){
Case 1: //отрисовка кубика с числом 1
…
}
7. Лабораторная работа №7: (8-9 занятие)
7.1. Написать функцию для вычисления суммы цифр числа через рекурсивную функцию и через итеративный цикл.(две разных функции)
7.2. Написать функцию для вычисления факториала числа через рекурсивную функцию и через итеративный цикл.(две разных функции)
8. Лабораторная работа №8: (9-10 занятие)
8.1. Создать текстовый файл и самому записать в него вещественные числа. В программе считать числа из файла и вывести их на экран, а также в другой файл, который создается программно. (с проверкой правильного открытия)
Семестр 2
1. Лабораторная работа №1: (1-3 занятие)
1.1. В программе реализовать классы для 3х геометрических фигур(“Треугольник”, “Прямоугольник”, “Круг”), содержащихprivateполя для вычисления площади фигуры. (Треугольник-длину основания и высоту; Прямоугольник- длины сторон; Круг- радиус) В каждом из классов реализовать метод подсчета площади фигуры.
1.2. В задание 1.1 добавить абстрактный класс геометрической фигуры Shapeс виртуальным методом для вычисления площади фигуры. От этого класса наследовать все 3 класса из задания 1.1. Добавить класс “Квадрат”, который наследуется от класса “Прямоугольник”.
1.3. Для всех 4х фигур из задания 1.2 реализовать конструктор с параметром для определения privateполей класса.
2. Лабораторная работа №2: (3-6 занятие)
2.1. В этой лабораторной нужно самостоятельно реализовать класс String(содержит поле intsizeдля хранения размера и поле char*strдля указателя на C-строку символов). Для него необходимо описать конструктор, который принимает на вход C-style строку, вычисляет ее размер (без учета завершающего 0 символа) и сохраняет его в поле size, кроме того, конструктор должен выделять память достаточную для хранения копии переданной строки (вместе с завершающим 0 символом), копирует переданную строку в выделенную память и сохраняет указатель на начало этой области памяти в поле str.
2.2. Для класса Stringреализовать заполняющий конструктор. Заполняющий конструктор принимает число и символ, и создает строку с заданным количеством повторений переданного символа. Например:
Strings(10, ‘A’) // строка s теперь хранит 10 символов A
2.3. Для классаStringреализовать деструктор.
2.4. В классе Stringперегрузить операторвывода в консоль <<.
2.5. Перегрузить оператор индексации [] для класса String для получения буквы по заданному индексу(задание выполняется после занятия 6, когда материал будет пройден)
3. Лабораторная работа №3: (5-8 занятие)
3.1. Определить класс Rationalрациональных чисел, в котором присутствуют 2 privateполя numeratorи denominator(числитель и знаменатель соответственно). Написать для него конструктор с параметрами.
3.2. Для класса Rationalперегрузить оператор вывода в консоль; операторы +=, -=, *=, /= так, чтобы они могли принимать в качестве аргументов и объекты типа Rational и целые числа.
3.3. Определить для класса Rational операторы сложения, вычитания, умножения и деления, так чтобы объекты типа Rational можно было складывать (вычитать, умножать и делить) не только друг с другом но и с целыми числами.
3.4. Реализуйте операторы <, <=, >, >=, ==,!= для класса Rational так, чтобы можно было сравнивать объекты класса Rational не только друг с другом, но и с целыми числами.
3.5. Добавьте в класс Rational оператор приведения к double.
4. Лабораторная работа №4: (9-11 занятие)
4.1. Требуется написать шаблонную версию класса Array. В классе должны быть реализованы:
1) Конструктор класса explicitArray(size_tsize = 0, const T&value = T()), который создает Array размера size, заполненный значениями value типа T. Считать что у типа T есть конструктор, который можно вызвать без параметров, либо он ему не нужен.
2) конструктор копирования, который создает копию параметра. Считайте, что для типа T определен оператор присваивания.
3) Оператор присваивания Array&operator=(...)
4) Оператор индексации для доступа по индексу T&operator[](size_t)