Вівторок, 19.03.2024, 11:13
Гость

Мішатронік

Мобільна версія | Додати у вибране  | Мій профіль | Вихід | RSS |
Меню сайту
Наше опитування
Чи знайома вам така технологія, як Flutter?
Всього відповідей: 0
Статистика

Онлайн всього: 1
Гостей: 1
Користувачів: 0


Переменные структуры

В языках, таких как Ада и Паскаль, имеется тип данных, называемых переменная запись, объекты которой содержат набор одних и тех же компонентов плюс компоненты, не являющиеся общими для всех остальных объектов. В языке Си также имеется тип данных, подобный переменной записи, называемой переменной структурой, которая может быть реализована с использованием комбинации структуры и объединения. В общем случае переменные структуры будут состоять из трех частей: набора общих компонентов, метки активного компонента и части с меняющимися компонентами. Общая форма переменной структуры имеет следующий вид:

 
struct {
 общие компоненты;
 метка активного компонента;
 union {
 описание компонента 1
 описание компонента 2
 ...
 описание компонента n
 } идентификатор;
}
 

Ниже приведен пример определения переменной структуры health_record:

 
struct {
/* общая информация */
 char name[25];
 int age;
 char sex;
 /* метка активного компонента */
 marital_status ms;
 /* переменная часть */
 union {
 /* холост */
 /* нет компонентов */
 /* женат */
 struct {
 char marriage_date[8];
 char spouse_name[25];
 int no_children;
 }
 /* разведен */
 char date_divorced[8];
 } marital_info;
} health_record;
 

где тип marital_status, т.е. тип метки активного компонента ms, описан как

 
typedef enum {SINGLE, MARRIED, DIVORCED} 
 marital_status;
 

Ниже приведены несколько примеров ссылки на компоненты переменной структуры:

 
health_record.name
health_record.ms
health_record.marital_info.marriage_date
 

Указатели и структуры

Рассмотрим метку структуры student, описание которой было дано выше как

 
struct student {
 char name[25]; 
 int id, age;
 char sex;
}
 

Указатель new_student определен как

 
struct student *new_student;
 

Предположим, что память выделена таким образом, чтобы new_student указывал на объект student. Тогда на компоненты этого объекта можно ссылаться следующим образом:

 
(*new_student).name
(*new_student).id
(*new_student).age
(*new_student).sex
 

Поскольку указатели часто используются для указания на структуры, в языке Си специально для ссылок на компоненты такихструктур введен оператор выбора стрелка вправо ->. Например, ссылки на вышеприведенные компоненты структуры можно записать с использованием оператора стрелки вправо -> как:

 
new_student->name
new_student->id
new_student->age
new_student->sex
 

Массив структур

Процесс описания массива структур совершенно аналогичен описанию любого другого типа массива:

 
struct book libry[MAXBKS];
 

Этот оператор объявляет libry массивом, состоящим из MAXBKS -элементов. Каждый элемент массива представляет собойструктуру типа book. Таким образом, libry[0] является book -структурой, libry[1] - второй book -структурой и т.д.

 

Определение элементов массива структур. При определении элементов массива структур мы применяем те же самые правила, которые используются для отдельных структур: сопровождаем имя структуры операцией получения элемента и имени элемента:

 
libry[0].value value - первый элемент массива
libry[4].title title - пятый элемент массива

Переименование типов

Формат

 
typedef старый_тип новый_тип
 

Примеры:

 
typedef long large;
/* определяется тип large, эквивалентный типу long */
typedef char *string;
/* тип string, эквивалентен типу char* */
 

Переименование типов используется для введения осмысленных или сокращенных имен типов, что повышает понятность программ, и для улучшения переносимости программ (имена одного типа данных могут различаться на разных ЭВМ).

 

Пример:

 
/* Реализован алгоритм, который позволяет определить 
строки матриц, состоящие из одинаковых целых, 
расположенных в различных столбцах. Используются 
двумерные массивы и структуры. Сначала выполняется 
сортировка строк по возрастанию. Отсортированные 
строки сравниваются и выводятся на экран номера 
одинаковых строк */
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <conio.h>
#define n 4 /*количество строк */
#define m 4 /*количество столбцов*/
typedef struct mas{int i,i1;} mas;
int m1[n][m]; /*исходный массив*/
struct mas{int i,i1;}; 
mas a[n*2]; 
/*массив типа mas, где будут лежать одинаковые 
 строки, a[1].i и a[1].i1 - одинаковые строки*/
void main()
{
 clrscr();
 int i,j;
 randomize();
 for(i=0;i<n;i++)
 for(j=0;j<m;j++)
 m1[i][j]=random(2);
 /*случайным образом в массив заносим целые*/
 for(i=0;i<n;i++) {
 printf("\n %d) ",i);
 for(int j=0;j<m;j++)
 printf(" %d",m1[i][j]);
 }
 int min, p;
/* индекс минимального элемента после s-го элемента 
i-ой строки сортировка строк массива по возрастанию */
 for(i=0;i<n;i++) { /* i-сортировка i-ой строки */
 for(int s=0;s<m-1;s++) {
 min=m1[i][s+1];
 for(int j=s;j<m;j++)
 if(m1[i][j]<=min) {
 min=m1[i][j];p=j;
 }
/* запоминаем минимальный элемент в ряду после 
s-го элемента */
 if(m1[i][s]>=min) {
 m1[i][p]=m1[i][s];m1[i][s]=min;
 }
/* меняем местами s-й и p-й элемент,если 
 s-й > p-го(минимального) */
 }
 }
 printf("\n");
 for(i=0;i<n;i++) {
 printf("\n %d) ",i);
 for(int j=0;j<m;j++)
 printf(" %d",m1[i][j]);
/* выводим отсортированный массив */
 }
 int s,k=0; 
/*сколько элементов в i-й строке совпадают с элементами i1 строки*/
/*сколько строк совпали*/
 int i1;
 for(i=0;i<n-1;i++) /* верхняя строка i */
 for(i1=i+1;i1<n;i1++) { /* нижняя строка i1 */
 s=0;
 for(int j=0;j<m;j++) 
/* сравнение идет по j-му столбцу */
 if(m1[i][j]==m1[i1][j]) s++;
/* если соответствующие элементы в i-й и i1-й строки совпадают то кол-во совпавших увеличивается на 1 */
 if(s==m) {a[k].i=i;a[k].i1=i1;k++;}
/* если все элементы i-й и i1-й строки совпали, то они одинаковые */
 }
 printf("\n Совпадающие строки :");
 for(i=0;i<k;i++)
 printf("\n %d и %d",a[i].i,a[i].i1);
/* распечатываем a[i].i-ю и a[i].i1-ю совпадающую 
 строку */
 getch();
}

 

Форма входа
Пошук
Друзі сайту
Календар
«  Березень 2024  »
ПнВтСрЧтПтСбНд
    123
45678910
11121314151617
18192021222324
25262728293031

Єдина Країна! Единая Страна!