| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 885 人关注过本帖
标题:[求助]请教两道习题!
只看楼主 加入收藏
若凡
Rank: 1
等 级:新手上路
帖 子:37
专家分:0
注 册:2005-9-9
收藏
 问题点数:0 回复次数:12 
[求助]请教两道习题!
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
等 级:新手上路
帖 子:7
专家分:0
注 册:2005-9-10
收藏
得分:0 
本人愚见
问题一:
你声明s为整形变量,则用scanf时只能用形式scanf("%c",&s) or scanf("%d",&s)
若想用scanf("%s",&s),则必须定义为数组形式。
你已用scanf接收数据 for语句中的getchar函数无效。
在使用那些计数变量时,要先将其初始化。否则系统初始化为随机数。
2005-09-10 22:45
若凡
Rank: 1
等 级:新手上路
帖 子:37
专家分:0
注 册:2005-9-9
收藏
得分:0 
谢谢楼上的指点
我改正了你所指出的
但是结果还是一样
字母数统计完之后总是差一个,其他统计都正确


无语话凄凉
2005-09-11 03:39
303770957
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:6
帖 子:838
专家分:2125
注 册:2005-9-10
收藏
得分:0 
看看我的意见!
看看这个程序:删除字符串中重复的字符.
如:输入:fghffgklhhqwq
输出:klw
#include "stdio.h"
#include "string.h"
#define  Q 80
void main()
  {char str1[Q],str2[Q],*p1,*p2;
   int i,k,m=0;
   printf("Please Enter One String:");
   scanf("%s",str1);
   p1=str1;p2=str2;
   for(i=0;str1[i]!='\0';i++)
    {for(k=0;str1[k]!='\0';k++)
       if(str1[i]!=str1[k]) m++;
     if(m==strlen(str1)-1)
       {*p2=*p1;p2++;p1++;m=0;}
     else {p1++;m=0;}
     }
   *p2='\0';
   printf("The result is:");
   puts(str2);
   getch();
  }

♂ 死后定当长眠,生前何须久睡。♀
2005-09-11 03:49
303770957
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:6
帖 子:838
专家分:2125
注 册:2005-9-10
收藏
得分:0 
呼唤
for(;(s=getchar())!='\n';)
应该改为:for(;(s=getchar())!='\0';)

♂ 死后定当长眠,生前何须久睡。♀
2005-09-11 03:54
303770957
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:6
帖 子:838
专家分:2125
注 册:2005-9-10
收藏
得分:0 
没有输出结果说明你的 do{}whlie语句是死循环!应设立一个break语句.

♂ 死后定当长眠,生前何须久睡。♀
2005-09-11 03:57
若凡
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
303770957
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:6
帖 子:838
专家分:2125
注 册:2005-9-10
收藏
得分:0 
出错原因已经找见.
我建议你将:{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的接收格式不正确.

♂ 死后定当长眠,生前何须久睡。♀
2005-09-11 04:15
若凡
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
快速回复:[求助]请教两道习题!
数据加载中...
 
   



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

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