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

  • Вид работы:
    Курсовая работа (т)
  • Предмет:
    Информационное обеспечение, программирование
  • Язык:
    Русский
    ,
    Формат файла:
    MS Word
    190,9 Кб
  • Опубликовано:
    2013-03-11
Вы можете узнать стоимость помощи в написании студенческой работы.
Помощь в написании работы, которую точно примут!

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















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

СОДЕРЖАНИЕ

ВВЕДЕНИЕ

. АНАЛИТИЧЕСКИЙ ОБЗОР ЯЗЫКОВ ПРОГРАММИРОВАНИЯ

. МАТЕМАТИЧЕСКАЯ ГЛАВА

. ОПИСАНИЕ АЛГОРИТМА РАБОТЫ ПРОГРАММЫ

ВЫВОД

СПИСОК ЛИТЕРАТУРЫ

ПРИЛОЖЕНИЯ

ВВЕДЕНИЕ

язык программирование математический модель

Тема моей курсовой работы - механические часы, показывающие текущее время.

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

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

Одной из подзадач является создание описание алгоритма программы и составление математической модели.

Часы будут состоять из основания (круга), циферблата (числа от 1 до 12 и 48 делений), секундной, минутной и часовой стрелок.

Для написания выбран язык программирования С++, среда разработки Microsoft Visual Studio 2010.

 


1. АНАЛИТИЧЕСКИЙ ОБЗОР ЯЗЫКОВ ПРОГРАММИРОВАНИЯ


Языки программирования можно разделить на два большие группы: объектно-ориентированные языки (С++, C#, Delphi, Java, Perl и другие) и процедурные языки (Basic, C, Pascal, Фортран, Ассемблер и другие).

Рассмотрим разницу между объектно-ориентированными и процедурными языками.

Процедурное (императивное) программирование является отражением архитектуры традиционных ЭВМ, которая была предложена фон Нейманом в 40-х годах [1]. Теоретической моделью процедурного программирования служит алгоритмическая система под названием «машина Тьюринга».

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

Прототипом объектно-ориентированного программирования послужил ряд средств, входящих в состав языка SIMULA-67. Но в самостоятельный стиль оно оформилось с появлением языка SMALLTALK, первоначально предназначенного для реализации функций машинной графики.

В основе объектно-ориентированного стиля программирования лежит понятие объекта, а суть его выражается формулой: «объект = данные + процедуры». Каждый объект интегрирует в себе некоторую структуру данных и доступные только ему процедуры обработки этих данных, называемые методами. Объединение данных и процедур в одном объекте называется инкапсуляцией и присуще объектно-ориентированному программированию.

Для описания объектов служат классы. Класс определяет свойства и методы объекта, принадлежащего этому классу. Соответственно, любой объект можно определить как экземпляр класса.

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

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

Ассемблер - язык программирования, который относиться к процедурным языкам программирования. Так же является языком низкого уровня, т.е мнемонические команды которого (за редким исключением) соответствуют инструкциям процессора вычислительной системы.

Достоинствами ассемблера являются:

)        программы, написанные на ассемблере самые быстрые из всех, что возможны для процесса, для которого написан код;

)        непосредственный доступ к аппаратуре (порты ввода-вывод, регистры процессора);

)        возможность встраивания кода ассемблера в некоторые языки программирования (например C++).

Исходя из данных достоинств, ассемблер часто применяют для написания драйверов, ядер операционных систем, «прошивок» BIOS, написания вирусов и других вредоносных программ и др.

Но, несмотря на достоинства, ассемблер имеет и свои недостатки:

)        программу со сложной логикой написать на ассемблере очень сложно, а порой бывает и невозможно;

)        код языка низкого уровня хуже читается и воспринимается, по сравнению с языками высокого уровня;

)        не переносимость программ, написанных на ассемблере, на другие компьютеры другой архитектуры.

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

Для написания механических часов нужно использовать математические методы и графические методы. Если математические методы не являться сложной задачей на ассемблере, то графические библиотеки ассемблера не так сильно развиты, как графические библиотеки других языков. Хотя реализация данной задачи возможна на ассемблере, я считаю, что его использование для решения поставленной задачи не является рациональным.

Delphi - язык программирования высокого уровня. Относиться к объектно-ориентированным языкам программирования. Произошел от языка Object Pascal, который в свою очередь произошел от Turbo Pascal.

Поскольку Delphi является объектно-ориентированным языком, в нем присутствуют все особенности объектно-ориентированного программирования: инкапсуляция, наследование, полиморфизм.

К достоинствам Delphi можно отнести:

)        простота изучения синтаксиса языка;

)        возможность использование компонентов и модулей, написанных другими программистами;

)        программы, написанные на Delphi, не требуется снабжать дополнительными библиотеками (например в отличие от связки C++/MFC);

)        быстрый браузер классов и мгновенный вывод подсказки автозавершения кода (code completion);

)        высокая скорость компиляции.

К недостаткам Delphi можно отнести:

)        малое число параметров оптимизации кода;

)        отсутствие гибких инструментов для метапрограммирования и шаблонного программирования;

)        отсутствие возможности создания кроссплатформенных приложений;

)        статическое присоединение (linking) библиотеки VCL и компонентов к исполняемому файлу.

В целом Delphi довольно мощный инструмент для создания приложений под Windows[2]. Среды разработки (Borland Delphi различных версий) являться визуальными, что еще больше упрощает создание приложений.

Систему Delphi относят к категории RAD-систем программирования(RAD- Rapid Application Development, быстрая разработка приложений).

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

Delphi подходит для решения поставленной задачи (механические часы). Математические операторы являться стандартным и с ними не возникнет сложности. Стандартный класс TCanvas позволяет рисовать различные примитивы, из которых возможно построить циферблат и стрелки часов, на основании математических расчетов. При необходимости более качественной прорисовки есть возможность подключить дополнительные графические библиотеки (например OpenGL).

C++ - относится к объектно-ориентированным языкам программирования. Произошел от языка C.

C++ сочетает свойства языков программирования высокого уровня и низкого уровня. Он является одним из самых популярных языков программирования.

Достоинства языка С++:

)        второй, по скорости компиляции, язык программирования (быстрее только ассемблер);

)        поддержка шаблонного программирования, перегрузки операторов и перегрузки функций;

)        огромное количество библиотек, как стандартных (в частности библиотека стандартных шаблонов STL), так и созданных сторонними разработчиками;

)        кроссплатформенность;

)        возможность работы на низком уровне с памятью, адресами, портами.

Недостатки языка С++:

)        Некоторая неудобность синтаксиса, унаследованного от С;

)        Иногда для создания шаблонов используется много кода;

)        Некоторая избыточность языка, что часто приводит к сложностям изучения.

С++ является мощным средством для создания различно программного обеспечения, операционных систем.

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

Существуют различные среды разработки, использующие язык С++. Наиболее популярными являются Microsoft Visual Studio 2010 и Borland C++ Builder.

Система разработки Microsoft Visual Studio 2010 является одним из ведущих продуктов на рынке программного обеспечения[3]. В центре системы Microsoft Visual Studio 2010 находиться платформа .NET Framework - встроенный компонент Windows, который поддерживает создание и выполнение приложений нового поколения и веб-служб. Основными компонентами .NET Framework являются общеязыковая среда выполнения (CLR) и библиотека классов .NET Framework, включающая ADO.NET, ASP.NET, Windows Forms и Windows Presentation Foundation (WPF). Платформа .NET Framework предоставляет среду управляемого выполнения, возможности упрощенной разработки и развертывания, а также возможности интеграции с другими языками программирования.

Для решения поставленной задачи язык С++ прекрасно подходит. В частности предполагается использования Microsoft Visual 2010. Для математических вычислений иметься стандартная библиотека Math, которая позволяет вычислять значения тригонометрических функций (в частности потребуется вычислять значения синусов и косинусов), логарифмических функций и проводить другие математические операции. Класс Graphics позволяет рисовать различные графические примитивы (эллипсы, линии, прямоугольники, текст и другие) на различных объектах (форма, pictureBox и другие). Если возникнет необходимость, есть возможность подключить другие графические библиотеки (Direct X, OpenGL и другие). На мой взгляд, Visual C++ будет наиболее удачным выбором для решения поставленной задачи.

На основании выше сказанного, я останавливаю выбор языка программирования для решения данной задачи на С++ и в частности на среде Microsoft Visual 2010. С++ является более быстрым по времени выполнения, чем Delphi, а так же имеет большее мощные средства для выполнения поставленной задачи. Для рисования в Microsoft Visual 2010 используется класс Graphics, который имеет ряд преимуществ перед классом TCanvas, с помощью которого происходит рисование в Delphi. Это более гибкое управления кистями и способами заливки, перегруженные функции позволяют задавать примитивы различными способами, возможность вставки текста. По сравнению с ассемблером, создания часов на С++ будет более простой задачей, так как ассемблер не имеет мощных инструментов для программирования графики и для написания программы потребуется много усилий.

2. МАТЕМАТИЧЕСКАЯ ГЛАВА


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

Основание часов - круг. Отрисовывается стандартной процедурой, с радиусом R

R = h/2,

где h - высота области рисования.

Для удобства координаты объектов будут задаваться параметрический по следующим формулам:


где x, y - координаты в прямоугольной декартовой системе координат,

,  - начало координат в системе OX'Y',

r - длина радиус-вектора,

 - угол отклонения от оси OX'.

Начало системы OX'Y' точка (R,R), где R - радиус круга, в котором происходит прорисовка.

Циферблат состоит из 12-ти цифр и 48 делений. Для прорисовки цифр используется стандартная процедура. Для правильного отображения цифр, повернем систему OX’Y' на  радиан. Окончательная формула для координат цифр:


где R - радиус круга, в котором происходит прорисовка,

i - цифра, которую требуется изобразить.

Для секундной и минутной стрелок используется следующая формула:


где  = 0.8 для секундной стрелки,

 = 0.65 для минутной стрелки,

i - значение текущего времени (секунд и минут соответственно).

Для часовой стрелки используется следующая формула:


где h - значение часов в текущий момент времени,

m - значение минут в текущий момент времени.

. ОПИСАНИЕ АЛГОРИТМА РАБОТЫ ПРОГРАММЫ

Алгоритм определения текущего времени приведен в следующей блок-схеме (см. рисунок 3.1):

Рисунок 3.1. Блок-схема

ВЫВОД


Был произведен анализ существующих языков программирования, который показал, что язык С++ более подходит для выполнения данного задания, чем ассемблер или Delphi.

В ходе выполнения работы были изучены: синтаксис языка С++, способы создания графики в Microsoft Visual Studio 2010, в частности работа с классами Graphics, BufferedGraphics, BufferedGraphicsContext. Были изучены приемы работы с такими компонентами, как: Form, Label, PictureBox.

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

Кроме того, для алгоритма определения текущего времени была составлена блок-схема.

Для верификации и тестирования разработанного алгоритма была реализована программа, представляющая собой числовой циферблат часов с часовой, минутной и секундной стрелками. Кроме того предусмотрена возможность масштабирования окна пользователем. Разработка велась на языке С++ в среде программирования Microsoft Visual Studio 2010.

Программа выводит на экран часы, которые показывают текущее время (см. приложение Б).

В ходе тестов программы ошибок замечено не было.

СПИСОК ЛИТЕРАТУРЫ


1       Аратамонов Б.Н Основы компьютерных технологий - СПб.: КОРОНА принт, 1998. - с.448

         В.М .Пестриков, А.Н. Маслобоев, Delphi на примерах. - СПб.: БХВ-Петербург, 2005. - с. 496

         В.В.Зиборов MS Visual C++ 2010 в среде .NET. Библиотека программиста. - СПб.: Питер 2012. - с. 320

         Рейсдорф К., Хендерсон К. - Borland C++ Builder - М., 2000. - c.702

ПРиложения

ПРИЛОЖЕНИЕ А

(обязательное)

Текст программы

Файл Form1.h*:

#pragma once

#include"FunctionPaint.h"Kursovuk {namespace System;namespace System::ComponentModel;namespace System::Collections;namespace System::Windows::Forms;namespace System::Data;namespace System::Drawing;

/// <summary>

/// Сводка для Form1

/// </summary>ref class Form1 : public System::Windows::Forms::Form

{:(void)

{();

//

//TODO: добавьте код конструктора

//

}:

/// <summary>

/// Освободить все используемые ресурсы.

/// </summary>

~Form1()

{(components)

{components;

}

}: System::Windows::Forms::PictureBox^ pictureBox1;: System::Windows::Forms::Timer^ timer1;: System::Windows::Forms::Label^ label1;: System::ComponentModel::IContainer^ components;

protected: :

/// <summary>

/// Требуется переменная конструктора.

/// </summary>

#pragma region Windows Form Designer generated code

/// <summary>

/// Обязательный метод для поддержки конструктора - не изменяйте

/// </summary>InitializeComponent(void)

{>components = (gcnew System::ComponentModel::Container());>pictureBox1 = (gcnew System::Windows::Forms::PictureBox());>timer1 = (gcnew System::Windows::Forms::Timer(this->components));>label1 = (gcnew System::Windows::Forms::Label());

(cli::safe_cast<System::ComponentModel::ISupportInitialize^ >(this->pictureBox1))->BeginInit();>SuspendLayout();

//

// pictureBox1

// >pictureBox1->Dock = System::Windows::Forms::DockStyle::Fill;>pictureBox1->Location = System::Drawing::Point(0, 0);>pictureBox1->Name = L"pictureBox1";>pictureBox1->Size = System::Drawing::Size(384, 362);>pictureBox1->TabIndex = 0;>pictureBox1->TabStop = false;>pictureBox1->SizeChanged += gcnew System::EventHandler(this, &Form1::pictureBox1_SizeChanged);>pictureBox1->Click += gcnew System::EventHandler(this, &Form1::pictureBox1_Click);>pictureBox1->Paint += gcnew System::Windows::Forms::PaintEventHandler(this, &Form1::pictureBox1_Paint);>pictureBox1->MouseEnter += gcnew System::EventHandler(this, &Form1::pictureBox1_MouseEnter);>pictureBox1->MouseLeave += gcnew System::EventHandler(this, &Form1::pictureBox1_MouseLeave);

//

// timer1

// >timer1->Interval = 1000;>timer1->Tick += gcnew System::EventHandler(this, &Form1::timer1_Tick);

//

// label1

// >label1->AutoSize = true;>label1->Location = System::Drawing::Point(12, 9);>label1->Name = L"label1";>label1->Size = System::Drawing::Size(35, 13);>label1->TabIndex = 1;>label1->Text = L"label1";>label1->Visible = false;>label1->Click += gcnew System::EventHandler(this, &Form1::label1_Click);

//

// Form1

// >AutoScaleDimensions = System::Drawing::SizeF(6, 13);>AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font;>ClientSize = System::Drawing::Size(384, 362);>Controls->Add(this->label1);>Controls->Add(this->pictureBox1);>DoubleBuffered = true;>MaximumSize = System::Drawing::Size(1000, 700);>MinimumSize = System::Drawing::Size(300, 300);>Name = L"Form1";>StartPosition = System::Windows::Forms::FormStartPosition::CenterScreen;>Text = L"Form1";>Load += gcnew System::EventHandler(this, &Form1::Form1_Load);>Resize += gcnew System::EventHandler(this, &Form1::Form1_Resize);

(cli::safe_cast<System::ComponentModel::ISupportInitialize^ >(this->pictureBox1))->EndInit();>ResumeLayout(false);>PerformLayout();

}

#pragma endregion^ GrafOut;R;: System::Void Form1_Load(System::Object^ sender, System::EventArgs^ e) {>Text = "Clock"; ->Enabled=true;>DoubleBuffered = true; //влючаем двойную буфферизацию = pictureBox1->CreateGraphics(); //создаем привязке GrafOut k pictureBox1= gcnew System::Drawing::Font("Times New Roman", 9.F); //устанавливаем шрифт->Height=this->Height;->Width=this->Height;

}: System::Void timer1_Tick(System::Object^ sender, System::EventArgs^ e) {->Text = String::Format("{0:T}", DateTime::Now); // считываем текущее время

int S,M,H; // текущее время

int H1 = pictureBox1->Height;W = pictureBox1->Width;(pictureBox1->Height<pictureBox1->Width) R=(pictureBox1->Size.Height)/2;R=(pictureBox1->Size.Width)/2;

if (label1->Text->Length==8) //переводим строку со временем в переменные S,M,H

{

//ковертируем SystemString в std::string

//после конвертируем std::string в Int32

String^ Mx = Convert::ToString(label1->Text[6]);

String^ Mxx = Convert::ToString(label1->Text[7]);

Mx +=Mxx;

S = Convert::ToInt32(Mx);

Mx = Convert::ToString(label1->Text[3]);

Mxx = Convert::ToString(label1->Text[4]);

Mx +=Mxx;

M = Convert::ToInt32(Mx);

Mx = Convert::ToString(label1->Text[0]);

Mxx = Convert::ToString(label1->Text[1]);

Mx +=Mxx;

H = Convert::ToInt32(Mx);

if (H>12) H-=12;

}

else

{^ Mx = Convert::ToString(label1->Text[5]);^ Mxx = Convert::ToString(label1->Text[6]);+=Mxx;= Convert::ToInt32(Mx);= Convert::ToString(label1->Text[2]);= Convert::ToString(label1->Text[3]);+=Mxx;= Convert::ToInt32(Mx);= Convert::ToString(label1->Text[0]);= Convert::ToInt32(Mx);

};(GrafOut,S,M,H,R,W,H1); //процедура прорисовки

}: System::Void pictureBox1_Paint(System::Object^ sender, System::Windows::Forms::PaintEventArgs^ e) {

}: System::Void pictureBox1_MouseEnter(System::Object^ sender, System::EventArgs^ e) {

label1->Visible=true; //текст с временем виден

}: System::Void pictureBox1_MouseLeave(System::Object^ sender, System::EventArgs^ e) {

label1->Visible=false; //текст с временем не виден

}: System::Void Form1_Resize(System::Object^ sender, System::EventArgs^ e) {

}: System::Void pictureBox1_Click(System::Object^ sender, System::EventArgs^ e) {

}: System::Void label1_Click(System::Object^ sender, System::EventArgs^ e) {

}: System::Void pictureBox1_SizeChanged(System::Object^ sender, System::EventArgs^ e) {

}

};

}.cpp:

#include"stdafx.h"

#include"FunctionPaint.h"namespace System;namespace System::ComponentModel;namespace System::Collections;namespace System::Windows::Forms;namespace System::Data;namespace System::Drawing;PaintClock(Graphics ^bufG, int S, int M, int H, int R, int H1, int W)

{^ Graf; //создаем буффер^ context; // создаем контекстrec; = Rectangle(0,0,H1,W); //допустимая область рисования= BufferedGraphicsManager::Current; //активируем контекст

//определяем размер буффера>MaximumBuffer = System::Drawing::Size(H1+1, W+1 ); = context->Allocate(bufG,rec); // создаем из контеста буффер^ brush = gcnew SolidBrush(Color::White); //цвет заливки>Graphics->Clear(SystemColors::Control); //очищаем область рисования>Graphics->FillEllipse(brush, 0,0,2*R,2*R); // рисуем основу часов= gcnew SolidBrush(Color::Red); // цвет заливки - красный^ pen = gcnew Pen(Color::Black); //цвет линии - черный(int i=1; i<13; ++i) //рисуем цифры

{a,b;= R + 0.9*R*Math::Cos(i*2*Math::PI / 12 - Math::PI/2);= R + 0.9*R*Math::Sin(i*2*Math::PI / 12 - Math::PI/2);>Graphics->DrawString(i.ToString(), gcnew System::Drawing::Font("Times New Roman", 9), brush, a-6, b-6 );

};(int i=1; i<=60; ++i) //рисуем 48 делений

{(i%5==0) continue;a1,a2,b1,b2;= R + 0.95*R*Math::Sin(i*2*Math::PI /60);= R + 0.95*R*Math::Cos(i*2*Math::PI /60);= R + R*Math::Sin(i*2*Math::PI /60);= R + R*Math::Cos(i*2*Math::PI /60);>Graphics->DrawLine(pen, a1,b1,a2,b2);

};x,y; //переменные для координат

//рисуем секундную стрелку= R + 0.80*R*Math::Cos(((S*Math::PI)/30)-Math::PI/2);= R + 0.80*R*Math::Sin(((S*Math::PI)/30)-Math::PI/2);>Graphics->DrawLine(pen, R,R,x,y);

//рисуем минутную стрелку>Width = 2; //толщина стрелки - 2 пикселя

pen->Color = Color::Blue; //цвет стрелки - голубой= R + 0.65*R*Math::Cos(((M*Math::PI)/30)-Math::PI/2);= R + 0.65*R*Math::Sin(((M*Math::PI)/30)-Math::PI/2);>Graphics->DrawLine(pen, R,R,x,y);

//рисуем часовую стрелку= R + 0.50*R*Math::Cos(((H*Math::PI)/6)+(M*Math::PI/360)-Math::PI/2);= R + 0.50*R*Math::Sin(((H*Math::PI)/6)+(M*Math::PI/360)-Math::PI/2);>Width = 3; // толщина 3 пикселя>Color = Color::Green; //цвет - зеленый>Graphics->DrawLine(pen, R,R,x,y);

Graf->Render(bufG); //выводим изображение на pictureBox1

};

ПРИЛОЖЕНИЕ Б

(обязательное)

РЕЗУЛЬТАТ РАБОТЫ ПРОГРАММЫ


Рисунок ПБ.1. Результат работы программы

Рисунок ПБ.2. Результат работы программы

Похожие работы на - Разработка алгоритма программы 'Механические часы, показывающие текущее время'

 

Не нашли материал для своей работы?
Поможем написать уникальную работу
Без плагиата!