免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1951 | 回复: 7
打印 上一主题 下一主题

[C++] 不知为什么进入死循环 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-08-29 21:52 |只看该作者 |倒序浏览
#include <iostream>
using namespace std;
const int INCREMENT=10;
typedef char Names;

class Students
{
private:
        int INITSIZE;
        int pos;
        Names e;
public:
        Names *name;
        int length;
        int listsize;
        void initstudents(Students &,int);
        void deststudents(Students &);
        bool putStudent(Students &);
        bool addStudent(Students &);
        bool delStudent(Students &);
        void seaStudent(Students &);
        void printStudents(Students);
};
void Students::initstudents(Students &s,int maxsize=0)
{
        cout<<endl<<"请输入字母个数(回车结束)";
        cin>>INITSIZE;
        if(maxsize==0) maxsize=INITSIZE;
        s.name=new Names[maxsize];
        if(!s.name) exit(1);
        s.length=0;
        s.listsize=maxsize;
}
void Students::deststudents(Students &s)
{
        delete [] s.name;
        s.name=NULL;
        s.length=0;
        s.listsize=0;
}
bool Students::putStudent(Students &s)
{
        cout<<endl<<"请输入修改位置(回车结束)";
        cin>>pos;
        if(pos<1||pos>s.length)
        {
                cout<<endl<<"输入有误,请重新输入!                             "<<endl<<endl;
                return false;
        }
        cout<<endl<<"请输入修改字母(回车结束)";
        cin>>e;
        s.name[pos-1]=e;
        cout<<endl<<"已将第"<<pos<<"位字母修改为"<<e<<endl;
        return true;
}
bool Students::addStudent(Students &s)
{
        cout<<endl<<"请输入插入位置(回车结束)";
        cin>>pos;
        if(pos<1||pos>s.length+1)
        {
                cout<<endl<<"输入有误,请重新输入!                             "<<endl<<endl;
                return false;
        }
        cout<<endl<<"请输入插入字母(回车结束)";
        cin>>e;
        if(s.length>=s.listsize)
        {
                Names *newbase=new Names[s.listsize+INCREMENT];
                if(!newbase) exit(1);
                for(int i=0;i<s.length;i++)
                        newbase=s.name;
                delete [] s.name;
                s.name=newbase;
                s.listsize+=INCREMENT;
        }
        for(int i=s.length-1;i>=pos-1;i--)
                s.name[i+1]=s.name;
        s.name[pos-1]=e;
        s.length++;
        cout<<endl<<"已将字母"<<e<<"插入到第"<<pos<<"位"<<endl;
        return true;
}
bool Students::delStudent(Students &s)
{
        cout<<endl<<"请输入删除位置(回车结束)";
        cin>>pos;
        if(pos<1||pos>s.length)
        {
                cout<<endl<<"输入有误,请重新输入!                             "<<endl<<endl;
                return false;
        }
        for(int i=pos;i<s.length;i++)
                s.name[i-1]=s.name;
        e=s.name[pos-1];
        s.length--;
        cout<<endl<<"已将第"<<pos<<"位字母删除"<<endl;
        return true;
}
void Students::seaStudent(Students &s)
{
        cout<<endl<<"请输入查找字母(回车结束)";
        cin>>e;
        pos=0;
        for(int i=0;i<s.length;i++)
        {
                if(s.name==e)
                {
                        pos+=1;
                        cout<<endl<<"找到第"<<i+1<<"位字母"<<e<<endl;
                }
        }
        cout<<endl<<"一共找到"<<pos<<"个字母"<<e<<endl;
}
void Students::printStudents(Students s)
{
        for(int i=0;i<s.length-1;i++)
                cout<<endl<<i+1<<" "<<s.name<<endl;
        if(s.length-1>=0)
                cout<<endl<<s.length<<" "<<s.name[s.length-1]<<endl;
}
//////////////////////////////main////////////////////////////////
int main()
{
        char code;
        Students students;
        students.initstudents(students,0);
        cout<<"This is linearlist!"<<endl;
        cout<<"这是一个顺序表演示!"<<endl;
        while(true)
        {
                cout<<"---------------------------------------------"<<endl;
                cout<<"           1 修改字母信息                    "<<endl;
                cout<<"           2 插入字母信息                    "<<endl;
                cout<<"           3 删除字母信息                    "<<endl;
                cout<<"           4 查找字母信息                    "<<endl;
                cout<<"           5 所有字母信息                    "<<endl;
                cout<<"           6 退出程序                        "<<endl;
                cout<<"---------------------------------------------"<<endl;
                cout<<endl<<"您的选择(回车结束)";
                cin>>code;
                switch (code)
                {
                case '1':
                        cout<<"           1 修改字母信息                    "<<endl;
                        students.putStudent(students);
                        break;
                case '2':
                        cout<<"           2 插入字母信息                    "<<endl;
                        students.addStudent(students);
                        break;
                case '3':
                        cout<<"           3 删除字母信息                    "<<endl;
                        students.delStudent(students);
                        break;
                case '4':
                        cout<<"           4 查找字母信息                    "<<endl;
                        students.seaStudent(students);
                        break;
                case '5':
                        cout<<"           5 所有字母信息                    "<<endl;
                        students.printStudents(students);
                        break;
                case '6':
                        return 0;
                        break;
                default:
                        cout<<endl<<"输入有误,请重新输入!                             "<<endl<<endl;
                        break;
                }
        }
        students.deststudents(students);
}
//编译完一切正常,正确输入时也正常,但假如要求输入位置时,我误输入字母的话就会进入死循环,谁能教教我为什么阿?想不通,这个是我学数据结构写的一个算法

论坛徽章:
0
2 [报告]
发表于 2008-08-29 21:53 |只看该作者
原帖由 wzl7222504 于 2008-8-29 21:52 发表
#include
using namespace std;
const int INCREMENT=10;
typedef char Names;

class Students
{
private:
        int INITSIZE;
        int pos;
        Names e;
public:
        Names *name;
        int length;
        int list ...


太长。。。 有机会再看。。

论坛徽章:
0
3 [报告]
发表于 2008-08-29 21:57 |只看该作者
不到200行。。。还长

论坛徽章:
0
4 [报告]
发表于 2008-08-29 22:10 |只看该作者
自己调试一下,用gdb或者加printf看看

论坛徽章:
0
5 [报告]
发表于 2008-08-29 22:30 |只看该作者
if(cin)
{}
else
{cin.clear()}

论坛徽章:
4
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:56:11IT运维版块每日发帖之星
日期:2016-08-11 06:20:00IT运维版块每日发帖之星
日期:2016-08-15 06:20:00
6 [报告]
发表于 2008-08-29 22:50 |只看该作者
原帖由 Roemer 于 2008-8-29 22:30 发表
if(cin)
{}
else
{cin.clear()}


char code;
cin>>code;
从标准输入读入数据时,可能c++将code解释成整数了?
按LZ的做法清空一下cin试试,如下:
cin.clear();
cin>>code;

论坛徽章:
0
7 [报告]
发表于 2008-08-29 22:59 |只看该作者
students.putStudent(students);

两个students 同一个对象,为什么要这样来传参数?

论坛徽章:
0
8 [报告]
发表于 2008-08-30 08:30 |只看该作者
多谢5楼,6楼指点,正是这个原因
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP