Самостоятельная работа №2.




Основные понятия языка

Программа, написанная на языке Си, состоит из операторов. Каждый оператор вызывает выполнение некоторых действий на соответствующем шаге выполнения программы.

При написании операторов применяются латинские прописные и строчные буквы, цифры и специальные знаки. К таким знакам, например, относятся: точка (.), запятая (,), двоеточие (:), точка с запятой (;) и др. Совокупность символов, используемых в языке, называется алфавитом языка.

В персональном компьютере символы хранятся в виде кодов. Соответствие между каждым символом и его кодом задается специальной кодовой таблицей. На нее разработан стандарт ASCII, поэтому коды символов называют ASCII-кодами.

Различают видимые и управляющие символы. Первые могут быть отображены на экране дисплея либо отпечатаны на принтере. Вторые вызывают определенные действия в машине, например: звуковой сигнал - код 710, возврат курсора на один шаг - код 810, горизонтальная табуляция - код 910, перевод курсора на новую строку - код 1010, перемещение курсора в начало строки - код 1310 и т.д. Такие управляющие символы имеют десятичные номера 0 - 31, 127.

Для представления каждого символа в персональном компьютере используется один байт, поэтому общее число символов равно 28 = 256. Кодовая таблица, которая устанавливает соответствие между символом и его кодом, имеет 256 строк вида:

 

код_символа_в_заданной_системе_счисления - символ.

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

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

1. Они должны начинаться с буквы латинского алфавита (а,...,z, А,...,Z) или с символа подчеркивания (_).

2. В них могут использоваться буквы латинского алфавита, символ подчеркивания и цифры (0,...,9). Использование других символов в идентификаторах запрещено.

3. В языке Си буквы нижнего регистра (а,...,z), применяемые в идентификаторах, отличаются от букв верхнего регистра (А,...,Z). Это означает, что следующие идентификаторы считаются разными: name, NaMe, NAME и т.д.

4. Идентификаторы могут иметь любую длину, но воспринимается и используется для различения объектов (функций, переменных, констант и т.д.) только часть символов. Их число меняется для разных систем программирования, но в соответствии со стандартом ANSI C не превышает 32 (в Си++ это ограничение снято). Если длина идентификатора установлена равной 5, то имена count и counter будут идентичны, поскольку у них совпадают первые пять символов.

5. Идентификаторы для новых объектов не должны совпадать с ключевыми словами языка и именами стандартных функций из библиотеки.

В программах на языке Си важная роль отводится комментариям. Они повышают наглядность и удобство чтения программ. Комментарии обрамляются символами /* и */. Их можно записывать в любом месте программы.

В языке Си++ введена еще одна форма записи комментариев. Все, что находится после знака // до конца текущей строки, будет также рассматриваться как комментарий. Отметим, что компилятор языка Си, встроенный в систему программирования Borland C++, позволяет использовать данный комментарий и в программах на Си.

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

СНЕЖИНКА

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

На рисунке 17 изображена снежинка, состоящая из трех звеньев и восьми ветвей.

 

 

Рисунок 2. Снежинка

 

Указания к разработке алгоритма: Сделаем расчет длины каждого звена по известному значению - количеству звеньев и величине экрана. Будем считать, что снежинка строится в квадрате 400*400 точек. Центр снежинки совпадает с центром квадрата, а длина отрезка каждого очередного звена в четыре раза меньше предыдущего. Если через l обозначить длину первого звена, то справедливо следующее равенство:

l+ +…= 200

или

l* (сумма членов геометрической прогрессии), то есть

l=200*3* .

Пусть снежинка состоит из одного звена и p ветвей, тогда соответствующая программа проста.

For i:=1 to p do

Begin

X1:=trunc(x+l*cos(2*pi*(i-1)/p)); {координаты конца}

Y1:= trunc(y+l*sin(2*pi*(i-1)/p)); {очередного звена}

Line(x,y,x1,y1); {рисование звена}

End;

Здесь x, y – координаты точки центра снежинки. Наша снежинка рисуется как бы много раз, при этом длины звеньев изменяются, поэтому их нужно просчитать один раз и запомнить в массиве l из n элементов. Длина каждого звена уменьшается в четыре раза по отношению к предыдущему. Длина первого звена определяется из того, что в квадрате 400*400 точек необходимо построить снежинку из n звеньев. Если мы дошли до этапа рисования самого маленького звена (самой маленькой снежинки), то наша программа должна работать как приведенный набросок.


 

Итак, логика решения задачи:

Начинаем рисовать из центра, точки А, нарисовали первый отрезок АВ, если это не последнее звено, то будем рисовать отрезок следующего звена ВС, звено не последнее, поэтому продолжим. Предположим, что нарисовали СЕ, это первая ветвь самой маленькой снежинки, наша программа должна работать как набросок, то есть рисовать все ветви этой снежинки. После этого мы должны вернуться в точку В. так как это не последняя ветвь этой снежинки, то мы снова должны нарисовать следующую ветвь – отрезок ВД, а затем снова полностью – самую маленькую снежинку. Что необходимо для реализации этой логики? Пусть значение переменной k будет равно текущему номеру звена снежинки, в начальный момент оно равно n. Тогда при переходе от точек С, Д к точке В мы должны «вспомнить» координаты точки В и номер ветви снежинки, рисуемой из точки В. при переходе от точки В к точке А мы должны «вспомнить» координаты точки А и номер ветви снежинки рисуемой их точки А. Эта логика легко реализуется с помощью рекурсии.

Примечание: Для вычисления значения показательной функции используется тождество

uses crt,graph;

var x,y,i,p,n,gt,gm:integer;

l:array[1..20] of integer;

procedure sneg(x,y,k:integer);

var x1,y1,i:integer;

begin

if k>0 then

begin

for i:=1 to p do

begin

x1:=trunc(x+l[k]*cos(2*pi*(i-1)/p));

y1:=trunc(y+l[k]*sin(2*pi*(i-1)/p));

line(x,y,x1,y1);

sneg(x1,y1,k-1);

end;

end;

end;

begin

writeln('Введите кол-во звеньев p =,глубину рекурсии n =');

readln(p, n);

l[n]:=trunc(200*3*exp((n-1)*ln(4))/(exp(n*ln(4))-1));

for i:=2 to n do

l[n-i+1]:=trunc(l[n]/exp((i-1)*ln(4)));

x:=320; y:=240;

gt:=detect; initgraph (gt,gm,'c:\bp\bgi');

sneg(x,y,n);

readln;

end.

 

Фрактальные кривые.

Понятие фрактала. Многие объекты окружающего мира обладают свойством “самоподобия”. Так, строение Вселенной от метагалактики до атома описывается сходными моделями типа “ядро – спутники”; строение гористой поверхности или изрезанность морского берега выглядят примерно одинаково и с космической высоты, и с высоты птичьего полета, и с уровня человеческого роста. Все отличие лишь в разрешающей способности восприятия изображения. Вообразим съемку береговой линии кинокамерой с трансфокатором, имеющим регулируемое, но конечное угловое разрешение. При “наезде” камеры на объект взору открываются неразличимые ранее фрагменты, сходные по структуре с фрагментами предыдущего уровня. Такой процесс укрупнения масштаба изображения принципиально отличается от увеличения фотографии по е негативу или от растяжения выделенного фрагмента растровой картинки, при которых увеличивается зернистость без появления новых более мелких фрагментов.

Математическоеописание бесконечнодробимых объектов уравнениями линий или поверхностей чрезвычайно громоздко из-за необъятного количества мельчайших объектов. Для преодоления этой трудности математиком Исследовательского центра корпорации IBM Бенуа Мандельбротом в 1975 году был введен термин “фрактал” (от латинского fractus – раздробленный, разбитый, состоящий из фрагментов), а в 1982 году опубликована основополагающая книга “Фрактальная геометрия природы”, где описаны фрактальные множества, их свойства, методы получения и изображения.

В машинной графике фракталы применяются при генерации искусственных облаков, гор, поверхности моря. Образы фракталов похожи на природные объекты — деревья, растения, узоры, звездные скопления т.п. Фракталы позволяют создавать с помощью нескольких коэффициентов линий и поверхности очень сложной формы.

Ниже рассмотрим некоторые из этих фрактальных множеств.

Итак, займемся построением геометрических узоров. Программы, описываемые здесь, основаны на идеях “черепашьей графики”. “Черепаха” - это вектор с началом в текущем указателе, показывающий направление очередного перемещения из текущей точки и оставляющий при перемещении позади себя след. Что можно делать с “черепахой”? Ее можно поворачивать на заданный угол и перемещать на заданное расстояние.

Пример 4. Начнем с рекурсивной программы рисования кривой Коха.

Процесс формирования кривой Коха состоит в следующем – отрезок разбивается на три равные части, и на средней части отрезка строится, например, квадрат (см. рис. 4) или равносторонний треугольник. Для простоты рассмотрим кривую Коха с квадратом. На рис. 4 изображены кривые Коха первого и второго порядка. Для рисования кривой Коха используются только повороты на +90° и -90° и смещения вдоль прямолинейных отрезков. Алгоритм рисования кривой Коха можно записать следующим образом:

  • нарисовать прямолинейный отрезок заданной длины;
  • повернуть на +90°;
  • нарисовать прямолинейный отрезок заданной длины;
  • повернуть на -90°;
  • нарисовать прямолинейный отрезок заданной длины;
  • повернуть на -90°;
  • нарисовать прямолинейный отрезок заданной длины.

Затем эта последовательность вновь применяется к каждому прямолинейному участку построенной ломаной линии. Интересной особенностью фрактальных объектов является повторение особенностей их структуры при переходе к любому масштабу.

Программу, реализующую кривую Коха см. в файле Primer_4. pas.

Прямолинейные отрезки, начинающиеся из текущей точки и оканчивающиеся в точке с заданными координатами, в программе рисуются процедурой Linerel модуля Graf. Процедура draw(x,y: integer; dlina:word) является рекурсивной, она строит кривую Коха. Параметрами этой процедуры являются x и y (эти два числа задают единичный вектор в направлении очередного смещения) и величина смещения dlina.

Пример 5. “Множество Кантора”. На первый взгляд, кажется, что “множество Кантора” (см. рис. 5) состоит из большого квадрата и квадратов, нарисованных с помощью множества операторов Line.

Но при детальном рассмотрении можно заметить, что данный рисунок образован квадратами. Каждый следующий квадрат в четыре раза меньше предыдущего. Центр каждого следующего квадрата расположен в вершине предыдущего квадрата и т.д. Так как рисунок состоит из однотипных элементов, и есть явная зависимость, как размеров, так и положения, следовательно, при создании данного рисунка можно использовать в программе рекурсию.

Алгоритм рисования “множества Кантора”:

  • построить большой квадрат, внутреннюю часть которого закрасим каким-либо цветом;
  • на его вершинах, как на центрах рисуются квадраты, в четыре раза меньшие первоначального;
  • это повторяется для каждого оставшегося квадрата (n), причем бoльшие квадраты перекрывают меньшие.

Программу, реализующую множество Кантора см. в файле primer_5. pas.

Этот пример можно было бы решить и без использования рекурсии, но тогда пришлось бы просчитывать координаты каждого прямоугольника, что заняло бы много времени. Ещё сложнее было бы добиться пропорций рисунка, его равномерного распределения относительно краёв экрана. Да и сама программа заняла бы не одну страницу.

Данная программа даёт возможность изменения количества уровней n (глубину рекурсии), а так же размеры квадратов.

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

Алгоритм построения треугольника Серпинского довольно прост:

  • строится большой внешний треугольник (А);
  • строится треугольник, получающийся при соединении середин сторон большого треугольника (Б);
  • строятся треугольники, получающиеся аналогично элементу Б, но в качестве большого треугольника берутся треугольники, образованные элементами А и Б.

Изображение состоит из однотипных элементов, связанных между собой зависимостью каждого следующего элемента от координат предыдущего

На рис. 6 представлено изображение, состоящее из трех уровней, а данная программа позволяет рисовать изображение в зависимости от введённого пользователем n уровней.

Программу, реализующая треугольник Серпинского см. в файле primer_6.pas. Преимущество использования рекурсии очевидно - без рекурсии построение такого рисунка состоящего более чем из шести уровней весьма проблематично, а рекурсия позволяет увеличивать количество уровней, не ограничиваясь минимальными размерами самого нижнего уровня. Например, с помощью этой программы можно увеличить количество уровней до пятнадцати при этом будет ощутима только некоторая задержка при выводе изображения на экран, а вот без рекурсии такой рисунок построить будет практически невозможно, так как изображение будет состоять более чем из тридцати одной тысячи треугольников.

Самостоятельная работа №2.

Спирали – это геометрические фигуры, у которых каждая последующая сторона немного больше предыдущей. Спираль является ярким примером графической рекурсии.

Задание 4. а) Разработайте программу построения изображения “Спираль”, представленного на рис. 7.

Примечание.

В изображении можно заметить ряд закономерностей:

  • построение начинается из “середины” рисунка;
  • каждый следующий отрезок увеличивается на определённую величину;
  • все отрезки либо вертикальные, либо горизонтальные;
  • при рисовании происходит последовательное построение сходных элементов с изменяющимися параметрами следовательно, данный рисунок можно построить с использованием рекурсии, вместо отрезков в программе строятся векторы.

б*) разработайтепрограмму, в которой, кроме стороны, задан еще и угол витков спирали, при увеличении угла можно получить довольно интересные изображения (см. файл Приложение_1.doc).



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2018-01-08 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: