- •Лабораторная работа № 1
- •Далее создадим файл:
- •Задания1
- •Лабораторная работа № 2
- •Консольный ввод-вывод
- •Чтение и запись символов
- •Чтение и запись строк
- •Форматированный консольный ввод-вывод
- •Форматированный вывод
- •Форматированный ввод
- •7. Варианты задания
- •Лабораторная работа № 3
- •5.2 Оператор if
- •Лабораторная работа № 4
- •Содержание отчета
- •Постановка задачи.
- •Общие сведения
- •Лабораторная работа № 5
- •Оператор for
- •Вариации цикла for
- •Бесконечный цикл
- •Циклы for без тела
- •Задание 2. Циклический вычислительный процесс конечные суммы и произведения
- •Лабораторная работа № 6
- •Оператор цикла while
- •Оператор do … while
- •Оператор break
- •Оператор continue
- •Лабораторная работа № 7
- •5.1 Одномерный массив
- •Создание указателя на массив
- •5.3 Индексация с помощью указателей
- •Сортировка
- •Методические указания.
- •Лабораторная работа № 8
- •Двухмерные массивы
- •Лабораторная работа № 9
- •Лабораторная работа № 11
- •Задача 2. Параметры функции
- •Лабораторная работа № 12
- •Варианты заданий
- •Лабораторная работа № 13
- •Некоторые операции над матрицами
- •Методические указания
- •Варианты заданий
- •Лабораторная работа № 14
- •Решение уравнения методом деления отрезка пополам (бисекций)
- •Методические указания
- •Лабораторная работа № 15
- •Вычисление определенного интеграла
- •6.2.1 Метод средних прямоугольников
- •6.2.1 Метод трапеций
- •Методические указания
- •Варианты заданий
- •Лабораторная работа № 10
- •Структуры (struct)
- •Лабораторная работа № 16
- •Директива #include
- •7. Методические указания
- •8. Варианты заданий.
- •Лабораторная работа № 17
- •Указатель на файл
- •Открытие файла
- •Перенаправление потока
- •Чтение из потока и запись в поток
- •Закрытие потока
- •Использование функций feof() и ferror()
- •Варианты заданий
- •Лабораторная работа № 18
- •Функции обработки символов
- •Функции обработки строк
- •Варианты заданий
- •Лабораторная работа № 19
- •Структуры
- •6.1.1 Доступ к элементам структуры
- •6.1.2 Присваивание структур
- •Массивы структур
- •Передача структур в функции
- •Передача членов структур в функции
- •Передача всей структуры в функцию
- •Указатели на структуры
- •Объявление указателя на структуру
- •Использование указателей на структуру
- •Массивы и структуры в структурах
- •Функции fread () и fwrite ()
- •Варианты заданий
- •Лабораторная работа № 20
- •Например, формула
- •Задание на программирование
Указатели на структуры
Объявление указателя на структуру
Указатели на структуру объявляются путем помещения оператора * перед именем структурной переменной. Например, предполагая, что ранее была определена структура addr, следующая строка объявляет addr_ptr как указатель на данные этого типа:
struct addr *addr_ptr ;
Использование указателей на структуру
Для получения адреса структурной переменной следует поместить оператор & перед именем структуры. Пусть имеется следующий фрагмент:
struct bal {
float balance;
char name[80];
} person;
struct bal p; /* объявление указателя на структуру */
тогда
p = &person;
помещает адрес структуры person в указатель р.
Для доступа к элементам структуры с помощью указателя на структуру следует использовать оператор «стрелка». Оператор «стрелка» (->) образован из знака «минус» и символа «больше». Например, для доступа к элементу balance с помощью указателя р следует написать
p>balance .
Массивы и структуры в структурах
Элемент структуры может быть как простым, так и составным. Простой элемент – это обычный базовый тип данных, например, целочисленный или символьный. Символьный массив, использованный в ainfo, – типичный пример. Другие типы данных являются одномерными или многомерными массивами различных типов данных и структур.
Рассмотрим следующую структуру:
struct x {
int a[10][10]; /* массив целых 10 на 10 */
float b;
} y;
Для обращения к числу с индексами 3, 7 массива а структуры у следует написать:
y.a [3][7];
Когда структура является элементом другой структуры, то она называется вложенной структурой. Например, ниже структура addr вложена в структуру emp:
struct emp {
struct addr address;
float wage;
} worker;
Здесь структура emp имеет два элемента. Первый – это структура типа addr, содержащая адреса служащих. Другой – это wage, содержащий заработную плату служащих. Следующий фрагмент кода присваивает значение 25000 элементу wage структуры worker и значение 97675 полю zip структуры address:
worker.wage = 25000.00;
worker.address.zip = 97675;
В этом примере обращение к элементам каждой структуры происходит снаружи вовнутрь (слева направо).
Функции fread () и fwrite ()
Файловая система языка С предоставляет две функции, позволяющие читать и писать блоки данных – fread() и fwrite (). Они имеют следующие прототипы:
size_t fread (void *буфер, size_t число_байт, size_t размер, FILE *fp);
size_t fwrite (const void *буфер, size_t число_байт, size_t размер, FILE *fp);
В случае fread() буфер – это указатель на область памяти, которая получает данные из файла. В случае fwrite() буфер – это указатель на информацию, записываемую в файл. Буфер может быть ( а чаще всего это так и есть) простой переменной. Длина каждого элемента в байтах определяется в число_байт. Аргумент объем определяет, сколько элементов (каждый длиной число_байт) будет прочитано или записано. Наконец, fp – это указатель на ранее открытый файл.
Функция fread() возвращает число прочитанных элементов. Данное значение может быть меньше чем объем, если был достигнут конец файла или произошла ошибка. Функция fwrite() возвращает число записанных элементов. Данное значение равно объем, если не произошла ошибка.
Если файл был открыт для двоичных данных, то fread() и fwrite() могут читать и писать любой тип данных. Одно из самых наиболее полезных применений fread() и fwrite() – это чтение и запись блоков данных типа массивов и структур. Например, следующий программа записывает содержимое структуры book в файл books.dat, используя один оператор fwrite(). Далее она читает эту структуру, используя один оператор fread(), и выводит значения элементов структуры.
#include <stdio.h>
struct books_type {
char avtor[20];
char nazv[40];
char izd[20];
char year[4];
int num_str;
};
int main (void)
{
register int i;
struct books_type book;
FILE *fp;
/* открытие файла на запись */
if ((fp = fopen(“books.dat”, “wb”)) = = NULL) {
printf(“Не могу открыть файл!”);
return 1;
}
book.avtor = “Шилдт Г.”;
book.nazv = “Программирование на Borland C++”;
book.izd = “ООО «Попурри»”;
book.year = 1998;
book.num_str = 800;
/* запись структуры в файл */
fwrite(book, sizeof book, 1, fp);
fclose(fp);
/* открытие файла для чтения */
if ((fp = fopen(“books.dat”, “rb”)) = = NULL) {
printf(“Не могу открыть файл!”);
return 1;
}
/* чтение структуры из файла */
fread(book, sizeof book, 1, fp);
/* вывод содержимого структуры на экран */
printf(“ Автор книги: %s\n”, book.avtor);
printf(“Название книги: %s\n”, book.nazv);
printf(“ Издательство: %s\n”, book.izd);
printf(“ Год издания: %s\n”, book.year);
printf(“ Число страниц: %s\n”, book.num_str);
fclose(fp);
return 0;
}