Реферат по предмету "Программирование"


Законченная программа

Законченная программа

Разберем процесс написания программы для рисования на
экране геометрических фигур. Она естественным образом разделяется на три части:


Администратор экрана: подпрограммы низкого уровня и
структуры данных, определяющие экран; он ведает только точками и прямыми
линиями;

Библиотека фигур: набор определений основных фигур вроде
прямоугольника и круга и стандартные программы для работы с ними; и

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

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


Администратор Экрана

Вначале было намерение написать администратор экрана на C
(а не на C++), чтобы подчеркнуть разделение уровней реализации. Это оказалось
слишком утомительным, поэтому пришлось пойти на компромисс: используется стиль
C (нет функций членов, виртуальных функций, определяемых пользователем операций
и т.п.), однако применяются конструкторы, надлежащим образом описываются и
проверяются параметры функций и т.д. Оглядываясь назад, можно сказать, что
администратор экрана очень похож на C программу, которую потом модифицировали,
чтобы воспользоваться средствами C++ не переписывая все полностью.

Экран представляется как двумерный массив символов,
работу с которым осуществляют функции put_point() и put_line(), использующие
при ссылке на экран структуру point:

// файл screen.h

const XMAX=40, YMAX=24;

struct point {

  int x,y;

  point() {}

  point(int a,
int b) { x=a; y=b; }

};

overload put_point;

extern void put_point(int a, int b);

inline void put_point(point p) { put_point(p.x,p.y); }

overload put_line;

extern void put_line(int, int, int, int);

inline void put_line(point a, point b)

  {
put_line(a.x,a.y,b.x,b.y); }

extern void screen_init();

extern void screen_refresh();

extern void screen_clear();

#include

Перед первым использованием функции put экран надо
инициализировать с помощью screen_init(), а изменения в структуре данных экрана
отображаются на экране только после вызова screen_refresh(). Как увидит
пользователь, это "обновление" ("refresh") осуществляется
просто посредством печати новой копии экрана под его предыдущим вариантом. Вот
функции и определения данных для экрана:

#include "screen.h"

#include

enum color { black="*", white=" "
};

char screen[XMAX][YNAX];

void screen_init()

{

  for (int y=0;
y=a || a

  }

}

Предоставляются функции для очистки экрана и его
обновления:

void screen_clear() { screen_init(); } // очистка

void screen_refresh() // обновление

{

for (int y=YMAX-1; 0

for (int x=0; x
Библиотека Фигур

Нам нужно определить общее понятие фигуры (shape). Это
надо сделать таким образом, чтобы оно использовалось (как базовый класс) всеми
конкретными фигурами (например, кругами и квадратами), и так, чтобы любой
фигурой можно было манипулировать исключительно через интерфейс,
предоставляемый классом shape:

struct shape {

shape() { shape_list.append(this); }

virtual point north() { return point(0,0); } // север

virtual point south() { return point(0,0); } // юг

virtual point east() { return point(0,0); } // восток

virtual point neast() { return point(0,0); } // северо-восток

virtual point seast() { return point(0,0); } // юго-восток

virtual void draw() {}; // нарисовать

virtual void move(int, int) {}; // переместить

};

Идея состоит в том, что расположение фигуры задается с
помощью move(), и фигура помещается на экран с помощью draw(). Фигуры можно
располагать относительно друг друга, используя понятие точки соприкосновения, и
эти точки перечисляются после точек на компасе (сторон света). Каждая
конкретная фигура определяет свой смысл этих точек, и каждая определяет способ,
которым она рисуется. Для экономии места здесь на самом деле определяются
только необходимые в этом примере стороны света. Конструктор shape::shape()
добавляет фигуру в список фигур shape_list. Этот список является gslist, то
есть, одним из вариантов обобщенного односвязанного списка, определенного в
#7.3.5. Он и соответствующий итератор были сделаны так:

typedef shape* sp;

declare(gslist,sp);

typedef gslist(sp) shape_lst;

typedef gslist_iterator(sp) sp_iterator;

поэтому shape_list можно описать так:

shape_lst shape_list;

Линию можно построить либо по двум точкам, либо по точке
и целому. В последнем случае создается горизонтальная линия, длину которой
определяет целое. Знак целого указывает, каким концом является точка: левым или
правым. Вот определение:

class line : public shape {

/*

линия из "w" в "e"

north() определяется как ``выше центра

и на север как до самой северной точки""

*/

point w,e;

public:

point north()

{ return point((w.x+e.x)/2,e.ydraw();

screen_refresh();

}

И вот, наконец, настоящая сервисная функция (утилита).
Она кладет одну фигуру на верх другой, задавая, что south() одной должен быть сразу
над north() другой:

void stack(shape* q, shape* p) // ставит p на верх
q

{

point n = p->north();

point s = q->south();

q->move(n.x-s.x,n.y-s.y+1);

}

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

Прикладная программа чрезвычайно проста. Определяется
новая фигура my_shape (на печати она немного похожа на рожицу), а потом пишется
главная программа, которая надевает на нее шляпу. Вначале описание my_shape:

#include "shape.h"

class myshape : public rectangle {

line* l_eye; // левый глаз

line* r_eye; // правый глаз

line* mouth; // рот

public:

myshape(point, point);

void draw();

void move(int, int);

};

Глаза и рот - отдельные и независимые объекты, которые
создает конструктор my_shape:

myshape::myshape(point a, point b) : (a,b)

{

int ll = neast().x-swest().x+1;

int hh = neast().y-swest().y+1;

l_eye = new line(

point(swest().x+2,swest().y+hh*3/4),2);

r_eye = new line(

point(swest().x+ll-4,swest().y+hh*3/4),2);

mouth = new line(

point(swest().x+2,swest().y+hh/4),ll-4);

}

Объекты глаза и рот порознь рисуются заново функцией
shape_refresh(), и в принципе могут обрабатываться независимо из объекта
my_shape, которому они принадлежат. Это один способ определять средства для
иерархически построенных объектов вроде my_shape. Другой способ демонстрируется
на примере носа. Никакой нос не определяется, его просто добавляет к картинке
функция draw():

void myshape::draw()

{

rectangle::draw();

put_point(point(

(swest().x+neast().x)/2,(swest().y+neast().y)/2));

}

my_shape передвигается посредством перемещения базового
прямоугольника rectangle и вторичных объектов l_eye, r_eye и mouth (левого
глаза, правого глаза и рта):

void myshape::move()

{

rectangle::move();

l_eye->move(a,b);

r_eye->move(a,b);

mouth->move(a,b);

}

Мы можем, наконец, построить несколько фигур и немного их
подвигать:

main()

{

shape* p1 = new rectangle(point(0,0),point(10,10));

shape* p2 = new line(point(0,15),17);

shape* p3 = new myshape(point(15,10),point(27,18));

shape_refresh();

p3->move(-10,-10);

stack(p2,p3);

stack(p1,p2);

shape_refresh();

return 0;

}

Еще раз обратите внимание, как функции вроде
shape_refresh() и stack() манипулируют объектами типов, определяемых гораздо
позже, чем были написаны (и, может быть, откомпилированы) сами эти функции.

Результатом работы программы будет:





 ***********


 *        
*


 *        
*


 *        
*


 *        
*


 *        
*


 *        
*


 *        
*


 *        
*


 *        
*


 ***********


*****************


*************


*           *


* **     ** *


*           *


*     *    
*


*           *


* ********* *


*           *


*************





Список литературы

Для подготовки данной работы были использованы материалы
с сайта http://www.realcoding.net


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

Поделись с друзьями, за репост + 100 мильонов к студенческой карме :

Пишем реферат самостоятельно:
! Как писать рефераты
Практические рекомендации по написанию студенческих рефератов.
! План реферата Краткий список разделов, отражающий структура и порядок работы над будующим рефератом.
! Введение реферата Вводная часть работы, в которой отражается цель и обозначается список задач.
! Заключение реферата В заключении подводятся итоги, описывается была ли достигнута поставленная цель, каковы результаты.
! Оформление рефератов Методические рекомендации по грамотному оформлению работы по ГОСТ.

Читайте также:
Виды рефератов Какими бывают рефераты по своему назначению и структуре.

Сейчас смотрят :

Реферат Поняття платіжного балансу країни
Реферат Вчись у природи творчого спокою
Реферат Разработка проекта ИВС для управления файловыми ресурсами и ресурсами печати в сетях под управле
Реферат Eagles 2 Essay Research Paper The bald
Реферат конспект итогового занятия в подготовительной группе
Реферат Pesticides Essay Research Paper Should we be
Реферат Анотація: Шарапа Галина Іванівна. Проблеми невідповідності рівня що випускаються вищими учбовими закладами фахівців потребам сучасного суспільства
Реферат Teenage Wasteland Essay Research Paper The Teenage
Реферат Фінансовий аналіз оборотних активів підприємства
Реферат Воспроизведение звука в системе персонального компьютера
Реферат Василий Андреевич Жуковский
Реферат Loft Comparrison Essay Essay Research Paper Comparison
Реферат Car Crashes Essay Research Paper Two cars
Реферат Налоговый учет при упрощенной системе налогообложения
Реферат Россия в середине XVIII века эпоха дворцовых переворотов