- •Программирование на языке высокого уровня си
- •Часть II
- •Содержание
- •Работа 1. Пользовательские функции в си
- •I. Теоретический раздел работы
- •1. Функции
- •1.1. Аргументы функций
- •1.2.Функции, возвращающие значения.
- •1.3. Функция main ()
- •2. Рекурсия.
- •II. Экспериментальный раздел работы
- •III. Задания для самостоятельной работы
- •Работа 2. Структурированный тип данных массив
- •I. Теоретический раздел работы
- •1.1. Структурированный тип данных массив
- •1.2. Передача массива в качестве параметра
- •1.3. Многомерные массивы
- •II. Экспериментальный раздел
- •III. Задания для самостоятельной работы.
- •Работа 3. Символьный и строковый типы данных
- •1.1. Символьный тип данных
- •Работа 4. Структуры
- •I. Теоретический раздел работы
- •1.1. Структура
- •1.2. Объединение
- •1.3. Переименование типов
- •II. Экспериментальный раздел работы
- •III. Задания для самостоятельной работы
- •Работа 5. Работа с файлами
- •I. Теоретический раздел работы
- •1.1.Введение
- •1.1. Потоковый ввод-вывод
- •1.2. Открытие и закрытие потока
- •1.3. Стандартные файлы и функции для работы с ними.
- •1.4. Форматированный ввод-вывод
- •1.5. Прямой доступ к файлам
- •II. Экспериментальный раздел работы.
- •III. Задания для самостоятельной работы
- •Список литературы
- •Учебное издание
- •Часть II
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();
}
Введите программу и проведите ее отладку и тестирование. Проведите сортировку фамилий по алфавиту, по результатам первого экзамена. Поэкспериментируйте с программой.