资源描述
//1.h
#include<ctime>
#include<cstring>
#include<fstream>
#include<iomanip>
#include<iostream>
using namespace std;
//template<class T>
struct Ti //定义一个结构体,用于存储题习题库中的每一道台?题目
{
char chh[30];
};
template<class T>
struct Stack //定义栈,其中数据元素为字符型í
{
T data[50];
int top;
};
template<class T>
struct Stack2 //定义栈,其中数据元素为整型í
{
float data[50];
int top;
};
template<class T>
class link
{
public:
void Push(Stack<T> &S,char x);
char Pop(Stack<T> &S,char x);
void Push2(Stack2<T> &S,float x);
float Pop2(Stack2<T> &S,float x);
void pingjia(int m) ;
int In(char c);
int change(char x);
int Precede(int a,int b);
float Operate(float a,char c,float b);
void toEmpty(char s[],int n);
void isStay(char s1[],int n1,char s2[],int n2);
int isInt(char s[],int n);
void xitiku(char a[],int n);
float Expression();
Stack<T> setStack();
Stack2<T> setStack2();
};
//1.cpp
#include<ctime>
#include"1.h"
#include<cstring>
#include<fstream>
#include<iomanip>
#include<iostream>
using namespace std;
template<class T>
void link<T>::Push(Stack<T> &S,char x)
{
if(S.top==49)
{
cout<<"栈已满!?"<<endl;
}
else
S.top++;
S.data[S.top]=x;
}
template<class T>
char link<T>:: Pop(Stack<T> &S,char x)
{
if(S.top==-1)
{
cout<<"栈空!"<<endl;
}
x=S.data[S.top];
S.top--;
return x;
}
template<class T>
void link<T>::Push2(Stack2<T> &S,float x)
{
if(S.top==49)
{
cout<<"栈已满!"<<endl;
}
else
S.top++;
S.data[S.top]=x;
}
template<class T>
float link<T>::Pop2(Stack2<T> &S,float x)
{
if(S.top==-1)
{
cout<<"栈空!"<<endl;
}
x=S.data[S.top];
S.top--;
return x;
}
template<class T>
void link<T>::pingjia(int m)
{
switch(m/10)
{
case 0:
case 1:
case 2:
case 3:
case 4:
case 5:
cout<<"对不起,你没能及格,要加油哦!\n";
break;
case 6:
case 7:
cout<<"恭喜您及格了,但离高分还有距离哦!\n";
break;
case 8:
case 9:
cout<<"哇,您居然得了这么高的分数,真棒!\n";
break;
case 10:
cout<<"OH MY GOD!,您竟然考了满分!!\n";break;
}
}
template<class T>
int link<T>::In(char c) //判断字符是否为运算符?
{
int m=0,i;
char OP[7]={'+','-','*','/','(',')','#'};
for(i=0;i<7;i++){
if(c==OP[i])
m++;
}
if(m==0)
return 0;
else
return 1;
}
template<class T>
int link<T>::change(char x) //将运算符转换成为数字
{
int a;
switch(x)
{
case '+': a=0;break;
case '-': a=1;break;
case '*': a=2;break;
case '/': a=3;break;
case '(': a=4;break;
case ')': a=5;break;
case '#': a=6;break;
}
return a;
}
template<class T>
int link<T>:: Precede(int a,int b) //比括较运算符之间的优先级
{
int A;
int token[7][7]={{1,1,-1,-1,-1,1,1},
{1,1,-1,-1,-1,1,1},
{1,1,1,1,-1,1,1},
{1,1,1,1,-1,1,1},
{-1,-1,-1,-1,-1,0,2},
{1,1,1,1,2,1,1},
{-1,-1,-1,-1,-1,2,0}};
switch(token[a][b])
{
case -1:
A=-1;
break;
case 0:
A= 0;
break;
case 1:
A= 1;
break;
}return A;
}
template<class T>
float link<T>::Operate(float a,char c,float b) //对两个数进行四则运算
{
float s;
switch(c){
case'+':
s=a+b;
break;
case'-':
s=a-b;
break;
case'*':
s=a*b;
break;
case'/':
s=a/b;
break;
}
return s;
}
template<class T>
void link<T>::toEmpty(char s[],int n) //把一个数组置空
{
int i;
for(i=0;i<n;i++)
s[i]='\0';
}
template<class T>
void link<T>::isStay(char s1[],int n1,char s2[],int n2) //把一个表达式分成几段
{
int i=0,j=0;
while(s1[i]==' ')
{
if(s1[i]==' ')
{
i++;
}
}
if(s1[i]=='\0')
exit(0);
while(s1[i]!='\0')
{
if(In(s1[i+1])!=In(s1[i])||In(s1[i+1])*In(s1[i])==1||s1[i]=='\0')
{
s2[j]=s1[i];
s1[i]=' ';
break;
}
if(In(s1[i+1])==In(s1[i]))
{
s2[j]=s1[i];
s1[i]=' ';
i++;
j++;
}
}
}
template<class T>
int link<T>::isInt(char s[],int n)
{
int i=0,j=0,x;
while(s[i]!=' '&&s[i]!='\0')
{
if(s[i]>='0'&&s[i]<='9'||s[0]=='-')
j++;
i++;
}
if(i==j)
{
x=atoi(s);
return x;
}
else
return -1;
}
template<class T>
void link<T>::xitiku(char a[],int n) //创建习题库
{
int TIME,T;
Ti t[100]={'\0'};
char ch[30]={'\0'};
int i;
ifstream file("TextFile1.txt",ios_base::in);
if(!file)
{
cout<<"打洙?开a习°题琣库a文?件t失骸?败悒?!?"<<endl;
exit(0);
}
i=0;
while(!file.eof())
{
file.getline(ch,50);
strcpy(t[i].chh,ch);
i++;
}
srand(time(0));
TIME=rand()%7;
T=TIME;
int j=0;
while(t[T].chh[j]!='#')
{
cout<<t[T].chh[j];
j++;
}
cout<<'=';
strcpy(a,t[T].chh);
file.close();
}
template<class T>
float link<T>::Expression() //试题测试
{
char x=0,theta=0;
char s[30]={'\0'},shu[5]={'\0'};
float a=0,b=0,n;
int i,j;
Stack<T> R;
Stack2<T> D;
R=setStack();
Push(R,'#');
D=setStack2();
xitiku(s,30);
isStay(s,30,shu,5);
while((shu[0]!='#'||R.data[R.top]!='#'))
{
if(In(shu[0])==0)
{
float S1=atoi(shu);
Push2(D,S1);
toEmpty(shu,5);
isStay(s,30,shu,5);
}
else
{
i=change(R.data[R.top]);
j=change(shu[0]);
switch(Precede(i,j))
{
case -1:
Push(R,shu[0]);
toEmpty(shu,5);
isStay(s,30,shu,5);
break;
case 0:
Pop(R,x);
toEmpty(shu,5);
isStay(s,30,shu,5);
break;
case 1:
theta=Pop(R,theta);
b=Pop2(D,b);
a=Pop2(D,a);
n=Operate(a,theta,b);
Push2(D,n);
break;
}
}
}
return n;
}
template<class T>
Stack2<T> link<T>::setStack2()
{
Stack2<T> s;
s.top=-1;
return s;
}
template<class T>
Stack<T> link<T>::setStack()
{
Stack<T> s;
s.top=-1;
return s;
}
//main.cpp
#include"1.cpp"
#include"iostream"
using namespace std;
int main()
{
link <int> t;
cout<<"---------------------------------表达式求值-------------------------------------\n";
int i=0,j,geshu=0,n,m,jieguo[100],daan[100];
char ch,c[6]={'\0'};
cout<<"***做题请输入A,查看成绩单请输入B,结束程序请输入C***\n\n";
cin>>ch;
cout<<endl;
while(ch)
{
switch(ch)
{
case 'A':
cout<<"-------------现在开始做题--------------\n\n";
n=int(t.Expression()+0.5);
cout<<"\n\n请输入你的答案?输入-1表示停止做题:";
cin>>c;
m=t.isInt(c,6);
while(m!=-1)
{
if(m==-1111)
{
cout<<"\n输入错误,请重新输入您的答案!";
cout<<"\n\n请输入你的答案(输入-1表示停止做题):";
cin>>c;
m=t.isInt(c,6);
}
else
{
i++;
jieguo[i-1]=m;
daan[i-1]=n;
if(m==n)
geshu++;
cout<<endl;
n=int(t.Expression()+0.5);
cout<<"\n\n请输入你的答鋏案(输入-1表示停止做题):";
cin>>c;
m=t.isInt(c,6);
}
}
cout<<"----------------------------------------\n\n";
break;
case 'B':
if(i==0)
cout<<"成绩单为空!\n\n";
else
{
cout<<" *********您的成绩单******* \n\n";
cout<<"-----------------------------------\n";
cout<<"题号 你的答案 正确答案 结论\n";
for(j=0;j<i;j++)
{
cout<<setw(2)<<j+1;
cout<<setw(11)<<jieguo[j];
cout<<setw(11)<<daan[j];
if(jieguo[j]==daan[j])
cout<<setw(11)<<"正确!";
else
cout<<setw(11)<<"错误!";
cout<<endl;
}
cout<<"-----------------------------------\n";
cout<<"共做了"<<i<<"道题,其中\n";
cout<<"做对了"<<geshu<<"道题,做错了"<<i-geshu<<"道题.\n";
int fenshu=geshu*100/i;
cout<<"最后成绩为:"<<fenshu<<"分!"<<endl;
t.pingjia(fenshu);
cout<<"-----------------------------------\n";
}
break;
case 'C':
cout<<"程序结束,谢谢使用!"<<endl;
exit(0);
default:
cout<<"输入错误,请重新输入!"<<endl;
break;
}
cout<<"\n***做题请输入A,查看历史请输入B,结束程序请输入C***\n\n";
cin>>ch;
cout<<endl;
ch=toupper(ch);
}
system("pause");
return 0;
}
展开阅读全文