Разработка программы калькулятора

Санкт-Петебургский Государственный Политехнический  Университет

факультет при ЦНИИ РТК 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Курсовая  работа

по предмету объектно-ориентированное программирование 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Выполнила студентка группы 2171/2

Мозговая А.В. 
 
 
 
 
 
 
 
 
 

СПб 2010

    1.Постановка задачи

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

Протокол работы калькулятора записать в файл. Предусмотреть возможность просмотра файла из программы.

Вид данных: квадратные уравнения (в действительных или комплексных числах)

Операции: вычисление корней в форме, заданной пользователем. 
 

   2.Диаграмма  классов

 
 
 
 

     
 
 
 

   3.Описание  классов 

      Класс kvyr

class kvyr

{

private:

          float ra,rb,rc;//вещественные коэффициенты квадратного уравнения (квадратное

                                уравнение имеет вид:

                                ax2+bx+c=0, где а,b,c некоторые коэффициенты, в том числе мнимые) 

       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+bx+c=0

вы можете по отдельности ввести вещественное или  мнимое число

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))x+(5+i(6))=0

8. введите 1 чтобы  продолжить. нажмите 0 или любую  клавишу чтобы повторить ввод  коэффициентов: 1

9. решение данного  уравнения:

x1=-1.5+i(-1.658);

x1=-1.5+i(1.658);

10. нажмите 1-показать  лог-файл; 0 или любая другая клавиша-продолжить  работу: 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()==f.getib()==f.getic()==0)

      {

            rx0=-f.getrc()/f.getrb();

            ix0=0;

            rx1=ix1=NULL;

      }

      if((f.getia()==f.getra()==0)&&((f.getib()!=0)||(f.getic()!=0)))

      {

            rx0=(f.getrb()*f.getrc()+f.getib()*f.getic())/(pow(f.getrb(),2)+pow(f.getib(),2));

            ix0=(f.getic()*f.getrb()-f.getrc()*f.getib())/(pow(f.getrb(),2)+pow(f.getib(),2));

            rx1=ix1=NULL;

      }

      if(f.getia()==f.getra()==f.getrb()==f.getib()==0)

      {

            rx0=rx1=ix0=ix1=NULL;

      }

      if(f.getia()==f.getib()==f.getic()==0)  

      {

             D2r=pow(f.getrb(),2)-4*f.getra()*f.getrc(),0.5;

            if(D2r>=0)

            {

                  rx0=(-f.getrb()-pow(D2r,0.5))/(2*f.getra());

                  rx1=(-f.getrb()+pow(D2r,0.5))/(2*f.getra());

                  ix0=ix1=0;

            }

            else

            {

                  rx0=rx1=-f.getrb()/(2*f.getra());

                  ix0=-pow(-D2r,0.5)/(2*f.getra());

                  ix1=-ix0;

            }

      }

      else  

      {

            D2r=pow(f.getrb(),2)-pow(f.getib(),2)-4*f.getra()*f.getrc()+4*f.getia()*f.getic();

            D2i=2*f.getib()-4*f.getra()*f.getic()-4*f.getia()*f.getrc();

            float dr,di;

            dr=pow(pow(pow(D2r,2)+pow(D2i,2),0.5)-fabs(D2r)/2,0.5);

            di=pow(pow(pow(D2r,2)+pow(D2i,2),0.5)+fabs(D2r)/2,0.5); 

            rx0=((-f.getrb()-dr)*f.getra()+(-f.getib()-di)*f.getia())/(2*(pow(f.getra(),2)+pow(f.getia(),2)));

            rx1=((-f.getrb()+dr)*f.getra()+(-f.getib()+di)*f.getia())/(2*(pow(f.getra(),2)+pow(f.getia(),2))); 

            ix0=((-f.getib()-di)*f.getra()-(-f.getrb()-dr)*f.getia())/(2*(pow(f.getra(),2)+pow(f.getia(),2)));

            ix0=((-f.getib()+di)*f.getra()-(-f.getrb()+dr)*f.getia())/(2*(pow(f.getra(),2)+pow(f.getia(),2)));

      }

}

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","a+");

      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("\nуравнение имеет вид:(%.3f+i(%.3f))x^2+(%.3f+i(%.3)f)x+(%.3f+i(%.3)f)=0",ar,ai,br,bi,cr,ci);

            printf(" \nвведите 1 чтобы продолжить. нажмите 0 или любую клавишу чтобы повторить ввод коэффициентов: "); 

            scanf("%d",&c);

            if(c==1)

            {

                  fprintf(p,"Eуравнение  имеет вид:(%.3f+i(%.3f))x^2+(%.3f+i(%.3f))x+(%.3f+i(%.3f))=0  -  %c\n",ar,ai,br,bi,cr,ci,c);

                  f.fillk(ar,br,cr,ai,bi,ci);

                  break;

            }

      }

      fclose(p);

} 

void cinterface::solur(kvyr f,csolve x)

{

      FILE*p;

      p=fopen("c:\\log.txt","a+");

      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(%.3f);\nx1=%.3f+i(%.3f);\n",r0,i0,r1,i1);

      fprintf(p,"Sрешаемое  уравнение имеет вид:(%.3f+i(%.3f))x^2+(%.3f+i(%.3f))x+(%.3f+i(%.3f))=0; его корни имеют вид: x1=%.3f+i(%.3)f; x2=%.3f+i(%.3f);\n",f.getra(),f.getia(),f.getrb(),f.getib(),f.getrc(),f.getic(),r0,i0,r1,i1);

      fclose(p);

} 

void cinterface::rlog()

{

      FILE *p;

      float rar,rai,rbr,rbi,rcr,rci,rx0r,rx0i,rx1r,rx i;

      char c;

      int k;

      p=fopen("c:\\log.txt","a+");

      while(!feof(p))

      {

            c=fgetc(p);

            if(c=='E')

            {

                  fseek(p,-1,1);

                  fscanf(p,"%.3f %.3f %.3f %.3f %.3f %.3f %c",&rar,&rai,&rbr,&rbi,&rcr,&rci,&k);

                  printf("уравнение  имеет вид:(%.3f+i(%.3f))x^2+(%.3f+i(%.3f))x+(%.3f+i(%.3f))=0  -  %d\n",rar,rai,rbr,rbi,rcr,rci,k); 

            }

            else

            {

                  if(c=='S')

                  {

                        fseek(p,-1,1);

                        fscanf(p,"%.3f %.3f %.3f %.3f %.3f %.3f %.3f %.3f %.3f %.3f",&rar,&rai,&rbr,&rbi,&rcr,&rci,&rx0r,&rx0i,&rx1r,&rx1i);

                        printf("решаемое  уравнение имеет вид:(%.3f+i(%.3f))x^2+(%.3f+i(%.3f))x+(%.3f+i(%.3f))=0; его корни имеют вид: x1=%.3f+i(%.3f); x1=%.3f+i(%.3f);\n",rar,rai,rbr,rbi,rcr,rci,rx0r,rx0i,rx1r,rx1i);

                  }

                  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;

      }

} 

Разработка программы калькулятора