Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Metodichka_Si_2sem.doc
Скачиваний:
61
Добавлен:
20.03.2015
Размер:
677.89 Кб
Скачать

1.2. Объединение

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

union u {

int i;

char ch;

long int li:

};

Это объявление не задает какую-либо переменную. Оно задает шаблон объединения. Можно объявить переменную

union u alfa. beta;

Можно было объявить переменные одновременно с заданием шаблона. В отличие от структуры для переменной типа union места в памяти выделяется ровно столько, сколько надо элементу объединения, имеющему наибольший размер в байтах. В приведенном выше примере под переменную alfa будет выделено 4 байта памяти. В самом деле, элемент i требует 2 байта, элемент с - 1 байт, и элемент 1i - 4 байта. Остальные переменные будут располагаться в том же месте памяти. Синтаксис использования элементов объединения такой же, как и для структуры:

u ch = «5»;

1.3. Переименование типов

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

Например:

typdef char SYMBOL;

typdef unsigned UNSIGN;

typdef float real;

Достаточно часто используется оператор typedef с применением структур:

typdef struct st_tag{

char name[30]:

int kurs;

char group|3|;

int slip;

} STUDENT;

Теперь для определения переменной можно использовать:

struct st_tag avar или STUDENT avar.

II. Экспериментальный раздел работы

Пример 1. Ввода - вывода простейшей структуры на дисплей.

#include <iomanip.h>

#include <conio.h>

#include <stdlib.h>

#include <iostream.h>

struct Vkladchik

{ // определение структуры "Вкладчик"

int account; // номер счета

char name[10]; // имя

float suma; // сумма вклада

};

void main(void)

{ clrscr();

Vkladchik к ; // создание экземпляра объекта

cout«"Введите счет, имя , сумму \n"; cin»k.account»k.name»k.suma;

cout«"Cчёт"«setw(9 )«"Имя" <<setw(16) <<"Cyммa"«endl;

cout<<k.account<<k.name<<k.suma;

cout«"\n\n";

getch();

}

Пример 2. Ввода - вывода массива структур на дисплей.

#include <iomanip.h>

#include <conio.h>

#include <stdlib.h>

#include <iostream.h>

struct Vkladchik { // определение структуры "Вкладчик"

int account; // номер счета

char name [10]; // имя

float suma; // сумма вклада

};

void main(void)

{ int i, n;

сlrscr();

соut«"Введите число записей п= ";

cin»n;

Vkladchik к [10]; // создание массива экземпляров объектов

соut«"Введите счет, имя, сумму \n";

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

cin»k[i].account»k[i].name»k[i].suma; cout«"?"«endl;

}

cout«"Cчёт"«setw(9)«"Имя" <<setw(16) <<"Cyммa"«endl;

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

cout<<k[i].account<<k[i].name<<k[i].suma<<endl;

cout«"\n\n";

cout«"\nHажмите любую клавишу...";

getch();

}

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

Программа состоит из трех процедур:

ReadData – формирование исходных данных;

WriteData – вывод результатов;

SortChoice – сортировка фамилий студентов согласно среднего балла.

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

#include <iomanip.h>

#include <conio.h>

#include <stdlib.h>

#include <iostream.h>

int n=3;

int m=4;

typdef struct student_one { /* для данных по одному студенту */

char fio[30]; /*поле формирования фамилии и имени студента*/

int marks[m]; /*поле подмассив оценок, полученных в сессию*/

double sb; {поле для среднего балла }

}

typdef student_one student_all[n]; { массив для формирования данных

по всем студентам Вашей группы }

student_all group;

void ReadData(student_all r); {Процедура ввода данных и вычисления

среднего балла для каждого студента группы}

int i,k,s;

{

r[1].fio =« Иванов Андрей»; /*формирование данных по первому студенту*/

r[1].marks[1]=4; r[1].marks[2]=5; r[1].marks[3]=3; r[1].marks[4]=3;

r[2].fio =« Мунтян Светлана»; /* формирование данных по второму студенту */

r[2].marks[1]=4; r[2].marks[2]=4; r[2].marks[3]=5; r[2].marks[4]=3;

r[3].fio =« Бойко Вячеслав»; /* формирование данных по третьему студенту */

r[3].marks[1]=4; r[3].marks[2]=5; r[3].marks[3]=5; r[3].marks[4]=5;

for (i=1; i< n; i++) /* вычисление среднего балла для каждого студента*/

{ s=0;

for (k=1; k< m; i++; s=s+ r[i].marks[k]);

r[i].sb=s/m;

};

};

void WriteData(sstudent_all r); /*процедура вывода результатов*/

int i;

{

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

cin<< r[i].fio<<” “<<r[i].sb;

};

void SortChoice(student_allgr); /*процедура сортировки методом выбора*/

int i,k,kmax;

double xmax;

student_one st;

{

for (i=1; i< (n-1); i++) /* шаг сортировки */

{ kmax=i; xmax=gr[i].sb; st=gr[i];

for (k=i+1; i< n; i++) /* поиск максимального элемента*/

{ if gr[k].sb > xmax

{

kmax=k; xmax=gr[k].sb; st= gr[k]

};

gr[kmax]=gr[i]; gr[i] =st; /*обмен местами максимального и I -элемента*/

}

};

{ /*Основная программа*/

ReadData(group); cout<<”несортированные данные”<<endl;

WriteData(group);

SortChoice(group);

cout<<”сортированные данные”<<endl;

WriteData(group);

getch();

}

Введите программу и проведите ее отладку и тестирование. Проведите сортировку фамилий по алфавиту, по результатам первого экзамена. Поэкспериментируйте с программой.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]