{
int Error();//прототип ф-ии запроса и проверки на //неверный ввод
void Rule(int, int, int);//прототип рекурсивной ф-//ии, вызывающей Mark(x,h)
int i,n;//i-счетчик цикла, n-показатель степени 2
while(1) // цикл проверки введенного n в диапазоне
{
n=Error(); // вызов ф-ии запроса и прис-е рез-та
if (n>=1 && n<=8) break;// диапазон
}
stepen=2;
for (i=1;i<n;i++) stepen=stepen*2;//цикл подсчета //степени 2^n
int gdriver = DETECT, gmode;//переменные для //инициализации граф. режима
initgraph(&gdriver,&gmode, "");//инициализация граф. //режима
if (graphresult()!=0)//проверка на ошибку
{
clrscr();
printf("\nОшибка инициализации графики!!!");
getch();
exit(1); //выйти из программы в случае ошибки
}
setcolor(10);//установка св.-зел. цвета рисования
//рисование левой границы линейки
line(0,getmaxy()-200,0,getmaxy()-210-10*n);
setcolor(11);//установка св.-сер. цвета рисования
Rule(0,stepen,n);//вызов рекурсивной ф-ии
setcolor(10);//установка св.-зел. цвета рисования
//рисование верхней границы линейки
line(0,getmaxy()-210-10*n,lastx+getmaxx()/stepen, getmaxy()-210-10*n);
//рисование нижней границы линейки
line(0,getmaxy()-200,lastx+getmaxx()/stepen, getmaxy()-200);
//рисование правой границы линейки
line(lastx+getmaxx()/stepen,getmaxy()-200, lastx+getmaxx()/stepen,getmaxy()-210-10*n);
setcolor(5);//установка роз. цвета рисования
//вывод сообщения
outtextxy(getmaxx()/2-80,getmaxy()-100,"Press any key for quit");
getch();//задержка
delay(1000);
closegraph();//закрытие графического режима
return;
}
//*******************************************************
//ф-ия запроса и проверки (защита от неверных нажатий)
int Error()//заголовок ф-ии
{
int i;
char str[10];//вводимая строка
int str_int[2]; //массив из 2 целых значений
clrscr();//очистка экрана
// печать строки на экран
printf("\n\t\tВведите показатель степени 2 разрешения 1/2^n (1-8): ");
gets(str);//ф-ия ввода строки с клавиатуры
i=1;
if (strlen(str)>2) return 0;
while (i<=strlen(str))//цикл преобразования кодов //символов из char в int,
{//а также анализ на код не цифры
str_int[i-1]=(int)str[i-1];//в эл-ты массива //str_int поместить преобразованные в тип int коды //введенных символов
if (isdigit(str_int[i-1])==0) return 0;//выйти из //ф-ии с передачей 0, если это код не цифры
i++;
}
return atoi(str);//ф-ия преобразования введенной//строки в целое число типа int, а также возвращение //этого рез-та в главную ф-ию main()
}
//*******************************************************
//рекурсивная ф-ия, вызывающая Mark(x,h)
void Rule (int l, int r, int h)//заголовок ф-ии
{//l-условная абсцисса левой границы линейки
// r-условная абсцисса правой границы линейки 2
// h-высота самой длинной метки
void Mark (int, int);//прототип ф-ии рисования меток
int m=(l+r)/2;//делим линейку пополам
if (h>0)//если высота метки не нулевая, то
{
Rule(l,m,h-1);//вызов ф-ии из самой себя (рекурсия), //сначала работаем в левой части линейки
Mark(m,h);//вызов ф-ии рисования метки
Rule(m,r,h-1);//вызов ф-ии из самой себя (рекурсия), //потом работаем в правой части линейки
}
}
//*******************************************************
//ф-ия рисования меток
void Mark (int x, int p)//заголовок ф-ии
{//x-коэффициент абсциссы метки, p-коэффициент высоты //метки
lastx=getmaxx()/stepen*x;//в глоб. перем. заносим //текущую абсциссу метки
//рисуем метку
line(lastx,getmaxy()-200,lastx,getmaxy()-200-p*10); return;//возврат из ф-ии
}
-------------------------------------------------------------------------------------------------------
Программа 3 (Ханойские башни)(Имя файла: han_gr_3.cpp) :
-------------------------------------------------------------------------------------------------------
//*******************************************************
//Подключаемые заголовочные файлы
#include <stdio.h> //стандартный ввод-вывод
#include <conio.h>//для ф-ии getch() и т. д.
#include <ctype.h>//для ф-ии isdigit()
#include <string.h>//работа со строками
#include <stdlib.h>//стандартная библиотека (для ф-ии //atoi(),exit(1))
#include <graphics.h>//работа с графикой
#include <dos.h>//для ф-ии delay()
//*******************************************************
//объявление глобальных переменных
struct zap//структура, состоящая из
{ int y1,y2;//ординат верхнего и нижнего угла объекта
};
zap arr_A[14],arr_B[14],arr_C[14];//3 массива(3 //столбика) из структур
int i;//счетчик цикла
char ch;//код символа
FILE *st1;//указатель на файл st1
int w=54;//доп. переменная для рисования дисков
//*******************************************************
//Основная функция main()