Примеры работы со структурами

1. Определение структурного типа complex, представляющего комплексные числа, заданные в алгебраической форме, и определение структурных переменных x, y этого типа:

struct complex { float re; //действительная часть числа

float im; //мнимая часть числа

} x, y;

 

При этом x.re – доступ к полю действительной части комплексного числа x,

y.im – доступ к полю мнимой части комплексного числа y,

 

Тогда функции для ввода, вывода, сложения комплексных чисел могут выглядеть так:

struct complex { float re, im;}; //определение структурного типа

 

complex read (); //прототип функции ввода комплексного числа

void print (complex ); //прототип функции вывода комплексного числа на экран

void add (complex, complex, complex*); //прототип функции сложения комплексных чисел

void add1 (const complex&, const complex&, complex&);

int main()

{

complex c1, c2, c3,c4; //определение комплексных чисел

c1 = read(); //вызов функции ввода числа

c2 = read();

 

add (c1, c2, &c3);

print(c1); cout << "\t + \t" << endl;

print (c2); cout << " = " << endl;

print (c3);

cout << endl;

 

add1 (c1, c3, c4);

print(c1); cout << "\t + \t" << endl;

print (c3); cout << " = " << endl;

print (c4);

 

_getch();

return 0;

}

 

complex read()

{

complex c;

cout << "re, im:"<< endl;

cin >> c.re >> c.im;

return c;

}

 

void print (complex c)

{

cout << c.re << " + i*" << c.im << endl;

return;

}

 

void add (complex c1, complex c2, complex *c3)

{

c3->re = c1.re +c2.re; //или (*c3).re = c1.re + c2.re;

c3->im= c1.im +c2.im;

return;

}

void add1 (const complex &c1, const complex &c2, complex &c3)

{

c3.re = c1.re +c2.re;

c3.im= c1.im +c2.im;

return;

}

 

2. Определение структурного типа racion, представляющего понятие «рациональное число» и набор функций для сокращения, печати, деления рациональных чисел:

struct racion {int chis, znam;}; //определение структуры

 

void put (racion); //прототипы функций

racion sokr (racion A);

void div (racion A, racion B, racion *C);

 

int main()

{

racion A, B, C;

puts ("racion1, racion2 : ?");

scanf ("%d%d%d%d", &A.chis, &A.znam, &B.chis, &B.znam); //ввод чисел

div(A, B, &C); //вызов функции деления чисел

printf (":"); put(A);

printf ("\tna\t"); put(B);

printf ("\n="); put(C); //вывод результата

_getch();

return 0;

}

 

void put (racion A) //функция выводит на экран «рациональное число»

{if (A.chis * A.znam <0) printf ("-");

A.chis = abs(A.chis);

A.znam = abs(A.znam);

printf( "%d / %d", A.chis, A.znam);

}

 

void div (racion A, racion B, racion *C) //функция делит 2 рациональных числа

{

A=sokr(A);

B= sokr (B);

C->chis = A.chis*B.znam;

C->znam = A.znam*B.chis;

*C= sokr (*C);

}

 

racion sokr (racion A) //функция выполняет сокращение «рационального числа»

{

int i, min;

if (abs(A.chis) > abs(A.znam)) min= abs(A.znam);

else min = abs(A.chis);

for (i=min; i>1; i--)

if(A.chis % i ==0 && A.znam % i ==0) break;

A.chis /=i;

A.znam /=i;

return A;

}

 

3.Рассмотрим программу, позволяющую по паре чисел (год, порядковый номер дня) получить название и число месяца:

struct date {

int d, m, y; //день, месяц, год

char *mname; //название месяца

} md;

 

//двумерный массив с количеством дней в месяце для високосного и невисокосного года

static int dofm[2][12]={{31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31},

{31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}};

 

//массив строк с названием месяцев

static char *name[ ]={"January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"};

 

void monthd(date*, int); //прототип функции пересчета

//значение года передается функции в поле «год» структурной переменной,

//пересчитанные значения дня и месяца возвращаются в этой же переменной,

//поэтому значение структурной переменной передается по указателю

 

int main()

{int yd; //порядковый номер дня года

cout << "god, den ?";

cin >> md.y >> yd; //ввод значений года и порядкового номера дня

monthd (&md, yd); //вызов функции пересчета

md.mname = name[md.m]; //присваивание названия месяцу

cout << md.d <<" " << md.mname<< endl;

_getch();

return 0;

}

 

void monthd(date *md, int yd)

{int i, v;

v = (!(md->y%4) && (md->y%100) || !(md->y%400)); //проверка на високосность

if (yd > 365+v)

{cout << "wrong number"; _getch(); exit(1);} //проверка значения дня года

md->d = yd; //подготовка начального значения для поля md->d

 

for (i=0; md->d > dofm[v][i]; i++) //пересчет порядкового значения дня года

md->d -= dofm[v][i]; //в день месяца

md->m=i; //присваивание значения месяцу

}