第四章程序编写

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

第四章程序编写在掌握了程序设计语言基本概念和基本技能的基础上,我们讨论程序的编写。本章运用结构化程序设计的思想,通过具体实例介绍了一般的编程方法。我们同时还提供一些专项练习题,并作了较详细的解答。4.1要点分析结构化程序设计的思想是由顶到底逐步细化。下面我们通过具体的编程例子来体现结构化程序设计的思想。例:写完整的程序,用公式!1!31!21!111ne计算e的近似值,直到某项小于10-7为止。此题目属于累加问题,也就是我们要重复执行s=s+1/t的操作,到1/t的值小于10-7为止。重复操作用循环实现,这样程序的初步框架为:main(){intt=1;floats=1;while(1.0/t=1e-7){s=s+1.0/t;}printf(“e=%.5f”,s);}下面的工作是细化t,t为阶层,而求阶层运算是用累乘的方法即t=t*i,变量i的值在循环中的变化,步长为1。这样程序为:main(){intt=1,i=1;floats=1,while(1.0/t=1e-7){t=t*i;s=s+1.0/t;i=i+1;}printf(“e=%.5f”,s);}例:请输入n值,编写程序输出下列图形(例如n=5).1234511234111231111211111对于图形打印题目,我们应该这样来考虑。图形由若干行组成,也就是我们要重复打印行的操作若干次,用循环实现。这样程序的基本结构为:scanf(“%d”,&n);for(i=1;i=n;i++){打印第i行}循环体为“打印第i行”的操作。而第i行是由若干列,i个1和2,3,……n-i组成。所以打印“第i行”的操作为输出n个数:for(j=1;j=i;i++)printf(“%d”,1);for(j=2;j=n-i;j++)printf(“%d”,j);。所以此题目的程序为:scanf(“%d”,&n);for(i=1;i=n;i++){for(j=1;j=i;i++)printf(“%d”,1);for(j=2;j=n-i;j++)printf(“%d”,j);}通常打印图形用两重循环组成,外层循环控制行,内重循环控制列;若图形为上下对称图形,则分上下两部分分别打印。例:编写一函数,其功能是将形参intx的值转换成二进制数,所得二进制数的每一位数放在一维数组中返回。完成这个题目主要解决两个问题,函数定义问题和十进制转换为二进制问题。函数定义首先需要解决的问题是参数定义和函数返回值的问题,其次是函数体。根据题意,函数参数为需要转换的十进制数,返回值是一维数组。返回数组通常的处理方法是数组名作参数。函数体是将形式参数转换为二进制。这样函数的基本框架为:voiddtob(intx,intb[]){x转换为二进制;}这里的函数体是我们需要解决的第二个问题——十进制转换为二进制问题。十进制转换为二进制用除二取余法,即求x除以2的余数,将其存入数组;再求商除以2的余数,存入数组,用得到的再商求除以2的余数,存入数组,……值到商为0。根据题意,“十进制转换为二进制”用C语言描述为:intk=0;do{b[k]=x%2;x/=2;k++;}while(x);这样,完整的函数为:voiddtob(intx,intb[]){intk=0;do{b[k]=x%2;x/=2;k++;}while(x);}例:将10个整数按小到大排列。数据排序有多种方法,我们这里介绍选择排序法。我们先将10个数依次放入数组元素a[1],a[2],a[3],……,a[9],a[10]中。选择排序的思想是:在a[1],a[2],a[3],……,a[9],a[10]中选择最小的值放入a[1],在a[2],a[3],……,a[9],a[10]中选择最小的值放入a[2]中,……,在a[i],a[i+1],……a[9],a[10]中选择最小值放入a[i]中(i=1,2,…9),如此,数组就成为有序数组。这样,选择排序的基本框架为:for(i=1;i=9;i++){选择a[i],a[i+1],……a[9],a[10]中的最小值放入a[i]中。}下一步的工作是细化循环体:求a[i],a[i+1],……a[9],a[10]中的最小值即最小元素,然后将其与a[i]交换值。求a[i],a[i+1],……a[9],a[10]中的最小元素,是求最小值问题。我们用下面程序段实现。maxa=a[i];/*maxa为最小元素。*/for(j=i+1;j=10;j++){if(a[j]maxa){{t=a[j];a[j]=maxa;maxa=t;}max=j;/*max为最小元素下标。*/}t=a[i];a[i]=a[max];a[max]=t;在数组中我们用下标区分数组元素。如,若max为最小元素下标,则a[max]为最小元素。那么,以上程序段可以简化为:max=i;/*max为最小元素的下标,即最小元素为a[i]的。*/for(j=i+1;j=10;j++){if(a[j]a[max])max=j;t=a[i];a[i]=a[max];a[max]=t;这样,完整的选择排序程序为:main(){inti,j,t,max,a[11];for(i=1;i=9;i++){max=i;for(j=i+1;j=10;j++){if(a[j]a[max])max=j;}t=a[i];a[i]=a[max];a[max]=t;}}我们从以上所举的例子可以看出,只要把握结构化程序设计的思想,熟练掌握实现三种基本结构——顺序结构、选择结构、循环结构的语句,掌握常用算法的思路,就可以解决一些常规的编程问题。4.2专项练习(1)试编程判断输入的正整数是否既是5又是7的整倍数。若是,则输出yes;否则输出no。(2)有一函数:1001)0(1xxxxxy分别用if-else语句和嵌套的if语句编写程序,要求输入x的值,输出y的值。(3)编写程序,对任意输入的两个实型数以及一个运算符(+、-、*、/),能够输出算式和计算结果,如:输入:3+5CR显示:3+5=8(提示:用switch语句实现)。(4)编一程序,对于给定的一个百分制成绩,输出相应的五分制成绩。设:90分以上为‘A’;80-89分为‘B’;70-79分为‘C’;60-69分为‘D’,60分以下为‘E’(用switch实现)。(5)设等差数列的第一项a=2,公差d=3,编写程序,输出前n项和中能被4整除的所有小于200的和。(6)输入100个整数,编一程序,分别统计其中偶数和奇数的个数。(7)编写打印输出以下图案的程序。MTMTMTMMTMTMMTMM(8)用迭代法求ax求平方根的迭代公式为nnnxaxx211要求前后两次求出的x的差的绝对值小于10-5。(9)求整数m的所有素数因子(10)一个数恰好等于它的因子之和,这个数就称为“完数”。例如,6的因子为1,2,3而6=1+2+3,因此6是完数。编程找出求1000以内的所有完全数。(11)以下程序的功能是统计正整数的各位数字中零的个数,并求各位数字中最大者。(12)写完整的程序,用公式!1!31!21!111ne计算e的近似值,直到某项小于10-7为止。(13)试写一个函数,以m为整型参数,判别m是否为素数。若m是素数,则返回1;若m不是素数,则返回0。(14)编写函数,根据公式1公里=5/8英里,把英里数转换为公里数。(15)试用for控制结构,求数组a[N]的前k(k=N)个元素中的最大值及最小值,并将结果分别存于变量max和min中。71513114(16)编写函数,实现计算n个元素组成的整型数组中去掉一个最大值和一个最小值后的平均值(如有多个相同的最大值和最小值,只要去掉一个,且设n大于2)。(17)设计函数,求整数n的阶乘,并在主函数中调用该函数(通过循环结构)计算下列多项式:y=1!+3!+5!+7!(18)编写一个程序,打印出所有的“梅花数”。所谓“梅花数”是一个五位数,其各位数字的五次方和等于该数本身。例如:54748是一个“梅花数”,因为54748=55+45+75+45+85(19)求100~150之间和400~450之间能被9整除的数。(20)输出1至100之间每位数的乘积大于每位数的和的数。(21)试用while控制结构,求出给定十进制正整数n的位数(例:278是三位数),并将结果存于变量C中。(22)定义一个函数,统计3行4列的整数二维数组中有多少个正数、多少个负数,多少个零,并返回统计结果(23)编写一个程序求数组a的最大数和第二最大数并分别存放于a[0]和a[1]中。假设数组中元素各不相同。(24)用公式2222213121116n求л的近似值,直到最后一项的值小于10-6为止。(25)试用do-while控制结构,计算下列公式的近似值!56!34!121642xxxs当某项的值小于0.0001时,该项及以后各项不再累加,结束循环求和。(26)输入一个正整数,要求以相反的顺序输出该数。(27)编写计算字符串长度的函数。(28)用公式:求π的值,直到最后一项的绝对值小于10-6为止。(29)输入正偶数n,计算以下级数之和并输出结果(显示结果保留小数点后3位))1)(1(1639241nnns(30)编写一个求两个数最大公约数的函数。(31)编写一函数,其功能是将形参x的值转换成二进制数,所得二进制数的每一位数放在一维数组中返回。(32)编写一函数,其功能是在一维数组a中查找x值;若找到则返回所在的下标值,否则返回0;(33)编写函数统计某字符在字符串中出现的次数,若该字符不出现则返回值零。(34)编写函数,其函数功能是将字符串s倒置。例如,输入为”tracher”,则应输出“rehcaet”(35)编写一个程序计算1到正整数n之间的奇数之和以及偶数之和。(36)编写侯选人得票的统计程序。设有三个候选人,每次输入一个得票的后选人的名字,要求最后输出各人得票结果。(37)将三个学生的数据存入名为“student.dat”的文件。学生数据包括学号、姓名、年龄。(38)编写程序将终端读入的文本(用#作为文本结束标志)复制到一个名为bi.dat的新文件中。(39)设单链表的结点类型doctor中有工号num(整型)、工资pay(实型)和next(指向doctor类型的指针类型)三个成员。假定单链表已经建立,链表首指针为head,试写一个函数,以head为形式参数,其功能是删除给定工号为n的结点。(40)编写程序,从键盘上输入一个字符串,把该字符串中的小写字母转换为大写字母,输出到文件test.txt中,然后从该文件读出字符串并显示出来。4.3答案与题解(1)main(){intx;printf(“inputx:”);scanf(%d,&x);if(x%5==0&&x%7==0)printf(yes);elseprintf(no);}(2)方法1:main(){floatx,y;printf(inputx:);scanf(%f,&x);y=x;if(x==0)y=x-1;if(0x&&x10)y=x+1;printf(y=%f\n,y);}方法2:main(){floatx,y;printf(inputx:);scanf(%f,&x);if(x==0)y=x-1;elseif(0x&&x10)y=x+1;elsey=x;printf(y=%f,y);}(3)#includestdio.hvoidmain(void){floatdata1,data2,data3;charop;printf(\nTypeinyourexpression:);scanf(%f%c%f,&data1,&op,&data2);switch(op){case'+':data3=data1+data2;break;case'-':data3=data1-data

1 / 23
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功