- •Тема 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.Алгоритм расчета резервов времени
- •Расчет резервов времени
- •Вопросы для повторения
Вопросы для повторения
Стандарты языка Си (С89 или ANSI C, С90, С99)
Понятие интерпретатора
Достоинства и недостатки интерпретаторов
Понятие компилятора
Достоинства и недостатки компиляторов
Понятие интерпретатора компилирующего типа.
Достоинства и недостатки интерпретаторов компилирующего типа.
К какому классу относится язык Си?
Понятие интегрированной среды разработки программ
Состав типовой интегрированной среды разработки программ
Понятие языка программирования с сильной типизацией
Преимущества языков программирования с сильной типизацией
Структура Си программы
Назначение заголовочных файлов и файлов реализации.
Понятие препроцессора. Назначение препроцессора.
Резюме по теме
В данной теме рассмотрены история развития и основные особенности языка Си.
Тема 3. Основы языка Си
Цели и задачи изучения темы
В данной теме рассматриваются основы языка Си.
3.1. Данные (сведения необходимые для начала работы)
Чтобы реализовать алгоритм, программам необходимо работать с данными - числами, символами и другими объектами содержащими обрабатываемую информацию.
3.1.1.Константы и переменные
Некоторые данные устанавливаются равными определенным значениям еще до того, как программа начинает выполняться, а после ее запуска такие значения сохраняются неизменными на всем протяжении работы программ. Эти данные называются константами.
Для задания символических имен констант в Си очень часто используется директива препроцессора #define. Так, строка #define PI 3.14159265 задает символическое имя PI для константы 3.14159265. После этого имя PI можно использовать вместо числового значения. Препроцессор находит все вхождения слова PI в текст и заменяет их на константу.
Данные, которые могут изменяться, или же им могут быть присвоены значения во время выполнения программы, называются переменными.
3.1.2.Основные типы данных
Кроме различия между переменными и константами существует еще различие между типами данных. Некоторые данные в программе являются числами, некоторые - символами. Компилятор должен уметь идентифицировать и обрабатывать данные любого типа.
Термины тип данных (или просто тип) переменной обозначает множество значений, которые может принимать эта переменная. Набор базовых типов данных отличается в различных языках.
В языке Си предусмотрено использование нескольких основных типов данных. Если величина есть константа, то компилятор может распознать ее тип только по тому виду, в котором она присутствует в программе. В случае переменной необходимо, чтобы ее тип был объявлен в операторе описания. В стандарте языка Си используется семь ключевых слов, указывающих на различные типы данных:
int
long
short
unsigned
char
float
double
Первые четыре ключевых слова используются для представления целых чисел. Если требуются только целые неотрицательные значения, то использовать ключевое слово unsigned перед соответствующим ключевым словом, например, unsigned int.
float, double используются для представления чисел с десятичной точкой.
При описании переменной сначала указывается тип, затем - имя переменной или список имен, разделенных запятыми, например,
int x;
int y, z, t;
При описании переменных можно присваивать им начальные значения:
int maxind = 1000;
int a = 5, b = 7;
Тип также определяет, сколько памяти занимает переменная этого типа. Для различных ЭВМ число байт памяти отводимое под переменные одного типа может различаться. Для определения того числа служит функция sizeof(). Пример использования данной функции:
/*
Пример 3
Определяет сколько байт памяти занимают переменные
различных типов
*/
#include <stdio.h>
#include <stdlib.h>
int main(void) {
printf("int - %d ,байт \n",sizeof(int));
printf("long - %d ,байт \n",sizeof(long));
printf("short - %d ,байт \n",sizeof(short));
printf("unsigned - %d ,байт \n",sizeof(unsigned));
printf("char - %d ,байт \n",sizeof(char));
printf("float - %d ,байт \n",sizeof(float));
printf("double - %d ,байт \n",sizeof(double));
return EXIT_SUCCESS;
}
Резулитат выполнения программы:
int - 4 ,байт
long - 4 ,байт
short - 2 ,байт
unsigned - 4 ,байт
char - 1 ,байт
float - 4 ,байт
double - 8 ,байт
Размер памяти, занимаемой переменной некоторого типа определить диапазон значений этой переменной.
В таблице 3.1 перечислены диапазоны значений простейших типов данных.
Таблица 3.1
Диапазоны значений простейших типов данных.
Тип |
Диапазон значений |
char |
от -128 до +127 |
unsigned char |
от 0 до 255 |
short |
от -32768 до +32767 |
unsigned short |
от 0 до 65535 |
int |
от – 2147483648 до + 2147483647 |
unsigned int (или просто unsigned) |
от 0 до 4294967295 |
long |
от – 2147483648 до + 2147483647 |
unsigned long |
от 0 до 4294967295 |
float |
от ±3.4e-38 до ±3.4e+38 (7 значащих цифр) |
double |
от ±1.7e-308 до ±1.7e+308 (15 значащих цифр) |
В рассмотренном примере программы встретилось слово void, которое означает "пустота". Тип void в Си обозначает отсутствие чего-либо там, где обычно предполагается описание типа. Например, функция int main(void), не принимает никакого значения.