- •Тема 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.Алгоритм расчета резервов времени
- •Расчет резервов времени
- •Вопросы для повторения
2.2.3.Сильная типизация
Язык Си можно отнести к языкам программирования, поддерживающих сильную типизацию. Язык программирования является языком программирования с сильной типизацией, если:
каждый объект в этом языке программирования принадлежит точно одному из существующих в этом языке программирования типу данных;
преобразование типов осуществляется только путем преобразования значения из одного типа в другой;
преобразование типов не производится путем трактовки представления значения как данных различных типов.
Практика программирования показала, что языки программирования с сильной типизацией способствуют увеличению ясности и надежности программ.
В языке Си допускается неявное преобразование типов. Однако транслятор с языка Си выводит предупреждение о каждом встретившимся в программе случае неявного преобразования типов.
2.3.Структура простой программы
Программа на языке Си состоит из одной или более функций, причем какая-нибудь из них (главная) обязательно должна называться main(). Описание функции состоит из заголовка и тела. Заголовок состоит из директив препроцессора типа #include и имени функции. Отличительным признаком имени функции служат круглые скобки, при этом аргумент может отсутствовать. Тело функции заключено в фигурные скобки и представляет собой набор операторов, каждый из которых оканчивается символом "точка с запятой".
Пример простой программы осуществляющий перевод расстояния в метрах в расстояние в морских саженях и футах представлен ниже.
/*
Пример 1
Осуществляет перевод метров в морские сажени и футы.
1 морская сажень = 1.83 м;
1 фут = 30.5 см.
*/
#include <stdio.h>
#include <stdlib.h>
int main(void) {
float m,ft,fm;
setbuf(stdout, NULL);
printf("Введите расстояние в метрах: ");
scanf("%f",&m);
ft=m/0.305;
fm=m/1.83;
printf("В %f метров = %f морских саженей или %f футов.",m,fm,ft);
return EXIT_SUCCESS;
}
Данная программа состоит из единственной функции main. Перевод метров в морские сажени и футы имеет смысл оформить в виде отдельных функций. В этом случае текст программы будет следующий:
/*
Пример 2
Осуществляет перевод метров в морские сажени и футы.
*/
#include <stdio.h>
#include <stdlib.h>
float m_to_fm(float m){ // Переводит метры в морские сажени
return m/1.83; // 1 морская сажень = 1.83 м;
}
float m_to_ft(float m){ // Переводит метры в футы
return m/0.305; // 1 фут = 30.5 см.
}
int main(void) {
float m;
setbuf(stdout, NULL);
printf("Введите расстояние в метрах: ");
scanf("%f",&m);
printf("В %f метров = %f морских саженей или %f футов.",m,m_to_fm(m),m_to_ft(m));
return EXIT_SUCCESS;
}
Если программа (проект) большая, то она может состоять из нескольких файлов. Файлы, содержащие тексты Си-программы, называются исходными.
В языке Си исходные файлы бывают двух типов:
заголовочные, или h-файлы;
файлы реализации, или Cи-файлы.
Имена заголовочных файлов имеют расширение ".h". Имена файлов реализации имеют расширения ".c".
Заголовочные файлы содержат только описания (прототипы функций, имена и типы внешних переменных, константы, новые типы и т.п.). Другими словами h-файлы содержат лишь информацию о программах. Файлы реализации содержат сами программы.
Файлы реализации могут подключать описания, содержащиеся в заголовочных файлах. Сами заголовочные файлы также могут использовать другие заголовочные файлы.
Заголовочный файл подключается с помощью директивы препроцессора #include.
Препроцессор - это программа предварительной обработки текста непосредственно перед трансляцией. Препроцессор, как правило, является частью компилятора.
В рассмотренных примерах директивы #include <stdio.h> и #include <stdlib.h> были подключены заголовочные файлы стандартных библиотек. Если h-файл является частью стандартной Си-библиотеки и расположен в одном из системных каталогов, то его имя записывается в угловых скобках. Имена h-файлов, созданных самим программистом в рамках разрабатываемого проекта и расположенных в текущем каталоге, указываются в двойных кавычках, например, #include "abcd.h".