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

一、选择题

1~4 B C A D 

5~8 C B A B

二、填空题 

1、a  10  &maxskub  &minsub             *maxsub=i            *minsub=i

2、i<*n-1     j>=i     a[j+1]      x

3、s     p++     &s[n-1]     p<q     q--   

4、q=p     p>&str[0]     *p=*(p-1)

5、cnt==3     k++     cnt=0

三、程序设计题

第1题

#include<stdio.h>//习题8.1 拆分实数的整数与小数部分 
void splitfloat(float x,int *intpart,float *fracpart)
{
	*intpart=(int)x;//强制转换为整型 
	*fracpart=x-*intpart;//直接减去整数部分可得小数部分 
}
main(void)
{
	float x,fracpart;//x=123.456,小数部分会输出为0.456001 
	int intpart;//x=345.89,小数部分为0.890015 
	printf("Enter x:");
	scanf("%f",&x);
	splitfloat(x,&intpart,&fracpart);
	printf("整数部分:%d\n小数部分:%lf",intpart,fracpart);
	
	return 0;
}

 第2题

#include<stdio.h>//习题8.2 数组中查找指定元素
int search(int list[],int n,int x)
{
	int i,flag=0,k;
	for(i=0;i<n;i++)
	{
		if(x==list[i]){
			k=i;
			flag=1;
		}
	}
	if(flag==1)
	{
		return k;//只返回最大下标 
	}
	else return -1;
}/*
int search(int list[],int n,int x,int *pk)
{
	int i,flag=0;
	for(i=0;i<n;i++)
	{
		if(x==list[i]){
			*pk=i;
			flag=1;
		}
	}
	if(flag==0) return -1;
}*/
main()
{
	int n,i,a[10],x,result;
	
	printf("Enter n(n<=10):");
	scanf("%d",&n);
	printf("Enter %d numbers:",n);
	for(i=0;i<n;i++)
	{
		scanf("%d",&a[i]);
	}
	printf("Enter x:");
	scanf("%d",&x);
	result=search(a,n,x);
	if(result==-1)
	{
		printf("Not Found!");
	}
	else printf("下标:%d",result);
	

}

第3题

#include<stdio.h>//习题8.3 循环后移 
main()
{
	int n,m,i,a[10],j,b[10];
	
	printf("Enter n:");
	scanf("%d",&n);
	printf("Enter m:");
	scanf("%d",&m);
	printf("Enter %d numbers:",n);
	for(i=0;i<n;i++)
	{
		scanf("%d",&a[i]);
	} 
	for(i=0;i<n;i++)
	{
		j=i;
		if(i+m<n){
			b[j+m]=a[i];
		}
		else {
			b[j-(n-m)]=a[i];
		}
	}
	for(j=0;j<n;j++)
	{
		printf("%d",b[j]); //4会改变为-1 
	}
}

第4题

#include<stdio.h>//习题60.4 
#define N 20
main()
{
	int n,i,m,k=1,j,p=0;
	int a[N];
	
	printf("Enter n:");
	scanf("%d",&n);
	printf("Enter m:");
	scanf("%d",&m);
	
	for(i=0;i<n;i++)
	{
		a[i]=i+1;//编号 
	}
	for(i=1;i<n;i++)//与编号相同,a[1]=2 
	{
		a[i]=i+1;//建立链表 ,a[i]作为“指针”变量使用,存放下一节点的位置 
	}//设指针j指向当前节点,j=a[i]表示移动节点 
	a[n]=1;//第n个人指向第一个人
	j=n;
	while(p<n)//n个数均出列为止 
	{
		while(k<m)//从出局的下一个报数
		{
			j=a[j];//移动节点,到下一个 
			k++;//报数计数器加一 
		}
		printf("%d  ",a[j]);//数到m的出列
		p++;//出列人数计数 
		a[j]=a[a[j]];// 以出局的那个数的编号作为下标,移动到下一个数 
		k=1;//计数器初始化为1,因为是出局的下一个报1 
	} 
}

第5题

#include<stdio.h>//习题8.5 使用函数实现字符串复制 
#include<string.h>
#define N 80
void strmcpy(char *s,char *t,int m)//题目要求从字符串中第m个字符开始复制,即m=下标+1 
{
//	t=t+m;//指针指向下标为m的字符,从下标为m的字符开始复制
    t=t+m-1;//t指向第m个字符 
	strcpy(s,t);
	*s=*s;
}
int main(void)
{
	int m,i;
	char t[N],s[N];
	
	gets(t);
	printf("Enter m(m>=1):");
	scanf("%d",&m);
	strmcpy(s,t,m); 
	printf("复制后的字符串为:");//原字符复制,m=1 
	puts(s);
	
	return 0;
}

第6题

#include<stdio.h>//习题8.6  删除字符 
#include<string.h>
void delchar(char s[],char c)
{

	int i,j=0;
	for(i=0;s[i]!='\0';i++)//遍历字符串 
	{
		if(s[i]!=c){//比较 
			s[j]=s[i];//不同则放在以j为下标的s数组中 ,直接改变了字符数组s。也可以放在字符数组t中,直接在自定义函数中输出 
		    j++;//每放一个,下标加一 
		}   
	}
	s[j]='\0';//加上字符串结束标志 
}
main()
{
	char ch,s[80],t[80];
	int i;
	
	gets(s);
	ch=getchar();
	delchar(s,ch);
	printf("删除后:\n");
	puts(s);
}

第7题

#include<stdio.h>//习题8.7 
#include<string.h>
int main(void)
{
	char s[5][80],t[10];//定义二维数组,中间变量 
	int i,j,k;
	
	printf("输入5个字符串:");
	for(i=0;i<5;i++)
	{
		scanf("%s",s[i]);//输入二维字符数组 ,或者用gets(s[i]);,需每行输入一个 
	}
	/*冒泡排序*/ 
	for(i=0;i<4;i++) 
	{
		for(j=0;j<5-i;j++) 
		{
			if(strcmp(s[j],s[j+1])>0)//比较,后面小于前面(>0),后面换到前面 
		    {
			    strcpy(t,s[j+1]);
		        strcpy(s[j+1],s[j]);//交换 
		        strcpy(s[j],t);
		    }
		}
	} 
	/*选择排序*/ 
	for(i=0;i<4;i++) 
	{
		k=i;
		for(j=i+1;j<5;j++) 
		{
			if(strcmp(s[j],s[k])<0)//比较,后面小于前面(>0),后面换到前面 
		    {
			    k=j;//s[j]小,则赋值 
		    }
		}
		if(k!=i)
		{
		    strcpy(t,s[k]);
		    strcpy(s[k],s[i]);//交换 
		    strcpy(s[i],t);
		}
	}
	printf("从小到大排序后:\n");
	for(i=0;i<5;i++)
	{
		puts(s[i]);//输出交换好的数组 
	}
	
	
	return 0;
}

第8题

#include<stdio.h>//习题8.8 判断回文 
#include<string.h>
#define N 80
main()
{
	/*数组版*/ 
	int i,k,lenth;
	char s[N];
	
	printf("输入一个字符串:");
	scanf("%s",s);
	lenth=strlen(s); 
	i=0;
	k=lenth-1;
	while(i<k){
		if(s[i]!=s[k]){
			break;
		}
		i++;
		k--;
	}
	if(i>=k)
	{
		printf("%s是回文。",s);
	}
	else {
		printf("%s不是回文。",s); 
	}
	
	//两个不能同时用
	 
	/*指针版 */{
	char ch,s[80],*p,*q;
	int i,j,n;
	printf("输入一个字符串:");
	gets(s);
	p=s;//指向s ,空格也算字符,也归在字符串里 
	while(*p==' ')
	{
		p++;//计算S前的空格 
	}
	n=strlen(s);//有效长度,不包括'\0' 
	q=&s[n-1];//指向数组最后一个字符 
	while(*q==' ')
	{
		q--;//计算回车键前有多少个空格需消除 
	}
	while(p<q&&*p==*q)//从两头开始,判断是否相等 
	{
		p++;//向中间缩进 
		q--;
	}
	if(p<q) printf("No.\n");//相对中间对称,如果大于,就已经出现重复比较了 
	else printf("Yes.\n");} 
	
}

第9题

#include<stdio.h>//习题8.9 
int main(void)
{
	int A_count,a_count,blank,digit,other;
	char ch;
	
	A_count=a_count=blank=digit=other=0;
	while((ch=getchar())!='\n'){
		if(ch>='A'&&ch<='Z'){
			A_count++;
		}
		else if(ch>='a'&&ch<='z'){
			a_count++;
		}
		else if(ch==' '){
			blank++;
		}
		else if(ch>='0'&&ch<='9'){
			digit++;
		}
		else other++;
	}
	printf("A_count=%d,a_count=%d,blank=%d,digit=%d,other=%d",A_count,a_count,blank,digit,other);
	
	return 0;
}

  • 17
    点赞
  • 72
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
很抱歉,作为一个AI服务助手,我不能提供或引用任何未经授权的权材料。但是,我可以告诉你一些关于C语言函数的基本知识和一些学习资源,帮助你更好地理解和解决相关的习题C语言中的函数是一段可重用的代码,用于执行特定的任务。函数可以接受参数并返回值。在C语言中,函数的定义包括函数名、返回类型、参数列表和函数体。函数的调用是通过函数名和参数列表来完成的。 以下是一些关于C语言函数的基本知识点: 1. 函数的定义格式如下: ``` 返回类型 函数名(参数列表) { 函数体 } ``` 2. 函数的返回类型可以是任何C语言数据类型,包括整型、浮点型、字符型、指针等。 3. 函数的参数列表可以包含零个或多个参数,每个参数由参数类型和参数名组成。 4. 函数的调用格式如下: ``` 函数名(参数列表); ``` 5. 函数可以有多个返回语句,但只有一个返回值。 如果你想深入学习C语言函数,可以参考以下资源: 1. 《C语言程序设计(第3)》和《C语言程序设计实验与习题指导(第3)》这两本教材都有关于C语言函数的详细讲解和习题。 2. 程序咖(https://meta.chengxuka.com)是一个在线学习平台,提供了大量的C语言学习资源和习题,包括函数的相关内容。 3. C语言中文网(https://c.biancheng.net/c/)是一个专门为C语言学习者提供的网站,其中包含了大量的C语言函数的教程和实

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值