| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 6566 人关注过本帖
标题:while语句清除循环内变量数据,怎么破?
只看楼主 加入收藏
Eahonxu
Rank: 1
等 级:新手上路
帖 子:113
专家分:0
注 册:2016-7-13
结帖率:96.15%
收藏
已结贴  问题点数:15 回复次数:11 
while语句清除循环内变量数据,怎么破?
程序如下

#include <stdio.h>
int main(void)
{
    int a, b;
    int square1, square2, square_sum;
    int i;
   
   
        printf("Enter lower and upper integer limits: ");
   
    while(scanf("%d%d", &a, &b))
    {
        if(a <= b || (a != 'q' && b != 'q'))
        {
        for(i = a; i <= b; i++)
            square_sum += i*i;
            square1 = a*a;
            square2 = b*b;
        printf("The sums of the squares from %d to %d is %d\n", square1, square2, square_sum);
        printf("Enter next set of limits: ");
            
    }
        else
            printf("Done\n");
    }
    return 0;
  
}
两点问题,第一,重新输入数据之后平方和会和上次循环剩下的数据叠加,导致错误;
第二,这个程序我输入相等的两个数仍然会进入第一个循环,且当我输入q的时候程序直接停止,由于我使用的编译器多次出问题,所以请各位大神帮我测试下这波是我的软件问题还是程序有误。
搜索更多相关主题的帖子: limits Enter 
2016-08-18 20:57
linlulu001
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:贵宾
威 望:20
帖 子:944
专家分:4047
注 册:2016-4-13
收藏
得分:10 
第一个问题:将square_sum重置0就行了
第二个问题:相等会进入循环很正常,判断条件包含等号。

当你输入q的时候程序直接停止,说明你对scanf的读取机制一点都不了解。
第一种情况:先输入字母,再输入数字,这样while循环是不会开始。因为scanf("%d%d", &a, &b)的返回值是0。
第二种情况:先输入数字,再输入字母,这样while循环可以开始,因为scanf("%d%d", &a, &b)的返回值是1,但是b的值是垃圾值(如果b有赋值过,那么它的值还是原来的值),因为赋值失败。然后while循环停止。
就这两种情况,其它的输入套用以上两种情况。
去找下scanf是如何读取数据。找不到再说吧。
2016-08-18 21:27
ehszt
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:40
帖 子:1745
专家分:3216
注 册:2015-12-2
收藏
得分:5 
#include <stdio.h>
 int main(void)
 {
     int a, b;
     int square1, square2, square_sum;
     int i;
     
         printf("Enter lower and upper integer limits: \n");
     
     while(1)
     {   
         i=scanf("%d%d", &a, &b);
         if(i!=2&&getchar()=='q')break;
         while(getchar()!='\n');
         square_sum=0;
         if(a <= b )
         {
         for(i = a; i <= b; i++)
             square_sum += i*i;
             square1 = a*a;
             square2 = b*b;
         printf("The sums of the squares from %d to %d is %d\n", square1, square2, square_sum);
         printf("Enter next set of limits:\n ");
            
     }
         else
        printf("Done\n");
            
            
     }
     return 0;
   
 }
这样应该能满足你的要求。

[此贴子已经被作者于2016-8-18 21:44编辑过]

2016-08-18 21:42
Eahonxu
Rank: 1
等 级:新手上路
帖 子:113
专家分:0
注 册:2016-7-13
收藏
得分:0 
回复 3楼 ehszt
请问下你的程序里
        if(i!=2&&getchar()=='q')break;
        while(getchar()!='\n');
        square_sum=0;
这两个前两个语句分别是什么作用?
我试着分析了一下:
1,当输入值不为true且输入值为q的时候,结束循环,进入下一个语句。那么当输入值既不为true也不为q的时候,理论上也是进入下一个语句吧?(我特意翻了这一章里讲解break的内容),而该循环由于只有单个break语句,因此理论上输入任何值都应该直接跳出循环进入下一个语句,这样的话这个语句好像没什么作用,是这样的吗?
2,当输入完两个整数之后,输入“enter”也就是“\n”以启动程序,因此我为了使进入下一次循环前数据被清空,在输入”\n“后必须使sum值初始化为0。而您的程序里这一句的意思我理解为d当输入两个数值之后的第三个字符不为“\n”时,初始化sum值,换言之每次确认输入后,sum值都应该不被初始化。然而我测试过后,发现您的语句是对的,我的理解是错的,so烦请不吝赐教。
2016-08-19 16:42
ehszt
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:40
帖 子:1745
专家分:3216
注 册:2015-12-2
收藏
得分:0 
回复 4楼 Eahonxu
        if(i!=2&&getchar()=='q')break;
         while(getchar()!='\n');
         square_sum=0;
第一句给出跳出条件:当输入为q时退出
第二句清除输入流中的字符。过程为:读取一个字符看是不是回车,如不是继续读,直到读到回车为止。注意while语句后有一个分号,为空循环。
第三句每次求和前应初始化square_sum为0
2016-08-19 17:03
Eahonxu
Rank: 1
等 级:新手上路
帖 子:113
专家分:0
注 册:2016-7-13
收藏
得分:0 
照着您的格式再提一个问题:
第一句里输入q退出循环,请问是退出哪个循环?书上写“循环中的break语句导致程序终止包含它的循环,并进行程序的下一阶段”“如果break语句位于嵌套循环里,它只影响包含它的最里层的循环“。那么显而易见这里的break应是退出当前的if循环,进行下一阶段。那假如输入i==2||getchar()!='q',似乎程序就会略过这个语句,依然进行下一阶段,那请问这个语句的作用体现在哪里?而当实际上这个语句产生效用的时候,又究竟是如上我述说的哪一部分有误呢?

2016-08-19 18:25
Eahonxu
Rank: 1
等 级:新手上路
帖 子:113
专家分:0
注 册:2016-7-13
收藏
得分:0 
回复 5楼 ehszt
照着您的格式再提一个问题:
1.第一句里输入q退出循环,请问是退出哪个循环?书上写“循环中的break语句导致程序终止包含它的循环,并进行程序的下一阶段”“如果break语句位于嵌套循环里,它只影响包含它的最里层的循环“。那么显而易见这里的break应是退出当前的if循环,进行下一阶段。那假如输入i==2||getchar()!='q',似乎程序就会略过这个语句,依然进行下一阶段,那请问这个语句的作用体现在哪里?而当实际上这个语句产生效用的时候,又究竟是如上我述说的哪一部分有误呢?
2.而且为什么要使用getchar()==q而不能是a = 'q'||b == 'q'?
2016-08-19 18:30
ehszt
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:40
帖 子:1745
专家分:3216
注 册:2015-12-2
收藏
得分:0 
回复 7楼 Eahonxu
if是判断语句不是循环,循环语句一般来说有三个while,do while ,for。也可以用goto循环,当然很少用。break是跳出while(1)循环。
按理说scanf("%d %d",&a,&b);是不会接受字母的,输入的字母存在输入流中,所以a不可能等于q。
2016-08-19 19:33
Eahonxu
Rank: 1
等 级:新手上路
帖 子:113
专家分:0
注 册:2016-7-13
收藏
得分:0 
回复 8楼 ehszt
可我疑惑的是,退出while(1)循环后为什么我输入q会显示done。
2016-08-19 19:50
ehszt
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:40
帖 子:1745
专家分:3216
注 册:2015-12-2
收藏
得分:0 
以下是引用Eahonxu在2016-8-19 19:50:21的发言:

可我疑惑的是,退出while(1)循环后为什么我输入q会显示done。

没发现,能说清楚点吗?
我想你说的是输入其它字母比如w时会输出done吧。
因为a,b都没有赋值,他们的值不确定
你在if(a<=b)前加一行printf("%d %d",a,b);
就都知道对于a,b此时的值是一个不确定值,并且a>b所以输出done

[此贴子已经被作者于2016-8-19 20:08编辑过]

2016-08-19 19:53
快速回复:while语句清除循环内变量数据,怎么破?
数据加载中...
 
   



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

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