МУ_ЛР3_ОП (Методические указания к лабораторным работам)
Описание файла
Файл "МУ_ЛР3_ОП" внутри архива находится в папке "Методические указания к лабораторным работам". Документ из архива "Методические указания к лабораторным работам", который расположен в категории "". Всё это находится в предмете "программирование на основе классов и шаблонов" из 2 семестр, которые можно найти в файловом архиве МГТУ им. Н.Э.Баумана. Не смотря на прямую связь этого архива с МГТУ им. Н.Э.Баумана, его также можно найти и в других разделах. Архив можно найти в разделе "книги и методические указания", в предмете "программирование на основе классов и шаблонов" в общих файлах.
Онлайн просмотр документа "МУ_ЛР3_ОП"
Текст из документа "МУ_ЛР3_ОП"
16
Методические указания к лабораторной работе № 3 по курсу
ОСНОВЫ ПРОГРАММИРОВАНИЯ
ГУИМЦ
"Массивы и указатели"
( 4 часа)
Москва, МГТУ, СУЦ - 2014 год
_____________________________________________________________________________________________
СОДЕРЖАНИЕ
1. Цель лабораторной работы №3 по дисциплине ОП(Основы программирования) - СУЦ 4
2. Порядок выполнения лабораторной работы 4
3. Основные понятия 4
3.1. Массивы 4
3.2. Указатели 6
3.3. Динамическая память 7
3.4. Отладка программ. 7
3.5. Модули 8
3.6. Библиотеки функций 8
3.7. Библиотеки функций и шаблонов классов: RTL, STL, MFC, ATL 9
4. Примеры по теме ЛР № 4 10
4.1. Примеры описаний и инициализации массивов 10
4.2. Сумма элементов массива 10
4.3. Поиск максимума в массиве и его номера 11
4.4. Итерационный цикл расчета значения функции 11
4.5. Указатели и динамические массивы 12
5. Контрольные задания для ЛР №3. 12
5.1. Ввод и вывод массива. Вычисление суммы элементов 12
5.2. Определение минимума в массиве и его номера 12
5.3. Инициализация массива в программе и определение отдельных сумм 12
5.4. Использование указателя для массива 12
5.5. Вычисление и запоминание значений массива 12
5.6. Блок-схемы заданий 13
6. Варианты заданий для студентов СУЦ. 13
7. Дополнительные требования для студентов СУЦ (д.т.). 14
7.1. Ввод и вывод двумерного массива. Вычисление суммы его элементов. 14
7.2. Определение максимума в двумерном массиве и его координат 14
7.3. Инициализация двумерного массива 14
7.4. Вычисления значений полинома 14
7.5. Блок-схемы заданий 15
8. Демонстрация, защита ЛР и отчет по ЛР. 15
9. Контрольные вопросы по ЛР. 15
10. Литература. 16
1 Цель лабораторной работы №3 по дисциплине ОП(Основы программирования) - СУЦ
Целью данной ЛР по дисциплине ОП является получение начальных знаний и умений для использования массивов и указателей на языке программирования СИ. Студенты используют консольные проекты и отлаживают программы в среде программирования MS VS 2005/2008/2010. Студенты знакомятся со способами описания и использования масс и указателей в программах, выполняют отладку программы по своему варианту и получают исполнимую программу, готовую к выполнению, оформляют отчет по ЛР и защищают его.
2 Порядок выполнения лабораторной работы
-
Познакомиться с методическими указаниями и основными понятиями данной ЛР
-
Проработать порядок выполнения работы.
-
Создать консольные проекты для проверки примеров и выполнения задания ЛР.
-
Проверить в данном проекте примеры из методических указаний, выполнив их в отладчике в пошаговом режиме.
-
Написать программу задания ЛР по варианту, выданному преподавателем и отладить ее.
-
Продемонстрировать работу программы преподавателю в режиме отладчика по шагам и изменяемыми переменными.
-
Подготовить отчет по шаблону.
-
Защитить ЛР с предоставлением отчета и ответами на контрольные вопросы.
-
Для продвинутых студентов выполнить задания для дополнительных ( необязательных) требований и также отобразить их в отчете по ЛР.
3 Основные понятия
4 Массивы
Переменная, которая может сохранять только одно значение, называется простой переменной. Для разработки сложных программ часто недостаточно одних простых переменных, так как в противном случае простых переменных было бы очень много с разными именами, и программист может легко запутаться в таких наименованиях. Поэтому в языках программирования введено понятие массивов (упорядоченных наборов) однородных (одного типа) переменных, доступ к которым выполняется с указанием номера отдельного элемента (индекса). Такую переменную называют также переменной с индексами или элементом массива. При описании помимо имени и типа для массивов необходимо указать его размер, который называется размерностью массива. В общем случае массив описывается так:
<тип массива > <имя массива> [<размерность массива>];
Например:
int iMas [10]; // описан массив iMas целого типа, содержащий 10 элементов ( номера 0:9)
char sMas [MAX]; // массив sMas символьного типа, содержащий MAX элементов
Размерность массива задается целой константой, переменной константного типа или переменной этапа компиляции, и при таком описании размерность массивов не может изменяться во время работы программы. Номера массива начинаются с нуля (0), поэтому последний элемент массива имеет номер (точнее индекс) на единицу меньший, чем размерность массива (в нашем случае 9). При обращении к элементам массива можно указать, как константу, так и переменную целого типа, так и выражение целого типа.
Например:
iMas [5] = 3; // элементу массива iMas с номером 5 (6-му) присваивается 3
sMas [i + 5] = 'А'; // элементу массива sMas с номером i (i+4) присваивается символ 'А'
Массивы могут иметь более одного измерения, при этом указываются значения размерности по каждому измерению отдельно в квадратных скобках:
<тип массива > <имя массива> [<размерность массива1>][<размерность массива2>] …;
Например, двумерный массив может быть описан так:
int iMas [5][5]; // двумерный массив iMas целого типа, содержащий 5*5 элементов
При использовании переменных массивов с размерностью более 1-й должен быть указан номер (индекс) по каждому измерению (переменная с индексами – определяет в кождый момент времени один элемент массива):
iMas [i][j] = 10; // iMas с номерами i и j по каждому измерению присваивается 10
Массивы нужны для того, чтобы сделать программу более короткой, для обработки больших объемов данных и для обеспечения динамической настройки программ. Число измерений массивов в С и С++ не ограничивается.
Размерность массива в каждом измерении может быть задана (как сказано выше): целочисленной константой, переменной этапа компиляции (#define), константной переменной целого типа и целой переменной (для динамических массивов). При инициализации массивов фиксированным значением констант инициализации, размерность может быть не указана. Рассмотрим еще примеры для разных способов задания размерности массива:
#define N 10 // Переменная этапа компиляции
…
int Mas[N]; // Описание массива размерностью 10
const int NMax = 5; // константная переменная
int MasS[NMax]; // Описание массива размерностью 5
int MasIni[] = {1,2,3,4}; // Описание массива размерностью 4
Инициализация двумерных массивов:
int C[3][6] ={ { 1,2,3,4,5,6}, { 1,2,3,4,5,6},{ 1,2,3,4,5,6} };
В программе можно динамически определить число элементов в массиве:
int iMas1[] = {3,3,2,4,5,6,0,1,9};
Razm = sizeof(iMas1)/sizeof(int);
Указатель – это переменная, которая содержит адрес памяти, где расположена другая переменная (см. раздел ниже) или массив переменных (Этот фрагмент раздела можно пропустить, познакомится подробнее с указателями и вернуться к нему позже). По-умолчанию само имя массива трактуется как указатель на его начало. Проиллюстрируем это примером.
int * PtrMas; // Указатель на целую переменную
int MasP[]={ 1,2,3}; // Описание массива
PtrMas = MasP; // Указателю присваивается указатель на начало массива
int m = PtrMas[1]; // k = 2!
Также забегая вперед, проиллюстрируем использование указателей для работы с динамическими массивами. Проиллюстрируем это зразу на примере. В указателе PtrMas запоминается адрес области динамической памяти, выделенной оператором new. Далее динамический массив заполняется в цикле. Затем с использованием операции разыменования (*) мы получим новое значение из массива (в переменную l). Оно равно 3.
PtrMas = new int [5];
for ( int k = 0 ; k< 5 ; k++)
PtrMas[k] = k + 1; // Динамическое заполнение массива числами от 1 до 5
int l = 2 ;
*(PtrMas + l) = l + 1; // Использование указателя для занесение на место [2] значения 3 (2+1)
l = PtrMas[l] ; // l = 3
5 Указатели
Кроме использования массивов, есть и другой способ, чтобы сделать программу динамически настраиваемой во время выполнения. Это переменные специального типа - указатели. Такие переменные содержат в качестве значения не число, а адрес другой переменной (в оперативной памяти). При описании таких переменных нужно указать специальный знак – звездочка (“*”). Кроме того, должно быть указан тип переменных, на которые данный указатель может ссылаться. Можно объявить и массив указателей и выполнить предварительную инициализацию указателя. Описание указателя:
<тип указателя > * <имя указателя> [ = < значение для инициализации>];
Например:
// Указатели
int /*i , */ j , k ;
int *pInt; // Указатель на переменную типа int
int **ppInt; // Указатель на указатель на переменную типа int
int *pMas[10]; // Массив указателей
int aI =5; // Простая переменная
int *pInit = &aI; // инициализация указателя
Для работы с указателями используются две специальные операции: операция именования (“&”) и операция разыменования (“*”). Операция именования используется для вычисления значения указателя – адреса переменной или выражения. Операция разыменования используется для получения значения переменной, адрес которой задан данным указателем. Примеры:
/// Задание значениq и адресов
j = 15;
pInt = &j; // именование - в указатель записывается адрес
i = *pInt; // разыменование – берем значение переменной по указателю (j)
ppInt = &pInt;
k = **ppInt; // двойное разыменование указателя
Для упрощения работы с указателями, а также для удобной перегрузки операций в классах в С++ введено понятие ссылки. Ссылка также задает адреса других переменных и объектов, но явного использования операций именования и разыменования для ссылок не требуется. Белее детально со ссылками вы познакомитесь в курсе Объектно - ориентированного программирования (см. литературу[6] и MSDN).
6 Динамическая память
Часто все переменные и массивы располагаются в оперативной памяти заранее, до начала выполнения программы. Все рассмотренные ранее примеры включали такие переменные и массивы. Размер выделенной памяти под массив, то есть его размерность в этом случае изменить нельзя. Поэтому приходится заранее рассчитывать максимально возможную размерность массива, которая приемлема для всех случаев. Это приводит к перерасходу памяти для отдельных случаев. Для экономии памяти и для построения более универсальных программ используют динамически выделяемые переменные. С помощью специальных операций (new и delete) можно выделять память во время выполнения программы. Такие данные называются динамическими. Ранее в языке СИ оперативная память выделялась с помощью специальных функций (alloc, malloc и т.д.). Динамические переменные располагаются в оперативной памяти в специальной области. Для работы с такими данными используют указатели и ссылки. Пример выделения динамической памяти для указателей и ссылок:
int * piDyn = new int; // Выделяется область для целой переменной
int *piDMas = new int[10]; // Выделяется область для массива целых 10 переменных
int *piDMas = new int[i]; // Выделяется область для массива целых i переменных
Работа с указателями на динамические переменные и массивы выглядит так:
*piDyn = 5;
piDMas[0] = 5;
По завершению блока, в котором выделены динамические переменные их надо удалить специальным оператором delete:
delete piDyn;
delete []piDMas;
Кроме этого для работы с динамической памятью могут быть использованы функции работы с динамической памятью ( библиотека malloc.h): выделение (calloc , malloc) и освобождения (free), оперативной памяти Пример:
#include <malloc.h>
…
int *pMasInt;
…
pMasInt = (int *) malloc ( 10 ); // выделить 10 байт
…
free( pMasInt ); // Освободить динамическую память
…
pMasInt = (int *) calloc ( 10 , sizeof (int)); // выделить для массива 10 ‘ktvtynjd по размеру int
pMasInt[3] = 10; // Работа с динамическим массивом
int iTest = pMasInt[3] ;
…
free( pMasInt ); // Освободить динамическую память
Другие возможности для работы с библиотекой вы найдете в литературе и документации по СИ.
7 Отладка программ.
В этом разделе повторяем возможности отладчика, так как демонстрация программы преподавателю должна быть выполнена в режиме отладчика. При разработке программ важную роль играет отладчик, который встроен в систему программирования. В режиме отладки можно проверить работоспособность программы и выполнить поиск ошибок самого разного характера. Отладчик позволяет проследить ход (по шагам) выполнения программы и одновременно получить текущие значения всех переменных и объектов программы, что позволяет установить моменты времени (и операторы), в которые происходит ошибка и предпринять меры ее устранения. В целом, отладчик позволяет выполнить следующие действия:
-
Запустить программу в режиме отладки без трассировки по шагам (F5);
-
Выполнить программу по шагам (F10);
-
Выполнить программу по шагам с обращениями к вложенным функциям(F11);
-
Установить точку останова (BreakPoint – F9);
-
Выполнить программу до первой точки останова (F5);
-
Просмотреть любые данные в режиме отладки в специальном окне (locals);
-
Просмотреть любые данные в режиме отладки при помощи мышки;
-
Изменить любые данные в режиме отладки в специальном окне (locals и Watch);
-
Установить просмотр переменных в специальном окне (Watch);
-
Просмотреть последовательность и вложенность вызова функций.
При выполнении всех лабораторных курса студенты должны активно использовать отладчик VS, знать его возможности и отвечать на контрольные вопросы, связанные с отладкой и тестированием программ.
Примечание. Подробное описание материала и понятий вы можете найти в литературе [1 - 6] или справочной системе MS VS. Кроме того, не пропускайте лекции по курсу. Не рекомендую безоговорочно верить материалам из сети Интернет (например, в Википедии), так как там в некоторых статьях есть ошибки!
8 Модули
При проектировании и разработке программ применяется метод модульного программирования. Суть его заключается в том, что сложная программа разбивается на отдельные части (модули – не надо путать с учебными модулями). Каждый модуль разрабатывается отдельно и возможно разными программистами. Такой способ называют также декомпозицией. Совокупность модулей составляет проект программы. Модули бывают разных типов:
-
Исходные модули, содержащие текст на языке программирования.
-
Объектные модули получаются в результате компиляции программы.
-
Исполнимые модули предназначены для выполнения программы.
Исходные модули могут быть разных типов. Основные исходные модули – это модули программ (*.c, *.cpp) и модули заголовочных файлов (*.h , *.hpp). Они включены в разные разделы дерева проекта программы.
Объектные модули формируются компилятором языка программирования (у нас С++) в том случае, если не было ошибок в программе. Объектные модули являются промежуточным звеном в создании программ, но не могут выполняться непосредственно. Подключаемые в программу библиотеки содержат объектные модули, поэтому не требуется их повторной компиляции. Объектные модули имеют расширение *.obj.