Составные типы данных
Скачать 184.3 Kb.
|
МИНОБРНАУКИ РОССИИ Санкт-Петербургский государственный электротехнический университет «ЛЭТИ» им. В.И. Ульянова (Ленина) Кафедра РАПС отчет по лабораторной работе № 5 по дисциплине «Информационные технологии» Тема: Составные типы данных
Санкт-Петербург 2020 Цель работы Исследование составных (сложных) типов данных языка С. Ход работы Перечисления Определим перечисляемый тип данных. Создадим переменную этого типа и выведем её на экран. int main(int argc, char* argv[]) { setlocale(LC_ALL, "russian"); enum Cars {УАЗ, ГАЗ, BMW, KIA, Буханка, Toyota}; Cars c1 = УАЗ; Cars c2 = ГАЗ; Cars c3 = BMW; Cars c4 = KIA; Cars c5 = Буханка; Cars c6 = Toyota; printf("%d", c6); return(0); } Вконсоли получили ответ 5, который совпадает с индексом заданного элемента. Явно инициализируем перечисляемый тип. Определим с помощью sizeof() размер перечисляемого типа данных. Используем инструкцию switch для лучшей наглядности преимуществ перечисляемого типа. int main(int argc, char* argv[]) { setlocale(LC_ALL, "russian"); enum Cars {УАЗ, ГАЗ, BMW, KIA=32, Буханка, Toyota}; Cars c1 = УАЗ; Cars c2 = ГАЗ; Cars c3 = BMW; Cars c4 = KIA; Cars c5 = Буханка; Cars c6 = Toyota; printf("%d \n", c3); printf("%d \n", c4); printf("%d \n", c5); int i; i = sizeof(c4); printf("Размер перечисляемого типа данных: %d \n", i); int a; scanf("%d", &a); switch (a) { case 1: printf("%d", c1); break; case 2: printf("%d", c2); break; case 3: printf("%d", c3); break; case 4: printf("%d", c4); break; case 5: printf("%d", c5); break; case 6: printf("%d", c6); break; default:printf("Неверно введено значение"); } return(0); } Рисунок 1 – Результат выполнения программы с sizeof() и оператором switch Одномерные массивы Создадим и инициализируем в программе одномерный массив типа float. В цикле while организуем вывод значения некоторого элемента массива, индекс которого задается с клавиатуры. Предусмотрим выход из цикла, а также случаи некорректнозаданного индекса.Расширим код и используем в нем инструкцию forдля выполнения некоторых действий со всеми элементами одномерного массива(вывода максимального и минимального значения элементов массива). int main(int argc, char* argv[]) { setlocale(LC_ALL, "russian"); int index, a = 1; const int chislo_elementov = 10; float Max, Min; float number[chislo_elementov] = { -1.2, 4.5, 4.7, 21, 56.4, 64, -76.867, 67, -10}; while (a !=0) { printf("Введитеиндекс: \n"); scanf("%d", &index); if (index > (chislo_elementov-1) || index < 0) { printf("Неправильный индекс. Попробуйте ещё раз. \n"); continue; } printf("Элементмассивасиндексом %d : %f \n",index, number[index] ); printf("Выполнить ещё раз? 0 - Завершение работы программы, любое другое число - Продолжение работы\n"); scanf("%d", &a); } Max = number[0]; Min = number[0]; for (int mw = 0; mw != (chislo_elementov-2); mw++) { if (Max } for (int miw = 0; miw != (chislo_elementov - 2); miw++) { if (Min >number[miw + 1]) Min = number[miw + 1]; } printf("Максимальное значение элемента массива: %f \n" , Max); printf("Минимальное значение элемента массива: %f \n", Min); printf("Работы программы завершена"); return(0); } Рисунок 2 –Работы с одномерным массивом Элемент массива с индексом 9 не инициализирован. При попытке вывода этого элемента массива получили 0. Так как значение этого элемента не задано, компилятор присвоил ей значение 0. Многомерные массивы Создадим и инициализируем в программе двумерный массив одного из типа short. В цикле while организуем вывод значения некоторого элемента массива по двум индексам, которые задаются с клавиатуры. Предусмотрим выход из цикла, а также случаи некорректно заданного индекса.Расширим код и используем в нем несколько инструкцийfor (forвложенный в for)для выполнения некоторых действий со всеми элементами двумерного массива (вывода совпадающих элементов массива). int main(int argc, char* argv[]) { setlocale(LC_ALL, "russian"); bool zero = 0; int a=1, index_1, index_2, ch=0; const int m_1 = 3, m_2 = 3; short numeral[m_1][m_2]{ 7, 2, 3, 2, -48, 2, 237, 0, 0 }; while (a != 0) { printf("Введите первый индекс: "); scanf("%d", &index_1); printf("Введите второй индекс: "); scanf("%d", &index_2); if (index_1 >= m_1 || index_2 >= m_2 || index_1 < 0 || index_2 < 0) { printf("Неверно задан один из индексов. Попробуйте ещё раз. \n"); continue; } printf("numeral[%d][%d]=%d, \n", index_1, index_2, numeral[index_1][index_2]); printf("Выполнить ещё раз? 0 - Завершение работы программы, любое другое число - Продолжение работы\n"); scanf("%d", &a); } int a1 = 0, a2 = 0, a3 = 0, a4 = 0; for (int ch_1_1 = 0; ch_1_1 < m_1; ch_1_1++) { for (int ch_1_2 = 0; ch_1_2 < m_2; ch_1_2++) { for (int ch_2_1 = 0; ch_2_1 < m_1; ch_2_1++) { for (int ch_2_2 = 0; ch_2_2 < m_2; ch_2_2++) { if (ch_1_1 != ch_2_1 || ch_1_2 != ch_2_2) { if (numeral[ch_1_1][ch_1_2] == numeral[ch_2_1][ch_2_2]) { if ((a1 != numeral[ch_1_1][ch_1_2] && a2 != numeral[ch_1_1][ch_1_2] && a3 != numeral[ch_1_1][ch_1_2] && a4 != numeral[ch_1_1][ch_1_2]) || numeral[ch_1_1][ch_1_2]==0) { if (numeral[ch_1_1][ch_1_2] == 0) zero = 1; if (ch == 0) { a1 = numeral[ch_1_1][ch_1_2]; ch++; continue; } if (ch == 1) { a2 = numeral[ch_1_1][ch_1_2]; ch++; continue; } if (ch == 2) { a3 = numeral[ch_1_1][ch_1_2]; ch++; continue; } if (ch == 3) { a4 = numeral[ch_1_1][ch_1_2]; ch++; continue; } } } } } } } } if (a1!=0 || zero==1) printf("Одинакавыеэлементы: "); if (a1!=0) printf("%d ", a1); if (a2!=0) printf("%d ", a2); if (a3!=0) printf("%d ", a3); if (a4!=0) printf("%d ", a4); if (zero == 1) printf("0"); else printf("Совпадающихэлементовнет"); return(0); } Рисунок 3 – Работа с двумерным массивом Структуры Определим сложный тип данных – структуру. Создадим переменную данного типа и инициализируем ее поля. Определим с помощью функции sizeofразмер занимаемый структурой. intmain(intargc, char* argv[]) { setlocale(LC_ALL, "russian"); struct first { long a; double b; float c; }; printf("%d", sizeof(first)); return(0); } Структура занимает 24 байта. Придумаем две структуры с использованием трёх разных типов данных, упорядоченных и не упорядоченных по размеру типа. int main(int argc, char* argv[]) { setlocale(LC_ALL, "russian"); struct first { bool a; long b; short c; }; printf("Размер неупорядоченной структуры: %d \n", sizeof(first) ); struct second { bool a; short c; long b; }; printf("Размерупорядоченнойструктуры: %d \n", sizeof(second)); return(0); } Рисунок 4 - Работа со структурами Размер переменной типа bool– 1 байт, short– 2 байта, long– 4 байта. Объединения Определить сложный тип данных – объединение. Создать переменную данного типа и инициализировать ее поля. Определить с помощью функции sizeofразмер переменной. intmain(intargc, char* argv[]) { setlocale(LC_ALL, "russian"); union A { long a; char b; short c; }; A a; a.a = 567897; printf("%d|", a.a); printf("%d|", a.b); printf("%d|\n", a.c); a.b = 120; printf("%d|", a.a); printf("%d|", a.b); printf("%d|\n", a.c); a.c = 30000; printf("%d|", a.a); printf("%d|", a.b); printf("%d|\n", a.c); printf("Размер переменной a: %d\n", sizeof(a.a)); printf("Размер переменной b: %d\n", sizeof(a.b)); printf("Размер переменной c: %d\n", sizeof(a.c)); printf("Размер объединения: %d", sizeof(A)); return(0); } Рисунок 5 – Работа с объединениями Размер переменных зависит от их типа. Размер объединения равен максимальному размеру переменной, инициализированной в нём. Значения переменных в двоичной СИ(в скобках указано значение в десятичной СИ): После присвоения переменной а.а. значения 567897: a.а=1000 10101010 01011001(567897) а.b=01011001(89) a.c=10101010 01011001(-21927) После присвоения переменной а.b. значения 120: a.a=1000 10101010 01111000(567928) a.b=0111100(120) a.c=10101010 01111000(-21896) После присвоения переменной а.c. значения30000: a.a=1000 01110101 00110000(554288) a.b=00110000(48) a.c=01110101 00110000(30000) Вывод Мною были изучены составные типы данных языка С. Перечисления позволяют нам задавать набор констант, с которыми в дальнейшем удобнее работать. Массивы позволяют объединять элементы одного типа. Структуры сохраняют свои элементы одновременно. Для уменьшения задействования памяти в структурах необходимо в правильном порядке размещать разные типы переменных. Объединенияпозволяют сделать код более читабельным. |