Многомерные массивы, массивы динамической памяти.



 

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.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() отсортировать массив М по соответствующему критерию, при этом последовательность объектов в списке остается неизменной).

   

 

Лабораторная работа №8


Дата добавления: 2021-04-05; просмотров: 64; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!