На головну

Структури і об'єднання

  1.  III. Зміна обсягу і структури продукції
  2.  III. Розробка принципів і законів діяльності об'єднання.
  3.  IV. ОСОБЛИВОСТІ СТРУКТУРИ стимулом для МЕНЕДЖЕРІВ ДЕРЖАВНИХ КОРПОРАЦІЙ
  4.  P.S. клуби, форуми, об'єднання, фірми, будь-які організації з чіткою ієрархією, для вас є теж новини
  5.  What is "preserving the meaning structure of the source text (ST) (збереження смислової структури тексту оригіналу) in the target text (TT)"?
  6.  XXIX. МИ І ЦЕЙ СВІТ - ПОЛЬОВІ СТРУКТУРИ.
  7.  Акціонерні підприємства, фірми як об'єднання підприємств виступають у вигляді картелів, синдикатів, трестів, конгломератів, холдингів, концернів, фінансово-промислових груп.

У мовах Сі / Сі ++ поняття структури аналогічно поняттю записи (record) в Паскалі. Це структурований тип даних, який представляє собою пойменовану сукупність різнотипних елементів. Тип структура зазвичай використовується при розробці інформаційних систем, баз даних.

Відомості про виплату студентам стипендії потрібно організувати у вигляді, показаному на малюнку нижче.

Елементи такої структури (прізвище, курс, група, стипендія) називаються полями. Кожному полю повинно бути поставлено у відповідність ім'я і тип. Формат опису структурного типу наступний: structімя_тіпа {определенія_елементов};

В кінці обов'язково ставиться крапка з комою (це оператор). Для розглянутого прикладу визначення відповідного структурного типу може бути наступним:

structstudent {charfam [30];

i n tkurs;

chargrup [3];

f l o a ts t i p;

Після цього student стає ім'ям структурного типу, який може бути призначений деяким змінним. У відповідність зі стандартом Сі це потрібно робити так:

structstudent studl, stud2;

Правила Сі ++ дозволяють в цьому випадку службове слово s t r u c t опускати і писати student studl, stud2;

Тут studl і stud2 - змінні структурного типу.

Допускаються й інші варіанти опису структурних змінних. Можна взагалі не ставити ім'я типу, а описувати відразу змінні:

struct {charfam [30];

intkurs;

chargrup [3];

floatstip;

} Studl, stud2, * pst;

B цьому прикладі крім двох змінних структурного типу оголошений покажчик p s t на таку структуру. В даному описі можна було зберегти ім'я структурного типу student.

Звернення до елементів (полів) структурної величини проводиться за допомогою уточненого імені наступного формату:

імя_структури.імя_елемента

Знову все схоже на Паскаль. Приклади уточнених імен для описаних вище змінних:

studl.fam; studl.stip

Значення елементів структури можуть визначатися введенням, привласненням, инициализацией. Приклад ініціалізації в описі:

student studl = { "Кротов", 3, "Ф32", 350};

Нехай в програмі визначено покажчик на структуру student * pst, studl;

Тоді після виконання оператора присвоювання pst = & studl;

до кожного елементу структурної змінної studl можна звертатися трьома способами. Наприклад, для поля fam studl.fam або (* pst) .fam або pst-> fam

В останньому варіанті використовується знак операції доступу до елементу структури: ->. Аналогічно можна звертатися і до інших елементів цієї змінної:

pst-> FIO, pst-> grup, pst-> stip.

Поля структури можуть самі мати структурний тип. Такі величини представляють багаторівневі дерева. Допускається використання масивів структур. Наприклад, відомості

про 100 студентів можуть зберігатися в масиві, описаному в такий спосіб:

student stud [100];

Тоді відомості про окремих студентів будуть позначатися, наприклад, так: s t u d f i] .fam, stud [5] .kurs і т.п. Якщо потрібно взяти першу букву прізвища 25-го студента, то слід писати:

stud [25] .fam [0].

Приклад 1.Ввести відомості про N студентах. Визначити прізвища студентів, які отримують найвищу стипендію.

-include

-include

voidmain (}

{

constN = 30; int i; floatmaxs;

structstudent {charfam [15];

intkurs;

chargrup [3];

floatstip;

};

student stud [N];

clrscr ();

for(I = 0; i

{printf ( "% d-n студент", i);

printf ( "\ п" Прізвище: "); scanf ("% s ", & stud [i] .fam);

printf ( "Курс:"); scanf ( "% d", & stud [i] .kurs);

printf ( "Група:"); scanf ( "% s", & stud [i] .grup);

printf ( "Стипендія:"); scanf ( "% f", & stud [i] .stip);

}

maxs = 0;

for(I = 0; i

if(Stud [i] .stip> maxs) maxs = stud [i] .stip;

printf ( "\ n Студенти, які отримують максимальну

стипендію% f руб. ", maxs);

for (i = 0;i

if (stud [i] .stip == maxs) printf ( "\ n% s", stud [i] .fam);

}

Елемент структури типу поля бітів.Використання структури в програмі на Сі дозволяє працювати з окремими бітами, тобто з розрядами двійкового коду. Для цього використовуються елементи структури типу поля бітів. Формат структури, що містить поля бітів, наступний:

structімя_структури

{Тип ім'я_поля 1: дліна_в_бітах;

тип ім'я поля 2: довжина в бітах;

тип імя_поля_И: дліна_в_бітах;

};

Як типу полів можуть використовуватися специфікатор: int, unsigned, signed. Мінімальною величиною такого типу може бути структура, що складається всього з одного бітового поля. Приклад опису такої структури:

struct onebit

{Unsigned bit: 1;

} Cod;

Звичайно, для змінної cod в пам'яті буде виділено 8 біт (1 байт), але використовуватися буде тільки один перший біт.

Об'єднання.Об'єднання - це ще один структурований тип даних. Об'єднання схоже на структуру і в своєму описі відрізняється від структури тим, що замість ключового слова s t r u c t використовується слово union.

union імя_тіпа

{Определенія_елементов};

Об'єднання відрізняється від структури способом організації у внутрішній пам'яті. Всі елементи об'єднання в пам'яті починаються з одного байта.

Нехай в програмі описана структура:

structS

{Int i;

char ch;

long int L;

};

Розташування її елементів в пам'яті буде наступним:

байт байт

i

байт

ch

байт байт байт байт

L

Елементи структури займають послідовні комірки пам'яті з розміром, відповідним типом. Загальний розмір структури дорівнює сумі довжин полів. А тепер розглянемо об'єднання з наступним описом:

unions

{Int i;

char ch;

long int L;

};

Величина з таким типом в пам'яті буде розташована в такий спосіб:

байт

ch

байт

L

байт

L

байт

Поля об'єднання накладаються один на одного. Загальний обсяг займаної пам'яті дорівнює розміру найбільшого поля. Зміна значення будь-якого поля об'єднання змінює значення інших полів.

Приклад 2.Складемо програму вирішення наступного завдання: з клавіатури вводиться символ. Вивести на екран двійкового коду цього символу.

// Отримання двійкового коду символу

-include

-include

// Структура бітових полів

structbyte {int bl: l;

Int

int

int

int

int

int

int

};

// Об'єднання -

unionbits

{charch;

bytecod

b2: l

b3: l

b4: l

b5: l

b6: l

b7: l

b8: l

змінна

} U;

// Прототип функції декодування

void decode (bits x);

// Основна програма

voidmain ()

{Do {u.ch = getche (); // Введення символу з клавіатури

printf ( ":");

decode (u);

} while(U.ch! = 'Q'); // Символ q- ознака

// введення

кінця

// Функція декодування

voiddecode (bits u)

{if

if

if

if

if

if

if

if

(U.cod.b8) printf ( "l")

(u

(u

(u

(u

(u

(u

(u

, Cod.b7)

, Cod.b6)

cod.

cod.

cod.

cod.

b5)

b4)

b3)

b2)

cod.bl)

printf ( "1")

printf ( "1")

printf ( "1")

printf ( "1")

printf ( "1")

printf ( "1")

printf ( "1")

elseprintf ( "0")

elseprintf ( "0")

elseprintf ( "0")

elseprintf ( "0")

elseprintf ( "0")

elseprintf ( "0")

elseprintf ( "0")

elseprintf ( "0")

printf ( "\ n");

У цій програмі змінна-об'єднання і містить два елементи: символьне поле ch і бітову структуру cod, які накладаються один на одного. Таким чином, виявляється можливим отримати доступ до кожного біту коду символу. Робота програми закінчується після введення символу q. Ось варіант результатів роботи даної програми:

s: 01110011

d: 01100100

J: 01101010

а: 01100001

b: 01100010

з: 01100011

d: 01100100

q: 01110001

 



 Практичне заняття №24 |  Практичне заняття №25

 Лабораторна робота №22 |  Приклад 1. |  Лабораторна робота №23 |  Приклад 1. |  Приклад 2. |  Приклад 3. |  Приклад 5. |  Практичне заняття №26 |  Практичне заняття №27 |  Практичне заняття №28 |

© um.co.ua - учбові матеріали та реферати