| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1231 人关注过本帖
标题:新手求助C++的一个疑惑
只看楼主 加入收藏
无名可用
Rank: 4
等 级:业余侠客
帖 子:79
专家分:259
注 册:2010-7-27
收藏
得分:0 
      输入的数据先放在缓冲区中,当输入结束时再由‘cin流’从缓冲区将第一个类型的正确数据取走。如果输入浮点数,假如你输入45.6,‘cin流’会把整数部分45从缓冲区取走,此时缓冲区还剩下的数据为.6(因为缓冲区还有数据存在,所以就暂时不用人为的从键盘输入数据了,直到cin流把缓冲区中的数据全部取走),当进入循环时,cin流无法再从缓冲区取走数据了,所以变量i也就无法再被重新赋值了,所以输出就会一直是‘青年’或其他程序也因cin流不断的在取数据而进入了无限循环中..
程序代码:
[color=#0000FF]#include<iostream>
using namespace std;

void main()
{
        int year,i;
        cout<<"year=";
        cin>>year;
        if(year<0)
                cout<<"input error!"<<endl;
        while(year>=0 && year<=130)
        {
                ///
                if(cin.fail())
                {
                    cout<<"输入有误"<<endl;
                    cin.clear();
                    double d;
                    cin>>d;
                }
                cout<<"请重新输入,year=";
                cin>>year;
                ///
                i=year/10;
                switch(i)
                {
                case 0:
                        cout<<"小孩"<<endl;
                        break;
                case 1:
                        cout<<"少年"<<endl;
                        break;
                case 2:
                        cout<<"青年"<<endl;
                        break;
                case 3:
                case 4:
                        cout<<"中年"<<endl;
                        break;
                case 5:
                case 6:
                case 7:
                case 8:
                case 9:
                case 10:
                case 11:
                case 12:
                case 13:
                        cout<<"老年"<<endl;
                        break;
                default:
                        cout<<"input error!"<<endl;
                }
                cout<<"input year=";
                cin>>year;
        }
}


[/color]
2010-10-21 15:16
hoho568
Rank: 5Rank: 5
等 级:职业侠客
帖 子:101
专家分:378
注 册:2009-7-14
收藏
得分:0 
以下是引用veikin在2010-10-21 14:58:08的发言:

很感谢你的回答,不过我还是有些疑问。
①我测试过输入值:0<131之间浮点数值时,它能够进入while循环中,但是输出的值都为:“小孩”,或许是相当于不同的PC机访问同一个内存地址,所获得的值不一样那样等待道理(我猜的)。
②三楼那个方法我也尝试过了,不过我运行的 结果还是一样,麻烦你帮我看一下,谢谢。。。程序如下:
#include
#include "stdio.h"

void main()
{
    int year,i;
    cout<<"year=";
    cin>>year;
    if(year<0)
        cout<<"input error!"<
    while(year>=0 && year<=130)
    {
        i=year/10;
        switch(i)
        {
        case 0:
            cout<<"小孩"<
            break;
        case 1:
            cout<<"少年"<
            break;
        case 2:
            cout<<"青年"<
            break;
        case 3:
        case 4:
            cout<<"中年"<
            break;
        case 5:
        case 6:
        case 7:
        case 8:
        case 9:
        case 10:
        case 11:
        case 12:
        case 13:
            cout<<"老年"<
            break;
        default:
            cout<<"input error!"<
        }
        fflush(stdin);
        cout<<"input year=";
        cin>>year;
    }
}
我运行了你的程序,发现没有问题啊。输出不会都是小孩,而且也不再进入循环;
我的程序和你的唯一区别可能是在头部
#include<iostream>

using namespace std;

其他函数体一样。我的环境 visual studio 2010 ;
2010-10-21 15:17
veikin
Rank: 1
等 级:新手上路
帖 子:13
专家分:0
注 册:2007-12-24
收藏
得分:0 
回复 11楼 无名可用
但是我还是有一点疑问,就是假设我输入45.6的话,那它第一次从缓存中取出的是45,然后再进入死循环,那么它第一次显示的应该是“老年”,但是我输入区间在(0-131)直接输出值都是“小孩”的。
2010-10-21 17:01
veikin
Rank: 1
等 级:新手上路
帖 子:13
专家分:0
注 册:2007-12-24
收藏
得分:0 
回复 12楼 hoho568
我用你说的,但是一样出现循环,我的环境是visual c++6.0
2010-10-21 17:04
brightboy
Rank: 1
等 级:新手上路
帖 子:9
专家分:9
注 册:2010-10-19
收藏
得分:0 
  当你把cout<<"input year=";  cin>>year;去掉时,你就会发现 这个函数是一直循环的 比如你要是输入100则一直是老年..当你输入错误值时,就会一直是 year=小孩,其实 不管你输入多大的数,只要不是int型的,就一直是year=小孩.你输入 一个字符时也一样,因为你输入错误 他直接给跳到case(0)了。。。。
2010-10-21 18:27
veikin
Rank: 1
等 级:新手上路
帖 子:13
专家分:0
注 册:2007-12-24
收藏
得分:0 
回复 15楼 brightboy
把cout<<"input year=";  cin>>year;去掉时,因为while语句中并没对year值进行修改,所以当然输入100就会进入死循环。不过我想应该就是你说的这样,只要输错,就直接跳到case 0...3Q啦。。。
2010-10-21 20:47
Tveiker
Rank: 2
来 自:湖南省张家界桑植
等 级:论坛游民
帖 子:17
专家分:41
注 册:2010-9-28
收藏
得分:0 
当你定义year为整形但输入为浮点型时,cin只会截取year整数部分放入流中,而不会截取小数部分。故当为小数时应该处理这个
下面就是代码并有解释
#include<iostream.h>
#include "stdio.h"

void main()
{//将整数和小数作为两种类型来写
    cout<<"请输入你所输入数的类型:"<<endl
        <<"0---整数:"<<endl   //0代表整数
        <<"1---小数:"<<endl;  //1代表小数
    int t;
    cin>>t;  //t不能再year后面输入,读到后面的解释你就会明白
    /*
    看到这里你一定会问为什么不直接用year判断。原因就是year是整型数据故向year输入的一定是整数,故怎么判断都只会是整数
    至于小数部分只是没有放入cin流中
    */
    int year;
    int i;
    cout<<"year=";
    cin>>year;
    if(year<0)
        cout<<"input error!"<<endl;
    while(year>=0 && year<=130)
    {
        i=year/10;
        switch(i)
        {
        case 0:
            cout<<"小孩"<<endl;
            break;
        case 1:
            cout<<"少年"<<endl;
            break;
        case 2:
            cout<<"青年"<<endl;
            break;
        case 3:
        case 4:
            cout<<"中年"<<endl;
            break;
        case 5:
        case 6:
        case 7:
        case 8:
        case 9:
        case 10:
        case 11:
        case 12:
        case 13:
            cout<<"老年"<<endl;
            break;
        default:
            cout<<"input error!"<<endl;
        }
        if(t){
            //如果是小数则就应想办法将其小数部分放入cin流中
            cin.ignore();//跳过小数点
            cin>>year;  //将小数点后的数放入cin流
        }
        //在此时对于上一个year已经全部处理完了,进行新的一次
        cout<<endl<<"请输入你所输入数的类型:"<<endl<<"0---整数:"<<endl<<"1---小数:"<<endl;
        cin>>t;
        cout<<"input year=";
        cin>>year;
    }
}
2010-10-22 01:46
Tveiker
Rank: 2
来 自:湖南省张家界桑植
等 级:论坛游民
帖 子:17
专家分:41
注 册:2010-9-28
收藏
得分:0 
回复 13楼 veikin
之所以以后一直输出小孩是因为小数点没处理那么就相当于里面仍有非数据的东西,而此时小数点后面的数是6,其<10的数,即每次输入的year就会是6。则i=0;
2010-10-22 01:55
Tveiker
Rank: 2
来 自:湖南省张家界桑植
等 级:论坛游民
帖 子:17
专家分:41
注 册:2010-9-28
收藏
得分:0 
以下是引用Tveiker在2010-10-22 01:55:35的发言:

之所以以后一直输出小孩是因为小数点没处理那么就相当于里面仍有非数据的东西,而此时小数点后面的数是6,其<10的数,即每次输入的year就会是6。则i=0;
这里纠正下,调试可以发现,当小数点没处理时,year是0,为什么呢?建议楼主稍微思考下,但当小数点被处理后那么year就会变成小数点后面的数,此时要用cin>>year处理
然后再输入自己第二次想输入的值
     在这里我想建议楼主编完程后多调试,编译器其实是学好编程最好的老师
       至于year为什么在小数点没处理时为0,其实此时就相当你输入了一个0.XX(XX为原year的小数部分),那么再次cin>>year,截取整数部分0
2010-10-22 02:18
veikin
Rank: 1
等 级:新手上路
帖 子:13
专家分:0
注 册:2007-12-24
收藏
得分:0 
回复 19楼 Tveiker
很感谢19楼,可能是太浮躁了最近,没能静下来好好的调试一下。。。
2010-10-22 09:28
快速回复:新手求助C++的一个疑惑
数据加载中...
 
   



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

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