Міністерство освіти та науки України
Національний університет «Львівська політехніка»
Інститут телекомунікацій, радіоелектроніки та електронної техніки
Кафедра теоретичної радіотехніки та радіовимірювань
Звіт з лабораторної роботи №9
Тема «Використання вказівників для роботи з масивами даних»
з дисципліни «Інформатика та обчислювальна техніка»
Мета роботи: Освоїти способи звертання до елементів масивів за допомогою вказівників. Навчитись виділяти та використовувати динамічну пам’ять для розміщення масивів даних.
Варіант 5
Постановка задачі. Написати програму, яка здійснює обробку масиву згідно заданого варіанту. В програмі використати динамічне виділення пам’яті для масиву. Всі операції з елементами масиву здійснювати тільки за допомогою вказівників. Масив ввести з клавіатури. Програма повинна видавати підказку користувачу про те який елемент вводити.
Завдання
Написати програму, яка знаходить мінімальний та максимальний елементи
двовимірного масиву.
Короткі теоретичні відомості
Вказівник – це змінна, яка містить адресу деякого об’єкту. Перед використанням вказівник потрібно оголосити.
Формат оголошення вказівника: тип_змінної *ім’я_вказівника
де тип_змінної – визначає тип тієї змінної на яку вказує вказівник
Наприклад, char *p_rt, int *len, float *prt. Щоб використати вказівник його необхідно ініціалізувати – присвоїти йому значення адреси змінної на яку він вказує. Використовувати неініціалізовані вказівники не можна, бо це призводить до помилок в програмі, які важко виявити.
Формат ініціалізації вказівника: ім’я_вказівника=&ім’я_змінної
Наприклад, p_rt=&name, len=&count, prt=&f1. Операція взяття адреси - & вказує на те, що вказівнику присвоюється не значення змінної, а її адреса. Інкрементація чи декрементація вказівника приводить до переходу до наступного чи попереднього елементу масиву. В мові С існує однозначний зв’язок між вказівниками та масивами: ім’я масиву без квадратних дужок є вказівником на перший елемент масиву. Наприклад, якщо оголошено
масив data[25], то data – це адреса першого елемента масиву. Таким чином щоб отримати адресу першого елементу масиву можна записати data або &data[0], щоб отримати адресу другого елементу - (data+1) або &data[1], третього - (data+2) або &data[2]. Щоб присвоїти значення першому елементу масиву можна записати *(data)=4 або data[0]=4, другому елементу - *(data+1)=8 або data[1]=8, третьому - *(data+2)=45 або data[2]=45. У випадку
двовимірного масиву присвоєння значення елементу, який знаходиться на перетині k-го рядка та n-го стовпця здійснюється наступним чином: *(*(matr+k)+n)=91 або matr[k][n]=91. Бібліотека С містить функції для розподілу пам’яті безпосередньо в ході виконання програми. Такий розподіл називається динамічним розподілом пам’яті. Для використання функцій динамічного керування пам’яттю до програми необхідно підключити файли-
заголовки stdlib.h або alloc.h. Найчастіше використовуються наступні функції malloc(),
calloc(), free().
Функція malloc() виділяє в пам’яті блок з n байт і повертає вказівник на перший байт цього блоку. Наприклад, pd=malloc(sizeof(int)) – повертає вказівнику рd адресу блоку пам’яті для одного цілого числа, rt1=malloc(40*sizeof(float)) - повертає вказівнику rt1 адресу першого
байту блоку пам’яті для сорока дійсних чисел. Функція calloc() виділяє пам’ять для групи об’єктів і повертає вказівник з адресою на перший байт виділеного блоку. Наприклад, name=calloc(120, sizeof(char)) повертає вказівнику name адресу першого байту блоку пам’яті для 120 об’єктів символьного типу. Функція free() призначена для звільнення динамічно розподіленої пам’яті. Звільнена пам’ять може знову використовуватись . Наприклад, free(rt1) звільняє блок пам’яті, який було виділено для 40 цілийх чисел. Щоб застосувати динамічний розподіл пам’яті для роботи з масивом потрібно оголосити вказівник, який буде іменем масиву. Потім у програмі потрібно за допомогою функцій розподілу пам’яті виділити необхідний блок пам’яті для масиву і присвоїти адресу першого байту вказівнику. Після роботи з масивом виділену пам’ять треба звільнити. Функції для роботи з динамічною пам’яттю представлено в додатку (табл.4).
РОЗРОБКА АЛГОРИТМУ
Ні
Так
Ні
Так
Ні
Так
Ні
Так
Ні
Так
Ні
Так
Так Ні
Так
Код програми мовою С
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[]){
int r,s,k,i,t;
float si[100][100],c,min,max;
printf("Lab rob7\n Medveduk Andriy\n RT-11\n");
printf("kilkist radkiv masuvy:");
scanf("%d",&r);
printf("kilkist stovpciv masuvy:");
scanf("%d",&s);
printf("vvedit elementu masuvy:\n");
for(k=0;k<r;k++)
for(i=0;i<s;i++){
printf("element(%d,%d):",k+1,i+1);
scanf("%f",&si[k][i]);
}
printf("dvovumirnuj masuv:\n");
for(k=0;k<r;k++){
for(i=0;i<s;i++)
printf("%.0f ",si[k][i]);
puts("");
}
min=max=si[0][0];
for(k=0;k<r;k++)
for(i=0;i<s;i++)
if(si[k][i]<min) min=si[k][i];
else if(si[k][i]>max) max=si[k][i];
printf("najbilchuj element:%.2f\n",max);
printf("najmenchuj element:%.2f\n",min);
system("PAUSE");
return 0;
}
НАЛАГОДЖЕННЯ ТА РЕЗУЛЬТАТИ ТЕСТУВАННЯ.
Висновок: на лабораторній роботі я освоїв способи звертання до елементів масивів за допомогою вказівників. Навчився виділяти та використовувати динамічну пам’ять для розміщення масивів даних.