C语言第六章答案及详解

合集下载

c语言第六章 答案(全)

c语言第六章 答案(全)

6.1用筛选法求100以内的素数。

参考答案如下:# include “math.h”main(){ int i,j,a[101];for(i=1;i<=100;i++) a[i]=i; /*初始化数组*/a[1]=0; //1不是素数,所有将a[1]赋值为0for(i=2;i<=sqrt(100);i++) //循环2,3,4-----10if(a[i]!=0) //只要a[i]不是0,那么i就是素数,再把100以内该素数的倍数赋值为0 for(j=i+1;j<=100;j++) //因为给素数的倍数肯定不是素数if (a[j]!=0&&a[j]%i==0) a[j]=0;for(i=1;i<=100;i++) //输出所有素数,只要不是素数的值通过上面for语句赋值为0了if (a[i]!=0) printf(“%d ”,a[i]);//即只要a[i]不是0,那么i就是素数}算法思想:首先,将1,2,3---100存在数组a的a[1],a[2],a[3]----a[100]中,即计算时数组元素下标就表示对应的自然数。

然后从2,3到10中的素数,逐一将10以内的素数的倍数的元素置为0(对应的自然数就是合数)。

最后,将所有素数输出(对应的元素值不为0就是素数)。

6.2用选择法对10个数进行排序(从大到小)。

参考答案如下(降序排列):用逐个比较的方法进行。

*/#include <stdio.h>main(){ int a[10],i,j,k,x;printf("Input 10 numbers:\n");for(i=0;i<10;i++)scanf("%d",&a[i]);printf("\n");for(i=0;i<9;i++) //10个数要排9趟,每趟确定a[i],即从a[i]到a[n-1]找到最大的数// 用k记录其下标,然后a[k]和a[i]交换{ k=i; //假设当前无序序列第一个数为最大数for(j=i+1;j<10;j++) //从下一个数开始到最后去找//是否有更大的数if(a[j]<a[k]) k=j; //若有,则把下标记录在k变量中if(i!=k) //将找到的最大数k下标元素和当前的第一个元素i下标元素交换{ t=a[i]; a[i]=a[k]; a[k]=t; }}printf("The sorted numbers:\n");for(i=0;i<10;i++)printf("%d ",a[i]);}6.3 求一个3*3的整型矩阵对角线元素之和参考答案如下:(思考如果求N*N的整型矩阵对角线元素之和怎么修改程序)main(){ int a[3][3],i,j,sum;for(i=0;i<3;i++) //输入3行3列的矩阵{printf("\nInput three integar for %d line",i+1);for(j=0;j<3;j++)scanf("%d",&a[i][j]);}printf("\nThe array is:\n");for(i=0;i<3;i++) //输出3行3列的矩阵{ for(j=0;j<3;j++)printf("%5d",a[i][j]);printf("\n");}sum=0; //sum累加器,初值为0for(i=0;i<3;i++) //将对角线的元素值累加到sum中sum=sum+a[i][i];for(i=2;i>=0;i--) //将反对角线的元素值累加到sum中sum=sum+a[i][2-i];sum=sum-a[1][1]; //a[1][1]加了2次,所以减去一次printf("sum=%d",sum);}思考如果求N*N的整型矩阵对角线元素之和怎么修改程序?参考答案如下:#define N 5main(){ int a[N][N],i,j,sum;for(i=0;i<N;i++){printf("\nInput %d integar for %d line",N,i+1);for(j=0;j<N;j++)scanf("%d",&a[i][j]);}printf("\nThe array is:\n");for(i=0;i<N;i++){ for(j=0;j<N;j++)printf("%5d",a[i][j]);printf("\n");}sum=0;for(i=0;i<N;i++)sum=sum+a[i][i];for(i=N-1;i>=0;i--)sum=sum+a[i][N-1-i];if((N-1)%2==0) sum=sum-a[(N-1)/2][(N-1)/2]; //当N为偶数时,//没有叠加两次的中间对角线元素printf("sum=%d",sum);}6.4已有一个排好序的数组,要求输入一个数后,按原来的排序规律将它插入数组中。

C语言第6章习题解答

C语言第6章习题解答

第6章函数和模块设计【习题6-1】更正下面函数中的错误。

(1)返回求x和y平方和的函数。

(2)返回求x和y为直角边的斜边的函数。

sum_of_sq(x,y) hypot(double x,double y){ {double x,y; h=sqrt(x*x+y*y);return(x*x+y*y); return(h);} }程序如下:/*c6_1(1).c*/ /*c6_1(2).c*/(1) (2)double sum_of_sq(double x,double y) double hypot(double x,double y) { {return(x*x+y*y); double h;} h=sqrt(x*x+y*y);return(h);}【习题6-2】说明下面函数的功能。

(1)itoa(int n,char s[ ])(2)int htod(char hex [ ]){ { int i,dec=0;static int i=0,j=0; for(i=0;hex[i]!='\0';i++)int c; { if(hex[i]>='0'&&hex[i]<='9') if(n!=0) dec=dec*16+hex[i]-'0';{ if(hex[i]>='A'&&hex[i]<='F') j++; dec=dec*16+hex[i]-'A'+10;c=n%10+'0'; if(hex[i]>='a'&&hex[i]<='f') itoa(n/10,s); dec=dec*16+hex[i]-'a'+10;s[i++]=c; }} return(dec);else }{ (3)void stod(int n)if(j==0) s[j++]='0'; { int i;s[j]='\0'; if(n<0){ putchar('-');n=-n;} i=j=0; if((i=n/10)!=0) stod(i);} putchar(n%10+'0');} }功能:(1)(略)(2)(略)【习题6-3】编写已知三角形三边求面积的函数,对于给定的3个量(正值),按两边之和大于第三边的规定,判别其能否构成三角形,若能构成三角形,输出对应的三角形面积。

第6章C语言程序设计(张曙光)教材各章习题解答

第6章C语言程序设计(张曙光)教材各章习题解答

1.(1)数目固定、类型相同的数据(2)在内存中占有一段连续的存储空间(3)a[0]、a[1]、a[2]、a[3]、a[4](4)0 9(5)2(6)按行存放(7)m n m×n(8)7(9)实参数组名(地址)(10)引用了错误的数组元素a[10]2.(1)A)(2)C)(3)D)(4)B)(5)A)(6)D)(7)C)(8)C)(9)B)(10)C)3.(1)①&a[i] ②a[i](2)③t=0; ④(i=0;i<10;i++) ⑤(a[i]==x) ⑥t=1;(3)⑦&base ⑧n%base; ⑨n/base; ⑩i++; ⑾(num[j]<10) ⑿'A'+ (num[j]-10);(4)⒀s[i]>k ⒁findmax(a,N)4.(1)1638276(2)3,5,7,(3)s=18(4)16(5)5 3 3 5(6)0245.#include<stdio.h>#define M 4#define N 4int main(void ){ int a[M], b[N],c[M+N];int i=0, j=0 , k=0;for(i=0;i<M;i++)scanf("%d",&a[i]);for(j=0;j<N;j++)scanf("%d",&b[j]);i=j=0;while(i<M && j<N)if (a[i]<b[j]){ c[k] = a [i];i++; k++; }else{ c[k] = b [j];j++; k++; }while(i<M){ c[k] = a [i];i++; k++; }while(j<N){ c[k] = b [j];j++; k++; }for(i=0;i<M+N;i++)printf("%d,",c[i]);printf("\n");return 0;}6.#include <stdio.h>int main(void){ int k,i,t,n,num[50];printf("Input number n:");scanf("%d",&n);for(i=0;i<n;i++)num[i]=i+1; /*以1至n为序给每个人编号*/i=0; /*每次循环时的计数变量*/k=0; /*按1、2、3报数时的计数变量*/t=0; /* 退出人数*/while(t<=n-1) /*当退出人数比n-1少时(即未退出人数大于1时)执行循环体*/ { if(num[i]!=0) k++;if(k==3) /*将退出的人的编号置为0*/{ printf("%d,",num[i]);num[i]=0;k=0;t++;}i++;if(i==n) i=0; /*报数到尾后,i恢复为0*/ }return 0;}7.#include <stdio.h>int main(void){int a[3][4]={0};int i,j,max,max_i,max_j;printf("Please input a 3X4 matrix:\n");for(i=0;i<3;i++)for(j=0;j<4;j++)scanf("%d",&a[i][j]);max=a[0][0];max_i=max_j=0;for(i=0;i<3;i++)for(j=0;j<4;j++)if(a[i][j]>max){max=a[i][j];max_i=i;max_j=j;}printf("The max is %d,row %d,col %d\n",max,max_i,max_j);return 0;}8.#include <stdio.h>#define N 5int main(void){int a[N][N],b[N][N];int i,j;printf("Please input a matrix:\n");for(i=0;i<N;i++)for(j=0;j<N;j++)scanf("%d",&a[i][j]);printf("Please input b matrix:\n");for(i=0;i<N;i++)for(j=0;j<N;j++)scanf("%d",&b[i][j]);for(i=0;i<N;i++){ b[i][0]=a[N-1][i];b[i][N-1]=a[0][i];}printf("b matrix:\n");for(i=0;i<N;i++){ for(j=0;j<N;j++)printf("%d\t",b[i][j]);printf("\n");}return 0;}9.#include <stdio.h>#define N 10void f(int a[],int n){int b[N],i,m=0;for(i=0;i<N;i++)if(a[i]%2==1){b[m]=a[i];m++;}for(i=0;i<m;i++)printf ("%5d",b[i]);}int main(void){int c[N];int i,j;printf("Please input c matrix:\n");for(i=0;i<N;i++)scanf("%d",&c[i]);f(c,N);return 0;}10.#include <stdio.h>#define M 10void sub(int a[ ], int t, int ix){int i;for( i=ix; i<t; i++) a[i-1]=a[i];}void main( ){int i,n, x[M];printf("输入数组:\n");for( i=0; i<M; i++) scanf("%d", &x[i] );printf("输入n:\n");scanf("%d", &n);printf("\n");sub(x, M, n);printf("输出数组从下标%d位置开始向前移动后的数据:\n",n);for( i=0; i<M-1; i++) printf("%d ", x[i] );printf("\n");}11.递归算法:#include "stdio.h"long fib( int n ){ if (n>2)return (fib(n-1)+fib(n-2));elsereturn ( 1 );}int main(void){ int i;for(i=1;i<=20;i++)printf(" %ld \n",fib( i ) );return 0;}非递归算法:#include "stdio.h"int main(void){long a[20];int i;a[0]=1;a[1]=1;for(i=2;i<20;i++)a[i]=a[i-1]+a[i-2];for(i=0;i<20;i++)printf("%ld\n",a[i]);return 0;}。

c语言网络教室第六章答案

c语言网络教室第六章答案
if(1000*a1+100*a2+10*a3+a4==c1+c2+c3+c4) {printf("%d\n",c1+c2+c3+c4); p=1;}}
if(n==5) for(a1=1;a1<=9;a1++) for(a2=0;a2<=9;a2++) for(a3=0;a3<=9;a3++)
输入: m,n
输出: 满足条件的正整数及其平方
#include"stdio.h"
int main()
{int m,n,i=0,j,k=1,x,y,a[10],p=0,q=1;
scanf("%d %d",&m,&n);
for(x=m;x<=n;x++)
{y=x*x;
if(a3==0) c3=0; else for(b3=a3;b3>0;b3--) c3*=b3;
if(a4==0) c4=0; else for(b4=a4;b4>0;b4--) c4*=b4;
if(a5==0) c5=0; else for(b5=a5;b5>0;b5--) c5*=b5;
if(n==2) for(a1=1;a1<=9;a1++) for(a2=0;a2<=9;a2++)
{c1=c2=c3=c4=c5=c6=c7=1;
for(b1=a1;b1>0;b1--) c1*=b1;
if(a2==0) c2=0; else for(b2=a2;b2>0;b2--) c2*=b2;

C语言第六章课后题详解

C语言第六章课后题详解

C语言第六章课后题详解第六章课后题(仅供参考)1、用筛选法求100之内的素数。

筛选法又称筛法,具体做法是:先把N个自然数按次序排列起来。

1不是质数,也不是合数,要划去。

第二个数2是质数留下来,而把2后面所有能被2整除的数都划去。

2后面第一个没划去的数是3,把3留下,再把3后面所有能被3整除的数都划去。

3后面第一个没划去的数是5,把5留下,再把5后面所有能被5整除的数都划去。

这样一直做下去,就会把不超过 N的全部合数都筛掉,留下的就是不超过N的全部质数。

因为希腊人是把数写在涂腊的板上,每要划去一个数,就在上面记以小点,寻求质数的工作完毕后,这许多小点就像一个筛子,所以就把埃拉托斯特尼的方法叫做“埃拉托斯特尼筛”,简称“筛法”。

(另一种解释是当时的数写在纸草上,每要划去一个数,就把这个数挖去,寻求质数的工作完毕后,这许多小洞就像一个筛子。

)公元前250年同样是古希腊的数学家埃拉托塞尼提出一种筛法:“要得到不大于某个自然数N的所有素数,只要在2---N中将不大于的素数的倍数全部划去即可”。

筛法如下:<1> 先将1挖掉(因为1不是素数)。

<2> 用2去除它后面的各个数,把能被2整除的数挖掉,即把2的倍数挖掉。

<3> 用3去除它后面的各数,把3的倍数挖掉。

<4> 分别用5…各数作为除数去除这些数以后的各数,能除尽的挖掉,剩下的就是素数。

算法如下:<1> 用数组a[1]……a[100]分别存放1~100各数,先将a[1]挖掉(因为1不是素数),我们可以把挖的数组元素统一置为0,既a[1]=0。

<2> 设第一个除数i=2,<3> 令被除数j为i+1<4> 若a[j]不等于0,用i去除a[j],若能整除则令a[j]=0。

即把a[i]的倍数挖掉。

<4> 下一个被除数,既j=j+1,若j≤100,回到第<4>步。

C语言程序设计(第3版)第6章习题参考答案

C语言程序设计(第3版)第6章习题参考答案
printf("\nplease input the first idiom: ");
gets(stridiom1);
printf("\nplease input the second idiom: ");
gets(stridiom2);
fnConcat(stridiom1,stridiom2);
printf("\nthe result is: %s",stridiom1)=0;
while(b[j] != '\0') /*把第二个字符串的内容连接到第一个字符串的后面*/
{
a[i+j] = b[j];
j++;
}
a[i+j]= '\0'; /*添加字符串结束符*/
}
void main()
{ char stridiom1[80],stridiom2[80];
i++;
}
a[j]= '\0'; /*添加字符串结束符*/
}
void main()
{ char stridiom1[80];
printf("\nplease input the first idiom: ");
gets(stridiom1);
fnConvert(stridiom1);
printf("\nthe result is: %s",stridiom1);
scanf("%d",&n);
printf("%ld",fnF(n));
getch();
}
(4)编一函数判别某一数是否为素数,若是,返回值为1,否则,返回值为0。

C语言第6章习题答案

C语言第6章习题答案
(2) #include <stdio.h> #include <stdlib.h> void inputdata(int a[],int n); void process(int a[],int n); void outputdata(int a[],int n); int main() {
int a[10],n=10; inputdata(a,n); outputdata(a,n); process(a,n); outputdata(a,n); system("Pause"); return 0; } void inputdata(int a[],int n) //0~99 之间的数 {
string_b=You are a student.
(5) A (10) D (15) A
(16) A
string_a=I am a teacher. string_b=I am a teacher. 4、程序填空 (1) *p != '\0', *p-'0', j— (2) i <strlen(str), j=i, k+1 (3)a+i, (char)(n%10) + '0' (4)*pk = i, a,n,i+1,pk (5) s1++, *s2, s1=p 5、编程题 (1) #include <stdio.h> int main() { int a=3,b=7,c=2; int *ptra = &a,*ptrb = &b,*ptrc = &c; int temp; printf("a=%d,b=%d,c=%d\n",a,b,c); printf("*ptra=%d,*ptrb=%d,*ptrc=%d\n",*ptra,*ptrb,*ptrc); if ( *ptra > *ptrb ) {

游洪跃C语言程序设计第6章 习题解答

游洪跃C语言程序设计第6章 习题解答
return dt.day;
break;
case 2:/* 2月份*/
return 31 + dt.day;
break;
case 3:/* 3月份*/
if (IsLeapYear(dt.year))
{/*闰年*/
return 31 + 29 + dt.day;
}
else
{/*平年*/
return 31 + 28 + dt.day;
}
else
{/*平年*/
return 31 + 28 + 31 + 30 + 31 + dt.day;
}
break;
case 7:/* 7月份*/
if (IsLeapYear(dt.year))
{/*闰年*/
return 31 + 29 + 31 + 30 + 31 + 30 + dt.day;
}
else
答案:A
7.有以下程序:
/*文件路径名:ex5_1_7\main.c */
#include <stdio.h>/*标准输入/输出头文件*/
int main(void)/*主函数main() */
{
int c = 168;/*定义变量*/
printf("%d\n", c | c);/*输出c | c */
{/*闰年*/
return 31 + 29 + 31 + 30 + dt.day;
}
else
{/*平年*/
return 31 + 28 + 31 + 30 + dt.day;
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

第六章指针
一、选择题
1答案:A
分析:本题主要考指针赋值,n2=n1;是把n2的值赋给n1,故根据指针赋值的定义可知选A,即把q所指对象的值赋给p所指对象。

2答案:B
分析:本题主要考指针定义,因为p指向变量x,故输出其值的时候应该是x的值。

3答案:C
分析:本题主要考指针的定义和赋值,C前面是定义一个量a并赋值为10,后面定义一个指针,并把a的值赋给这个指针。

4答案:C
分析:本题主要考指针的定义及赋值,开始时使p指向a,q指向b,把它们的值交换,然后再显示。

故得正确答案C。

5答案:C
分析:本题主要考函数指针的定义,函数前面的*号表求返回值是指针类型,void表示返回无值弄的。

故选C。

6答案:A
分析:本题主要考的是指针的变量的赋值,在使用scanf()函数的时候,后面跟的是一个地址,由于pa本身保存的是地址,故选A
7答案:D
分析:本题主要考的指针的赋值及指向指针的指针的赋值,根据定义知选D。

B的正确形式是**q=2;C的正确形式应该是q=&p。

8答案:C
分析:本题主要考的是全局变量和局部变量,以及指针的用法,第一个f(&a)的返回值是5,第二个返回值是2。

9答案:A
分析:本题主要考的是变量自加,指针传值,以及指针的赋值。

通过第二行a=b可知p1,p2指向的变量的值相同,都指向了b所指的对象,也是p2所指的对象’a’,由于(*a)++;是实现a所指对象的自加,故由’a’变成’b’,故最终选A。

10答案:A
分析:本题主考NULL,一般来说当我们把一个空值以整数的形式输出出来的时候,默认的情况是0。

11答案:C
分析:本题考的是指针变量的赋值,虽然p没有赋值,表示没有指向某个具体的对象,但事实上系统会让它随机的指向存储单元里的一个对象,那么它的返回值应该是所指存储单元中的值。

12答案:B
分析:本题主要考函数中参数变量的定义,在B中连续定义两个变量,这在函数中是不可以的。

13答案:C
分析:本题主要考指针的指针,c先指向b,b是一个指针,它指向a,故c最终是指向a的,故其值是a中的值。

14答案:A
分析:本题主要考指针的赋值,我们不能把一个具体的值赋给一个指针变量。

B选项是w,p指向同一对象。

C是p指向a。

D是把w所指对象的值赋给p 所指对象。

15答案:B
分析:本题主要考指针传值,p,q分别指向a,b,然而r会指向它们的较小值。

16答案:D
分析:在D中把一个整形变量的值赋给一个指针的地址,故而是错的。

应该写成p=&a。

17答案:D
分析:本题主要考调用函数时指针传值和一般的变量的传值区别。

指针通过地址传值,而变量是直接传值。

c指针指向b,故对c指针里面的值的修改等于直接修改b中的值。

18答案:D
分析:本题主要考指针的定义及指针变量的值的输出方式,指针b指向a,故输出其值是511。

19答案:C
分析:本题主要考指针标识符*和乘号*的区别,*p=*p1*(*p2)中第1,2,4个*号是指针标识符,而第三个是乘号,故其运算的结果是3。

20答案:C
分析:本题主考函数的嵌套调用和数据的类型转换,注意的是(int)(a+b),所以得到5.0。

21答案:A
分析:本题主要说的是函数的递归调用,函数fun()实现的功能是从1加到n,然后返回给主函数。

22答案:D
分析:A不能把一个具体的值赋给一个指针变量。

B q是指向指针的指针只能保存指针的地址。

C同B。

23答案:D
分析:A指针赋处初值时不能把一个具体的值赋给一个指针变量指向的地址。

B语法错误,C不能发地址赋给浮点型变量。

24答案:C
分析:指针只能存放地址。

25答案:C
分析:scanf()函数的输入数据列表应该是合法的地址表达式。

26答案:D
分析:A中b需要预先定义,B中字符变量b只能接收单个字符。

C中二级指针应定义为**c。

答案D
27答案:D
分析:代码“s+=2”是错误的,s是数组的首地址,但S是常量不能改变它的值。

28答案:A
分析:B的正确格式是“p=&n”,C的正确格式是“scanf(“%d”,p)”,D的正确格式是“printf(“%d\n”,*p)”。

答案A
二、填空题
1答案:84
分析:void f()函数里的x,y分别是一个指针变量和整型变量,指针x指向一个整型的变量,即指向主函数里的x,故在函数void f()里修改指针x的值,会影响到主函数里的x的值,但修改void f()里的y的值却不会影响到主函数里的y的值。

因为主函数x传的是地址,y传的是值。

2答案:k*k
分析:由于k是一个指针,故第一个空应该填k。

由于第二个空要输出指针k所指对象的值,故应该填*k表示该指针所指对象的值
3答案:35
分析:p,q分别指向x,y,然后调用函数swap();它的功能是把两个指针所指向的对象交换,原来a,b分别指向x,y,但交换后分别指向y,x,所以并不把指向的
对象的值交换。

函数返回后,p,q仍然分别指向x,y。

故其值不变。

4答案:n=n/10
分析:把n除以10,每执行一次就可以把数的阳未位去掉,因为两个整数相除,不会保留小数,故最低位会丢掉,并且把数缩小到十分之一。

然后依次从个位到最高位把数字输出。

5答案:35。

相关文档
最新文档