C语言上机实习2.C基本程序设计与调试2.1使用选择结构的程序设计【实验目的】1.进一步掌握各种表达式的使用。2.利用if语句实现选择结构。3.利用switch语句实现多分支选择结构。【实验内容】1.计算下列分段函数值:其他及且且321003-01656)(222xxxxxxxxxxxxf具体要求如下:1)用if语句实现分支。2)用scanf函数输入,且输入前输入后有提示。【算法与流程图】算法:采用分支结构,根据x的不同范围进行对应的函数运算。流程图如下:开始x0且x≠-30=x10且x≠3及x≠2f(x)=x²+x-6f(x)=x²-5x+6f(x)=x²-x-1输出F(x)结束输入x否是否是【程序清单】#includestdio.hintmain(){floatx,y;printf(x=);scanf(%f,&x);if((x0)&&(x!=-3)){y=x*x+x-6;}elseif((x=0)&&(x10)&&(x!=2)&&(x!=3)){y=x*x-5*x+6;}elsey=x*x-x-1;printf(f(x)=%f,y);}【运行结果】【调试分析和体会】题目考查了选择结构分支语句。2.2循环结构的程序设计【实验目的】1.进一步练习选择结构的程序设计及实现循环结构的三种方法。2.练习并掌握选择结构与循环结构的嵌套,调试与修改程序。【实验内容】1.计算并输出500以内最大的10个素数及其之和。具体要求如下:1)输出要有文字说说明,并同时输出各素数。2)程序内部加油必要注释。3)考虑素数不够10个的情况。【算法与流程图】算法:本题主要算法为判断质数的方法。对于要判断的数i,若j从3到sqrt(i)+1中皆没有i的因子,说明该数为质数。【程序清单】#includestdio.h#includemath.hintmain(){inti,j,t,n,sum;n=0;sum=0;printf(500内最大的10个素数和为:\n);for(i=500;i1;i--){t=0;for(j=2;jsqrt(i)+1;j++)//判断素数的条件,t为标志,只有t为0才说明j为质数{if((i%j)==0){t=t+1;}}if(((t==0)&&(n==9))||(i==2))//i==2为考虑素数不够10个的情况{sum=sum+i;printf(%d=%d,i,sum);break;}if((t==0)&&(n!=9)){printf(%d+,i);sum=sum+i;n=n+1;}}}【运行结果】【调试分析和体会】本题给我们的启示是编程过程中要注意考虑各种情况。2.3模块化程序设计【实验目的】1.掌握c语言中定义函数的方法。2.掌握通过“值传递”调用函数的方法。递归函数的设计方法。【实验内容】1.正整数A的因子之和为B,B的因子之和为A,则称A与B为一对亲密数。求500内的亲密数。具体要求如下:1)函数facsum(n),返回n的所有因子之和。2)主函数调用facsum(n),并输出所有亲密数对。3)根据输出时小数在前,大数在后,去掉重复。2.Ackermann函数具体要求如下:1)根据说明,编制Ackermann函数的递归函数Ackermann(n,x,y)。2)主函数键入n,x,y,调用Ackermann(n,x,y)。计算Ackermann函数值。3)主函数中,输入前要有提示,检查输入数据的合理性,对于不合理的输入,应给出出错信息。输出有文字说明。【算法与流程图】1.题目1主要算法为计算所有因子之和,算法与判读素数的方法基本相同。2.题目2主要算法为递归调用,该函数将n,x,y作为形参传递,函数值作为返回值。【程序清单】题目1#includestdio.hintfacsum(intm){inti,sum;sum=1;i=2;for(i=2;i=m/2+1;i++){if((m%i)==0)sum=sum+i;}returnsum;}intmain(){inti,j,k,n,m;printf(500以内的亲密数对:\n);for(m=2;m=500;m++){n=facsum(m);k=facsum(n);if((m==k)&&(m=n))printf(%d,%d\n,m,n);}}题目2#includestdio.hintack(intn,intx,inty){if(n==0){returnx+1;}elseif((n==1)&&(y==0)){returnx;}elseif((n==2)&&(y==0)){return0;}elseif((n==3)&&(y==0)){return1;}elseif((n=4)&&(y==0)){return2;}elsereturnack(n-1,ack(n,x,y-1),x);}intmain(){intn,x,y;printf(Ackermann函数:);printf(输入函数的三个参数ack(n,x,y)(y=0));scanf(%d%d%d,&n,&x,&y);if(y0){printf(inputerror!);return0;}printf(ack(%d,%d,%d)=%d\n,n,x,y,ack(n,x,y));}【运行结果】题目1题目2【调试分析和体会】题目1给我们的启示是编程过程中要注意考虑各种情况。题目2给我们的启示是要在人机交互过程中给出正确的提示,并在用户输入错误的情况下给出错误的信息。模块化的程序优点在于条理清晰,易于修改,方便阅读。2.4数组的程序设计【实验目的】1.进一步掌握模块化程序设计的方法。2.掌握函数的嵌套调用的方法。3.掌握一维数组与二维数组的定义以及初始化的方法。4.联系并掌握数组作为函数的用法。【实验内容】1.设有两个矩阵为25242322212019181716151413121110987654321A11134079423096171603B求乘积矩阵C=A·B具体要求如下:1)矩阵A与矩阵B的元素在程序中直接用数组初始化进行赋值。2)以矩阵形式输出乘积矩阵C。3)画出流程图。2.有一篇文章,共有三行文字,每行最多80个字符。编程序统计大写字母、小写字母、数字、空格、其他字符的个数。具体要求如下:1)三行文字从键盘输入,输入前有提示。【算法与流程图】1.题目一:算法主要考察数组的运用。流程图如下:开始输入A.Bi3i=0sum=sum+(a[j][k]*b[k][i]);j=0j5J++,c[j][i]=sum;K=0,sum=0K5是否是否i++否输出是结束2.题目二:算法为字符串函数的应用。【程序清单】题目一:#includestdio.hintmain(){inta[5][5]={{1,2,3,4,5},{6,7,8,9,10},{11,12,13,14,15},{16,17,18,19,20},{21,22,23,24,25}};intb[5][3]={{3,0,16},{17,-6,9},{0,23,-4},{9,7,0},{4,13,11}};intc[5][3];inti,j,k,sum;sum=0;for(i=0;i3;i++)for(j=0;j5;j++){sum=0;for(k=0;k5;k++)sum=sum+(a[j][k]*b[k][i]);c[j][i]=sum;}printf(C:\n);for(i=0;i5;i++){for(j=0;j3;j++)printf(%d,c[i][j]);printf(\n);}}题目二:#includestdio.h#includectype.h#includestring.hintmain(){inti,num,up,low,nspace,other,j;chara[3][100];printf(输入三行文字,每行不超过八十个字符\n);for(i=0;i3;i++){gets(a[i]);}num=0;up=0;low=0;nspace=0;other=0;for(i=0;i3;i++){j=0;while(a[i][j]!='\0'){if(isdigit(a[i][j]))num=num+1;if(islower(a[i][j]))low=low+1;if(isupper(a[i][j]))up=up+1;if(isspace(a[i][j]))nspace=nspace+1;if(ispunct(a[i][j]))other=other+1;j=j+1;}}printf(数字个数%d\n,num);printf(小写字母个数:%d\n,low);printf(大写字母个数:%d\n,up);printf(空格个数:%d\n,nspace);printf(其他字符个数:%d\n,other);}【运行结果】题目一:题目二:【调试分析和体会】题目一要注意的地方是如何对数组进行初始化。题目二要注意的地方是区别读入函数scanf和gets的区别,两者只有gets可以读入空格。在编程中,可以直接调用string.h库中的判断函数,这样编程更为简洁。此外要注意字符串的结尾是’/0’。2.5使用指针的程序设计【实验目的】1.进一步练习模块化设计方法。2.掌握使用指针变量的程序设计。3.掌握使用函数指针的程序设计。4.掌握使用指针数组的程序设计。5.掌握字符串冒泡排序的方法。【实验内容】1.输入10个整数,将其中最小的数与第一个数对换,把最大的数与最后一个数对换。编写三个函数:input,max_min_value,output。具体要求如下:1)输入输出都要有文字说明。2)用数组作为形参进行各函数间的参数传递。3)在交换函数max_min_value中,用指针变量完成交换工作。4)画出交换函数的流程图。2.字符串冒泡排序具体要求如下:1)编制函数charbub(b,n),功能为用冒泡法对一组给定的字符串序列进行排序(按递增序列)。其中p为指向字符串指针的一位数组,长度为n。2)编制一个主函数,调用charbub(b,n),对下列单词序列进行排序:main,gou,zhao,lin,wang,zhang,li,zhen,ma,sub.3)要求先输出原单词序列,后输出排序后的单词序列,输出时,各单词之间用两个空格分开。【算法与流程图】1.题目一:本题主要算法为指针变量的交换。流程图如下:开始i=0i10是j=i+1jn-1是Strcmp(p[j],p[j+1])0是strcpy(t,p[j+1]);strcpy(p[j+1],p[j]);strcpy(p[j],t);j++否i=i+1否输出数组p结束否2.题目二:本题算法为冒泡排序,排序对象为字符串,因此需要用到strcmp函数。【程序清单】题目一:#includestdio.hvoidinput(intnumber[10]){inti;for(i=0;i10;i++)scanf(%d,&number[i]);}voidmax_mmin_value(intnumber[10]){inti,*max,*min,t;max=number;min=number;for(i=0;i10;i++){if(number[i]*max)max=&number[i];}t=number[9];number[9]=*max;*max=t;for(i=0;i10;i++){if(number[i]*min)min=&number[i];}t=number[0];number[0]=*min;*min=t;}voidoutput(intnumber[10]){inti;for(i=0;i10;i++)printf(%d,number[i]);}intmain(){printf(输入十个数:);intnumber[10];input(number);