注册 登录
编程论坛 C++教室

[求助]一个可以运行但有问题的程序,希望弟兄们指正

Dam3000 发布于 2007-06-12 23:15, 519 次点击

#include<iostream.h>
//类定义
class person
{
unsigned num; //编号
char name[10]; //名字
void test(); //姓名测试
public:
void set();
void print()const
{
cout<<"编号:"<<num<<endl;
cout<<"姓名:"<<name<<endl;
}
};

void person::set()
{
cout<<"编号:"; cin>>num;
cout<<"姓名:"; cin>>name;
test(); //执行测试
}

void person::test() //不允许输入阿拉伯数字
{
for(int i=0;i<10 && name[i]!='\0';i++)
if(name[i]>='0'&&name[i]<='9')
{
cout<<"姓名输入有误,请重新输入!"<<endl;
cout<<"姓名:"; cin>>name;
test(); //直接递归
}
}//------------------定义完毕
//--------------主函数
void main()
{
person p;
p.set();
p.print();
}

问题1:在输入“编号”时如果输入了字符会出现错误 请问有什么方法可以避免?
问题2(在下最想问的问题):在输入“姓名”时输入了含有数字的字符串 如:123或ZhangSan987 程序将会显示输入错误,要求重新输入。若输入的是前者(123),此时只要重新输入一个不包含数字的字符串,程序将会正常运行; 但如果输入了既包含字母又包含数字的字符串 如:ZhangSan987 就算是重新输入了不包含数字的字符串,也会提示出错,要求重新输入,且就算按照要求输入也会重复提示多次(次数由数字的个数决定)。请问这个问题怎么处理?
问题3:给在下些意见……

不知道在下的问题是否描述得清楚……参考过论坛生存法则
衷心感谢大家

4 回复
#2
zouxiaohua2007-06-13 16:23
难道是没有清空
#3
Dam30002007-06-13 18:29
哥们你太有才啦!!!!
谢谢!!!清空以后搞定了!!!

#include<iostream.h>

#include<memory.h> //提供内存操作相关函数

//-------------------------基类person

class person

{

unsigned num; //编号

char name[10]; //名字

void test(); //姓名测试

public:

void set();

void print()const

{

cout<<"编号:"<<num<<endl;

cout<<"姓名:"<<name<<endl;

}

};

void person::set()

{

cout<<"编号:"; cin>>num;

cout<<"姓名:"; cin>>name;

test();

}

void person::test() //不允许输入阿拉伯数字

{

for(int i=0;i<10 && name[i]!='\0';i++)

if(name[i]>='0'&&name[i]<='9')

{

memset(name,0,10); //清空数组

cout<<"姓名输入有误,请重新输入!"<<endl;

cout<<"姓名:"; cin>>name;

test(); //直接递归

}

}

//-------------------------派生类student

class student:public person

{

unsigned classnum; //班级号

unsigned achievement; //成绩

void test(); //成绩测试

public:

void set();

void print()const;

};

void student::set()

{

cout<<"输入一个学生的数据:"<<endl;

person::set();

cout<<"班号:"; cin>>classnum;

cout<<"成绩:"; cin>>achievement;

test();

}

void student::print()const

{

cout<<"显示一个学生的数据:"<<endl;

person::print();

cout<<"班号:"<<classnum<<endl;

cout<<"成绩:"<<achievement<<endl;

}

void student::test()

{

if(achievement<0||achievement>100)

{

cout<<"成绩输入有误!"<<endl;

cout<<"成绩:"; cin>>achievement;

test();

}

}

//-----------------------派生类teacher

class teacher:public person

{

char ZC[50]; //职称

char apartment[50]; //部门

void Ztest(); //职称测试

void atest(); //部门测试

public:

void set();

void print()const;

};

void teacher::set()

{

cout<<"输入一个教师的数据:"<<endl;

person::set();

cout<<"职称:"; cin>>ZC;

Ztest();

cout<<"部门:"; cin>>apartment;

atest();

}

void teacher::print()const

{

cout<<"显示一个教师的数据:"<<endl;

person::print();

cout<<"职称:"<<ZC<<endl;

cout<<"部门:"<<apartment<<endl;

}

void teacher::Ztest() //不允许输入阿拉伯数字

{

for(int i=0;i<50 && ZC[i]!='\0';i++)

if(ZC[i]>='0' && ZC[i]<='9')

{

memset(ZC,0,50); //清空

cout<<"职称输入有误,请重新输入!"<<endl;

cout<<"职称:"; cin>>ZC;

Ztest();

}

}

void teacher::atest() //不允许输入阿拉伯数字

{

for(int i=0;i<50 && apartment[i]!='\0';i++)

if(apartment[i]>='0' && apartment[i]<='9')

{

memset(apartment,0,50); //清空

cout<<"部门输入有误,请重新输入!"<<endl;

cout<<"部门:"; cin>>apartment;

atest();

}

}


红色字是新增加的代码~~
谢谢!!
如果有什么意见或是好的设计方案请狠狠地指教

#4
wfpb2007-06-13 22:45

试试下面的,应该可以更好的控制输入

程序代码:
#include <iostream>
using namespace std;
#include<memory.h>  //提供内存操作相关函数


//下面两个输入函数也可以做基类的静态函数,毕竟没有必要做普通成员函数。。。
bool cinUnInt(unsigned &num)
{
    cin>>num;
    if(cin.rdstate()==ios_base::goodbit&&(cin.eof()||cin.peek()=='\r'||cin.peek()=='\n'))
    {
        cin.sync();
        return true;
    }
    else
    {
        cout<<\"输入格式有误,请重新输入!(请输入数字)\"<<endl;
        cin.clear();
        cin.sync();
        return false;
    }
}


bool cinName(char* pn,int num)
{
    memset(pn,0,num);
    cin>>pn;
    char*p=0;
    for(p=pn;*p;p++)
    {
        if (isdigit(*p))
        {
            cout<<\"输入格式有误,请重新输入!(不要输入数字)\"<<endl;   
            break;
        }
    }
    return *p==0;
}
//-------------------------基类person
class person
{
    unsigned num;    //编号
    char name[10];   //名字
public:
    void set();
    void print()const
    {
        cout<<\"编号:\"<<num<<endl;
        cout<<\"姓名:\"<<name<<endl;
    }


};
void person::set()
{
    while(1)
    {
        cout<<\"编号:\";
        if(cinUnInt(num))
            break;
    }
    while(1)
    {
        cout<<\"姓名:\";
        if(cinName(name,10))
            break;
    }
}


//-------------------------派生类student
class student:public person
{
    unsigned classnum;         //班级号
    unsigned achievement;     //成绩
public:
    void set();
    void print()const;
};
void student::set()
{
    cout<<\"输入一个学生的数据:\"<<endl;
    person::set();
    while(1)
    {
        cout<<\"班号:\";
        if(cinUnInt(classnum))
            break;
    }   
    while(1)
    {
        cout<<\"成绩:\";
        if(cinUnInt(achievement)&&achievement>=0&&achievement<=100)
            break;
        else
            cout<<\"成绩输入有误!(成绩应为:0-100)\"<<endl;
    }
}



void student::print()const
{
    cout<<\"显示一个学生的数据:\"<<endl;
    person::print();
    cout<<\"班号:\"<<classnum<<endl;
    cout<<\"成绩:\"<<achievement<<endl;
}


//-----------------------派生类teacher
class teacher:public person
{
    char ZC[50];        //职称
    char apartment[50]; //部门
public:
    void set();
    void print()const;
};



void teacher::set()
{
    cout<<\"输入一个教师的数据:\"<<endl;
    person::set();
    while(1)
    {
        cout<<\"职称:\";
        if(cinName(ZC,50))
            break;
    }
    while(1)
    {
        cout<<\"部门:\";
        if(cinName(apartment,50))
            break;
    }
}
void teacher::print()const
{
    cout<<\"显示一个教师的数据:\"<<endl;
    person::print();
    cout<<\"职称:\"<<ZC<<endl;
    cout<<\"部门:\"<<apartment<<endl;
}


void main()
{
    person p;
    p.set();
    p.print();
    teacher t;
    t.set();
    t.print();
    student s;
    s.set();
    s.print();  
}

#5
Dam30002007-06-14 22:28
谢谢楼上的兄弟,虽然有些地方不懂,但我会好好研究的!
谢谢各位的意见
1