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


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

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



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

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);

}


 

Указатели на структуры. Средство typedef.

Формат указателя на структуру:

               struct имя_стуктурного_типа *имя_указательной_пременной;

Доступ к элементам структурчерез указатели будет осуществляться следующим образом:

               (*имя_указательной_пременной).элемент или имя_указательной_пременной-> элемент

Пример:

               struct key *pts; // объявляем указатель на структуру key

Обращение к элементe count структуры key может осуществляться следующим образом:

(*pts).count или же pts->count.

Средство typedef

Кроме объявлений переменных различных типов, имеется возможность объявить типы. Это можно сделать двумя способами. Первый способ - указать имя тега при объявлении структуры, объединения или перечисления, а затем использовать это имя в объявлении переменных и функций в качестве ссылки на этот тег. Второй - использовать для объявления типа ключевое слово typedef. При объявлении с ключевым словом typedef идентификатор, стоящий на месте описываемого объекта, является именем вводимого в рассмотрение типа данных, и далее этот тип может быть использован для объявления переменных.

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

Примеры:

               typedef double (* MATH)();

               /* MATH - новое имя типа, представляющее указатель на

                                    функцию, возвращающую значения типа double */

               MATH cos;

               /* cos указатель на функцию, возвращающую

               значения типа double */

               //Можно провести эквивалентное объявление

               double (* cos)();

               typedef char FIO[40]

               // FIO - массив из сорока символов 

               FIO person;

               //Переменная person - массив из сорока символов

               //Это эквивалентно объявлению

               char person[40];

При объявлении переменных и типов здесь были использованы имена типов (MATH FIO). Помимо этого, имена типов могут еще использоваться в трех случаях: в списке формальных параметров, в объявлении функций, в операциях приведения типов и в операции sizeof (операция приведения типа). Именами типов для основных типов, типов перечисления, структуры и смеси являются спецификаторы типов для этих типов. Имена типов для типов указателя массива и функции задаются при помощи абстрактных описателей следующим образом:

               спецификатор-типа абстрактный-описатель;

Абстрактный-описатель – это описатель без идентификатора, состоящий из одного или более модификаторов указателя, массива или функции. Модификатор указателя (*) всегда задается перед идентификатором в описателе, а модификаторы массива [] и функции () - после него. Таким образом, чтобы правильно интерпретировать абстрактный описатель, нужно начать интерпретацию с подразумеваемого идентификатора. Абстрактные описатели могут быть сложными. Скобки в сложных абстрактных описателе задают порядок интерпретации подобно тому, как это делалось при интерпретации сложных описателей в объявлениях.

 


 



Поделиться:


Последнее изменение этой страницы: 2021-08-16; просмотров: 58; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.221.129.19 (0.006 с.)