Программирование >>  Процедурные приложения 

1 ... 70 71 72 [ 73 ] 74 75 76 ... 150


cout<< \nВведите регистрационн1й номер судна: ; cin pastBoats->szserial;

cout<< \nВведите год изготовления судна: ; cin>> pastBoats->iyear;

cout<< \nВведите число моточасов, наработанных двигателем: ; cin >>

pastBoats->lmotor hqurs;

cout<< \nВведите стоимость судна: ;

cin >> pastBoats->fsaleprice;

cout<< \nВведите строку заметок о судне: ;

cin.get (newline) ; пропуск символа новой строки

cin. get (pastBoats->szcomment, 80, .);

cin. get (newline) ; пропуск символа новой строки

pastBoats++;

pastBoats = sastBoats[0]; vprint data(pastBoats) ; return(0); }

void vprint data(stboat *stused boatptr) { int i ;

cout << \n\n ;

for(i=0;i < linstock; i++) {

cout << Судно << stused boatptr->szmodel << << stused boatptr-

>iyear << года выпуска с регистрационным номером <<

stused boatptr->szserial << ,\n << отработавшее <<

stused boatptr->lmotor hours << моточасов.\n ;

cout << stused boatptr->szcomment << .\n ;

cout << ВСЕГО $ << stused boatptr->fsaleprice << \n\n ;

stused boatptr++; .} }

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

cout<< \nВведите строку заметок о судне: ; cin.get (newline) ; пропуск символа новой строки cin.get (pastBoats->szcomment, 80, . ) ; cin.get (newline) ; пропуск символа новой строки

Первая функция cin.get(newline) выполняет то же действие, что и функция £ lushall( ) в одной из предыдущих программ на языке С. В системах, где данные, вводимые с клавиатуры, буферизируются, часто бывает необходимо удалять из буфера символ новой строки. Существует несколько способов сделать это, но мы показали наиболее лаконичный. Прочитанный символ сохраняется в переменной newline, которая больше нигде в программе не используется.

В третьей строке функция cin . get ( ) считывает максимум 80 символов, причем признаком конца строки задана точка. Таким образом, функция завершается, когда длина строки превышает 79 символов (80-я позиция резервируется для символа \0) или если была введена точка. Сам символ точки не будет прочитан. Поэтому, чтобы строка имела завершенный вид, при выводе на печать точку нужно добавить.

Вложенные структуры

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

structstowner { /* информация о владельце судна */ charcname[50];/* имя и фамилия */ intiage; /* возраст */

int isailing experience; /* опыт мореплавания */ };



В следующем примере структура stowner становится вложенной в рассмотренную ранее структуру stboat:

struct stboat {

char szmodel[iSTRING15 + iNULL CHAR];

char szserial[iSTRING20 + iNULL CHAR];

char szcomment[80]; . struct stowner stowner record;

int iyear;

long lmotor hours;

float fsaleprice; } astBoats[iMAX BOATS];

Чтобы, например, вывести на экран возраст владельца судна, необходимо воспользоваться таким выражением:

printf( %d\n , astBoats[0].stowner record.iage);

Битовые поля

В C/C++ существует весьма удобная возможность - запаковать набор битовых флагов в единую структуру, называемую битовым полем и расположенную в системном слове. Предположим, например, что в программе, осуществляющей чтение данных с клавиатуры, используется группа флагов, отображающих состояние специальных клавиш, таких как [CapsLock], [NumLock] и т.п. Эти флаги можно организовать так:

struct stkeybits

unsigned

char

rshift

/* нажата правая клавиша [Shift] */

lshift

/* нажата левая клавиша [Shift] */

Ctrl

/* нажата клавиша [Ctrl]*/

/* нажата клавиша[Alt] */

scroll

/* включен режим[Scroll Lock] */

numlock

/* включен режим [NumLock] */

capslock

I* включен режим[Caps Lock] */

insert

/* включен режим [Insert] */

После двоеточия указано число битов, занимаемых флагом. Их может быть более одного. Можно не указывать имя флага, а лишь двоеточие и ширину битовой ячейки. Такие безымянные ячейки предназначены для пропуска нужного количества битов в пределах поля. Если указана ширина 0, следующий флаг будет выровнен по границе типа данных. Разрешается создавать битовые поля только целого типа (char, short, int, long), причем желательно явно указывать модификатор unsigned, чтобы поле не интерпретировалось как знаковое число.

При работе с битовыми полями применяется синтаксис структур. Например, чтобы установить флаг capslock, следует воспользоваться таким выражением:

struct stkeybits flags; flags.capslock = 1;

К битовым полям нельзя применять оператор взятия адреса (&).

Объединения

Объединением называется специального рода переменная, которая в разные моменты времени может содержать данные разного типа. Одно и то же объединение может в одних операциях участвовать как переменная типа int, а в других - как переменная типа float или double. Для всех членов такой переменной резервируется единая область памяти, которую они используют совместно. Размерность объединения определяется размерностью самого широкого из указанных в нем типов данных.

Синтаксис

Объединение создается с помощью ключевого слова union:

union тег {



тип1 имя1; тип 2 имя 2; типЗ имяЗ ;

тип-п имя п; };

Обратите внимание на схожесть описания структуры и объединения:

union unmany types { char с; int ivalue; float fvalue;

double dvalue; } my union;

Необязательный тег играет ту же роль, что и тег структуры: он становится именем нового типа данных. Также по аналогии со структурами к члену объединения можно обратиться с помощью оператора точки (.):

имя переменной.член объединения

Создание простейшего объединения

Проиллюстрируем работу с объединением на следующем, довольно простом примере:

union. срр

Эта программа на языке C++ демонстрирует, как работать с объединением.

#include <iostream.h> union unmany types { char с; int ivalue; float fvalue;

double dvalue; } my union; int main (void) {

корректные операции ввода/вывода

my union.c = b;

cout << my union.c << endl;

my union. ivalue = 1990;

cout << my union. ivalue << endl;

my union. fvalue =19.90; , cout << my union. fvalue << endl; my union. dvalue = 987654 . 32E+13; cout << my union. dvalue << endl; некорректные операции ввода/ вывода

cout << my union.c << endl; cout << my union. ivalue << endl; cout << my union. fvalue << endl; cout << my union. dvalue << endl; вычисление размера объединения

cout<< Размер объединения составляет << sizeof (unmany types) <<

байт. ;

return(0);

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



1 ... 70 71 72 [ 73 ] 74 75 76 ... 150

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика