Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

С++ ЕНФ / LABA 5 / laba5_2

.cpp
Скачиваний:
12
Добавлен:
25.05.2014
Размер:
9.85 Кб
Скачать
#include <iostream.h>
#include <conio.h>
#include <math.h>
//Blok funkcii raboti s ekranom
struct tema_menu       // structura pozicii punktov menu
     { char* Tema;
       int Col, Row;
     };
inline void color(const int text, const int fon) // Zamena cveta
{
 textbackground(fon);
 textcolor(text);
};
inline void pokaz(const tema_menu A[], const int pos) //Vivod na ekran punktov
{
 gotoxy(A[pos].Col, A[pos].Row);
 cprintf(A[pos].Tema);
 //gotoxy(x,y)-perevod kursora na zadannuyu posiciyu
 //cprintf("",...)-analog cin v standartnih potokah vvoda/vivoda
};
int Upravlenie(const tema_menu A[], const int max) //Upravlenie kursorom
{
 int n=0; char Bool = 0;
 color(11, 0);
 for(int i=1; i<=max; i++) pokaz(A, i);
 color(0, 3);
 pokaz(A, 0);
 while(!Bool)
   {
    switch(getch())
    {
    //esli najat' vniz
    case 80: { if(n< max)
	       { color(11, 0);
		 pokaz(A,n);
		 n++;
		 color(0, 3);
		 pokaz(A,n);
		};
	       break;
	     };
    //esli najat' vlevo
    case 75: { if(!(n==0))
   {             color(11, 0);
		 pokaz(A,n);
		 n=0;
		 color(0, 3);
		 pokaz(A,n);
	       };
	       break;
	     };
    //esli najat' vverh
    case 72: { if(n > 0)
	       { color(11, 0);
		 pokaz(A,n);
		 n--;
		 color(0, 3);
		 pokaz(A,n);
	       };
	       break;
	     };
    //esli najat' vpravo
    case 77: { if(!(n==max))
	       { color(11, 0);
		 pokaz(A,n);
		 n=max;
		 color(0, 3);
		 pokaz(A,n);
	       };
	       break;
	     };

    //esli najat' ESC
    case 27: {
	       color(11, 0);
	       return max;
	     };
    //esli najat' ENTER
    case 13: {
	       color(11, 0);  //
	       return n;
	     };
    };
   };
 return -1;    // V sluchae oshibki
};


// Block funkcii raboti s vectorami

struct Vector           // structura koordinat vectorov
     {
      double x, y, z;
     };

struct Vectors          // structura vectorov
     {
      Vector A, B, C;
     };

inline double modul(const Vector V) //Modul vectora
{
 return (sqrt(V.x*V.x + V.y*V.y + V.z*V.z));
};


Vector sozdanie_v(double x, double y, double z)
{
 Vector Fix = {0, 0, 0};
 Fix.x = x;
 Fix.y = y;
 Fix.z = z;
 return Fix;
};

double operator *(Vector A, Vector B)
{
 return double(A.x*B.x + A.y*B.y + A.z*B.z);
};

Vector operator +(Vector A, Vector B)
{
 return sozdanie_v(A.x+B.x, A.y+B.y, A.z+B.z);
};

Vector operator -(Vector A, Vector B)
{
 return sozdanie_v(A.x-B.x, A.y-B.y, A.z-B.z);
};

Vector operator *(double a, Vector B)
{
 return sozdanie_v(a*B.x, a*B.y, a*B.z);
};

Vector operator *(Vector A, double b)
{
 return sozdanie_v(b*A.x, b*A.y, b*A.z);
};

Vector operator &(Vector A, Vector B)
{
 return sozdanie_v(A.y*B.z-A.z*B.y, -(A.x*B.z-A.z*B.x), A.x*B.y-A.y*B.x);
};

int zashita(double &num)
{
 //symb- vvedennii simvol
 //stroka- stroka napechatannih simvolov
 //do_tochki-kol- vo simvolov do tochki
 //pos- posiciya kursora
 char symb, *stroka, pos = 0, do_tochki = 0;
 stroka = new char;
 _setcursortype(2);  // tip normal'nogo kursora
 color(11,0);
 while(pos<20)
   {
    symb = getch();
    if(((symb>46)&&(symb<58))||((pos==0)&&(symb==45))||((!do_tochki)&&(symb==46)&&(pos)))
     {
      if((!do_tochki)&&(symb==46)&&(pos)) do_tochki = pos + 1;
      pos++;
      if(pos==20)            //maximal'noe kol-vo simvolov
       {
	stroka++;
	*stroka = '\0';
	pos--;
	break;
       };
      stroka++;
      *stroka = symb;
      putch(symb);
     };
    if((symb==13)&&(pos))     // Enter
     {
      stroka++;
      *stroka = '\0';
      break;
     };
    if(symb==27)              // ESC
     { delete stroka;
       _setcursortype(0);//0-non kursor
       return -1;
     };
    if(symb==8)               // Backspace
     {
       if(pos>0)
	{
	  pos--; if(*stroka==46) do_tochki = 0; stroka--;
	  gotoxy(wherex() - 1, wherey());
	  //wherex()-deistvitel'naya posiciya kursora po gorisontali
	  putch(' '); gotoxy(wherex() - 1, wherey());
	  //putch()-vivod simvola na ekran stekushego polojeniya consoli
	};
     };
   };
 if(!do_tochki)
  do_tochki = pos + 1;
 num = 0;
 stroka--;
 while(pos>do_tochki)
   {
     num += (pow10(do_tochki - pos)) * (*stroka - 48);
     pos--;
     stroka--;
   };
 if(pos==do_tochki) stroka--;
 pos = do_tochki - 1;
 //osobii sluchai- vvod simvola "-"
 while(pos>1)
   {
     num += (pow10(do_tochki - pos - 1)) * (*stroka - 48);
     pos--;
     stroka--;
   };
 if(*stroka==45)
  { num =- num; }
 else
  { num += (pow10(do_tochki-pos - 1)) * (*stroka - 48); };
 _setcursortype(0);
 return 0;
};

//Vivod na ekran koordinat vectora

int pokaz_v(const char c, const Vector V, const int Col, const int Row)
{
 gotoxy(Col, Row);
 cout << "Vektor " << c << " = {" << V.x << ", " << V.y << ", " << V.z << "}";
 cout << "; |" << c << "| = " << modul(V) << "                    ";
 return 0;
};

//Zadanie koordinat vectora

int vvod_v(const char c, Vector& V, const int Col, const int Row)
{
 gotoxy(1, 15);
 cout << "Vvedite X coordinatu vectora " << c << ": ";
 zashita(V.x);
 gotoxy(1, 15);
 cout << "                                                                                 ";
 pokaz_v(c, V, Col, Row);
 gotoxy(1, 15);
 cout << "Vvedite Y coordinatu vectora " << c << ": ";
 zashita(V.y);
 gotoxy(1, 15);
 cout << "                                                                                 ";
 pokaz_v(c, V, Col, Row);
 gotoxy(1, 15);
 cout << "Vvedite Z coordinatu vectora " << c << ": ";
 zashita(V.z);
 gotoxy(1, 15);
 cout << "                                                                                 ";
 pokaz_v(c, V, Col, Row);
 return 0;
};

/////////////////////////////////////////////////////////////////////

typedef int(*FunctionMenu)(Vectors&);  //  Ukazatel' na funkciyu Menu

int Uslovie(Vectors&);         //Prototip funkcii s uloviem zadachi
int Vvod(Vectors&);            //Prototip funkcii s vvodom dannih
int Skalyarnoe(Vectors&);      //Prototip funkcii s raschetom skalyarnogo proizvedeniya vectorov
int Vectornoe(Vectors&);       //Prototip funkcii s raschetom vectornogo  proizvedeniya vectorov
int Smeshannoe(Vectors&);       //Prototip funkcii s raschetom smeshannogo proizvedeniya vectorov
int Vihod(Vectors&);           //Prototip funkcii s usloviem vihoda


void main()
{
 tema_menu Glavnoe_Menu[2]  = {" Vipolnenie programmi  ", 28, 11,
			       " Vihod          ", 28, 12 };
 tema_menu Menu[5] =  { " Vvod dannih                       ", 1, 1,
			" Raschet skalarnogo proizvedeniya  ", 1, 2,
			" Raschet vectornogo proizvedeniya  ", 1, 3,
			" Raschet smeschanogo proizvedeniya ", 1, 4,
			" Vozvrat k usloviyu zadachi        ", 1, 5 };
 FunctionMenu Function_Menu[6] = { Uslovie,Vihod, Vvod, Skalyarnoe,Vectornoe, Smeshannoe };
 char Konec=0, Kon;
 Vectors dannie={0, 0, 0, 0, 0, 0, 0, 0, 0}, &Dannie = dannie;
 textmode(3);//ustanovka cvetnogo modulya okna
 clrscr();
 _setcursortype(0);
 while(!Konec)
 {
  (*Function_Menu[0])(Dannie);
  switch(Upravlenie(Glavnoe_Menu, 1))
   {
    case 0: {
	      Kon = 0;
	      while(!Kon)
		{
		 //window(x1,y1,x2,y2)-Okno c uglovimi koordinatami (x1,y1) i (x2,y2)
		 window(1, 1, 80, 25);
		 color(11, 0);
		 clrscr();
		 gotoxy(11, 7);
		 cprintf("------------------------");
		 gotoxy(11, 8);
		 cprintf("   Neobhodimie Dannie   ");
		 gotoxy(11, 9);
		 cprintf("------------------------");
		 pokaz_v('a', Dannie.A, 1, 11);
		 pokaz_v('b', Dannie.B, 1, 12);
		 pokaz_v('c', Dannie.C, 1, 13);
		 switch(Upravlenie(Menu, 4))
		  {
		   case 0: { (*Function_Menu[2])(Dannie); break; };
		   case 1: { (*Function_Menu[3])(Dannie); break; };
		   case 2: { (*Function_Menu[4])(Dannie); break; };
		   case 3: { (*Function_Menu[5])(Dannie); break; };
		   case 4: { Kon = 1; break; };
		  };
		};
	      window(1,1,80, 25);
	      break;
	    };
    case 1: { if((*Function_Menu[1])(Dannie)) Konec = 1;
	      break;
	    };
   };
 };
 _setcursortype(2);
 clrscr();
}

////////////////////////////////////////////////////////////////////////////
//Block funkcii raboti s punknami Menu
////////////////////////////////////////////////////////////////////////////

int Uslovie(Vectors& a)
{
 color(11, 0);
 clrscr();
 gotoxy(1, 1);
 cprintf("Uslovie zadachi : This program was made for making some operations on Vectors");
 gotoxy(1, 3);
 cprintf("1).Raschet skaljarnogo proizvedeniya 3x par vectorov a, b, c");
 gotoxy(1, 4);
 cprintf("2).Raschet vectornogo  proizvedeniya 3x par vectorov a,b,c");
 gotoxy(1, 5);
 cprintf("3).Raschet smeshannogo proizvedeniya 3x par vectorov a,b,c");
 getch();
 clrscr();
 return 0;
};

int Vvod(Vectors& a)
{
 vvod_v('a', a.A, 1, 11);
 vvod_v('b', a.B, 1, 12);
 vvod_v('c', a.C, 1, 13);
 window(1, 1, 80, 25);
 return 0;
};


int Skalyarnoe(Vectors& a)
{
 gotoxy(1, 16);
 cout << "(a, b) = " << a.A * a.B;
 gotoxy(1, 17);
 cout << "(a, c) = " << a.A * a.C;
 gotoxy(1, 18);
 cout << "(b, c) = " << a.B * a.C;
 getch();
 return 0;
};

int Vectornoe(Vectors& a)
{
 Vector Res = a.B*(a.A * a.C) - a.C*(a.A * a.B);
 gotoxy(1, 16);
 cout << "Vektor [a,[b,c]] = (" << Res.x << ", " << Res.y << ", " << Res.z << "),\n";
 cout << "|[a,[b,c]]| = " << modul(Res) << ".";
 getch();
 return 0;
};

int Smeshannoe(Vectors& a)
{
 double result = (a.A & a.B) * a.C;
 gotoxy(1, 16);
 cout << "([a,b],c) = " << result;
 getch();
 return 0;
};

int Vihod(Vectors& a)
{
 tema_menu Otvet[2] = {" Da ", 32, 12, " Net ", 37, 12};
 color(11, 0);
 clrscr();
 gotoxy(24, 11);
 cprintf("Vi deistvitelno jelaete viiti?");
 if(!Upravlenie(Otvet, 1)) return 1;
 clrscr();
 return 0;
};
Соседние файлы в папке LABA 5