中国石油大学华东C语言习题答案.doc

上传人:wux****ua 文档编号:7992494 上传时间:2020-03-26 格式:DOC 页数:89 大小:237.50KB
返回 下载 相关 举报
中国石油大学华东C语言习题答案.doc_第1页
第1页 / 共89页
中国石油大学华东C语言习题答案.doc_第2页
第2页 / 共89页
中国石油大学华东C语言习题答案.doc_第3页
第3页 / 共89页
点击查看更多>>
资源描述
C语言复习题【设计型】5.1 输出一行星号编写程序在一行中输出 N 个星号。输入: N值输出: 一行中N个星号 #includeint main() int a,i; scanf(%d,&a); for(i=1;i=a;i+) printf(*); printf(n); return 0;【设计型】5.2 打印平行四边形输入图形的高 n ,输出如下例( n=5 )所示的图形 . * * * * * 输入:整数n例如 5 输出:由*组成的高为5的平行四边形#includeint main() int i,j,num; scanf(%d,&num); for(i=0;inum;i+) for(j=0;jnum;j+) printf(*); printf(n); return 0;【设计型】5.3 编程计算编写程序,输入n的值,求 :1-1/2+1/3-1/4+1/5-1/6+1/7-.+1/n (保留四位小数) #includeint main() double n,i,sum,k=1.0; scanf(%lf,&n); i=1,sum=0; while(i=n) sum=sum+k/i; i+; k=-k;(用这个式子实现正负交替) printf(sum=%.4lfn,sum); return 0;【设计型】5.4 分数序列有一个分数序列:.,输入整数n,求出其前n项的和。 输出语句格式为:printf(sum=%16.10fn,s);#includeint main() int n,a,b,i,temp; double sum; scanf(%d,&n); i=1,sum=0,a=2,b=1; while(i=n) sum=sum+a*1.0/b; temp=a; a=a+b; b=temp;(几个式子实现数值的变换) i+; printf(sum=%16.10fn,sum); return 0;【设计型】5.5 求e的值编写程序,从键盘输入整数 n , 求 e 的值 . e=1+1/1!+1/2!+1/3!+.+1/n! 注意:用 double 型数据计算输出语句:printf(sum=%16.10fn,sum); #includeint main() int n,i; double sum,jc; scanf(%d,&n); i=1,sum注意题干中的红色1=1.0 jc=1.0; while(i=n) jc=jc*i; sum=sum+1.0/jc; i+; printf(sum=%16.10fn,sum); return 0;【设计型】5.6 最大公约数输入两个正整数m和n,求它们的最大公约数和最小公倍数比如,输入m和n的值分别为14和21,则最大公约数为7,最小公倍数为42。#includeint main() int yu,m,n,temp,bei,ji; scanf(%d%d,&m,&n); if(mn) temp=m,m=n,n=temp; ji=m*n; yu=m%n; while(yu!=0) m=n; n=yu; yu=m%n; (最大公约数求法) bei=ji/n;(最小公倍数求法) printf(the greatest common divisor is %dn,n); printf(the least common multiple is %dn,bei); return 0;【设计型】5.7 水仙花数输出所有的水仙花数。所谓的水仙花数是指一个3位数,其各位数字立方和等于该数本身。例如153是一水仙花数,因为153=13+53+33输出语句:printf(%dn,n); #includeint main() int a,b,i,j,k; for(i=1;i=9;i+) for(j=0;j=9;j+) for(k=0;k=9;k+) (三重循环从1到999) a=i*i*i+j*j*j+k*k*k; b=100*i+10*j+k; if(a=b) printf(%dn,b); return 0;【设计型】5.8 完数一个数如果恰好等于它的因子之和,这个数就称为完数。例如,6的因子为1,2,3,且6=1+2+3,因此6是完数,从键盘上输入一个正整数,判断其是否为完数。如果是,则按照如下格式输出。比如,输入6,则输出Yes,its factors are 1 2 3;如果输入8,则输出No#includeint main() int yinzi,num,i,sum=0; scanf(%d,&num); for(yinzi=1; yinzinum; yinzi+) if(num%yinzi=0) sum=sum+yinzi; if(sum=num) printf(Yes,its factors are ); for(i=1; inum; i+) if(num%i=0) printf( %d,i); (输出因子具体值) printf(n); else printf(Non); return 0;【设计型】5.9 素数输入两个正整数m和n,求出m,n区间的所有素数 #includeint main() int m,n,i,j,tag=1; scanf(%d%d,&m,&n); for(i=m; i=n; i+) for(j=2; ji; j+) if(i%j=0) tag=0; break; else tag=1; if(tag) printf( %d,i); printf(n); return 0;【设计型】5.10 回文数输入一个数,判断是否为回文数,如果是,输出Yes,否则输出No#includeint main() double num; scanf(%lf,&num); int min=0, max=num;while (max0) min=min*10+(int)max%10;(将数字反过来) max=max/10; if(num=min) printf(Yesn); else printf(Non);return 0;【设计型】5.11 贪吃的猴子有一只猴子,第一天摘了若干个桃子 ,当即吃了一半,但还觉得不过瘾 ,就又多吃了一个。第2天早上又将剩下的桃子吃掉一半,还是觉得不过瘾,就又多吃了两个。以后每天早上都吃了前一天剩下的一半加天数个(例如,第5天吃了前一天剩下的一半加5个)。到第n天早上再想吃的时候,就只剩下一个桃子了。输入:天数n输出:第一天的桃子个数,输出语句为printf(The monkey got %d peachs in first day.n,sum); Smaple:Input:5OutputThe monkey got 114 peachs in first day.提示:问题分析: 总共 t0 日 吃掉 剩余 1 t0/2+1 t0-(t0/2+1)=t0/2-1 t1=t0/2-1 =t0=(t1+1)*2 2 t1/2+2 t1-(t1/2+2)=t1/2-2 t2=t1/2-2 =t1=(t2+2)*2 . n-1 tn-2/2+(n-1) tn-2-(tn-2/2+(n-1)=tn-2/2-(n-1) tn-1=tn-2/2-(n-1) = tn-2= (tn-1+n-1)*2 n 1 0 tn-1=1 #includeint main() int i,t,sum; scanf(%d,&t); sum=1; for(i=t;i1;i-) sum=(sum+i-1)*2;? printf(The monkey got %d peachs in first day.n,sum); return 0;【创新型】5.12 马戏团观众人数一个马戏团表演, n 个座位全满,全部门票收入是 120 元,现在知道,男人每人 5 元,女人每人 2 元,小孩每人 1 角。编程,输入总人数 n ,输出满足要求的男人、女人和小孩人数的全部方案。若 n 人无法满足条件,则输出“No outputn”。输入: 人数 n 输出: 男人、女人和小孩人数 #includeint main() int man,woman,child,total,sum,tag=0; scanf(%d,&total); for(man=0; man=total; man+) for(woman=0; woman=(total-man); woman+) child=total-man-woman; sum=50*man+20*woman+1*child; if(sum=1200) tag=1; printf(%d %d %dn,man,woman,child); if(tag=0) printf(No outputn); return 0;【设计型】5.13 迭代法用迭代法求.求平方根的迭代公式为:要求前后两次求出的x的差的绝对值小于10-5。#include#includeint main() double x,a,b; double i; scanf(%lf,&x); b=x; for(i=1;) a=i; i=(i+x/i)/2; if(fabs(i-a)=0.00001) printf(The square root of %.2lf is %.5lfn,b,i); break; return 0;【设计型】5.14 cos(x)-x=0利用以下所示的简单迭代方法求方程:cos(x)-x=0的一个实根。 Xn+1=cos(Xn) 迭代步骤如下: (1)取X1初值为0.0; (2)X0=X1,把X1的值赋给X0; (3)X1=cos(X0),求出一个新的X1; (4)若X0-X1的绝对值小于0.000001,执行步骤(5),否则执行步骤(2); (5)所求X1就是方程cos(X)-X=0的一个实根,输出X1,输出语句为printf(x=%lf,x);。 提示:本题x0和x1定义为double类型#include#include#includeint main() double x0,x1; for(x1=0;) x0=x1; x1=cos(x0); if(fabs(x0-x1)=0.000001) printf(x=%lfn,x1); break; return 0;【设计型】5.15 求一个三位数,其值等于其各位阶乘之和编写程序,求某三位数,该数值的大小正好是组成这个数的三个位上的数字阶乘之和。输出格式:printf(%dn,num);#includeint main() int i,j,k,l,ge,shi,bai,s1,s2,s3; for(i=100; i=999; i+) ge=i%10; shi=i%100/10; bai=i/100; s1=1; s2=1; s3=1; for(j=1; j=ge; j+) s1=s1*j; for(k=1; k=shi; k+) s2=s2*k; for(l=1; l=bai; l+) s3=s3*l; if(i=s1+s2+s3) printf(%dn,i); break; 【研究创新型】6.1 谁能出线背景:电视台举办“超级学生”才艺大赛,由于报名人数狂多,所以要先进行分组预赛。按规定,每10名学生为一个预赛小组,评委打出分数(0100分),各小组第一名可以进入下一轮;如果有多名学生得分相同都是第一名,则可同时进入下一轮。输入:按顺序给出一个小组10个人的最后得分(int)。输出:能够出线的学生序号(09)。#includeint main()int i,a10,max;for(i=0;i10;i+)scanf(%d,&ai);max=a0;for(i=0;i10;i+)if(max=ai)max=ai;for(i=0;i10;i+)if(ai=max) printf(%dn,i); return 0;【设计型】6.2 统计素数的个数求出 2 到 m 之间 ( 含 m,m=1000) 所有素数并放在数组 a 中。输入:正整数m输出:从小到大的所有素数,及个数(素数输出的时候用%4d来控制)如:输入:10输出:2 3 5 74 #includeint main() int i,j,k=0,a1001,m,yu,tag,num=0; scanf(%d,&m); for(i=2; i=m; i+) tag=1; ak=i; for(j=2; ji; j+) yu=i%j; if(yu=0) tag=0; num+; break; if(tag=1) printf(%4d,ak); k+; printf(n); printf(%dn,m-num-1); return 0;【设计型】6.3 冒泡法排序冒泡排序(BubbleSort)的基本概念是:依次比较相邻的两个数,将小数放在前面,大数放在后面。即在第一趟:首先比较第1个和第2个数,将小数放前,大数放后。然后比较第2个数和第3个数,将小数放前,大数放后,如此继续,直至比较最后两个数,将小数放前,大数放后。至此第一趟结束,将最大的数放到了最后。在第二趟:仍从第一对数开始比较(因为可能由于第2个数和第3个数的交换,使得第1个数不再小于第2个数),将小数放前,大数放后,一直比较到倒数第二个数(倒数第一的位置上已经是最大的),第二趟结束,在倒数第二的位置上得到一个新的最大数(其实在整个数列中是第二大的数)。如此下去,重复以上过程,直至最终完成排序。 由于在排序过程中总是小数往前放,大数往后放,相当于气泡往上升,所以称作冒泡排序。编写程序,对输入的十个数按照从小到大排序#includeint main() int i,j,a10,z; for(i=0; i10; i+) scanf(%d,&ai); for(j=0; j9; j+) for(i=0; iai+1) z=ai+1; ai+1=ai; ai=z; for(j=0; j10; j+) printf( %d,aj); printf(n); return 0;【设计型】6.4 插入法排序如果一个数组中保存的元素是有序的(由小到大),向这个数组中插入一个数,使得插入后的数组元素依然保持有序。 定义一个数组,长度为11,初始元素为10个,按照从小到大的方式输入,然后输入一个要插入的元素,使得插入后仍然有序。#includeint main() int a11,i,j,t; for(i=0; i10; i+) scanf(%d,&ai); scanf(%d,&a10); for(i=0; ia10) t=a10; for(j=10; ji; j-) aj=aj-1; ai=t; break; for(i=0; i11; i+) printf( %d,ai); printf(n); return 0;【设计型】6.5 求各位数字组成的最大数任意输入一个自然数,输出该自然数的各位数字组成的最大数。例如,输入 1593 ,则输出为 9531 。输入: 自然数 n 输出: 各位数字组成的最大数 #includeint main() int a12,num,i,j,k,m,t; scanf(%d,&num); for(i=0;i+) k=num%10; num=num/10;(分离各个位数) ai=k; if(num=0) break; for(m=0; mi; m+) for(j=0; jaj+1) t=aj+1; aj+1=aj; aj=t; for(j=i;j=0;j-) printf(%d,aj); printf(n); return 0;【设计型】6.6 数组逆序输出问题描述从键盘上输入一个数组(10个元素),将原数组逆序重新排列后输出。要求输出每个元素时以一个空格隔开。提示:用第一个与最后一个交换。#includeint main() int a10,i,t; for(i=0;i=9;i+) scanf(%d,&ai); for(i=0;i5;i+)(第一个与最后一个调换) t=ai; ai=a9-i; a9-i=t; for(i=0;i=9;i+) printf(%d ,ai); printf(n); return 0;【设计型】6.7 求最大值问题描述要求从键盘输入10个整型数据,找出其中的最大值并显示出来。输入范例3 0 54 -710 27 32767 10 1 500 2输出范例32767提示先假定第一个元素时最大值,然后和其他的元素一个一个的进行比较,直到找到最大值。#include#define n 10int main() int an,i,max; for(i=0; i10; i+) scanf(%d,&ai); max=a0; for(i=1; imax) max=ai; printf(%d,max); printf(n); return 0;【设计型】6.8 二维数组程序定义了 4 4 的二维数组,请编写程序,给二维数组赋值,并使数组下半三角元素中的值乘以n 。 例如:数组中的值为 假设n为10,则输出结果如下:(输出的数按照4位宽度来输出,即%4d)#includeint main() int a44,i,j,n,count=0; for(i=0; i=3; i+) for(j=0; j=3; j+) scanf(%d,&aij); scanf(%d,&n); for(j=0; j=3; j+) for(i=j; i=3;i+) aij=n*aij; for(i=0; i=3; i+) for(j=0; j=3; j+) count+; printf(%4d,aij); if(count%4=0) printf(n); return 0;【设计型】6.9 在屏幕上显示杨辉三角形杨辉三角形,又称贾宪三角形,帕斯卡三角形,是二项式系数在三角形中的一种几何排列。其实,中国古代数学家在数学的许多重要领域中处于遥遥领先的地位。中国古代数学史曾经有自己光辉灿烂的篇章,而贾宪三角的发现就是十分精彩的一页。杨辉三角有如下性质:1、每行数字左右对称,由1开始逐渐变大,然后变小,回到1。 2、第n行的数字个数为n个。 3、每个数字等于上一行的左右两个数字之和。编写程序,输入正数n, 将所有数据存储到二维数组中,并在屏幕上显示对应的杨辉三角形(注意数据之间的空格)。例如:n=5 图形如下:11 11 2 11 3 3 11 4 6 4 11 5 10 10 5 1#includeint main() int i,j,n; int a1010; scanf(%d,&n); n=n+1; for(i=0; in; i+) ai0=1; aii=1; for(i=2; in; i+) for(j=1; ji; j+) aij=ai-1j-1+ai-1j; for(i=0; in; i+) for(j=0; j=i; j+) printf(%3d,aij); printf(n); return 0;【设计型】6.10 求二维数组周边元素之和编写一个程序,求出45的二维数组周边元素之和。输入:二维数组元素输出:周边元素之和 如:输入:1 3 5 7 9 2 9 9 9 4 6 9 9 9 8 1 3 5 7 0 输出:61#includeint main() int a45,i,j,sum1=0,sum2=0,sum; for(i=0;i4;i+) for(j=0;j5;j+) scanf(%d,&aij); for(j=0;j5;j+) sum1=sum1+a0j+a3j; for(i=0;i4;i+) sum2=sum2+ai0+ai4; sum=sum1+sum2-a00-a04-a34-a30; printf(%dn,sum); return 0;【设计型】6.11 存储并输出一个矩阵编程,输入 n ,存储并输出如下例( n=5 )所示的 图形。 1 2 3 4 5 1 1 2 3 4 1 1 1 2 3 1 1 1 1 2 1 1 1 1 1 #includeint main() int a55,i,j,n,count=0; scanf(%d,&n); for(i=0; in; i+) for(j=0; j=i; j+) aij=1; for(i=0; in-1; i+) for(j=i+1; jn ; j+) aij=aij-1+1; for(i=0; in; i+) for(j=0; jn; j+) printf( %d,aij); count+; if(count%n=0) printf(n); return 0;【设计型】6.12 给数组中的元素按顺序编号对数组 a10 中的十个整数从小到大进行连续编号,输出各个元素的编号。要求不能改变数组 a 中元素的顺序,且相同的整数要具有相同的编号。例如数组是: A=(5,3,4,7,3,5,6,8,9,10) 则输出为: (4,1,3,7,1,4,6,8,9,10) #include int main() int a11,c11; int i,j,t,m; for(i=1;i11;i+) scanf(%d,&ai); ci=ai; for(j=1;j=10;j+) for(i=1;i=ai+1) t=ai; ai=ai+1; ai+1=t; for(m=1;m11;m+) for(i=1;i11;i+) if(cm=ai) printf(%3d,i); break; printf(n); return 0; 【设计型】8.1 字符转换描述提取一个字符串中的所有数字字符(0.9)将其转换为一个整数输出。输入一个以回车符为结束标志的字符串(少于80个字符)。输出把字符串中的所有数字字符(0.9)转换为一个整数并输出。#include#includeint main() char word20; int i,n; scanf(%s,word); n=strlen(word); for(i=0; i=0&wordi=9) printf(%c,wordi); printf(n); return 0;【设计型】8.2 合并字符串输入两个已经按从小到大顺序排列好的字符串,编写一个合并两个字符串的函数,使合并后的字符串,仍然是从小到 大排列。输入:两个已经排好顺序(升序)的字符串输出:一个合并在一起的有序(升序)的字符串要求:设计一个效率尽量高的算法,对每个字符串只扫描一遍就可以了。如果采用先进行串连接,然后再进行排序的算法,则效率太低了。#include#includeint main() char a100,b100; char n200,t; int i,j,k,m; gets(a); gets(b); for(i=0;ai!=0;i+) ni=ai; for(j=0;bj!=0;j+,i+) ni=bj; ni=0; for(k=0;ki;k+) for(m=k+1;mnm) t=nk; nk=nm; nm=t; printf(%sn,n); return 0;【设计型】8.3 删除重复字符背景: 输入一个长度不超过 100 的字符串,删除串中的重复字符。输入:输入要检查的字符串,长度不超过100个字符。例如:abacaeedabcdcd。输出:删除重复字符后的字符串。例如:abced。 #include#includeint main() char str1100,str2100; int i,j,n,k=0,tag=0; scanf(%s,str1); str20=str10; printf(%c,str20); n=strlen(str1); for(i=0; in; i+) for(j=0; jk+1; j+) if(str1i=str2j) tag=0; break; tag=1; if(tag=1) str2k+1=str1i; printf(%c,str2k+1); k+; printf(n); return 0;【设计型】8.4 删除字符串中指定字符输入两个字符串 s1 和 s2 ,在 s1 中删除任何 s2 中有的字符。例如, s1 :“ abc123ad ”, s2 :“ a1 ” ,则输出“bc23d ”。输入: 两个字符串 s1 和 s2 输出: 删除后的字符串 s1 #include#includeint main() char str1100,str2100; int i,j,n1,n2,tag=0; scanf(%s%s,str1,str2); n1=strlen(str1); n2=strlen(str2); for(i=0; in1; i+) for(j=0; jn2; j+) if(str1i=str2j) tag=0; break; tag=1; if(tag=1) printf(%c,str1i); printf(n); return 0;【设计型】8.5 单词有多少用空格或换行分开的字符串称为单词。输入多行字符串,直到遇到了单词 stop 时才停止。最后输出单词的数量。用于分割单词的空格或换行可能多于1个。输入: 多个字符串 输出: 单词的数量#include#includeint main() char str1020,str2=s,t,o,p,0; int i,num=0; for(i=0;i+) scanf(%s,stri); if(strcmp(stri,str2)=0) break; num+; printf(%dn,num); return 0;【设计型】8.6 在指定位置插入字符串输入两个字符串 s1 、 s2 和 s1 中任意字符 k ,在 s1 中的指定字符 k 第一次出现的位置处插入字符串 s2 并输出。输入: 两个字符串 s1 、 s2 和 s1 中任意字符 k 输出: 插入后的字符串 s1 #include#includeint main() char str115,str215,t; int i,n,num=0; gets(str1); gets(str2); t=getchar(); n=strlen(str1); for(i=0; in; i+) if(str1i=t) break; num+; for(i=0; inum; i+) printf(%c,str1i); printf(%s,str2); for(i=num; in; i+) printf(%c,str1i); printf(n); return 0;【研究创新性】8.7 Your Ride Is HereIt is a well-known fact that behind every good comet is a UFO. These UFOs often come to collect loyal supporters from here on Earth. Unfortunately, they only have room to pick up one group of followers on each trip. They do, however, let the groups know ahead of time which will be picked up for each comet by a clever scheme: they pick a name for the comet which, along with the name of the group, can be used to determine if it is a particular groups turn to go (who do you think names the comets?). The details of the matching scheme are given below; your job is to write a program which takes the names of a group and a comet and then determines whether the group should go with the UFO behind that comet.Both the name of the group and the name of the comet are converted into a number in the following manner: the final number is just the product of all the letters in the name, where A is 1 and Z is 26. For instance, the group USACO would be 21 * 19 * 1 * 3 * 15 = 17955. If the groups number mod 47 is the same as the comets number mod 47, then you need to tell the group to get ready! (Remember that a mod b is the remainder left over after dividing a by b; 34 mod 10 is 4.)Write a program which reads in the name of the comet and the name of the group and figures out whether according to the above scheme the names are a match, printing GO if they match and STAY if not. The names of the groups and the comets will be a string of capital letters with no spaces or punctuation, up to 6 characters long.#include#includeint main() char comet10,group10; int i,n1,n2,sum1=1,sum2=1; int yu1,yu2; scanf(%s%s,comet,group); n1=strlen(comet); n2=strlen(group); for(i=0;in1;i+) sum1=sum1*(cometi-A+1); for(i=0;in2;i+) sum2=sum2*(groupi-A+1); yu1=sum1%47; yu2=sum2%47; if(yu2=yu1) printf(GOn); else printf(STAYn); return 0;【研究创新型】8.8 大数相加问题描述:编写C程序,它能以字符串形式读入两个无符号正整数m和n,计算并输出这两个整数之和输入格式:输入由两行组成,第一行为无符号整数m,第二行为无符号整数n,且m和n的值最长25位输出格式:输出为
展开阅读全文
相关资源
相关搜索

当前位置:首页 > 图纸专区 > 考试试卷


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!