- •И.А. Васюткина основы алгоритмизации и программирования.
- •Содержание
- •1.Обзор языКа программирования с
- •2.Этапы создания программы
- •3.Структура программы на языке си
- •3.1. Внутренняя структура программы
- •3.2. Пример программы на си
- •4.Базовые элементы языка си
- •5.Данные в программе на си
- •5.1. Константы
- •5.2. Базовые стандартные типы переменных
- •6.2. Операции отношения
- •6.3. Логические операции
- •6.4. Операции с разрядами
- •6.5. Операции сдвига
- •6.6. Операция условия ?:
- •6.7. Преобразование типов
- •6.8. Операции приведения
- •6.9. Дополнительные операции присваивания
- •7.Операторы языка си
- •Оператор может быть простым и составным. Позволяет пропустить оператор или блок операторов, если условие ложно.
- •1.Схема выполнения оператора
- •8. Оператор множественного выбора
- •9. Операторы цикла while
- •8. Операторы безусловных переходов
- •8.Стандартные функции ввода и вывода
- •8.1. Функция вывода данных на экран printf ()
- •8.2. Модификаторы спецификаций преобразования
- •8.3. Функция ввода данных с клавиатуры sсanf()
- •8.4. Функции ввода/вывода одного символа getchar(), putchar()
- •8.5. Функции небуфиризированного ввода с клавиатуры
- •8.7. Форматирование вывода
- •Заключительная программа
- •9. Массивы
- •9.1. Одномерные массивы
- •Стандартные алгоритмы работы с одномерными массивами
- •Инициализация одномерных массивов
- •9.2. Многомерные массивы
- •Инициализация многомерных массивов
- •9.2.2 Стандартные алгоритмы работы с двумерными массивами
- •10. Функции
- •10.1.Cоздание и использование пользовательских функций
- •10.2.Параметры функции
- •10.3.Возвращение значения функцией
- •10.4.Inline-функции
- •10.5.Значение формальных параметров функции по умолчанию
- •10.6.Перегрузка функций
- •11. Классы памяти и область действия
- •11.1.Глобальные переменные
- •Extern - внешние переменные
- •Статистические внешние переменные - static
- •11.2.Локальные переменные
- •Внутренняя статическая переменная
- •Регистровая переменная
- •Автоматические переменные
- •11.3.Доступ к функциям в многомодульной программе
- •12. Препроцессор языка си
- •12.1. Подстановка имен
- •12.2.Включение файлов
- •12.3.Условная компиляция
- •13. Указатели
- •13.1.Операция косвенной адресации *
- •13.2. Описание указателей
- •13.3.Использование указателей для связи функций
- •13.4.Указатели на одномерные массивы
- •13.5.Указатели на многомерные массивы
- •13.6.Операции над указателями
- •13.7.Передача массива в качестве параметра в функцию
- •13.8.Указатель на void *
- •14. Символьные строки и функции над строками
- •14.1.Массивы символьных строк
- •14.2.Массивы указателей
- •14.3.Указатель как возвращаемое значение функции Передача указателя как параметра функции
- •14.4.Функции, работающие со строками Функции, определеные в заголовочном файле stdio.H
- •14.5. Стандартные библиотечные функции Функции, определеные в заголовочном файле string.H
- •14.6. Преобразование символьных строк
- •Функции, определеные в заголовочном файле ctype.H.
- •15. Ссылки
- •16. Параметры командной строки
- •17. Производные типы данных
- •17.1.Структуры
- •Массивы структур
- •Вложенные структуры
- •17.1.3 Указатели на структуры
- •Операции над структурами
- •Передача структуры в функцию
- •17.2.Объединения
- •17.3. Синоним имени типа
- •17.4.Определение именнованных констант
- •17.5.Перечисления
- •17.6.Битовые поля
- •18. Динамическое выделение памяти
- •2. Функция void* calloc(n,size type);
- •18.2.Операция new с массивами
- •18.3.Инициализаторы с операцией new
- •18.4.Ошибки при использовании динамичской памяти
- •19. Файл
- •19.1.Открытие файла fopen()
- •19.2.Закрытие файла fclose()
- •19.3.Функции ввода/вывода одного символа fgetc(), fputc()
- •19.4.Функции форматированного ввода/вывода в файл
- •Int fprintf(file *stream,”управл.Cтрока”,arg1,…)
- •Int fscanf(file *stream,”управл.Cтрока”,&arg1,…)
- •19.5. Функции ввода/вывода строки символов в файл
- •19.6.Функции управления указателем в файле
- •Int fseek(file *stream, смещение, start)
- •19.7.Ввод/вывод записей фиксированной длины
- •20. Динамические структуры данных
- •20.1.Однонаправленные связные списки
- •Вставка узла
- •Удаление узла из списка
- •20.2.Бинарные деревья
- •21. Размещение данных в памяти
- •22.Модели памяти
- •Список литературы
19.6.Функции управления указателем в файле
Функция позволяет работать с файлом как с массивом. Достигать любого байта.
Int fseek(file *stream, смещение, start)
Возвращает число типа int:
0 - если все хорошо;
-1 - ошибка.
Смещение – это количество байт на которое нужно сместить указатель по файлу с +(вперед), -(назад);
start - код начальной точки:
SEEK_SET или 0 – от начала файла;
SEEK_END или 2 – от конца файла;
SEEK_CUR или 1 – от текущего положения курсора.
fseek(in,0,0) - установить курсор на начало файла.
long int ftell(FILE *stream)- возвращает текущее положение курсора в файле.
19.7.Ввод/вывод записей фиксированной длины
Под записью фиксированной длины можно понимать размер элемента массива или структуры.
1. Чтение данных из двоичного файла.
int fread(void *ptr, size type, size n, FILE *stream)
void *ptr – адрес массива, куда записываются данные;
size type – размер типа в байтах;
size n – количество данных;
FILE *stream – указатель на файл.
void main(void){
struct STOK record;
FILE *in;
in=fopen("data", "r");
int n=fread(&record, sizeof(record), 1, in);
}
Возвращает число считанных записей или EOF.
void main(void){
float mas[100];
FILE *in;
In=fopen("data", "rb");
fread(mas, sizeof(mas), 1, in);
} //можно так - fread(mas, sizeof(float), 100, in);
2. запись данных в двоичный файл.
int fwrite(void *ptr, size type, size n, FILE *stream)
Возвращает число записанных байт.
void *ptr – адрес массива, куда записываются данные;
size type – размер типа в байтах;
size n – количество данных;
FILE *stream – указатель на файл.
fwrite(mas, sizeof(mas), 1, in);
Пример 1. Запись во временный файл и чтение из него в массив.
#include <stdio.h>
#include <stdlib.h>
void main(void) {
int array[100];
//создать временный файл
FILE *tempf=tmpfile();
if(!tempf) {
puts(“нельзя открыть временный файл”);
exit(1);
}
for(int index=0; index<100; index++)//пишем в файл
fwrite(array,sizeof(int),1,tempf);
rewind(tempf); //указатель вернуть на начало
fread(array,sizeof(int),100,tempf);
rmtmp(); //закрыть и уничтожить временный файл
}
Пример 2. Проверить конец файлового потока
void main(void) {
int buff[100];
FILE *fp;
fp=fopen(“prog.txt”,”r”);
if(!fp) {
puts(“нельзя открыть файл”);
}
else {
while(!feof(fp))
if(fgets(buff,100,fp)!=NULL)
fputs(buff,stdout);
fclose(fp);
}
}
20. Динамические структуры данных
Многие задачи программирования используют динамические структуры данных. Например, организация каталога книг в библиотеке. Нельзя заранее определить количество книг, числящихся в библиотечном фонде, так как идет постоянное поступление новых книг и списание старых. Для реализации таких задач существуют различные связные списки: однонаправленные, двунаправленные; бинарные деревья и т.д.
20.1.Однонаправленные связные списки
Элементы списка называются узлами. Узел представляет собой объект, содержащий в себе указатель на другой объект того же типа и данные. Очевидным способом реализации узла является структура:
s truct TelNum {
TelNum * next; //указатель на следующий элемент
long telephon; // данные
char name[30]; // данные
};
TelNum *temp = new TelNum; - создается новый узел.
Список представляет собой последовательность узлов, связанных указателями, содержащимися внутри узла. Узлы списка создаются динамически в программе по мере необходимости с помощью соответсвующих функций и располагаются в различных местах динамической памити. При уничтожении узла память обязательно освобождается.
Простейшим списком является линейный или однонаправленный список. Признаком конца списка является значение указателя на следующий элемент равное NULL. Для работы со списком должен существовать указатель на первый элемент - заголовок списка. Иногда удобно иметь и указатель на конец списка.
Указатель
заголовок
Основными операциями, производимыми со списками, являются обход, вставка и удаление узлов. Можно производить эти операции в начале списка, в середине и в конце.