| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 333 人关注过本帖
标题:求解怎么设置这个xitiku.txt文件?
只看楼主 加入收藏
小小小火柴
Rank: 5Rank: 5
来 自:江西赣州
等 级:职业侠客
威 望:3
帖 子:141
专家分:337
注 册:2012-9-28
结帖率:90.91%
收藏
已结贴  问题点数:30 回复次数:2 
求解怎么设置这个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;}






搜索更多相关主题的帖子: 运行程序 用户名 合法性 
2013-01-04 18:43
不玩虚的
Rank: 9Rank: 9Rank: 9
来 自:四川
等 级:贵宾
威 望:10
帖 子:331
专家分:1301
注 册:2012-12-9
收藏
得分:21 
牛人啊,写得不错。支持,顶贴

同学习......同进步....你帮我......我帮你.....上善若水.....
2013-01-05 00:18
不玩虚的
Rank: 9Rank: 9Rank: 9
来 自:四川
等 级:贵宾
威 望:10
帖 子:331
专家分:1301
注 册:2012-12-9
收藏
得分:0 
我们最近在写简单的编译器,在词法分析器阶段,是从文件流一个字符一个字符的判断,你的是一行。一行就是一到题是不?楼主学过编译原理没可以看看。

同学习......同进步....你帮我......我帮你.....上善若水.....
2013-01-05 00:38
快速回复:求解怎么设置这个xitiku.txt文件?
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.027703 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved