Курс ПЯВУ 2 сем / Практические / Пр №12.Структуры
.odtПр №12. Стуктуры.
План занятия.
1. Декларация структуры студент.
2. Декларация структуры комплексные числа.
3. Присвоение структур.
4. Инициализация структур.
5. Определение размеров структур.
6. Массив структур.
7. Массивы структур и функции.
8. Домашнее задание.
Объявление полей структуры возможно только без инициализации. Если несколько полей следующих друг за другом в описании структуры имеют один и тот же тип, то для их описания можно использовать синтаксис объявления нескольких переменных одного и того же типа. Типом поля может быть любой тип (как системный, так и пользовательский), описанный ранее.
Примеры структур
Структура в си, содержащая информацию о точке в двумерном пространстве (координаты):
struct Point{
double x, y;
};
Структура в си, содержащая информацию об окружности (координаты центра и радиус):
struct Circle{
double x, y, radius;
};
Структура в си, содержащая информацию о студенте (фамилия, имя, отчество, номер зачетной книжки, средний балл):
struct Student{
char surname[15], name[15], patronymic[15];
unsigned number;
double rate;
};
Структура в си, содержащая информацию о группе студентов (название группы, количество студентов, список студентов (максимально 30)):
struct Group{
char name[10];
unsigned number;
struct Student list[30];
};
Объявление переменной определенной структуры осуществляется после описания данной структуры в следующем виде:
struct тип имя №1[= значение №1][,...];
struct Point pnt[3] = {{0,0},{1,0},{0,1}};
struct Circle c1 = {10.0,10.0,5.0},
c2 = {0.0,0.0,25.0};
struct Student st
= {"Иванов”,”Иван”,”Иванович”,959623,7.5};
struct Group gr ={
"97-BC”, 3, {
{"Иванов”, ”Иван”, ”Иванович”, 979601,8.0},
{"Петров”, ”Петр”, ”Петрович”, 979602,6.5},
{"Сидоров”,”Сидор”,”Сидорович”,979603,9.0}
}
};
От обязательно использования ключевого слова struct можно отказаться, если описывать структуру, используя оператор объявления типа typedef в следующем виде:
typedef struct [первичное имя типа] {...} имя типа;
Первичное имя типа, указываемое перед перечнем полей структуры является необязательным и указывается редко. Как правило, первичное имя типа имеет тот же идентификатор, что и основное имя типа, но начинается со знака подчеркивания.
Структура, содержащая информацию о книге (ФИО автора, название книги, год издания):
typedef struct {
char author[20], title[50];
unsigned year;
} BOOK;
Объявление переменной данного типа:
BOOK book = {"А. Дюма”,”Три мушкетера”, 1986};
Обращение к полям структуры осуществляется в следующем виде:
имя_переменной.имя_поля
Сначала указывается имя переменной структуры, а затем, через точку, имя поля. С точки зрения языка С при таком обращении к полю его значение может выступать как LValue, так и RValue значения.
Примеры
Вычисление длины окружности, заданной переменной cir типа Circle:
double length = 2.0*3.1415*cir.radius;
//Декларация структуры студент.Ввод и вывод структур.
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
int main()
{
struct student
{
char fio[30];// определено поле fio
char group[8];// определено поле group
int year;
int informatika, math, fizika, history;
};
student std;
printf("Ввести Студента\n");
printf("\n Ввести Ф И О ");
gets(std.fio);
printf("\n Ввести группу ");
scanf("%s",std.group);
printf("\n Ввести оценку по информатике ");
scanf("%i",&std.informatika);
printf("\n Ввести оценку по математике ");
scanf("%i",&std.math);
printf("\n Ввести оценку по физике ");
scanf("%i",&std.fizika);
printf("\n Ввести оценку по истории ");
scanf("%i",&std.history);
printf("ФИО %s\n",std.fio);
printf("Группа %s\n",std.group);
printf("Информатика %i \n",std.informatika);
printf("Математика %i \n",std.math);
printf("Физика %i \n",std.fizika);
printf("История %i \n",std.history);
system("pause");
return 0;
}
//Декларация, инициализация и вывод структур
#include<stdlib.h>
#include<math.h>
int main()
{
struct {
int a;
int b;
} x, y;
x.a = 10;
x.b=2;
printf("%d %d", x.a,x.b);
system("pause");
return 0;
}
// 10 2
//Присвоение структур.
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
int main()
{
struct {
int a;
int b;
} x, y;
x.a = 10;
x.b=2;
y = x; /* присвоение структур */
printf("%d %d", y.a,y.b);
system("pause");
return 0;
}
// 10 2
//Инициализация структур.
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
int main()
{
struct klass {
char name[20];
char klass_name;
float bal;
};
struct klass d, b[5], *c;
struct klass a = {"Sergey", 'B', 4.5 };
printf("%s %c %f", a.name,a.klass_name,a.bal);
system("pause");
return 0;
}
//Sergey B 4.5
//Определение размеров структур.
#include<stdio.h>
#include<stdlib.h>
int main()
{
struct student{
char fam[20];
char name[20];
char otch[20];
int rate; };
student petrov;
int i;
i=sizeof(struct student);
printf(" Vel= %i \n",i);
system("pause");
return 0;
}
//64
Массив структур.
//Массивы структур и функции.
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
int main()
{
struct complex
{
float x;
float y;
};
complex p[10];
int i,n,nmax;
float max;
printf("Vvesti k-vo thisel\n");
scanf("%i",&n);
for(i=0;i<n;i++)
{
printf("Vvedite complex chislo\n");
scanf("%f%f",&p[i].x,&p[i].y);
}
max=pow(p[0].x*p[0].x+p[0].y*p[0].y,0.5);nmax=0;
for(i=1;i<n;i++)
if (pow(p[i].x*p[i].x+p[i].y*p[i].y,0.5)>max)
{
max=pow(p[i].x*p[i].x+p[i].y*p[i].y,0.5);nmax=i;
}
printf("Nomer maxsimalnogo modulya %i \n",nmax);
printf("Maxsimalnogo modulya %f \n",max);
system("pause");
return 0;
}
//n=5
//Vvedite complex chislo
// 3
//1+3i
//Vvedite complex chislo
//5 0.2
//5+0.2i
//Vvedite complex chislo
//-0.2 3
//-0.2+3i
//Vvedite complex chislo
//4.2 0.01
//4.2+0.01i
//Vvedite complex chislo
//-6.2 0.45
//-6.2+0.45i
//Nomer maxsimalnogo modulya 4
//Структуры и функции.
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
struct student
{
char fio[30];// опрределено поле fio
char group[8];// определено поле group
int year;
int informatika, math, fizika, history;
};
int main()
{
void vvodstr(student &std);
void vivodstr(student std);
int i,n;
student std;
student grup[5];
printf("Vvecti gruppy studentov\n");
scanf("%d",&n);
for(i=0;i<n;i++){
vvodstr(std);
grup[i]=std;
}
for(i=0;i<n;i++){
std=grup[i];}
vivodstr(std);
system("pause");
return 0;
}
void vvodstr(student &std)
{
printf("Ввести студента\n");
printf("\n Ввести ФИО ");
gets(std.fio);
printf("\n Ввести группу ");
scanf("%s",std.group);
printf("\n Ввести оценку по информатике ");
scanf("%i",&std.informatika);
printf("\n Ввести оценку по математике ");
scanf("%i",&std.math);
printf("\n Ввеси оценку по физике ");
scanf("%i",&std.fizika);
printf("\n Ввести оценку по истории ");
scanf("%i",&std.history);
};
void vivodstr(student std)
{
printf("ФИО %s\n",std.fio);
printf("Группа %s\n",std.group);
printf("Информатика %i \n",std.informatika);
printf("Математика %i \n",std.math);
printf("Физика %i \n",std.fizika);
printf("История %i \n",std.history);
};
1. Домашняя работа.
Разработать алгоритм и написать программу калькулятора вычисления: суммы,
разности, произведения, частного двух комплексных чисел триганометрическую
форму и экспоненциальную форму с помощью структур
и функций.
Пример: программа вычисления суммы двух комплексных чисел.
// Программа сложения двух комплексных чисел
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
int main()
{
// описание структуры complex
struct complex {
float re; // действительная часть
float im; // мнимая часть
};
char ch;
struct complex a, b, c; // объявление переменных типа complex
float temp; // промежуточная переменная
printf("Введите первое слагаемое: ");
printf("\n действительная часть = ");
scanf("%f",&temp);
a.re = temp;
printf("\n мнимая часть = ");
scanf("%f",&temp);
a.im = temp;
printf("Введите второе слагаемое: ");
printf("\n действительная часть = ");
scanf("%f",&temp);
b.re = temp;
printf("\n мнимая часть = ");
scanf("%f",&temp);
b.im = temp;
// складываем действительные части
c.re = a.re + b.re ;
// складываем мнимые части
c.im = a.im + b.im;
// вывод результатов на экран
printf("Результат сложения c=%f %s %f%s \n" ,c.re, " + " ,c.im ,"i");
system("pause");
ch=getchar();
return 0;
}
1
1
2
2
c=3+3i