Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

C_Kurs_Lekt / C_II_семестр / 07-2_Пример работы со структорой

.pdf
Скачиваний:
11
Добавлен:
13.02.2016
Размер:
53.33 Кб
Скачать

Лысый Д.А. Основыпрограммирования. Пример работы со структорой (создание массива структур, за-пись, чтение)

1

Пример работы со структорой (создание массива структур, за-

 

пись, чтение)

 

#include <stdio.h>

 

....

 

 

#include <stdlib.h>

 

#include <conio.h>

 

// пример ком-да футболистов

 

typedef struct {

 

char

name[15];

 

int

old; } igra; // тип (структура одного игрока)

 

/* на основе этого типа создавать массивы варианта 2:

1)"статический", например , igra foot[100] - в команде до 100 игроков

-меньше мороки, но не эф-но исп. память.

2)создание динамического массива под нужное число записей, например, X_man

igra * foot;

if ((foot = (igra *) calloc(X_man, sizeof(igra))) == NULL) {

printf("Ошибка выделения памяти") ;

exit(2); }

*/

 

int main() {

 

char *fn="stud.dat";

 

return(0);

 

}

 

/* ф-я первоначального создания файла на диске( вариант) вводим с клавиатуры одного и пишем его (сразу) в файл */

void Create_File(char *name) { // ....

int i;

igra footman ; // для одного игрока FILE *cfPtr; //указатель на файл

if ((cfPtr = fopen(name, "w")) == NULL) perror(name); else {

while (...) {//ввод данных об одном fgets(footman.name, 15, stdin); scanf(...., &footman.old);

//and write to file, порция -один блок fwrite(&footman, sizeof(igra), 1, cfPtr);

}

fclose(cfPtr);

}

}

Лысый Д.А. Основыпрограммирования. Пример работы со структорой (создание массива структур, за-пись, чтение)

2

// просто печать всего списка игроков void Print_footman(char *name) { FILE *cfPtr;

igra footman; int n;

if ((cfPtr = fopen(name, "r")) == NULL) perror(name); else {

printf(" Список фотболистов\n");

while (1) { //пока возможно - читаем блок с диска в структуру и печатаем

if (fread(&footman, sizeof(igra), 1, cfPtr) == NULL)

break;

printf(" ....",footman.name, footman.old);

}

fclose (cfPtr);

}

// печать с сортировкой

void Print_sort_footman(char *name) { FILE *cfPtr;

igra *footman; igra f_swap; int n, i, j;

char name_swap[15];

if ((cfPtr = fopen(name, "r")) == NULL) perror(name); else {

while(1) { // считаем число байт в файле ( можно число блоковfread)

fgetc(cfPtr); if(feof(cfPtr)) break; j++;

};

n=(j/sizeof(igra)); // делим на размер записи = число

записей в файле.

 

 

 

printf("размер байт =%d

размер записи =%d

кол-во

за-

писей = %d\n",j,sizeof(student),n);

 

 

//создаем массив под n игроков

 

 

if ((footman = (igra *) calloc(n, sizeof(igra)))

==

NULL) {

 

 

 

printf("Ошибка выделения памяти") ;

exit(2); }

// считываем всех, т.е. -

n

 

 

rewind( cfPtr); // или

fseek(Tan, SEEK_SET, 0);

 

if (fread(footman, sizeof(igra), n, cfPtr) == NULL)

break;

fclose (cfPtr);

//сортировка по возрасту(числовое поле) по возрастанию

Лысый Д.А. Основыпрограммирования. Пример работы со структорой (создание массива структур, за-пись, чтение)

3

for (i=0, i < n-1; i++) {

if (footman[i]->old > footman[i+1]->old) { j = footman[i]->old;

footman[i]->old = footman[i+1]->old; footman[i+1]->old = j;

name_swap = ( *footman[i]).name;

( *footman[i]).name = ( * footman[i+1]).name;; ( *footman[i+1].name) = name_swap;

}

}

//сортировка по имени(по строке) по возрастанию for (i=0, i < n-1; i++) {

if ( strcmp (footman[i]->name, footman[i+1]->name) >

0) {

//сравниваем строки, если строка1 > строка2 то ф-я

возвращает

//значение > 0.

//Т.е меняем значения местами, но другим способом

//В начале ф-и определяем структуру для временного хранения - f_swap

//и копирует структуру блоком

memcpy (&f_swap, footman[i], sizeof(igra) ); memcpy (footman[i], footman[i+1], sizeof(igra)

);

memcpy (footman[i+1], &f_swap, sizeof(igra) );

}

printf(" Список фотболистов старше 20 лет\n"); for (i=0, i < n-1; i++)

if( footman[i]->old > 20 )

printf(" ....",footman[i]->name, footman[i]-

>old);

free(footman);

}