- •Тема 1. Алгоритмы и программы 4
- •Тема 2. Характеристика языка Си 6
- •Тема 3. Основы языка Си 11
- •Тема 4.Работа с файлами 33
- •Тема 5.Распределение памяти 40
- •Тема 6. Методы организации данных в памяти эвм 43
- •Тема 7. Некоторые алгоритмы обработки данных 58
- •Тема 1. Алгоритмы и программы Цели и задачи изучения темы
- •1.1.Понятие алгоритма. Понятие программы. Способы записи алгоритмов.
- •1.2.Критерии качества программ
- •1.3.Низкоуровневые и высокоуровневые языки программирования
- •1.4.Принципы структурного программирования
- •Принципы структурного программирования.
- •2.2.Основные характеристики языка Си.
- •2.2.1.Достоинства языка Си
- •2.2.2.Компиляторы и интерпретаторы
- •2.2.3.Сильная типизация
- •2.3.Структура простой программы
- •Вопросы для повторения
- •3.1.2.Основные типы данных
- •3.1.3.Структуры данных
- •3.1.4.Оператор определения имени типа typedef
- •3.1.5.Массивы
- •3.1.6.Указатели
- •3.1.7.Указатели и массивы
- •3.1.8.Внешние и внутренние переменные
- •3.2.Стандартные функции ввода-вывода
- •3.3. Операции, операторы и выражения
- •3.3.1.Оператор присваивания
- •3.3.2.Арифметические операции
- •3.3.3.Операции увеличения и уменьшения
- •3.3.4.Операции сравнения
- •3.3.5.Логические операции
- •3.3.6.Побитовые логические операции
- •3.3.7.Операции сдвига
- •3.3.8.Операции "увеличить на", "домножить на" и т.П.
- •3.3.9.Операции с указателями. Указатели и массивы
- •3.3.10.Операция приведения типа
- •3.4.Управляющие конструкции
- •3.4.1.Фигурные скобки
- •3.4.2.Оператор выбора if и операция условия
- •3.4.3.Оператор множественного выбора switch
- •3.4.4.Оператор цикла while
- •3.4.5.Оператор цикла for
- •3.4.6.Оператор цикла do...While
- •3.5.Данные (более детальные сведения)
- •3.5.1.Структуры
- •3.5.2.Указатели и структуры
- •3.5.3.Структуры и оператор определения имени типа typedef
- •3.5.4.Строки
- •3.5.5.Матрицы и многомерные массивы
- •3.6.Пользовательские функции
- •3.6.1.Определение функций
- •3.6.2.Прототипы функций
- •3.6.3.Аргументы командной строки
- •Вопросы для повторения
- •4.2.Функция открытия файла fopen
- •4.3.Функции бинарного чтения и записи fread и fwrite
- •4.4.Функция закрытия файла fclose
- •4.5.Функции форматного чтения и записи fscanf и fprintf
- •4.6.Другие функции ввода-вывода
- •4.6.1.Функции посимвольного ввода-вывода
- •Int fgetc(file *f); - ввести один символ из файла f.
- •Int fputc(int c, file *f); - записать один символ в файл f.
- •4.6.2.Функции построкового ввода-вывода
- •Char *fgets(char *line,int size, file *f); - ввести строку из файла f.
- •Char *fputs(char *line, file *f); - записать строку в файл f.
- •4.6.3.Функции позиционирования в файле
- •Int fseek(file *f, long offset, int whence); - установить текущую позицию в файле f
- •Long ftell(file *f); - получить текущую позицию в файле f
- •Int feof(file *f); - проверить,достигнут ли конец файла f
- •Функция открытия файла fopen
- •Функции бинарного чтения и записи fread и fwrite
- •Функция закрытия файла fclose
- •5.2.Функции malloc и free
- •5.3.Выделение памяти под матрицы на этапе выполнения программы
- •Функции malloc и free.
- •6.2.Время выполнения программ
- •6.3.Списки
- •6.4.Реализация списков
- •6.5.Стеки
- •6.6.Реализация стеков
- •6.7.Очереди
- •6.8.Реализация очередей
- •6.9.Графы и деревья
- •6.10.Некоторые сд для хранения графов и деревьев
- •Матрица смежности графа, изображенного на рис.6.10
- •Матрица инцидентности графа, изображенного на рис.6.10
- •Матрица весов графа, изображенного на рис.6.11
- •Матрица смежности дерева, изображенного на рис.6.16
- •Вопросы для повторения
- •Реализация стеков.
- •Реализация очередей.
- •7.1.1.Поиск элемента в неупорядоченном массиве
- •7.1.2.Поиск элемента в упорядоченном массиве.
- •7.1.3.Фонетический поиск
- •7.2.Алгоритмы сортировки
- •7.2.1.Сортировка методом пузырька.
- •7.2.2.Сортировка вставками
- •7.2.3.Сортировка выбором
- •7.2.4.Пирамидальная сортировка
- •7.2.5.Быстрая сортировка
- •7.2.6.Сортировка слиянием
- •Этапы слияния файлов f1 и f2
- •7.3.Поиск на графах
- •7.3.1.Поиск в глубину
- •7.3.2.Поиск в ширину
- •7.4.Топологическая сортировка графа
- •7.5.Сетевое планирование
- •Информация о проекте
- •7.5.1.Алгоритм расчета наиболее ранних сроков наступления событий
- •7.5.2.Алгоритм расчета наиболее поздних сроков наступления событий
- •7.5.3.Алгоритм расчета резервов времени
- •Расчет резервов времени
- •Вопросы для повторения
4.4.Функция закрытия файла fclose
По окончании работы с файлом его надо обязательно закрыть. Система обычно запрещает полный доступ к файлу до тех пор, пока он не закрыт. Кроме того, информация реально записывается полностью в файл лишь в момент его закрытия. До этого она может содержаться в оперативной памяти, что ускоряет работу с файлами.
Для закрытия файла используется функция fclose с прототипом
int fclose(FILE *f);
В случае успеха функция fclose возвращает ноль, при ошибке - константу конец файла EOF, определенную в системных заголовочных файлах как минус единица. Причину ошибки можно узнать с помощью функции perror. Пример использования функции fclose:
FILE *f;
f = fopen("tmp.res", "wb"); // Открываем файл "tmp.res"
if (f == 0) { // При ошибке открытия файла печатаем сообщение об ошибке
perror("Не могу открыть файл для записи");
exit(1); // завершаем работу программы с кодом 1
}
. . .
// Закрываем файл
if (fclose(f) < 0) { // При ошибке закрытия файла печатаем сообщение об ошибке
perror("Ошибка при закрытии файла");
}
4.5.Функции форматного чтения и записи fscanf и fprintf
В отличие от функции бинарного ввода fread, которая вводит байты из файла без всякого преобразования непосредственно в память компьютера, функция форматного ввода fscanf предназначена для ввода информации с преобразованием ее из текстового представления в бинарное. Пусть информация записана в текстовом файле. Функция fscanf читает информацию из текстового файла и преобразует ее во внутреннее представление данных в памяти компьютера. Информация о количестве читаемых элементов, их типах и особенностях представления задается с помощью формата. Форматы, используемые функцией fscanf, аналогичны форматам, применяемым функцией scanf. Функция fscanf возвращает число успешно введенных элементов. Если fscanf делает попытку чтения в конце файла, то возвращается EOF.
Прототип функции fscanf выглядит следующим образом:
int fscanf(FILE *f, const char *format, ...);
Многоточие здесь означает, что функция имеет переменное число аргументов. Несколько примеров использования функции fscanf:
. . .
int n, m; double a; char c; char str[256];
FILE *f;
. . .
fscanf(f, "%d", &n); // Ввод целого числа
fscanf(f, "%lf", &a); // Ввод вещественного числа
fscanf(f, "%c", &c); // Ввод одного символа
fscanf(f, "%s", str); // Ввод строки
fscanf(f, "%d%d", &n, &m); // Ввод двух целых чисел
Функция fprintf используется для форматного вывода в текстовый файл. Данные при выводе преобразуются в их текстовое представление в соответствии с форматной строкой. Ее отличие от форматной строки, используемой в функции ввода fscanf, заключается в том, что она может содержать не только форматы для преобразования данных, но и обычные символы, которые записываются без преобразования в файл. Форматы аналогичны форматам, используемым функцией prinf. Функция fprintf возвращает число выведенных байт. При появлении ошибки возвращает EOF.
Прототип функции fprintf выглядит следующим образом:
int fprinf(FILE *f, const char *format, ...);
Многоточие, как и в случае функции fscanf, означает, что функция имеет переменное число аргументов. Для примера рассмотрим небольшую программу, выводящую данные в файл "tmp.dat":
#include <stdio.h> // Описания функций ввода вывода
#include <math.h> // Описания математических функций
#include <string.h> // Описания функций работы со строками
int main() {
int n = 4, m = 6; double x = 2.;
char str[256] = "Print test";
FILE *f = fopen("tmp.dat", "wt"); // Открыть файл для записи
if (f == 0) {
perror("Не могу открыть файл для записи");
return 1; // Завершить программу с кодом ошибки
}
fprintf(f, "n=%d, m=%d\n", m, n);
fprintf(f, "x=%.4lf, sqrt(x)=%.4lf\n", x, sqrt(x));
fprintf(f, "Строка \"%s\" содержит %d символов.\n",str, strlen(str));
fclose(f); // Закрыть файл
return 0; // Успешное завершение программы
}
В результате выполнения этой программы в файл "tmp.dat" будет записан следующий текст:
n=6, m=4
x=2.0000, sqrt(x)=1.4142
Строка "Print test" содержит 10 символов.
В последнем примере форматная строка содержит внутри себя двойные апострофы. Это специальные символы, ограничивающие строки, поэтому внутри строки их надо защищать от интерпретации как специальных символов с помощью обратной косой черты \. Отметим также, что в примере используется стандартная функция sqrt, вычисляющей квадратный корень числа, и стандартной функцией strlen, вычисляющей длину строки. Описание функции sqrt находится в файле math.h. Описание функции strlen находится в файле <string.h>