С, С++

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

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

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

Рік:
2011
Тип роботи:
Лабораторна робота
Предмет:
Алгоритмічні мови та програмування

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

МІНІСТЕРСТВО ОСВІТИ І НАУКИ, МОЛОДІ ТА СПОРТУ УКРАЇНИ НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ «ЛЬВІВСЬКА ПОЛІТЕХНІКА» Кафедра САПР Звіт до лабораторної роботи №11 на тему «ПОЛЯ БІТІВ У СТРУКТУРАХ. ПРОГРАМНА РЕАЛІЗАЦІЯ ОБ’ЄДНАНЬ» з курсу «Проблемно-орієнтовані мови програмування» ЛЬВІВ 2011 Мета роботи Навчитися використовувати поля бітів у структурах для роботи з бітовими константами, а також реалізовувати логічні структури на основі об’єднань. Теоретичні відомості Мови С/C++ допускають використання в структурах особливого типу полів - так званих полів бітів. Це група сусідніх (двійкових) розрядів (бітів), розташованих в області пам'яті змінної цілого типу. Використання даних полів уможливлює доступ до окремих бітів більших об'єктів, наприклад байтів або слів. Використання полів бітів доцільно в тому випадку, коли для зберігання інформації в структурі даних досить декількох бітів. Загальний синтаксис опису бітового поля: тип [ім'я]: ширина; Розглянемо кожне поле опису. Поле "тип" В C++ для визначення вмісту бітового поля дозволено використовувати будь-який тип, який інтерпретується як цілий: char, short, іnt, long (з модифікаторами sіgned або unsіgned), перерахування. У полях типу sіgned крайній лівий біт є знаковим. Наприклад, при оголошенні поля типу sіgned шириною в один біт (наприклад, sіgned а: 1;) воно буде здатне зберігати тільки -1 або 0, так як будь-яка ненульова величина буде сприйматися як (-1). Поле "ім'я" Посилання на бітове поле виконуються по імені, зазначеному в полі "ім'я". Якщо ім'я в даному полі не зазначено, то запитана кількість біт буде відведена, але доступ до них буде неможливий. Дозволяється опис поля бітів без імені і з шириною рівною 0 - у цьому випадку наступне поле буде починатися із границі цілого (див. далі). Поле "ширина" Кожному полю виділяється точно стільки бітів, скільки зазначено в полі "ширина". Даний вираз повинен мати невід’ємне ціле значення. Це значення не може перевищувати числа розрядів, необхідного для подання значення типу, зазначеного в поле "тип". Отже, оголошення структури, що містить поля бітів має такий вигляд: struct ім'я_ структури { тип [ ім'я1 ] : ширина; тип [ ім'я2 ] : ширина; тип [ім'яN ] : ширина; }; Доступ до полів бітів здійснюється так само, як і до інших елементів структурної змінної, тобто за допомогою операції вибору елемента ".". Наприклад: struct EXAMPLE { іnt a:2; unsіgned іnt b:3; unsіgned іnt c: 6 ; іnt d:l; } exam; Доступ до оголошених полів у даному прикладі відбувається наступним чином: exam.a - доступ до поля "а"; exam.b - доступ до поля "b" і т.д. Доступ до полів бітів може здійснюватися і через вказівник на структуру, у яку поля входять, використовуючи операцію доступу через вказівник "->". Наприклад, якщо для попереднього приклада записати: struct EXAMPLE *examp; examp = &exam; то доступ, наприклад, до поля "b" буде забезпечений так: examp->b. Необхідно відзначити, що хоча доступ до даних полів і здійснимо через вказівник на структуру, що містить це поле, але застосовувати операцію визначення адреси "& " до конкретного поля не можна. У зв'язку із цим визначаються правила ініціалізації полів бітів: - поле біт може бути проініціалізоване тільки безпосередньою операцією присвоювання у вигляді ім'я_структурної_змінної . ім'я_поля_біт =< вираз > ; або: ім'я_вказівника_структури -> ім'я__поля_біт =< вираз > . Причому права частина може являти собою навіть виклик функції, яка повертає деяке значення, треба тільки стежити за тим, щоб дане значення могло вміститися у відведену для поля кількість бітів. - поле бітів не може бути ініціалізовано функціями вводу типу scanf(). При роботі з бітовими полями неприпустимі: - масиви бітових полів; - вказівники на бітові поля; - функції, що повертають бітові поля. Об'єднання - це особливий тип даних мови С, який називається складеним типом. Фактично об'єднання - це змінна, котра дозволяє в різні моменти часу зберігати значення різних типів. Приміром, деяке об'єднання може розглядатися як ціле значення при виконанні однієї операції і як число із плаваючою крапкою або подвійної точності - при виконанні іншої. Об'єднання може містити й структурні змінні. Його особливістю є, то, що всі дані, включені в об'єднання, розташовуються в пам'яті з однієї й тої ж границі (адреси), тобто вони перекривають одне одного. Таким чином, в окремий момент часу об'єднання може зберігати значення тільки одного типу з описаного набору, отже - значення поточного елемента об'єднання губиться, коли присвоюється значення іншому елементу об'єднання. Контроль за тим, якого типу значення зберігається в цей момент часу в об'єднанні, покладається на програміста. Об'єднання, як правил, є частиною структури, оскільки воно припускає зберігання одного значення з деякої множини типів даних, то одним з елементів структури ( що включає в себе об'єднання), повинна бути зміннна, яка визначає тип значення, що перебуває в даний момент в об'єднанні. Набір типів значень, які можуть зберігатися в даному об'єднанні, асоціюється з ним у процесі оголошення. Окремі дані, що входять в об'єднання, надалі будемо називати полями. Як і будь-яке змінна, об'єднання повинне бути визначене. Визначення складається із двох кроків: - задання шаблона об'єднання; - властиво опис змінної-об'єднання. Надалі безпосередньо змінну-об'єднання будемо називати просто об'єднанням. Кожний шаблон має власне ім'я для того, щоб компілятор міг розрізняти шаблони. У випадку якщо у функції використовується єдиний шаблон, він може не мати імені, що задається пропуском поля < ім'я > в описі шаблона (див. нижче). Імена шаблонів повинні бути унікальними в межах їхньої області визначення, і зокрема в межах однієї функції може бути тільки один шаблон без імені. Шаблон створюється за допомогою ключового слова unіon з використанням наступного синтаксису: unіon [< ім'я >] { тип поле1; тип поле2; . . . тип полеN ; } ; Опис шаблона об'єднання вводить по суті новий тип даних. Цілком допустимо використовувати вказівник на введений тип. Як і будь-який інший вказівник інших типів даних, вказівник на об'єднання займає або два байти (near), або чотири байти (far). Опис вказівника на об'єднання не відрізняється від опису вказівників на інші типи: < тип > *< ім'я_вказівника >; де < тип > - задає ім'я шаблона об'єднання, вказівник буде даного типу; < ім'я_вказівника > - ім'я вказівника, що визначається. Індивідуальне завдання Створити об'єднання з елементами числа з плаваючою крапкою, чи текстового рядка. Вивести у файл значення розміру полів об'єднання (функцією sizeof). Текст програми #include <stdio.h> #include <math.h> #include <string.h> union example { float a; char b[20]; } exl; main() { FILE *f; f=fopen("D:\\f.txt","r+"); int d; printf("Enter float a:"); scanf("%f",&exl.a); printf("\nEnter char b:"); scanf("%s",&exl.b); if (strlen(exl.b)>sizeof(exl.a)) d=strlen(exl.b); else d=sizeof(exl.a); printf("%d",d); fprintf(f,"%d",d); fclose(f); return 0; } Результати обчислень  Висновок: Я навчився використовувати поля бітів у структурах для роботи з бітовими константами, а також реалізовувати логічні структури на основі об’єднань.
Антиботан аватар за замовчуванням

29.05.2013 13:05-

Коментарі

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

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

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

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

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

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

Admin

26.02.2023 12:38

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