Разработка программы имитирующей работу обычных стрелочных часов

Автор: Пользователь скрыл имя, 27 Января 2012 в 09:00, курсовая работа

Краткое описание

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

Оглавление

ВВЕДЕНИЕ 3
1. Анализ технического задания 5
2. Выбор языка программирования 6
3. Конструирование классов 15
4. Описание программы 20
ЗАКЛЮЧЕНИЕ 24
Список литературы 25

Файлы: 1 файл

Разработка программы эмулятор игры « крестики-нолики.docx

— 86.57 Кб (Скачать)

Имя класса arrow_hour

Класс является наследником класса ARROW. Наследуемый доступ public.

В классе переопределяем лишь функцию draw. 

class arrow_hour:public ARROW

{

    public:

      void draw(int);

};

void arrow_hour::draw(int m)

{

int cl;

if (m==1)

{

  setcolor(color);

  setfillstyle(1,color);

  cl=color;

}

else

{

  setcolor(0);

  setfillstyle(1,0);

  cl=0;

}

 line(x0+7.5*cos(sh),y0-7.5*sin(sh), x0+89*cos(1.4+sh),y0-89*sin(1.4+sh));

line(x0+89*cos(1.4+sh),y0-89*sin(1.4+sh), x0+110*cos(1.57+sh),y0-110*sin(1.57+sh));

line(x0+110*cos(1.57+sh),y0-110*sin(1.57+sh), x0+89*cos(1.74+sh),y0-89*sin(1.74+sh));

line(x0+89*cos(1.74+sh),y0-89*sin(1.74+sh), x0+7.5*cos(3.14159+sh),y0-7.5*sin(3.14159+sh));

line(x0+7.5*cos(3.14159+sh),y0-7.5*sin(3.14159+sh), x0+7.5*cos(sh),y0-7.5*sin(sh));

floodfill(x0+77*cos(1.57+sh),y0-77*sin(1.57+sh),cl);

setcolor(0);

line(x0+7.5*cos(sh),y0-7.5*sin(sh), x0+89*cos(1.4+sh),y0-89*sin(1.4+sh));

line(x0+89*cos(1.4+sh),y0-89*sin(1.4+sh), x0+110*cos(1.57+sh),y0-110*sin(1.57+sh));

line(x0+110*cos(1.57+sh),y0-110*sin(1.57+sh), x0+89*cos(1.74+sh),y0-89*sin(1.74+sh));

line(x0+89*cos(1.74+sh),y0-89*sin(1.74+sh), x0+7.5*cos(3.14159+sh),y0-7.5*sin(3.14159+sh));

line(x0+7.5*cos(3.14159+sh),y0-7.5*sin(3.14159+sh), x0+7.5*cos(sh),y0-7.5*sin(sh));

setcolor(cl);

fillellipse(x0,y0,15,15);

 setcolor(0);

circle(x0,y0,15);

} 

 

  1. Описание  программы

     В данной программе будет содержаться  две функции: clock_face(…) и main(). Функция clock_face(int x0, int y0) предназначена для рисования циферблата часов. Аргументы x0 и y0 задают место циферблата. Радиус циферблата постоянный и равен 222.

Рисуем  закрашенную окружность белого цвета:

         setfillstyle(1,15);

         fillellipse(x0,y0,222,222);

Устанавливаем цвет рисования черным:

         setcolor(0);

Устанавливаем размер шрифта:

         settextstyle(0,0,3);

С помощью  цикла с параметрами, где 1<i <=60 рисуем деления и расставляем цифры на циферблате. Деления двух видов: короткие и длинные. Выбор вида деления зависит от i, если i делится без остатка на 5 то длинное иначе короткое деление:

for (int i=1; i<=60; i++)

{

  if (i%5==0)

    line(x0+161*cos(i*Pi/30),y0-161*sin(i*Pi/30), x0+178*cos(i*Pi/30), y0-178*sin(i*Pi/30));

else line(x0+169*cos(i*Pi/30), y0-169*sin(i*Pi/30), x0+178*cos(i*Pi/30), y0-178*sin(i*Pi/30));

}

Pi – константа, равная 3.14159

В зависимости  от i выводим цифру с помощью функции outtextxy(x,y,”    ”), где x и y координаты места вывода,  ” ” – выводимый текст. Выбор осуществляется с помощью переключателя switch:

switch (i)

      {

        case 5:outtextxy(x0+91,y0-182,"1"); break;

        case 10:outtextxy(x0+164,y0-109,"2"); break;

        case 15:outtextxy(x0+191,y0-9,"3"); break;

        case 20:outtextxy(x0+164,y0+91,"4"); break;

        case 25:outtextxy(x0+91,y0+164,"5"); break;

        case 30:outtextxy(x0-9,y0+191,"6"); break;

        case 35:outtextxy(x0-109,y0+164,"7"); break;

        case 40:outtextxy(x0-182,y0+91,"8"); break;

        case 45:outtextxy(x0-209,y0-9,"9"); break;

        case 50:

          {

            outtextxy(x0-197,y0-109,"1");

            outtextxy(x0-182,y0-109,"0"); break;

          }

        case 55:

          {

            outtextxy(x0-124,y0-182,"1");

            outtextxy(x0-109,y0-182,"1"); break;

          }

        case 60:

          {

            outtextxy(x0-19,y0-212,"1");

            outtextxy(x0,y0-212,"2"); break;

          }

} 

Функция main()

Переходим в графический режим:

int gdriver = DETECT, gmode, errorcode;

initgraph(&gdriver, &gmode, "");

errorcode = graphresult();

if (errorcode != grOk)

{

 cout<<"\n Graphics error \n Press any key to halt:";

 getch();

 exit(1);

}

Определяем  координаты центра экрана: 

int xc,yc;

xc=getmaxx()/2;

yc=getmaxy()/2;

ARROW::setXY(xc,yc);

Создаем по одному объекту каждого класса, задаем цвет стрелок: 

arrow_sec strelka1;

arrow_min strelka2;

arrow_hour strelka3;

strelka1.set_color(4);

strelka2.set_color(8);

 strelka3.set_color(8); 

Определяем  текущее время с помощью функции  gettime из dos.h

struct  time t;

gettime(&t);

 

Устанавливаем начальные положения стрелок:

int m,h,i;

m=t.ti_min;

if (t.ti_hour<12) h=t.ti_hour*5+m/12;

else h=(t.ti_hour-12)*5+m/12; 

Рисуем  циферблат с помощью функции  clock_face: 

clock_face(xc,yc); 

C помощью цикла do … while организуем циклическое повторение изменения положения стрелок. Условием прекращения работы программы будет нажатие любой клавиши. 

do

   {

      . . .

   }

while (kbhit()==0);

Действия, выполняемые за один цикл do … while:

Устанавливаем часовую и минутную стрелки в  нужное положение:

strelka3.rotate(h);

strelka2.rotate(m); 

С помощью  цикла изменяем положение секундной  стрелки и рисуем все стрелки. С помощью функции sleep из dos.h приостанавливаем работу программы на 1 секунду и стираем все стрелки.   

for (i=0; i<60; i++)

   {

        if (kbhit() != 0) break;

        strelka1.rotate(i);

        strelka3.draw(1);

        strelka2.draw(1);

        strelka1.draw(1);

        sleep(1);

        setfillstyle(1,15);

        setcolor(15);

        fillellipse(xc,yc,160,160);

   }

Опеделяем следующие положения часовой  и минутной стрелок:

  m++;

 if (m==60)

   {

    m=0;

    h++;

   }

 if (h==24) h=0; 

Закрываем графический режим:  closegraph() 

 

ЗАКЛЮЧЕНИЕ

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

Перечислим  еще раз некоторые существенные особенности языка С++:

  • С++ обеспечивает полный набор операторов структурного программирования;
  • С++ предлагает необычно большой набор операций. Многие операции С++ соответствуют машинным командам и поэтому допускают прямую трансляцию в машинный код. Разнообразие операций позволяет выбирать их различные наборы для минимизации результирующего кода;
  • С++ поддерживает указатели на переменные и функции. Указатель на объект программы соответствует машинному адресу этого объекта. Посредством разумного использования указателей можно создавать эффективно выполняемые программы, т.к. указатели позволяют ссылаться на объекты тем же самым путем, как это делает ЭВМ. С++ поддерживает арифметику указателей, и тем самым позволяет осуществлять непосредственный доступ и манипуляции с адресами памяти.
 

 

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

  1. Франка П. С++: учебный курс. – СПб.: Питер, 2005. – 522 с.
  2. Лаптев В.В. C++. Объектно-ориентированное программирование. – СПб.: Питер, 2008. – 464 с.
  3. Павловская Т. А. C/С++. Программирование на языке высокого уровня. – СПб.: Питер, 2003. – 461 с.
  4. И.И. Труб Объектно-ориентированное моделирование на C++ – СПб.: Питер, 2006. – 411 с.
 

 

    Приложение А

#include <graphics.h>

#include <stdlib.h>

#include <conio.h>

#include <math.h>

#include <dos.h>

#include <iostream.h>

#define Pi 3.14159

class ARROW

{

protected:

      static int x0,y0;

      int color;

      double sh;

public:

      static void setXY(int,int);

      virtual void draw(int)=0;

      void rotate(int);

      void set_color(int);

};

void ARROW::setXY(int _x, int _y)

{

x0=_x;

y0=_y;

}

void ARROW::set_color(int _color)

{

color=_color;

}

void ARROW::rotate(int pos)

{

sh=-Pi/30*pos;

}

int ARROW::x0;

int ARROW::y0;

class arrow_sec:public ARROW

{

    public:

      void draw(int);

};

void arrow_sec::draw(int m)

{

int cl;

if (m==1)

{

  setcolor(color);

Информация о работе Разработка программы имитирующей работу обычных стрелочных часов