《C语言程序设计案例教程-基于数据处理》习题库及答案_第1页
《C语言程序设计案例教程-基于数据处理》习题库及答案_第2页
《C语言程序设计案例教程-基于数据处理》习题库及答案_第3页
《C语言程序设计案例教程-基于数据处理》习题库及答案_第4页
《C语言程序设计案例教程-基于数据处理》习题库及答案_第5页
已阅读5页,还剩184页未读 继续免费阅读

下载本文档

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

文档简介

《C语言程序设计案例教程(基于数据处理)》习题库及答案C语言程序设计案例教程(基于数据处理)目录TOC\o"1-1"\h\u18567第1章C语言概述及程序设计基础 121704第2章简单的数值运算程序设计 52669第3章逻辑运算与选择结构程序设计 812594第4章重复运算与循环结构程序设计 158437第5章数组与批量数据处理 3113290第6章指针与字符串数据处理 5526882第7章函数与程序结构优化 74451第8章结构体与复杂数据处理 9518838第9章链表与非连续存储数据处理 11219788第10章文件与大批量数据处理 180第1章C语言概述及程序设计基础习题一(参考答案)1.一个C程序是从main()函数开始执行的。2.一个C源程序中的基本单位是语句。3.一个C语言程序是由_由一个主函数和若干个子函数组成_组成。4.结构化程序设计中的三种基本结构是顺序结构、分支结构___、_循环结构___。5.C语言的主要特点是什么?①C语言是一种结构化语言。②C语言功能强大,程序运行效率高,。③C语言数据结构丰富,能实现各种复杂的数据类型的运算。④C语言运算符丰富,从而使C的表达式类型多样化。⑤C语言简洁、紧凑,使用方便、灵活。⑥C语法限制不太严格、程序设计自由度大。⑦C语言程序生成代码质量高,程序执行效率高。⑧C语言可移植性强。⑨C语言允许直接访问物理地址,能进行位(bit)操作。6.下列符号串中那些是不正确的标识符表示,并说明理由。_abc12.e+2E+2breakFORabc$200sum_squarestopy_@_1不正确的标识符有:12.e+2数字开头E+2含有非法字符(+)break不得使用关键字abc$200含有非法字符($)y_@_1含有非法字符(@)7.下面程序运行结果是5。#include<stdio.h>#defineDOUBLE(r)r*rvoidmain(){intx=1,y=2,t;t=DOUBLE(x+y);printf(“%d\n”,t);}8.下面的运行结果是12。#include<stdio.h>#defineMUL(z)(z)*(z)voidmain(){printf(“%d\n”,MUL(1+2)+3);}9.下面程序的运行结果是2。#include<stdio.h>#defineSELECT(a,b)a<b?a:bvoidmain(){intm=2,n=4;printf(“%d\n”,SELECT(m,n));}10.编写一个C程序,输出以下信息:******************************Thisismyfirstcprogram.******************************程序:#define_CRT_SECURE_NO_WARNINGS#include<stdio.h>voidmain(){printf("******************************\n");printf("Thisismyfirstcprogram.\n");printf("******************************\n");}11.编写程序,从键盘输入三个整数a、b、c,计算表达式a+b*c的值,输出计算结果。程序:#define_CRT_SECURE_NO_WARNINGS#include<stdio.h>voidmain(){ inta,b,c,s; scanf("%d%d%d",&a,&b,&c); s=a+b*c; printf("s=%d\n",s);}用流程图画出判断一个数n(n>0)是否为素数的算法。13.用N-S图画出判断一个数n(n>0)是否为素数的算法。14.用流程图画出例1.3登录密码的判断算法。

第2章简单的数值运算程序设计习题二(参考答案)1.下面不合法的用户标识符是_int,b-a,long,A@123____。int,fat,b-a,_123,p_o,hao,temp,long,_A,A@1232.下面不合法的整型常数是_0x,01a,3.4E2_____。160,-01,0668,011,0x,01a,-0xfffa,3.4E23.下面不合法的浮点数是__e3,2e4.5,.e5。160.,e3,123,2e4.5,.e5,2e34.下面合法的字符常量是___'\\','W','\011'。"c",'\\','W','\011','\xab'5.下面不正确的八进制数或十六进制数是_0abc,o10,0a123____。016,0abc,o10,0a123,0xa1236.在C语言中要求操作对象必须是整型的运算符是___%__。7.若有代数式3ae/bc,则用C语言表达式表示为__(3*a*c)/(b*c)____。8.若inta,b;unsignedintw=5;执行:(1)w+=-2;语句后w值为__3。(2)a+=a-=(b=4)*(a=3);语句后a=_-18,b=__4。9.若inta=1,b=4,k;doublex=14.42,y=5.2;执行:(1)a-=a*=a+3;语句后a=___0__。(2)k=(int)x%3;语句后k=_2__。(3)y*=(float)b;语句后y=__20.8。10.若inta=7;floatx=2.5,y=4.7;doublet;则执行t=x+a%3*(int)(x+y)%2/4.0;后t=_2.75。11.给出下面语句的输出结果。65,101,41,65chara=65;printf("%d,%o,%x,%u\n",a,a,a,a);12.假设m是一个三位数,从左到右用a、b、c表示各位的数字,用C语言表达式表示a=_m/100,b=_(m%100)/10_,c=__m%10。13.编写程序计算球的体积(),要求从键盘输入半径值,π的值定义为符号常量#definePI3.14159,输出结果保留两位小数,输入输出前都要给出明确的提示信息。程序如下:#define_CRT_SECURE_NO_WARNINGS#include<stdio.h>#definePI3.14159intmain(){ doubler,v; printf("inputradiusr="); scanf("%lf",&r); v=4.0/3*PI*r*r*r; printf("球的体积=%10.2f\n",v); return0;}14.编程:输入一个四位数,将其各位数字倒过来重新构成一个新的四位数再输出。程序如下:#define_CRT_SECURE_NO_WARNINGS#include<stdio.h>intmain(){ intm,n; inta,b,c,d; printf("输入一个4位数m="); scanf("%d",&m); a=m/1000; b=(m%1000)/100; c=(m%100)/10; d=m%10; n=d*1000+c*100+b*10+a; printf("倒过来的数为n=%d\n",n); return0;}15.求二元一次方程:3x+4y=m程序如下:#define_CRT_SECURE_NO_WARNINGS#include<stdio.h>intmain(){ floatm,n; floatx,y; printf("输入m、n2个实数(空格分隔):"); scanf("%f%f",&m,&n); x=(5*m+4*n)/23; y=(2*m-3*n)/23; printf("方程的根x=%f,y=%f\n",x,y); return0;}16.已知梯形的上底边长为a,下底边长为b,高为h,编程求梯形的面积。程序如下:#define_CRT_SECURE_NO_WARNINGS#include<stdio.h>intmain(){ floata,b,h; floats; printf("输入梯形的上下底和高(空格分隔):"); scanf("%f%f%f",&a,&b,&h); s=(a+b)*h/2; printf("梯形的面积s=%f\n",s); return0;}

第3章逻辑运算与选择结构程序设计习题三(参考答案)1.当a,b,c的值分别为3,4,5时,以下各语句执行后a,b,c的值为多少?(1)f(a>c){a=b;b=c;c=a;}else{a=c;c=b;b=a;}执行后a,b,c的值为_5,5,4__(2)if(a<c)a=c;elsea=b;c=b;b=a;执行后a,b,c的值为__5,5,4(3)if(a!=c)a=c;elsea=c;c=b;b=a;执行后a,b,c的值为__5,5,4___2.当a=3,b=4,c=5时,写出下列各式的值。a<b的值为1,a<=b的值为1,a==c的值为0,a!=c的值为1,a&&b的值为_1,!a&&b的值为0,a||c的值为1,!a||c的值为1,a+b>c&&b==c的值为0。3.以下程序的运行结果是()。intmain(){ inta=-5,b=1,c=1; intx=0,y=2,z=1; if(c>0)x=x+y; if(a<=0) { if(b>0) if(c<=0)y=x-y; } elseif(c>0)y=x-y; elsez=y; printf("%d,%d,%d\n",x,y,z);}运行结果为2,2,14.编程判断输入的正整数是否既是5又是7的倍数。若是,则输出yes;否则输出no。程序如下:#define_CRT_SECURE_NO_WARNINGS#include<stdio.h>intmain(){ intn; printf("输入一个正整数:"); scanf("%d",&n); if(n%5==0&&n%7==0) printf("yes\n"); else printf("No\n");}5.输入一个字符,判断它如果是小写字母输出其对应大写字母;如果是大写字母输出其对应小写字母;如果是数字输出数字本身;如果是空格,输出“space”;如果不是上述情况,输出“other”。程序如下:#define_CRT_SECURE_NO_WARNINGS#include<stdio.h>intmain(){ charch; printf("输入一个字符:"); scanf("%c",&ch); if(ch>='a'&&ch<='z') printf("%c\n",ch-32); else if(ch>='A'&&ch<='Z') printf("%c\n",ch+32); else if(ch>='0'&&ch<='9') printf("%c\n",ch); else if(ch=='') printf("space\n"); else printf("other\n"); return0;}6.编程判断输入的正整数是否能同时被3、5、7整除。若是,则输出yes;否则输出no。程序如下:#define_CRT_SECURE_NO_WARNINGS#include<stdio.h>intmain(){ intn; printf("输入一个正整数:"); scanf("%d",&n); if(n%3==0&&n%5==0&&n%7==0) printf("yes\n"); else printf("No\n");}7.根据以下关系,对输入的每个x值,编程计算出相应的y值。Xyx<=000<x<=10X2+2x-110<x<=20X3-2x2+3x-1020<x<40-0.5x+160x+20程序如下:#define_CRT_SECURE_NO_WARNINGS#include<stdio.h>#include<math.h>intmain(){ floatx,y; printf("输入一个实数:"); scanf("%f",&x); if(x<=0) y=0; else if(x<=10) y=x*x+2*x-1; else if(x<=20) y=x*x*x-2*x*x+3*x-10; else if(x<40) y=-0.5*sqrt(x+160)*x+20; printf("y=%f\n",y); return0;}8.编程实现:输入一个整数,判断它能否被3,5,7整除,并输出以下信息之一:(1)能同时被3,5,7整除;(2)能被其中两个数(要指出哪两个)整除;(3)只能被其中一个数(要指出哪一个)整除;(4)不能被3,5,7任何一个数整除。程序如下:#define_CRT_SECURE_NO_WARNINGS#include<stdio.h>#include<math.h>intmain(){ intx; printf("输入一个整数:"); scanf("%d",&x); if(x%3==0&&x%5==0&&x%7==0) printf("%d能同时被3、5|7整除\n",x); if(x%3==0&&x%5==0&&x%7!=0) printf("%d能同时被3、5整除\n",x); if(x%3==0&&x%5!=0&&x%7==0) printf("%d能同时被3、7整除\n",x); if(x%3!=0&&x%5==0&&x%7==0) printf("%d能同时被5、7整除\n",x); if(x%3==0&&x%5!=0&&x%7!=0) printf("%d只能被3整除\n",x); if(x%3!=0&&x%5==0&&x%7!=0) printf("%d只能被5整除\n",x); if(x%3!=0&&x%5!=0&&x%7==0) printf("%d只能被7整除\n",x); if(x%3!=0&&x%5!=0&&x%7!=0) printf("%d不能被3、5、7中任何一个数整除\n",x); return0;}9.下面这个程序要求用户输入两个整数和一个字符。字符必须是'+'、'-'、'*'、'/'其中的一个。然后程序输出两数作相应运算的结果。例如:输入123,34,+程序输出123+34=157。程序如下:#define_CRT_SECURE_NO_WARNINGS#include<stdio.h>intmain(){ inta,b; charch; printf("输入两个整数和一个字符:"); scanf("%d%d%c",&a,&b,&ch); if(ch=='+') printf("%d+%d=%d\n",a,b,a+b); elseif(ch=='-') printf("%d+%d=%d\n",a,b,a-b); elseif(ch=='*') printf("%d+%d=%d\n",a,b,a*b); elseif(ch=='/') printf("%d+%d=%f\n",a,b,(a*1.0)/b); else printf("输入出错!\n"); return0;}10.输入一个4位整数,将其按其4位的反序构成一个新的四位整数再输出,程序要求对输入和输出的数均要进行判断它能否构成一个4位数。如:输入输出1234432123476输入的数不是一个4位数2380新的数不能构成一个4位数程序如下:#define_CRT_SECURE_NO_WARNINGS#include<stdio.h>intmain(){ inta,b,a1,a2,a3,a4; printf("输入一个4位整数:"); scanf("%d",&a); if(a>=1000&&a<10000) { a1=a/1000; a2=(a%1000)/100; a3=(a%100)/10; a4=a%10; b=a4*1000+a3*100+a2*10+a1; if(b>=1000&&b<10000) printf("%d各位颠倒后仍然能构成一个新4位数%d\n",a,b); else printf("%d各位颠倒后不能构成一个新的4位数\n",a); } else printf("%d不是一个4位数\n",a); return0;}11.输入4个整数,要求求出其中最大的数,并且给出最大的数在原序列中的位置。如输入:4575943396输出:最大数943,位置3程序如下:#define_CRT_SECURE_NO_WARNINGS#include<stdio.h>intmain(){ inta,b,c,d,max1,pos1,max2,pos2,max,pos; printf("输入4个整数:"); scanf("%d%d%d%d",&a,&b,&c,&d); if(a>b) { max1=a;pos1=1; } else { max1=b;pos1=2; } if(c>d) { max2=c;pos2=3; } else { max2=d;pos2=4; } if(max1>max2) { max=max1;pos=pos1; } else { max=max2;pos=pos2; } printf("最大数为%d,其位于原数中的第%d个位置。\n",max,pos); return0;}12.读入1到7之间的某个数,输出表示一星期中相应的某一天的单词:Monday、Tuesday等等(其中7对应Sunday),要求用switch语句进行编程。程序如下:#define_CRT_SECURE_NO_WARNINGS#include<stdio.h>intmain(){ inta; printf("输入整数(1-7):"); scanf("%d",&a); if(a>=1&&a<=7) { switch(a) { case1:printf("Monday\n");break; case2:printf("Tuesday\n");break; case3:printf("Wednesday\n");break; case4:printf("Thursday\n");break; case5:printf("Friday\n");break; case6:printf("Saturday\n");break; case7:printf("Sunday\n");break; } } else printf("输入出错!\n"); return0;}

第4章重复运算与循环结构程序设计习题四(参考答案)1.比较while语句、do–while语句和for语句的异同。相同点:均能执行多次循环操作;循环体内均可使用continue和break语句;只有处理得当,三者之间可以替换。不同点:语法格式均不相同;do-while循环语句体至少要执行一次,而while和for循环语句体可能一次都不执行。2.break语句可以用于循环类语句和switch语句中。3.准备客票:某铁路线上共10个车站,问需要准备几种车票?填空充下列程序。#include"stdio.h"intmain(){inti,j,station,total=0;printf("输入车站数:");scanf("%d",&station);for(i=1;i<(1);i++)for(j=(2);j<=station;j++) total=(3);printf("车票种类=%d\n",total);}填充:i<stationi+1total+14.编写程序,求s=1+(1+2)+…+(1+2+3+…+n)的值,其中n由键盘输入。程序如下:#define_CRT_SECURE_NO_WARNINGS#include<stdio.h>intmain(){ intn,i,s,t; printf("输入正整数n="); scanf("%d",&n); s=t=0; for(i=1;i<=n;i++) { s=s+i; t=t+s; } printf("求和结果为%d\n",t); return0;}5.编写程序,输入一行字符(以$结束),统计其中的数字字符、空格字符、英文字符出现的次数。程序如下:#define_CRT_SECURE_NO_WARNINGS#include<stdio.h>intmain(){ intdigit,space,en; charch; digit=space=en=0; printf("输入一行字符(以$结束):\n"); do { scanf("%c",&ch); if(ch>='0'&&ch<='9') digit++; else if(ch>='A'&&ch<='Z'||ch>='a'&&ch<='z') en++; else if(ch=='') space++; }while(ch!='$'); printf("数字个数=%d,空格个数=%d,英文字母个数=%d\n",digit,space,en); return0;}6.编写程序,求1000以内的奇数之和及偶数之和。程序如下:#define_CRT_SECURE_NO_WARNINGS#include<stdio.h>intmain(){ intodd,even,i; odd=even=0; for(i=1;i<=1000;i++) { if(i%2==0) even+=i; else odd+=i; } printf("奇数之和=%d,偶数之和=%d\n",odd,even); return0;}7.编写程序,求任意两个整数之间的所有能同时被3、4、5整除的数的个数。程序如下:#define_CRT_SECURE_NO_WARNINGS#include<stdio.h>intmain(){ intm,n,t,i,count=0; printf("输入2个整数m,n:"); scanf("%d%d",&m,&n); if(m>n) { t=m;m=n;n=t; } for(i=m;i<=n;i++) { if(i%3==0&&i%4==0&&i%5==0) count++; } printf("%d到%d之间能同时被3、4、5整除的数的个数为%d\n",m,n,count); return0;}8.编写程序,求1!+2!+…+n!小于100000的最大值n。程序如下:#define_CRT_SECURE_NO_WARNINGS#include<stdio.h>intmain(){ inti,s,t; s=0;t=1; for(i=1;i<100;i++) { t=t*i; printf("%d\n",t); s=s+t; if(s>100000)break; } printf("1!+2!+…+n!小于100000的最大值n=%d,其值为s=%d\n",i-1,s); return0;}9.某门课程有n个同学参加考试,编写程序计算这门课程的最高分、最低分及平均分。程序如下:#define_CRT_SECURE_NO_WARNINGS#include<stdio.h>intmain(){ intn,i; doublemark,max,min,sum,avg; printf("输入学生人数n="); scanf("%d",&n); if(n<1) printf("少于1人不计算\n"); else { printf("输入%d个学生的成绩:\n",n); scanf("%lf",&mark); sum=max=min=mark; for(i=2;i<=n;i++) { scanf("%lf",&mark); sum=sum+mark; if(mark>max) max=mark; if(mark<min) min=mark; } avg=sum/n; printf("最高分=%f,最低分=%f,平均分=%f\n",max,min,avg); } return0;}10.编写程序,求分数序列s=−12+3程序如下:#define_CRT_SECURE_NO_WARNINGS#include<stdio.h>intmain(){ longlongintfz,fm; intflag,i; charch; doublesum=0; flag=-1; fz=1; fm=2; sum=(fz*1.0)/fm; for(i=2;i<=60 ;i++) { if(i%2==0) { ch='+'; flag=-1*flag; fz=fz+fm; sum=sum+flag*(fz*1.0)/fm; } else { ch='-'; flag=-1*flag; fm=fm+fz; sum=sum+flag*(fz*1.0)/fm; } printf("第%d项分数%c%lld/%lld,前面%d项的和=%f\n",i,ch,fz,fm,i,sum); } printf("\n第%d项分子=%lld,分母=/%lld\n",i-1,fz,fm); printf("前%d项的和为:%f\n",i-1,sum); return0;}说明:由于分子分母的值已经超出了longint的范围,所以使用了longlongint类型,它的输出格式为%lld.(此方法最多可以计算到第90项,到第90项以后就出错了。)11.用泰勒展开式求sin(y)(y为角度,x为其对应的弧度,且x=y*PI/180)的近似值,要求精度达到小于10-6。sinx=程序如下:#define_CRT_SECURE_NO_WARNINGS#definePI3.14159265#include<stdio.h>#include<math.h>intmain(){ doublesin1,sin2,y,x,phd,jc; intflag,i,j; flag=1; printf("输入角度(度):"); scanf("%lf",&y); x=y*PI/180; sin1=x; for(i=3;1;i=i+2) { flag=-1*flag; jc=1; phd=1; for(j=1;j<=i;j++) { phd=phd*x; jc=jc*j; } sin2=sin1+flag*phd/jc; if(fabs(sin2-sin1)<1e-6) break; sin1=sin2; } printf("\nsin(%f)=%f\n",y,sin2); return0;}12.两位数13和62具有很有趣的性质:把它们个位数字和十位数字对调,其乘积不变,即13*62=31*26。编程序求共有多少对这种性质的两位数(个位与十位相同的不在此列,如11、22,重复出现的不在此列,如13*62与62*13)程序如下:#define_CRT_SECURE_NO_WARNINGS#include<stdio.h>intmain(){ inti,j,a1,b1,a2,b2,count; count=0; for(i=11;i<100;i++) { a1=i/10;b1=i%10; if(a1!=b1&&b1!=0) { for(j=i+1;j<100;j++) { a2=j/10;b2=j%10; if(a2!=b2&&b2!=0) { if(i*j==(b1*10+a1)*(b2*10+a2)) { printf("满足条件的不同数对(%d,%d)\n",i,j); count++; } } } } } printf("共计有%d个不同的数对\n",count); return0;}13.已知四位数3025有一个特殊性质:它的前两位数字30和后两位数字25的和是55,而55的平方刚好等于该数(55*55=3025),试编一程序打印所有具有这种性质的四位数。程序如下:#define_CRT_SECURE_NO_WARNINGS#include<stdio.h>intmain(){ inti,a,b,count; count=0; for(i=1000;i<10000;i++) { a=i/100;b=i%100; if(i==(a+b)*(a+b)) { printf("%d\n",i); count++; } } printf("共计有%d个满足条件的数\n",count); return0;}14.分数约分:输入一个分式,输出最简形式。如48/96=1/2。程序如下:#define_CRT_SECURE_NO_WARNINGS#include<stdio.h>intmain(){ intx,y,min,gcd,i; printf("输入分数的分子与分母:"); scanf("%d%d",&x,&y); min=x>y?y:x; for(i=min;i>1;i--) if(x%i==0&&y%i==0) break; gcd=i; printf("%d/%d=%d/%d\n",x,y,x/gcd,y/gcd); return0;}15.编写程序,求满足下式的数字A,B,C的值。ABC+BCC234程序如下:#define_CRT_SECURE_NO_WARNINGS#include<stdio.h>intmain(){ inta,b,c; for(a=1;a<10;a++) for(b=1;b<10;b++) for(c=0;c<10;c++) if(a*100+b*10+c+b*100+c*10+c==234) { printf("%d,%d,%d\n",a,b,c); } return0;}16.猴子吃桃问题.猴子第一天摘下若干个桃子,当即吃了一半,不过瘾,还多吃了一个。以后每天如此,至第十天,只剩下一个桃子。编写程序计算第一天猴子摘得桃子个数。程序如下:#define_CRT_SECURE_NO_WARNINGS#include<stdio.h>intmain(){intdays=10;//假设是第10天早上剩下一个桃子intpeaches=1;//第N天早上剩下的桃子数//从第N天开始逆向推算到第一天for(inti=days;i>1;i--){peaches=(peaches+1)*2;//逆向计算前一天的桃子数}printf("猴子第一天共摘了%d个桃子。\n",peaches);return0;}17.百钱百鸡问题。百元买百鸡,公鸡8元钱1只,母鸡6元钱1只,鸡仔2元钱4只。编写程序,计算百元所买的公鸡、母鸡、鸡仔数。程序如下:#define_CRT_SECURE_NO_WARNINGS#include<stdio.h>intmain(){intx,y,z;for(x=1;x<=12;x++)for(y=1;y<=16;y++)for(z=1;z<=200;z++)if(x*8+y*6+z*0.5==100&&x+y+z==100&&z%2==0)printf("公鸡=%d,母鸡=%d,鸡仔=%d\n",x,y,z);return0;}18.将十元钱兑换成一元,五角,一角的硬币,共计40枚,计算有多少种兑换方法。程序如下:#define_CRT_SECURE_NO_WARNINGS#include<stdio.h>intmain(){intx,y,z,count;count=0;for(x=0;x<=10;x++)for(y=0;y<=20;y++)for(z=0;z<=100;z++)if(x*1+y*0.5+z*0.1==10&&x+y+z==40){printf("一元枚数=%d,伍角枚数=%d,一角枚数=%d\n",x,y,z);count++;}printf("共计有%d种兑换方案",count);return0;}19.谁是窃贼:公安人员审问四名窃贼嫌疑犯。已知,这四人当中仅有一名是窃贼,还知道这四人中每人要么是诚实的,要么总是说谎的。在回答公安人员的问题中:

甲说:“乙没有偷,是丁偷的。”

乙说:“我没有偷,是丙偷的。”

丙说:“甲没有偷,是乙偷的。”

丁说:“我没有偷。”

请根据这四人的答话判断谁是盗窃者。问题分析:由问题描述可知,甲、乙、丙、丁4人中仅有一名窃贼,且这4个人中每个人要么是诚实的,要么总是说谎。分析甲、乙、丙3人所说的话可以发现,他们每人都说了两句话,即:“X没有偷,是Y偷的(其中,X、Y指代甲、乙、丙、丁中的某一个)”,因此,不论这3人是否说谎,他们所提到的这两个人中必有一个是窃贼。而丁只说了他自己没有偷,所以无法判断其真假。假设用变量A、B、C、D分别代表4个人,变量的值为1代表该人是窃贼,则根据4个人的说法可列出下面的4个条件:甲说:“乙没有偷,是丁偷的。”——B+D=1乙说:“我没有偷,是丙偷的。”——B+C=1丙说:“甲没有偷,是乙偷的。”——A+B=1丁说:“我没有偷。”

——A+B+C+D=1程序如下:#define_CRT_SECURE_NO_WARNINGS#include<stdio.h>intmain(){//甲乙丙丁是否为窃贼,1表示为窃贼intj=0,y=0,b=0,d=0;for(j=0;j<=1;j++)for(y=0;y<=1;y++)for(b=0;b<=1;b++)for(d=0;d<=1;d++)if(y+d==1&&y+b==1&&j+y==1&&j+y+b+d==1){if(j)printf("甲是窃贼\n");elseif(y)printf("乙是窃贼\n");elseif(b)printf("丙是窃贼\n");elseprintf("丁是窃贼\n");}return0;}20.阶梯问题。有一阶梯,若每步跨2阶,最后余1阶;若每步跨3阶,最后余2阶;若每步跨5阶,最后余4阶;若每步跨6阶,最后余5阶;若每步跨7阶,刚好到达阶梯顶部。编写程序,求最后的阶梯数。程序如下:#define_CRT_SECURE_NO_WARNINGS#include<stdio.h>intmain(){ intnum=0; while(1)//while(1)代表的是无限循环 { if(num%2==1&&num%3==2&&num%5==4&&num%6==5&&num%7==0) break; num++; } printf("最小且符合这些条件的阶梯数为%d\n",num); return0;}21.编写程序,用牛顿迭代法求x。设r是f(x)=0的根,选取x0作为r初始近似值,过点(x0,f(x0))做曲线y=f(x)的切线L,L的方程为y=f(x0)+f'(x0)(x-x0),求出L与x轴交点的横坐标x1=x0-f(x0)/f'(x0),称x1为r的一次近似值。过点(x1,f(x1))做曲线y=f(x)的切线,并求该切线与x轴交点的横坐标x2=x1-f(x1)/f'(x1),称x2为r的二次近似值。重复以上过程,得r的近似值序列,其中xn+1=xn-f(xn)/f'(xn),称为r的n+1次近似值,上式称为牛顿迭代公式。方法:为求x的值,实际上就是求下列方程的解:f(x)=x2-p导数f'(x)=2*x代入xn+1=xn-f(xn)/f'(xn)可以得到以下的迭代公式:xn+1=[xn+p/xn]/2判断xn+1-xn的差值是否接近于0即可。程序如下:#define_CRT_SECURE_NO_WARNINGS#include<stdio.h>#include<math.h>intmain(){ doublen;doublek=1.0; printf("输入大于0的实数n:"); scanf("%lf",&n); while(fabs(k*k-n)>1e-15){ k=(k+n/k)/2; } printf("%f的平方根的值为%f\n",n,k); return0;}22.数根:对于一个正整数n,我们将它的各个位相加得到一个新的数字,如果这个数字是一位数,我们称之为n的数根,否则重复处理直到它成为一个一位数,这个一位数也算是n的数根。例如:考虑24,2+4=6,6就是24的数根。考虑39,3+9=12,1+2=3,3就是39的数根。请编写程序,计算n的数根。程序如下:#define_CRT_SECURE_NO_WARNINGS#include<stdio.h>intmain(){ intn,m,sum; printf("输入大于0的整数n:"); scanf("%d",&n); m=n; do { sum=0; while(m>0) { sum=sum+m%10; m=m/10; } m=sum; }while(m>10); printf("%d的数根=%d\n",n,m); return0;}23.追查车号:一辆卡车违反交通规则,撞人逃逸。现场三人目击事件,但都没有记住车号,只记下车的一些特征。甲说:牌照的前两位数字是相同的;乙说:牌照的后两位数字是相同的;丙是位数学家,他说:四位的车号正好是一个整数的平方。请根据以上线索求出车号。输出格式:Thenumberis****。程序如下:#define_CRT_SECURE_NO_WARNINGS#include<stdio.h>intmain(){ intm,n,a,b,c,d; for(m=32;m<100;m++) { n=m*m; a=n/1000; b=(n%1000)/100; c=n%100/10; d=n%10; if(a==b&&c==d) printf("Thenumberis%d",n); } return0;}24.输出如下三角形菱形:AABAABCBAABCDCBAABCBAABAA程序如下:#define_CRT_SECURE_NO_WARNINGS#include<stdio.h>intmain(){ inti,j,k,n; printf("输入整数n:"); scanf("%d",&n); for(i=0;i<n;i++) { for(k=0;k<40-i;k++) printf(""); for(j=0;j<i+1;j++) printf("%c",'A'+j); for(k=0;k<i;k++) printf("%c",'A'+j-k-2); printf("\n"); } for(i=0;i<n-1;i++) { for(k=0;k<42-n+i;k++) printf(""); for(j=0;j<n-i-1;j++) printf("%c",'A'+j); for(k=0;k<n-i-2;k++) printf("%c",'A'+j-k-2); printf("\n"); } return0;}25.绘制圆:在屏幕上用“*”画一个空心的圆。程序如下:#define_CRT_SECURE_NO_WARNINGS#include<stdio.h>#include<math.h>intmain(){ floatx; inty,p1,p2,i,j; for(y=-10;y<=10;y++) { x=sqrt(100-y*y); p1=(int)(x+0.5); p2=-p1; for(i=0;i<40-2*p1;i++) printf(""); printf("*"); for(j=0;j<4*p1;j++) printf(""); printf("*\n"); } return0;}26.绘制余弦曲线:在屏幕上用“*”显示0~360度的余弦函数cos(x)曲线。程序如下:#define_CRT_SECURE_NO_WARNINGS#definePI3.1415926#include<stdio.h>#include<math.h>intmain(){ floatx; inty,p1,i; for(y=0;y<=360;y=y+10) { x=y*PI/180; p1=(int)(20*cos(x)+0.5); if(p1>0) { for(i=0;i<40;i++) printf(""); printf("|"); for(i=0;i<p1;i++) printf(""); printf("*\n"); } else { for(i=0;i<40+p1;i++) printf(""); printf("*"); for(i=0;i<-p1-1;i++) printf(""); if(p1!=0)printf("|"); printf("\n"); } } return0;}

第5章数组与批量数据处理习题五(参考答案)1.输入10个整数,先计算它们的平均值,编程输出与平均值最接近的那个整数及其位置。程序如下:#define_CRT_SECURE_NO_WARNINGS#include<stdio.h>#include<math.h>intmain(){ doublea[10]; doublesum,avg,min; inti,p; sum=0; printf("输入10个数:"); for(i=0;i<10;i++) { scanf("%lf",&a[i]); sum=sum+a[i]; } avg=sum/10; min=fabs(a[0]-avg); for(i=1;i<10;i++) if(fabs(a[i]-avg)<min) { min=fabs(a[i]-avg); p=i; } printf("平均值为:%f,与平均值最接近的数为:%f,其位置为%d\n",avg,a[p],p+1); return0;}2.选票统计:设有50人参与一项投票,每人只能投编号为1-6的数字1次,编程统计编号为1-6的每人所得到的票数。程序如下:#define_CRT_SECURE_NO_WARNINGS#include<stdio.h>intmain(){ inta[2][50]; inti,n; for(i=0;i<50;i++) { a[0][i]=i+1;//保存编号 a[1][i]=0;//初始化票数 } printf("输入投票编号1..6:"); for(i=0;i<50;i++) { scanf("%d",&n); if(n>=1&&n<=6) { a[1][n-1]++; } } for(i=0;i<6;i++) printf("编号为%d的得票为%d\n",a[0][i],a[1][i]); return0;}3.对于1到10000中的整数,把数据按下列方式依次存入1个新的数组:(1)把能同时被3、5、7整除的数存入数组a中(2)把只能同时被3、5、7中2个数整除的数存入数组b中(3)把只能被3、5、7中1个数整除的数存入数组c中编程输出新数组中的数据。程序如下:#define_CRT_SECURE_NO_WARNINGS#include<stdio.h>intmain(){ inta[10000],b[10000],c[10000]; inti,a1,b1,c1; a1=b1=c1=0; for(i=1;i<10000;i++) { if(i%3==0&&i%5==0&&i%7==0) { a[a1]=i; a1++; } else if(i%3==0&&i%5==0&&i%7!=0||i%3==0&&i%5!=0&&i%7==0||i%3!=0&&i%5==0&&i%7==0) { b[b1++]=i; } elseif(i%3==0&&i%5!=0&&i%7!=0||i%3!=0&&i%5!=0&&i%7==0||i%3!=0&&i%5==0&&i%7!=0) c[c1++]=i; } printf("能同时被3、5、7整除的数有:"); for(i=1;i<a1;i++) printf("%4d",a[i]); printf("\n\n只能同时被3、5、7中2个数整除的数有:"); for(i=1;i<b1;i++) printf("%4d",b[i]); printf("\n\n只能被3、5、7中1个数整除的数有:"); for(i=1;i<c1;i++) printf("%4d",c[i]); return0;}4.利用筛选法求1000以内的素数。步骤如下:第1步:将2,3,4,5,……,1000存入数组,并确定第一个素数2;第2步:删除数组中该素数的倍数;第3步:取数组中下一个没有被删除的数作为新素数,重复第2步。程序如下:#define_CRT_SECURE_NO_WARNINGS#include<stdio.h>intmain(){ inta[1001]; inti,j,p; for(i=0;i<=1000;i++) a[i]=i; a[1]=0;//1不是素数 p=1; do { //找下一个非0数 i=p; while(a[i]==0) i++; p=i+1; for(j=p;j<1001;j++) if(a[j]%a[p-1]==0) a[j]=0; }while(p<=1000);for(i=0;i<=1000;i++) if(a[i]!=0) printf("%5d",a[i]); printf("\n"); return0;}对给定的一组数据,找出其中的最大值,然后把它后面的元素依次前移一个位置,再将这个最大值放在数组的末尾,编程实现上面的功能。程序如下:#define_CRT_SECURE_NO_WARNINGS#include<stdio.h>intmain(){ inta[10]; inti,max,p; printf("输入10个数:"); for(i=0;i<10;i++) scanf("%d",&a[i]); max=a[0]; for(i=1;i<10;i++) if(a[i]>max) { max=a[i],p=i; } for(i=p;i<9;i++) a[i]=a[i+1]; a[9]=max;for(i=0;i<10;i++) printf("%6d",a[i]); printf("\n"); return0;}6.数据搬家:将数组a[100]中从第n到m(0<n<m<100)个数移动到数组b[100]中,要求编写程序输出移动后数组a与数组b中的元素。程序如下:#define_CRT_SECURE_NO_WARNINGS#include<stdio.h>#include<stdlib.h>#include<time.h>intmain(){ inta[100],b[100]; inti,j,n,m; srand((unsigned)time(NULL));//初始化随机函数 for(i=0;i<100;i++) a[i]=rand();//通过随机函数产生100个初始数据。 printf("输出原来的数组a中的元素:\n"); for(i=0;i<100;i++) printf("%6d",a[i]); printf("\n"); printf("输入数据搬动区间n<m:"); scanf("%d%d",&n,&m); if(n<m&&n>=0&&m<100) { for(i=n;i<=m;i++) b[i-n]=a[i]; for(i=m+1;i<100;i++) a[i+n-m-1]=a[i]; printf("输出移动后数组a中的元素:\n"); for(i=0;i<100-(m-n+1);i++) printf("%6d",a[i]); printf("\n"); printf("输出数组b中的元素:\n"); for(i=0;i<m-n+1;i++) printf("%6d",b[i]); printf("\n"); } else printf("输入区间范围出错!\n"); return0;}7.设a[10]与b[20]中已经按从小到大存放了二组有序数据,现要求将两组数组合并到数组c中,合并后c中的数据元素按由小到大的顺序排列。编程输出排列后的c数组。程序如下:#define_CRT_SECURE_NO_WARNINGS#include<stdio.h>intmain(){ inta[10]={2,3,56,67,77,81,90,123,456,678}; intb[20]={1,5,7,8,12,34,56,78,92,134,178,190,210,223,344,346,678,890,3456,7869}; intc[30]; inti,j,k; printf("输出数组a中的元素:\n"); for(i=0;i<10;i++) printf("%6d",a[i]); printf("\n"); printf("输出数组b中的元素:\n"); for(i=0;i<20;i++) printf("%6d",b[i]); printf("\n"); i=0;j=0; for(k=0;k<30;k++) { if(i<10&&j<20) { if(a[i]<b[j]) { c[k]=a[i]; i++; } else { c[k]=b[j]; j++; } } else break; } printf("i=%d,j=%d,k=%d\n",i,j,k);//检查哪个数组后面还有数据没有加进到C数组中,此句可省略。 if(i<10) for(;k<30;k++) c[k]=a[i++]; else for(;k<30;k++) c[k]=b[j++]; printf("输出数组c中的元素:\n"); for(i=0;i<30;i++) printf("%6d",c[i]); printf("\n"); return0;}8.插入排序:从键盘输入10个数据,要求每输入一个数据后,将此数据插入到已经排序的序列中的适当位置使序列总是有序,并输出每次排序的结果。编程实现插入排序算法。程序如下:#define_CRT_SECURE_NO_WARNINGS#include<stdio.h>intmain(){ inta[10],x,i,j; printf("输入10个整数:\n"); for(i=0;i<10;i++) { scanf("%d",&x); for(j=i;j>0;j--) { if(a[j-1]>x)//数据后移,为插入数据做准备 { a[j]=a[j-1]; } else break; } a[j]=x;//插入数据 } printf("输出数组a中的元素:\n"); for(i=0;i<10;i++) printf("%6d",a[i]); printf("\n"); return0;}9.删除排序:从数组a[20]中每次找到其最小元素,将此最小元素放入到数组b的已有元素的后面,并在数组a中删除此最小元素,重复上述过程直到数组a中没有元素,此时数组b中的元素是按由小到大顺序排列的。编程实现上述算法。程序如下:#define_CRT_SECURE_NO_WARNINGS#include<stdio.h>intmain(){ inta[20]={23,45,66,3,24,567,35,67,32,77,55,38,97,644,55,345,89,98,6789,443}; intb[20],min,p,i,j; printf("输出a数组:\n"); for(i=0;i<20;i++) printf("%6d",a[i]); for(i=0;i<20;i++) { min=a[0];p=0;//找最小数min与位置p for(j=1;j<20-i;j++) { if(a[j]<min) { min=a[j]; p=j; } } b[i]=min;//最小数存入b数组末尾 for(j=p;j<20-i;j++)//从a中删除最小数 a[j]=a[j+1]; } printf("输出数组b中的元素:\n"); for(i=0;i<20;i++) printf("%6d",b[i]); printf("\n"); return0;}10.排名统计:设有二维数组a[10][2],其中第0列为某运动会的各参赛团队的奖牌总数,现要求按奖牌总数由高到低给出各参赛团队的名次(奖牌数相等名次相同)并存入第1列中,再按名次高低依次输出。编程实现上述算法。程序如下:#define_CRT_SECURE_NO_WARNINGS#include<stdio.h>intmain(){ inta[10][2]={12,0,15,0,66,0,3,0,24,0,18,0,15,0,9,0,12,0,3,0}; intcount,i,j,t; for(i=0;i<10;i++)//计算名次 { count=1; for(j=0;j<10;j++) if(a[j][0]>a[i][0]) count++; a[i][1]=count; } printf("按名次输出:\n"); for(i=0;i<10;i++) printf("%6d%6d\n",a[i][0],a[i][1]); //排序 for(i=0;i<10;i++) for(j=0;j<10-i;j++) { if(a[j][1]>a[j+1][1]) { t=a[j][1]; a[j][1]=a[j+1][1]; a[j+1][1]=t; t=a[j][0]; a[j][0]=a[j+1][0]; a[j+1][0]=t; } } printf("按名次输出:\n"); for(i=0;i<10;i++) printf("%6d%6d\n",a[i][0],a[i][1]); return0;}11.找出矩阵m中的最大、最小元素,并输出它们的位置。//为减少输入数据的麻烦,用随机数生成二维数据的元素值,并输出。//同时用#defineM5来定义一个a[M][M]的二维数组(下同)程序如下:#define_CRT_SEC

温馨提示

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

评论

0/150

提交评论