Інформація про навчальний заклад

ВУЗ:
Національний університет Львівська політехніка
Інститут:
Не вказано
Факультет:
Телекомунікації
Кафедра:
Кафедра Телекомунікації

Інформація про роботу

Рік:
2009
Тип роботи:
Методичні вказівки до лабораторної роботи
Предмет:
Інформатика

Частина тексту файла (без зображень, графіків і формул):

МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ Національний університет «Львівська політехніка» Кафедра «Телекомунікації»  МАСИВИ ТА ВКАЗІВНИКИ Методичні вказівки до лабораторної роботи з дисципліни «Інформатика телекомунікаційних систем та мереж, ч.IІ» для студентів базового напряму 6.0924 «Телекомунікації» Затверджено на засіданні кафедри «Телекомунікації» Національного університету «Львівська політехніка», протокол №___ від______2006р. Львів 2009 «Масиви та вказівники». Методичні вказівки до лабораторної роботи з дисципліни «Інформатика телекомунікаційних систем та мереж, ч.IІ» для студентів базового напряму 6.0924 «Телекомунікації». Львів 2006. 12 с. МЕТА РОБОТИ: дослідити та навчитися програмувати на мові C з використанням масивів та змінних типу вказівник. Зрозуміти взаємозв’язок між масивами та вказівниками. Попередні відомості Масив дозволяє зберігати як єдине ціле послідовність змінних однакового типу. Оголошенння масиву визначає тип елементів масиву та його ім’я. Вона може визначати також кількість елементів в масиві. Змінна типу масив бере участь у виразах як константа-вказівник на значення заданого специфікацією типу. Якщо специфікацію типу опущено, вважається тип int. Декларац·я масиву може мати одну з таких форм: [<тип>] <ім’я> [<константний вираз>]; [<тип>] <ім’я> []; [<тип>] <ім’я> [<конст.вираз1>][<конст.вираз2>]...; - для багатомірних масивів. Квадратні дужки після імені обов’язково· є ознакою типу масив. Тип може бути будь-яким, крім функції void. Таким чином, елементи масиву можуть мати базовий, перечислюваний, структурний тип, бути об’єднанням, вказівником, або, в свою чергу, масивом. Константний вираз у кадратних дужках визначає кількість елементів у масиві. Індексація елементів масиву починається з нуля. Тобто індекс останнього елементу масиву на одиницю менший, ніж кількість елементів у масиві. У другій синтаксичній формі кількість елементів масиву не вказана, це використовується, коли ця декларація посилається на іншу в другому місці програми. Однак, для багатовимірного масиву може бути опущена тільки перша розмірність. Масиву виділяється пам’ять, яка необхідна для розміщення всіх його елементів. Елементи масиву з першого до останнього розміщені послідовно в комірках пам’яті за зростанням адрес. Між елементами масиву в пам’яті розриви відсутні. Елементи багатомірного масиву заповнюються рядками, і при такому способі зберігання останній індекс масиву змінюється найшвидше. Для доступу до окремого елементу масиву використовується індексний вираз, який обчислюється шляхом додавання до адреси масиву цілого числа і отримання значення за новою адресою. Наприклад, індексний вираз line[0] є значенням першого елементу масиву, а line[5] отримує шостий елемент масиву. Для багатовимірних масивів індексний вираз обчислюється зліва направо. Багатовимірний масив інтерпретується мовою С як масив, елементами якого є масиви. Наприклад, елементами трьохмірного масиву є двомірні масиви, і декларація: int prop[3][4][6]; означає, що масив з іменем prop містить 3 елементи, кожен з яких є двомірним масивом. Ініціалізація дозволяється тільки для масивів, декларованих зовнішніми або статичними. Приклади: 1) static int masiv1 [] = 0,1,2,3,4,5 ; тут розм·р масиву не вказаний, але комп·лятор сам визначить його за кількістю· ініційованих елементів; 2) static float mas11 [6] = 1.,1.,1.,2.,2.,2. ; тут вказаний розмір масиву 6 і компілятор при ініціалізації перевірить, чи кількість ініційованих елементів не перевищує вказану розмірність, а якщо перевищує, видасть повідомлення про помилку; 3) int mas12 [7] = 7,6,5 ; /* на глобальному рівні */ тут розмір масиву 7 і компілятор здійснить ініціалізацію перших трьох елементів відповідними величинами, а решта чотири автоматично ініціює нулями; 4) int mas25 [2][5] = /* на глобальному рівні */ 0,1,2,3,4 , 5,6,7,8,9 ; тут задаються два рядки по п’ять цілих чисел. Дуже важливим прикладом масиву в мові С є рядок string, який представляється одновимірним масивом типу char, тобто послідовністю символів, наприклад: static char mlit[] = "Добрий день!"; тут компілятор визначає кількість потрібних комірок пам’яті автоматично і виділяє 13 байтів - 12 під видимі символи і тринадцятий під невидимий символ кінця рядка ('\0'). Під символьний масив завжди слід виділяти на одну комірку пам’яті більше, ніж довжина рядка. Вказівник - це змінна, призначена для зберігання адреси об’єкту будь-якого типу. Вказівник на функцію містить адресу точки входу в функцію. Синтаксис: [< тип >] * <ім’я> Специфікація типу може задавати базовий тип, перечислюваний, порожний, структурний або тип об’єднання, масив, функцію, вказівник. Якщо специфікацію типу опущено, вважається тип int. Вказ·вники типу void можуть вказувати на значення будь-якого типу, однак для виконання операцій над вказівником типу void, необхідно явно привести тип вказівника до типу, що відрізняється від типу void. Змінна, оголошена як вказівник, зберігає адресу пам’яті. Розмір пам’яті, що необхідний для зберігання адреси, та формат цієї адреси залежить від типу комп’ютера і від реалізації компілятора, а також від обраної моделі пам’яті. Модифікатори near, far, huge також специфікують формат вказівника. Приклад: int *ptr; змінна ptr декларована як вказ·вник на величину типу int, тобто в комірці пам’яті з іменем ptr зберігатиметься адреса цілого числа типу int. Вказівник на структуру, об’єднання або перечислюваний тип використовує тег (вид) структури, об’єднання або перечислюваного типу. Константа NULL, визначена в стандартному файлі <stdio.h>, призначена для ініціалізації вказівників, при цьому гарантується, що жоден програмний продукт не буде мати адресу NULL. За виглядом оголошення вказівника символом * перед іменем змінної подібна на оператор визначення величини *, яка зберігається в комірці, на адресу якої вказує вказівник. Існує також оператор &, який повертає адресу операнда. Приклад: int *ptr; /* змінна ptr - вказівник на int */ int it = 33; ptr = &it; /* змінн·й ptr присвоюється адреса it */ *ptr = *ptr + 1; /* змінній it присвоюється 34 */ Ім’я масиву є вказівником на перший елемент масиву, тобто містить його адресу. Це ім’я є константою і над ним не дозволяються арифметичні операції (щоб не можна було змінювати в пам’яті позицію розміщення початку масиву). Наприклад, якщо оголошено масив m3[], то вираз ++m3 , буде некоректним через спробу змінити значення m3. Для доступу до решти елементів масиву використовуються індексні вирази, (наприклад, m3+1), в яких застосовується адресна арифметика. Номер елементу масиву, до якого необхідно отримати доступ, є цілим числом. До значення вказівника, який є іменем масиву та містить адресу розміщення його першого елементу, додається ціле число, яке є добутком номера елемента масиву на розмір (у байтах) типу елементів, і таким чином обчислюється адреса в пам’яті шуканого елементу. Адресна арифметика застосовується в усіх арифметичних виразах щодо вказівників. Так, збільшення вказівника на одиницю означає зсув в пам’яті на кількість байтів, відповідного типу, на який він вказує. Операції над змінними типу вказівник. 1. Присвоєння. Вказівнику присвоюється адреса (це може бути, наприклад, ім’я масиву, або результат операції отримання адреси змінної &: &a). Якщо a[], то a = = &a[0], a (або &a) є константою і її значення не може змінюватися. 2. Розкриття вказівника (посилання на вказівник). Операція *p дає величину, яка зберігається за адресою, на яку вказує p (див. приклад вище). Якщо ptr = &a, то val = *ptr те саме, що val = a. 3. Отримання адреси вказівника. Змінна типу вказівник, як і всі решта, має адресу і значення. Операція & показує адресу, за якою знаходиться сам вказівник. 4. Операції збільшення і зменшення. Ці операції здійснюються згідно правил адресної арифметики, описаних вище. 5. Різниця вказівників на елементи масиву показує, на якій відстані в масиві вони знаходяться. Якщо оголошено масив a[], то зміст наступних виразів такий: ptr=a; *ptr - значення a[0] *(ptr+i) - значення a[i] ptr+I - адреса a[i] ( &a[i] ) Вказівники, як звичайні змінні, можуть бути зібрані в масивах за правилами утворення масивів. Для символьних масивів існує декілька особливостей. Символьний масив (рядок) може бути оголошений за допомогою вказівника таким чином: char *mlit = “Функція sin”; У статичній пам’яті виділяється 12 байтів для рядка. Крім цього, виділяється ще кілька (2 або 4) байтів пам’яті для змінној mlit, яка є вказівником. Спочатку ця змінна вказує на початок рядка, але її значення може змінюватися за правилами адресної арифметики (наприклад, можна писати ++mlit). *mlit не треба оголошувати статичною змінною, оскільки ініціалізувався не масив, а змінна типу вказівник. Двомірний символьний масив є послідовністю рядків, можливо різної довжини, що залежить від способу оголошення цього масиву (через ідентифікатор масиву або через вказівник). Наприклад, якщо оголосити двомірний символьний масив через ідентифікатор з вказанням розмірностей: static char symb [3][5] = “abcd”, “efgh”, “i”; то неповний третій рядок буде доповнений нулями і масив займе 15 байтів. Це незручно, оскільки неефективно використовується пам'ять, а також програміст повинен правильно вказати довжину рядків. Якщо ж застосувати масив вказівників на char: char *menu [6] = “Sinus”, “Cosinus”, “Logarithm”, “Exponenta”, “Parabola 2”, “Parabola 3” ; то компілятор сам підрахує необхідну кількість комірок пам’яті і розмістить усі рядки послідовно без зайвих пропусків. Тут оголошено масив із шести вказівників на char. Кожен елемент цього масиву вказує на початок відповідного рядка. За допомогою індексних виразів можна здійснювати доступ як до кожного рядка, так і до кожној літери. Так, операція menu[1] вкаже на початок другого рядка, а операція *(menu[1]+3) дасть значення четвертого елемента другого рядка, тобто літеру 's'. ЗАВДАННЯ 1. Створити массив із N елементів кожен з яких є цілочисельного типу і задається довільною залежністю, використовуючи для його заповнення один із відомих вам циклів. Роздрукувати значення елементів масиву в головній функції. Передати масив у створену функцію користувача, в якій кожен елемент поділити навпіл, та роздрукувати з точністю 4 знаки. Повернути модифікований масив у викликаючу функцію, роздрукувати, порівняти значення, зробити висновки. 2. Змодифікувати програму обчислення суми арифметичној прогресії, створеної у попередній роботі таким чином, щоб масив був оголошений не локально, а передавався за допомогою формальних параметрів у обидві функції. 2. Дослідити на прикладах особливості вказівників. #include <stdio.h> #define PR(x) printf("x=%d,*x=%d,&x=%d\n",x,*x,&x) main() static int arr[] = 100,200,300; int *ptr1, *ptr2; ptr1 = arr; ptr2 = &arr[2]; PR(ptr1); ptr1++; PR(ptr1); PR(ptr2); ++ptr2; PR(ptr2); printf("ptr2-ptr1 = %d\n",ptr2-ptr1); #include <stdio.h> #define PR(value) printf("value=%d\t",(value)) #define NL putchar('\n') int a[] = 0,1,2,3,4; main() int i,*p; /*1*/ for(i=0;i<=4;i++) PR(a[i]); NL; /*2*/ for(p=&a[0];p<=&a[4];p++) PR(*p); NL; /*3*/ for(p=&a[0],i=1;i<=5;i++) PR(p[i]); NL; /*4*/ for(p=a,i=0;p+i<=a+4;p++,i++) PR(*(p+i)); NL; /*5*/ for(p=a+4;p>=a;p--) PR(*p); NL; /*6*/ for(p=a+4,i=0;i<=4;i++) PR(p[-i]); NL; /*7*/ for(p=a+4; p>=a;p--) PR(a[p-a]); NL; Контрольні запитання. Визначення змінних типу вказівник. Які операції виконуються над вказівниками Зв’язок вказівників і масивів. Масиви динамічної пам’яті та функції її виділення і звільнення. Масиви вказівників і моделювання багатовимірних масивів. Зв’язок рядків і вказівників. Список рекомендованої літератури. Керниган, Ритчи. Программирование на С. М. – 1984, 1990. Березин А.К., Березина В.И. Программирование на С и С++. М. – 1996. Бочков С.О. Субботин Д.М. Язык программирования Си для персонального комп’ютера. М.- Диалог-1990. Подбельский В.В. Фомин С.С. Прграммирование на языке Си. М.-Финансы и статистика. – 2002.
Антиботан аватар за замовчуванням

01.01.1970 03:01-

Коментарі

Ви не можете залишити коментар. Для цього, будь ласка, увійдіть або зареєструйтесь.

Ділись своїми роботами та отримуй миттєві бонуси!

Маєш корисні навчальні матеріали, які припадають пилом на твоєму комп'ютері? Розрахункові, лабораторні, практичні чи контрольні роботи — завантажуй їх прямо зараз і одразу отримуй бали на свій рахунок! Заархівуй всі файли в один .zip (до 100 МБ) або завантажуй кожен файл окремо. Внесок у спільноту – це легкий спосіб допомогти іншим та отримати додаткові можливості на сайті. Твої старі роботи можуть приносити тобі нові нагороди!
Нічого не вибрано
0%

Оголошення від адміністратора

Антиботан аватар за замовчуванням

Подякувати Студентському архіву довільною сумою

Admin

26.02.2023 12:38

Дякуємо, що користуєтесь нашим архівом!