程序设计基础-基于C语言(第2版) 课后习题参考答案及高考语文试卷_第1页
程序设计基础-基于C语言(第2版) 课后习题参考答案及高考语文试卷_第2页
程序设计基础-基于C语言(第2版) 课后习题参考答案及高考语文试卷_第3页
程序设计基础-基于C语言(第2版) 课后习题参考答案及高考语文试卷_第4页
程序设计基础-基于C语言(第2版) 课后习题参考答案及高考语文试卷_第5页
已阅读5页,还剩60页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

习题1参考答案(1)计算机软件:计算机软件是一系列按照特定结构组织的程序、数据(Data)和文档(Document)的集合。(2)计算机程序:用计算机语言所编写的一系列指令的集合。(3)数据:数据是程序加工和处理的对象。(4)算法:算法是一组有穷的规则,它们规定了为解决某一特定问题而采取的一系列运算步骤。(5)数据结构:数据结构是存在一种或多种特定关系的数据元素的集合,其外在表现为数据的组织形式。(6)数据类型:数据类型是一个值的集合和定义在这个值集上的操作的总称。(7)程序设计:程序设计是给出解决特定问题程序的方法和过程,是软件构造活动中的重要组成部分。1.2简答题(1)简述内存的组织结构形式?计算机系统把内存看作是由若干个连续的存储单元(StorageLocation)组成的,每个存储单元的大小为一个字节(Byte)。为了能唯一标志每个存储单元,在计算机系统中给每个存储单元指定一个唯一的编号,该编号被称为存储单元的地址(Address),计算机在读写内存时就是按照存储单元的地址进行的。(2)为什么计算机系统是一个通用的计算系统?在计算机硬件相对固定不变的前提下,计算机的通用性主要表现在通过运行不同的程序来完成不同的计算任务。(3)简述结构化程序设计的基本思想?在程序设计过程中,如果仅仅使用顺序、选择和循环这三种基本控制结构,并且使每个代码块只有一个入口和一个出口,则这样的程序设计方法被称为结构化程序设计(StructuredProgramming)。(4)简述计算机语言的发展史?程序设计语言经历了从机器语言、汇编语言、高级语言到超高级语言的发展历程。(5)简述利用计算机进行问题求解的过程?1、理解问题特征2、设想解决方案3、优化解决方案4、描述解决方案5、执行并分析解决方案(6)简述各个程序质量要素的含义?1、正确性(Correctness):正确性是指一个计算机程序的正确程度,即程序在预定的运行环境下能正确完成预期功能的程度。2、鲁棒性(Robustness):鲁棒性也称为健壮性,是指在硬件发生故障、输入数据无效或操作错误等意外情况下,程序能做出响应的程度。3、效率(Efficiency):效率是指为了完成预定的功能,系统需要的计算资源(主要包括计算时间和存储空间)的多少。4、易用性(Usability):易用性又称为可用性,是指在完成预定功能时人机交互的难易程度。易用性高的程序容易被程序用户理解和掌握,使用户操作简单方便。5、可理解性(Understandability):可理解性是指理解程序的难易程度。可理解性高的程序才容易测试和维护。如果程序难以读懂,就会给测试和维护带来巨大的困难。6、可测试性(Testability):可测试性是一个计算机程序能够被测试的容易程度。为了提高程序的可靠性,必须通过测试尽可能多得发现并改正程序中的错误。程序的可测试性直接影响测试的质量和效率。7、可维护性(Maintainability):诊断和改正程序错误以及功能扩充和性能提高的容易程度。程序设计是一个迭代过程,要开发出高质量的程序需要对程序进行多次修改和完善。程序的可维护性决定了上述工作的质量和效率。8、可重用性(Reusability):可重用性是指在其它应用中该程序可以被再次使用的容易程度。如果我们在开发新程序时,能够直接或稍加修改就能利用原有的程序,则会大大提高新程序开发的质量和效率。因此,提高程序的可重用性是提高程序设计质量和效率的根本途径。(1)计算-1的8位原码、反码、补码和Excess_127码。分别为:10000001B、11111110B、11111111B、01111110B(2)计算机内存中相邻四个字节的值为分别是:实数0.125、有符号数-1107296256(负数在计算机中用补码表示)无符号数3187671040(3)字符‘A'、‘a'、‘1'的ASCII值是多少,给出将大写字母的ASCII转换成对应小写字母ASCII值得计算公式。‘A’:41H‘a’:61H‘1’大写转化为小写:大写字母的ASCII值+20H=小写字母的ASCII值1.4为以下问题求解设计算法,并分别用程序流程图、N—S盒图和PAD图加以描述。(1)有两个调料盒S1和S2,分别盛有糖和盐,要求将它们互换(即S1盒原来盛糖,现在改盛盐;S2同理)。算法思想:这是一个两个变量交换值的问题,可以设置一个临时变量,首先把S1的值放入临时变量中,然后将S2的值放入S1中,最后将临时变量的值放入S1中即可。程序流程图:N-S盒图:PAD图:(2)依次输入6个整数,要求输出其中最小的数。算法思想:定义一个临时变量用来存放最小的数,首先输入第一个数赋值于临时变量,然后循环输入其余的整数,比拟输入的整数和临时变量的大小,如果大于临时变量则继续输入,反之,则给临时变量赋值为次此数。最后临时变量中存放的数输入的数中的最小数,输入临时变量即可。程序流程图:N-S盒图:PAD图:(3)输入3个整数,按从大到小的顺序输出。算法思想:输入三个数a、b、c,首先比拟a和b,如果a>b,则比拟c和a,如果c>a则输出c、a、b;如果c<a,在比拟c和b,如果c>b,输出a、c、b,否则输出a、b、c;对于a<b的情况同理可以得出结果。程序流程图:N-S盒图:PAD图:(4)求1*2*3*……*10。算法思想:定义一个变量用来存放最后的值,赋初值为1,做十次循环,每次循环在原来变量的基础上乘循环变量值(即1-10),最后输出这个变量即可。程序流程图:N-S盒图:PAD图:(5)输入两个整数,求其最大公约数。算法思想:选取两个数中较小的数作为起始值,让这两个数分别除以这个值,如果可以整除,则这个数就是最后结果,如果不能整除则将起始值减一之后再用原来的两个数对其做除法运算,知道整除为止,得到的起始值的最后值就是结果。程序流程图:N-S盒图:PAD图:(1)钞票换硬币:把一元钞票换成一分、二分、五分硬币(每种至少一枚),有哪些种换法?分析:1元相当于100分,设5分、2分、1分的硬币数分别为X、Y、Z,求换法就是在寻找这样一种组合,使得5*X+2*Y+Z=100,所以每当找到1种组合时,将个数记录下来,就可知换法有多少种,算法描述如下:Count=0;//用于记录个数,初始为0for(X=1;X<=20;X++)for(Y=1;Y<=50;Y++)for(Z=1;Z<=100;Z++){if(5*X+2*Y+Z==100)//可实现交换Count++;}输出Count(2)百钱买百鸡:一只公鸡值5元,一只母鸡值3元,3只小鸡值1元,现用一百元要买一百只鸡,问有什么方案?分析:由题意可知,假设公鸡、母鸡、小鸡分别有X、Y、Z只,那么X、Y、Z满足:X+Y+Z=100,而且要满足钱数限定:5*X+3*Y+1/3*Z=100,由于3只小鸡1元钱,所以小鸡的个数必须是3的整数倍,即:Z是3的整数倍。可通过限制条件,筛选出满足条件的X,Y,Z。当然X、Y、Z还满足以下条件:5*X<=100;3*Y<=100;Z<=100。以下是算法描述:for(X=0;X<=100;X++)for(Y=0;Y<=100;Y++)for(Z=0;Z<=100;Z++){if(5*X<=100and3*Y<=100andz%3==0){if(X+Y+Z==100and5*X+3*Y+Z/3==100){输出X、Y、Z;}}}(3)斐波那契兔子的问题:某人有一对兔子饲养在围墙中,如果它们每个月生一对兔子,且新生的兔子在第二个月后也是每个月生一对兔子,问一年后围墙中共有多少对兔子。分析:第一个月是最初的一对兔子生下一对兔子,围墙内共有两对兔子。第二个月仍是最初的一对兔子生下一对兔子,共有3对兔子。到第三个月除最初的兔子新生一对兔子外,第一个月生的兔子也开始生兔子,因此共有5对兔子。继续推下去,第12个月时最终共有对377对兔子。由分析知,每个月的兔子都是上个月的兔子与新增兔子之和,而上个月新生的兔子到下个月才会生兔子,所以新增的兔子都是上两月的兔子生的。设每个月的兔子数为F(n),则可列出以下式子:F(0)=F(1)=1F(n)=F(n-1)+F(n-2)显然可用递归的方法解出此题,算法流程图如下:习题2参考答案(1)请简要描述C语言的发展历史。答:C语言是一种目前世界上普遍流行、使用广泛的高级程序设计语言,它是在B语言的基础上发展起来的,19721973年间,贝尔实验室设计出了C语言。1983年,美国国家标准化协会制定了C语言的标准,称为ANSIC。(2)略。(3)C语言的主要特点是什么?答:C语言的主要特点如下。①C程序是由函数组成的。②函数由函数头和函数体组成。③C程序总是从main函数开始执行。④每个语句和数据声明的最后必须有一个“;”。⑤C语言没有自己的输入/输出语句,它的输入/输出由库函数printf和scanf完成。⑥可以添加注释。⑦C语言程序中的变量必须先声明后使用。(4)如何使用VisualC++6.0开发控制台程序?使用VC6开发控制台程序的方法如下:答:①在MiscrosoftVisualC++6.0环境下,首先建立一个空的工程。②而后建立一个C源程序文件,并在该文件中输入源代码。③使用Bulid命令或者快捷键F7,进行编译连接。④如果没有错误,选择Execute命令或者快捷键Ctrl+F5,进行执行。习题3参考答案:3.1选择题3.2写出以下程序的输出结果1.200310c82.a=100,b=2003.97,141,61,a4.5.aabbcabc4,36.6,6,6,73.3编程题#include<stdio.h>voidmain(){inta=500;printf("%d,%o,%x\n",a,a,a);}输出结果:500,764,1f42.#include<stdio.h>voidmain(){floatx;scanf("%f",&x);printf("a=%.3f,a=%.}输入:66输出结果:a=66.000,a=6.60000e+0013.#include<stdio.h>voidmain(){charch1='a',ch2=ch1;printf("%c,%d,%o,%x\n",ch1,ch1,ch1,ch1);printf("%c,%d,%o,%x\n",ch2,ch2,ch2,ch2);}输出结果:A,65,101,41a,97,141,614.#include<stdio.h>voidmain(){floatx,y,z,s,v;scanf("%f%f%f",&x,&y,&z);s=2*(x*y+x*z+y*z);v=x*y*z;printf("Area=%.lf,Volume=%.lf\n",s,v);}输入:345输出结果:Area=94,Volume=605.#include<stdio.h>#include<math.h>voidmain(){floatr,s,l;scanf("%f",&r);s=(float)PI*r*r;l=2*(float)PI*r;printf("r=%,s=%,l=%\n",r,s,l);}输入:3输出结果:r=,s=28.3,l=6.#include<stdio.h>#include<math.h>voidmain(){floatx1,y1,x2,y2,x3,y3,a,b,c,p,s;scanf("%f%f%f%f%f%f",&x1,&y1,&x2,&y2,&x3,&y3);a=sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));b=sqrt((x1-x3)*(x1-x3)+(y1-y3)*(y1-y3));c=sqrt((x2-x3)*(x2-x3)+(y2-y3)*(y2-y3));p=(a+b+c)/2;s=sqrt(p*(p-a)*(p-b)*(p-c));printf("Area=%f\n",s);}输入:5638023输出结果:Area=习题4参考答案选择题。A填空题。(1)261(2)16(3)0(4)2,1编程题。(1)#include<stdio.h>voidmain(){floatc,f;printf("输入华氏温度:\n");scanf("%f",&f);c=(f-32)*5/9;printf("摄氏温度为:%\n",c);}(2)#include<stdio.h>#include<string.h>voidmain(){chars1[10],s2[10],s[20];printf("pleaseentertwostring\n");gets(s1);gets(s2);strcat(s1,s2);printf("%s\n",s1);printf("%d\n",strlen(s1));}(3)#include<stdio.h>#include<math.h>voidmain(){doublex,y;printf("pleaseentertwodata:\n");scanf("%lf%lf",&x,&y);printf("%lfraisedto%lfis%lf\n",x,y,pow(x,y));}习题5参考答案1.填空题(1)n=4(2)2*i-1(3)7(4)######2.#include<stdio.h>voidmain(){ longm,n,a,b,s; printf("\nPleaseinputvalueofM:"); scanf("%ld",&m); printf("\nPleaseinputvalueofN:"); scanf("%ld",&n); a=(m>n)?m:n; b=(m>n)?n:m; while(a%b!=0) { s=a%b; a=b; b=s; } printf("\nGongyueshu:%ld\n",s); printf("\nGongBeishu:%ld\n",(m*n)/s);}3.#include<stdio.h>voidmain(){ inta,b,c,d,e; printf("Pleaseinputaninteger:\n"); scanf("%d",&a); if(a/1000==0) { printf("inputerror!\n"); return; } b=a/1000; e=a%10; c=a%1000/100; d=a%100/10; if(b==e&&c==d) printf("YES.\n"); else printf("NO.\n");}4.#include<stdio.h>voidmain(){ intc; intNum1,Num2,Num3,Num4; Num1=Num2=Num3=Num4=0; do { c=getchar(); if((c>='a'&&c<='z')||(c>='A'&&c<='Z')) Num1++; elseif(c>='0'&&c<='9') Num2++; elseif(c=='') Num3++; else Num4++; }while(c!='\n'); printf("英文字母有%d个,数字有%d个,空格有%d个,其它字符有%d个。\n",Num1,Num2,Num3,Num4);}5.#include<stdio.h>#include<math.h>voidmain(){ floata,b,c,disc,x1,x2,realpart,imagepart; printf("Inputa,bandc:"); scanf("%f,%f,%f",&a,&b,&c); printf("Theequation"); disc=b*b-4*a*c; if(fabs(disc)<=1e-7) printf("hastwoequalroots:%.\n",-b/(2*a)); else if(disc>1e-7) { x1=(-b+sqrt(disc))/(2*a); x2=(-b-sqrt(disc))/(2*a);printf("hasdistincerealroots:%and%.\n",x1,x2); } else { realpart=-b/(2*a); imagepart=sqrt(-disc)/(2*a); printf("hascomplextroots:"); printf("%+%4.2fi",realpart,imagepart); printf("and%-%4.2fi\n",realpart,imagepart); }}6.#include<stdio.h>voidmain(){ inti,j; for(i=1;i<=5;i++) { for(j=1;j<=i;j++) printf("*"); printf("\n"); } for(i=5;i>=1;i--) { for(j=i;j>=1;j--) printf("*"); printf("\n"); }}7.#include<stdio.h>#defineEPS1e-7voidmain(){ intn; doublex,an,sum; printf("inputx:"); scanf("%lf",&x); x=x*3.1415926/180; sum=0; an=x; n=1; do { sum+=an; n=n*(n+1)*(n+2); an*=(-x*x)/n; printf("an=%f\n",an); }while(fabs(an)>=EPS); printf("sin(%.4lf)=%.4lf\n",x,sum);}8.#include<stdio.h>voidmain(){ unsignedintn; charc; n=0; printf("inputabinaryinteger:"); while((c=getchar())!='\n') { switch(c) { case'0': n=n*2+0; break; case'1': n=n*2+1; break; } } printf("thedecimalis%d.\n",n);}9.#include<stdio.h>voidmain(){ inti,j; for(i=1;i<10;i++) printf("\t%d",i); printf("\n"); for(i=1;i<10;i++) { printf("%d",i); for(j=1;j<=i;j++) printf("\t%d",i*j); printf("\n"); }}10.#include<stdio.h>voidmain(){ intn,m,z,x,y; printf("inputn:"); scanf("%d",&n); m=n; z=x=y=1; while(n>1) { z=x+y; x=y; y=z; n--; } printf("Fibonacci(%d)=%d.\n",m,z);}11.#include<stdio.h>#include<math.h>voidmain(){ inti,j; intflag; for(i=1;i<=100;i++) { flag=1; for(j=2;j<=sqrt(i);j++) if(i%j==0) { flag=0; break; } if(flag==1) printf("%d\t",i); }}12.#include<stdio.h>voidmain(){ inti,sum; sum=0; for(i=1;i<=1000;i++) if(i%3==0&&i%5==0&&i%7==0) sum+=i; printf("sumis%d.\n",sum);}13.#include<stdio.h>voidmain(){ intx; longf; printf("inputx:"); scanf("%d",&x); if(x>=1&&x<=3) f=2*x+3; elseif(x>=4&&x<=10) f=3*(x+4); else f=x*x+3*x-6; printf("f(%d)=%d\n",x,f);}习题6参考答案6.1&b[i][j]=3001+i*16+j*4;6.2求一维数组各元素的最大值、最小值及所有元素的乘积#include<stdio.h>#defineN10voidmain(){ inta[N]; intmax,min,i,product; printf("输入%d个数组元素:\n",N); for(i=0;i<N;i++) scanf("%d",&a[i]); max=a[0]; min=a[0]; product=a[0]; for(i=1;i<N;i++) { product*=a[i]; if(max<a[i])max=a[i]; if(min>a[i])min=a[i]; } printf("各元素最大值为:%d\n",max); printf("各元素最小值为:%d\n",min); printf("各元素的乘积为:%d\n",product);}6.3已知数列a0=0,a1=1,an=an-2+an-2an-1,求数列的前10个元素#include<stdio.h>#defineN10voidmain(){ inta[N]={0,1}; inti; for(i=2;i<N;i++) a[i]=a[i-2]+a[i-2]*a[i-1]; for(i=0;i<N;i++) { if(i%5==0)printf("\n"); printf("%5d",a[i]); } printf("\n");}6.4用改进的冒泡算法对N个数由小到大排序#include<stdio.h>#defineN10voidmain(){ inta[N]; inti,j,temp,flag; printf("输入待排序数据:\n"); for(i=0;i<N;i++) scanf("%d",&a[i]); for(i=0;i<N-1;i++) { flag=0; for(j=0;j<N-i;j++) if(a[j]>a[j+1]) { temp=a[j]; a[j]=a[j+1]; a[j+1]=temp; flag=1; } if(flag==0)break; } printf("排序后数据为:\n"); for(i=0;i<N;i++) printf("%d",a[i]); printf("\n");}6.5用插入法对N个数由小到大排序#include<stdio.h>#defineN10voidmain(){ inta[N]; inti,j,temp; printf("输入待排序数据:\n"); for(i=0;i<N;i++) scanf("%d",&a[i]); for(i=0;i<N;i++) { j=i-1; temp=a[i]; while(a[j]>temp&&j>=0) { a[j+1]=a[j]; j--; } a[j+1]=temp; } for(i=0;i<N;i++) printf("%d",a[i]); printf("\n");}6.6用筛选法求1--100内的素数#include<stdio.h>#include<math.h>voidmain(){ inta[101]; inti,j,count=0; for(i=1;i<=100;i++) a[i]=i; a[1]=0; for(i=2;i<sqrt(100);i++) if(a[i]!=0) { for(j=i+1;j<=100;j++) { if(a[j]!=0&&a[j]%a[i]==0) a[j]=0; } } for(i=1;i<=100;i++) { if(a[i]!=0) { printf("%5d",a[i]); count++; if(count%5==0)printf("\n"); } }}6.7将一维数组中各个元素的顺序变反#include<stdio.h>#defineN10voidmain(){ inta[N],i,temp; printf("请输入%d个整数:\n",N); for(i=0;i<N;i++) scanf("%d",&a[i]); for(i=0;i<N/2;i++) { temp=a[i]; a[i]=a[N-1-i]; a[N-1-i]=temp; } for(i=0;i<N;i++) printf("%5d",a[i]); printf("\n");}6.8输出如下上三角矩阵,主对角线以下的元素不输出#include<stdio.h>#defineN3voidmain(){ inta[N][N]={{1,1,6},{0,5,7},{0,0,2}}; inti,j; for(i=0;i<N;i++) { for(j=0;j<i;j++) printf(""); for(j=i;j<N;j++) printf("%4d",a[i][j]); printf("\n"); }}6.9求两个矩阵的和,要求不引入新的矩阵#include<stdio.h>#defineM3#defineN4voidmain(){ inta[M][N],b[M][N],i,j; printf("请输入%d*%d矩阵A:\n",M,N); for(i=0;i<M;i++) for(j=0;j<N;j++) scanf("%d",&a[i][j]); printf("请输入%d*%d矩阵B:\n",M,N); for(i=0;i<M;i++) for(j=0;j<N;j++) scanf("%d",&b[i][j]); for(i=0;i<M;i++) for(j=0;j<N;j++) a[i][j]+=b[i][j]; printf("两矩阵的和为:\n"); for(i=0;i<M;i++) { for(j=0;j<N;j++) printf("%5d",a[i][j]); printf("\n"); }}6.10求矩阵的最大元素和最小元素及其所在行和列#include<stdio.h>#defineM3#defineN4voidmain(){ inta[M][N],i,j,max,maxi=0,maxj=0,min,mini=0,minj=0; printf("请输入%d*%d矩阵A:\n",M,N); for(i=0;i<M;i++) for(j=0;j<N;j++) scanf("%d",&a[i][j]); max=a[0][0]; min=a[0][0]; for(i=0;i<M;i++) for(j=0;j<N;j++) { if(a[i][j]>max) { max=a[i][j]; maxi=i; maxj=j; } if(a[i][j]<min) { min=a[i][j]; mini=i; minj=j; } } printf("最大元素为a[%d][%d]=%d\n",maxi,maxj,max); printf("最小元素为a[%d][%d]=%d\n",mini,minj,min);}6.11输出杨辉三角形的前10行11112113311464115101051.......说明:杨辉三角形是(a+b)n展开后各项的系数。首行(a+b)0的系数为1,次行为1,1;其余各行中首末元素为1,其余元素为其左上方元素与正上方元素的和。#include<stdio.h>#defineN10voidmain(){ inta[N][N],i,j; for(i=0;i<N;i++) { a[i][0]=1; a[i][i]=1; for(j=1;j<i;j++) a[i][j]=a[i-1][j-1]+a[i-1][j]; } printf("杨辉三角的前%d行为:\n",N); for(i=0;i<N;i++) { for(j=0;j<=i;j++) printf("%5d",a[i][j]); printf("\n"); }}6.12输出N阶魔方阵,其中N为一个奇数。N阶魔方阵是指一个N*N的方阵,其元素由1到N2组成,且方阵每行、每列以及对角线元素的和都相等。如三阶魔方阵为魔方阵中各数的排列规律如下:(1)1在第一行中间一列;(2)从2到N*N的各个数依次按如下规则存放:每一个数存放的行比前一个数的行数减1,列数加1(如上面的三阶魔方阵,5在4的上一行后一列);(3)如果上一个数在第一行,则下一个数在最后一行,列数加1;(4)如果上一个数在最后一列,则下一个数在第一列,行数减1;(5)如果按上述规则确定的位置已经有数,或上一个数在第1行第N列,则下一个数放在上一个数的正下方。如三阶魔方阵中,按前四条规则,4应该放在第一行、第二列的位置,但由于1已经在该位置,故4放在3的下面。再如6,因其位于第一行第3列,故7在其下方。#include<stdio.h>#defineN5voidmain(){ inta[N][N]={0},i,j,k; i=0; j=N/2; a[i][j]=1; for(k=2;k<=N*N;k++) { i=i-1; j=j+1; if(i<0&&j==N) { i=i+2; j=j-1; a[i][j]=k; } elseif(i<0) i=N-1; elseif(j==N) j=0; elseif(a[i][j]!=0) { i=i+2; j=j-1; } a[i][j]=k; } for(i=0;i<N;i++) { for(j=0;j<N;j++) printf("%5d",a[i][j]); printf("\n"); }}6.13求二维数组的鞍点。即找一个位置,该位置上的元素同行中最大,同列中最小。#include<stdio.h>#defineM3#defineN4voidmain(){ inta[M][N]; inti,j,maxj,count=0,flag; printf("请输入%d*%d阶矩阵A:\n",M,N); for(i=0;i<M;i++) for(j=0;j<N;j++) scanf("%d",&a[i][j]); for(i=0;i<M;i++) { maxj=0; for(j=1;j<N;j++) if(a[i][maxj]<a[i][j])maxj=j; flag=1; for(j=0;j<M;j++) if(a[j][maxj]<a[i][maxj])flag=0; if(flag==1) { count++; printf("第%d个鞍点:a[%d][%d]=%d\n",count,i,maxj,a[i][maxj]); } } if(count==0) printf("没有鞍点");}6.14输出以下图案#include<stdio.h>#defineN4voidmain(){ inti,j; for(i=0;i<N;i++) { for(j=0;j<i;j++) printf(""); for(j=i;j<N;j++) printf("*"); printf("\n"); }}6.15通过键盘输入一行字符串,之后按如下规律对其加密:A→Za→zB→Yb→yC→Xc→x......即将字符串中的第i个大写或小写英文字母变成相应的第26-i+1个大写或小写字母,其它字符不变。#include<stdio.h>#include<string.h>voidmain(){ charstr[100]; inti,len; printf("请输入字符串:\n"); gets(str); len=strlen(str); for(i=0;i<len;i++) { if(str[i]>='A'&&str[i]<='Z') str[i]='A'+25-(str[i]-'A'); if(str[i]>='a'&&str[i]<='z') str[i]='a'+25-(str[i]-'a'); } puts(str);}6.16编程实现strcmp函数的功能。#include<stdio.h>voidmain(){ charstr1[100],str2[100]; inti=0,result; printf("请输入字符串str1:\n"); gets(str1); printf("请输入字符串str2:\n"); gets(str2); while(str1[i]==str2[i]&&str1[i]!='\0') i++; if(str1[i]=='0'&&str2[i]==0) result=0; else result=str1[i]-str2[i]; printf("结果为:%d\n",result);}6.17编程实现strcpy函数的功能。#include<stdio.h>#include<string.h>voidmain(){ charstr1[100],str2[100]; inti=0; printf("请输入字符串str2:\n"); gets(str2); while(str2[i]!='\0') { str1[i]=str2[i]; i++; } str1[i]='\0'; printf("str1=%s\n",str1); printf("str2=%s\n",str2);}习题7参考答案答:从用户使用的角度,可以将函数分为:库函数库函数也称为标准函数,指由C系统提供而无需用户定义的函数。这种函数只需在程序前面包含该函数原型所在的头文件即可(即使用#include预处理命令)。用户自定义函数指用户按照实际需要自己编写的实现一定功能的函数。这种函数需要在程序中进行声明和定义才可以使用。从函数返回值的角度,可以将函数分为:有返回值函数如果一个函数被调用,并在执行完成后要向调用者返回一个执行结果,则称为有返回值函数,这个函数返回的执行结果即为返回值。如:getchar函数便返回一个字符。如果一个用户自定义函数是有返回值的,那么必须在函数声明和定义中明确指出返回值的类型。无返回值函数如果一个函数被调用,但在执行完成后不向调用者返回函数值,则称为无返回值函数。此类函数主要用于完成某种特定的处理任务(类似于Basic、Pascal等语言中的过程),如:printf函数实现输出功能,就没有返回值。用户在定义一个无返回值函数时,需要指定其返回值类型为空类型,即void类型。从函数有无参数的角度,可以将函数分为:有参函数有参函数也称为带参函数。如果一个函数被调用时需要从调用者那里接收一些参数,那么它就是一个有参函数。如:printf、scanf就是有参函数,在调用时需要指明输出、输入的格式和内容。在函数定义和声明中使用的参数,称为形式参数,简称为形参,用于表明一个函数需要接收的数据;在函数调用时给出的参数称为实际参数,简称为实参,用于给被调用的函数传递实际数据。无参函数如果一个函数被调用时不需要从调用者那里接收任何参数,则称为无参函数。如我们前面所有的main函数都是无参函数。答:C语言中函数定义的格式有两种。第一种是传统格式(或称为K&R格式),是早期编译系统使用的格式;第二种是现代格式(或称为ANSI格式),是现代编译系统采用的格式。传统格式:[存储类型][数据类型]函数名([形参名1[,形参名2[,……]]]) [数据类型1形参名1;[数据类型2形参名2;[……]]] { [函数体] }现代格式:[存储类型][数据类型]函数名([数据类型1形参名1[,数据类型2形参名2[,……]]]){[函数体]}功能:定义一个函数。答:函数调用有两种方式:一是使用函数名进行调用,二是使用函数指针进行调用。格式:函数名([实参1,实参2,……])功能:调用函数名指定的函数。填空题(1)10(2)15(3)4,3,7(4)12334(5)x<ar[i][j]ar[i][j]br[i]=x(6)intF(int);longSunFun(int);F(x)x*x+1函数1和函数2之间除变量i和j的存储类型不同外,其它均相同。当函数只执行一次时,两个都是正确的;但是当函数在程序中被反复多次调用时,函数2就是错误的。条件表达式n<=0||(!(n&1)&&n!=2)用于在输入的参数n不是正数或者为不等于2的偶数时退出程序。intF(int);voidmain(){ inta; printf("inputanumber:"); scanf("%d",&a); if(F(a)==0) printf("不是水仙花数。\n"); else printf("是水仙花数。\n");}intF(inta){ intb,c,d; b=a/100; c=a%100/10; d=a%10; if(a==b*b*b+c*c*c+d*d*d) return1; else return0;}7.7#include<stdio.h>#defineDAYS30doublegathering(){ return100000*DAYS;}doublepaying(){ intn; doublepay,s=0; for(n=1,pay=0.01;n<=DAYS;++n,pay+=pay) s+=pay; returns;}voidmain(){printf("gathering:%.2f\npaying:%.2f.\n",gathering(),paying());}7.8#include<stdio.h>doubleL(intn,doublex);voidmain(){ intm,y; scanf("%d%d",&m,&y); printf("%.2f\n",L(m,y));}doubleL(intn,doublex){ if(n==0) return1; elseif(n==1) returnx; else return((2.0*n-1)*L(n-1,x)-(n-1)*L(n-2,x))/n;}7.9#include<stdio.h>#defineN5voidTran(int[N][N]);voidAdd(int[N][N],int[N][N],int[N][N]);voidMul(int[N][N],int[N][N],int[N][N]);voidmain(){ inti,j; intA[N][N],B[N][N],C[N][N]; for(i=0;i<N;i++) for(j=0;j<N;j++) scanf(&A[i][j]); for(i=0;i<N;i++) for(j=0;j<N;j++) scanf(&B[i][j]); Tran(A); for(i=0;i<N;i++) { for(j=0;j<N;j++) printf("%d\t",A[i][j]); printf("\n"); } Add(A,B,C); for(i=0;i<N;i++) { for(j=0;j<N;j++) printf("%d\t",C[i][j]); printf("\n"); } Mul(A,B,C); for(i=0;i<N;i++) { for(j=0;j<N;j++) printf("%d\t",C[i][j]); printf("\n"); }}voidTran(intA[N][N]){ inti,j,t; for(i=0;i<N;i++) for(j=i;j<N;j++) { t=A[i][j]; A[i][j]=A[j][i]; A[j][i]=t; }}voidAdd(intA[N][N],intB[N][N],intC[N][N]){ inti,j; for(i=0;i<N;i++) for(j=0;j<N;j++) C[i][j]=A[i][j]+B[i][j];}voidMul(intA[N][N],intB[N][N],intC[N][N]){ inti,j,k; for(i=0;i<N;i++) for(j=0;j<N;j++) { C[i][j]=0; for(k=0;k<N;k++) C[i][j]+=A[i][k]*B[k][j]; }}7.10递归程序:#include<stdio.h>inthalf(ints[],inta,intb,intkey){ intmid; if(a==b) if(key==s[a]) return(a); else return(-1); else { mid=(a+b)/2; if(key<s[mid]) return(half(s,a,mid,key)); if(key>s[mid]) return(half(s,mid+1,b,key)); if(key==s[mid]) return(mid); }}非递归程序:#include<stdio.h>inthalf(ints[],inta,intb,intkey){ intleft=0; intright=n-1; intmiddle; while(left<=right) { middle=(left+right)/2; if(x==s[middle]) returnmiddle; elseif(x>s[middle]) left=middle+1; else right=middle-1; }return-1;}7.11#include<stdio.h>intEncrypt(inta){ inti,aa[4],t; aa[0]=a%10; aa[1]=a%100/10; aa[2]=a%1000/100; aa[3]=a/1000; for(i=0;i<=3;i++) { aa[i]+=5; aa[i]%=10; } for(i=0;i<=3/2;i++) { t=aa[i]; aa[i]=aa[3-i]; aa[3-i]=t; } t=0; for(i=0;i<4;i++) t=t*10+aa[i]; returnt;}voidmain(){ inta; scanf("%d",&a); printf("encryptedcode:%d.\n",Encrypt(a));}7.12#include<stdio.h>intlength(charp[]);voidmain(){ intlen; charstr[80]; printf("pleaseinputastring:\n"); scanf("%s",str); len=length(str); printf("thestringhas%dcharacters.",len);}intlength(charp[]){ intn; n=0; while(p[n]!='\0') n++; returnn;}7.13#include<stdio.h>#defineN10voidmain(){ inti,j,min,tem,a[N]; printf("pleaseinputtennum:\n"); for(i=0;i<N;i++) { printf("a[%d]=",i); scanf("%d",&a[i]); } printf("\n"); for(i=0;i<N;i++) printf("%5d",a[i]); printf("\n"); for(i=0;i<N-1;i++) { min=i; for(j=i+1;j<N;j++) if(a[min]>a[j]) min=j; tem=a[i]; a[i]=a[min]; a[min]=tem; } printf("Aftersorted\n"); for(i=0;i<N;i++) printf("%5d",a[i]);}习题8参考答案参考课本内容自己进行解答。习题9参考答案请自己参考课本内容进行总结。9.5a为一维数组的数组名,是指向首元素的指针常量,其值为首元素地址2021;a[0]为一维数组a的首元素,其值为0;b为二维数组数组名,是指向首行的指针常量,其值为首行数组的起始地址,为3001;b[0]相当于首行数组的数组名,它指向首行首元素,其值为3001;b[0][0]为二维数组的首元素,其值为0;p1为指向数组元素的指针变量,当前指向数组a的首元素,其值为2021;p1+1指向数组a的标号为1的元素,其值为2021;p2是指向一维数组的指针变量,当前指向二维数组b的首行所对应数组,其值为3001;p2+1指向二维数组b的标号为1的行所对应数组,其值为3009;p3是指向数组元素的指针变量,当前指向二维数组b的首元素b[0][0],其值为3001,p3+1指向二维数组b的第2个元素b[0][1],其值为3003。9.6#include<stdio.h>voidmain(){inta[3][3],*p1,(*p2)[3];inti,j;voidinputmatrix(int*p);voidtranspose(int(*p)[3]);p1=a[0];p2=a;inputmatrix(p1);transpose(p2);for(i=0;i<3;i++){for(j=0;j<3;j++)printf(“%d”,a[i][j]);printf(“\n”);}}voidinputmatrix(int*p){inti,j;printf(“输入矩阵元素:\n”);for(i=0;i<3;i++)for(j=0;j<3;j++)scanf(“%d”,p+3*i+j);}voidtranspose(int(*p)[3]){inti,j,temp;for(i=0;i<3;i++)for(j=i;j<3;j++){temp=*(*(p+i)+j);*(*(p+i)+j)=*(*(p+j)+i);*(*(p+j)+i)=temp;}}9.7#include<stdio.h>#defineN4voidaverage(float(*p)[N],intm){ inti,j; floataver,sum; for(i=0;i<m;i++,p++) { sum=0; for(j=0;j<N;j++) sum+=*(*p+j); aver=sum/N; printf("theaveragescoreofcourseNo.%dis%\n",i+1,aver); }}voidsearch(floats[][N],intm){ inti,j; for(i=0;i<m;i++) for(j=0;j<N;j++) if(s[i][j]<60) printf("courseNo.%d:studentNo.%dfailed\n",i+1,j+1);}voidmain(){ floatscore[3][4]={{82,75,62,90},{89,79,50,93},{49,62,52,77}}; average(score,3); search(score,3);}9.8#include<stdio.h>#defineROWNUM4/*矩阵行数*/#defineCOLNUM4/*矩阵列数*//*输入矩阵子函数*/voidinputmatrix(floata[][COLNUM]){inti,j;printf("inputthematrix:\n");for(i=0;i<ROWNUM;i++)for(j=0;j<COLNUM;j++)scanf("%f",&a[i][j]);}/*输出矩阵子函数*/voidoutputmatrix(floata[][COLNUM]){inti,j;printf("thematrixis:\n");for(i=0;i<ROWNUM;i++){for(j=0;j<COLNUM;j++)printf("%",a[i][j]);printf("\n");}}/*若a[i][i]为0,则找其正下方非零元素所在行,找不到返回-1,否则返回行号*/intfindnzero(floata[][COLNUM],inti){intj,result=-1;for(j=i+1;j<ROWNUM;j++)if(a[j][i]!=0){result=j;break;}return(result);}/*两行互换子函数*/voidexchange(floata[][COLNUM],inti,intj){intk;floattmp;for(k=0;k<COLNUM;k++){tmp=a[i][k];a[i][k]=a[j][k];a[j][k]=tmp;}}/*i行加上j行的k倍,结果放回i行*/voidaddrow(floata[][COLNUM],inti,intj,floatk){inttmp;for(tmp=0;tmp<COLNUM;tmp++)a[i][tmp]=a[i][tmp]+k*a[j][tmp];}/*Gauss消去法化阶梯形*/voidgauss(floata[][COLNUM]){inti,j,flag;for(i=0;i<ROWNUM-1;i++){if(a[i][i]==0){flag=findnzero(a,i);if(flag==-1)continue;/*当前列剩余元素均零则重新开始循环,处理下一行*/elseexchange(a,i,flag);}for(j=i+1;j<ROWNUM;j++)addrow(a,j,i,-a[j][i]/a[i][i]);/*逐行进行消元*/}}voidmain(){floata[ROWNUM][COLNUM];inputmatrix(a);gauss(a);outputmatrix(a);}习题10参考答案10.1定义结构体变量(成员包括年、月、日),输入一个日期并计算该日是当年中第几天。#include<stdio.h>voidmain(){ struct { intyear; intmonth; intday; }date; inti,days; intday_tab[12]={31,28,31,30,31,30,31,31,30,31,30,31}; printf("inputyear,month,day:\n"); scanf("%d%d%d",&date.year,&date.month,&date.day); days=date.day; for(i=0;i<date.month-1;i++) days+=day_tab[i]; if((date.year%4==0&&date.year%100!=0||date.year%400==0)&&date.month>2) days+=1; printf("thedateisthe%dthday",days);}10.2使用指针变量输入学生姓名、学号及三门课的成绩,计算各自的平均成绩并输出#include<stdio.h>#defineN3voidmain(){ structstudent { intnum; charname[20]; floatscore[N]; }; structstudentstu,*p=&stu; floataver=0; inti;printf("请输入学生的学号、姓名及%d门课成绩:\n",N);scanf("%d%s%f%f%f",&p->num,p->name,&p->score[0],&p->score[1],&p->score[2]); for(i=0;i<N;i++) aver=(aver*i+p->score[i])/(i+1);printf("学号:%d\n姓名:%s\n平均成绩:%\n",p->num,p->name,aver);}10.3学生信息包括学号、姓名及入学成绩。输入一组学生的信息,按姓名字典序排序。#include<stdio.h>#include<string.h>#defineN3voidmain(){struct { intnum; charname[13]; floatscore; }stu[N],temp; inti,j,min; printf("请输入各个学生的信息:\n"); for(i=0;i<N;i++) scanf("%d%s%f",&stu[i].num,stu[i].name,&stu[i].score); for(i=0;i<N-1;i++) { min=i; for(j=i+1;j<N;j++) if(strcmp(stu[min].name,stu[j].name)>0) min=j; if(min!=i) { temp=stu[min]; stu[min]=stu[i]; stu[i]=temp; } } printf("排序后为:\n"); for(i=0;i<N;i++) printf("%d%s%\n",stu[i].num,stu[i].name,stu[i].score); }10.4学生信息包括学号、姓名、入学成绩。输入一组学生信息并将成绩最低的学生删除。#include<stdio.h>#defineN3voidmain(){struct { intnum; charname[13]; floatscore; }stu[N]; inti,min; printf("请输入各个学生的信息:\n"); for(i=0;i<N;i++) scanf("%d%s%f",&stu[i].num,stu[i].name,&stu[i].score); min=0; for(i=1;i<N;i++) if(stu[i].score<stu[min].score) min=i; for(i=min;i<N-1;i++) stu[i]=stu[i+1]; printf("删除后为:\n"); for(i=0;i<N-1;i++) printf("%d%s%\n",stu[i].num,stu[i].name,stu[i].score); }10.5编写函数统计链表中结点的个数。#include<stdio.h>structstudent{ intnum; floatscore; structstudent*next;};intgetlen(structstudent*head){ intlen=0; structstudent*p=head; while(p!=NULL) { len++; p=p->next; } return(len);}10.6编写函数查找指定学号的结点在链表中第一次出现的位置,找不到则返回0#include<stdio.h>structstudent{ intnum; floatscore; structstudent*next;};intlocate(structstudent*head,intnum){ structstudent*p=head; inti=0; while(p!=NULL) { i++; if(p->num==num)break; p=p->next; } if(p->num==num) return(i); else return(0);}#include<stdio.h>structstudent{ intnum; floatscore; structstudent*next;};structstudent*dele(structstudent*head,intk){ inti=1; structstudent*p=head; if(k<=0) { printf("位置错!\n"); return(head); } if(head==NULL) { printf("未找到!\n"); return(NULL); } else { if(k==1) { head=head->next; free(p); return(head); } else { while(p!=NULL&&p->next!=NULL) { i++; if(i==k) { p->next=p->next->next; return(head); } } printf("未找到!\n"); return(head); } }}10.8将两个链表头尾相连,合并为一个链表#include<stdio.h>structstudent{ intnum; floatscore; structstudent*next;};structstudent*link(structstudent*head1,structstudent*head2){ structstudent*p=head1; if(head1==NULL) return(head2); else { while(p->next!=NULL) p=p->next; p->next=head2; return(head1); }}10.9将链表中各个结点逆置。#include<stdio.h>structstudent{ intnum; floatscore; structstudent*next;};structstudent*inverse(structstudent*head){ structstudent*p1=head,*p2,*newhead; inti,j,len; if(head==NULL)return(NULL); len=1; while(p1->next!=NULL) { len++; p1=p1->next; } newhead=p1; for(i=1;i<len;i++) { p2=head; for(j=1;j<len-i;j++) p2=p2->next; p2->next=NULL; p1->next=p2; p1=p2; } return(newhead);}10.103,310.11#include<stdio.h>struct{ intnum; charname[10]; charsex; charjob; union { intbanji; charposition[10]; }category; }person[2];/*先设人数为2*/voidmain(){ inti; for(i=0;i<2;i++) {scanf("%d%s%c%c",&person[i].num,&person[i].name,&person[i].sex,&person[i].job); if(person[i].job=='S') scanf("%d",&person[i].category.banji); elseif(person[i].job=='T') scanf("%s",person[i].category.position); else printf("Inputerror!"); } printf("\n"); printf("Nsexjobclass/position\n"); for(i=0;i<2;i++) { if(person[i].job=='S') printf("%-6d%-10s%-3c%-3c%-6d\n",person[i].num,person[i].name,person[i].sex,person[i].job,person[i].category.banji); else printf("%-6d%-10s%-3c%-3c%-6s\n",person[i].num,person[i].name,person[i].sex,person[i].job,person[i].category.position); }}10.12习题11参考答案选择题。填空题。(1)文本文件二进制文件(2)pf=fopen("","w");(3)文本文件二进制文件尾非0值编程题。(1)#include""FILE*fp;voidmain(){intc,d;if((fp=fopen("d:\\tc\\stud.c","r"))==NULL)exit(0);while((c=fgetc(fp))!=EOF)if(c=='/')//如果是字符注释的起始字符'/'if((d=fgetc(fp))=='*')//则判断下一个字符是否为'*'in_comment();//调用函数处理(删除)注释else//否则原样输出读入的两个字符{putchar(c);putchar(d);}elseif(c=='\''||c=='\"')//判断是否是字符'或"echo_quote(c);//调用函数处理字符'或"包含的字符elseputchar(c);}in_comment(){intc,d;c=fgetc(fp);d=fgetc(fp);while(c!='*'||d!=

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论