Объединения разнотипных данных. 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Объединения разнотипных данных.



 

Со структурами в «близком родстве» находятся объединения, которые вводятся с помощью служебного слова union. Чтобы пояснить степень родства объединений со структурами, рассмотрим определение структуры STR:

struct {

long L;

int i1,i2;

char c[4];

} STR;

Каждый элемент структуры имеет свое собственное место в памяти и размещаются эти элементы последовательно. В ниже приведенной программе опрелена структура STR и выведены значения адресов ее элементов:

// Prim8_6.cpp: Размещение в памяти элементов структуры.

#include<iostream.h>

void main ()

{

struct {

long L;

int i1,i2;

char c[4];

} STR={10L,20,30, {‘a’,’b’,’c’,’d’}};

cout << "\n sizeof (STR)=" sizeof (STR) << hex;

cout << "n&STR.L= " << &STR.L;

cout << "n&STR.i1= " << &STR.i1;

cout << "n&STR.i2= " << &STR.i2;

cout << "n&STR.c= " << &STR.c;

}

Результат выполнения программы:

sizeof (STR)=12

&STR.L= 0x8d800ff4

&STR.i1= 0x8d800ff8

&STR.i2= 0x8d800ffa

&STR.c= 0x8d800ffc

 

Определим очень похожее внешне на структуру STR объединение UNI:

union {

long L;

int i1,i2;

char c[4];

} UNI;

Количество элементов в объединении с именем UNI и их типы совпадают с количеством и типом элементов в структуре STR. Но существует одно очень важное отличие- все элементы объединения имеют один и тот же начальный адрес.

Следующая программа подтверждает сказанное:

//Prim8_7.cpp: размещение в памяти объединения.

#include<iostream.h>

void main ()

{

union{

long L;

int i1,i2;

char c[4];

} UNI={10L}

cout << "\n sizeof (UNI)=" << sizeof (UNI) << hex;

cout << "\n &UNI.L= " << &UNI.L;

cout << "\n &UNI.i1" << &UNI.i1;

cout << "\n &UNI.i2" << &UNI.i2;

cout << "\n &UNI.c " << &UNI.c;

cout << "\n sizeof (UNI.i1)= " << sizeof (UNI.i1);

cout << "\n sizeof (UNI.L)= " << sizeof (UNI.L);

}

Результат выполнения программы:

sizeof (UNI)=4

&UNI.L=0x8d7d0ffc

&UNI.i1=0x8d7d0ffc

&UNI.i2=0x8d7d0ffc

&UNI.c=0x8d7d0ffc

sizeof (UNI.i1)=2

sizeof (UNI.L)= 4

Как подтверждают результаты выполнения программы все элементы объединения UNI имеют один начальный адрес. Размеры элементов соответствуют их типам, а размер объединения определяется размером его максимального элемента.

Итак, объединение можно рассматривать как структуру, все элементы которой при размещении в памяти имеют нулевое смещение от начала. Тем самым все элементы объединения размещаются в одном и том же участке памяти.

Как и для структур, для объединения может быть введен программистом произвольный тип, определяющий «внутреннее строение» всех объединений, относящихся к этому типу. Если для структур английский термин tag мы заменили на структурный тип, то для union type можно говорить об объединяющем типе. Поэтому будем говорить о типе объединения:

union имя_объединяющего­_типа

{элементы объединения};

Пример объединяющего типа:

union mixture {

double d;

long E[2];

int k[4];

};

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

mixture mA,mB[4]; // объединение и массив объединений

mixture *pmix; // указатель на объединение

mixture &rmix=mA; // ссылка на объединение

Заносить значения в участок памяти, выделенный для объединения, можно с помощью любого из его элементов. То же самое справедливо и относительно доступа к содержащему участку памяти, выделенному для объединения. Если бы элементы объединения имели одинаковую длину и один тип, а отличались только именами, то использование объединений было бы подобно применению ссылок. Просто первый участок памяти имел бы несколько различных имен. Основное достоинство объединения- возможность разных трактовок одного и того же содержимого участка памяти.

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

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

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

 

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

 

В языке С++ существует конструкция enum, называемая перечислением.

enum имя {

компонента_1,

.............,

компонента_n

};

где имя – имя перечисления;

компонента – некоторое уникальное в пределах определения имя или комбинация «имя=значение», где «значение»- константное целое выражение.

Перечисление enum действует следующим образом. Первой компоненте, если для нее не указано значение, ставится в соответствие число 0, если значение указано, то это значение. Каждый последующий элемент получит значение предыдущего, увеличенный на 1, если для него значение не указано явно. Таким образом, дни недели объявляются так:

enum DAYS {Monday, Tuesday, Wednesday,..., Sunday};

Можно объявить переменную типа enum:

enum DAYS v;

Пример:

v=Tuesday;

v++; // v=Wednesday

v-=2; // v=Monday

то есть с перечислениями можно работать как с целыми типами. Целым типам можно присваивать перечисляемые константы, то есть любой перечисляемый тип- это тип int.

 


приложение. Примеры программ

 

Пример 1. Преобразование массивов путем удаления (включения) одного или нескольких элементов.

Задание. Дан массив Х1,Х2,...,Х15. Исключить из него 5-ый и 7-ой отрицательные элементы.

 

#invlude<iostream.h> //подключение заголовочного файла библиотеки

//ввода-вывода

void main(void)

{ //Здесь начинается тело функции main

int mas[15]={-5,3,1,-8,7,-7,-6,-5,4,-5,-5,-4,-3,-7, -9}; //описание и

//инициализация массива

int mas1[13]; int i, n=0, j=0; //Описание и инициализация данных

for(i=0;i<15;i++) //Цикл для просмотра и преобразования элементов массива

{if(mas[i]>=0){mas1[j]=mas[i];j++;}

else{n++;

if((n!=5)&&(n!=7)){mas1[j]=mas[i];j++;}}};

cout<<"Заданный массив: \n";

for (i=0;i<15;i++) //Цикл для вывода заданного массива

cout<<mas[i];

cout<<"\nМассив после преобразования:\n";

for(j=0;j<13;j++) //Цикл для вывода преобразованного массива

cout<<mas1[j];

cout<<"\n";} //Конец функции main

 

Результат работы программы:

Заданный массив:

-5 3 1 -8 7 -7 -6 5 4 -5 -5 -4 -3 -7 -9

Массив после преобразования:

-5 3 1 -8 7 -7 -6 5 4 -5 -3 -7 -9

 

Пример 2. Табулирование функций. Использование итерационных циклов.

Задание. Выполнить табулирование заданной функции, используя функции, вычисляющие сумму ряда. При вычислении суммы ряда использовать рекуррентные соотношения. Сделать проверку, используя стандартные функции.

Y=2sinx+cosx

 

#include<iostream.h>

#include<math.h>

#include<iomanip.h>

double msin(double x) { //Функция для вычисления суммы ряда sinx

double E=1e-3;

double u=x, x2=x*x, s=x, m=2; do{

u=-u*x2/(m*(m+1));

s+=u;

m+=2;}

while (fabs(u)>E);

return s;}

double mcos(double x) { //Функция для вычисления суммы ряда cosx

double E=1e-3;

double s=0, u=1, m=0, x2=x*x; do {

s+=u;

u=u*x2/((m+1)*(m+2));

m+=2;}

while (fabs(u)>E);

return s;}

void main() { //Главная функция

double i;

cout <<"\n";

cout <<"________________________________________\n";

cout <<"| При разложении || Проверка |\n";

cout <<"----------------------------------------------------------------\n";

cout <<"| X | F(x) | Xст | F(x)ст | \n";

cout <<"----------------------------------------------------------------\n";

for (i=0;i<2*3.1415;i+=1){

cout <<"|"<<setw(7)<<i<<"|"<<setw(11)<<(2*msin(i)+mcos(i)*mcos(i))<< "|";

cout <<"|"<<setw(7)<<i<<"|"<<setw(11)<<(2*sin(i)+cos(i)*cos(i)<< "|\n";

cout <<"|_____|_______|________| |______|_________|";}

 

 

Результат работы программы:

 

При разложении в ряд   Проверка
X F(x)   Xст F(x)ст
         
  1.974837     1.974869
  1.991547     1.991773
  1.262242     1.262325
  -1.086192     -1.086355
  -1.837085     -1.837384
  0.363365     0.363096

 

Пример 3. Обработка битовых последовательностей.

Задание. Реализовать алгоритм восстановления значения целого отрицательного числа по его дополнительному двоичному коду. Значение восстанавливаемого отрицательного числа вводится с клавиатуры, результат выводится на экран.

 

// Программа возвращает значение целого отрицательного числа по

// его дополнительному двоичному коду.

#include<iomanip.h>

#include<conio.h>

#include<math.h>

void main()

{ clrscr();

int a[16],f[16],i,k=15,c;

int b[16]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1};

int in,out=0, mask=1<<15;

cout<<endl<<"Введите целое отрицательное число (тип int):"<<endl;

cin>>in;

cout<<endl;

//-------------------------Получение кода числа------------------------------

cout<<"Kод числа:"<<endl;

for (c=0; c<=15; c++)

{ if(in&mask) //Продвигаем маску по числу

a[c]=1; //и организовываем вектор "код"

else

a[c]=0;

cout<<setw(1)<<a[c];

in<<=1; }

cout<<endl<<endl;

//-------------------------Инвертируем вектор "код"------------------------------

for(i=0;i<=15;i++)

{ if(a[i]==1)

f[i]=0;

else

f[i]=1; }

//-------------------------Прибавляем 1 и получаем прямой код------------------

for(i=15;i>=0;i--)

if(b[i]==1)

if (f[i]==b[i])

{ f[i]=0;

b[i-1]=1;

}

else

f[i]=1;

cout<<"Восстановленное значение"<<endl;

//------По известной формуле переводим число в десятичный вид--------

for (i=0;i<=15;i++)

{ out+=f[i]*pow(2,k--);

}

out=-out;

cout<<out;

getch();

}

Результат:

Введите целое отрицательное число (тип int):

-123

Kод числа:

Восстановленное значение

-123

 

Пример 4. Функции. Передача параметров.

Задание. Вычислить интегралы: от функции f1 и f2, используя метод трапеции (Симпсона). В качестве формального параметра функции для вычисления интеграла необходимо использовать указатель на подынтегральную функцию. Выбрать интервалы интегрирования и шаг.

 

#include<iomanip.h>

#include<conio.h>

#include<math.h>

//Функция вычисления первого интеграла-integr1 y=

double integr1(double g)

{

return g*g*pow((4-g*g),0.5);

}

 

//Функция вычисления второго интеграла-integr2

double integr2(double g)

{ return pow(sin(g),2);}

 

//------------------------Пеовобразная для функции integr1-------------------

double int1 (double a,double b)

{return 2*asin(b/2)-sin(4*asin(b/2))-2*asin(a/2)-sin(4*asin(a/2));}

 

//------------------------Пеовобразная для функции integr2-------------------

double int2(double a,double b)

{ return b/2-0.25*sin(2*b)-a/2+0.25*sin(2*a);}

 

//------------------------Функция вычисления----------------------------------

double integral(double a,double b,int n, double (*integr)(double))

{ //a,b- границы интервала

//n- число шагов

//*integr- указатель на подынтегральную функцию

// применение см. ниже.

int i;

double x,h,s=0;//Вычисляем интеграл методом трапеций

h=(b-a)/n;

x=h;

for(i=1;i<=n;i++)

{

s+=integr(x);

x+=h;

}

return h*((pow(b,2)*pow((4-pow(b,2)),0.5))/2+s);

}

void main()

{

double x,h;

clrscr();

cout<<"!Значения, вычисленные методом трапеций!";

cout<<"Значения, вычисленные по первообразной!";

cout<<"! ";

cout<<integral(0,1.9999,96,*integr1);// В поле "указатель на функцию" записы-

// ваем указатель на функцию, интеграл

// которой необходимо вычислить.

cout<<"! ";

cout<<int1(0,1.9999)<<"!";

cout<<"! ";

cout<<integral(0,3.14/2,96,*integr2);

cout<<"! ";

cout<<int2(0,3.14/2)<<"!";

getch();

}

Результат:

!Значения, вычисленные методом трапеций! Значения, вычисленные по первообразной!

3.139022! 3.161582

0.817752! 0.784602

литература

 

Основная

 

1. Буг Г. Объектно-ориентированное программирование с примерами применения. Киев: НИПО «ДиаСофт». 1993.

2. Вайнер Р., Пиксон Л. С++ изнутри. Киев: НИПО «ДиаСофт», 1993.

3. Дьюхарст. C., Старк. К. Программирование на С++ Киев: НИПО «ДиаCофт», 1993.

4. Касаткин А.И., Вальвачев А.Н. От Turbo C к Borland C++: Cправочное пособие. /Под общ. ред. А.И. Касаткина.- Минск:Выш. шк., 1992.

5. Подбельский А.А. Язык С++:Учеб. пособие. - М.: Финансы и статиститка, 1995.

6. Цимбал А.А., Майоров А.Г., Козодоев М.А. Турбо С++: язык и применение М.: Джен АЙ Лтд, 1993.

 

Дополнительная

 

7. Белкин В. Обработка исключительных ситуаций в Си++: что, когда, как. PC Magazine/Russian Edition, 1995.- №4.- С. 180-186.

8. Бабэ Бруно. Просто и ясно о Borland C++. Пер. с англ.- М.: БИНОМ, 1995.- 400 с.

9. Дейтел Х., Как программировать на С++: Пер. с англ.- М.: ЗАО "Издательство БИНОМ", 1998.- 1024 с.: ил.

10.Касаткин И.А. Профессиональное программирование на языке Си. В 3т. Минск: Выш. шк., 1993.

11.Керниган Б., Ритчи Д. Язык программирования Си. -М.: Финансы и Статистика, 1992.

12.Кушниренко А.Г., Лебедев Г.В. Основы информатики и вычислительной техники. М.: Просвещение, 1990.

13.Лукас П. С++ под рукой. -Киев НИПО «ДиаСофт», 1993.

14.Липпман С. Б. С++ для начинающих: Пер. с англ.- М.: Унитех; Рязань: Гэлион, 1993.- Т. 1.- 304 с.; Т. 2.- 345 с.

15.Неформальное введение в С++ и Turbo Vision: Пер. с англ.- Санкт-Петербург: Галерея "ПЕТРОПОЛЬ", 1992, 384 с.

16.От Си к Си++ / Е. И. Козелл, Л. М. Романовская, Т. В. Русс и др.- М.: Финансы и статистика, 1993.- 272 с.

17.Пол Ирэ. ООП с использованием С++: Пер. с англ./ Киев: НИПО «ДиаСофт Лтд.», 1995.-480с.

18.Романов В. Ю. Программирование на языке С++. Практический подход.- М.: Компьютер, 1993.- 160 с.

19.Рассохин Д. Н. От Си к Си++.- М.: ЭДЭЛЬ, 1993.- 128 с.

20.Страуструп Б. Язык программирования Си++: Пер. с англ.- М.: Радио и связь, 1991.- 352 с.

21.Страуструп Б. Язык программирования Си++. Второе издание: Пер. с англ.- Киев: ДиаСофт, 1993. Часть 1.- 264 с. Часть 2.- 296 с.

22.Уэйт М., Прата С., Мартин Д. Язык Си. -М.: Мир, 1988.

23.Шнайберг Л.Л., Гончаров М.В. Справочное руководство по основам информатики и вычислительной техники. -М.: Финансы и статистика; Компьютерпресс, 1990.

24.Эллис М., Страуструп Б. Справочное руководство по языку программирования С++ с комментариями. Проект стандарта ANSI: Пер. с англ.- М.: Мир, 1992.- 445 с.


Оглавление

 

 

1. ВВЕДЕНИЕ В С++.................................................................................... 4

1.1. Интегрированная среда программирования Borland C++............. 4

1.2. Структура программы на языке С++.............................................. 6

1.3. Алфавит языка.................................................................................. 8

1.4. Имена................................................................................................ 9

1.5. Директивы препроцессора #include и #define................................. 9

2. ОСНОВНЫЕ ТИПЫ ДАННЫХ И ИХ ВНУТРЕННЕЕ ПРЕДСТАВЛЕНИЕ 12

2.1. Переменные и константы................................................................ 12

2.2. Данные типа int............................................................................... 12

2.3. Данные типа char............................................................................ 15

2.4. Данные с плавающей точкой.......................................................... 16

2.5. Константы....................................................................................... 18

2.5.1. Целые константы......................................................................... 18

3. ЭЛЕМЕНТАРНЫЙ ВВОД-ВЫВОД..................................................... 23

3.1. Форматированный ввод-вывод...................................................... 23

3.2. Функция ввода cin.......................................................................... 27

3.3. Неинициализированные переменнее.............................................. 28

3.4. Функция вывода cout...................................................................... 29

4. ОПЕРАЦИИ И ВЫРАЖЕНИЯ............................................................. 33

4.1. Выражение и его интерпретация................................................... 33

4.2. Основные операции и их приоритет.............................................. 34

4.3. Указатели и массивы...................................................................... 39

5. ОПЕРАТОРЫ.......................................................................................... 44

5.1. Общие сведения.............................................................................. 44

5.2. Оператор if...................................................................................... 45

5.3. Операторы switch и break.............................................................. 46

5.4. Операторы цикла............................................................................ 48

5.5. Другие управляющие средства языка Си...................................... 51

6. Функции в языке С++.................................................................... 51

6.1. Описание функции.......................................................................... 51

6.2. Прототипы функций....................................................................... 53

6.3. Локальные переменные в функциях.............................................. 54

6.4. Статические переменные в функциях............................................ 55

6.5. Выход из функций........................................................................ 56

6.6. Передача параметров функции...................................................... 56

6.7. Модификаторы cdecl и pascal........................................................ 59

6.8. Передача параметров функции по ссылке.................................... 60

6.9. Перегрузка функций....................................................................... 61

6.10. Указатель на функцию. Модификаторы near, far, huge.............. 62

6.11. Стандартные математические функции....................................... 63

6.12. Работа со строками символов...................................................... 66

7. Классы хранения и видимость переменных.............. 67

7.1. Общие положения........................................................................... 67

7.2. Область определения и видимость идентификатора..................... 68

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

8.1. Общие положения........................................................................... 72

8.2. Шаблон структуры. Внешний и внутренний шаблоны. Структурная переменная................................................................................................................ 73

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

8.4. Указатель на структурную переменную........................................ 77

8.5.Массивы структурных переменных. Правила выравнивания структурных переменных в памяти............................................................................. 79

8.6. Использование структур в функциях............................................ 81

8.7. Объединения разнотипных данных............................................... 83

8.8. Перечисления.................................................................................. 86

приложение. Примеры программ............................................ 87

литература............................................................................................. 92

 



Поделиться:


Последнее изменение этой страницы: 2017-02-05; просмотров: 354; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.81.144.39 (0.138 с.)