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

P165

练习7-1的第一问:有,结果只能输出一个下标,但输入数据中可能会有两个需查找的值

#include<stdio.h>//例7-3 
#define N 10
int main(void)
{
	int i,n,x,flag;//flag 的作用是为了方便输出找不到的情况,需要放到循环外面 
	int a[N];
	printf("Enter n(1<=n<=10),x:");
	scanf("%d%d",&n,&x);
	printf("输入%d个整数:",n);
	for(i=0;i<n;i++)
	{
		scanf("%d",&a[i]);
	}
	flag=0;//是否有下标的判断标准,默认没有,有则改变,不等于0即可 
	for(i=0;i<n;i++)
	{
		if(x==a[i]){
			printf("下标为:%d\n",i);
			flag=1;//有,则不需要输出Not,改变flag
		//	break;  //这里不能加break;否则 只能查找到一个下标,但输入数据中可能有两个或多个满足条件的元素 
		}
	}
	if(flag==0){
	    printf("Not Found!\n");
	}
	
	return 0;
}

练习7-2到7-4

#include<stdio.h>
int main(void)
{
	/*求最大值及其下标(练习7-2)*/{ 
	int n,a[10],i,max;
	
	printf("Enter n:");
	scanf("%d",&n);
	printf("Enter %d numbers:",n);
	for(i=0;i<n;i++)
	{
		scanf("%d",&a[i]);
	} 
	max=0;
	for(i=0;i<n;i++)
	{
		if(a[i]>a[max]){
			max=i;
		}
	}
	printf("max=%d,min_index=%d\n\n",a[max],max);} 
	
	/*将数组中的数逆序存放(练习7-3)*/{ 
	int n,i,t,j;
	int a[10];
	
	printf("Enter n:");
	scanf("%d",&n);
	printf("Enter %d numbers:",n);
	for(i=0;i<n;i++)
	{
		scanf("%d",&a[i]);//存放 
	} 
	i=0;
	j=n-1;
	while(i<j){//逆序 
		t=a[j];
		a[j]=a[i];
		a[i]=t;
		i++;
		j--;
	}
	for(i=0;i<n;i++)
	{
		printf("%4d",a[i]);
	}
	printf("\n\n");} 
	
	/*找出不是两个数组共有的元素(练习7-4)*/
	int i,j,k,m,n;
	int a[10],b[10],c[20];
	
	printf("Enter n:");
	scanf("%d",&n);
	printf("Enter %d numbers:",n);
	for(i=0;i<n;i++)
	{
		scanf("%d",&a[i]);
	}
	printf("Enter m:");
	scanf("%d",&m);
	printf("Enter %d numbers:",m);
	for(j=0;j<m;j++)
	{
		scanf("%d",&b[j]);
	}
	for(i=0;i<n;i++)
	{
		for(j=0;j<m;j++)//用a的元素分别与b的元素比较,共n*m次 
		{
			if(a[i]==b[j]){//如果a中的元素与b中的元素相等,就跳出内循环 
				break;
			}
		}
		if(j>=m){//正常比较了m次,但没有相等的,就把a中这个的元素 放到数组c中存起来 
			c[k]=a[i];
			k++;//记录有几个不相等的 
		}
	}
	for(i=0;i<m;i++)//外循环为m,内循环为n 
	{
		for(j=0;j<n;j++)//用b中的元素去和a中的比较 
		{
			if(b[i]==a[j]){//如果相等就跳出内循环 
				break;
			}
		}
		if(j>=n){//如果b中第一个元素与a中每个元素都比较了,但没有找到相等的就把这个b中的元素存到数组c中 
			c[k]=b[i];
			k++;//累计不相等的 
		}	
	}
	printf("两个数组的非共有元素:\n"); 
	for(i=0;i<k;i++)
	{
		printf("%4d",c[i]);//此输出满足非共有元素输出 
	}
	
	return 0;
}

P172

练习7-5:原本3行2列,改后输出2行3列。

练习7-6(1):将for的外循环改为列循环,内循环改为行循环,即外j内i。

(2):相比较与遍历上/下三角,把判断条件if去掉,直接实现交换,再将输出改为先列后行。

练习7-7正确,练习7-8只可参考,不完全正确

#include<stdio.h>
#define K 13
int main(void)
{
	/*矩阵运算(练习7-7)*/
/*	int n,i,j,sum=0;
	int a[6][6];
	printf("Enter n:");
	scanf("%d",&n);
	printf("Enter %d numbers:\n",n*n);
	for(i=0;i<n;i++)
	{
		for(j=0;j<n;j++)
		{
			scanf("%d",&a[i][j]);
			sum+=a[i][j];//求矩阵中所以数的和 
		}
	} 
	for(i=0;i<n;i++)
	{
		for(j=0;j<n;j++)
		{
			if(i==n-1)//减去最后一行 
			{
				sum-=a[i][j];
			}
			else if(j==n-1){//减去最后一列 
				sum-=a[i][j];
			}
			else if(i+j==n-1){//减去副对角线 
				sum-=a[i][j];
			}
		}
	}
	printf("sum=%d\n\n",sum);
	
	/*方阵循环右移(练习7-8)*///暂时保留,此程序m的值无论为多少,最后的结果都是一样的 
	int m,n,i,j,t,k;//按照课本上的公式推,m=2,得到3 1 2,其他人的参考过程需要得到2 3 1,为三角形循环转动两次得到 
	int a[6][6],b[6][6]={0};//按照课本上的公式推,m=1,得到 2 3 1,三角形循环得到 3 1 2 
	
	printf("Enter n,m:");
	scanf("%d%d",&n,&m); 
	printf("Enter %d numbers:\n",n*n);
	for(i=0;i<n;i++)
	{
		for(j=0;j<n;j++)
		{
			scanf("%d",&a[i][j]);
		}
	}
	m=m%n;//防止出现m=n或m>n的情况。若m=n,则是一个完整的循环,输出数列位置不变;若m>n,则移动位数为m%n,即余。 
	for(i=0;i<n;i++)//用循环解答,三阶就用三角形,四阶就用正方形,按一定顺序,从小到大转 
	{
		for(j=1;j<=m;j++)
		{
			t=a[i][n-1];//n=3,m=2时,第一遍 3,第二遍2,第三遍为第二行最后一个6,然后是5,接着是第三行9,最后是8 
			for(k=n-2;k>=0;k--)
			{
				a[i][k+1]=a[i][k];//后一项被前一项覆盖,到倒数第二项  第一遍2覆盖3,1覆盖2,行列式第一行为3 1 2, 
			}//                                                       第二遍1覆盖2,3覆盖1,行列式第一行为2 3 1,为所求行列式第一行 
			a[i][0]=t; //t的作用就是把每次最后的那个值保留,然后存到最前面 
		}
	}
/*	for(i=0;i<n;i++)//此部分程序不正确,不管m的值为多少,输出结果都是一个,2 3 1或2 3 4 1 
	{
		if(j==0){//如果是第一列,就和最后一列交换 ,用三阶方阵举例,m=1,第一行输入1 2 3 
			t=a[i][j];
			a[i][j]=a[i][n-1];//此处将1和3交换,行列式第一行改变为:3 2 1 
			a[i][n-1]=t;
		}//第一列和最后一列交换后,最后一列变为第一列
		for(j=0;j<n-1;j++)//再从第一列开始,到倒数第二列 ,依次与右边相邻的列交换 
		{
			t=a[i][j];
			a[i][j]=a[i][j+1];//此处将3和2交换,行列式第一行改变为:2 3 1,为最终所要得到的排列 
			a[i][j+1]=t;
		}
	}*/
	for(i=0;i<n;i++)
	{
		for(j=0;j<n;j++)
		{
			printf("%4d",a[i][j]);
		}
		printf("\n");
	}
	
	return 0;
}

练习7-9

#include<stdio.h>//例7-10,练习7-9 
#define K 13
int day_of_year(int year,int month,int day)
{
	int i,leap,k;//tab[leap][k],leap=0 非闰年 
	int tab[2][13]={{0,31,28,31,30,31,30,31,31,30,31,30,31},{0,31,29,31,30,31,30,31,31,30,31,30,31}};//k的值为13,因为有12个月,所以tab[2][0]=0; 
	
	leap=((year%4==0&&year%100!=0)||year%400==0);//计算leap=0还是=1 
	for(k=1;k<month;k++)//k本来是从0开始的,但为了更方便计算,从1月份开始到是12月份 
	{
		day=day+tab[leap][k];//第month个月的几天+前几个月每个月的天数 
	}
	return day;//得到一年中第几天 
	
}
int main(void)
{
	int year,month,day;
	printf("Enter year,month,day:");
	scanf("%d%d%d",&year,&month,&day);
	printf("上述时间是%d年第%d天",year,day_of_year(year,month,day));
	
	
	return 0;
}

P180、181

练习7-10

#include<stdio.h> //练习7-10 查找特定字符 
int main(void)
{
	char str[80],ch;
	int i,index=0;
	
	printf("输入一串字符:\n");
	gets(str);
	printf("输入需查找的字符:\n");
	ch=getchar();
	for(i=0;str[i]!='\0';i++)
	{
		if(ch==str[i]){
			index=i;
		}
	}
	printf("ch=%c,index=%d",str[index],index);
	
	
	
	return 0;
 
} 

练习7-11

#include<stdio.h>//练习7-11 字符串逆序 
#include<string.h>
int main(void)
{
	char str1[80],str2[80];
	int i,j,t,len=0;
	
	gets(str1);
	/*用while循环求字符串长度,两个数组实现逆序*/ 
	i=0;
	while(str1[i]!='\0'){
		i++;
	}
	j=0;
	i=i-1;
	for(i=i;i>=0;i--){
		str2[j]=str1[i];
		j++;
	}
	str2[j]='\0';
	puts(str2);
	/*调用函数求字符串长度,单个数组内部交换实现逆序*/{ 
	i=strlen(str1);
	j=0;
	i=i-1;
	while(i>j){
		t=str1[i];
		str1[i]=str1[j];
		str1[j]=t;
		j++;
		i--;
	} 
	puts(str1);}
	
	return 0;
} 

  • 7
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值