Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Программирование на C / C++ / Основы программирования на Си.doc
Скачиваний:
361
Добавлен:
02.05.2014
Размер:
1.3 Mб
Скачать

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

Рассмотрим метку структуры 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();

}