《解方程》(c++開源) (v0.5.5實時更新)

 

+0.1ios

增長了彩蛋windows

+0.0.2app

1:添加了titleide

2:添加了錯誤音響this

#include <cstdio>
#include <windows.h>
#include <cmath>
#include <conio.h>
#include <stack>
#include <cstring>
#include <queue>
#include <ctime>
#include <iostream>
#include <algorithm>

const HANDLE handle=GetStdHandle(STD_OUTPUT_HANDLE);
char ly,a[101];
struct Node1 {
	double a,b;
	Node1 () {}
	Node1 (const double sa,const double sb) {
		this->a=sa;this->b=sb;
	}
};
struct Node2 {
	double a,b,c;
	Node2 () {}
	Node2 (const double sa,const double sb,const double sc) {
		this->a=sa;this->b=sb;this->c=sc;
	}
};
struct DC {
	double a;
	char b;
	DC () {}
	DC (const double sa,const char sb) {
		this->a=sa;this->b=sb;
	}
};

void Home () ;
void Ads () ;
void Guangbiaoxy (int x,int y);
void Guangbiaohide ();
void Jie11 ();
void Jie21 ();
void Jie110 ();
void Sb ();
void Sbegin (int speed) ; 
void User ();
void Law (bool bl);
int Shu (char s);
void Calc11 (double &a,double &b,std::queue <DC> &q);
void Calc21 (double &a,double &b,double &c,std::queue <DC> &q);
void Hua (const int &head,const int &tail,std::queue <DC> &q); 

int main () {
	system("mode con cols=50 lines=15");
	system("color 71");
	system("title 解方程");
	Guangbiaohide(); 
	Ads();     return 0;
	Home();
	return 0;
}

void Ads () {
	for(int i=1;i<=5;++i) {
		Guangbiaoxy(2,i);printf("█");
		Guangbiaoxy(10,i);printf("█");
		Guangbiaoxy(26,i);printf("█");
		Guangbiaoxy(34,i);printf("█");
		Guangbiaoxy(42,i);printf("█");
		Guangbiaoxy(i*2,3);printf("█");
		Guangbiaoxy(12+i*2,1);printf("█");
		Guangbiaoxy(12+i*2,5);printf("█");
		Guangbiaoxy(24+i*2,1);printf("█");
		Guangbiaoxy(24+i*2,5);printf("█");
		Guangbiaoxy(36+i*2,1);printf("█");
		Guangbiaoxy(36+i*2,5);printf("█");		
	}
	Guangbiaoxy(20,2);printf("█");
	Guangbiaoxy(18,3);printf("█");
	Guangbiaoxy(16,4);printf("█");
	Guangbiaoxy(20,7);printf("請把輸入法換到英文模式");
	Guangbiaoxy(20,9);printf("加載中 v0.5.3"); 
	Sleep(314);
}

void Guangbiaoxy(int x,int y) {
    COORD pos = {x,y};
    SetConsoleCursorPosition(handle,pos); 
}
 
void Guangbiaohide() {
	CONSOLE_CURSOR_INFO Guangbiao;
	GetConsoleCursorInfo(handle,&Guangbiao);
	Guangbiao.bVisible = 0;
	SetConsoleCursorInfo(handle,&Guangbiao);
}


void Home () {
	system("cls");
	Guangbiaoxy(22,1); printf("解方程");
	Guangbiaoxy(18,3); printf("按a:一元一次");
	Guangbiaoxy(18,5); printf("按b:二元一次");
	Guangbiaoxy(18,7); printf("按c:一元一次不等式");
	Guangbiaoxy(18,9); printf("按d:用戶須知"); 
	label:
	ly=getch();
	switch (ly) {
		case 'a' : Jie11(); break;
		case 'b' : Jie21(); break;
		case 'c' : Jie110(); break;
		case 'd' : User(); break;
		default : Sb(); goto label;
	}
}

void Sb () {
	Guangbiaoxy(3,14);printf("\a輸入錯誤");
}

void Jie11 () {
	system("cls");
	int alen,dengyu=1;
	Guangbiaoxy(0,1);printf("請輸入方程\n");
	memset(a,0,sizeof(a));
	scanf("%s",a+1);
	alen=strlen(a+1);
	if(!strcmp(a+1,"iamhappy")) Sbegin(500);
	for(int i=1;i<=alen;i++) {
		if(a[i]=='=') {
			dengyu=i;break;	
		}
	}
	std::queue <DC> q;
	double la,lb,ra,rb;
	Hua(1,dengyu-1,q);
	Calc11(la,lb,q);
	Hua(dengyu+1,alen,q);
	Calc11(ra,rb,q);
	if(la-ra==0) printf("此方程無解");
	else printf("x=%g",(rb-lb)*1.0/(la-ra));
	label:
	Guangbiaoxy(0,5);printf("q:返回\n");
	Guangbiaoxy(0,6);printf("w:重來\n");
	ly=getch();
	switch (ly) {
		case 'q' : Home(); break;
		case 'w' : Jie11(); break;
		default : Sb(); goto label;
	} 
}

void Jie21 () {
	system("cls");
	int alen,dengyu=1;
	Guangbiaoxy(0,1);printf("請輸入方程1:\n");
	memset(a,0,sizeof(a));
	scanf("%s",a+1);
	alen=strlen(a+1);
	for(int i=1;i<=alen;i++) {
		if(a[i]=='=') {
			dengyu=i;break;	
		}
	}
	std::queue <DC> q;
	double la1,lb1,lc1,ra1,rb1,rc1;
	double a1,a2,b1,b2,c1,c2;
	Hua(1,dengyu-1,q);
	Calc21(la1,lb1,lc1,q);
	Hua(dengyu+1,alen,q);
	Calc21(ra1,rb1,rc1,q);
	a1=la1-ra1;
	b1=lb1-rb1;
	c1=lc1-rc1;
	Guangbiaoxy(0,3);printf("請輸入方程2:\n");
	memset(a,0,sizeof(a));
	scanf("%s",a+1);
	alen=strlen(a+1);
	for(int i=1;i<=alen;i++) {
		if(a[i]=='=') {
			dengyu=i;break;	
		}
	}
	Hua(1,dengyu-1,q);
	Calc21(la1,lb1,lc1,q);
	Hua(dengyu+1,alen,q);
	Calc21(ra1,rb1,rc1,q);
	a2=la1-ra1;
	b2=lb1-rb1;
	c2=lc1-rc1;
	double T,Tx,Ty;
	T=b1*a2-a1*b2;
	if(T==0) printf("此方程無解");
	else {
		Tx=c2*a1-c1*a2;
		Ty=c1*b2-c2*b1;
		printf("x=%g\n",Tx*1.0/T);
		printf("y=%g\n",Ty*1.0/T);
	}
	label:
	Guangbiaoxy(0,8);printf("q:返回\n");
	Guangbiaoxy(0,9);printf("w:重來\n");
	ly=getch();
	switch (ly) {
		case 'q' : Home(); break;
		case 'w' : Jie21(); break;
		default : Sb(); goto label;
	} 	
}

void Jie110 () {
	system("cls");
	int alen,dengyu=1;
	Guangbiaoxy(0,1);printf("請輸入方程\n");
	memset(a,0,sizeof(a));
	scanf("%s",a+1);
	alen=strlen(a+1);
	bool bl;
	int bol;
	for(int i=1;i<=alen;++i) {
		if(a[i]=='<') {
			dengyu=i;
			bl=0;
			if(a[i+1]=='=') bol=2;
			else bol=1;	
			break;
		}
		if(a[i]=='>') {
			dengyu=i;
			bl=1;
			if(a[i+1]=='=') bol=2;
			else bol=1;
			break;
		}
	}
	std::queue <DC> q;
	double la,lb,ra,rb;
	Hua(1,dengyu-1,q);
	Calc11(la,lb,q);
	Hua(dengyu+bol,alen,q);
	Calc11(ra,rb,q);
//	std::cout<<ra<<" "<<rb<<" "<<la<<" "<<lb; 
	if(la-ra==0) printf("此方程無解");
	else {
		printf("x");
		if(la-ra<0) {
			if(bl==1) bl=0;
			else bl=1;
		}
		if(bl==1) printf(">");
		else printf("<");
		if(bol==2) printf("=");
		printf("%g",(rb-lb)*1.0/(la-ra));
	}
	label:
	Guangbiaoxy(0,5);printf("q:返回\n");
	Guangbiaoxy(0,6);printf("w:重來\n");
	ly=getch();
	switch (ly) {
		case 'q' : Home(); break;
		case 'w' : Jie110(); break;
		default : Sb(); goto label;
	} 
}

void Hua (const int &head,const int &tail,std::queue <DC> &q) {
	std::stack <char> s;
	int x=head,add=0;
	bool pm=0;
	while(x<=tail) {
		int shux=Shu(a[x]);
		if(a[x]>='0' && a[x]<='9') {
			double temp=0;
			while(x<=tail && a[x]>='0' && a[x]<='9') {
				temp=temp*10+a[x]-'0';
				++x;
			}
			if(a[x]=='.') {
				++x;
				while(x<=tail && a[x]>='0' && a[x]<='9') {
					temp=(temp*10+a[x]-'0')*0.1;
					++x;
				}
			}
			if(pm==1) {
				q.push(DC(-temp,0));
				pm=0;
			}
			else q.push(DC(temp,0));		
			if(Shu(a[x])==0) {
				if(pm==1) {
					add=-temp;
					pm=0;
				}
				else add=temp;
			}
			continue;	
		}
		else if(shux==0) {
			if(pm==1){
				q.push(DC(0,-a[x]));
				pm=0;
			} 
			else q.push(DC(0,a[x]));
			if(add!=0) {
				q.push(DC(0,'*'));
				add=0;
			}
		}
		else if(shux==1) s.push(a[x]);
		else if(shux==3) {
			if(a[x]=='-' && (a[x-1]<'0' || a[x-1]>'9') && a[x-1]!='x' && a[x-1]!='y') {
				pm=1; 
				++x;
				continue;
			}
			while(!s.empty() && Shu(s.top())>=3) {
				q.push(DC(0,s.top()));
				s.pop();	
			}
			s.push(a[x]);
		} else if(shux==4) {
			while(!s.empty() && Shu(s.top())==4) {
				q.push(DC(0,s.top()));
				s.pop();	
			}
			s.push(a[x]);			
		} else if(shux==2) {
			while(!s.empty() && s.top()!='(') {
				q.push(DC(0,s.top()));
				s.pop();
			}
			s.pop();
		}
		++x;
	}
	while(!s.empty()) {
		q.push(DC(0,s.top()));
		s.pop();
	}
}

int Shu (char s) {
	if(s=='+' || s=='-') return 3;
	if(s=='/' || s=='*') return 4;
	if(s=='(') return 1;
	if(s==')') return 2;
	if(s=='x' || s=='y') return 0;
	return -1;
}

void Calc21 (double &a,double &b,double &c,std::queue <DC> &q) {
	std::stack <Node2> s;
	while(!q.empty()) {
		if(q.front().b==0) {
			s.push(Node2(0,0,q.front().a));
		}
		else if(q.front().b==120) {
			s.push(Node2(0,1,0));
		}
		else if(q.front().b==-120) {
			s.push(Node2(0,-1,0));
		}
		else if(q.front().b==121) {
			s.push(Node2(1,0,0));
		}
		else if(q.front().b==-121) {
			s.push(Node2(-1,0,0));
		}
		else if(q.front().b=='+') {
			Node2 tempa,tempb;
			tempa.a=s.top().a;
			tempa.b=s.top().b;
			tempa.c=s.top().c;
			s.pop();
			tempb.a=s.top().a;
			tempb.b=s.top().b;
			tempb.c=s.top().c;
			s.pop();
			s.push(Node2(tempa.a+tempb.a,tempa.b+tempb.b,tempa.c+tempb.c));
		} 
		else if(q.front().b=='-') {
			Node2 tempa,tempb;
			tempa.a=s.top().a;
			tempa.b=s.top().b;
			tempa.c=s.top().c;
			s.pop();
			tempb.a=s.top().a;
			tempb.b=s.top().b;
			tempb.c=s.top().c;
			s.pop();
			s.push(Node2(tempb.a-tempa.a,tempb.b-tempa.b,tempb.c-tempa.c));
		}
		else if(q.front().b=='*') {
			Node2 tempa,tempb;
			tempa.a=s.top().a;
			tempa.b=s.top().b;
			tempa.c=s.top().c;
			s.pop();
			tempb.a=s.top().a;
			tempb.b=s.top().b;
			tempb.c=s.top().c;
			s.pop();
			s.push(Node2(tempa.a*tempb.c+tempb.a*tempa.c,tempa.b*tempb.c+tempb.b*tempa.c,tempa.c*tempb.c));
		}
		else if(q.front().b=='/') {
			Node2 tempa,tempb;
			tempa.a=s.top().a;
			tempa.b=s.top().b;
			tempa.c=s.top().c;
			s.pop();
			tempb.a=s.top().a;
			tempb.b=s.top().b;
			tempb.c=s.top().c;
			s.pop();
			s.push(Node2(tempb.a/tempa.c,tempb.b/tempa.c,tempb.c/tempa.c));
		}
		q.pop();
	}
	a=s.top().a;
	b=s.top().b;
	c=s.top().c;
	s.pop();	
}

void Calc11 (double &a,double &b,std::queue <DC> &q) {
		std::stack <Node1> s;
		while(!q.empty()) {
		if(q.front().b==0) {
			s.push(Node1(0,q.front().a));
		}
		else if(q.front().b==120) {
			s.push(Node1(1,0));
		}
		else if(q.front().b==-120) {
			s.push(Node1(-1,0));
		}
		else if(q.front().b=='+') {
			Node1 tempa,tempb;
			tempa.a=s.top().a;
			tempa.b=s.top().b;
			s.pop();
			tempb.a=s.top().a;
			tempb.b=s.top().b;
			s.pop();
			s.push(Node1(tempa.a+tempb.a,tempa.b+tempb.b));
		} 
		else if(q.front().b=='-') {
			Node1 tempa,tempb;
			tempa.a=s.top().a;
			tempa.b=s.top().b;
			s.pop();
			tempb.a=s.top().a;
			tempb.b=s.top().b;
			s.pop();
			s.push(Node1(tempb.a-tempa.a,tempb.b-tempa.b));
		}
		else if(q.front().b=='*') {
			Node1 tempa,tempb;
			tempa.a=s.top().a;
			tempa.b=s.top().b;
			s.pop();
			tempb.a=s.top().a;
			tempb.b=s.top().b;
			s.pop();
			s.push(Node1(tempa.a*tempb.b+tempa.b*tempb.a,tempa.b*tempb.b));
		}
		else if(q.front().b=='/') {
			Node1 tempa,tempb;
			tempa.a=s.top().a;
			tempa.b=s.top().b;
			s.pop();
			tempb.a=s.top().a;
			tempb.b=s.top().b;
			s.pop();
			s.push(Node1(tempb.a/tempa.b,tempb.b/tempa.b));
		}
		q.pop();
	}
	a=s.top().a;
	b=s.top().b;
	s.pop();
}

void Law () {
	
}

void User () {
	system("cls");
	Guangbiaoxy(0,1);
	printf("本程序無鼠標操做,一切按提示輸入,英文輸入法最佳\n");
	printf("不安提示輸入,後果自負\n");
	printf("注意:\n<= 是小於等於 >= 是大於等於 *是乘 /是除以\n");
	printf("一元未知數只能是x,二元未知數只能是x和y\n");
	printf("只能有(),無{}[]\n");
	printf("不能是分式\n"); 
	printf("做者:LaoYin_X  \n");
	printf("聯繫:https://www.cnblogs.com/Srand-X/\n");
	label:
	Guangbiaoxy(0,11);printf("q:返回\n");
	Guangbiaoxy(0,12);printf("w:重來\n");
	ly=getch();
	switch (ly) {
		case 'q' : Home(); break;
		case 'w' : User(); break;
		default : Sb(); goto label;
	} 
}

void Sbegin (int speed) 
{
	srand(time(NULL));
	system("mode con cols=80 lines=42");
	system("color 06");
	system("title 貪吃蛇");
	MessageBox(NULL,TEXT("版權由LaoYin_X享有\n(和本做者是一我的)\n聯繫:https://www.cnblogs.com/Srand-X/"),"用戶提示",MB_OKCANCEL); 
	Guangbiaohide();
	for (int i=0;i<80;++i) 
	{
		Guangbiaoxy(i,40);
		printf("-");
	}
	Guangbiaoxy(0,41);printf("w:上 s:下 a:左 d:右 r:返回 e:暫停 q:開始 p:速度 滿屏時勝利 做者:LaoYin_X");
	//
	int direction=4;//1:w 2:s 3:a 4:d
	int da=0,result=0;
	int dir[5][2]={0,0,0,-1,0,1,-1,0,1,0};
	bool goon=0;//1:e 0:q
	char Sn=0;
	bool Map[40][40]={};
	Map[1][0]=Map[0][0]=1; 
	std::queue <int> qx;
	std::queue <int> qy;
	qx.push(1);
	qy.push(0);
	qx.push(0);
	qy.push(0);
	Guangbiaoxy(0,0);printf("█");
	Guangbiaoxy(2,0);printf("█");
	int newx=19,newy=19;
	Guangbiaoxy(38,19);
	printf("█");
	time_t t1=clock();
	while(1) 
	{
		label:
		if(_kbhit()) {	
			Sn=getch();
			switch (Sn)
			{
				case 'r' : Sbegin(speed); break;
				case 'e' : goon=1; break;
				case 'q' : goon=0; break;
				case 'w' : if(direction!=2) direction=1; break;
				case 's' : if(direction!=1) direction=2; break;
				case 'a' : if(direction!=4) direction=3; break;
				case 'd' : if(direction!=3) direction=4; break;
				case 'p' : 
					Guangbiaoxy(0,35);
					printf("請輸入速度(單位:毫秒):");
					int sp;
					scanf("%d",&sp);
					Sbegin(sp);
					break; 
				default : printf("\a"); goto label; break; 
			}
		}
		time_t t2=clock()%10000000;
		if(goon==1 || da==(t2-t1)/speed) continue;
		else
		{
			da=(t2-t1)/speed; 
			int S=qx.size(),sa,sb; 
			for(int i=0;i<S;++i)
			{
				if(i==0)
				{
					sa=qx.front();
					sb=qy.front();
					int tempx=sa,tempy=sb;
					tempx+=dir[direction][0];
					tempy+=dir[direction][1];
					if(tempx<0 || tempx>=40 || tempy<0 || tempy>=40 || Map[tempx][tempy]==1)
					{
						result=S;
						goto label1;
					}
					Map[tempx][tempy]=1;
					if(tempx==newx && tempy==newy)
					{
						qx.push(tempx+dir[direction][0]);
						qy.push(tempy+dir[direction][1]);
						Map[tempx+dir[direction][0]][tempy+dir[direction][1]]=1;
						Guangbiaoxy(qx.back()*2,qy.back());
						printf("█");
						while(1)
						{
							newx=rand()%40;
							newy=rand()%40;
							if(!Map[newx][newy]) break;
						}
						Guangbiaoxy(newx*2,newy);
						printf("█");
					}
					qx.push(tempx);
					qx.pop();
					qy.push(tempy);
					qy.pop();
					Guangbiaoxy(qx.back()*2,qy.back());
					printf("█");
					continue;
				}
				if(i==S-1)
				{
					Map[qx.front()][qy.front()]=0;
					Guangbiaoxy(qx.front()*2,qy.front());
					printf("  ");
				}
				qx.push(sa);
				qy.push(sb); 
				sa=qx.front();
				sb=qy.front();
				qx.pop();
				qy.pop();
			}
		}
	}
	label1:	
	Guangbiaoxy(30,19);
	if(result!=1600) 
	{	
		printf("你失敗了 得分:%d 按r重來",result);
	}
	else 
	{
		printf("你勝利了 得分:%d 按r重來",result); 
	}
	while(!qx.empty())
		qx.pop();
	while(!qy.empty())
		qy.pop();	
	while(1)
	{
		Sn=getch(); 
		if(Sn=='r') 
		{
			Sbegin(speed);
			return;
		}
		printf("\a");
	}
}v0.5.5
相關文章
相關標籤/搜索