Разработка программы калькулятора
Санкт-Петебургский
Государственный
факультет
при ЦНИИ РТК
Курсовая работа
по предмету
объектно-ориентированное
Выполнила студентка группы 2171/2
Мозговая
А.В.
СПб 2010
1.Постановка задачи
Разработать класс «калькулятор», выполняющий указанные в варианте операции. Программа должна выполнять ввод данных, проверку правильности введенных данных, выдачу сообщений в случае ошибок.
Протокол работы калькулятора записать в файл. Предусмотреть возможность просмотра файла из программы.
Вид данных: квадратные уравнения (в действительных или комплексных числах)
Операции: вычисление
корней в форме, заданной пользователем.
2.Диаграмма классов
3.Описание
классов
Класс kvyr
class kvyr
{
private:
float ra,rb,rc;//вещественные
float ia,ib,ic;//мнимые коэффициенты
public:
kvyr();//пустой конструктор
void fillk(float fa,float fb,float fc,float ima,float imb,float imc);//заполнение коэфффициентов
float getra(void);//извлечение соответствующих величин
float getrb(void);
float getrc(void);
float getia(void);
float getib(void);
float getic(void);
};
Класс csolve
class csolve
{
private:
float rx0,rx1; //вещественные части корней квадратного уравнения
float ix0,ix1; //мнимые части
public:
csolve();
float getrx0(void); //извлечение соответствующей величины
float getrx1(void);
float getix0(void);
float getix1(void);
void solve(kvyr f); //решение заданного квадратного уравнения
};
Класс cinterface
class cinterface
{
public:
cinterface(); //пустой конструктор
void crkvyr(kvyr &f); //создание квадратного уравнения в процессе диалога с //пользователем с ведением соответствующих записей в
//лог-файле
void solur(kvyr f,csolve x); //решение уравнения и вывод результатов с //соответствующими записями в лог-файл
void rlog(); //чтение лог-файла
};
4.Реализация
компонентных функций
Класс kvyr
Функция fillk(float fa,float fb,float fc,float ima,float imb,float imc); нужна для того, чтобы было невозможно менять параметры напрямую, т. к. это может привести к ошибкам. Данная функция обеспечивает запись коэффициентов квадратного уравнения в соответствующие переменные. По умолчанию все коэффициенты квадратного уравнения имеют значение 0.
Функции getra(void);
getrb(void); getrc(void); getia(void); getib(void); getic(void);
возвращают значение соответствующей
величины из коэффициентов уравнения.
Класс csolve
Функция solve(kvyr f); обеспечивает решение квадратного уравнения, коэффициенты которого хранятся в соответствующей переменной класса kvyr, а также их запись в переменные rx0;rx1;ix0;ix1.
Функции getrx0(void);
getrx1(void); getix0(void); getix1(void); возвращают соответствующее
значение мнимой или вещественной части
того или иного корня.
5.Реализация
диалога с пользователем
При работе с программой пользователь имеет возможность:
1)ввести вещественную часть коэффициента а;
2)ввести мнимую часть коэффициента а;
3)ввести вещественную часть коэффициента b;
4)ввести мнимую часть коэффициента b;
5)ввести вещественную часть коэффициента c;
6)ввести мнимую часть коэффициента c;
7)увидев составленное уравнение, выведенное на экран, продолжить работу или повторить попытку ввода коэффициентов. В случае продолжения работы, уравнение будет автоматически решено. Результат будет выведен на экран а также записан в лог-файл.
8)просмотреть
лог-файл.
6.Реализация
основной программы
Основная программа
работает в режиме цикла: пока пользователь
не выберет прекращение работы, на экран
будет выводиться предложение задать
коэффициенты очередного квадратного
уравнения и решить его.
7.Пример результатов работы программы
1. введите коэффициенты
a,b и c квадратного уравнения вида:ax^
вы можете по отдельности ввести вещественное или мнимое число
2. введите вещественную часть числа a: 1
3. введите мнимую часть числа a: 2
4. введите вещественную часть числа b: 3
5. введите мнимую часть числа b: 4
5. введите вещественную часть числа b: 5
6. введите мнимую часть числа b: 6
7. уравнение
имеет вид:(1+i(2))x^2+(3+i(4))
8. введите 1 чтобы продолжить. нажмите 0 или любую клавишу чтобы повторить ввод коэффициентов: 1
9. решение данного уравнения:
x1=-1.5+i(-1.658);
x1=-1.5+i(1.658);
10. нажмите 1-показать
лог-файл; 0 или любая другая клавиша-
11. нажмите 1-прекратить
работу; 0 или любая другая клавиша-продолжить
решение квадратных уравнений: 1
8.Программная
документация
Файлы, входящие в проект:
kvyr.cpp
csolve.cpp
cinterface.cpp
kvyr.h
csolve.h
cinterface.h
main.cpp
Инструкция пользователю для работы с проектом:
Можно вводить
любые коэффициенты уравнения, однако,
если коэффициент a будет равным
0, то уравнение станет линейным, и один
из корней примет значение NULL. Если
же, помимо a, коэффициент b также
окажется равным нулю, то оба корня примут
значение NULL.
9.Список используемой литературы
Б.Страуструп «Введение в язык C++».1995
10.Листинг
программы
kvyr.h
class kvyr
{
private:
float ra,rb,rc;
float ia,ib,ic;
public:
kvyr();
void fillk(float fa,float fb,float fc,float ima,float imb,float imc);
float getra(void);
float getrb(void);
float getrc(void);
float getia(void);
float getib(void);
float getic(void);
};
kvyr.cpp
kvyr::kvyr()
{
ra=rb=rc=ia=ib=ic=0;
}
void kvyr::fillk(float fa,float fb,float fc,float ima,float imb,float imc)
{
ra=fa;
rb=fb;
rc=fc;
ia=ima;
ib=imb;
ic=imc;
}
float kvyr::getra(void)
{
return(ra);
}
float kvyr::getrb(void)
{
return(rb);
}
float kvyr::getrc(void)
{
return(rc);
}
float kvyr::getia(void)
{
return(ia);
}
float kvyr::getib(void)
{
return(ib);
}
float kvyr::getic(void)
{
return(ic);
}
csolve.h
#include “kvyr.h”
#include <math.h>
class csolve
{
private:
float rx0,rx1;
float ix0,ix1;
public:
csolve();
float getrx0(void);
float getrx1(void);
float getix0(void);
float getix1(void);
void solve(kvyr f);
};
csolve.cpp
#include “kvyr.h”
#include <math.h>
csolve::csolve()
{
rx0=rx1=ix0=ix1=0;
}
float csolve::getrx0(void)
{
return(rx0);
}
float csolve::getrx1(void)
{
return(rx1);
}
float csolve::getix0(void)
{
return(ix0);
}
float csolve::getix1(void)
{
return(ix1);
}
void csolve::solve(kvyr f)
{
float D2r,D2i;
if(f.getia()==f.getra()=
{
rx0=-f.getrc()/f.
ix0=0;
rx1=ix1=NULL;
}
if((f.getia()==f.getra()
{
rx0=(f.getrb()*f.
ix0=(f.getic()*f.
rx1=ix1=NULL;
}
if(f.getia()==f.getra()=
{
rx0=rx1=ix0=ix1=
}
if(f.getia()==f.getib()=
{
D2r=pow(f.getrb(),2)-4*f.
if(D2r>=0)
{
rx0=(-f.
rx1=(-f.
ix0=ix1=0;
}
else
{
rx0=rx1=-f.
ix0=-pow(-
ix1=-ix0;
}
}
else
{
D2r=pow(f.getrb(),
D2i=2*f.getib()-4*
float dr,di;
dr=pow(pow(pow(
di=pow(pow(pow(
rx0=((-f.getrb()-
rx1=((-f.getrb()+
ix0=((-f.getib()-
ix0=((-f.getib()+
}
}
cinterface.h
#include <stdio.h>
#include “csolve.h”
class cinterface
{
public:
cinterface();
void crkvyr(ckvur &f);
void solur(kvyr f,csolve x);
void rlog();
};
cinterface.cpp
#include <stdio.h>
#include “csolve.h”
cinterface::cinterface()
{
}
void cinterface::crkvyr(kvyr &f)
{
FILE *p;
int c=0;
p=fopen("c:\\log.txt","
float ar=0;
float ai=0;
float br=0;
float bi=0;
float cr=0;
float
ci=0;
printf("\nВвод коэффициентов a, b, c квадратного уравнения :ax^2+bx+c=0\nвы можете по отдельности ввести вещественное или мнимое число");
while(1)
{
printf("\nвведите вещественную часть числа a: ");
scanf("%f",&ar);
printf("\nвведите мнимую часть числа a: ");
scanf("%f",&ai);
printf("\nвведите вещественную часть числа b: ");
scanf("%f",&br);
printf("\nвведите мнимую часть числа b: ");
scanf("%f",&bi);
printf("\nвведите вещественную часть числа c: ");
scanf("%f",&cr);
printf("\nвведите мнимую часть числа c: ");
scanf("%f",&ci);
printf("\
printf(" \nвведите 1 чтобы
продолжить. нажмите 0 или любую клавишу
чтобы повторить ввод коэффициентов: ");
scanf("%d",&c);
if(c==1)
{
fprintf(p,"
f.fillk(ar,
break;
}
}
fclose(p);
}
void cinterface::solur(kvyr f,csolve x)
{
FILE*p;
p=fopen("c:\\log.txt","
float r0,i0,r1,i1;
x.solve(f);
r0=x.getrx0();
i0=x.getix0();
r1=x.getrx1();
i1=x.getix1();
printf("\nрешение
данного уравнения:\nx1=%.3f+i(
fprintf(p,"Sрешаемое
уравнение имеет вид:(%.3f+i(%.
fclose(p);
}
void cinterface::rlog()
{
FILE *p;
float
rar,rai,rbr,rbi,rcr,rci,rx0r,
char c;
int k;
p=fopen("c:\\log.txt","
while(!feof(p))
{
c=fgetc(p);
if(c=='E')
{
fseek(p,-1,
fscanf(p,"%.
printf("
}
else
{
if(c=='S')
{
fseek(
fscanf
printf
}
else
printf
}
}
fclose(p);
}
main.cpp
#include “interface.h”
#include <stdio.h>
void main()
{
kvyr f;
csolve g;
cinterface h;
int cont;
while(1)
{
h.crkvyr(f);
h.solur(f,g);
printf("\n нажмите 1-показать лог-файл; 0 или любая другая клавиша-продолжить работу:");
scanf("%d",&cont);
if(cont==1)
h.rlog();
printf("\n нажмите 1-прекратить работу; 0 или любая другая клавиша-продолжить решение квадратных уравнений:");
scanf("%d",&cont);
if(cont==1)
break;
}
}