#include<bits/stdc++.h>
#include<windows.h>
using namespace std;
int sum = 0;
int rr = 0;
int mulu()
{
puts("請選擇難度:\n");
puts("1.10以內\n") ;
puts("2.100以內\n");
puts("3.1000以內\n");
int h;
scanf("%d",&h);int flag = 1;
while(flag)
{
switch(h)
{
case 1:flag = 0;return 10;
case 2:flag = 0;return 100;
case 3:flag = 0;return 1000;
default:printf("請重新輸入\n");flag = 1;break;
}
}
}
void ti()
{
puts("請輸入題量:");
scanf("%d",&sum);
puts("ok\n");
}
void fushu()
{
ti();
int flag = mulu();
for(int i = rr;i < rr + sum;++i)
{
int g1 = -(rand()%flag);
int g2 = -(rand()%flag);
int h = rand()%4;int ans;double hh;
switch(h)
{
case 0:printf("%d+%d= ",g1,g2);puts("請輸出答案:");scanf("%d",&ans);
if(ans==g1+g2)
{
printf("答案正確\n");
}
else{
printf("錯誤\n");
printf("正確答案是%d\n",g1+g2);
}
break;
case 1:printf("%d-%d= ",g1,g2);puts("請輸出答案:");scanf("%d",&ans);
if(ans==g1-g2)
{
printf("答案正確\n");
}
else{
printf("錯誤\n");
printf("正確答案是%d\n",g1-g2);
}
break;
case 2:printf("%d*%d= ",g1,g2);puts("請輸出答案:");scanf("%d",&ans);
if(ans==g1*g2)
{
printf("答案正確\n");
}
else{
printf("錯誤\n");
printf("正確答案是%d\n",g1*g2);
}
break;
case 3:printf("%d/%d= ",g1,g2);puts("請輸出答案:");scanf("%lf",&hh);
if(hh==g1/g2)
{
printf("答案正確\n");
}
else{
printf("錯誤\n");
printf("正確答案是%d\n",g1/g2);
}
break;
default:break;
}
}
}
void xiaoshu()
{
ti();
int flag = mulu();
for(int i = rr;i < rr + sum;++i)
{
int h5 = rand()%flag+1;
int h6 = rand()%flag;
float h3 = rand()%100;
float h4 = rand()%100;
float g1 = h5+h3/100.0;
float g2 = h6+h4/100.0;
int h = rand()%4;float ans;float hh;
switch(h)
{
case 0:printf("%f+%f= ",g1,g2);puts("請輸出答案:");scanf("%f",&ans);
if(ans==g1+g2)
{
printf("答案正確\n");
}
else{
printf("錯誤\n");
printf("正確答案是%f\n",g1+g2);
}
break;
case 1:printf("%f-%f= ",g1,g2);puts("請輸出答案:");scanf("%f",&ans);
if(ans==g1-g2)
{
printf("答案正確\n");
}
else{
printf("錯誤\n");
printf("正確答案是%f\n",g1-g2);
}
break;
case 2:printf("%f*%f= ",g1,g2);puts("請輸出答案:");scanf("%f",&ans);
if(ans==g1*g2)
{
printf("答案正確\n");
}
else{
printf("錯誤\n");
printf("正確答案是%f\n",g1*g2);
}
break;
case 3:printf("%f/%f= ",g1,g2);puts("請輸出答案:");scanf("%f",&hh);
if(hh==g1/g2)
{
printf("答案正確\n");
}
else{
printf("錯誤\n");
printf("正確答案是%f\n",g1/g2);
}
break;
default:break;
}
}
}
string s ;
int cnt = 0 ;
int term() ;
int factor() ;
int expression(){
int t ;
t = term() ;
while(1){
if(s[cnt] == '+' ){ // 判斷爲+ 繼續
cnt++ ; // 下一位
t = t + term() ; // 進去term計算數值
}else if(s[cnt] == '-'){
cnt++ ;
t = t - term() ;
}else break ;
}
return t ;
}
int term() {
int f;
f = factor(); // 進入 factor 函數
while(1){
if(s[cnt]=='*') { // 判斷爲乘除則進入factor計算數值
cnt++;
f = f * factor();
} else if(s[cnt]=='/') {
cnt++;
f = f / factor();
} else break;
}
return f;
}
int factor() {
int f;
if(s[cnt]=='(') { // 如果判斷爲括號則回到 expression 中相當從新開始
cnt++ ;
f = expression();
if(s[cnt]==')') cnt++;
return f;
}
f=0;
while('0'<=s[cnt] && s[cnt]<='9') { //如果是數字就計算這個數字是多少返回到上一個函數
f=f*10+(s[cnt]-'0');
cnt++;
}
return f;
}
void daikuohao()
{
ti();
int flag = mulu();
int g1 = rand()%flag;
int g2 = rand()%flag;
int g3 = rand()%flag;
int g4 = rand()%flag;
s+="(";
stringstream aa;
aa << g1;
string h1;
aa >> h1;
s += h1;
int hh = rand()%7;
switch(hh)
{
case 0:s+="+";break;
case 1:s+="-";break;
case 2:s+="*";break;
case 3:break;
case 4:s+=")+(";break;
case 5:s+=")*(";break;
case 6:s+=")-(";break;
}
stringstream aa1;
aa1 << g2;
aa1 >> h1;
s += h1;
hh = rand()%4;
switch(hh)
{
case 0:s+="+";break;
case 1:s+="-";break;
case 2:s+="*";break;
case 3:break;
}
stringstream aa2;
aa2 << g3;
aa2 >> h1;
s += h1;
hh = rand()%4;
switch(hh)
{
case 0:s+="+";break;
case 1:s+="-";break;
case 2:s+="*";break;
case 3:break;
}
stringstream aa3;
aa3 << g4;
aa3 >> h1;
s += h1;
s += ")";
cout<<s<<" ";
cout<<"請輸出答案:";
int ans;
cin>>ans;
int aaa = expression();
if(ans == aaa)
{
printf("答案正確\n");
}
else{
printf("錯誤,正確答案是:");
cout<<aaa<<endl;
}
Sleep(1000);
}
void putong()
{
ti();
int flag = mulu();
for(int i = rr;i < rr + sum;++i)
{
int g1 = rand()%flag;
int g2 = rand()%flag;
int h = rand()%4;int ans;double hh;
switch(h)
{
case 0:printf("%d+%d= ",g1,g2);puts("請輸出答案:");scanf("%d",&ans);
if(ans==g1+g2)
{
printf("答案正確\n");
}
else{
printf("錯誤\n");
printf("正確答案是%d\n",g1+g2);
}
break;
case 1:printf("%d-%d= ",g1,g2);puts("請輸出答案:");scanf("%d",&ans);
if(ans==g1-g2)
{
printf("答案正確\n");
}
else{
printf("錯誤\n");
printf("正確答案是%d\n",g1-g2);
}
break;
case 2:printf("%d*%d= ",g1,g2);puts("請輸出答案:");scanf("%d",&ans);
if(ans==g1*g2)
{
printf("答案正確\n");
}
else{
printf("錯誤\n");
printf("正確答案是%d\n",g1*g2);
}
break;
case 3:printf("%d/%d= ",g1,g2);puts("請輸出答案:");scanf("%lf",&hh);
if(hh==g1/g2)
{
printf("答案正確\n");
}
else{
printf("錯誤\n");
printf("正確答案是%d\n",g1/g2);
}
break;
default:break;
}
}
}
int main()
{
//freopen("1.txt","r",stdin);
//freopen("2.txt","w",stdout);
system("color A");
while(1)
{
system("cls");
int n;
puts(" 四則運算自測軟件\n");
puts("請選擇選項:\n");
puts("1.負數\n");
puts("2.小數\n");
puts("3.帶括號\n");
puts("4.普通\n");
puts("5.退出\n");
scanf("%d",&n);
switch(n)
{
case 1:fushu();break;
case 2:xiaoshu();break;
case 3:daikuohao();break;
case 4:putong();break;
default:return 0;
}
}
return 0;
}