Название полей | name | price | percent | date |
Тип | char* | long | float | char[9] |
Байты |
Инициализация объектов типа структуры может быть осуществлена при объявлении объектов. Например,
struct goods cit={“Апельсины”, 56, 2.5, ”15.06.13”};
Сравнивая структуры с массивами, следует отметить одну особенность, связанную с операцией присваивания. Если заданы массивы одного и того же типа, то перенос значений из одного массива в другой возможен лишь с использованием оператора цикла. Например,
float x[5], y[5]={1.0, 5.7, 4.0, -6.2, 7.1};
for(int i=0; i<sizeof(x) / zizeof(x[0]); i++)
x[i]=y[i];
Стандарт языка Си разрешает присваивание структур. Например, если введен объект
goods frut;
то при выполнении операции присваивания
frut = cit;
полям объекта frut будут присвоены значения полей объекта cit.
Следует отметить, что поле name будет указывать на один и тот же адрес памяти. Доступ к полям структуры обеспечивается с помощью уточненных имен:
Имя_объекта.имя_поля
Листинг 10.1. В файле с именем "input.txt" задано количество студентов, список студентов с указанием фамилии и номера группы (рис. 10.1).
|
|
Содержимое файла "input.txt".
Рис. 10.1. Информация, находящаяся в файле «input.txt»
Необходимо упорядочить список студентов по возрастанию номера группы, а внутри группы упорядочить их в алфавитном порядке. Для описания студента используется структура:
struct spisok
{
char *fam; // Фамилия студента
int group; // Номер группы студента
};
Файл “stdafx.h”
#pragma once
#define WIN32_LEAN_AND_MEAN
#include <stdio.h>
#include <tchar.h>
#include <string.h>
#include <fstream>
#include <iostream>
using namespace std;
//L10_1.cpp
#include "stdafx.h"
struct spisok // Структура для описания студентов
{
char *fam; // Поле структуры
int group; // Поле структуры
};
void sort(spisok*f, int n); // Прототип функции sort()
int _tmain()
{
ifstream fin("input.txt"); // Задание объекта для ввода и его идентификация
ofstream fout("outout.txt");// Задание объекта для вывода и его идентификация
int n,i;
char st[30];
spisok *f;
fin>>n; // Чтение числа записей в списке
f=new spisok[n];
// Формирование списка:
for(i=0; i<n; i++)
{
fin>>st;
f[i].fam=strdup(st);
fin>>f[i].group;
}
sort(f,n); // Сортировка списка в заданном порядке
// Вывод списка в файл "outout.txt":
for(i=0; i<n; i++)
{
fout.width(20);
fout<<f[i].fam;
fout.width(5);
fout<<f[i].group<<'\n';;
}
fout.close();
return 0;
}
void sort(spisok*f, int n)
{
spisok v;
int i, k=0, ff;
do
{
ff=0;
for(i=0; i<n-1-k; i++)
{
l=f[i].group > f[i+1].group||(f[i].group == f[i+1].group &&
strcmp(f[i].fam, f[i+1].fam)>0);
if (l)
{
v=f[i];
f[i]=f[i+1];
f[i+1]=v;
ff=1;
}
}
k++;
}while(ff);
}
Результат выполнения программы листинга 10.2 представлен на рис. 10.2.
Содержимое файла "outout.txt"
Рис. 10.2. Результат работы программы листинга 10.2
В случае, когда значение некоторого поля должно быть одинаковым для всех записей структуры, его следует объявить статическим. Статические компоненты не «дублируются» при создании новых объектов, то есть каждый статический компонент существует в единственном экземпляре. Доступ к статическому компоненту возможен лишь после его инициализации. Для инициализации используется следующая конструкция:
|
|
тип имя_структуры:: имя_компонента инициализатор;
Листинг 10.2. В программе описываются продукты, находящиеся на некоторой оптовой базе (рис. 10.3). В качестве статического компонента рассматривается торговая скидка.
Содержимое файла "input.txt"
Рис. 10.3. Информация, находящаяся в файле «input.txt»
//L10_2.cpp
#include <stdio.h>
#include <string.h>
#include <fstream>
#include <iostream>
using namespace std;
typedef struct date // Структура для описания даты
{
int dd,mm,yy;
};
struct baza // Структура для описания товара
{
char*name; // Наименование товара
float price; // Цена
static int percent; // Торговая скидка
date d; // Дата поступления
};
void print_date(date); // Печать даты в формате dd.mm.yy
int true_date(date); // Проверка правильности ввода даты
void print_baza(baza); // Печать содержимого объекта baza
int baza::percent=0; // Начальная инициализация компонента percent
int main()
{
date d1;
setlocale(LC_CTYPE,"russian");
baza *p;
int n, i, v;
ifstream fin("input.txt"); // Файл, описывающий содержимое базы
char st[30];
fin >> n;
fin>>v; // Введение значения торговой скидка
baza::percent=v; // Присваивание этого значения
p=new baza[n];
for(i=0;i<n;i++)
{
fin.get();
fin.getline(st,29); // Наименование товара
p[i].name=strdup(st);
fin>>p[i].price; // Цена товара
do
{
fin>>d1.dd>>d1.mm>>d1.yy;
if(!true_date(d1))
{
cout<<"Дата введена неправильно!\n";
return 1;
}
}while(!true_date(d1));
p[i].d=d1; // Дата поступления товара
}
fin.close();
for(i=0;i<n;i++) // Печать содержимого базы
{
print_baza(p[i]);
cout<<'\n';
}
cout<<"\nВведите новую скидку ";
cin>>v; // Ввод новой скидки
baza::percent=v;
cout<<"\n\n";
for(i=0;i<n;i++) // Печать содержимого базы
{
print_baza(p[i]);
cout<<'\n';
}
return 0;
}
void print_date(date d)
{
char s[9];
s[8]='\0';
s[0]='0'+d.dd/10;
s[1]='0'+d.dd%10;
s[2]='.';
s[3]='0'+d.mm/10;
s[4]='0'+d.mm%10;
s[5]='.';
int y=d.yy%100;
s[6]='0'+y/10;
s[7]='0'+y%10;
cout<<s;
}
int true_date(date d)
{
int dm[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
int v;
if((d.yy/4==0&&d.yy/100!=0)||d.yy%400==0)
v=1;
else
v=0;
if(d.yy<=0) return 0;
if(d.mm<1||d.mm>12) return 0;
if(d.mm!=2&&(d.dd<1||d.dd>dm[d.mm])) return 0;
if(d.mm==2&&(d.dd<1||d.dd>28+v)) return 0;
return 1;
}
void print_baza(baza p)
{
cout.width(20);
cout<<p.name;
cout.width(12);
cout<<p.price;
cout.width(5);
cout<<p.percent<<" ";
print_date(p.d);
}
Результат выполнения программы листинга 10.2 приведен на рис. 10.4.
Рис. 10.4. Результат работы программы листинга 10.2
Листинг 10.3. В программе задается массив структур, который содержит сведения об успеваемости студентов. На экран дисплея выводится список неуспевающих студентов [1].
//L10_3.cpp
#include "stdafx.h"
#include <iostream>
#include <locale>
using namespace std;
int _tmain()
{ setlocale (LC_ALL, "Russian");
const int f=5;
int i, n, m=1;
typedef struct
{char fio[35];
int mark[4];
}student;
student array[5]; // Массив структур
for (i=0; i<f; i++)
{cout<<"Введите фамилию студента: ";
cin>>array[i].fio;
for (n=0; n<4; n++)
{cout<<"Введите "<<n+1<<"-ю оценку студента: ";
cin>>array[i].mark[n];
}
}
cout<<endl<<"Список неуспевающих:"<<endl;
for (i=0; i<f; i++)
for (n=0;n<4;n++)
if (array[i].mark[n]==2)
{cout<<m++<<") "<<array[i].fio<<endl;
i++;
}
return 0;
}
Результат выполнения программы листинга 10.3 представлен на рис. 10.5.
Рис. 10.5. Результат работы программы листинга 10.3