《C语言程序设计》第4版 何钦铭、颜晖主编 课后习题答案 第6章 习题6

P147~149

一、选择题

1~6  D A  C D C B

二、填空题

1、1000000001111111   1111111110000000    1111111110000001

2、6

3、1  0   1   1

4、x!=0

5、135

三、程序设计题

1题

#include<stdio.h>
int main(void)
{
	/*分类统计字符个数(习题6.1)*/{ 
	char ch;
	int letter=0,digit=0,blank=0,other=0;
	printf("输入一串字符:");
	while(ch!='\n'){
		scanf("%c",&ch);//可以加入getchar(); 用于读入并舍弃换行符,但此处是循环取值,不可以加 ,可参考课本P056 例3-7 
		if((ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z')){
			letter++;
		}
		else if(ch>='0'&&ch<='9'){
			digit++;
		}
		else if(ch==' '){
			blank++;
		}
		else {
			other++;//包括输入字符结束的那个回车 
		}
	}
	printf("letter=%d,digit=%d,blank=%d,other=%d\n\n",letter,digit,blank,other);} 
	
	return 0;
}

 2题

#include<stdio.h>//习题6.2 
int fn(int a,int n)
{
	int i,sum1=0;
	for(i=1;i<=n;i++)//当n=1时,循环只有i=1进去,循环体执行一次,判断条件执行两次(表达式2)。把循环体编为4,则执行顺序为:1,2,4,3,2跳出 
	{
		sum1+=a;
		a=a*10;
	}
	return sum1;
}
int main(void)
{
	int n,a,sum=0;
	printf("Enter a,n:");
	scanf("%d%d",&a,&n);
	while(n!=0){
		sum+=fn(a,n);
		n--;
	}
	printf("sum=%d",sum);
	 
	
	return 0;
}

修改过的第2题(为防止输入数值过大,将变量类型改为实型(双精度浮点型))

#include<stdio.h>//习题6.2 
double fn(int a,int n)
{
	int i;
    double sum1=0;
	for(i=1;i<=n;i++)//当n=1时,循环只有i=1进去,循环体执行一次,判断条件执行两次(表达式2)。把循环体编为4,则执行顺序为:1,2,4,3,2跳出 
	{                //表达式进去先判断,可参考课本072页 
		sum1+=a;
		a=a*10;
	}
	return sum1;
}
int main(void)
{
	int n,a;
	double sum=0;
	printf("Enter a,n:");
	scanf("%d%d",&a,&n);
	while(n!=0){
		sum+=fn(a,n);
		n--;
	}
	printf("sum=%.lf",sum);
	
	return 0;
}

3题

#include<stdio.h>//习题6.3 
int factorsum(int number)
{
	int i,sum=0;
	for(i=1;i<=number/2;i++)
	{
		if(number%i==0){//number是i的倍数 
			sum+=i;
		}
	}
	return sum;	
}
int main(void)
{
	int m,n,j,result=0;
	printf("Enter m,n(m>=1,n<=10000):");
	scanf("%d%d",&m,&n);
	printf("%d~%d之间的完数为:",m,n); 
	for(j=m;j<=n;j++)
	{
		result=factorsum(j);
		if(result==j){
			printf("%6d",j);
		}
	}
	
	return 0;
}

4题

#include<stdio.h>//习题6.4 
/*int fib(int n)//返回斐波那契数列第n项 
{//递归 
	if(n==1||n==2){//第一项和第二项结果都为1,返回1 
		return 1;
	}
	else return fib(n-1)+fib(n-2);//从第三项开始,等于前两项之和 
}*/
int fib(int n)//非递归,更易理解 
{
	int x1=1,x2=1,x=0,i;
	if(n<3){
		return 1;
	}
	else {
		for(i=0;i<=n-3;i++)//只循环n-2次,当n=3时,x=3 
		{
			x=x1+x2;
			x1=x2;
			x2=x;
		}
		return x;
	}
}
void fibon(int m,int n)
{ 
	int i,count=0;
	for(i=1;fib(i)<=n;i++)//数列到<=n时终止循环,不然会死循环 
	{
		if(fib(i)>=m){//固定在m~n之间 
			count++;//记录数列的项数 
			printf("%6d",fib(i));
		}
	}
	if(count==0){
		printf("No Fibonacci number\n");
	}
}
int main(void)
{
	int m,n,t;
	printf("Enter m,n(m>=1,n<=10000),t:");
	scanf("%d%d%d",&m,&n,&t);
	printf("fib(%d)=%d\n",t,fib(t));
	fibon(m,n);
	
	return 0;
}








5题

#include<stdio.h>
#include<math.h>
int main(void)
{
	/*使用函数验证哥德巴赫猜想(习题6.5)*/
	int i,x1,x2,x,flag,j,k,l,flag1=0,flag2=0,count=0;
	for(i=6;i<=20;i+=2)//可通过改变i的范围输出较少的数 ,可将表达式2改为i<=100,求6~100之间偶数的这种表达式 
	{                 //这里因为简化输出,范围为6~20 
		flag=0;
		x=i/2;//x1和x2分布在x的两侧 //排除2这个素数 
			for(j=2;j<i;j++)
			{
				for(l=2;l<=sqrt(j);l++)//保证j是素数 
				{
					if(j%l==0){
						flag1=0;
					}
					else flag1=1;
				}
				for(k=2;k<i;k++)
				{
					for(l=2;l<=sqrt(k);l++)//保证k是素数 
				  {
					if(k%l==0){
						flag2=0;
					}
					else flag2=1;
				  }
					if(i%2==0&&flag1==1&&flag2==1&&i==j+k&&(j<=k)&&j%2!=0&&k%2!=0){//条件太多,不符合规定 
						printf("%4d=%2d+%2d",i,j,k);//未能实现每个偶数只输出一次,可以限定i,输出一次后直接跳到下一个 
						//continue;
						count++;
					//	break;
					}	
				}
			}
		if(count%5==0){//暂时未发现放哪能实现每5个一行 
		    printf("\n");
	    }
	    else ;
//		if(flag==1){
//			break;
//		}
	} 
	
	return 0;
}

6题

#include<stdio.h>//习题6.6 
#include<math.h>
int reverse(int number)//缺点:传过来1000时,会返回1.本来可以用直接输出余数x的方法使结果变为0001,但这是自定义函数,要求返回逆序数,不可以多次输出 
{
	int x,i,count=0,sum=0,number1,b=0;
	number1=number;
	do{
		x=number1%10;
		number1=number1/10;
		count++;
	}while(number1!=0);
	count=count-1;
	while(number!=0){ 
		x=number%10;
		number=number/10; 
		sum+=x*pow(10,count);
		count--;             //此循环太繁琐了,16、17行可以改为sum=sum*10+x;上面的do~while和count=count-1也可以注释掉 
		
	}
	return sum;	
}
int main(void)
{
	int number;
	printf("Enter number:");
	scanf("%d",&number);
	printf("%d的逆序数为:%d",number,reverse(number));
	
	return 0;
}

7题

#include<stdio.h>//简单计算器(习题6.7) 
int main(void)
{
	int a,b,sum=0;
	char ch;
	printf("输入一个算式:"); 
	scanf("%d",&a);//取输入算式的第一个数 
	while((ch=getchar())!='='){
		scanf("%d",&b);//取算式的第二个数 ,取算式的第三个数 
		switch(ch){//判断运算符 
			case '+':sum=a+b;break;//每次一个运算符就结束,再赋值,就能满足从左到右(从整个输入的那个大算式看),加减乘除看似违背先乘除再加减的法则 
			case '-':sum=a-b;break;
			case '*':sum=a*b;break;
			case '/':if(b!=0){
				     sum=a/b;
			        }break;
			default:printf("error");return 0;//如果不是运算符直接结束程序 
		}
		a=sum;//前两个数算完后,需要把sum赋给a再次进入循环 
	}
	printf("%d",a);
	return 0;
} 

8题,我还没完全理解

#include<stdio.h>//习题6.8,输入字符中首字母大写 
int main(void)
{
	int word=0;//满足非空格字符转换条件 
	char ch;
	while((ch=getchar())!='\n'){
		if(ch==' '){
			word=0;//符合多空格也可以满足条件,同时在此条件下,进行字符转换 
		}
		else if(word==0){//字符非空格,此时word(定义的时候的)=0,判断并转化为大写字母 
			if(ch>='a'&&ch<='z'){
				ch=ch-32;
				word=1;// 在没遇到空格时,小写输出 ,同时保证只输出一个大写字母 
			}
		}
		putchar(ch);//输出大写字母后,Word=1,第一个if不进,第一个else也不进,直接到这原样输出字符(即小写) 
	}
	
	return 0;
}

  • 17
    点赞
  • 57
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值