Лабораторная работа №1 Программирование алгоритмов с использованием динамических массивов
Цель работы – научиться использовать операции динамического выделения и освобождения памяти на примере работы с одномерными и двумерными массивами, а также косвенное обращение к элементам массива.
Дан массив – A(n,n). Написать программу его поворота на 90° относительно его центра. На печать вывести исходный и повернутый массивы
Листинг: #include "stdafx.h" #include <stdio.h> #include <iostream> using namespace std;
int main() { int n; int **a, **b; cout << "n=" << endl; cin >> n; // динамическое объявление массива a = new int *[n]; for (int i = 0; i < n; i++) a[i] = new int[n]; b = new int *[n]; for (int i = 0; i < n; i++) b[i] = new int[n];
// ввод элементов for (int i = 0; i < n; i++) for (int j = 0; j < n; j++) { cout << "a[" << i + 1 << "][" << j + 1 << "]="; cin >> a[i][j];
} // поворот for (int i = 0; i < n; i++) for (int j = 0; j < n; j++) { b[j][n - 1 - i] = a[i][j]; }
// вывод на экран cout << "A:" << endl; for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) cout << a[i][j] << " "; cout << endl; } cout << "B:" << endl; for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) cout << b[i][j] << " "; cout << endl; } system("pause"); return 0; delete[] a,b; }
Результат работы:
Заданы два массива – А(5) и В(5). В каждом из массивов найти наибольшее значение и вычесть его из всех элементов массивов. На печать вывести исходные и преобразованные массивы. #include "stdafx.h" #include <stdio.h> #include <iostream> using namespace std;
int main() { int n, mb=0,ma=0; int *a, *b; cout << "n=" << endl; cin >> n; // динамическое объявление массива a = new int [n]; for (int i = 0; i < n; i++) a[i] = n; b = new int[n]; for (int i = 0; i < n; i++) b[i] = n;
// ввод элементов for (int i = 0; i < n; i++) { cout << "a[" << i + 1 << "]="; cin >> a[i]; } for (int i = 0; i < n; i++) { cout << "b[" << i + 1 << "]="; cin >> b[i]; } for (int i = 0; i < n; i++) { if (ma < a[i]) { (ma = a[i]); }
} for (int i = 0; i < n; i++) { a[i] = a[i] - ma; } for (int i = 0; i < n; i++) { if (mb < b[i]) { (mb = b[i]); }
} for (int i = 0; i < n; i++) { b[i] = b[i] - mb; }
// вывод на экран cout << "A:" << endl; for (int i = 0; i < n; i++) { cout << a[i] << " "; cout << endl; } cout << "B:" << endl; for (int i = 0; i < n; i++) { cout << b[i] << " "; cout << endl; } system("pause"); return 0; delete[] a,b; }
Лабораторная работа №2 Классы. Программирование линейных алгоритмов с использованием функций инициализации set() и вывода результатов print()
Цель работы – изучить основные способы работы с пользовательским типом данных «класс», его объектами, методами и способы доступа к ним.
1. При x= –4,5, y=0,75* , z=0,845 , u=-55,6848.
Листинг: // 2.cpp: определяет точку входа для консольного приложения. //
Лабораторная работа №3 Классы. Программирование линейных алгоритмов с использованием конструктора, деструктора, friend – функции инициализации set() и функции вывода результатов print()
Цель работы – изучить основные способы работы по созданию конструктора класса с захватом динамической памяти и деструктора для ее освобождения, применение friend – функции и изучение ее особенностей.
Пользовательский класс Х должен содержать необходимые элементы – данные x, y, а класс Y – переменную z, которые создаются в динамической области памяти, конструкторы для их создания (операция new) и установки их начальных значений соответственно: Х(), Y(), деструкторы: ~ Х(), ~ Y(), friend – функция печати: friend void print(), функция, решающая поставленную задачу: friend void Run(). Код методов и функций – вне пространства определения класса.
Листинг // 3.cpp: определяет точку входа для консольного приложения. //
xClass::xClass(double X, double Y) { x = new double; y = new double; c = new double; *xClass::x=X; *xClass::y=Y; *xClass::c=0; };
yClass::yClass(double Z) { z = new double; *yClass::z=Z; };
xClass::~xClass() { delete x,y,c; }
yClass::~yClass() { delete z; }
void run(xClass& a, yClass& b) { *a.c =(pow(8+pow(abs(a.x-a.y),2)+1,0.33))/(a.x*a.x+a.y*a.y+2) - exp(abs(a.x-a.y))*pow(tan(b.z)*tan(b.z)+1,a.x); }
void print(xClass& a, yClass& b) { cout << "X = " << *a.x <<", Y = " << *a.y << ", Z = " << *b.z << endl; cout << "Rezultat: u = " << *a.c << endl; }
int main() { xClass X (3.251,0.325); yClass Y (0.0000466); run(X,Y); print(X,Y); getch(); return 0;
} Результат:
Лабораторная работа №4 Класс «Динамическая строка» и перегрузка операций
Цель работы – изучить методику создания одномерных динамических символьных массивов при помощи конструкторов с захватом динамической памяти и деструкторов для их уничтожения, а также способа работы со строковыми объектами, познакомиться с механизмом перегрузки операций.
Пользовательский класс String должен содержать необходимые элементы-данные, которые создаются в динамической области памяти. Конструктор для создания строк: String (…); Деструктор: ~String(); Метод ввода исходной строки: Set(); Метод печати: void print(…); Код методов – вне пространства определения класса. Программа иллюстрирует прямой и косвенный способы обращения к методам. Ввести с клавиатуры строку символов S1. Признак окончания ввода строки – нажатие клавиши «Ввод». Программа должна содержать перегруженную операцию «=», использование которой скопирует S1 в S2 . Исходную и преобразованную строки вывести в файл. В программе необходимо использовать стоковые и файловые потоки. Если длина L >5 и <30, изменить регистр символов (aBcDeF в AbCdEf).
Листинг // 4.cpp: определяет точку входа для консольного приложения. //
Лабораторная работа №5 Наследование классов, механизм виртуальных функций
Цель работы – изучить одну из базовых концепций ООП, наследование классов в С++, заключающуюся в построении цепочек классов, связанных иерархически, познакомиться с механизмом виртуальных функций. Общая постановка. Программа должна содержать: - базовый класс Х, включающий два элемента х1, х2 типа int, - конструктор с параметрами для создания объектов в динамической области памяти, деструктор, - виртуальные методы просмотра текущего состояния и переустановки объектов базового класса в новое состояние. - производный класс У, включающий один элемент у типа int , - конструктор с параметрами и списком инициализаторов, передающий данные конструктору базового класса, - переопределенные методы просмотра текущего состояния объектов и их переустановки в новое состояние. Произведение переменных классов
Листинг // 5.cpp: определяет точку входа для консольного приложения. //
#include "stdafx.h" #include <iostream> using namespace std;
class X { public: int *x; //Конструктор X(int x1 = 0, int x2 = 0) { x = new int[2]; x[0] = x1; x[1] = x2; } //Деструктор ~X() { delete [] x; } //Установка новых значений virtual void set(int x1, int x2) { x[0] = x1; x[1] = x2; } virtual void print() { cout << "X1 = " << x[0] << "\nX2 = " << x[1] << endl; } };
class Y: public X {
public: int res, y; Y(int x1 = 0, int x2 = 0, int y = 0): X(x1, x2) { this->y = y; } //Установка новых значений virtual void set(int x1, int x2, int y) { //Вызов метода базового класса X::set(x1, x2); this->y = y; }
virtual void print() { X::print(); //Для повышения точности преобразуем типintк типуdouble double res = (double)x[0] * (double)x[1] * (double)y; cout << "Y = " << y; cout << "\nResult = " << res << endl; } };
void main() { X *xptr; Y a(17, 5, 26); xptr = &a; xptr->print(); cin.ignore(); }
Результат работы
Лабораторная работа №6 Программирование шаблона классов
Цель работы – изучить приемы создания и использования шаблонов классов.
Дано: число N и последовательность a1, a2, … aN. Создать шаблон класса, порождающий динамические одномерные массивы с элементами различных типов (вещественные, целочисленные, символьные). Тип данных и результат являются параметрами по отношению к классу, программа должна иметь методы инициализации, конструктор, деструктор, метод просмотра значений созданного массива согласно заданному алгоритму. Для упрощения работы с массивами использовать возможности библиотеки шаблонов STL. (a1*a1), (a1*a2), …, (a1*aN);
Листинг // 6.cpp: определяет точку входа для консольного приложения. //
#include "stdafx.h" #include <iostream> using namespace std; template <class T> class vector { private: int N; T *a; public: //Конструктор vector(int n) { if (n > 0) a = new T[n]; N = n; } //Деструктор ~vector() { delete [] a; } T& operator[](int i) { return a[i]; } void set() { int i; for(i = 0; i < N; i++) { cout << "Enter a[" << i+1 << "]:\n"; cin >> a[i]; } } //Вывод на экран преобразованного массива void print() { int i; for(i = 0; i < N ; i++) { cout << "(" << a[i] * a[i] << "), "; } cout<<endl; } };
void main() { int n; //Ввод числа N cout << "Enter N:\n"; cin >> n; vector <float> a(n); //Ввод массива чисел cout << "Enter vector(" << n << " float numbers):\n"; a.set(); //Вывод на экран cout << "Vector:\n"; a.print(); cin.ignore(2); }