Главная страница
Навигация по странице:

  • Цель работы Исследование составных (сложных) типов данных языка С.Ход работы Перечисления

  • Рисунок 1 – Результат выполнения программы с sizeof () и оператором switch Одномерные массивы

  • Рисунок 2 –Работы с одномерным массивом

  • Рисунок 3 – Работа с двумерным массивом Структуры

  • Рисунок 4 - Работа со структурами Размер переменной типа bool– 1 байт, short– 2 байта, long– 4 байта. Объединения

  • Рисунок 5 – Работа с объединениями

  • Значения переменных в двоичной СИ(в скобках указано значение в десятичной СИ)

  • Составные типы данных


    Скачать 184.3 Kb.
    НазваниеСоставные типы данных
    Дата23.06.2021
    Размер184.3 Kb.
    Формат файлаdocx
    Имя файла9405-Laboratornaya_5.docx
    ТипИсследование
    #220877

    МИНОБРНАУКИ РОССИИ

    Санкт-Петербургский государственный

    электротехнический университет

    «ЛЭТИ» им. В.И. Ульянова (Ленина)

    Кафедра РАПС
    отчет

    по лабораторной работе № 5

    по дисциплине «Информационные технологии»

    Тема: Составные типы данных



    Студентгр. 9405




    Колочаров А. С.

    Преподаватель




    Чмиленко Ф.В.


    Санкт-Петербург

    2020

    Цель работы

    Исследование составных (сложных) типов данных языка С.

    Ход работы

    1. Перечисления

    Определим перечисляемый тип данных. Создадим переменную этого типа и выведем её на экран.

    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


    1. Одномерные массивы

    Создадим и инициализируем в программе одномерный массив типа 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.


    1. Многомерные массивы

    Создадим и инициализируем в программе двумерный массив одного из типа 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 – Работа с двумерным массивом


    1. Структуры

    Определим сложный тип данных – структуру. Создадим переменную данного типа и инициализируем ее поля. Определим с помощью функции 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 байта.


    1. Объединения

    Определить сложный тип данных – объединение. Создать переменную данного типа и инициализировать ее поля. Определить с помощью функции 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 – Работа с объединениями

    Размер переменных зависит от их типа. Размер объединения равен максимальному размеру переменной, инициализированной в нём.

    Значения переменных в двоичной СИ(в скобках указано значение в десятичной СИ):

    1. После присвоения переменной а.а. значения 567897:

    a.а=1000 10101010 01011001(567897)

    а.b=01011001(89)

    a.c=10101010 01011001(-21927)

    1. После присвоения переменной а.b. значения 120:

    a.a=1000 10101010 01111000(567928)

    a.b=0111100(120)

    a.c=10101010 01111000(-21896)

    1. После присвоения переменной а.c. значения30000:

    a.a=1000 01110101 00110000(554288)

    a.b=00110000(48)

    a.c=01110101 00110000(30000)
    Вывод

    Мною были изучены составные типы данных языка С. Перечисления позволяют нам задавать набор констант, с которыми в дальнейшем удобнее работать. Массивы позволяют объединять элементы одного типа. Структуры сохраняют свои элементы одновременно. Для уменьшения задействования памяти в структурах необходимо в правильном порядке размещать разные типы переменных. Объединенияпозволяют сделать код более читабельным.


    написать администратору сайта