ТОР 5 статей: Методические подходы к анализу финансового состояния предприятия Проблема периодизации русской литературы ХХ века. Краткая характеристика второй половины ХХ века Характеристика шлифовальных кругов и ее маркировка Служебные части речи. Предлог. Союз. Частицы КАТЕГОРИИ:
|
Объявление структуры
Структура – это тип данных, созданный нами, построенный с использованием других типов. Ключевое слово struct начинает определение структуры. struct имя_структуры { тип1 имя_переменной; тип2 имя_переменной; тип3 имя_переменной; и т.д. }; Например: struct Man{ char fam[20]; char name[15]; int year, day, month; }; Среди типов данных структуры могут также присутствовать, кроме стандартных типов данных (int, float, char и т.д.) ранее определенные типы, но структура не включать в себе переменные своего типа, примеры: 1. struct date { int year, day, month; };
struct Man { char fam[20]; char name[15]; date birthday; }; 2. struct date { int year, day, month; }; struct Man { char fam[20]; char name[15]; date birthday; man any;//неправильно }; При непосредственной работе со структурой, доступ к компонентам структуры осуществляется с помощью оператора “точка”, а при использовании указателя на структуру “->”. Синтаксис для доступа к компонентам структуры следующий: имя_переменной_структуры. член_данных имя_переменной_структуры.->член_данных #include<stdio.h> void main() { Man ob[3]; for(int i=0;i<3;i++) { printf("%d\nName: ",i+1); scanf("%s",ob[i].name); printf("Family: "); scanf("%s",ob[i].fam); printf("Rost: "); scanf("%lf",&ob[i].rost); printf("VES: "); scanf("%lf",&ob[i].ves); } for(i=0;i<3;i++) { printf("%d\n%s\t%s\n%.1lf\t%.1lf\n",i+1,ob[i].fam,ob[i].name,ob[i].rost,ob[i].ves); } } #include<stdio.h> struct date { int day,month,year; }; struct Person { char fam[20]; char name[15]; }; struct Student { int grup; int mark; struct date birthday; struct Person man; }; void main() { Student ob; printf("Name: "); scanf("%s",ob.man.name); printf("Family: "); scanf("%s",ob.man.fam); printf("Day: "); scanf("%d", &ob.birthday.day); printf("Month: "); scanf("%d",&ob.birthday.month); printf("Year: "); scanf("%d",&ob.birthday.year); printf("Mark: "); scanf("%d",&ob.mark); printf("Gruppa: "); scanf("%d",&ob.grup); printf("Student is gruppi %d \n%s \t%s \n%d.%d.%d\n Mark:%d \n", ob.grup, ob.man.fam, ob.man.name,ob.birthday.day,ob.birthday.month,ob.birthday.year,ob.mark); } #include<stdio.h> struct Person { char fam[20]; char name[15]; }; void main() { Person ob1; Person *p; p=&ob1; printf("Name: "); gets(p->name); printf("Family: "); gets(p->fam); printf("%s\t%s\n",ob1.fam,ob1.name); } Можно использовать оператор присвоения к структурам, при это копируются значения одной структуры переменной в другую переменную, если обе структуры-переменные относятся к одному и тому же типу. Однако в этом случае происходит поверхностное копирование, т.е. копирует бит за битом и могут возникнуть проблемы с такими членами данных, как указатели. #include<stdio.h> #include<string.h> struct Person { char *fam; char *name; }; void main() { Person ob1,ob2; char x[20]; int l; printf("Name: "); scanf("%s",x); l=strlen(x)+1; ob1.name= new char[l]; if(!ob1.fam) { printf("\a\a\a\a\n"); return; } strcpy(ob1.name,x); printf("Family: "); scanf("%s",x); l=strlen(x)+1; ob1.fam= new char[l]; if(!ob1.fam) { printf("\a\a\a\a\n"); return; } strcpy(ob1.fam,x); ob2=ob1; printf("%s\t%s\n%s\t%s\n",ob1.fam,ob1.name,ob2.fam,ob2.name);// здесь возможна //ошибка } Структуру как параметр можно передавать функции, компилятор передает данные всей структуры в функцию со всеми полями которые в нее входят, а так же и быть возвращающим значением функции #include<stdio.h> struct Man { char fam[20]; int tel; }; struct Man func1(struct Man); void func2(struct Man *p); void main() { struct Man ob; puts("Vizov func1 ili func2 -? "); fflush(stdin); switch(getchar()) { case '1': ob=func1(ob); break; case '2': func2(&ob); break; } printf("sotrudnik - %s tel.- %d\n",ob.fam,ob.tel); } struct Man func1(struct Man ob1) { puts("Familiya:"); fflush(stdin); gets(ob1.fam); puts("Telefon:"); fflush(stdin); scanf("%d",&ob1.tel); return ob1; } void func2(struct Man *p) { puts("Familiya:"); fflush(stdin); gets(p->fam); puts("Telefon:"); fflush(stdin); scanf("%d",&p->tel); } Число байтов, выделенных под структуру не всегда равна сумме длин отдельных ее элементов из-за некоторых особенностей работы процессора с данными с фиксированной и плавающей точкой, что приводит к так называемому “выравниванию”, размещению элементов с четного адреса. Выделение памяти осуществляется в последовательности объявления данных. При размещении структурной переменной в памяти для выравнивания на границу слова компилятор оставляет между ее элементами и элементами массива структурных переменных пустые байты для соблюдения следующих правил:
Между структурами и элементами структуры могут быть неиспользованные байты памяти. Задачи: 1. Создать массив данных о студентах группы. О каждом студенте записать имя, фамилию, год рождения, оценки по 5-ти экзаменам и определить средний балл оценок. #include<stdio.h> Struct Student { char fam[20],name[20]; int year,marks[5],average; }; void func_vvoda(Student *); Не нашли, что искали? Воспользуйтесь поиском:
|