Мегаобучалка Главная | О нас | Обратная связь


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



2018-07-06 463 Обсуждений (0)
Лабораторная работа №6 0.00 из 5.00 0 оценок




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

 

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

 

 



2018-07-06 463 Обсуждений (0)
Лабораторная работа №6 0.00 из 5.00 0 оценок









Обсуждение в статье: Лабораторная работа №6

Обсуждений еще не было, будьте первым... ↓↓↓

Отправить сообщение

Популярное:



©2015-2024 megaobuchalka.ru Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. (463)

Почему 1285321 студент выбрали МегаОбучалку...

Система поиска информации

Мобильная версия сайта

Удобная навигация

Нет шокирующей рекламы



(0.006 сек.)