Пример 14. Написать рекурсивную функцию определения наибольшего общего делителя двух целых чисел.

Программный код решения примера:

#include <stdio. h>

#include <conio. h>

#include <stdlib.h>

// Прототип рекурсивной функции

int gcd(int a, int b);

int main (void) {

int a = 0,

b = 0,

in;

// Проверка ввода двух целых чисел

do {

printf("\n Enter the two different natural numbers, through the gap: ");

in = scanf_s("%d%d", &a, &b);

if (in!= 2)

{

printf("\n Error input. Press any key to exit: ");

_getch();

exit(1);

}

if ( (a!= b) && (b!= 0) )

break;

if (b == 0)

a = b;

} while ( (a == b) );

// Вывод результата на консоль

printf("\n a = %d, b = %d, GCD = %d; \n", a, b, gcd(a, b));

printf("\n\n Press any key: ");

_getch();

return 0;

}

// Определение рекурсивной функции

int gcd(int a, int b)

{

if ( (a % b) == 0)

return b;

else

return gcd(b, a % b);

}

Решение примера выполнено на основе простой хвостовой рекурсии, поскольку значения вызовов функции самой себя gcd(ba % b) возвращаются оператором return. Известно, что если даны два числа А и В, то максимальный остаток от деления числа А на число В будет на единицу меньше числа В. В определении рекурсивной функции gcd() условием останова является то, что остаток от деления двух данных чисел равен нулю. Рекурсивные вызовы функции gcd() связаны с изменением расположения первоначально заданных аргументов, когда аргумент, стоящий на втором месте (b), будет на первом, а на втором месте определяется операция остатка от деления, т. е. a%b. И это происходит до тех пор, пока остаток от деления не станет равным нулю, т. е. выполнится условие останова (базовое условие).

НЕ нашли? Не то? Что вы ищете?

Возможный результат выполнения программы приведен на рис. 14.1.


Рис. 14.1. Наибольший общий делитель для чисел 123 и 45

15. Препроцессор языка С

Препроцессор (англ. preprocessor) – программа, выполняющая предварительную обработку входных данных для другой программы. Препроцессор языка программирования С просматривает программу до компилятора и заменяет в ней определенные сочетания символов (символические аббревиатуры) на соответствующие директивы. Он отыскивает и подключает к программе необходимые файлы и может изменить условия компиляции. Препроцессор имеет тот же смысл, что и буферный процессор.

Препроцессор языка С выполняет макроподстановку, условную компиляцию и включение именованных файлов. Строки, начинающиеся со знака # (перед которыми разрешены символы пустого пространства), задают препроцессору инструкции-директивы. Их синтаксис не зависит от остальной части языка, они могут фигурировать где угодно и оказывать влияние (независимо от области действия) вплоть до конца единицы трансляции. Границы строк принимаются во внимание: каждая строка анализируется отдельно (но есть возможность и сцеплять их). Лексемами для препроцессора являются все лексемы языка и последовательность символов, задающие имена файлов. Кроме того, любой символ, не определенный каким-либо другим способом, также воспринимается как лексема. Влияние символов пустого пространства, отличающихся от пробелов и горизонтальных табуляций, внутри строк препроцессора не определено.

В предыдущих темах уже встречались строки с начальным символом #: #include и #define. Первая директива (инструкция) использовалась для подключения заголовочных файлов, главным образом из библиотеки языка С, а вторая – для подстановки символов или чисел в определенные места программного кода.

Имеются следующие директивы препроцессора:

#define

#endif

#ifdef

#line

#elif

#error

#ifndef

#pragma

#else

#if

#include

#undef

Каждая директива препроцессора должна занимать отдельную строку. Например, строка

#include <stdio. h> #include <stdlib. h>

рассматривается как недопустимая.

Директива #define

Директива #define определяет идентификатор и последовательность символов, которые будут подставляться вместо идентификатора каждый раз, когда он встретится в исходном файле. Идентификатор называется именем макроса, а сам процесс замены – макрозаменой (макрорасширением, макрогенерацией, макроподстановкой). В общем виде директива #define выглядит следующим образом (должны использоваться буквы латинского алфавита):

#define имя_макроса последовательность_символов

В определении, как правило, в конце последовательности символов точка с запятой не ставится. Между идентификатором и последовательностью символов может быть любое количество пробелов, но признаком конца последовательности может быть только разделитель строк. Имена макросов обычно задаются с помощью букв верхнего регистра. У директивы #define оно может определяться с формальными параметрами. Тогда каждый раз, когда в программе встречается имя макроса, используемые в его определении формальные параметры заменяются теми аргументами, которые есть в программе. Такого рода макросы называются макросами с формальными параметрами (макроопределениями с параметрами и макросами, напоминающими функции). Ключевым элементом макроса с параметрами являются круглые скобки, внутри которых находятся собственно формальные параметры. Рассмотрим пример макроса с тремя параметрами для определения следующего условия: будет ли остаток от деления случайной функции на правую границу интервала больше, чем половина этого интервала.

Программный код решения примера:

#include <stdio. h>

#include <conio. h>

#include <stdlib. h>

#include <time. h>

#define MAX(a, b,c) ((1+rand()%(b)) > ((a)+(b))/2 ) ? (c):(b)

int main (void) {

int a, b, c;

srand((unsigned) time(NULL));

printf("\n Enter a, b, c: ");

scanf_s("%d%d%d", &a, &b, &c);

printf("\n MAX(a, b,c): %d\n", MAX(a, b,c));

printf("\n\n... Press any key: ");

_getch();

return 0;

}

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

Использование вместо настоящих функций макросов с формальными параметрами (т. е. a, b, с) дает преимущество: увеличивается скорость выполнения кода, потому что в таких случаях не надо тратить ресурсы на вызов функций. Кроме того, макрос не чувствителен к типу данных, т. е. в нем отсутствует проверка типов аргументов. Однако если у макроса с формальными параметрами очень большие размеры, то тогда из-за дублирования кода повышение скорости достигается за счет увеличения размеров программы. Кроме того, в конструировании макроса следует быть очень внимательным. Как правило, макросы используются для небольших пользовательских функций.

Директива #error

Директива #error заставляет компилятор прекратить компиляцию, используется в основном для отладки. В общем виде выглядит следующим образом:

#error сообщение – об – ошибке

Заданное сообщение об ошибке в двойные кавычки не заключается. Когда встречается эта директива, то выводится сообщение об ошибке, возможно вместе с другой информацией, определяемой компилятором.

Директива #include

Директива #include дает указание компилятору читать еще один исходный файл в дополнение к тому, в котором находится сама директива. Имя исходного (подключаемого) файла должно быть заключено в двойные кавычки или угловые скобки. Обычно имена стандартных заголовочных файлов берут в угловые скобки, а кавычки приберегают для имен специальных файлов, относящихся к конкретной программе. Способ поиска файла зависит от того, в кавычках или угловых скобках находится его имя. Если имя заключено в угловые скобки, то поиск файла проводится тем способом, который определен в компиляторе. Часто это означает поиск определенного каталога, специально предназначенного для хранения таких файлов. Если имя заключено в кавычки, то поиск файла проводится другим способом. Во многих компиляторах это означает поиск файла в текущем рабочем каталоге. Если же файл не найден, то поиск повторяется уже так, как будто имя файла заключено в угловые скобки.

Многие заголовочные файлы могут быть расположены в теле функции, например в main().

Файлы, имена которых находятся в директивах #include, могут в свою очередь содержать другие директивы #include. Они называются вложенными. Количество допустимых уровней вложенности у разных компиляторов может быть разным. Однако в стандарте С89 предусмотрено, что компиляторы должны допускать не менее 8 таких уровней.

Из за большого объема этот материал размещен на нескольких страницах:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25

Основные порталы (построено редакторами)

Домашний очаг

ДомДачаСадоводствоДетиАктивность ребенкаИгрыКрасотаЖенщины(Беременность)СемьяХобби
Здоровье: • АнатомияБолезниВредные привычкиДиагностикаНародная медицинаПервая помощьПитаниеФармацевтика
История: СССРИстория РоссииРоссийская Империя
Окружающий мир: Животный мирДомашние животныеНасекомыеРастенияПриродаКатаклизмыКосмосКлиматСтихийные бедствия

Справочная информация

ДокументыЗаконыИзвещенияУтверждения документовДоговораЗапросы предложенийТехнические заданияПланы развитияДокументоведениеАналитикаМероприятияКонкурсыИтогиАдминистрации городовПриказыКонтрактыВыполнение работПротоколы рассмотрения заявокАукционыПроектыПротоколыБюджетные организации
МуниципалитетыРайоныОбразованияПрограммы
Отчеты: • по упоминаниямДокументная базаЦенные бумаги
Положения: • Финансовые документы
Постановления: • Рубрикатор по темамФинансыгорода Российской Федерациирегионыпо точным датам
Регламенты
Термины: • Научная терминологияФинансоваяЭкономическая
Время: • Даты2015 год2016 год
Документы в финансовой сферев инвестиционнойФинансовые документы - программы

Техника

АвиацияАвтоВычислительная техникаОборудование(Электрооборудование)РадиоТехнологии(Аудио-видео)(Компьютеры)

Общество

БезопасностьГражданские права и свободыИскусство(Музыка)Культура(Этика)Мировые именаПолитика(Геополитика)(Идеологические конфликты)ВластьЗаговоры и переворотыГражданская позицияМиграцияРелигии и верования(Конфессии)ХристианствоМифологияРазвлеченияМасс МедиаСпорт (Боевые искусства)ТранспортТуризм
Войны и конфликты: АрмияВоенная техникаЗвания и награды

Образование и наука

Наука: Контрольные работыНаучно-технический прогрессПедагогикаРабочие программыФакультетыМетодические рекомендацииШколаПрофессиональное образованиеМотивация учащихся
Предметы: БиологияГеографияГеологияИсторияЛитератураЛитературные жанрыЛитературные героиМатематикаМедицинаМузыкаПравоЖилищное правоЗемельное правоУголовное правоКодексыПсихология (Логика) • Русский языкСоциологияФизикаФилологияФилософияХимияЮриспруденция

Мир

Регионы: АзияАмерикаАфрикаЕвропаПрибалтикаЕвропейская политикаОкеанияГорода мира
Россия: • МоскваКавказ
Регионы РоссииПрограммы регионовЭкономика

Бизнес и финансы

Бизнес: • БанкиБогатство и благосостояниеКоррупция(Преступность)МаркетингМенеджментИнвестицииЦенные бумаги: • УправлениеОткрытые акционерные обществаПроектыДокументыЦенные бумаги - контрольЦенные бумаги - оценкиОблигацииДолгиВалютаНедвижимость(Аренда)ПрофессииРаботаТорговляУслугиФинансыСтрахованиеБюджетФинансовые услугиКредитыКомпанииГосударственные предприятияЭкономикаМакроэкономикаМикроэкономикаНалогиАудит
Промышленность: • МеталлургияНефтьСельское хозяйствоЭнергетика
СтроительствоАрхитектураИнтерьерПолы и перекрытияПроцесс строительстваСтроительные материалыТеплоизоляцияЭкстерьерОрганизация и управление производством