Добавил:
Рад, если кому-то помог Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
1
Добавлен:
01.11.2025
Размер:
3.32 Mб
Скачать

МИНИСТЕРСТВО ЦИФРОВОГО РАЗВИТИЯ, СВЯЗИ И МАССОВЫХ КОММУНИКАЦИЙ РОССИЙСКОЙ ФЕДЕРАЦИИ

Федеральное государственное бюджетное образовательное учреждение

высшего образования

«Поволжский государственный университет телекоммуникаций и информатики»

Факультет

Факультет № 1.

Направление подготовки / специальность

09.03.01 Информатика и вычислительная техника

Кафедра информатики и вычислительной техники

ФИО студента

Группа студента

,Лабораторная работа № 4

по программированию С

Тема: Массивы, динамическое выделение памяти

Цель работы: познакомиться с организацией массивов в языке Си, изучить принципы работы с массивами, освоить работу с массивами через указатели, научиться грамотно выделять и освобождать память в процессе работы программы

Вариант 4

1. Из элементов массивов А(20) и С(20) образовать новый массив

2. Вычислить P1 и P2 — первый и второй положительные элементы линейного массива, N1 и N2 — первый и второй отрицательные элементы того же массива. Массивы, в которых нет хотя бы двух положительных и двух отрицательных элементов, являются некорректными.

3. Поменять местами максимальный и минимальный элементы матрицы А (812). Если в массиве максимальное или минимальное значение встречается неоднократно, данный массив признается некорректным.

4. Вычислить среднее арифметическое значение элементов, лежащих на диагоналях квадратной матрицы. Заменить этим значением все диагональные элементы матрицы.

5. Результаты сессии, состоящей из четырех экзаменов, для трех групп из 25 студентов представлены трехмерным массивом 3254. Оценка ставится по четырёхбалльной системе; неявка обозначена единицей. Определить, экзамен по какой дисциплине вызвал наибольшие трудности, то есть по какой дисциплине средний балл наименьший.

Ход работы:

1.

2.

3.1

3.2

4.

5.

Ответы на контрольные вопросы

  1. Что такое массив? 

Массив – это структура данных, которая хранит набор однотипных элементов в последовательной области памяти.  

  1. Что представляет собой имя массива? 

Имя массива – это указатель на первый элемент массива в памяти. 

  1. Что представляет собой индекс элемента массива? 

Индекс – это целое число, которое указывает на позицию элемента в массиве.  

  1. Как можно обратиться к элементу массива? 

С помощью имени массива и индекса элемента, например: a[i]. 

  1. Как получить адрес элемента массива? 

Используйте оператор & перед именем элемента, например: &a[i]. 

  1. Как описать указатель на начало массива? 

Используйте имя типа данных, звездочку и имя указателя, например: int *p;.  

  1. Как обратиться к элементу массива через указатель? 

Используйте * перед именем указателя и индекс элемента, например: *(p+i). 

  1. Существует ли связь между индексом элемента и его значением? 

Нет, индекс указывает на позицию элемента в массиве, а значение элемента – это его содержимое.  

  1. Чему равен индекс первого элемента массива? 

Индекс первого элемента равен 0. 

  1. Как проинициализировать массив? 

При объявлении массива можно сразу присвоить значения его элементам, например: int a[5] = {1, 2, 3, 4, 5};. 

  1. Когда можно не указывать количество элементов массива при описании? 

Это возможно только при инициализации массива списком значений, например: int a[] = {1, 2, 3};. 

  1. Какого типа могут быть элементы массива? 

Элементы массива могут быть любого типа данных, допустимого в языке программирования, например: целые числа, действительные числа, символы, строки. 

  1. Какие операции можно производить над массивом как единым целым? 

Над массивом как единым целым можно выполнять операции копирования, сравнения, передачи в функцию. 

  1. Почему при обработке массивов используют циклы? 

Циклы позволяют эффективно перебирать элементы массива и выполнять над ними одинаковые действия. 

  1. Как поменять местами два элемента массива? 

Используйте временную переменную для хранения значения одного элемента, например: int temp = a[i]; a[i] = a[j]; a[j] = temp;. 

  1. Чему равен индекс последнего элемента массива? 

Индекс последнего элемента равен количество элементов - 1. 

  1. Возникнет ли ошибка при обращении к элементу массива, индекс которого больше индекса последнего элемента этого массива? 

Да, возникнет ошибка, так как вы попытаетесь получить доступ к области памяти за пределами массива. 

  1. Может ли существовать массив из одного элемента? 

Да, например: int a[1] = {1};. 

  1. Является ли p указателем на массив a[], если они объявлены следующим образом: int a[10], *p=a;? 

Да, p будет указывать на первый элемент массива a[]. 

  1. Что такое сортировка массива? 

Сортировка массива – это процесс упорядочения его элементов по возрастанию или убыванию. 

  1. Что такое двумерный массив? 

Двумерный массив – это массив, элементы которого сами являются массивами. Он представляет собой таблицу. 

  1. Как располагается двумерный массив в памяти компьютера? 

Двумерный массив располагается в памяти строка за строкой. 

  1. Как проинициализировать двумерный массив? 

Инициализация двумерного массива осуществляется с помощью вложенных фигурных скобок, например: int a[2][3] = {{1, 2, 3}, {4, 5, 6}};. 

  1. Почему при объявлении двумерного массива с одновременной инициализацией первые скобки можно оставить пустыми, а вторые нет? 

Первые скобки можно оставить пустыми, потому что компилятор может определить размер массива по количеству значений в списке инициализации. Вторые скобки нужны для определения количества столбцов в каждой строке. 

  1. Если двумерным массивом программируется матрица, то при обращении к элементу двумерного массива сначала указывается индекс строки или индекс столбца? 

Сначала указывается индекс строки, затем индекс столбца.  

  1. Как вывести двумерный массив таблицей с колонками одинаковой ширины? 

Используйте форматный специфика 

Тор %d (или %f, %s в зависимости от типа данных) с указанием ширины поля для каждого элемента, например: printf(«%5d «, a[i][j]);. 

  1. Что представляет собой имя двумерного массива? 

Имя двумерного массива – это указатель на начало массива в памяти, т.е. на первый элемент первого ряда. 

  1. Что представляет собой первый индекс элемента двумерного массива? 

Первый индекс – это индекс строки. 

  1. Что представляет собой второй индекс элемента двумерного массива? 

Второй индекс – это индекс столбца. 

  1. Массив объявлен так: double ar[5][7]. Какого типа значение выражения ar[2]? 

Ar[2] – это указатель на начало третьей строки массива ar. 

  1. Как получить адрес элемента двумерного массива? 

Используйте оператор & перед именем элемента, например: &ar[i][j]. 

  1. Как получить адрес начала двумерного массива? 

Используйте имя массива без индексов, например: ar. 

  1. Матрица программируется двумерным массивом. Как получить адрес третьей строки матрицы? 

&ar[2][0]. 

  1. Можно ли просмотреть все элементы двумерного массива в одном цикле? 

Да, используя вложенные циклы: 

For (int i = 0; i < n; i++) { 

  For (int j = 0; j < m; j++) { 

    // обработка элемента a[i][j] 

  } 

 

  1. Указатель на первый элемент двумерного массива и указатель на начало двумерного массива имеют один тип? А значение? 

Они имеют один тип, но не одинаковое значение.  

• Указатель на первый элемент - &a[0][0] – указывает на первый элемент массива. 

• Указатель на начало массива – a – указывает на начало всей области памяти, занимаемой массивом. 

  1. Как обратиться к некоторому элементу двумерного массива через указатель на его первый элемент? 

Используйте арифметику указателей, например: (p + i  n + j), где n – количество столбцов в массиве. 

  1. Как обратиться к элементу двумерного массива через указатель на начало массива? 

Используйте смещение от начала массива, например: (a + i  n + j). 

  1. Как описать трехмерный массив и как с ним работать? 

Int a[2][3][4]; // Объявление трехмерного массива 

A[i][j][k] = 10; // Доступ к элементу 

Работа с трехмерным массивом аналогична работе с двумерным, но с добавлением одного уровня вложенности. 

  1. Какими способами можно запрограммировать матрицу? 

Матрицу можно запрограммировать: 

• Двумерным массивом: Это наиболее распространенный и простой способ. 

• Структурой: В структуру можно включить указатель на массив, представляющий строку матрицы. 

• Динамической памятью: Выделяйте память для матрицы с помощью функций malloc или calloc. 

  1. Когда матрица программируется двумерным массивом, чем отличается просмотр элементов матрицы по столбцам от просмотра по строкам? 

При просмотре по столбцам внешний цикл перебирает столбцы, а внутренний – строки. При просмотре по строкам – наоборот.  

  1. Какова связь между индексами строки и столбца у элементов, лежащих на главной диагонали квадратной матрицы? 

Индексы строки и столбца равны. 

  1. Какова связь между индексами строки и столбца у элементов, лежащих на побочной диагонали квадратной матрицы? 

Сумма индекса строки и индекса столбца равна количество строк – 1. 

  1. Всегда ли можно ли просмотреть все элементы матрицы в одном цикле? От чего это зависит? 

Нет, это возможно только если количество строк и столбцов известно во время компиляции.  

  1. В каких областях оперативной памяти могут располагаться данные при выполнении программы? 

Данные могут располагаться: 

• В стеке: для локальных переменных функций. 

• В куче: для динамически выделяемых переменных. 

• В сегменте данных: для глобальных переменных. 

• В сегменте кода: для машинного кода программы. 

  1. Какие переменные называют динамическими? Чем они отличаются от статических переменных? 

Динамические переменные – это переменные, которым память выделяется во время выполнения программы, а не при компиляции. Статические переменные – это переменные, которым память выделяется при компиляции.  

• Динамические переменные: 

    * Выделяются и освобождаются вручную программистом. 

    * Доступ к ним осуществляется через указатели. 

    * Могут иметь неопределенный размер. 

• Статические переменные: 

    * Размер и местоположение в памяти фиксированы. 

    * Доступ к ним осуществляется по имени. 

  1. С какой целью используют динамические переменные? 

• Выделение памяти под структуры данных неопределенного размера, например, массивы, связанные списки. 

• Создание объектов, размер которых определяется во время выполнения программы. 

• Освобождение памяти, когда данные больше не нужны. 

  1. Как обращаются к динамическим переменным? 

К динамическим переменным обращаются через указатели, которые хранят адреса выделенной памяти. 

  1. Какие бывают указатели? Как их описать? 

• Указатель на данные: int *p; 

• Указатель на указатель: int *p; 

• Указатель на функцию: int (*p)(int); 

  1. Каким образом можно выделять память для динамических переменных и освобождать её? 

• Выделение памяти: 

    * malloc(размер_в_байтах) – выделяет блок памяти нужного размера. 

    * calloc(количество_элементов, размер_одного_элемента) – выделяет память под массив. 

• Освобождение памяти: 

  • Free(указатель) – освобождает ранее выделенную область памяти. 

  1. Как определить, выделена память или нет? 

Проверьте, что значение указателя не равно NULL. 

  1. Почему нельзя забывать освобождать выделенную память? 

Забывание освобождения памяти приводит к утечке памяти. Программа будет постепенно потреблять все больше и больше памяти, что может привести к ее падению. 

  1. Чему равно значение указателя после освобождения области памяти, на которую он указывал? 

После освобождения значение указателя будет неопределенным. Не следует использовать указатель, который уже был освобожден. 

  1. Как разместить в динамической памяти массив? 

Используйте malloc() или calloc(): 

• int *a = (int *)malloc(n * sizeof(int)); 

• int *a = (int *)calloc(n, sizeof(int)); 

  1. Какими способами можно разместить в динамической памяти матрицу? 

• Выделить память для матрицы как для одномерного массива: double *a = (double * 

Память для каждой строки отдельно: 

    Double **a = (double **)malloc(n * sizeof(double *)); 

    For (int i = 0; i < n; i++) { 

      A[i] = (double *)malloc(m * sizeof(double)); 

    } 

 

Соседние файлы в папке Лаба4