Ввод из файла. Средства препроцессора. Структура – новый тип данных. Рекурсия. Быстрая сортировка, страница 2

Директивы препроцессора начинаются на  #  и  служат   для предварительного преобразования исходного текста программы перед компиляцией. Производятся текстовые преобразования без анализа синтаксиса языка.

Так строка  вида  (include – англ. включить)

        #include "filename" -  поиск в текущем каталоге, затем в каталогах указанных компилятору

        #include <filename> - поиск в указанных компилятору каталогах, ! но не в текущем каталоге,

заменяется полным содержимым файла с именем filename. (Кавычки  обязательны). Допускается вложенность  конструкций   #include.

В начале программ на языке С Вы встречаете строчку:

#include <stdio.h>

Препроцессор вместо этой строки вставит текст из файла stdio.h . Текст вставляется в начало программы (to thehead of the program), поэтому подобные файлы имеют расширение .h и называются заголовочными (head). Увеличенный текст программы попадет на Компиляцию.

Строки вида  (define  англ. определить )

#define NO 0                  

#define YES 1

-приведут к замене (макроподстановке) по всему тексту (кроме текстовых строк) имен YES и NO на 1 и 0. Так вводятся в Си именованные константы

Программа  Dc_5.c  считает слова в тексте, определяя слова по их началу. Когда слово начинается, то происходит переход от пробела к букве (цифре). Это изменение (переход от пробела к букве) и отслеживается.

6)  программа  Dc_6.c

Вводится макроопределение print

               #define print(str, var)   printf("%s = %.0f \n", str, var);

Макроопределение имеет вид функции с аргументами , но это – «макрос» с аргументами.. Там, где в тексте встречается обращение f(STROKA, VARIAB) ;     произойдет текстовая замена по шаблону определенному директивой #defineи получится выражение

printf("%s = %.0f \n", STROKA, VARIAB);

Именно это выражение и попадет на компиляцию.

7)  программа  Dc_7.c

Создается новый тип данных – date. Объекты типа date являются не переменными не массивами, а структурами.

В структуре могут храниться разнородные данные ( разного типа)

structdate                            date  - это название нового типа данных

{

intmonth;                         - члены (элементы, поля) структуры

intday;

intyear;

   char * name;

};                                          при определении нового типа должна быть    ;

structdatedate1,  *date_point;   - создание объекта типа date (выделение под него памяти) в C,

                                                    создание указателя для такого типа

   date1.day=5;                       так можно напрямую обратиться к члену структуры

   date_point = &date1;          указатель можно направить на определенный объект

   (*date_point).year = 1938;   так можно обратиться к члену структуры через указатель

8)  программа  Dc_8.c

Си допускает рекурсивное определение функции – функции, содержащей обращение к самой себе.

Задача демонстрирует это на примере подсчета факториала числа.

Факториал числа вводится как

   N!   = 1 * 2 * … * N

Или факториал числа вводят, используя его свойство:   N!  =  (N – 1)!  * N

Именно это и позволяет определить факториал рекурсивно:

                     1                     ,  N = 1

   N !   = 

                    (N – 1)!  * N     , N > 1

При написании рекурсивной функции следует быть внимательным, чтобы функция всегда заканчивала работу.

Для этого следует смотреть, чтобы в функции был бы параметр, который

  • уменьшается (увеличивается) с каждым рекурсивным вызовом
  • не может уменьшаться (увеличиваться) до бесконечности
  • уменьшение (увеличение) параметра всегда приводит к одному из крайних значений
  • значение  функции при крайних значениях параметра известно либо легко вычисляется

Задание (учебное):  

Требуется решить задачу 2300.

Требуется решить задачу 2301. – прочитайте файл «Задание С3»

Задание (проверочное):  

Требуется решить несколько задач.

Эти задания – последовательные шаги простейшей реализации алгоритма «Быстрой сортировки». – задачи, 2302, 2303, 2304

В начале хорошо Отладьте свои решения, а затем отправьте

исходные файлы решений   сетевой тестирующей системе.

Что необходимо знать:

1.  Ввод со стандартного устройства в С

2.  Ввод из файла в С

3.  Вывод в файл в С

4.  Функция kbhit( )

5.  Расширенные коды ASCII – клавиатуры

6.  Структура

7.  Рекурсия

Вопросы для «продвинутых»

-  Что в Лабораторной работе написано не правильно?

-  Что в Лабораторной работе написано плохо?

-  Что в Лабораторной работе пропущено и следует добавить?