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

Visual_Studio_2010

.pdf
Скачиваний:
109
Добавлен:
03.03.2016
Размер:
5.94 Mб
Скачать

// Определение структуры

Struct

 

{

 

char *name;

// имя студента

char *surname;

// фамилия студента

 

 

int M;

// отметка по математическому анализу

int A;

// отметка по алгебре

int H;

// отметка по истории

int In;

// отметка по информатике

} student[N];

 

int main (void) {

 

float mark;

 

int i;

 

 

 

// Выделение памяти для символьных указателей for (i = 0; i < N; ++i)

{

student[i].name = (char *) malloc(CH*sizeof(char)); student[i].surname = (char *) malloc(CH*sizeof(char));

}

printf("\n");

for (i = 0; i < N; ++i) {

printf("\t Enter a name of %d student \n\t: ", i+1); gets_s( student[i].name, CH - 1);

printf("\t Enter a surname of %d student \n\t: ", i+1); gets_s( student[i].surname, CH – 1 );

printf("\t Enter marks in 4 subjects for %d student (through a blank) \n\t: ", i+1);

scanf_s("%i%i%i%i", &(student[i].M),&(student[i].A), &(student[i].H),&(student[i].In));

_flushall();

}

puts("\n========================================================

=============================");

printf("\t Statement of Achievement students:\n");

puts("==========================================================

============================\n");

for (i = 0; i < N; ++i) {

 

printf("\t %s \t %s:\n\t Mathematical analyses, Algebra,

 

History, Informatics\n \

 

\n\t\t %d\t\t %3d\t \

 

----------------------------------------------%3d\t %5d\n

\n", \

student[i].name, student[i].surname, \

 

 

 

student[i].M,student[i].A,student[i].H,student[i].In);

 

}

 

 

 

221

mark = 0.0F; // F – спецификатор для типа float

for (i = 0; i < N; ++i)

{

mark += (student[i].M + student[i].A + student[i].H + student[i].In);

}

// Средняя оценка группы из 4 (N)студентов

printf("\n\t The average mark groups of %d students: %1.4f", N, mark/(4*N));

//4*N - общее количество оценок

//Освобождение памяти

for (i = 0; i < N; ++i)

{

free(student[i].name);

free(student[i].surname);

}

printf("\n\n Press any key: "); _getch();

return 0;

}

В программе использован массив структур – переменная student[N]. С целью определения имени и фамилии предварительно выделяется память под символьные указатели с помощью функций malloc(), для которых включен заголовок #include <stdlib.h>.

Определение структуры выполнено за пределами главной функции main(), что позволяет использовать ее в других функциях, если бы они были определены в программе.

Шаблон структуры задан без имени-этикетки.

Возможный результат выполнения программы приведен на рис.13.2.

222

Рис. 13.2. Пример сводной ведомости успеваемости студентов

Задание2

1.Выполните усреднение оценок для каждого студента.

2.Предусмотрите ввод названий предметов (математический анализ, алгебра и т. д.) и определите их в виде инициализаторов структуры.

3.Увеличьте число студентов до семи и произведите запись результатов в текстовый файл с именем compX.txt, где Х – номер компьютера, на котором выполняется лабораторная работа.

4.В шаблоне структуры задайте теговое имя. Проанализируйте работу программы.

5.Примените оператор typedef для определения структурного типа данных.

223

6.Расположите фамилии (с именами) студентов в порядке возрастания их среднего балла за сессию.

Пример 3. Написать программу создания карточки служащего с помощью структурного типа данных и указателя на структуру. Предусмотреть инициализацию полей структуры и изменение этих полей.

Для решения примера воспользуемся структурой, рассмотренной в теоретической части данной темы:

struct employee {

 

char Name [20+1];

// имя

char Surname [20+1];

// фамилия

int age;

// возраст

double hourlysalary;

// почасовой оклад

}

employee_new, *PTR;

// *PTR – указатель на структуру

Программный код решения примера

#include <stdio.h> #include <conio.h> #include <string.h> #include <locale.h>

// Предполагаемое число символов в имени или фамилии

#define n 20

int main (void) {

// Определение структуры struct emloyee {

char name[n+1];

// имя

char surname[n+1];

// фамилия

int age;

// возраст

double hourlysalary;

// почасовой оклад в у.е.

} emloyee_new, *PTR;

// *PTR - указатель на структуру

 

 

setlocale( LC_ALL, ".1251");// кодовая страница Windows – 1251 PTR = &emloyee_new; //В указатель помещается адрес employee_new

// Инициализация полей структуры strcpy_s(PTR -> name, n, "Владимир"); strcpy_s(PTR -> surname, n, "Викулов"); PTR -> age = 25;

PTR -> hourlysalary = 6.78;

// Вывод на консоль

puts("\n=============== Поля структуры ====================");

printf("\n Имя: %s\n Фамилия: %s\n возраст: %d лет\n почасовой оклад: %1.2f y.e.\n", \

PTR -> name, PTR -> surname, PTR -> age, PTR -> hourlysalary); puts("\n==================================================\n");

printf("\n\n Нажмите любую клавишу (Press any key): ");

_getch(); return 0;

}

224

В программе инициализация полей структуры выполнена с помощью оператора –>. С подключением заголовочного файла <locale.h> и определением прототипа функции setlocale(LC_ALL, ".1251") становится возможной поддержка русских шрифтов.

Результат выполнения программы представлен на рис.13.3.

Рис. 13.3. Пример вывода полей структуры на консоль

Задание3

1.В программу добавьте нумерацию полей структуры, например 1) имя:

ит. д.

2.В программу введите свои имя и фамилию, возраст и размер получаемой стипендии (если нет, то нуль). Значения новых полей выведите на консоль и в текстовый файл с именем compX.txt, где Х – номер компьютера, на котором выполняется лабораторная работа.

3.Инициализацию полей структуры выполните с помощью указателя.

4.Выполните предварительную инициализацию структуры, а затем смените значения полей.

Пример 4. Написать программу информационной карточки студенческой группы с данными о студентах, применив вложенные структуры.

Программный код решения примера

#include <stdio.h>

#include <conio.h>

#include <string.h>

// Размер символьных массивов

#define N 20

int main (void)

{

struct stud // шаблон структуры

{

char name[N+1];

// имя студента

char surname[N+1];

// фамилия студента

int age;

//

возраст

- полных лет

double av_mark;

//

средняя

успеваемость

};

225

struct group

// шаблон структуры

{

 

 

 

int number;

 

// номер группы

int quantity;

// количество студентов в группе

struct stud

student;

// вложенная структура

 

 

 

} ACOUY;

//

ACOUY - структурная переменная

 

 

 

 

//Инициализация полей структуры

ACOUY.number = 3; ACOUY.quantity = 21;

strcpy_s(ACOUY.student.name, N, "Peter"); strcpy_s(ACOUY.student.surname, N, "Bobrov"); ACOUY.student.age = 20; ACOUY.student.av_mark = 4.25;

//Вывод на консоль

puts("\n========= Varient field of structure ===============");

printf("\n Group Number: %d,\n The number of students in the group: %d,\n\

Name: %s,\n Surname: %s,\n Age: %d,\n Average mark: %1.2f", \ ACOUY.number, ACOUY.quantity, ACOUY.student.name,

ACOUY.student.surname, \

ACOUY.student.age, ACOUY.student.av_mark);

puts("\n\n================================================\n");

printf("\n Press any key: "); _getch();

return 0;

}

Результат выполнения программы показан на рис.13.4.

Рис. 13.4. Пример информационной карточки студенческой группы

Задание4 1. Инициализацию структуры выполните с клавиатуры.

226

2.Предусмотрите массив структур ACOUY[N], где N – количество групп (например, N = 3).

3.Введите данные своей студенческой группы и предусмотрите вывод на консоль данных о себе.

4.Примените оператор typedef и указатель на структуру.

Пример 5. Написать программу составления карточки на студента с динамическим распределением памяти для имени и фамилии на основе структурного типа данных [5].

Для динамического распределения памяти применим функцию malloc() и символьные указатели в качестве инициализаторов структуры.

Программный код решения примера

#include <stdio.h> #include <conio.h> #include <string.h>

#include <stdlib.h>

#include <locale.h>

const int MAX = 80; // предполагаемое число символов

int main (void)

{

char *NAME, *SURNAME;

struct stud // шаблон структуры

{

char *name; // указатель вместо массива символов имени студента

char *surname;

// указатель вместо

массива символов фамилии

int age;

// возраст - полных

лет

float av_mark;

// средняя успеваемость

int letters;

// число символов в

имени и фамилии

} TABLE, *PTR;

 

 

PTR = &TABLE; //

инициализация указателя на структуру

 

 

 

NAME = (char *)malloc(MAX);

printf("\n Enter a name of the student: "); gets_s( NAME, MAX – 1 );

SURNAME = (char *)malloc(MAX);

printf(" Enter a surname of the student: "); gets_s( SURNAME, MAX – 1 );

//Распределение памяти для хранения "структурного" имени

PTR->name = (char *)malloc(strlen(NAME)+1);

//Копирование имени в распределенную память

strcpy_s(PTR->name, strlen(NAME)+1, NAME);

// Распределение памяти для хранения "структурной" фамилии

PTR->surname = (char *)malloc(strlen(SURNAME)+1);

227

// Копирование фамилии в распределенную память strcpy_s(PTR->surname, strlen(SURNAME)+1, SURNAME);

printf(" Enter the age of the student: "); scanf_s("%d", &TABLE.age);

printf(" Enter an average mark of the student: "); scanf_s("%f", &TABLE.av_mark);

TABLE.letters = strlen(PTR->name) + strlen(PTR->surname);

//Для вывода чисел с десятичной запятой setlocale(LC_NUMERIC, ".1251");

puts("\n======== Varient field of structure ===============");

printf("\n Name: %s\n Surname: %s\n Age: %d\n Average mark: %1.2f\n\

The name and surname of student have: %d letters", \ PTR->name, PTR->surname, PTR->age, PTR->av_mark, PTR->letters); puts("\n\n================================================\n");

//Освобождение памяти

free(NAME);

free(SURNAME); free(PTR->name); free(PTR->surname);

printf("\n Press any key: ");

_getch(); return 0;

}

В программе сначала выделяется память под имя и фамилию, для которых использованы указатели *NAME, *SURNAME. После того как эти данные введены с клавиатуры, рассчитывается количество символов плюс символ окончания строки '\0', которые используются при резервировании памяти для структурных переменных.

Возможный результат выполнения программы приведен на рис.13.5.

Рис. 13.5. Пример динамического создания карточки студента

228

Задание5

1.С клавиатуры введите данные о себе (буквами русского алфавита), выведите информацию на консоль и в текстовый файл с именем compX.txt, где Х – номер компьютера, на котором выполняется лабораторная работа.

2.Поменяйте операторы «стрелка» на операторы «точка» и наоборот.

3.Вместо указателей *NAME, *SURNAME примените массивы символов.

4.Предусмотрите нумерацию полей структуры, например 1) Name: Peter и т. д.

Пример 6. Написать программу записи структуры в двоичный файл и чтения ее из этого файла.

Решение примера разобьем на две части: создадим структуру и произведем ее пакетную запись в файл. Потом операцию записи закомментируем, изменим поля структуры и выполним чтение структуры из файла.

Для динамического распределения памяти применим функцию malloc() и символьные указатели в качестве инициализаторов структуры.

Программный код решения примера

#include <stdio.h>

#include <conio.h> #include <string.h>

#define MAX 80 // предполагаемое число символов struct stud // шаблон структуры

{

char name[MAX+1];

// массив символов имени студента

char surname[MAX+1];

// массив символов фамилии студента

char ACOUY[MAX+1];

// специальность

int age;

// возраст - полных лет

float av_mark;

// средняя успеваемость

};

 

 

 

int main (void)

{

char NAME[MAX+1], SURNAME[MAX+1], SPEC[MAX+1]; FILE *fid;

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

//определение указателя на структуру

struct stud TABLE = {"--", "--", "--", 0, 0.0}, *PTR;

PTR = &TABLE; // инициализация указателя на структуру

printf("\n Enter a name of student: "); gets_s(NAME, MAX);

printf(" Enter a surname of student: "); gets_s(SURNAME, MAX);

printf(" Enter a speciality: "); gets_s(SPEC, MAX);

229

// Занесение имени в структуру strcpy_s(PTR->name, strlen(NAME)+1, NAME); // Занесение фамилии в структуру

strcpy_s(PTR->surname, strlen(SURNAME)+1, SURNAME);

// Занесение названия специальности в структуру strcpy_s(PTR->ACOUY, strlen(SPEC)+1, SPEC);

printf("Enter the age of the student: "); scanf_s("%d", &TABLE.age);

printf(" Enter the average mark student: "); scanf_s("%f", &TABLE.av_mark);

puts("\n======= Varient field of structure ============");

printf("\n Name: %s\n Surname: %s\n \

Specialisation: %s\n Age: %d\n Average mark: %0.2f\n ", \ PTR->name, PTR->surname, PTR->ACOUY, PTR->age, PTR->av_mark ); puts("\n================================================\n"); if ( fopen_s(&fid, "D:\\data12.dat", "wb") )

{printf("\n File could not be opened\n"); printf("\n Press any key: ");

_getch(); return -1; }

//Пакетная запись в двоичный файл fwrite(PTR, sizeof(struct stud), 1, fid);

fclose(fid);

//if ( fopen_s(&fid, "D:\\data12.dat", "rb") ) //{printf("\n File could not be opened\n"); //printf("\n Press any key: ");

//_getch(); return -1; }

// Чтение из двоичного файла

//fread(PTR, sizeof(struct stud), 1, fid); //puts("\n===== Variants of fields of structure =====");

//printf("\n Name: %s\n Surname: %s\n \

//Specialisation: %s\n Age: %d\n Average mark: %1.2f\n ", \

//PTR->name, PTR->surname, PTR->ACOUY, PTR->age, PTR->av_mark );

//puts("\n===============================================\n");

//fclose(fid);

printf("\n\n Press any key: "); _getch();

return 0;

}

Форматы записи в двоичный файл и чтения из него выглядят так: fwrite(PTR, sizeof(struct stud), 1, fid);

fread(PTR, sizeof(struct stud), 1, fid);

В функции fwrite() первый параметр PTR определяет содержимое структуры (данных в других случаях), которое по указателю на файл *fid записывается в файл. Второй параметр sizeof(struct stud) определяет размер структуры в байтах. Третий параметр 1 – это количество блоков, которое будет

230

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