Автор: Пользователь скрыл имя, 19 Декабря 2012 в 20:05, курсовая работа
У моїй курсовій роботі моїм завданням стало створення графічного годинника на мові С\С++. Для створення такої програми необхідно дуже добре знати мову програмування. Зокрема необхідно знати як працювати із рядками, графікою, знати як будувати цикли і вміти працювати із шрифтами. Розглянемо задачу детальніше. Для забезпечення читання та виведення системної дати та часу необхідно знати як працювати із рядками і змінними, для забезпечення встановлення розміру часу необхідно знати як працювати із функціями введення та виведення, щоб створити інтерфейс годинника необхідно вміти працювати із графікою.
1.Завдання на курсову роботу......................................……………………………2
2.Вступ..................................................................………………………………… ..4
3.Формулювання задачі.....................................……………………………………5
4.Методи розв’язування задачі……………………………………………………..6
5.Алгоритм розв’язування задачі......................................…… .………………………………………………………………………………………18
6.Програма та її опис...........................................………….…………………………………………23
7.Технологія програмування, виконання та від лагодження програми.....……25
8.Інструкція користувача................................................…………………………26
Висновки..................................................................……………… ……….……27
Список використаної літератури .....……………………………………..………28
оператору if...else.
Синтаксис оператора :
if (<умова>)
<оператор1>;
[else <оператор2;>]
Умова хибна, якщо вона
Це означає, що навiть вiд'ємнi значення розглядаються як iстиннi. До того ж,
умова, що перевiряється, повинна бути скалярною, тобто зводитися до простого значення, яке можливо перевiрити на рiвнiсть нулю. Взагалi не рекомендується використання змiнних типу float або double в логiчних виразах перевiрки умов з причини недостатньої точностi подiбних в иразiв. Бiльш досвiдченi програмiсти скорочують оператори типу:
if (вираз!=0) оператор;
до наступного:
if (вираз) оператор;
Обидва логiчнi вирази функцiонально еквiвалентнi, тому що будь-яке
ненульове значення розцiнюється як iстина. Це можна довести наступними програмами:
Приклад.
/* програма виводить
результат дiлення двох
#include<stdio.h>
#include<conio.h>
void main()
{
float a,b,c;
printf("Введiть число a :\n");
scanf("%f",&a);
printf("Введiть число b :\n");
scanf("%f",&b);
if (b==0) printf("Дiлення да нуль !\n");
else
{
c=a/b;
printf("a : b == %g",c);
};
}
Оператор циклу for
Оператор for забезпечує циклiчне повторення деякого оператора певне
число разiв. Оператор, який повторюється називається тiлом циклу. Повторення циклу звичайно здiйснюється з використанням деякої змiнної (лiчильника), яка змiнюється при кожному виконаннi тiла циклу. Повторення завершується, коли лiчильник досягає заданого значення.
Синтаксис оператора:
for([iнiцiалiзацiя];[
оператор ;
Звернемо увагу на те, що кожен з трьох виразiв може бути вiдсутнiм.
Перший вираз служить для iнiцiалiзацiї лiчильника, другий - для перевiрки
кiнця циклу, а третiй вираз - для змiни значення лiчильника. Формально роботу
циклу можна описати такими кроками:
1. якщо перший вираз (iнiцiалiзацiя) присутнiй, то вiн обчислюється;
2. обчислюється вираз умови (якщо вiн присутнiй). Якщо умова виробляє значення 0, тобто вона невiрна, цикл припиняється, у протилежному випадку вiн буде продовжений;
3. виконується тiло циклу;
4. якщо присутнiй вираз змiни лiчильника, то вiн обчислюється;
5. надалi перехiд до пункту пiд номером 2.
Поява у будь-якому мiсцi циклу оператора continue призведе до негайного пере-
ходу до пункту 4.
Приклад використання циклу for :
/* друк парних чисел у промiжку вiд 500 до 0 */
#include <stdio.h>
void main(void)
{
long i;
for(i=500;i>=0;i-=2)
printf("\n%ld",i);
printf("\n");
}
Основнi вiдомостi про представлення рядкiв
Символьний рядок представляє собою набiр з одного або бiльше символiв.
Приклад : "Це рядок"
В
мовi Сi немає спецiального
товувати для опису рядкiв. Замiсть цього рядки представляються у виглядi
масиву елементiв типу char. Це означає, що символи рядка розташовуються в
пам'ятi в сусiднiх комiрках, по одному символу в комiрцi.
Необхiдно вiдмiтити, що останнiм елементом масиву є символ '\0'. Це
нульовий символ (байт, кожний бiт якого рiвний нулю). У мовi Сi вiн вико-
ристовується для того, щоб визначати кiнець рядка.
Примiтка. Нульовий символ - це не цифра 0; вiн не виводиться на друк i
в таблицi символiв ASCII (див. додаток) має номер 0. Наявнiсть нульового
символу передбачає, що кiлькiсть комiрок масиву повинна бути принаймнi на
одну бiльше, нiж число символiв, якi необхiдно розмiщувати в пам'ятi.
Наприклад, оголошення
char str[10];
передбачає, що рядок мiстить може мiстити максимум 9 символiв.
Основнi методи iнiцiалiзацiї символьних рядкiв.
char str1[]= "ABCdef";
char str2[]={'A', 'B', 'C', 'd', 'e', 'f',0};
char str3[100];
gets(str3);
char str4[100];
scanf("%s",str4);
Усi
константи-рядки в текстi
мiщуються за рiзними адресами в статичнiй пам'ятi. З кожним рядком пов'язу-
ється сталий покажчик на його перший символ. Власне, рядок-константа є виразом типу "покажчик на char" зi сталим значенням - адресою першого символу.
Так, присвоювання p="ABC" (p - покажчик на char) встановлює вказiвник
p на символ 'A'; значенням виразу *("ABC"+1) є символ 'B'.
Елементи рядкiв доступнi через вказiвники на них, тому будь-який вираз
типу "вказiвник на char" можна вважати рядком.
Необхiдно мати також на увазi те, що рядок вигляду "х" - не те ж саме,
що символ 'x'. Перша вiдмiннiсть : 'x' - об'єкт одного з основних типiв даних
мови Сi (char), в той час, як "х" - об'єкт похiдного типу (масиву елементiв
типу char). Друга рiзниця : "х" насправдi складається з двох символiв - си-
мволу 'x' i нуль-символу.
Функцiї введення рядкiв.
Прочитати рядок iз стандартного потоку введення можна за допомогою
ункцiї gets(). Вона отримує рядок iз стандартного потоку введення. Функцiя
читає символи до тих пiр, поки їй не зустрiнеться символ нового рядка '\n',
який генерується натисканням клавiшi ENTER. Функцiя зчитує всi символи до символу нового рядка, додаючи до них нульовий символ '\0'.
Синтаксис :
char *gets(char *buffer);
Як вiдомо, для читання рядкiв iз стандартного потоку введення можна
використовувати також функцiю scanf() з форматом %s. Основна вiдмiннiсть мiж scanf() i gets() полягає у способi визначеннi досягнення кiнця рядка; функцiя scanf() призначена скорiше для читання слова, а не рядка. Функцiя scanf() має два варiанти використання. Для кожного з них рядок починається з першого не порожнього символу. Якщо використовувати %s, то рядок продовжується до (але не включаючи) наступного порожнього символу (пробiл, табуляцiя або новий рядок). Якщо визначити розмiр поля як %10s, то функцiя scanf() не прочитає бiльше 10 символiв або ж прочитає послiдовнiсть символiв до будь-якого першого порожнього символу.
Функцiї виведення рядкiв.
Тепер розглянемо функцiї виведення рядкiв. Для виведення рядкiв можна
використовувати функцiї puts() i printf().
Синтаксис функцiї puts():
int puts(char *string);
Ця функцiя виводить всi символи рядка string у стандартний потiк виве-
дення. Виведення завершується переходом на наступний рядок.
Рiзниця мiж функцiями puts() i printf() полягає в тому, що функцiя
printf() не виводить автоматично кожний рядок з нового рядка.
Стандартна бiблiотека мови програмування Сi мiстить клас функцiй для
роботи з рядками, i всi вони починаються з лiтер str. Для того, щоб викорис-
товувати одну або декiлька функцiї необхiдно пiдключити файл string.h.
#include<string.h>
Конкатенацiя рядкiв.
Конкатенацiя двох рядкiв означає їх об'єднання, при цьому створюється
новий, бiльш довгий рядок. Наприклад, при оголошеннi рядка
char first[]= "Один ";
оператор
strcat(first, "два три чотири!");
перетворить рядок first в рядок "Один два три чотири".
При викликаннi функцiї strcat(s1,s2) потрiбно впевнитися, що перший
аргумент типу char * iнiцiалiзований i має достатньо мiсця щоб зберегти
результат. Якщо s1 адресує рядок, який вже записаний, а s2 адресує нульовий
рядок, то оператор strcat(s1,s2) перезапише рядок s1, викликавши при цьому серйозну помилку.
Функцiя strcat() повертає адресу рядка результату (що спiвпадає з її
першим параметром), що дає можливiсть використати "каскад" декiлькох викликiв функцiй :
strcat(strcat(s1,s2),s3);
Цей оператор додає рядок, що адресує s2, i рядок, що адресує s3, до
кiнця рядка, що адресує s1, що еквiвалентно двом операторам:
strcat(s1,s2);
strcat(s1,s3);
Оголошення структури
Структури дозволяють об'
якi можуть мати рiзнi типи. Оголошення структури здiйснюється за допомогою ключового слова struct.
Синтаксис опису структури виглядає так :
struct [iм'я_структури]
{
тип1 елемент1;
тип2 елемент2;
........................
типN елементN;
} [список описiв];
З метою ознайомлення з цим
типом даних розглянемо
struct date {
int day ;
int month ;
int year;
char day_name[15];
char mon_name[14];
} arr[100],*pd,data,new_data;
В даному прикладi оголошуються:
data, new_data - змiннi типу структури date;
pd - вказiвник на тип data
arr - масив iз
100 елементiв, кожний елемент
Потрiбно вiдзначити, що на вiдмiну вiд описiв iнших типiв даних, опис струк-
тури не видiляє мiсця у пам'ятi пiд елементи структури. Її опис визначає лише
так званий шаблон, що описує характеристики змiнних, що будуть розмiщуватися у конкретнiй структурi. Щоб ввести змiннi та зарезервувати для них пам'ять необхiдно або пiсля фiгурної дужки, що завершує опис структури, вказати список iдентифiкаторiв.
5. Алгоритм розв’язування задачі
Побудова графічного годинника:
#ifndef Unit1H
#define Unit1H
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include <ExtCtrls.hpp>
#include "Math.h"
class TForm1 : public TForm
{
__published: TEdit *Edit1;
TTimer *Timer1;
void __fastcall Timer1Timer(TObject *Sender);
private:
public:
__fastcall TForm1(TComponent* Owner);
};
extern PACKAGE TForm1 *Form1;
#endif.
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
int lh = 60;
int lm = 80;
int ls = 100;
int cBl = 120;
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
int xc,yc; //координати центра годинника
double u; //друга точка наших стрілок
double tNow; //Системний час
Form1->Canvas->Brush->Color=
Form1->Canvas->Rectangle(0,0,
xc = (int)(Form1->Width / 2); //визначаємо першу координату центру форми(центр годинника Х)
yc = (int)(Form1->Height / 2); //визначаємо другу координату центру форми(центр годинника У)
lh = (int)((xc/6)*1.5); //встановлюємо
пропорції для годинникової
lm = (int)((xc/6)*2); //встановлюємо пропорції для хвилинної стрілки
ls = (int)((xc/6)*3); //встановлюємо пропорції для секундної стрілки
cBl = (int)((xc/6)*4); //встановлюємо пропорції для "радіусу" годинника
int cBlw = (int)(cBl/2); //половина радіусу годинника (потрібна для циферблату)
Form1->Canvas->Pen->Color=
Form1->Canvas->Rectangle(xc-