| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 514 人关注过本帖
标题:[求助]一个可以运行但有问题的程序,希望弟兄们指正
只看楼主 加入收藏
Dam3000
Rank: 1
等 级:新手上路
帖 子:21
专家分:0
注 册:2007-6-5
收藏
 问题点数:0 回复次数:4 
[求助]一个可以运行但有问题的程序,希望弟兄们指正

#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:给在下些意见……

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

搜索更多相关主题的帖子: 弟兄 运行 
2007-06-12 23:15
zouxiaohua
Rank: 1
等 级:新手上路
帖 子:11
专家分:0
注 册:2007-5-28
收藏
得分:0 
难道是没有清空
2007-06-13 16:23
Dam3000
Rank: 1
等 级:新手上路
帖 子:21
专家分:0
注 册:2007-6-5
收藏
得分:0 
哥们你太有才啦!!!!
谢谢!!!清空以后搞定了!!!

#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();

}

}


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


FORTRAN他爹说:要有高级语言 就有了烂熟的 Hello World!
2007-06-13 18:29
wfpb
Rank: 6Rank: 6
等 级:贵宾
威 望:29
帖 子:2188
专家分:0
注 册:2006-4-2
收藏
得分:0 

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

程序代码:
#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();
}


[glow=255,red,2]wfpb的部落格[/glow] 学习成为生活的重要组成部分!
2007-06-13 22:45
Dam3000
Rank: 1
等 级:新手上路
帖 子:21
专家分:0
注 册:2007-6-5
收藏
得分:0 
谢谢楼上的兄弟,虽然有些地方不懂,但我会好好研究的!
谢谢各位的意见

FORTRAN他爹说:要有高级语言 就有了烂熟的 Hello World!
2007-06-14 22:28
快速回复:[求助]一个可以运行但有问题的程序,希望弟兄们指正
数据加载中...
 
   



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

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