- •6.080401 «Інформаційні управляючи системи і технології» 6.080402 «Інформаційні технології проектування»
- •1. Структура та обсяг дисципліни
- •2. Основи програмування на мові с
- •2.1 Найпростіші конструкції мови
- •2.2 Типи даних
- •2.4 Операції мови с
- •2.5 Структура простої с програми
- •2.6 Організація введення-виведення
- •2.7 Компіляція в системі Linux
- •2.8 Організація розгалужень в програмі
- •2.9 Організація циклів
- •2.10 Оператор break
- •2.11 Оператор continue
- •2.11 Масиви
- •2.12 Функції
- •2.13 Рекурсивні функції
- •2.14 Читання і запис текстових файлів
- •2.15 Структури даних
- •3. Операційні системи
- •3.1. Поняття операційної системи
- •3.1.1 Призначення операційної системи
- •3.1.2 Операційна система як розширена машина
- •3.1.3 Операційна система як розподілювач ресурсів
- •3.2 Класифікація сучасних операційних систем
- •4 Архітектура операційних систем
- •4.1 Базові поняття архітектури операційних систем
- •4.1.1 Ядро системи. Привілейований режим і режим користувача
- •4.2 Реалізація архітектури операційних систем
- •4.2.1 Монолітні системи
- •4.2.2 Багаторівневі системи
- •4.3 Системи з мікроядром
- •4.4 Концепція віртуальних машин
- •5. Підтримка програмування в oc unix.
- •5.1. Вивчення передачі інформації
- •5.2. Змінні оточення
- •5.3. Обробка помилок
- •5.4. Правила формування і засоби розбору командних рядків
- •6. Логічна організація файлових систем
- •6. 1. Поняття файла і файлової системи
- •6.1.1. Поняття файла
- •6.1.2. Поняття файлової системи
- •6.1.3. Типи файлів
- •6.1.4. Імена файлів
- •6. 2. Організація інформації у файловій системі
- •6.2.1. Розділи
- •6.2.2. Каталоги
- •6.2.3. Зв’язок розділів і структури каталогів
- •6. 3. Зв’язки
- •6. 3. 1. Жорсткі зв’язки
- •6. 3. 2. Символічні зв’язки
- •6. 4. Атрибути файлів
- •6. 5. Операції над файлами і каталогами
- •6. 5. 1. Підходи до використання файлів процесами
- •6. 5. 2. Загальні відомості про файлові операції
- •7. Файлові операції posix
- •7.1. Відкриття і створення файлів
- •7.2. Закриття файла
- •7.3. Читання і записування даних
- •7.4. Збирання інформації про атрибути файла
- •7.5 Операції над каталогами
- •Література
2.13 Рекурсивні функції
Рекурсія - це такий спосіб організації обчислювального процесу, при якому підпрограма в ході виконання складових її операторів звертається сама до себе.
Розглянемо класичний приклад - обчислення факторіалу: програма запрошує з клавіатури ціле число n і обчислює його факторіал.
При виконанні правильно організованої рекурсивної функції здійснюється багатократний перехід від деякого поточного рівня організації алгоритму до нижнього рівня послідовно до тих пір, поки, нарешті, не буде одержане тривіальне рішення поставленої задачі.
int factr(int n)
{
int answer;
if(n==1)
return (1);
answer=factr(n-1)*n;
return (answer);
}
Основною перевагою рекурсивних функцій є використання їх для простішого створення версії деяких алгоритмів в порівнянні з ітеративними еквівалентами. Наприклад, сортуючий алгоритм Quick sort достатньо важко реалізувати ітеративним способом. Деякі проблеми, особливо пов'язані з штучним інтелектом, також використовують рекурсивні алгоритми. Нарешті, деяким людям здається, що думати рекурсивно набагато легше, ніж ітеративно.
При написанні рекурсивних функцій слід мати оператора if, щоб примусити функцію повернутися без рекурсивного виклику. Якщо цього не зробити, то, одного разу викликавши функцію, вийти з неї буде неможливо. Це найбільш типова помилка, пов'язана з написанням рекурсивних функцій.
2.14 Читання і запис текстових файлів
Для тривалого зберігання даних, введених користувачем, можна використовувати два підходи: зберігати дані у файлах даних або використовувати для цих цілей бази даних. Предметом нашого розгляду буде читання і запис текстових файлів.
Перед роботою з файлом його потрібно відкрити. Це можна зробити за допомогою функції fopen():
FILE *fopen(const char *filename,const char *mode)
Функція fopen() відкриває існуючий файл або створює новий. У разі успіху вона повертає покажчик потоку, який повинен бути оголошений до цього, запам'ятав в змінній для використання іншими функціями. У разі помилки функція повертає нуль. Розглянемо параметри цієї функції:
const char *filename - покажчик на рядок імені файлу. Може містити повний шлях до файлу.
const char *mode - покажчик на один з можливих режимів, розглянутих нижче.
Таблица 2
Режим |
Опис |
rt |
Відкриває файл для читання |
wt |
Створює новий файл. У випадку, якщо файл з таким ім'ям вже існує, то він буде перезаписаний
|
at |
Відриває файл в режимі додавання інформації |
r+t |
Відкриває існуючий файл для читання і запису |
w+t |
Створює новий файл для читання і запису. Якщо файл з таким ім'ям вже існує, то він буде перезаписаний |
a+t |
Відкриває існуючий файл або створює новий в режимі додавання інформації |
Параметр, задаючий режим, при виклику функції fopen() потрібно брати в подвійні лапки.
Нижче приведений фрагмент коду для створення файлу dat1.txt:
FILE *fp;
fp=fopen(“dat1.txt”,”wt”);
if(fp==NULL)
{
printf(“Неможливо створити файл”);
exit(1);
}
Розглянута в даному прикладі функція exit() використовується для припинення роботи програми при виникненні помилки.
Якщо до exit() звернулися з функції, викликаною головною програмою, то припиняє роботу вся програма, а не тільки ця функція. Приємна особливість цієї функції полягає в тому, що вона закриває будь-які файли, відкриті функцією fopen().
Аргументом функції exit() є номер коду помилки. У некоторsх системах він може передавться іншій програмі, якщо початкова припинила роботу.
Існує угода, що 0 - нормальне завершення, тоді як будь-яке інше значення свідчить про помилку.
Розглянемо деякі основні функції для роботи з файлами.
fgetc()
Функція fgetc() призначена для посимвольного читання з файлу. У разі успіху повертає лічений символ. Досягши кінця файлу або у разі помилки повертає EOF.
Далі приведений приклад програми, яка прочитує і відображає на екран вміст текстового файлу.
#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
void main(void0
{
FILE *fp;
char з;
fp=fopen(“dat1.txt”,”rt”);
if(fp==NULL)
{
printf(“Неможливо відкрити файл”);
exit(1);
}
while((c=fgetc(fp))!=EOF)
printf(“%c”,c);
fclose(fp);
getch();
}
fgets()
Формат функції:
char *fgets(char *str,int num,FILE *stream)
Функція fgets() прочитує до num-1 символів з файлу stream і поміщає їх в масив символів, на який указує str. Символи прочитуються до тих пір, поки не зустрінеться символ “новий рядок”, EOF. У разі успіху fgets() повертає рядок, при невдачі повертається NULL.
Приведений нижче фрагмент коду по строках прочитує вміст текстового файлу.FILE *fp;
char str[256];
fp=fopen(“dat1.txt”,”rt”);
if(fp==NULL)
{
printf(“Невозможно открыть файл”);
exit(1);
}
while(fgets(str,256,fp)!=NULL)
puts(str);
fclose(fp);
fputc()
Функція fputc() здійснює запис одного символу у відкритий файл в позицію, відповідну поточному положенню покажчика. Потім дає приріст покажчику. Повертає значення записаного символу. У разі помилки повертає EOF. Наприклад:
FILE *fp;
char c=’A’;
fputc(с,fp);
fputs()
Функція fputs() записує рядок, заданий першим аргументом у файл. У разі помилки повертає EOF