Свойства структур
1. Описание переменных структурного типа
coord a; city b[10];
2. Доступ к
полям структуры:
a.x a.y b[1].name b[2].name[0]
3. Присваивание структурных переменных
Переменные одного структурного типа можно присваивать друг другу
coord a,b; a=b;
city p,q; p=q;
4. Остальные операции выполняются для каждого поля в отдельности в соответствии с типом этого поля
Пример задачи 1
Задан массив точек на плоскости. Определить координаты точки, расположенной наиболее близко к началу координат
#include “stdafx.h”
#include “iostream”
#include “string.h”
Пример программы
#include “math.h”
using namespace std;
struct coord{
float x,y;};
coord minrast(coord
*s,int n);
void main()
{
coord mas[10];
cout <<“Input mas”< for(int i=0;i<10;i++)
cin>>mas[i].x>>mas[i].y;
coord r = minrast(mas,10);
cout< system(“pause”);
}
Пример программы
coord minrast(coord *s,int n)
{
coord rm;
float minr=1.0e20;
for(int
i=0;i {
float r = sqrt(s[i].x*s[i].x+s[i].y*s[i].y)
if(r {
minr=r;
rm=s[i];
}
}
return rm;
}
Пример программы
Пример задачи 2
Задан массив структурных переменных, каждый элемент которого состоит
из фамилии студента и его возраста. Составить список студентов, фамилии которых начинаются на заданную букву, а возраст не превосходит заданного значения
#include “stdafx.h”
#include “iostream”
#include “string.h”
struct stud{
char name[20];
int age;};
int spis(stud *mas,int n,char c,int ag,char rm[][20]);
void main()
{
stud mas[20];
Пример программы
char rm[20][20];
cout <<“Input mas”< for(int i=0;i<10;i++)
cin>>mas[i].name>>mas[i].age;
char c; int
ag;
cin>>c>>ag;
int kol = spis(mas,20,c,ag,rm);
for(int i=0;i cout< system(“pause”);
}
int spis(stud *mas,int n,char c,int ag,char rm[][20])
{
int k=0;
Пример программы
for(int i=0;i if((mas[i].age<=ag)&&(mas[i].name[0]==c)
{
strcpy(rm[k],mas[i].name);
k++;
}
return k;
}
Структуры с битовыми полями
Если у структуры одно или несколько полей имеют ограниченный спектр значений, то можно существенно сэкономить отводимую под структуру память
Пример:
struct person {
char name[20];
unsigned age; //4 байта
Структуры с битовыми полями
unsigned sex; //4 байта
unsigned child; //4 байта
};
Под последние 3 поля – 12 байт (48 бит)
struct person {
char name[20];
unsigned age:7; // 7 бит
unsigned sex:1;
unsigned child:4;
};
Итого под последние 3 поля – 12 бит
Пример использования – заголовок каждого фрейма mp3 - файла
Структуры с битовыми полями
struct mp3_frame_hdr {
unsigned short sync;
unsigned char priv:1;
unsigned char pad:1;
unsigned
char freg:2;
unsigned char rate:4;
unsigned char mode:2;
unsigned char mode_exit:2;
unsigned char copy:1;
unsigned char orig:1;
unsigned char emph:2;
};
Объединение
Определение Объединение – это структура, в которой поля перекрывают друг друга, располагаясь
по одному и тому же адресу
Общий вид:
union <имя> {
<тип 1> <поле 1>;
<тип 2> <поле 2>;
……..
};
Пример:
struct bytes{
char lobyte;
char hibyte;
};
union word
{
unsigned short w;
bytes bt;
};
Объединения
word d;
d.w= 12;
d.bytes.lobyte – младший байт
d.bytes.hibyte – старший
байт
Структуры и указатели
Пример
struct coord{
float x,y;};
coord *p;
Доступ к каждому полю структуры осуществляется оператором доступа ->, т.е.
p->x - разименование указателя для поля Х
p->y - разименование указателя для поля Y
Другая форма записи (*p).x
Структуры и указатели
Пример: Дано 6 точек на плоскости, заданных своими координатами. Определить
минимальное расстояние между точками
#include “stdafx.h”
#include “iostream”
#include “math.h”
using namespace std;
struct coord{
float x,y;};
void main()
{
coord *p = new coord[6];
for(int i=0;i<6;i++)
cin>>(p+i)->x>>(p+i)->y;
float min = 1.0e20;