Добавил:
Kolobok
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:
#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;
};