Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Lab 8-11.rtf
Скачиваний:
11
Добавлен:
12.02.2016
Размер:
143.26 Кб
Скачать

Завдання

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;

Контрольні запитання.

1. Визначення змінних типу вказівник.

2. Які операції виконуються над вказівниками

3. Зв’язок вказівників і масивів.

4. Масиви динамічної пам’яті та функції її виділення і звільнення.

5. Масиви вказівників і моделювання багатовимірних масивів.

6. Зв’язок рядків і вказівників.

Лабораторна робота № 9

Тема роботи: Дослідження організації структур та об’єднань у програмах мовою С.

Мета роботи: Дослідження конструкцій та способів звертань до елементів структур та об’єднань мови програмування С.

Попередні відомості

Структура дозволяє об’єднати в одному програмному об’єкті сукупність значень, які можуть мати різні типи (на відміну від масиву). Синтаксис декларації структури:

struct [<тег>]{<список декларацій елементів>}<ім'я>[,<ім'я>...];

Тут <тег> - ім’я структурного типу (необов'язкове), <ім'я> - ідентифікатор змінної, що вказує на структуру оголошеного типу (на тег), тобто ця змінна буде мати структурний тип, тип декларованої структури, який визначає певна послідовність елементів, що притаманна саме цьому типу структури. Елементами структури вважаються змінні, декларовані в списку, що обмежується фігурними дужками. Елементами структури можуть бути змінні всіх основних типів, масиви, вказівники, об’єднання, інші структури та масиви інших структур. Декларації змінних як елементів структури не можуть містити специфікацій класів пам'яті та ініціалізаторів. Змінній типу структура виділяється пам’ять, необхідна для зберігання всіх її елементів.

Приклад:

struct biblios { int number, rik;

char *avtor, *nazva;

int storinky;

} spysok[100], mybook;

Тут оголошено масив структур типу  biblios довжиною 100 елементів та змінну mybook цього ж структурного типу. Структурний тип, іменований тегом biblios, - це сукупність змінних, що декларовані в списку: number- цілочисельний порядковий номер, rik - ціле число, що відповідає року видання книги, *avtor - вказівник на рядок із прізвищем автора, *nazva - вказівник на рядок із назвою книжки та storinky - кількість сторінок цілочисельного типу в книжці. В масиві  spysok [100] записуються відомості про 100 книжок, а в змінній mybook - про одну книжку.

struct shelf { struct biblios spysok[100];

char *data1, *data2;

float obih;} mag1,mag2;

Далі оголошено дві змінні  mag1 i mag2 структурного типу shelf, який відповідає сукупності відомостей про 100 списків структур типу biblios (змінна spysok[100] зберігає відомості про партію з 100 книжок), рядки *data1 i *data2, в яких записується дата надходження партії книжок у магазин і дата продажу партії, та змінної типу float із іменем obih у якій фіксується грошовий обіг із продажу партії. Очевидно, що змінні mag1 i  mag2  зарезервоані для зберігання комерційних відомостей для двох магазинів. З наведених прикладів слідує, що структури добре пристосовані для створення баз даних.

Елементами структури можуть бути бітові поля. Це використовується як для економії пам’яті, так і для організації зручного доступу до регістрів зовнішніх пристроїв, в яких різні біти можуть мати самостійне функціональне призначення.

Приклад:

struct { unsigned icon8;

unsigned color4;

unsigned underline1;

unsigned blink1;

} screen[25][80];

У цьому прикладі оголошено двовимірний масив із іменем screen, елементи якого мають структурний тип. Масив містить 2000 елементів. Кожен елемент - окрема структура, яка складається з чотирьох елементів: бітових полів iсon - форма символа, color - колір, underline - підкреслення, blink - блимання. Як видно, цей масив містить інформацію щодо усіх символьних позицій екрана дисплея.

Над структурами реалізований обмежений набір операцій: їх можна передавати функції в якості аргументу, повертати в якості значення функції, отримувати адресу структури. Дозволяється присвоєння однієї структури іншій, якщо вони мають однаковий тег.

Значення елементів можуть бути ініціалізовані за правилами ініціалізації об’єктів складених типів, при цьому необхідно слідкувати за правильністю розставлення фігурних дужок у списках ініціалізаторів.

Приклад:

struct

{

int n1,n2,n3;

} nlist[2][3] =

{

{ {1,2,3}, {4,5,6}, {7,8,9} }, /* рядок 1 */

{ {10,11,12}, {13,14,15}, {16,17,18} } /* рядок 2 */

};

Тут ініційований двомірний масив структур  nlist, який складається з двох рядків і трьох стовпчиків. Кожна структура містить три елементи цілочисельного типу.

Об’єднання  дозволяє зберігати в одному об’єкті значення різних типів. При оголошенні об’єднання з ним асоціюється набір типів значень, які можуть в ньому зберігатися. В кожен момент часу об’єднання може зберігати значення тільки одного типу з набору. Контроль за тим, який тип зберігається, покладається на програміста.

Синтаксис:

union [<тег>]{< список декларацій елементів>}<ім'я>[,...]

Пам’ять, що виділяється змінній типу об’єднання, визначається розміром найбільш довгого елементу. Усі елементи об’єднання розміщуються в тій самій області пам’яті з однією й тією адресою. Значення біжучого елементу губиться, коли іншому елементу об’єднання присвоюється певне значення.

Приклади:

union sign { int svar;

unsigned uvar;} number;

Це об’єднання дозволяє зберігати цілочисельне значення у знаковому та беззнаковому вигляді.

union

{ char m[2][3];

int i,j,k;

} y =

{

{'1'},

{'4', '5','6'}

};

Змінна  y  має тип об’єднання, першим елементом якого є символьний масив, який інінціалізується; в першому рядку ініціалізовано тільки один символ, решті елеметам рядка присвояться нулі ('\0'), другий рядок ініціалізований повністю. Одночасно на цей масив накладено три змінні типу int i, j, k. Звертання до змінних i, j або k проходить через ті ж самі адреси, що й звертання до елементів масиву.

Найважливішою операцією над структурою або об’єднанням є вибір елементу за допомогою якого здійснюється доступ до елементу структури або об’єднання. Операція вибору елементу записується у двох формах таким чином:

<вираз> <ідентифікатор>

або

<вираз> -> <ідентифікатор>

В першій синтаксичній формі <вираз> є змінною типу  struct або union, а ідентифікатор іменує елемент специфікованої структури або об’єднання. В другій синтаксичній формі <вираз> є вказівником на структуру або об’єднання, а ідентифікатор іменує елемент специфікованої структури.

Приклади:

struct pair { int a;

int b;

struct pair *sp;

} item, list[10];

item.sp = &item; /* приклад 1 */

(item.sp) -> a = 24; /* приклад 2 */

list[8].b = 12; /* приклад 3 */

В першому прикладі адресу структури  item присвоєно елементу sp цієї ж структури. В результаті структура  item  містить вказівник на себе. В другому прикладі використовується адресний вираз item.sp  із операцією вибору елементу -> , елементу a присвоюється значення 24. Враховуючи результат прикладу 1, приклад 2 еквівалентний запису item.a = 24. В третьому прикладі показано, яким чином в масиві структур здійснити доступ до елементу окремої структури.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]