Главная страница

Программирование C++. Пензенский государственный университет введение в программирование на языке с лабораторный практикум пенза 2010 г 2


Скачать 1.47 Mb.
НазваниеПензенский государственный университет введение в программирование на языке с лабораторный практикум пенза 2010 г 2
Дата06.10.2022
Размер1.47 Mb.
Формат файлаpdf
Имя файлаПрограммирование C++.pdf
ТипПрактикум
#718990
страница9 из 10
1   2   3   4   5   6   7   8   9   10

strcpy_s(tmp.s, tmp.len+1, s);
strcat_s(tmp.s, tmp.len+1, str.s);
return
tmp; сначала вызывается конструктор копирования, потом деструктор tmp
}
#endif
Н Файл DinSring.cpp
// Тестирование класса DinString
#include
"DinString.h"
int
main()
{
DinString s1(
"123"
), s2(
"456"
), s3(s1), s4;
s4=s3 + s2;
cout<<
"s1: "
; s1.print(); cout<<
"s2: "
; s2.print();
cout<<
"s3: "
; s3.print(); cout<<
"s4: "
; s4.print();
cout<
system(
"pause"
);
return
0;
}

71 Результат работы программы
4.4.3 Базовый и наследуемый классы для работы с линейным списком Пример Базовый и наследуемый классы для работы с линейным списком Файл list_base.h

// Базовый класс Линейный список // определение динамического списка и его операций
_LIST_BASE_H
// Предотвращение многократного включения файла
#define
_LIST_BASE_H
#include

using
std::endl;
using
std::cout;
struct
ELEM
// Структура для элемента списка
{
int
x;
// Данные (целое значение)
ELEM *next;
// Указатель наследующий элемент
};
class
LIST_BASE
// Определение класса LIST_BASE
{
// Данные
Protected
:
// необходим доступ и для производных от
LIST_BASE
классов
ELEM *start;
// Указатель на начало списка
// Методы
public
:
// Конструктор (подставляемый метод)
LIST_BASE(
void
) : start( NULL )
// Вначале список пуст
{
cout<<
"\nThe base designer is called"
<
}
// Деструктор (имя совпадает с именем класса, но передним ставится '

').
// Деструктор автоматически вызывается, когда
// - объект уходит из области действия
// - завершается программа
// - используется операция delete для объектов, размещенных операцией new;
// - явно используется вызов с полным именем деструктора.
// Деструктор не имеет параметров и возвращаемого значения
LIST_BASE(
void
)
// Подставляемый метод );
// Удаление всего списка
cout<<
"\nThe base destructor has completed operation "
<
system(
"pause"
); ТОЛЬКО ДЛЯ ОТЛАДКИ
}

72
void
Add_end(
const
int
&d );
// Добавить элемент вконец списка
void
Print(
void
);
// Вывод содержимого списка на экран
void
Del_all(
void
);
// Удалить весь список
void
Del_end(
void
);
// Удалить последний элемент списка
// Завешение определения класса LIST_BASE
// Реализация методов класса LIST_BASE
// Добавление элемента вконец списка
void
LIST_BASE :: Add_end(
const
int
&d )
//
d - добавляемое значение
{
ELEM *temp,
// Указатель на новый (добавляемый) элемент списка
*cur;
// Указатель на текущий элемент
temp =
new
ELEM;
// Динамическое размещение нового элемента
if
( !temp )
{
cout<<
"\n The unit of the list is not placed "
<
return
;
}
temp->x = d;
// Занесение данных
temp->next = NULL;
// Новый элемент является последним
if
( !start)
// Новый список (пустой)
start = temp;
// Указатель на начало списка
else
{
cur = start;
while
( cur->next )
// Проходим весь список от начала, пока текущий
cur = cur->next;
// элемент не станет последним
cur->next = temp;
// Ссылка последнего элемента на новый,
// добавляемый вконец списка
}
return
;
}
// Удаление последнего элемента списка
void
LIST_BASE :: Del_end(
void
)
{
ELEM *prev,
// Указатель на предпоследний элемент
*end;
// Указатель на последний элемент
if
( !start )
// Если список пуст, вывод сообщения и возврат
cout<<
"\n The list is empty "
<
return
;
}
if
( !start->next )
// В списке один элемент start;
start = NULL;
return
;
}

73
end = start;
// Указатель на начало списка
while
( end->next )
// Поиск последнего (и предпоследнего) элемента
prev = end;
end = end->next;
// Продвижение по списку
delete
end;
// Удаление последнего элемента
prev->next = NULL;
// Бывший предпоследний элемент становится последним
}
// Вывод значений данных элементов списка на экран
void
LIST_BASE :: Print(
void
)
{
ELEM *prn;
// Указатель на печатаемый элемент
if
( !start )
// Если список пуст, вывод сообщения и возврат
cout<<
"\n The list is empty "
<
return
;
}
prn = start;
// Указатель на начало списка
while
( prn )
// Проходим весь список до конца
{
cout<
x<<

" "
;
// Вывод значения данных элемента списка
prn = prn->next;
// Продвижение по списку
}
cout<
return
;
}
// Удаление всего списка
void
LIST_BASE :: Del_all(
void
)
{
if
( !start )
// Если список пуст, вывод сообщения и возврат
cout<<
"\n The list is empty "
<
return
;
}
while
( start )
// Пока в списке есть элементы );
// удаляем последний
return
;
}
#endif
_LIST_BASE_H

74 Файл list_2.h

// Класс Линейный список 2», наследуемый от базового
// класса Линейный список определение операций
_LIST_2_H
// Предотвращение многократного включения файла _LIST_2_H
#include
"list_base.h"
// Подключение базового класса для работы со списком LIST_2 :
public
LIST_BASE
// Объявление производного класса
{
// Класс LIST_2, производный от класса LIST_BASE,
// наследует от него все его данные и методы (включая деструктор).
// Конструктор базового класса не наследуется, но при создании класса,
// наследуемого от другого класса, сначала вызывается конструктор
// для базового класса, а затем конструктор, определенный в производном
// классе (если он есть.
// Компилятор ищет конструктор базового класса по умолчанию
// (те. без параметров.
// Если конструктор базового класса требует параметров, то конструктор
// производного класса должен вызывать базовый конструктор, используя
// список инициализации элементов.
// При разрушении объекта деструкторы вызываются в обратном порядке
// Методы
public
:
void
After_Add(
int
find,
int
add );
// Добавить элемент add после элемента find
void
Before_Add(
int
find,
int
add );
// Добавить элемент add перед элементом find
};
// Конец объявления производного класса
// Реализация методов производного класса
// Добавление элемента add после элемента find
void
LIST_2 :: After_Add(
int
find,
int
add )
{
ELEM *temp=NULL,
// Указатель на добавляемый элемент
*cur;
// Указатель на текущий элемент
if
( !start )
// Если список пуст, вывод сообщения и возврат
{
cout<<
"\n The list is empty "
<
return
;
}
// Поиск элементов, содержащих значение find, с добавлением
// после них элемента со значением add
cur = start;
while
( cur )
// Проходим весь список до конца
{
if
( cur->x == find )
{
// Нужный элемент найден (он является текущим)
temp =
new
ELEM;
// Динамическое размещение элемента
if
( !temp )
{
cout<<
"\n The unit of the list is not placed "
<
return
;
}
temp->x = add;
// Занесение данных

75
temp->next = cur->next;
// Ссылка на элемент, который стоял за текущим
cur->next = temp;
// Текущий элемент указывает на новый = temp;
// Новый элемент становится текущим
cur = cur->next;
// Продвижение по списку
}
// Если нужный элемент не найден (temp=NULL), вывод сообщения !temp ) cout<<
"\nThe element "
<
" is not found "
<
return
;
}
// Добавление элемента add перед элементом find
void
LIST_2 :: Before_Add(
int
find,
int
add )
{
ELEM *temp = NULL,
// Указатель на добавляемый элемент
*cur,
// Указатель на текущий элемент
*prev;
// Указатель на элемент, стоящий перед текущим
if
( !start )
Если список пуст, вывод сообщения и возврат
cout<<
"\n The list is empty "
<
return
;
}
// Поиск элементов, содержащих значение find, с добавлением
// передними элемента со значением add
cur = start;
while
( cur )
// Проходим весь список до конца
{
if
( cur->x == find )
{
// Нужный элемент найден (он является текущим =
new
ELEM
// Динамическое размещение элемента !temp )
{
cout<<
"\n The unit of the list is not placed "
<
return
;
}
temp->x = add;
// Занесение данных
temp->next = cur;
// Новый элемент указывает на элемент с
// Если элемент с символом find был первым
if
( cur == start )
// start смещается влево (на новый элемент)
start = temp;
else
// Элемент, стоящий перед cur указывает на новый = temp;
}
prev = cur;
// Продвижение текущего и предыдущего
cur = cur->next;
// элементов по списку
}
// Если нужный элемент не найден (temp=NULL), вывод сообщения !temp )cout<<
"\nThe element "
<
" is not found "
<
return
;
}
#endif
_LIST_2_H

76 Файл list_2.cpp

// Тестирование классов и LIST_2
// Подключение производного и базового классов
#include
"list_2.h"
int
main()
// Тестирование
{
LIST_2 ls;
// Определение списка ls
// Использование функций, унаследованных от базового класса LIST_BASE
ls.Add_end( 1 );
// Добавление 1 вконец списка
ls.Add_end( 2 );
// Добавление 2 вконец списка
ls.Add_end( 3 );
// Добавление 3 вконец списка
ls.Print( );
// Вывод содержимого списка
ls.Del_end( );
// Удаление последнего элемента
ls.Print( );
ls.Del_all( );
// Удаление всего списка
for
(
int
i=1; i<=2; i++ )
// Заполнение списка двумя пятерками
ls.Add_end(5);
ls.Print( );
// Использование функций производного класса LIST_2: Befor_Add, After_Add
// Добавление 3 перед 5
ls.Before_Add( 5, 3 );
ls.Print( );
// Добавление 4 после 3
ls.After_Add( 3, 4 );
ls.Print( );
// Добавление 4 после 2
ls.After_Add( 2, 4 );
ls.Print( );
system(
"pause"
);
return
0;
} Результат работы программы

77 Задания для самостоятельной работы

4.5.1 Разработка классов для работы с динамическими структурами данных Темы заданий аналогичны заданиям из раздела 3.9.2. Объявите заданную динамическую структуру данных как класс и разработайте методы класса для обработки значений данных. Главная программа (
main
) осуществляет тестирование разработанных программных средств.
1) Для хранения целых чисел используется следующая структура данных Класс Данные Массив указателей Методы добавить значение (в зависимости от первой цифры число попадает вконец одного из списков) вывести текущее состояние структуры данных (вывести все значения в виде двумерного массива) найти значение в структуре данных (функция возвращает 1, если значение найдено, ив противном случае)
2) Множество целых чисел представляется как однонаправленный линейный список. Класс Данные Указатель на начало списка (список – множество) Методы найти значение в множестве (функция возвращает 1, если значение найдено, ив противном случае) добавить значение в множество (если значение уже есть в множестве, то оно в множество не добавляется. Для проверки используйте функцию найти значение в множестве) вывести текущее состояние множества (вывести все значения) определить мощность множества (подсчитать количество чисел в множестве)

78 3) Многочлен
0 1
1 1
1
a
x
a
x
a
x
a
n
n
n
n
представляется как однонаправленный линейный список, элемент которого имеет следующую структуру
степень
Указатель наследующий элемент
коэффициент
Например, многочлену
3 5
2 3
x
x
будет соответствоватьсписок: Класс Данные Указатель на начало списка (список – элементы многочлена) Методы добавить элемент многочлена в список сформировать многочлен (используется функция добавить элемент многочлена в список) вывести многочлен (вывести общий вид многочлена для возведения в степень использовать символ «
^
», например, х) вычислить многочлен (функция возвращает значение многочлена при заданном х)
4) Длинное целое число представляется как однонаправленный линейный список, где каждая цифра – элемент списка. Класс Данные Указатель на начало списка (список – целое число) Методы сформировать длинное целое число (функция формирует список из цифр числа) вывести список (функция выводит длинное целое число) сложить два длинных целых числа (функция получает на вход два списка и возвращает третий список, каждый элемент которого содержит цифру, равную сумме, соответствующих цифр исходных списков. Фактически, результат функции – сумма двух чисел)
5) Циклический однонаправленный список целых чисел имеет следующуюструктуру: Начало списка. . Последний элемент указывает на начало списка

Класс Данные Указатель на начало списка Методы добавить в список (функция добавляет элемент вконец списка) вывести список (функция выводит все значения, которые хранятся в списке) выбрать элемент из списка по номеру (функция удаляет элемент, отсчитывая его в соответствии с заданным номером от начала списка. Номер может быть больше количества элементов списка)

79 6) Динамический массив из N комплексных чисел. Класс Данные Массив комплексных чисел Методы сформировать массив вывести массив (функция выводит все комплексные числа) определить комплексное число как сумму всех комплексных чисел массива найти комплексное число с максимальным модулем ( модуль
2 2
im
re
, где re – действительная часть, im – мнимая часть комплексного числа)
7) Стек как динамический массив из N целых чисел. Класс Данные Массив целых чисел Значение номера верхушки стека Методы поместить значение в стек извлечь значение из стека (функция возвращает значение из вершины стека и удаляет его из стека) стек заполнен (функция возвращает значение истина, если стек заполнен) стек пуст (функция возвращает значение истина, если в стеке нет значений) вывести стек (не изменяя содержимое стека функция, выводит все значения, которые хранятся в стеке)
8) Стек как однонаправленный линейный список целых чисел. Класс Данные Указатель на начало списка (список – стек) Методы поместить значение в стек (функция добавляет значение в начало списка извлечь значение из стека (функция возвращает значение изначала списка и удаляет его из списка) стек пуст (функция возвращает значение истина, если в списке нет значений) вывести стек (не изменяя содержимого списка, функция выводит все значения, которые хранятся в списке)

80 9) Очередь как однонаправленный линейный список целых чисел. Задана максимальная длина очереди –
1   2   3   4   5   6   7   8   9   10


написать администратору сайта