
- •Предисловие
- •Контрольные вопросы
- •Библиографический список
- •Тема 2 Переменные и базовые типы данных языка с
- •Контрольные вопросы
- •Библиографический список
- •Тема3 Организация циклов в языке с
- •Контрольные вопросы
- •Библиографический список
- •Тема 4 Принятие решений. Условные операторы в языке с
- •Контрольные вопросы
- •Библиографический список
- •Тема 5 Числовые массивы в языке программирования с
- •Тип имя_массива[размер];
- •Тип имя_массива[размер1] [размер2];
- •Тип имя_массива[размер1] [размер2] [размерN];
- •Контрольные вопросы
- •Библиографический список
- •Тема 6 Символьные массивы в языке с. Работа со строками
- •Тип имя_массива[размер];
- •Тип имя_массива[размер1] [размер2];
- •Тип имя_массива[размер1] [размер2] [размерN];
- •Контрольные вопросы
- •Библиографический список
- •Тема 7 Указатели в языке программирования с
- •Int *ptr; // объявили указатель на целую переменную
- •Контрольные вопросы
- •Библиографический список
- •Тема 8 Указатели и массивы в языке с
- •Int data[7]; // обычный массив
- •Int *pd[7]; // массив указателей
- •Контрольные вопросы
- •Библиографический список
- •Тема 9 Динамическое распределение памяти в языке с
- •If (!ptr) // условие логического отрицания
- •If (!ptr) // условие логического отрицания
- •Контрольные вопросы
- •Библиографический список
- •Тема 10 Функции Общие сведения о функциях языка с
- •Fun(тип имя_перем1, тип имя_перем2, , тип имя_перем n)
- •Контрольные вопросы
- •Библиографический список
- •Тема 11 Указатели и функции в языке программирования с
- •Тип_возвращаемый_функцией(*имя_указателя_на_функцию)(аргументы);
- •Контрольные вопросы
- •Библиографический список
- •Тема 12 Файловый ввод/вывод в языке с
- •Контрольные вопросы
- •Библиографический список
- •Тема 13 Структуры – производные типы данных языка с
- •Int age; // возраст
- •Int age; // возраст
- •Int age; // возраст
- •Int age; // возраст
- •Int age; // возраст
- •Int age; // возраст
- •Контрольные вопросы
- •Библиографический список
- •Тема 14 Объединения и перечислимые типы в языке с
- •Контрольные вопросы
- •Библиографический список
- •Тема 15 Структуры и функции языка с
- •Контрольные вопросы
- •Библиографический список
- •Тема 16 Операции с разрядами (битами) в языке с
- •Контрольные вопросы
- •Библиографический список
- •Тема 17 Программы, состоящие из нескольких файлов, на языке с
- •Спецификатор extern
- •Спецификатор static
- •Спецификатор register
- •Спецификатор auto
- •Контрольные вопросы
- •Библиографический список
- •Тема 18 Рекурсивные алгоритмы и функции
- •Переместить (a, b);
- •Контрольные вопросы
- •Библиографический список
- •Тема 19 Препроцессор языка с
- •Директива #define
- •Директива #error
- •Директива #include
- •Директивы условной компиляции
- •2_ Я_последовательность операторов программного кода
- •3_ Я_последовательность операторов программного кода
- •Директива #line
- •Директива #pragma
- •Предопределенные символические константы
- •Макрос подтверждения assert
- •Контрольные вопросы
- •Библиографический список
- •Тема 20 Программы на языке с при использовании статически подключаемой библиотеки
- •Контрольные вопросы
- •Библиографический список
- •Тема 21 Использование аргументов командной строки в с
- •Контрольные вопросы
- •Контрольная работа № 2 Покупки в супермаркете
- •Приложение Управление конфигурациями проекта в Visual Studio 2010
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; }
|
В программе инициализация полей структуры выполнена с помощью оператора «–>». С подключением заголовочного файла <locale.h> и определением прототипа функции setlocale(LC_ALL,".1251") становится возможной поддержка русских шрифтов.
Р
езультат
выполнения программы представлен на
рис.13.3.
Рис.13.3. Пример вывода полей структуры на консоль
Задание3
В программу добавьте нумерацию полей структуры, например: 1) имя: и т.д.
В программу введите свои имя и фамилию, возраст и размер получаемой стипендии (если нет, то нуль). Значения новых полей выведите на консоль и в текстовый файл с именем compX.txt, где Х – номер компьютера, на котором выполняется лабораторная работа.
Инициализацию полей структуры выполните с помощью указателя.
Выполните предварительную инициализацию структуры, а затем смените значения полей.
Пример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; // средняя успеваемость };
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
Инициализацию структуры выполните с клавиатуры.
Предусмотрите массив структур ACOUY[N], где N – количество групп (например, N = 3).
Введите данные своей студенческой группы и предусмотрите вывод на консоль данных о себе.
Примените оператор 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);
// Копирование фамилии в распределенную память 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. Пример динамического создания карточки студента
Задание5
С клавиатуры введите данные о себе (буквами русского алфавита), выведите информацию на консоль и в текстовый файл с именем compX.txt, где Х – номер компьютера, на котором выполняется лабораторная работа.
Поменяйте операторы «стрелка» на операторы «точка» и наоборот.
Вместо указателей *NAME, *SURNAME примените массивы символов.
Предусмотрите нумерацию полей структуры, например: 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);
// Занесение имени в структуру 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 – это количество блоков, которое будет записываться в файл. При этом второй и третий параметры перемножаются, поэтому их можно поменять местами.
В программе чтение из двоичного файла закомментировано. Для корректной работы программы сделана условная инициализация полей структуры, чтобы прописать адрес структуры в памяти с данными.
В
озможный
вариант выполнения программы при записи
информации в двоичный файл представлен
на рис.13.6.
Рис.13.6. Вариант записи информации в двоичный файл
Р
езультат
выполнения программы после комментирования
программного кода с записью в файл и
снятия комментариев к программному
коду чтения из файла показан на рис. 13.7.
Рис.13.7. Результат чтения из двоичного файла
Задание6
Перезапишите информацию из файла data12.dat в двоичный файл с именем compX.txt, где Х – номер компьютера, на котором выполняется лабораторная работа. Символьные массивы полей структуры задайте с помощью указателей.
Запись данных произведите в двоичный файл с различными расширениями: .txt, .bin, .doc. Определите размеры этих файлов в байтах.
Напишите программу записи массива структур в двоичный файл и чтения из него всей структуры с выводом результатов на консоль.