Хелпикс

Главная

Контакты

Случайная статья





Лабораторная работа № 4. Структуры, объединения, перечисления, битовые поля. Цель работы. Постановка задачи. Примеры решения задач



Лабораторная работа № 4

Структуры, объединения, перечисления, битовые поля

Цель работы

Получение практических навыков по работе со структурами, объединениями, перечислениями и битовыми полями в языке C, а также выработка умений использования в приложениях битовых операций

Постановка задачи

По индивидуальному заданию разработать два приложения: для работы со структурами, перечислениями и битовыми полями, а также для реализации битовых операций на языке С.

Примеры решения задач

 

1. Работа с объединениями

 

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

В примере программы выводятся компоненты объединения Utypes.

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

Во второй части правильно отобразится лишь значение типа double, поскольку оно было занесено последним.

#include <stdio.h>

#include <stdlib.h>

 

union Utypes

{

  char c;

  int ivalue;

  float fvalue;

  double dvalue;

} mun;

 

int main ()

{

  system("chcp 1251");

  mun.c = 'b';

  printf("%c\n", mun.c);

  mun.ivalue = 1990;

  printf("%d\n", mun.ivalue);

  mun.fvalue =19.90;

  printf("%f\n", mun.fvalue);

  mun.dvalue = 987654.32E+13;

  printf("%g\n", mun.dvalue);

  // некорректный вывод

  printf("%c\n", mun.c);

  printf("%d\n", mun.ivalue);

  printf("%f\n", mun.fvalue);

  printf("%g\n", mun.dvalue);

  printf("Размер объединения составляет %d байт\n", sizeof(Utypes));

  return 0;

}

2. Работа с перечислениями

 

Перечисления используются в тех случаях, когда данные можно представить в виде нумерованного списка, например содержащего названия месяцев года или дней недели.

В примере создается перечисление emonths, включающее названия месяцев.

Здесь перечисление представляет собой ряд целых чисел от 1 до 12. Например, значение переменной months, после того как ей была присвоена константа December, стало равным 12. Поскольку названию каждого месяца соответствует определенное числовое значение, то элементы перечисления могут участвовать в арифметических операциях.

 

#include <stdio.h>

#include <iostream>

 

enum emonths

{ January = 1 , February, March,

April, May, June, July, August, September,

October, November, December

} months;

 

int main()

{

setlocale (LC_CTYPE, "Russian");

int mnth, n;

printf ("Введите номер текущего месяца (от 1 до 12): ");

scanf ("%d",&mnth);

months = December;

n = (int)months - mnth;

printf ("\nДо конца года осталось %d месяца(ев)\n", n);

return 0;

}

 

3. Работа с битовыми полями

 

Элементом структуры может быть битовое поле, обеспечивающее доступ к отдельным битам памяти, которые позволяют рационально использовать память с помощью хранения данных в минимально требуемом количестве битов. Элементы битового поля должны быть объявлены как тип int или unsigned.

В программе отображается в двоичной системе счисления ASCII-код, который генерируется при нажатии любой клавиши. При этом используется объединение bits и битовые поля byte. Объединение позволяет присвоить значение нажатой клавиши символьной переменной, а битовые поля используются для отображения отдельных битов.

Программа прекращает работу при нажатии буквы q.

 

#include <stdio.h>

 

struct byte

{

  unsigned a : 1;

  unsigned b : 1;

  unsigned c : 1;

  unsigned d : 1;

  unsigned e : 1;

  unsigned f : 1;

  unsigned g : 1;

  unsigned h : 1;

};

 

union bits

{

  char ch;

  struct byte bit;

} ascii;

 

void disp_bits(bits b);

 

int main()

{

  do

  {

        scanf("%1s", &(ascii.ch));

        printf(":");

        disp_bits(ascii);

  }

  while(ascii.ch != 'q'); // Выход при вводе "q"

  return 0;

}

 

void disp_bits(bits b)

{

  if(b.bit.h) printf("1"); else printf("0");

  if(b.bit.g) printf("1"); else printf("0");

  if(b.bit.f) printf("1"); else printf("0");

  if(b.bit.e) printf("1"); else printf("0");

  if(b.bit.d) printf("1"); else printf("0");

  if(b.bit.c) printf("1"); else printf("0");

  if(b.bit.b) printf("1"); else printf("0");

  if(b.bit.a) printf("1"); else printf("0");

  printf("\n");

}

 

4. Работа с битовыми операциями

 

В примере извлекаются 3 бита числа А, начиная со второго (справа) и вставляются в число В, начиная с первого.

Стандартная функция _itoa_s (число ввода, строка вывода, основание с/с) используется для вывода двоичного представления числа.

Основные битовые операции:

- AND (и) - & - если какой-то бит в одном из операндов равен 0, то результирующий бит тоже будет равен 0 - сброс битов;

- OR (или) - | - если какой-то бит в одном из операндов равен 1, то результирующий бит тоже будет 1 - установка битов;

- XOR (исключающее или) - ^ - результирующий бит равен 1, если сравниваемые биты различны;

- NOT (не) - ~ - меняются все биты на противоположные;

- сдвиг влево - << - удваивается значение;

- сдвиг вправо - >> – значение уменьшается в два раза.

#include <stdio.h>

#include <iostream>

using namespace std;

void main()

{

  setlocale (LC_CTYPE,"Russian");

  char tmp[33];

  int A=150, B=270;

  _itoa_s (A, tmp, 2);

  printf(" A = %s\n", tmp);

  _itoa_s (B, tmp, 2);

  printf("B = %s\n", tmp);

  _itoa_s (0xE, tmp, 2);

  printf("Маска для А = %s\n", tmp);

  _itoa_s (A & 0xE, tmp, 2);

  printf("Выделенные биты А %s\n", tmp);

  _itoa_s (0x1F8, tmp, 2);

  printf("Маска для B = %s\n", tmp);

  _itoa_s (B & 0x1F8, tmp, 2);

  printf("Очищены биты, B = %s\n", tmp);

  _itoa_s (((B & 0x1F8)|(A & 0xE)), tmp, 2);

  printf("Результат B = %s\n", tmp);

}

 

Варианты заданий

№ варианта Условие задачи
1. Описать структуру «Горожанин». Фамилия И.О., дата рождения, адрес, пол (м, ж). Выборка по полу и году рождения. Дату рождения реализовать с помощью битового поля. Пол реализовать с помощью перечисления. 2. Ввести целое A и посчитать, сколько нулей в числе начиная с третьего бита по 13, включая эти биты.
1. Описать структуру «Гостиница» Список полей: паспортные данные, даты приезда и отъезда, номер, тип размещения (люкс, одноместный, двухместный, трехместный, апартаменты). Поиск гостя по дате приезда или по фамилии. Даты приезда и отъезда реализовать с помощью битового поля. Тип размещения реализовать с помощью перечисления. 2. Извлечь 5 битов числа A, начиная со второго и вставить их в число B, начиная с третьего бита.
1. Описать структуру «Клиенты банка». Фамилия И.О., тип счета (срочный, льготный и т.д.), номер счета, сумма на счете, дата последнего изменения. Выбор по номеру счета, по диапазону суммы (<100, >100). Дату реализовать с помощью битового поля. Тип счета реализовать с помощью перечисления. 2. Ввести целое число A. Инвертировать все биты с 2 по 14, включая эти биты. Вывести результат.
1. Описать структуру «Личная библиотека». Картотека домашней библиотеки: выходные данные книги (авторы, название, издательство и так далее), раздел библиотеки (специальная литература, хобби, домашнее хозяйство, беллетристика и так далее), происхождение (покупка, кража, подарок) и наличие книги в данный момент. Выбор книг по автору, году; инвентаризация библиотеки (вывод всего списка книг по категориям). Происхождение книги реализовать с помощью перечисления. 2. Используя битовые операции проверить, кратно ли четырем число А.
1. Описать структуру «Ломбард». База хранимых товаров и недвижимости: анкетные данные клиента, наименование товара, оценочная стоимость; сумма, выданная под залог, дата сдачи, срок хранения. Выбор товаров по истечении срока хранения, по наименованию товара. Дату сдачи реализовать с помощью битового поля. 2. Определить, насколько в числе А больше значащих битов, равных единице, чем битов, равных нулю.
1. Описать структуру «Склад». Наименование товара, цена, количество, процент торговой надбавки (5, 10, 15, 20, 35, 30). Выбор по наименованию, цене. Вывод всего списка товаров на складе с расчетом сумм. Процент торговой надбавки реализовать с помощью перечисления. 2. Установить в единицу каждый второй значащий бит целого числа А.
1. Описать структуру «Авиарейсы». Номер рейса, пункт назначения, время вылета, дата вылета, стоимость билета, количество мест. Выбор по пункту назначения, дате вылета. Дату вылета реализовать с помощью битового поля. Пункт назначения реализовать с помощью перечисления. 2. Извлечь 4 бита числа A, начиная с пятого, и добавить их к числу B справа.
1. Описать структуру «Ученик». Фамилия И.О., класс (цифра+буква) предметы, оценки, средний балл. Выбор по фамилии, выбор по среднему баллу. Класс реализовать с помощью битового поля. Предметы реализовать через перечисление. 2. Установить в ноль каждый третий значащий бит целого числа А.
1. «Студент». Фамилия И.О., дата поступления, специальность, группа, факультет, дата отчисления, средний балл. Выбор по году поступления, фамилии, ср. баллу, группе. Дату поступления и отчисления реализовать с помощью битового поля. Факультет реализовать с помощью перечисления. 2. Извлечь 5 битов числа A, начиная с третьего и вставить их в число B, начиная со 2.
1. Описать структуру «Справочник работника ГИБДД». Марка, цвет, заводской и бортовой номера, дата выпуска, особенности конструкции и окраски, дата последнего техосмотра транспортного средства (автомобиля, мотоцикла, прицепа и т. д.), паспортные данные владельца. Выбор транспортных средств по марке или номеру. Формирование приглашений на техосмотр в соответствии со сроком.Дату выпуска реализовать с помощью битового поля. Марку реализовать с помощью перечисления. 2. Вывести 6 бит целого числа А, начиная со 2-ого.
1. Описать структуру «Записная книжка». Анкетные данные, адреса, телефоны, место работы или учебы, должность знакомых, коллег и родственников, характер знакомства, деловые качества и так далее. Автоматическое формирование поздравления с днем рождения (по текущей дате). Поиск по фамилии. Дату рождения реализовать с помощью битового поля, характер знакомства - с помощью перечисления. 2. Используя битовые операции проверить, кратно ли шестнадцати число А.
1. Описать структуру «Государство». Название; столица; численность населения; государственный язык; занимаемая площадь, денежная единица, форма правления (монархия, республика и т.д.), фамилия президента. Выбор государства по денежной единицы, занимаемой площади (> заданного значения). Форму правления реализовать с помощью перечисления. 2. Ввести целое число A. Инвертировать все биты с 4 по 8, включая эти биты. Вывести полученное число.
1. Описать структуру «Вокзал». Номер поезда, пункт назначения, дни следования, время выбытия, время прибытия, цена. Выбор по пункту назначения, дате. Вывод расписания по времени. Дни следования реализовать с помощью перечисления. Время выбытия и прибытия реализовать с помощью битового поля (часы, минуты). 2. Ввести целое число A. Извлечь 2 бита числа A, начиная с пятого и вставить их в число B, начиная также с пятого бита.
1. Описать структуру «Справочник абитуриента». База вузов: наименование, адрес, перечень специальностей, конкурс прошлого года по каждой специальности (дневной, вечерней, заочной форм), размер оплаты при договорном обучении. Выбор по разным критериям: все о данном вузе; все о данной специальности, поиск минимального конкурса по данной специальности. Конкурс прошлого года по каждой специальности дневной, вечерней, заочной форм реализовать через битовые поля. Перечень специальностей реализовать через перечисления. 2. Ввести целое число A и посчитать, сколько единиц в числе с 5 по 10 бит, включая эти биты.
1. Описать структуру «Преподаватели». Название экзамена, дата экзамена, фамилия преподавателя, количество оценок, оценки. Выбор по фамилии, дате экзамена. Дату экзамена реализовать с помощью битового поля. 2. Используя битовые операции проверить, кратно ли двум число А.
1. Описать структуру «Отдел кадров». Паспортные данные, образование, специальность, подразделение, должность, оклад, даты поступления в фирму и последнего назначения и т. д. Выбор по должности, стражу работы. Даты реализовать с помощью битового поля. Должность реализовать с помощью перечисления. 2. Ввести целое число A. Извлечь 3 бита числа A, начиная со второго и вставить их в число B, начиная с первого бита.

 



  

© helpiks.su При использовании или копировании материалов прямая ссылка на сайт обязательна.