Примеры работы со структурами
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; //присваивание значения месяцу
}