МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ
НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ “ЛЬВІВСЬКА ПОЛІТЕХНІКА”
Кафедра ЕОМ
ЗВІТ
до курсової роботи (Частина 1)
"Представлення в пам’яті комп’ютера
статичних даних"
з дисципліни
" Програмування. Частина III.
Структури даних та алгоритми "
Вибір варіанту індивідуального завдання:
Завдання 1
12mod5=2, 26mod6=2;
Завдання 2.1
(((26*42)mod321)*12+42)mod30=0
Завдання 2.2
((26+321)*(321+12))mod30=24
Завдання 2.3
(42*10+321*12)mod30=12
Завдання 2.4
(26*3*321+(12mod3)*42)mod30=18
Завдання 2.5
(26+12+321*42+26*12)mod30=2
Завдання на курсову роботу
Завдання 1
Визначити внутрішнє представлення в пам’яті комп’ютера даних базових типів. Розглянути основні прості (цілі, дійсні, символьні, логічні) типи даних:
bool b=(26*5)mod10*12=0;
signed char ch3=’s’;
unsigned i3=26*215=5590;
float d1=-26*12.26e-12=-321.26e-12;
Завдання 2
Визначити внутрішнє представлення в пам’яті комп’ютера даних похідних типів.
3.2.1. Представлення рядків символів
Визначити представлення в пам’яті комп’ютера рядків символів.
char string0[] = "he\xaaw\34\\""d\vf23\xfe\1e\xfjf";
string0 [0] = '7';
string0 [2] = '9';
string0 [4] = '5';
string0 [6] = '1';
string0 [8] = '5';
string0 [10] = '4';
string0 [12] = '0';
string0 [14] = '5';
3.2.2. Представлення переліків
Визначити представлення в пам’яті комп’ютера переліків.
enum color24 {
BLUE,
GREEN,
CYAN = 3,
RED,
BROWN,
GRAY = -2,
YELLOW,
WHІTE,
MAGENTA = 1,
LІGHTGRAY,
DARKGRAY,
BLACK
} c1= CYAN,
c2= BROWN,
c3= DARKGRAY;
3.2.3. Представлення масивів
Визначити представлення в пам’яті комп’ютера масивів.
char array12[][2][3] = { {2,56}, {6,}, {{3,8,1}} };
array12[0][0][0] = 0; // 0 * 26 = 0
array12[0][0][1] = 234; // 9 * 26 = 234
array12[0][0][2] = 182; // 7 * 26 = 182
array12[0][1][0] = 234; // 9 * 26 = 234
array12[0][1][1] = 130; // 5 * 26 = 130
array12[0][1][2] = 26; // 1 * 26 = 26
array12[1][0][0] = 130; // 5 * 26 = 130
array12[1][0][1] = 104; // 4 * 26 = 104
array12[1][0][2] = 0; // 0 * 26 = 0
array12[1][1][0] = 130; // 5 * 26 = 130
3.2.4. Представлення структур
Визначити представлення в пам’яті комп’ютера структур.
struct str18 {
float a;
unsigned e:6;
signed long b:9;
char c[10];
short d;
long :3;
wchar_t f;
signed :4;
}str;
str.a = 26.312; // замість D підставити свій день народження
// замість DM підставити значення, що дорівнює
// добутку дня народження на місяць народження
str.b=42*321*124;
// замість BD підставити номер свого будинку
// замість KV підставити номер своєї квартири
str.c[0] = 'Y';
str.c[1] = 'a';
str.c[2] = 's';
str.c[3] = 'c';
str.c[4] = 'h';
str.d = 764*42*5; // замість BD підставити номер свого будинку
// замість Х підставити шосту з кінця цифру номера
// мобільного телефона
str.e=26*12*36; // замість DN підставити свій день народження
// замість MN підставити свій місяць народження
str.f = 5; // замість Y підставити останню цифру номера
// мобільного телефона
3.2.5. Представлення об'єднань
Визначити представлення в пам’яті комп’ютера об'єднань.
union un2 {
int b[2];
unsigned long c;
char a[13];
struct {
char d[2];
double e;
};
} un;
un.e = 321 * 325 + 1993 * 26=156143; // замість KV підставити номер своєї квартири
// замість YEAR підставити свій рік народження
// замість DN підставити свій день народження
un.c = 26 * (12 + 42) * 100=140400; // замість MN підставити свій місяць народження
// замість BD підставити номер свого будинку
un.a[0] = '1'; // далі 6,7,8,9,10 цифри мобільного телефону.
un.a[1] = '5';
un.a[2] = '4';
un.a[3] = '0';
un.a[4] = '5';
Зміст
Вступ
Теоретична частина
Алгоритм розв’язання задачі.
Система тестів
Завдання 1: Внутрішні формати базових типів
3.1.1. Логічний тип
3.1.2. Символьний тип
3.1.3. Цілий тип
3.1.4. Дійсний тип
Завдання 2: Внутрішні формати похідних типів
3.2.1. Рядок символів
3.2.2. Перерахування
3.2.3. Масив
3.2.4. Структура
3.2.5. Об'єднання
Результати виконання програми
Висновки
Список літератури
Додатки
Вступ
Актуальність: Розуміння внутрішнього представлення типів даних є важливим аспектом для будь-якого програміста. Знаючи методи внутрішнього представлення можна раціональніше використовувати ресурси мови програмування С++, також зменшується ризик виникнення помилок, та збоїв в роботі програмованих машин. Користуючись даними знаннями можна розширювати поле діяльності програмування на цифрові автомати, логічні елементи, та функціональні схеми.
Задачі даної курсової роботи призначені для дослідження внутрішнього представлення в пам’яті комп’ютера базових та похідних типів даних статичної структури. Охоплюють основні типи даних та методи їх представлення в пам’яті комп’ютера.
Дана робота призначена для закріплення знань з теми «Типи даних».
Теоретична частина
Дані є складовою частиною інформації, що являють собою зареєстровані сигнали. Під час інформаційного процесу дані перетворюються з одного виду в інший за допомогою методів. Обробка даних містить в собі множину різних операцій.
Основна мета будь-якої програми полягає в обробці даних. Дані різних типів зберігаються в пам’яті комп’ютера і обробляються по-різному. Згідно з концепцією типів даних, кожний тип даних однозначно визначає:
множину значень, які може приймати змінна заданого типу;
операції та функції, які можна застосовувати до цієї змінної;
внутрішнє представлення змінної у пам'яті комп'ютера.
Нагадаємо, що пам'ять виділяється не для типу даних, а для розміщення змінних або констант певних типів.
В мові С++ розрізняють наступні категорії типів:
1) базові (або прості, основні, стандартні) типи даних;
похідні (або складні, складені) типи даних.
Базові типи мають імена, які є ключовими словами мови. До базових типів відносяться: скалярні типи і порожній тип (void).
Скалярні типи діляться на цілочисельні і дійсні типи (float, double, long double). Логічний тип (bool), символьні (char, wchar_t) та цілі (short, int, long) типи даних відносяться до цілочисельних типів. Для них визначені всі операції роботи з цілими числами.
Похідні типи визначаються на основі базових типів. Похідні типи діляться на скалярні і структуровані (або агрегатні).
До скалярних похідних типів відносяться:
- переліки (enum) ;
- вказівники (ім'я_типу *);
- посилання (ім'я_типу &).
До структурованих похідних типів відносяться:
- масиви;
- структури (struct);
- об'єднання (union);
- класи (class).
В структурах, об'єднаннях і класах можуть використовуватись бітові поля.
2. Алгоритм розв’язання задачі
Завдання 1
Вхідні дані: 4 числа таких типів: bool, char, unsigned, float.
Вихідні дані: представлення в пам’яті комп’ютера вхідних даних.
Алгоритм: переведення до 2-кової , чи 16-кової системи числення, при необхідності нормалізація, та представлення даних в пам’яті комп’ютера.
Завдання 2.1
Вхідні дані: рядок символів типу char.
Вихідні дані: представлення в пам’яті комп’ютера вхідних даних.
Алгоритм: визначення елементів символьного рядка, переведення до 16-кової системи числення, та представлення символів в пам’яті комп’ютера.
Завдання 2.2
Вхідні дані: перелік , 3 змінні переліку.
Вихідні дані: представлення в пам’яті комп’ютера вхідних даних.
Алгоритм: визначення значень полів переліку, переведення до 16-кової системи числення, та представлення значень полів в пам’яті комп’ютера.
Завдання 2.3
Вхідні дані: масив.
Вихідні дані: представлення в пам’яті комп’ютера вхідних даних.
Алгоритм: визначення розміру та структури масиву, переведення значень елементів масиву до 16-кової системи числення, та представлення їх в пам’яті комп’ютера.
Завдання 2.4
Вхідні дані: структура.
Вихідні дані: представлення в пам’яті комп’ютера вхідних даних.
Алгоритм: визначення розміру структури, вирівнювання довжин полів, переведення до 2-кової , чи 16-кової системи числення, при необхідності нормалізація, та представлення даних в пам’яті комп’ютера.
Завдання 2.5
Вхідні дані: об’єднання.
Вихідні дані: представлення в пам’яті комп’ютера вхідних даних.
Алгоритм: визначення розміру об’єднання, вирівнювання довжин полів, переведення до 2-кової , чи 16-кової системи числення, при необхідності нормалізація, та представлення даних в пам’яті комп’ютера.
Система тестів
Завдання 1: Внутрішні формати базових типів
Логічний тип
bool b=0;
В памяті комп’ютера логічний тип займає 1 байт, отже ВПК:
b=0000 00002=0016
Символьний тип
signed char ch3=’s’; Має код з таблиці ASCII 7316 та займає 1 байт, отже ВПК:
ch3=7316
Цілий тип
unsigned i3=559010=15D616 Займає 4 байти, отже ВПК:
i3=D6 15 00 0016
3.1.4. Дійсний тип
float d1=-321.26e-12=-0,0000000003122610=-0,000000015755605016=
0000, 0000 0000 0000 0000 0000 0000 0000 0001 0101 0111 0101 0101 0110 0000 0101 0000
Проводимо нормалізацію:
1, 0101 0111 0101 0101 0110 0000 0101 0000
S=1; e=127-32=95=5F16
Збірка за схемою:
1 0101 1111 0101 0111 0101 0101 0110 0000 0101 0000
S | e | m
Розбиваємо та тетради і отримуємо:
AF AB AA B016
ВПК: B0 AA AB AF16
Завдання 2: Внутрішні формати похідних типів
3.2.1. Рядок символів
char string0[] = "he\xaaw\34\\""d\vf23\xfe\1e\xfjf";
string0 [0] = '7';
string0 [2] = '9';
string0 [4] = '5';
string0 [6] = '1';
string0 [8] = '5';
string0 [10] = '4';
string0 [12] = '0';
string0 [14] = '5';
Після перепресвоювання рядок набуде вигляду:
char *string0 = "7e9w5\\1\v524\xfe0e5jf"; Переведемо поелементно в 16-кову систему числення.
ВПК: 37 65 39 77 35 5С 31 0В 35 32 34 FE 30 65 35 6A 66 00
3.2.2. Перелік
CYAN оголошено явно с1 = 310=316; Отже ВПК: 03 00 00 00
BROWN оголошено неявно. Знаходиться на 2 позиції від попередньо явно оголошеного поля. Отже, с2=3+2=510=516 ВПК: 05 00 00 00
DARKGRAY оголошено неявно. Знаходиться на 2 позиції від попередньо явно оголошеного поля. Отже, с3=1+2=310=316 ВПК: 03 00 00 00
3.2.3. Масив
char array12[][2][3] = { {2,56}, {6,}, {{3,8,1}} };
array12[0][0][0] = 0; // 0 * 26 = 0
array12[0][0][1] = 234; // 9 * 26 = 234
array12[0][0][2] = 182; // 7 * 26 = 182
array12[0][1][0] = 234; // 9 * 26 = 234
array12[0][1][1] = 130; // 5 * 26 = 130
array12[0][1][2] = 26; // 1 * 26 = 26
array12[1][0][0] = 130; // 5 * 26 = 130
array12[1][0][1] = 104; // 4 * 26 = 104
array12[1][0][2] = 0; // 0 * 26 = 0
array12[1][1][0] = 130; // 5 * 26 = 130
Після переприсвоювання масив набуде вигляду:
char array12[][2][3]={{{0,234,182},{234,130,26}},{{130,104,0},{130,0,0}},{3,8,1},{0,0,0}}}; Переведемо поелементно в 16-кову систему, отимаємо:
ВПК: 00 EA B6 EA 82 1A 82 68 00 82 00 00 03 08 01 00 00 0016
3.2.4. Структура
struct str18 {
float a;
unsigned e:6;
signed long b:9;
char c[10];
short d;
long :3;
wchar_t f;
signed :4;
}str;
str.a = 26.31210=1A,4FDF3B6416=0001 1010 0100 1111 1101 1111 0011 10112
Проводимо нормалізацію:
S=0; e=13110=8316
0 1000 0111 1010 0100 1111 1101 1111 0011
+1
41 D2 7E FA
ВПК: FA 7E D2 41
str.b=167176810=19825816= 0001 1001 1000 0010 0101 1000
Бітове поле записує останні 9 біт числа:
0 0101 10002
str.c[0] = 'Y'; = 5916
str.c[1] = 'a'; = 6116
str.c[2] = 's'; = 7316
str.c[3] = 'c'; = 6316
str.c[4] = 'h'; = 6816
ВПК: 59 61 73 63 68 СС СС СС СС СС
str.d = 16044010=2 72 B816
Відбудеться вирівнювання довжини:
ВПК: B8 72 СС CC16
str.e=1123210=2B E016=0010 1011 1110 00002
Бітове поле записує останні 6 біт числа:
10 0000=2016=3210;
str.f = 510
Відбудеться вирівнювання довжини:
ВПК: 05 00 СС СС16
Представлення ВПК бітових полів:
Останні 2 біти b запишуться в перші 2 біти змінної e, а попереду b буде 1 з C, що знаходиться в памяті за замовчуванням. Тоді змінні набудуть вигляду:
0010 00002 – е
1001 01102 – b
Відбудеться вирівнювання довжини до float, отже:
ВПК: 20 96 СС СС
Представлення ВПК структури:
Спочатку записується значення типу float, далі значення бітових полів, далі значення масиву, далі значеня short, далі значення порожніх бітових полів, далі значення wchar_t, далі значення порожніх бітових полів.
FA 7E D2 41 20 96 CC CC 59 61 73 63 68 CC CC CC CC CC B8 72 CC CC CC CC 05 00 CC
CC CC CC CC CC –str
3.2.5. Об'єднання
un.e =156143.0010= 261EF16=0010 0110 0001 1110 1111. 0000
Проводимо нормалізацію:
1,0 0110 0001 1110 1111 0000
S=0; e=1023+17=104010=41016
0 100 0001 0000 0 0110 0001 1110 1111 0000
S| e | m
Розбиваємо на тетради, отримуємо:
41 03 0F 78 00 00 00 00
ВПК: 00 00 00 00 78 0F 03 4116
un.c =14040010=00 02 24 7016;
ВПК: 70 24 02 0016
un.a[0] = '1'; = 3116 // далі 6,7,8,9,10 цифри мобільного телефону.
un.a[1] = '5'; = 3516
un.a[2] = '4'; = 3416
un.a[3] = '0'; = 3016
un.a[4] = '5'; = 3516
В об’єднані є вкладена структура. Її розмір = 16 тому,що розмір double = 8 байт, а размір масиву char = 2 і його довжина вирівнюється до числа кратного довжині double.
Порожнє обєднання:
CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC
Після запису до структури значення типу double:
CC CC CC CC CC CC CC CC 00 00 00 00 78 0F 03 41
Вигляд обєднання після запису до нього значення int:
70 24 02 00 CC CC CC CC 00 00 00 00 78 0F 03 41
Вигляд обєднання після запису до нього значення масиву :
5 34 30 35 CC CC CC 00 00 00 00 78 0F 03 41
4. Результати виконання програми
/
Висновки
Під час виконання даної курсової роботи я зрозумів методи внутрішнього представлення типів даних в пам’яті комп’ютера. Виконання задач даної курсової роботи розвинули навики дослідження внутрішнього представлення в пам’яті комп’ютера базових та похідних типів даних статичної структури. Вдосконалив свої вміння переведення чисел до різних систем числення, зрозумів як можливо програмно реалізувати дане дослідження. Також я закріпив знання з теми «Типи даних».
Список літератури
Грегори К. Использование Visual С++. Специальное издание. - М.: «Диалектика», 1999.
Мешков А.В., Тихомиров Ю.В. Visual С++ и MFC. Пер. с англ. – 2-е изд. перераб. и доп. – СПб.: БХВ - Петербург, 2002. – 1040 с.
Страуструп Б. Язык программирования С++. Третье издание. - М.: «Издательство Бином», 1999.
Трамбле Ж., Соренсон П. Введение в структуры данных. – М.:Машиностроение, 1982
Уильям Топп, Уильям Форд. Структуры данных в С++. – М.:Бином, 2000 - 700 с
Додатки
Текст програми в електронному вигляді
#include<stdio.h>
#include<conio.h>
#include<math.h>
int main (void)
{
printf("zavdannya 1\n");
unsigned i3=5590; // Дані
bool b=0;
float d1=-312.26e-12;
signed char ch3='s';
unsigned char *vx0=(unsigned char *)(&i3);
for (int i=0;i<sizeof(i3);i++)
printf("%02X ",vx0[i]);
printf("-i3\n");
unsigned char *vx1=(unsigned char *)(&b); // створення масиву вказівників
for (int i=0;i<sizeof(b);i++) // виведення в циклі представлення ВПК
printf("%02X ",vx1[i]);
printf("-b\n");
unsigned char *vx2=(unsigned char *)(&d1);
for (int i=0;i<sizeof(d1);i++)
printf("%02X ",vx2[i]);
printf("-d1\n");
unsigned char *vx3=(unsigned char *)(&ch3);
for (int i=0;i<sizeof(ch3);i++)
printf("%02X ",vx3[i]);
printf("-ch3\n");
printf("\n");
// завдання 2
printf("zavdannya 2\n");
char string0[]="he\xaaw\34\\""d\vf23\xfe\1e\xfjf";// створення рядка символів
string0 [0] = '7'; //переприсвоювання значень
string0 [2] = '9';
string0 [4] = '5';
string0 [6] = '1';
string0 [8] = '5';
string0 [10] = '4';
string0 [12] = '0';
string0 [14] = '5';
unsigned char *vx4=(unsigned char *)(&string0);
for (int i=0;i<sizeof(string0);i++)
printf("%02X ",vx4[i]);
printf("-string0\n");
printf("\n");
//завдання 3
printf("zavdannya 3\n");
enum color24 {
BLUE,
GREEN,
CYAN = 3,
RED,
BROWN,
GRAY = -2,
YELLOW,
WHІTE,
MAGENTA = 1,
LІGHTGRAY,
DARKGRAY,
BLACK
} c1= CYAN,
c2= BROWN,
c3= DARKGRAY;
unsigned char *vx5=(unsigned char *)(&c1);
for (int i=0;i<sizeof(c1);i++)
printf("%02X ",vx5[i]);
printf("-c1\n");
unsigned char *vx6=(unsigned char *)(&c2);
for (int i=0;i<sizeof(c1);i++)
printf("%02X ",vx6[i]);
printf("-c2\n");
unsigned char *vx7=(unsigned char *)(&c3);
for (int i=0;i<sizeof(c3);i++)
printf("%02X ",vx7[i]);
printf("-c3\n");
printf("\n");
//завдання 4
printf("zavdannya 4\n");
char array12[][2][3] = { {2,56}, {6,}, {{3,8,1}} }; // ініціалізація масиву
array12[0][0][0] = 0; // 0 * 26 = 0 // перевизначення елементів масиву
array12[0][0][1] = 234; // 9 * 26 = 234
array12[0][0][2] = 182; // 7 * 26 = 182
array12[0][1][0] = 234; // 9 * 26 = 234
array12[0][1][1] = 130; // 5 * 26 = 130
array12[0][1][2] = 26; // 1 * 26 = 26
array12[1][0][0] = 130; // 5 * 26 = 130
array12[1][0][1] = 104; // 4 * 26 = 104
array12[1][0][2] = 0; // 0 * 26 = 0
array12[1][1][0] = 130; // 5 * 26 = 130
unsigned char *vx8=(unsigned char *)(&array12);
for (int i=0;i<sizeof(array12);i++)
printf("%02X ",vx8[i]);
printf("-array12\n");
printf("\n");
//завдання 5
printf("zavdannya 5\n");
struct str18 {
float a;
unsigned e:6;
signed long b:9;
char c[10];
short d;
long :3;
wchar_t f;
signed :4;
}str;
str.a = 26.312; // замість D підставити свій день народження
// замість DM підставити значення, що дорівнює
// добутку дня народження на місяць народження
str.b=42*321*124;
// замість BD підставити номер свого будинку
// замість KV підставити номер своєї квартири
str.c[0] = 'Y';
str.c[1] = 'a';
str.c[2] = 's';
str.c[3] = 'c';
str.c[4] = 'h';
str.d = 764*42*5; // замість BD підставити номер свого будинку
// замість Х підставити шосту з кінця цифру номера
// мобільного телефона
str.e=26*12*36; // замість DN підставити свій день народження
// замість MN підставити свій місяць народження
str.f = 5; // замість Y підставити останню цифру номера
// мобільного телефона
unsigned char *vx9=(unsigned char *)(&str);
for (int i=0;i<sizeof(str);i++)
printf("%02X ",vx9[i]);
printf("-str\n");
printf("\n");
//завдання 6
printf("zavdannya 6\n");
union un2 {
int b[2];
unsigned long c;
char a[13];
struct {
char d[2];
double e;
};
} un;
un.e = 321 * 325 + 1993 * 26; // замість KV підставити номер своєї квартири
// замість YEAR підставити свій рік народження
// замість DN підставити свій день народження
un.c = 26 * (12 + 42) * 100; // замість MN підставити свій місяць народження
// замість BD підставити номер свого будинку
un.a[0] = '1';
un.a[1] = '5';
un.a[2] = '4';
un.a[3] = '0';
un.a[4] = '5';
unsigned char *vx10=(unsigned char *)(&un);
for (int i=0;i<sizeof(un);i++)
printf("%02X ",vx10[i]);
printf("-un\n");
getch();
return 0;
}