Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
.doc
Скачиваний:
4
Добавлен:
23.09.2019
Размер:
440.83 Кб
Скачать

39) Массивы структуры(в2б9)

Рассмотрим программу, определяющую число вхождений каждого ключевого слова в текст С-программы. Нам нужно уметь хранить ключевые слова в виде массива строк и счетчики ключевых слов в виде массива целых. Один из возможных вариантов –это иметь два параллельных массива:

char *keyword[NKEYS];

int keycount[NKEYS];

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

char *word;

int count;

Такие пары составляют массив. Объявление

struct key {

char *word;

int count;

} keytab[NKEYS];

объявляет структуру типа key и определяет массив keytab, каждый элемент которого является структурой этого типа и которому где-то будет выделена память. Это же можно записать и по-другому:

struct key {

char *word;

int count;

};

struct key keytab[NKEYS];

Так как keytab содержит постоянный набор имен, его легче всего сделать внешним массивом и инициализировать один раз в момент определения. Инициализация структур аналогична ранее демонстрировавшийся инициализациям – за определением следует список инициализаторов, заключенный в фигурные скобки:

struct key {

char *word;

int count;

} keytab[] = {

"auto", 0,

"break", 0,

"case", 0,

"char", 0,

"const", 0,

"continue", 0,

"default", 0,

/*...*/

"unsigned", 0,

"void", 0,

"volatile", 0,

"while", 0 }

Инициализаторы задаются парами, чтобы соответствовать конфигурации структуры. Строго говоря, пару инициализаторов для каждой отдельной структуры следовало бы заключить в фигурные скобки, как, например, в

{ "auto", 0 },

{ "break", 0 },

{ "case", 0 },

...

Однако когда инициализаторы - простые константы или строки символов и все они имеются в наличии, во внутренних скобках нет необходимости. Число элементов массива keytab будет вычислено по количеству инициализаторов, поскольку они представлены полностью, а внутри квадратных скобок "[]" ничего не задано.

40) Передача членов структур функциям. Передача целых структур функциям. (в2б10, в3б22)

Передача структур в функцию

При передаче структур в функцию в качестве типа параметра необходимо указывать имя структурного типа.

void func(key A){

printf("Слово %s встречается %d раз",A[i].word,A[i].count);

}

Передача массивов структур в функцию осуществляется как и передача обычных массивов.

Пример. Ввести изфайлаinputfile.dat информацию числе вхождений ключевого слова в текст программы на С. Вывести полученную информацию в файл output.dat.

#include

#include

struct key {// информация числе вхождений ключевого слова в текст программы на С

char word[10];// ключевое слово

int count;//число вхождений

};

key* input(int* n, char* fileName){// ввод из файла

//n - размер массива

//fileName - имя файла

// функция возвращает указатель на массив структур в динамической памяти

key* A;

FILE *fp;

// открытие файла на чтение

if ((fp = fopen(fileName, "r")) == NULL)

{ printf("Нельзя открыть %s\n", "inputfile.dat");

return NULL;

}

// ввод размера массива структур

fscanf(fp,"%d",n);

//выделение памяти под массив структур

A=(key*)calloc(*n,sizeof(key));

// ввод значений

for (int i=0;i<*n;i++){

fscanf(fp,"%s",&A[i].word);

fscanf(fp,"%d",&A[i].count);

}

fclose(fp);

return A;

}

void output(int n, key* A, char* fileName){// вывод в файл массива структур

//n - размер массива

//А - указатель на массив структур

//fileName - имя файла

FILE *fp;

if ((fp = fopen("outputfile.dat", "w")) == NULL)

{ printf("Нельзя открыть %s\n", "outputfile.dat");

return;

}

// вывод значение

for (int i=0;i< n;i++){

fprintf(fp,"%s ",A[i].word);

fprintf(fp,"%d ",A[i].count);

}

fclose(fp);

}

void main()

{ key *A; //указатель на массив структур

int n; // кол-во элементов

A=input(&n,"inputfile.dat");

output(n,A,"outputfile.dat");

free(A);

Передача целых структур функциям

Когда в качестве аргумента функции используется структура, то для передачи целой структуры используется обычный способ вызова по значению. Это, конечно, означает, что любые изменения в содержимом параметра внутри функции не отразятся на той структуре, которая передана в качестве аргумента.

При использовании структуры в качестве аргумента надо помнить, что тип аргумента должен соответствовать типу параметра. Например, в следующей программе и аргумент arg, и параметр parm объявляются с одним и тем же типом структуры.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]