Выделение памяти под объект coat

Название полей 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


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: