求解怎么设置这个xitiku.txt文件?
1.掌握栈的存储结构。 2.掌握栈基本操作的实现。
3.能引用栈解决相关的实际问题。
具体功能: 1.能随机出题,题数由用户输入确定,算术题包括加减乘除四则运算,表达式项数应不限,可以包含括号;
2.需要进行表达式的合法性验证;
3.用户交互输入答案;
4.计算机核对用户答案;
5.能对用户的测试评分;
6.实现多用户系统,并对用户的用户名和得分保存到文件,此功能选作。设计要求:
1. 要求用面向对象程序设计思想实现;
2. 系统具有一定的容错性;
3. 要求具有较好的交互性。
我的运行程序,习题库出现乱码!求解释!
#include<iostream>
#include<ctime>
#include<cstring>
#include<fstream>
#include<iomanip>
using namespace std;
struct Ti //定义一个结构体,用于存储习题库中的没一道题
{
char chh[30];
};
typedef struct Stack //定义栈,其中元素为字符型
{
char data[50];
int top;
}Stack;
Stack setStack()
{
Stack s;
s.top=-1;
return s;
}
void Push(Stack &S,char x)
{
if(S.top==49)
{
cout<<"栈已满!"<<endl;
}
else
S.top++;
S.data[S.top]=x;
}
char Pop(Stack &S,char x)
{
if(S.top==-1)
{
cout<<"栈空!"<<endl;
}
x=S.data[S.top];
S.top--;
return x;
}
typedef struct Stack2 //定义栈,其中数据元素为整型
{
float data[50];
int top;
}Stack2;
Stack2 setStack2()
{
Stack2 s;
s.top=-1;
return s;
}
void Push2(Stack2 &S,float x)
{
if(S.top==49)
cout<<"栈已满!"<<endl;
else
S.top++;
S.data[S.top]=x;
}
float Pop2(Stack2 &S,float x)
{
if(S.top==-1)
{
cout<<"栈空!"<<endl;
}
x=S.data[S.top];
S.top--;
return x;
}
void 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;
}
}
int 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;
}
int 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;
}
int 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;
}
float 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;
}
void toEmpty(char s[],int n) //把一个数组置空
{
int i;
for(i=0;i<n;i++)
s[i]='\0';
}
void 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++;
}
}
}
int 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++;
}
if(i==j)
{
x=atoi(s);
return x;
}
else
return -1111;
}
void xitiku(char a[],int n) //创建习题库
{
int TIME,T;
Ti t[100]={'\0'};
char ch[30]={'\0'};
int i;
ifstream file;
file.open("D:\\xitiku.txt");
if(!file)
{
cout<<"打开习题库文件失败"<<endl;
exit(0);
}
i=0;
while(!file.eof())
{
file.getline(ch,50); //读取一行
strcpy(t[i].chh,ch); //把读取的字符串复杂给结构体中chh中
i++;
}
srand(time(0));
TIME=rand()%78;
T=TIME;
int j=0;
while(t[T].chh[j]!='#')
{
cout<<t[T].chh[j];
j++;
}
cout<<'=';
strcpy(a,t[T].chh);
file.close();
}
float Expression() //试题测试
{
char x,theta;
char s[30]={'\0'},shu[5]={'\0'};
float a,b,n;
int i,j;
Stack R;
Stack2 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;
}
int main()
{
cout<<"---------------------------------表达式求值-------------------------------------\n注意事项:\n";
cout<<" 1、当结果为小数时,用“四舍五入”的方法保留整数部分\n";
cout<<" 2、输入时请按照相关说明进行输入\n";
cout<<" 3、输入字母时不区分大小写\n";
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;
ch=toupper(ch);
while(ch)
{
switch(ch)
{
case 'A':
cout<<"-------------现在开始做题---------------\n\n";
n=int(Expression()+0.5);
cout<<"\n\n请输入你的答案(输入-1表示停止做题):";
cin>>c;
m=isInt(c,6);
while(m!=-1)
{
if(m==-1111)
{
cout<<"\n输入错误,请重新输入您的答案!";
cout<<"\n\n请输入你的答案(输入-1表示停止做题):";
cin>>c;
m=isInt(c,6);
}
else
{
i++;
jieguo[i-1]=m;
daan[i-1]=n;
if(m==n)
geshu++;
cout<<endl;
n=int(Expression()+0.5);
cout<<"\n\n请输入你的答案(输入-1表示停止做题):";
cin>>c;
m=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;
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);
}
return 0;}