
- •1. Назначение и объем курсовой работы. Выбор задания
- •2. Разработка технического задания
- •3. Оценивание курсовой работы
- •3. Содержание отчета
- •4. Задание на курсовую работу
- •5. Постановка задачи
- •6. Внешняя спецификация программы
- •7. Метод решения задачи
- •8. Описание алгоритма
- •8.1. Структура данных
- •8.2. Выделение подпрограмм
- •8.3. Алгоритмы главной программы и подпрограмм
- •9. Структура программы
- •10. Пример программы
- •Варианты индивидуальных заданий
- •Игра «Жизнь».
- •Игра «Минер».
- •Игра «Космос».
- •Игра «Сапер».
- •Игра «Города».
- •Игра «Поле Чудес».
- •Игра «Животные».
- •Игра «Крестики – нолики».
- •Игра «6 пешек».
- •Игра «Спички».
- •Игра «Быки и коровы».
- •Игра «Волки и овцы».
- •12. Библиографический список
- •109028 Москва, б. Трехсвятительский пер., 3/12.
- •113054 Москва, ул. М. Пионерская, 12
10. Пример программы
В данном разделе приведен пример программы с использованием графических возможностей языка С++. Для разработки программы использовалась среда Qt Creator. Пример иллюстрирует правильное оформление программы. Каждая функция снабжена комментариями. Кроме того, для каждой функции прокомментированы имена используемых переменных и указано их назначение.
//form.h
#ifndef FORM_H
#define FORM_H
#include <QtGui>
#include <QVBoxLayout>
#include <QWidget>
#include <QPushButton>
#include <QLabel>
#include <QPixmap>
namespace Ui {
class Form;
}
class Form : public QWidget
{
Q_OBJECT
public:
QLabel *pLabel;
void transmit(QPixmap *_pix); /* прототип функции передачи рисунка на форму «Form» */
explicit Form(QWidget *parent = 0);
~Form();
private:
Ui::Form *ui;
};
#endif // FORM_H
//mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QtGui>
#include <QVBoxLayout>
#include <QWidget>
#include <QLabel>
#include <QPixmap>
#include <iostream>
#include <math.h>
#include "form.h"
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
bool check_ab; //переменная – признак правильности ввода a и b
bool check_m; //переменная – признак правильности ввода mx и my
bool check_step; //переменная – признак правильности ввода step
int mx, my, pix_size; //масштабы по осям ox, oy, размер области рисования
float a, b, step; //границы отрезка ab и шаг
Form grafForm; //объект класса Form (форма для отображения графика)
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
private:
Ui::MainWindow *ui; /* класс, хранящий параметры пользовательского интерфейса (формируется автоматически) */
void drawDiagramm(int n); /* функция отрисовки графика функции и осей в буфер (n-номер функции) */
void drawFunc(int _n, QPainter *_paint); /* отдельная функция отрисовки самого графика функции, вызывается функцией «drawDiagramm» */
private slots: //функции, вызываемые сигналами
void checkAB(); //проверка правильности ввода a и b
void checkM(); //проверка правильности ввода масштабов
void checkStep(); //проверка правильности ввода шага
void drawInitialize(); /* функция запуска отрисовки в соответствии со значениями переменных, отвечающих за правильность ввода. Номер функции определяется тоже здесь в соответствии со значением RadioButton (1-4) */
};
#endif // MAINWINDOW_H
//form.cpp
#include "form.h"
#include "ui_form.h"
Form::Form(QWidget *parent) :
QWidget(parent),
ui(new Ui::Form)
{
ui->setupUi(this);
}
Form::~Form()
{
delete ui;
}
void Form::transmit(QPixmap *_pix)
{ //описание функции передачи изображения на надпись1 в форме «Form»
ui->label->setPixmap(*_pix);
}
// main.cpp
#include <QtGui/QApplication>
#include "form.h"
#include "mainwindow.h"
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.show();
return a.exec();
}
//mainwindow.cpp
#include "form.h"
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDebug>
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this); //код, сгенерированный компилятором
//инициализация переменных
check_ab = check_m = check_step = false;
pix_size=501;
//связывание сигналов от интерфейса с функциями
connect(ui->textEdit, SIGNAL(textChanged()), this, SLOT(checkAB()));
connect(ui->textEdit_2, SIGNAL(textChanged()), this, SLOT(checkAB()));
connect(ui->textEdit_3, SIGNAL(textChanged()), this, SLOT(checkStep()));
connect(ui->textEdit_4, SIGNAL(textChanged()), this, SLOT(checkM()));
connect(ui->textEdit_5, SIGNAL(textChanged()), this, SLOT(checkM()));
connect(ui->pushButton, SIGNAL(clicked()), this, SLOT(drawInitialize()));
//скрываем надписи, содержащие сообщения об ошибках
ui->label_4->hide();
ui->label_5->hide();
ui->label_8->hide();
}
MainWindow::~MainWindow() { delete ui; }
void MainWindow::checkAB()
{ //проверка, что поля для ввода a и b не пустые
if ( !ui->textEdit->toPlainText().isEmpty() &&
!ui->textEdit_2->toPlainText().isEmpty() )
{ //проверка несоответствия a и b условию a<b
if ( ui->textEdit->toPlainText().toFloat() >=
ui->textEdit_2->toPlainText().toFloat() )
{ //визуализация надписи, содержащей сообщение об ошибке
ui->label_4->show();
check_ab=false; //флаг, указывающий, что ввод a и b не корректен
}
else
{ //скрытие надписи, содержащей сообщение об ошибке
ui->label_4->hide();
check_ab=true; //флаг, указывающий, что ввод a и b корректен
}
}
}
void MainWindow::checkStep() //аналогично с функцией checkAB()
{
if ( !ui->textEdit_3->toPlainText().isEmpty() )
{
if ( ui->textEdit_3->toPlainText().toFloat() <= 0 )
{
ui->label_5->show();
check_step=false;
}
else
{
ui->label_5->hide();
check_step=true;
}
}
}
void MainWindow::checkM() //аналогично с функцией checkAB()
{
if ( !ui->textEdit_4->toPlainText().isEmpty() &&
!ui->textEdit_5->toPlainText().isEmpty() )
{
if ( ui->textEdit_4->toPlainText().toInt() <= 0 ||
ui->textEdit_5->toPlainText().toInt() <= 0 )
{
ui->label_8->show();
check_m=false;
}
else
{
ui->label_8->hide();
check_m=true;
}
}
}
void MainWindow::drawInitialize()
{ //проверка переменных, отвечающих за корректность ввода данных
if (check_ab && check_m && check_step)
{ //передача значений полей формы в поля класса
a = ui->textEdit -> toPlainText().toFloat();
b = ui->textEdit_2->toPlainText().toFloat();
step = ui->textEdit_3->toPlainText().toFloat();
mx = ui->textEdit_4->toPlainText().toInt();
my = ui->textEdit_5->toPlainText().toInt();
/* текст из полей TextEdit (1-5) преобразуется во float/int и полученные значения записываются в соответствующие переменные */
int num_func=0;
//num_func принимает значение, равное номеру выбранной функции
if (ui->radioButton -> isChecked()) num_func=1;
if (ui->radioButton_2->isChecked()) num_func=2;
if (ui->radioButton_3->isChecked()) num_func=3;
if (ui->radioButton_4->isChecked()) num_func=4;
if (num_func) drawDiagramm(num_func); /* вызов функции отрисовки изображения (оси график и т.п.) */
}
}
void MainWindow::drawDiagramm(int n)
{
int nx,ny,x,y,ym,xm;
//создание объекта, хранящего массив пикселей (изображение)
QPixmap *pix = new QPixmap(pix_size,pix_size);
//заливка фона изображения чёрным цветом
pix->fill(Qt::black);
//передача изображения классу, содержащему функции для рисования
QPainter paint(pix);
//задание цвета границы рисуемого объекта
paint.setPen(Qt::white);
//отрисовка координатных осей
paint.drawLine(0, pix_size/2, pix_size, pix_size/2);
paint.drawLine(pix_size/2, 0, pix_size/2, pix_size);
nx=pix_size/(2*mx);
ny=pix_size/(2*my);
y=0;
//2 цикла для отрисовки штрихов единичных отрезков на осях
ym=(pix_size/2);
for(x=-nx;x<=nx;x++)
{
xm=(pix_size/2)+(x*mx);
paint.drawLine(xm,ym-3,xm,ym+3);
}
x=0;
xm=(pix_size/2);
for(y=-ny;y<=ny;y++)
{
ym=(pix_size/2)-(y*my);
paint.drawLine(xm-3,ym,xm+3,ym);
}
drawFunc(n, &paint); //вызов функции отрисовки графика
paint.end(); //завершение отрисовки
//передача буфера в класс, отвечающий за окно построения графика
grafForm.transmit(pix);
//визуализация формы, на которой изображён график
grafForm.show();
}
void MainWindow::drawFunc(int _n, QPainter *_paint)
{
float y,xm,ym=0,R=120,G=0,B=160;
for(float x=a; x <=b; x+=step)
{ //цикл, подсчитывающий значения функции f(x) с номером n
switch (_n)
{
case 1: { y=sin(x); break; }
case 2: { y=pow(x,2.0); break; }
case 3: { y=cos(x); break; }
case 4: { y=x; break; }
}
//вычисление пиксельных координат точки
xm=(pix_size/2)+(x*mx);
ym=(pix_size/2)-(y*my);
/* при выходе значения функции за пределы окна происходит переход к следующему шагу (срабатывает только при отрисовке функции y=x2 ) */
if (fabs(ym)>500) continue;
//отладочная печать (результаты выводятся в окно отладки)
qDebug() << "xm=" << xm << " ym=" << ym ;
_paint->setPen(QColor(R,G,B));
_paint->drawPoint(xm,ym); //рисование точки
}
}