Лабораторная работа №6
Многомерные массивы, массивы динамической памяти.
1. Цель работы: Приобретение навыков работы с динамическими массивами памяти.
Домашнее задание 2.1 Изучите материал по темам: массивы и указатели, многомерные массивы, массивы указателей, динамические массивы. 2.2 Приведите примеры описания, определения и инициализации статического одномерного и многомерного массивов, массива указателей, динамического массива. Лабораторное задание. 3.1 Набрать программу № 1 // Программа №1 #include "stdafx.h" #include <iostream> using namespace std; void main(){ int n; cout<<"\n Input n ="; cin>>n; double **matr; matr = new double* [n]; if(matr == NULL) { cout<<"\n He создан динамический массив"; return; } for(int i = 0; i < n ; i++){ matr[i] = new double [n]; if(matr[i]== NULL) { cout<<"\n He создан динамический массив"; return; } for(int j = 0; j < n;j++) if(i != j) matr [i][j] = 0; else matr[i][j] = 1; } for(int i = 0; i < n; i++){ cout<<"\n string "<<":"<<i; for(int j = 0;j< n; j++) cout<<"\t"<<matr[i][j]; } for(int i=0; i < n; i++) delete matr[i]; delete[]matr; getchar();getchar(); } 3.2 Отладить программу №1 (Эта программа является примером создания двухмерного динамического массива.) 3.3 Написать функцию, реализующие перемножение, сложение, вычитание двух матриц. Эти функции должны принимать указатели (или ссылки) на матрицы и возвращать указатель на результирующую матрицу. 3.4 Написать функцию транспонирования матрицы. 3.5 Написать алгоритм и функцию решения системы линейных алгебраических уравнений методом Гаусса.(*) 3.6 Ответить на контрольные вопросы. 3.6 Написать отчет.
Содержание отчета 4.1 Титульный лист. Домашнее задание. 4.2 Тексты программ, написанных при выполнении 3.3 и 3.4 пунктов лабораторного задания.
5. Контрольные вопросы 5.1 Операторы и функции динамического выделения памяти new, delete, malloc(), free(). Привести примеры использования этих операторов и функций. 5.2 В чем разница между динамическим массивом и статическим массивом памяти. 5.3 Напишите функцию, принимающую в качестве параметров указатели (или ссылки) на две строки и возвращающую указатель на новую строку, являющуюся результатом слияния этих строк. 5.4 Приведите примеры передачи в функцию как параметра динамического и статического массива памяти. 5.5 Напишите функцию, принимающую указатель (или ссылку) на матрицу в качестве параметра и возвращающую указатель на копию этой матрицы, повернутую по часовой стрелки. 5.6 Напишите функцию, принимающую указатель (или ссылку) на матрицу в качестве параметра и возвращающую указатель на копию этой матрицы, повернутую против часовой стрелки. 5.7 Напишите функцию, принимающую указатель (или ссылку) на матрицу в качестве параметра и возвращающую указатель на копию этой матрицы, транспонированную относительно не главной диагонали. 5.8 Напишите функцию, принимающую указатель (или ссылку) на матрицу в качестве параметра и возвращающую указатель на копию этой матрицы, повернутую зеркально вниз. 5.9 Напишите функцию, принимающую указатель (или ссылку) на матрицу в качестве параметра и возвращающую указатель на копию этой матрицы, повернутую зеркально вправо. 5.10 Перечислите способы передачи параметров в функцию. Приведите примеры.
Лабораторная работа №7 Линейные списки и структурированные данные.
1. Цель работы: Получение навыка работы со структурами и линейными списками.
Домашнее задание 1. Разработать алгоритм и пояснить на рисунках последовательность действий, которую необходимо выполнить для того, чтобы вставить объект в начало, в конец, в середину или удалить из двухсвязного списка.
Рис 1 Двухсвязный список Р(prior) - указатель на предыдущий элемент списка; N(next) - указатель на следующий элемент списка; begin - указатель на начало списка; О - объект или указатель на объект, вставленный в список. 2. Изучить текст программы №1.
Лабораторное задание
1. Набрать программу №1 //Программа №1 #include "stdafx.h" #include<string.h> #include<iostream> using namespace std; struct card { //Определение структурного типа для книги char *author; // Ф.И.О. автора char *title; // Заголовок книги char *city; // Место издания char *firm; // Издательство int year; // Год издания int pages; // Количество страниц }; //Функция печати сведений о книге: void printbook(card& car) { static int count = 0; cout<<"\n"<< ++count <<". "<<car.author; cout<<" "<<car.title<<".- "<<car.city; cout<<": "<<car.firm<<", "; cout<<"\n"<<car.year<<".- "<<car.pages<<" c."; } struct record { //Структурный тип для элемента списка (1) card book; record *prior; record *next; }; //Исходные данные о книгах: card books[] = { //Инициализация массива структур: (2) { "Wiener R.S.", "Turbo C", "M", "ST",1991, 384}, { "Stroustrup B.","Langvige C", "kiev","DiaSoft",1993, 560}, { "Turbo C++.", "For programm", "M","INTKV",1991,394}, { "Limppman S.B.","C++ for new", "M","GELION",1993,496}
}; void main() { record *begin = NULL, //Указатель начала списка (3) *last = NULL, //Указатель на очередную запись *list; //Указатель на элементы списка // n-количество записей в списке: int n = sizeof(books)/sizeof(books[0]); // Цикл обработки исходных записей о книгах: for (int i=0;i<n; i++) {//Создать новую запись(элемент списка): (4) last = new(record); //Занести сведения о книге в новую запись: (*last) .book.author = books[i].author; (*last) .book.title = books[i].title; last->book.city = books[i].city; last->book.firm = books[i].firm; last->book.year = books[i].year; last->book.pages = books[i].pages; //Включить запись в список(установить связи): if (begin == NULL) //Списка ещё нет (5) {last->prior = NULL; begin = last; last->next = NULL; } else { //Список уже существует list = begin; //Цикл просмотра цикла - поиск места для //новой записи: while (list) //(6) {if (strcmp(last->book.author, list->book.author) < 0 ) {//Вставить новую запись перед list: if (begin == list) {//Начало списка: (7) last->prior = NULL; begin = last; } else {//Вставить между записями: (8) list->prior->next = last; last->prior = list->prior; } list->prior = last; last->next = list; //Выйти из цикла просмотра списка: break; } if (list->next == NULL) {//Включить запись в конец цикла: (9) last->next = NULL; last->prior = list; list->next = last; //Выйти из цикла просмотра списка: break; } //Перейти к следующему элементу списка: list = list->next; }//Конец цикла просмотра списка //(Поиск места для новой записи) } //Включение записи выполнено } //Конец цикла обработки исходных данных
//Печать в алфавитном порядке библиографического списка: list = begin; // (10) cout<<"\n"; while (list) { printbook(list->book); list = list->next; } getchar(); } 2. Отладить программу №1 (Программа является примером использования двухсвязного линейного списка.) 3. Написать функции вставки в начало, в середину и в конец списка объекта типа card, а также функции удаления и доступа (по индексу) к объекту типа card в списке. 4. Модифицировать программу №1 так, чтобы можно было с клавиатуры вводить и удалять записи в списке. 5. Модифицировать функции списка так, чтобы ими можно было пользоваться для организации списка произвольного типа объектов *. 6. Написать отчет.
Содержание отчета. 1. Титульный лист. Домашнее задание 2. Тексты функций написанных при выполнении пунктов 3,4 и 5 лабораторного задания.
Контрольные вопросы 1. Что такое стек, очередь, дек? 2. Чем отличается указатель типа void* от указателей другого типа type*? 3. Расскажите, что такое структура и объединение? Приведите примеры определения, инициализации и описания структуры и объединения. 4. Как получить доступ к полю структуры и объединения? Какое множество операций определено над структурой/объединением и полями структуры/объединения? 5. Приведите примеры использования оператора typedef со стандартными типами данных, со структурами и объединениями. 6. Битовые поля структур и объединений, назначение, способ определения, множество операций, определенных над битовыми полями. 7. Написать функции реализующие стек целых чисел. 8. Написать функции реализующие дек вещественных чисел. 9. Написать функции реализующие очередь символьных переменных. 10. В чем состоят преимущества и недостатки связанных списков перед массивами? Приведите примеры. 11. Запишите синтаксис доступа к полям данных структурированных типов данных через имя объекта этого типа и указатель на объект этого типа. 12. Напишите функцию сортировки объектов типа card, вставленных в список, по названию книги или году издания. (Для этого необходимо создать динамический массив указателей М на объекты типа card в списке и с помощью функции qsort() отсортировать массив М по соответствующему критерию, при этом последовательность объектов в списке остается неизменной).
Популярное: Почему люди поддаются рекламе?: Только не надо искать ответы в качестве или количестве рекламы... Почему стероиды повышают давление?: Основных причин три... ©2015-2024 megaobuchalka.ru Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. (463)
|
Почему 1285321 студент выбрали МегаОбучалку... Система поиска информации Мобильная версия сайта Удобная навигация Нет шокирующей рекламы |