| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 885 人关注过本帖
标题:[求助]请教两道习题!
取消只看楼主 加入收藏
若凡
Rank: 1
等 级:新手上路
帖 子:37
专家分:0
注 册:2005-9-9
收藏
 问题点数:0 回复次数:6 
[求助]请教两道习题!
1.输入一行字符,分别统计出其中英文字母、空格、数字和其他字符的个数。

我是这样写的:
#include "stdio.h"
#include "ctype.h"
main()
{int s,num,c,space,other;
scanf("%c",&s);
for(;(s=getchar())!='\n';)
  {if(isdigit(s))
    num++;
   else if(isalpha(s))
         c++;   
   else if(isspace(s)) space++;     
   else other++;
  }
printf("the num is %d\;\nthe char is %d\;\nthe space is %d\;\nthe other is %d\n",num,c,space,other);
}

问题:统计结果出来后,字符数总是比实际的少一个,不知道为什么。


2.一个数如果恰好等于它的因子之和,这个数就称为“完数”。例如,6的因子为1,2,3,而6=1+2+3,因此6是完数。编程找出1000之内的所有完数,并按下面格式输出其因子:
6 its factors are 1,2,3

我是这样写的:
main()
{int k,a,n,x,s=1,i,j,m[20];
for(x=1;x<=1000;x++)
{ j=0;a=0;k=0;
  do
  {for(n=x,i=2;i<x;i++)
    {k=a;   /*用于判断用否执行了下面的if语句*/
      if(x%i==0)
        {x=x/i;
         s=s+x;
         m[j]=i;
         a=++j;
         i=1;
          }
      }
   }while(!(k==a));
s=s+x;m[j]=x;
if(s==n)   
{printf("%d its factors are 1\,\n",i);
  for(i=0;i<=j;i++)
   { if(!m[j]) break;
  printf("%d",m[j]);
  printf("\,");
      }
  }
}
}

按ctrl+F9后,没有任何输出,并且不能返回TC的编辑界面。
好像是陷入死循环了
但是我实在是发现不了哪里有问题。


我是初学者, 这两道题都是谭浩强《C程序设计》第二版里的习题。
希望知道的帮忙解答一下。
不尽感激。

[此贴子已经被作者于2005-9-11 4:22:35编辑过]


搜索更多相关主题的帖子: 习题 
2005-09-09 16:00
若凡
Rank: 1
等 级:新手上路
帖 子:37
专家分:0
注 册:2005-9-9
收藏
得分:0 
不要说这个有答案
但是我想弄明白我到底哪里错了
为什么错
先谢谢了

无语话凄凉
2005-09-09 16:33
若凡
Rank: 1
等 级:新手上路
帖 子:37
专家分:0
注 册:2005-9-9
收藏
得分:0 
谢谢楼上的指点
我改正了你所指出的
但是结果还是一样
字母数统计完之后总是差一个,其他统计都正确


无语话凄凉
2005-09-11 03:39
若凡
Rank: 1
等 级:新手上路
帖 子:37
专家分:0
注 册:2005-9-9
收藏
得分:0 
谢谢楼上的两位
改成'\0'以后输入完字符串后回车就没反应了
所以我又在for(){...}里面加了一条语句
if(s=='\n') break;
结果跟以前一模一样

还有,我发现不是字符统计那里的问题
假如你第一个输的是数字的话,数字数量也会少一个
就是说第一个统计不进去
还是想不清楚哪里出了问题

[此贴子已经被作者于2005-9-11 4:11:37编辑过]



无语话凄凉
2005-09-11 03:59
若凡
Rank: 1
等 级:新手上路
帖 子:37
专家分:0
注 册:2005-9-9
收藏
得分:0 
以下是引用303770957在2005-9-11 3:57:45的发言: 没有输出结果说明你的 do{}whlie语句是死循环!应设立一个break语句.
可是do {} while 循环有停止的条件啊 不满足条件就一直循环 我觉得我的代码是可以出现满足停止条件的情况的 看不出来哪里有问题 请进一步明示 谢谢

无语话凄凉
2005-09-11 04:15
若凡
Rank: 1
等 级:新手上路
帖 子:37
专家分:0
注 册:2005-9-9
收藏
得分:0 
以下是引用303770957在2005-9-11 4:15:07的发言: 我建议你将:{int s,num,c,space,other;scanf("%s",&s);该为:{int num,c,space,other; char s[20];gets(s);因为你输入的是带空格的字符串用scanf("%s",&s);只能接收不带空格的字符串,而gets(s);就可以接收带空格的字符串,而且你写的s的接收格式不正确.
嗯,用你的方法的确可以达到目的 但是我就是想不明白为什么其他的字符都可以统计进去 就第一个字符统计不进去 而且空格也可以统计得很准确啊(只要第一个字符不是空格) 注:上面题目中写的scanf("%s",&s)写错了,是scanf("%c",&s),不好意思。

无语话凄凉
2005-09-11 04:26
若凡
Rank: 1
等 级:新手上路
帖 子:37
专家分:0
注 册:2005-9-9
收藏
得分:0 
以下是引用303770957在2005-9-11 4:23:16的发言: 你把你改进的程序发来我看看!
第一题按你所说的改成这样了 完全可以达到目的 第二题没改,还是最上面的 #include "stdio.h" #include "ctype.h" main() {int i,num=0,c=0,space=0,other=0; char s[20]; gets(s); for(i=0;i<=20;i++) {if(s[i]=='\0') break; else{ if(isdigit(s[i])) num++; else if(isalpha(s[i])) c++; else if(isspace(s[i])) space++; else other++; } } printf("the num is %d\;\nthe char is %d\;\nthe space is %d\;\nthe other is %d\n",num,c,space,other); }

无语话凄凉
2005-09-11 04:29
快速回复:[求助]请教两道习题!
数据加载中...
 
   



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

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