Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабораторная работа №10.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
234.5 Кб
Скачать

Практическая часть

Пример 1. Создать одномерный динамический массив из n элементов и удалить из него те элементы, значения которых совпадут с первым элементом массива. Первый элемент массива оставить без изменения.

Программный код решения примера:

#include <stdio.h>

#include <conio.h>

#include <stdlib.h>

int main(void)

{

float *p, *p1=NULL, d;

int i, n, j, col=0;

printf("\n input n:");// запрашиваем количество элементов в массиве

scanf("%d",&n);

p=(float *)malloc(n*sizeof(float));// выделяем память по массив

//проверяем была ли выделена область памяти нужного размера

if (!p)

{

printf("Out of memory. Press any key: ");

_getch();

return 1;

}

// заполняем элементы массива

for (i=0;i<n;i++)

{printf("x[%d]=",i);

scanf("%f",p+i);

}

// выводим на экран исходный массив

for (i=0; i<n; i++)

printf("p[%d]=%6.2f ",i+1,*(p+i));

// удаляем те элементы массива, значения которых совпали с первым

for (i=n-1;i>=0;i--)

if (*p!=*(p+i)||i=0)

{

col++;

p1=(float*) realloc (p1, col * sizeof(float));

for(j=col-1;j>0;j--)

*(p1+j)=*(p1+j-1);

*p1=*(p+i);

if (i) p=(float*) realloc (p, (n-col) * sizeof(float));

else free(p);

}

// выводим на экран массив после удаления элементов

p=p1;

for (i=0; i<col; i++)

printf("p[%d]=%6.2f",i+1,*(p+i));

// освобождаем память

free(p);

getch();

return 0;

}

Пример 2. Составить программу, создающую динамическую матрицу размером n*n, заполнить матрицу случайными числами. Вычислить сумму каждой строки и поместить суммы строк в одномерный динамический массив.

#include <stdio.h>

#include <conio.h>

#include <stdlib.h>

#include <alloc.h>

int main(void)

{

int n,j,i;

float ** matr; float * mass; /*Объявляем matr - указатель на массив

указателей и mass – указатель на одномерный массив*/

clrscr();// очищаем экран

printf("Введите размер квадратной матрицы n: ");

scanf("%d",&n);

// Выделяем память под одномерный массив

mass=(float *)malloc(n*sizeof(float ));

if (mass==NULL)

{

puts("не создан динамический массив!");

return 1;

}

matr=(float **)malloc(sizeof(float *)*n); //Выделяем память под массив указателей

if (matr==NULL)

{

puts("не создан динамический массив!");

return 1;

}

randomize();

for (i=0;i<n;i++)

{

// Выделяем память под i-ю строку двумерного массива.

matr[i]=(float *)malloc(sizeof(float)*n);

if (matr[i]==NULL)

{

puts("не создан динамический массив!");

return 1;

}

for (j=0;j<n;j++) matr[i][j]=random(100);

}

for (i=0;i<n;i++)

{

mass[i]=0;

for (j=0;j<n;j++)

mass[i]+=matr[i][j];

}

for (i=0;i<n;i++)

{

for (j=0;j<n;j++)

printf("\t%6.2f",matr[i][j]);

printf("\n");

}

for (i=0;i<n;i++)

printf("\n сумма %d строки %8.2f",i,mass[i]);

for (i=0;i<n;i++)

free(matr[i]); //Освобождаем память i – й строки

free(matr); // Освобождаем память массива указателей

free(mass); // Освобождаем память массива сумм

_getch();

return 0;

}

Доступ к i-му элементу одномерного массива arr осуществляется с указанием одного индексного выражения в форме arr[i] или *(arr+i).

Для доступа к элементу двумерного массива mas, находящемся в i-ой строке и в j-м столбце, могут быть использованы следующие выражения:

  • mas[i][j]:

  • *(*(arr+i)+j)

  • (*(arr+i))[j]

Используя замечания по поводу доступа к элементам массивов, перепишем программу для примера 2, через указатели:

#include <stdio.h>

#include <conio.h>

#include <stdlib.h>

#include <alloc.h>

int main(void)

{

int n,j,i;

float ** matr; float * mass; /*Объявляем matr - указатель на массив

указателей и mass – указатель на одномерный массив*/

clrscr();// очищаем экран

printf("Введите размер квадратной матрицы n: ");

scanf("%d",&n);

// Выделяем память под одномерный массив

mass=(float *)malloc(n*sizeof(float ));

if (mass==NULL)

{

puts("не создан динамический массив!");

return 1;

}

matr=(float **)malloc(sizeof(float *)*n); //Выделяем память под массив указателей

if (matr==NULL)

{

puts("не создан динамический массив!");

return 1;

}

randomize();

for (i=0;i<n;i++)

{

// Выделяем память под i-ю строку двумерного массива.

*(matr+i)=(float *)malloc(sizeof(float)*n);

if (*(matr+i)==NULL)

{

puts("не создан динамический массив!");

return 1;

}

for (j=0;j<n;j++) *(*(matr+i)+j)=random(100);

}

for (i=0;i<n;i++)

{

*(mass+i)=0;

for (j=0;j<n;j++)

*(mass+i)+=*(*(matr+i)+j);

}

for (i=0;i<n;i++)

{

for (j=0;j<n;j++)

printf("\t%6.2f",*(*(matr+i)+j));

printf("\n");

}

for (i=0;i<n;i++)

printf("\n сумма %d строки %8.2f",i,*(mass+i));

for (i=0;i<n;i++)

free(*(matr+i)); //Освобождаем память i – й строки

free(matr); // Освобождаем память массива указателей

free(mass); // Освобождаем память массива сумм

_getch();

return 0;

}

Пример 3. Вводится последовательность целых чисел заканчивающаяся 0. Вывести ее на экран.

#include <stdio.h>

#include <stdlib>

int main(void)

{

int input;

int counter = 0; // счетчик введенных чисел

int * values = NULL; // переменная для создания динамического массива

int * many_numbers;

do {

printf("Введите целое значение (0 - выход): ");

scanf("%d",&input);

counter++;

// при добавлении нового числа, увеличиваем массив на 1

many_numbers = (int*) realloc (values, counter * sizeof(int));

if (many_numbers != NULL)

{

values = many_numbers;

// добавить к массиву только что введённое число

values[counter - 1] = input;

}

else

{

free (values); // удалить массив

printf("Ошибка перевыделения памяти!";)

return 1; // завершить работу программы

}

} while (input != 0); // пока не введён 0

printf("Введенные числа: ");

for (int ix = 0; ix < counter; ix++) std::cout << values[ix] << " ";

free (values); // удалить массив

return 0;

}

Пример 4. Написать фрагмент программы, удаляющий в матрице, рассмотренной в примере 2 третью строку (считаем, что n>2), выводит новую матрицу на экран, а затем освобождает память от данных .

// удаляем третью строку

for (i=2;i<n-1;i++)

matr[i]=matr[i+1];

free(matr[n-1]);

matr=(float**) realloc(matr, sizeof(float *)*(n-1));

// выводим матрицу на экран

for (i=0;i<n-1;i++)

{

for (j=0;j<n;j++)

printf("\t%6.2f",matr[i][j]);

printf("\n");

}

for (i=0;i<n-1;i++)

free(matr[i]); //Освобождаем память i – й строки

free(matr); // Освобождаем память массива указателей

Контрольные вопросы

  1. Что такое динамическая память?

  2. Какие средства языка С используются для хранения данных с динамическим выделением памяти компьютера?

  3. Какие основные библиотечные функции языка С используются для динамического распределения памяти?

  4. Какое различие в действии функций malloc() и calloc()?

  5. Как осуществляется перераспределение динамической памяти?

  6. Для каких типов данных возможно динамическое распределение памяти?

Задание.

Определите и инициализируйте переменную X типа double. Определите указатели char *, int *, double *, void *, инициализируйте их адресом переменной X. Напечатайте значения указателей, их размеры и длины участков памяти, которые связаны с выражениями, разыменовывающими указатели.

Заменить все положительные элементы целочисленного массива, состоящего из n элементов, на значение минимального.

Дана матрица размера n×n. После каждой строки, в которой первый или последний элементы имеют заданное значение k, вставить новую строку и заполнить ее нулевыми элементами.

В программе определите и инициализируйте переменную X типа double, указатель double * и указатель типа void *. Присвойте указателям адрес переменной X. Напечатайте адрес переменной, значения указателей и значения, получаемые при разыменовании указателей. Чтобы продемонстрировать роли и последовательность выполнения унарных операций получения адреса & и разыменования *, выведите на печать значение выражения *&имя_переменной.

Формируется массив, элементами которого является числовая последовательность, заканчивающаяся 0. Переставить в обратном порядке элементы массива, расположенные между его минимальным и максимальным элементами.

Дана матрица размера n×n. Удалить из него строки, в которых первый или последний элементы имеют заданное значение k.

Определите и инициализируйте переменную X типа int. Определите указатели char *, int *, double *, void *, инициализируйте их адресом переменной X. Напечатайте значения указателей, их размеры и длины участков памяти, которые связаны с выражениями, разыменовывающими указатели.

Формируется массив, элементами которого является числовая последовательность, заканчивающаяся 0. Назовем серией группу подряд идущих одинаковых элементов, а длиной серии – количество этих элементов (длина серии может быть равна 1). Преобразовать массив, увеличив первую серию наибольшей длины на один элемент.

Дана квадратная матрица порядка 2n+1. Зеркально отразить ее элементы относительно вертикальной оси симметрии матрицы.

В программе определите и инициализируйте переменную X типа int, указатель int * и указатель типа void *. Присвойте указателям адрес переменной X. Напечатайте адрес переменной, значения указателей и значения, получаемые при разыменовании указа-телей. Чтобы продемонстрировать роли и последовательность выполнения унарных операций получения адреса & и разыменования *, выведите на печать значение выра-жения *&имя_переменной.

Дан массив, состоящий из n элементов. Назовем серией группу подряд идущих одинаковых элементов, а длиной серии – количество этих элементов (длина серии может быть равна 1). Преобразовать массив, увеличив первую серию наибольшей длины на один элемент.

Дана матрица размера n×n. Все строки циклически сдвинуть на k позиций вниз.

Определите и инициализируйте переменную X типа char. Определите указатели char *, int *, double *, void *, инициализируйте их адресом переменной X. Напечатайте значения указателей, их размеры и длины участков памяти, которые связаны с выражениями, разыменовывающими указатели.

Формируется массив, элементами которого является числовая последовательность, заканчивающаяся 0. Назовем серией группу подряд идущих одинаковых элементов, а длиной серии – количество этих элементов (длина серии может быть равна 1). Вставить перед каждой серией минимальный элемент массива.

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

В программе определите и инициализируйте переменную X типа char, указатель char * и указатель типа void *. Присвойте указателям адрес переменной X. Напечатайте адрес переменной, значения указателей и значения, получаемые при разыменовании указа-телей. Чтобы продемонстрировать роли и последовательность выполнения унарных операций получения адреса & и разыменования *, выведите на печать значение выра-жения *&имя_переменной.

Дан массив, состоящий из n элементов. Преобразовать его, вставив перед каждым положительным элементом минимальный элемент.

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

Определите и инициализируйте переменную X типа double. Определите указатели char *, int *, double *, void *, инициализируйте их адресом переменной X. Напечатайте значения указателей, их размеры и длины участков памяти, которые связаны с выражениями, разыменовывающими указатели.

Дан целочисленный массив, состоящий из n элементов. Удалить из массива все элементы, встречающиеся менее двух раз.

Дана матрица размера n×n. Удалить из него строки, в которых первый и последний элементы одинаковые.

В программе определите и инициализируйте переменную X типа double, указатель double * и указатель типа void *. Присвойте указателям адрес переменной X. Напечатайте адрес переменной, значения указателей и значения, получаемые при разыменовании указа-телей. Чтобы продемонстрировать роли и последовательность выполнения унарных операций получения адреса & и разыменования *, выведите на печать значение выра-жения *&имя_переменной.

Дан массив, состоящий из n элементов. Назовем серией группу подряд идущих одинаковых элементов, а длиной серии – количество этих элементов (длина серии может быть равна 1). Преобразовать массив, увеличив каждую его серию на один элемент.

Дана матрица размера n×n. Удалить из него строки, в которых первый элемент положительный.

Определите и инициализируйте переменную X типа int. Определите указатели char *, int *, double *, void *, инициализируйте их адресом переменной X. Напечатайте значения указателей, их размеры и длины участков памяти, которые связаны с выражениями, разыменовывающими указатели.

Формируется массив, элементами которого является числовая последовательность, заканчивающаяся 0. Заменить все отрицательные элементы этого массива, на значение максимального.

Дана матрица размера n×n. Удалить из него строки, имеющие отрицательные элементы.

В программе определите и инициализируйте переменную X типа int, указатель int * и указатель типа void *. Присвойте указателям адрес переменной X. Напечатайте адрес переменной, значения указателей и значения, получаемые при разыменовании указа-телей. Чтобы продемонстрировать роли и последовательность выполнения унарных операций получения адреса & и разыменования *, выведите на печать значение выра-жения *&имя_переменной.

Формируется массив, элементами которого является числовая последовательность, заканчивающаяся 0. Назовем серией группу подряд идущих одинаковых элементов, а длиной серии – количество этих элементов (длина серии может быть равна 1). Удалить из массива все серии, длина которых меньше k.

Дана матрица размера n×n. Удалить из него строки, имеющие наименьшую сумму элементов.

Определите и инициализируйте переменную X типа char. Определите указатели char *, int *, double *, void *, инициализируйте их адресом переменной X. Напечатайте значения указателей, их размеры и длины участков памяти, которые связаны с выражениями, разыменовывающими указатели.

Формируется массив, элементами которого является числовая последовательность, заканчивающаяся 0. Удалить из массива все элементы, встречающиеся более двух раз.

Дана матрица размера n×n. Удалить из него все столбцы, в которых встречается заданное число.

В программе определите и инициализируйте переменную X типа char, указатель char * и указатель типа void *. Присвойте указателям адрес переменной X. Напечатайте адрес переменной, значения указателей и значения, получаемые при разыменовании указа-телей. Чтобы продемонстрировать роли и последовательность выполнения унарных операций получения адреса & и разыменования *, выведите на печать значение выра-жения *&имя_переменной.

Дан массив, состоящий из n элементов. Преобразовать его, вставив после каждого отрицательного элемента минимальный элемент.

Дана матрица размера n×m. Поменять местами ее первый и последний столбцы, содержащие только положительные элементы.

Определите и инициализируйте переменную X типа double. Определите указатели char *, int *, double *, void *, инициализируйте их адресом переменной X. Напечатайте значения указателей, их размеры и длины участков памяти, которые связаны с выражениями, разыменовывающими указатели.

Дан массив, состоящий из n элементов. Назовем серией группу подряд идущих одинаковых элементов, а длиной серии – количество этих элементов (длина серии может быть равна 1). Преобразовать массив, увеличив все серии наибольшей длины на один элемент.

Дана квадратная матрица порядка 2n+1. Зеркально отразить ее элементы относительно главной диагонали матрицы.

В программе определите и инициализируйте переменную X типа double, указатель double * и указатель типа void *. Присвойте указателям адрес переменной X. Напечатайте адрес переменной, значения указателей и значения, получаемые при разыменовании указа-телей. Чтобы продемонстрировать роли и последовательность выполнения унарных операций получения адреса & и разыменования *, выведите на печать значение выра-жения *&имя_переменной.

Формируется массив, элементами которого является числовая последовательность, заканчивающаяся 0. Назовем серией группу подряд идущих одинаковых элементов, а длиной серии – количество этих элементов (длина серии может быть равна 1). Поменять местами наименьшую последнюю и k -ю серии массива. Если таких серий в массиве меньше k, то вывести массив без изменений.

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

Определите и инициализируйте переменную X типа int. Определите указатели char *, int *, double *, void *, инициализируйте их адресом переменной X. Напечатайте значения указателей, их размеры и длины участков памяти, которые связаны с выражениями, разыменовывающими указатели.

Заменить все положительные элементы целочисленного массива, состоящего из n элементов, на значение максимального.

Дана матрица размера n×m. Поменять местами строки, содержащие минимальный и максимальный элементы матрицы.

В программе определите и инициализируйте переменную X типа int, указатель int * и указатель типа void *. Присвойте указателям адрес переменной X. Напечатайте адрес переменной, значения указателей и значения, получаемые при разыменовании указа-телей. Чтобы продемонстрировать роли и последовательность выполнения унарных операций получения адреса & и разыменования *, выведите на печать значение выра-жения *&имя_переменной.

Формируется массив, элементами которого является числовая последовательность, заканчивающаяся 0. Назовем серией группу подряд идущих одинаковых элементов, а длиной серии – количество этих элементов (длина серии может быть равна 1). Удалить из массива все серии, длина которых больше k. Если таких серий нет, то массив оставить без изменений.

Дана квадратная матрица порядка 2n+1. Зеркально отразить ее элементы относительно вертикальной оси симметрии матрицы.

Определите и инициализируйте переменную X типа char. Определите указатели char *, int *, double *, void *, инициализируйте их адресом переменной X. Напечатайте значения указателей, их размеры и длины участков памяти, которые связаны с выражениями, разыменовывающими указатели.

Дан целочисленный массив, состоящий из n элементов. Удалить из массива все элементы, встречающиеся ровно два раза.

Дана матрица размера n×m. Поменять местами ее столбцы так, чтобы их минимальные элементы образовывали возрастающую последовательность.

В программе определите и инициализируйте переменную X типа char, указатель char * и указатель типа void *. Присвойте указателям адрес переменной X. Напечатайте адрес переменной, значения указателей и значения, получаемые при разыменовании указа-телей. Чтобы продемонстрировать роли и последовательность выполнения унарных операций получения адреса & и разыменования *, выведите на печать значение выра-жения *&имя_переменной.

Дан массив, состоящий из n элементов. Назовем серией группу подряд идущих одинаковых элементов, а длиной серии – количество этих элементов (длина серии может быть равна 1). Заменить каждую серию, длина которой равна k, на один элемент, равный сумме наибольшего и наименьшего элементов массива.

Дана целочисленная матрица размера n×m. Найти элемент, являющийся максимальным в своей строке и минимальным в своем столбце. Если такой элемент отсутствует, то вывести 0.

Определите и инициализируйте переменную X типа double. Определите указатели char *, int *, double *, void *, инициализируйте их адресом переменной X. Напечатайте значения указателей, их размеры и длины участков памяти, которые связаны с выражениями, разыменовывающими указатели.

Формируется массив, элементами которого является числовая последовательность, заканчивающаяся 0. Преобразовать его, вставив перед каждым отрицательным элементом максимальный элемент.

Дана матрица размера n×m. Поменять местами ее первый и последний строки, содержащие только отрицательные элементы.

В программе определите и инициализируйте переменную X типа double, указатель double * и указатель типа void *. Присвойте указателям адрес переменной X. Напечатайте адрес переменной, значения указателей и значения, получаемые при разыменовании указа-телей. Чтобы продемонстрировать роли и последовательность выполнения унарных операций получения адреса & и разыменования *, выведите на печать значение выра-жения *&имя_переменной.

Формируется массив, элементами которого является числовая последовательность, заканчивающаяся 0. Назовем серией группу подряд идущих одинаковых элементов, а длиной серии – количество этих элементов (длина серии может быть равна 1). Преобразовать массив, уменьшив каждую его серию на один элемент.

Дана квадратная матрица порядка 2n+1. Зеркально отразить ее элементы относительно побочной диагонали матрицы.

Определите и инициализируйте переменную X типа int. Определите указатели char *, int *, double *, void *, инициализируйте их адресом переменной X. Напечатайте значения указателей, их размеры и длины участков памяти, которые связаны с выражениями, разыменовывающими указатели.

Дан массив, состоящий из n элементов. Назовем серией группу подряд идущих одинаковых элементов, а длиной серии – количество этих элементов (длина серии может быть равна 1). Вставить после каждой серии максимальный элемент массива.

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

В программе определите и инициализируйте переменную X типа int, указатель int * и указатель типа void *. Присвойте указателям адрес переменной X. Напечатайте адрес переменной, значения указателей и значения, получаемые при разыменовании указа-телей. Чтобы продемонстрировать роли и последовательность выполнения унарных операций получения адреса & и разыменования *, выведите на печать значение выра-жения *&имя_переменной.

Формируется массив, элементами которого является числовая последовательность, заканчивающаяся 0. Преобразовать его, вставив после каждого положительного элемента максимальный элемент.

Дана матрица размера n×m. Поменять местами ее строки так, чтобы их максимальные элементы образовывали возрастающую последовательность.

Определите и инициализируйте переменную X типа char. Определите указатели char *, int *, double *, void *, инициализируйте их адресом переменной X. Напечатайте значения указателей, их размеры и длины участков памяти, которые связаны с выражениями, разыменовывающими указатели.

Дан массив, состоящий из n элементов. Назовем серией группу подряд идущих одинаковых элементов, а длиной серии – количество этих элементов (длина серии может быть равна 1). Заменить каждую серию, длина которой меньше k, на один наибольший элемент массива.

Дана матрица размера n×m. Поменять местами столбцы, содержащие минимальный и максимальный элементы матрицы.

В программе определите и инициализируйте переменную X типа char, указатель char * и указатель типа void *. Присвойте указателям адрес переменной X. Напечатайте адрес переменной, значения указателей и значения, получаемые при разыменовании указа-телей. Чтобы продемонстрировать роли и последовательность выполнения унарных операций получения адреса & и разыменования *, выведите на печать значение выра-жения *&имя_переменной.

Формируется массив, элементами которого является числовая последовательность, заканчивающаяся 0. Назовем серией группу подряд идущих одинаковых элементов, а длиной серии – количество этих элементов (длина серии может быть равна 1). Поменять местами первую и последнюю серии наибольшей длины. Если серия с максимальной длиной единственная, то массив не изменять.

Дана матрица размера n×m. Поменять местами ее столбцы так, чтобы их максимальные элементы образовывали убывающую последовательность.

Определите и инициализируйте переменную X типа double. Определите указатели char *, int *, double *, void *, инициализируйте их адресом переменной X. Напечатайте значения указателей, их размеры и длины участков памяти, которые связаны с выражениями, разыменовывающими указатели.

Формируется массив, элементами которого является числовая последовательность, заканчивающаяся 0. Назовем серией группу подряд идущих одинаковых элементов, а длиной серии – количество этих элементов (длина серии может быть равна 1). Переставить первую серию минимальной длины с последней серией максимальной длины. Если максимальная длина равна минимальной, то меняются первые и последние серии.

Дана квадратная матрица порядка 2n+1. Зеркально отразить ее элементы относительно горизонтальной оси симметрии матрицы.