版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
各章练习题答案
第1章C语言概述
1.1简答题
1.答:C语言单词分为保留字、标识符、字面常量、运算符和分隔符5类。
2.答:首字符必须是英文字母或下划线:其余位置上的字符必须是英文字母、十进制数字
符号或下划线。
答:它们的首字符不同,此外各自还有详细的格式规定。其中,数值字面常量以数字、
正负号或小数点(如.01表示0.01)开头,字符字面常量必须用单引号括起来,字符串字面常
量必须用双引号括起来,标识符首字符必须是英文字母或下划线。
答:分类如下。
数值常量3个:25-8+3.42
字符常量3个:'4''D'
字符串7个:"xl""-28""y=m+l""al2.c""else""+""intx;"
标识符7个:x2ncountmainHlistxyMaxA_l
保留字3个:intvoidif
运算符1个:+
分隔符。个:
非法数据1个:3ab
以上共计25个。
3.答:C语句除空语句外,按照语句功能,可分为以下8类:类型定义语句、变量定义语句、
函数原型语句、表达式语句、复合语句、选择语句、循环语句和跳转语句。在以上8类
语句中,前3类属于说明性语句,后5类属于执行性语句。
4.答:其格式为:#include(头文件〉或#include“头文件”。对于每条预处理包含命令,在预
处理阶段将把该命令置换为所指定“头文件”中的全部内容,换句话说,是用该“头文
件”保存的全部内容代替该预处理包含命令行。
对于上述给出的两种包含命令格式,系统处理时的查找头文件的路径有所不同。对于第
一种格式(即尖括号格式),将从C语言系统层次目录门杳找头文件,若查找不到则给出错
误信息;对于第二种格式(即双引号格式),如果头文件名没有给出磁盘号和路径名,则首
先从当前工作目录(即包含该命令的程序文件所属的目录)中查找头文件,若查找不到,再
接着从C语言系统层次目录中查找头文件,若还是杳找大到则给出错误信息。在第二种格式
中,如果头文件名带有磁盘号和路径名,则只在该指定踹径中查找头文件,若查找不到则给
出错误信息。(关于第二种格式中头文件名带有磁盘号和路径名的情况,教材的叙述是错误
的)
答:第一步需要上机建立相应的工作区和项目并建立、输入和编辑该程序中的相应文件,通
常首先建立主文件;第二步对每个程序文件进行编译生成各自的目标代码文件,通常主文件
被首先编译并生成目标文件;第三步使主目标文件与同•程序中的其他目标代码文件以及有
关C语言系统库函数文件相连接,生成一个可执行文件;第四步运行最后生成的可执行文件。
1.2选择题
1.B2.C3.A4.DS.A6.B7.D8.C
上机实验题
程序代码:
ttinclude<stdio.h>
voidmain(){
intx,y;
x=5;y=6;
printf("x+y=%d,,x+y);
printf("x♦y=%d\n"/x*y);
)
运行结果:
x+y=11,x*y=30
程序代码:
//include<stdio.h>
intcube(int);
voidmain(){
printf("cube⑶=%d\rT,cube⑶);
printf("cube(5)=%d\n",cube(5));
printf("cube(8)=%d\n"zcube(8));
)
intcube(intx){returnx*x*x;}
运行结果:
(:此0闭=27
(:即⑸=125
cube(8)=512
程序代码:
A.主程序文件代码:
#include<stdio.h>
ttinclude"abc.cpp"
voidmain(){
doublea,b,c;
doubleaverageValue;
a=2;b=3;c=4;
averageValue=AVE(a,b,c);
printf("averageValue:%lf\n"/averageValue);
averageValue=AVE(a+1,b+2,c+5);
printf("averageValue:%Lf\n"/averageValue);
)
B.abc.cpp文件代码:(新建时选择"File|New|C++SourceFile"。注意去掉“Addtoproject…:"
前面的勾,以后新建其他程序文件或头文件时还要勾上)
doubleAVE(doublex,doubey,doublez)
return(x+y+z)/3;
)
运行结果:
averageValue:3.000000
averageValue:5.666667
程序代码:
A.主程序文件代码:
ttinclude<stdio.h>
#include"example.h"
voidmain(){
inta,b,c;
printf("请输入任意三个整数:");
scanf("%d%d%d”,&a.&b,&c);
printf("求和:%d\n",Sum(a,b,c));
printf("乘积:%d\n",Product(a,b,c));
)
B.example.h头文件代码:(新建时选择aFile|New|C/C++HeaderFile”。注意勾上"Addto
project前面的勾)
intSumfint,int,int);
intProductfint,int,int);
C另一个程序文件的代码:(新建时选择aFile|New|C++SourceFile"。注意勾上“Addto
project…:"前面的勾)
intSum(inta,intb,intc)
{
returna+b+c;
)
intProductfinta,intb,intc)
(
returna*b*c;
运行结果随输入不同而不同,请自行记录
第2章基本数据类型与表达式
2.1选择题
1.D2.A3.B4.B5.D6.C7.C8.A9.C10.D
11.B12.C13.A
2.2把下列数学算式或不等式表示成C表达式
1.2.0*x*(l+x*x/3.0)
2.(l+exp(x))/(l-exp(x))
3.(-b+sqrt(b*b-4.0*a*c))/2/a
4.l/(3.0*x*log(2.0*x+k))
5.pow(sin(x+3.14159/4),3)/(3+pow(cos(x-3.14159/4),3))
6.pow(l+exp(x+1),n)/7
7.0<=x&&x<=20
8.(a*x-b*y)!=c
9.(4*x+7*y-2)==3*a*b
10.(3.0*x+2)!=0&&fabs((2.0*x*x+1)/(3.0*x+2))<=5/*(3.0*x+2)先判断避免除0*/
11.age>=5511pay>=820
12.!strcmp(place,“江苏")&&!strcmp(sex,"*")/*strcmp函数详见教材第127页*/
13.('a'<=ch&&ch<='z')11('A'<=ch&&ch<='Z')
14.s[2]=='O'&&(s[lj=='x'11s[l]=='X')/*s[l]ss⑵为数组元素,详见第4章*/
2.3求出下列逻辑表达式的相反式
1.!x
2.x!=0
3.x<10
4.p==NULL||x==46
5.x<=011x>=10
6.chch!='D'
7.!p11p->data==x/*p->data是对结构成员的间接访问,详见教材第193页7.3*/
8.i>=n&&a[i]%3!=O/*a[i]为数组元素,详见第4章*/
2.4根据下列题目要求编写出相应程序
1.(题目中仅要求两边之和大于等于第三边是不对的。两边之和等于第三边只能连成直线
(根据公式计算面枳也为0),不能组成三角形。边长也不应为负数。故应要求两边之和大
于第三边,且任一边长大于0。不过目前没有学习第3章的if语句,程序自身无法控制在遇
到不能构成三角形的情况时如何处理,需要用户输入时自行掌握。)
ttinclude<stdio.h>
^include<math.h>
voidmain(){
doublea,b,c,s;
printf("请输入三角形三条边长:");
scanf("%lf%lf%lf“,&a.&b,&c);
s=(a+b+c)/2;
printf("该三角形面积为:%lf\n",sqrt(s*(s-a)*(s-b)♦(s-c)));
2.(每年都是上一年的110%,np1.1倍,5年后则将是1.1的5次方。其实只有5次方,为什
么一定要用pow(l.l,5)呢A_A?1.1*1.1*1.1*1.1*1.1效率多高!不过要注意人数是没有
零头的,所以要ceil()一下,之所以用ceil()而不是floor。是为了保证完成任务,一个都不能少,
呵呵。本题这样算出来的是4832人。不过更严格的做法就是要每年都ceil()一下,否则中间
某个年份招生人数就有零头了,本题这样算出来的是4836人。只是那样的话就成了:
ceil(ceil(ceil(ceil(ceil(3000*1.1)♦1.1)♦1.1)♦1.1)*1.1)
晕吧,哈哈。要想不晕,得学好第3章的循环语句。)
^include<stdio.h>
ttinclude<math.h>
voidmain(){
printf("5年后计划招生%lf人。\n",ceil(3000*pow(l.l,5)));
)
3.(算术平均值:求和之后除以n,几何平均值:乘积的n次方根(即1.0/n次方)。为了防
止数值过大溢出(超过整数类型的范围),所以对第一个数就使用了强制类型转换为double。
此外本题计算乘积的4次方根,要求输入的四个整数如果全都不为0,则应有0、2或4个为
正,否则乘积为负,无实数4次方根。)
ttinclude<stdio.h>
#include<math.h>
voidmain(){
inta,b,c,d;
printf(”请输入4个整数:");
scanf("%d%d%d%d",&a,&b,&c,&d);
printf("算术平均值:%仟,几何平均值:%lf。\n",
((double)a+b+c+d)/4,
pow((double)a*b*c*d,1.0/4));
)
4.(唯一要求:a和b不能是相反数,即a不等于-b。拜托,拜托!)
ttinclude<stdio.h>
^include<math.h>
voidmain(){
doublea,b;
printf("请输入a和b的值:");
scanf("%lf%lf"/&a,&b);
printf("x=%lf,y=%lf\n".
2*a*sin(a)/3/(a+b),
2*b*cos(b)/3/(a+b));
)
上机实验题
1.
ttinclude<stdio.h>
#include<stdlib.h>
ttinclude<time.h>
constintN=10;
voidmain(){
inti,x,y,z,c=0;
srand(time(0));
for(i=1;i<=N;i++){
x=rand()%90+10;//[0+10,89+10]
y=rand()%90+10;//[0+10,89+10]
printf("%d+%d=",x,y);
scanf("%d"z&z);
if(x+y==z)c++;//本题回答正确
)
("最后得分:
printf%d\n",c*10);
2.(与教材不同,使用了X、这是制表符,相当于按Tab键排版。由于使用了N,所以%102f
也省略为%.2行,即不限定宽度,只限定小数位数为2位。注意教材上第一个printf语句也
误为了Q请尝试将改为、
"cos""con"whilefordo~whilec)
#include<stdio.h>
ttinclude<math.h>
constdoubleRAD=3.14159/180;
voidmain(){
inti=0;
printf("\ti\tsin\tcos\n");
while(i<=90){
printf("\t%d\t%.2lf\t%,2lf\n",\,sin(i*RAD),cos(i*RAD));
i+=5;
)
)
3.(正整数范围大约21亿多,故输入的数以9位或以下(小于10亿)为宜,切记切记!)
ttinclude<stdio.h>
voidmain(){
intnum,rem;
printf("输入一个整数:");
scanf("%d",&num);
do{
rem=num%10;〃得到个位的值
/*去掉个位,这样下次的个位就是现在的十位,
每次如此,即可逐次得到从个位到最高位的各位*/
num/=10;
//愉出现在的个位。由于从个位开始逐位输出,所以次序反过来了
printf("%d",rem);
/*循环必须用do~while,这样当num为0时也会循环一次,输出।一个0。
开始不为0时,当去掉最高位后num自然也就是。了,结束循环*/
}whilefnum>0);
printf("\n");
)
4.(呵呵,for语句与教材的不同。其中表达式1可以省略,这不奇怪;每次循环ch++和dl++
都执行一次,所以表达式2只需要判断ch<=F,这也不奇怪。两条printf合成一句,大多数
同学也会。但是ch++和dl++怎么和printf合并成表达式3?原因在于由于是后缀++,所以
给printf。的值实际上都是dl和ch,值给了printf。之后才增加1,所以++实际上仍然是在
print")输出之后做的。)
//include<stdio.h>
voidmain(){
charch='A',dl='a';
for(;
ch<='F';
printf("%c:%d,%c:%d\n"/ch++,ch,dl++,dl));
5.(比教材多了一点换行,程序排版好看点。注意有整数除法,所以y不能为0,而且输入
除法答案的时候要舍去小数部分啊!)
//include<stdio.h>
voidmain(){
intx,y,z,c=0;
printf("输入两个整数:");
scanf("%d%d",&x,&y);
printf("%d+%d=",x,y);scanf("%d",&z);if(x+y==z)C++;
printf("%d-%d=",x,y);scanf(”%d”,&z);if(x-y==z)C++;
printf("%d*%d=",x,y);scanf("%d",&z);if(x*y==z)C++;
printf("%d/%d=",x,y);scanf("%d"z&z);if(x/y==z)C++;
printf("%d%%%d=",x,y);scanf("%d",&z);if(x%y==z)C++;
printf("\n共5道题,答对%d道题\n",c);
第3章流程控制语句
3.1选择题
1.A2.B3.C4.D5*.C6.B7.C8.B9.A10.D
(问题一:第5小题。一般而言,循环体每次执行完之后都会执行〈表达式3>,然后再计算<
表达式2>,判断是否中止循环,即使在循环体中碰到continue也不会跳过〈表达式3》的执
行。但是,如果在循环体中执行break则会立即终止循环,也就是说〈表达式3>会被跳过,在
这种情况下,循环体就被多执行了一次。)
3.2写出下列程序运行结果并上机验证
1.(第一个if改用条件表达式,注意最后一个printf之前的一行,每执行一个赋值语句,相
关变量的值就被改变了,变量的新值参与下一个赋值语句中的运算,所以执行了a+=b;b+=
a;之后,b和a的值不等。)
ttinclude<stdio.h>
voidmain(){
inta=2,b=5,c;
c=(a+b>10)?(a*b):(3*a+2*b);
if(c>=20)printf(”%d”,c*c);
elseif(a>b)printf("%d",3*(a+b));
elseprintf("%d",4*c-5);
printf("\n");
a+=b;b+=a;c+=a+b;
printf("a=%d/b=%d,c=%d\n",a,b,c);
2.(注意三处:x+=2.switch(x-1)>除了case10之后有break,别的没有break。)
include<stdio.h>
voidmain(){
intx;
for(x=5;x<12;x+=2){//x:57911
switch(x-1){
case4:printf("%d\n",x);//x:5
case7:printf("%d\n",2*x+1);//x:5
case10:printf("%d\n"z3*x-1);break;//x:511
default:printf("default\n");//x:79
)
)
)
3.(要求输入的数在第96页)
^include<stdio.h>
voidmain(){
intsO,si,s2,x;
sO=si=s2=0;
printf("从键盘输入一组整数(以-1结束):\n");
scanf("%d",&x);
while(x!=-1){//-1结束
switch(x%3){
case0:sO+=x;break;//能被3整除的数之和
case1:si+=x;break;//除以3余1的数之和
case2:s2+=x;break;//除以3余2的数之和
)
scanf("%d"z&x);
)
printf("sO=%d,sl=%d,s2=%d\n"/sO,si,s2);
)
4.(学会数数,呵呵。)
#include<stdio.h>
voidmain(){
intcl=0,c2=0,c3=0;
inti,j,k;
for(i=0;i<5;i++){
for(j=i;j<5;j++|cl++;//循环5+4+3+2+1=15^
for(k=5;k>=i;k-)c2++;//循环6+5+4+3+2=20次
c3++;//5次
)
printf("%d%d%d\n';cl,c2,c3);
}
5.
//include<stdio.h>
constintB=2;
voidmain(){
inti=0,p=1,s=1;
while(s<100){//s>=100循环才结束
i++;p*=B;s+=P;
//循环次数jPs
//I123
〃2247
〃33815
//441631
〃553263
//6664127
)
printf("i=%d\n",i);
printf("s=%d\n",s);
6.(对正整数10~16分解质因数。)
#include<stdio.h>
voidmain(){
inti;
for(i=10;i<=16;i++){
intj=2,k=i;〃j从最小的质数2开始
printf("%d:",i);
do{
/*在下面的循环中,如果k能被j整除,则j必为k的质因
数。
因为j是从最小的质数2开始逐个增加的,只要能够整除k的j都会完全
被while循环分解(k/=j),所以当j增加到合数『时,『的各个质因数(均
小于户都已经被分解完毕,故而此时的k已经不能被『整除了。j必为k
的质因数。
合数就是能够被1和自身之外的数整除的数,即:
j'=pl*p2*p3*--*pn,其中pi为质数,且pi<j',i=l,2,3,…,n,n>l。*/
while(k%j==0){printf("%d",j);k/=j;}
j++;
}whilefk>=j);
printf("\n");
)
7.(不要光靠数数啊,呵呵。)
ttinclude<stdio.h>
constintT=6;
voidmain(){
inti,j,k=0;
for(i=l;i<=T;i+=2)//i:135
for(j=2;j<=T;j4+)//j:23456
if(i+j==T)printf("');〃(i,j):(l,5)(3,3)
elseif(i*j==T)printf("*");//(ij):36)(3,2)
elsek++;//共循环3*5=15次,上面两种情况4次,这里11次
printf("\nk=%d\n",k);
8.(对照第6小题。这里的while循环和第6小题的while很像吧?不错;这里的i和第6
小题的j类似,是用来寻找质因数的。只是由于wMle的条件表达式不同,寻找的是x和y二
者的公共质因数i。p将所有的公共质因数i乘起来,得到的是二者的最大公约数。最小公倍
数本应该是两数乘积除以最大公约数,但是由于在while循环中x和y已经各自除以所有的
公共质因数,也就是说x和y各自都己经除以一次最大公约数了,总共除了两次,所以最后
反而要乘回来一次。因此printf中的附加参数是p*x*yo)
ttinclude<stdio.h>
voidmain(){
intx,y;
inti=2,p=1;
printf(”请输入两个正整数x和y:");
scanf("%d%d”,&x,&y);
do{
while(x%i==O&&y%i==0){
P*=i;
x/=i;
y/=i;
)
i++;
}while(x>=i&&y>=i);
printf("x和y的最小公倍数为%d\n”,p*x*y);
}
3.3指出下列程序功能并上机验证
1.(程序功能:计算数学公式团,其中n从键盘输入,要求n>=2«本程序用到了函数定义的
知识。)
include<stdio.h>
doublefl(intn){//函数fl:要求一个整型参数,计算结果(返回值)为实数
inti;
doublesign=1,s=1;
for(i=2;i<=n;i++){//从2开始累加至n
s+=sign/(i*i);〃sign含义见下。s每次加上(-l)7i2
signsign每次都乘以-1,初值为1=(-1)2,故sign=(-l)i
)
returns;//返回计算结果s
)
voidmain(){
inta;
printf("输入一个大于等于2的整数:");
输入的数不大于等于则要重新输入
doscanf("%d"/&a);while(a<=1);〃a2
调用计算,并将计算结果输出
printf("%lf\n"zfl(a));//fl⑶
}
2.(与第2章上机实验题第3小题功能相同,请参照阅读。注意48是。的ASCII码,由于。
在ASCII码表中连续排列,所以数字0~9加.上48就成为对应的数字字符。)
/include<stdio.h>
voidmain(){
intx;
printf("输入一个整数:");
scanf("%d",&x);
while(x){
intk=x%10;
printfC^c",k+48);
x=x/10;
)
printf("\n");
}
3.(答案很简单!看到最后两行printf就行了,呵呵。考试考这题多好啊!函数f2
求两数的最小公倍数,与本章练习题3.2的第8小题的算法一样。函数fl求两数的最大公约
数,虽然f2中求最小公倍数的同时也得到了最大公约数p,但fl的效率高得多。fl采用的算
法称为辗转相除法,又称欧儿里得算法,详细描述见教材第82页对程序3-12的说明。
辗转相除法的证明:设a整除以b的余数为r,即a=q*b+r,其中q为整数。将a和b的最大
公约数写作gcd(a,b),b和r的最大公约数则为gcd(b,r)0
由于r=a-q*b,而a、b均能被gcd(a,b)整除,所以r显然也能被gcd(a,b)整除。既然b和r
都能被gcd(a,b)整除,则gcd(a,b)是b和r的公约数,所以gcd(a,b)不可能大于b和r的最大
公约数gcd(b,r)»
反过来,由于b和r均能被gcd(b,r)整除,而a=q*b+r,所以a也能被gcd(b,r)整除。既然a
和b都能被gcd(b,r)整除,则gcd(b,r)是a和b的公约数,从而不可能大于a和b的最大公
约数gcd(a,b)o
绕了半天,我们得到gcd(a,b)<=gcd(b,r)并且gcd(b,r)<=gcd(afb),那么就只能有:
gcd(a,b)=gcd(b,r)o
即,a和b的最大公约数必然也是它们的余数和它们的最大公约数。这样,可以进行辗转相
除,迅速将参与运算的两个数变小,很快得到结果。)
《include<stdio.h>
intfl(inta,intb){
intr;
whilefb!=0){
r=a%b;
a=b;b=r;
)
//此时有b=0。由于循环结束前进行了34盘力的赋值,所以实际是最后一次求得的
//余数r=0,也就是最后一次循环时(执行a=b;b=r;前)有a=n*b,其中n为整数。
//这时的a和b的最大公约数自然是b,也就是执行了a=b;后的a是最大公约数。
returna;
}
intf2(inta,intb){
inti=2,p=1;
do{
while(a%i==0&&b%i==0){
P*=i;a/=i;b/=i;
)
i++;
}while(a>=i&&b>=i);
returnp*a*b;
)
voidmain(){
inta,b;
printf("输入两个正整数:");
doscanf("%d%d",&az&b);while(a<=0||b<=0);
和%(的最大公约数:
printf("%d1%d\n"/a,b,fl(a,b));
printf("%d和%£1的最小公倍数:%d\n';a,b,f2(a,b));
)
4.(教材错误:ff函数中的scanf语句应在switch语句之前。
程序功能:出10道20以内整数加减乘除运算题,统计用户得分。每做对一题得10分。)
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
constintN=10;
intff(intx,inty,charop);
voidmain{){
inti,a,b,c=0,d;
charop;
srand(time(0));
for(i=0;i<N;i++){
a=rand()%20+1;
b=rand()%20+1;
d=rand()%4;
if(d==0)op=
elseif(d==1)op=
elseif(d==2)op=
elseop=
if(ff(a,b,op))c++;
)
printf("得分:%d\n”,c*10);
)
intff(intx,inty,charop){
intz;
printf("%d%c%d=",x,op,y);
scanf(”%d”,&z);
//判断对op指定的运算,用户给出的答案是否正确。返回判断结果(逻辑值)
switch(op){
casereturnx+y==z;//都return了,就不用break了
casereturnx-y==z;
casereturnx*y==z;
casereturnx/y==z;
//尽管本程序可以不要default,但ff可能用于别处op可能会被指定错误的值
//检查非法参数取值,这是好习惯。但是简单地exit在大程序中是不好的处理
default:{printf("运算符错!\n");exit(l);)
)
}
3.4根据下列题目要求编写程序并上机得到运行结果
1.(不要用pow函数啊,同志!整数的整数次方,还是这个好。如果只求一两个高次耗,则
有更高效的办法而不要象下面那样逐次乘上去。此外高次哥要小心溢出整数范围。
后记:模事一件,居然开始的时候习惯性地把p*=3写成p*=i了,最终结果就成了lo哈
哈,我还纳闷,这个程序怎么会错呢?)
//include<stdio.h>
voidmain(){
inti,p=1,sum=0;
for(i=0;i<=10;i++){
sum+=p;
P*=3;
}
printf("%d\n",sum);
)
2.(见注释。)
ttinclude<stdio.h>
voidmain(){
inti,sum;
for(i=0,sum=0;sum<1000;){
i+=2;
sum+=i*i;
)
//循环结束时,sum已经大于等于1000,即多加了一项
//所以最大的n应是前一项,即i-2
printf("%d\n",i-2);
)
3.(注意printf里x<=0为假时的求值表达式。对于多项式计算,反复用高项系数乘以自变
量加低项系数,可■以极大地减少乘法次数。即,对于多项式国可以写成:
((...((a....an-l....an-2.......a2....al....a0
如果按原来的多项式计算,不作任何优化,则需要..(..I.........(..l)n启次乘法;而改造后只需
要n次乘法。当n较大时二者的差异是明显的。)
//include<stdio.h>
ttinclude<math.h>
constdoublea=1.0;
voidmain(){
doublex;
printf("请输入一个实数x:");
scanf("%lf",&x);
printf("y=%lf\n"/
(x<=0)?
sqrt(a*a+x*x)
:((3*a*a*x+4)*a*x-l)
);
4.(一般教材当然认为这种题目应该用双重循环,对a、b的所有可能取值情况全部判断一
下不定方程是否成立。对于复杂•点的方程可能不得不如此,但是这儿用那种办法显然笨死
了!对每个a的取值,计算相应的b,然后看b是否符合条件这不就够了吗?记住由于求b
用了整数除法,所以得到的b只是真正的解的整数部分。所以在判断b是否在15~36之间的
同时还要检查b是不是真的是原方程的解。由于本方程很简单,所以直接重新计算一下就行
了。另外,如果用b作为循环变量,只需要从15循环到36,循环22次,比用a更快。)
//include<stdio.h>
ttinclude<math.h>
voidmain(){
inta;
for(a=6;a<=30;a++I{
intb=(126-2*a)/5;//复合语句开头也可以定义变量
if(15<=b&&b<=36&&(2*a+5*b)==126)
printf("(%d,%d)”,a,b);
)
printf("\n");
第4章数组和字符串
4.1选择题
1.B2.C3.B4.D5.A6.C7.A8.D9.B10.D
4.2写出下列程序运行结果并上机验证
1.(il:a中奇数个数;i2:a中偶数个数。
此题即形考册作业2第三大题第1小题。)
#include<stdio.h>
voidmain(){
inta[10]={12,39,26,41,55,63,72,40,83,95);
inti,il=0,i2=0;
for(i=0;i<10;i++)
(a[i]%2)?il++:i2++;
printf("%d%d\n”,il,i2);
)
2.(将a中元素逆序后输出。)
#include<stdio.h>
^defineN8
voidmain(){
inta[N]={36,25,48,14,55,40,32,66);
inti,x;
for(i=0;i<N/2;i++){//逆序
x=a[i];a[i]=a[N-1-i];a[N-1-i]=x;
)
for(i=0;i<N;i++)printf("%d",a[i]);〃输出
printf("\n");
3.(统计数组a中所有元素有多少个小于b中各元素(且不小于b中该元素之前的各元素),
并输出。此程序粗看非常无聊,实则在生活中可以找出很多实例:例如买鞋子一一a是•堆
人,他们的脚有大有小;b是鞋子尺码,只有几种,并且从小到大排列。鞋子当然不能买小了,
应该稍大一点,但是又不能太大。那么,对于a中所有的人,b中各种尺码的鞋子应该买多少
双呢?用这个程序就可以统计出来,结果是分别应该购买C同双尺码为b[i]的鞋子。)
/include<stdio.h>
#defineN10
ttdefineM4
voidmain(){
inta[N]={16,83,54,62,40,75,90,92,77,84};
intb[M]={60,76,90,101};
intc[M]={0};
inti,j;
for(i=0;i<N;i++){
j=0;
while(a[i]>=b[jj)j++;
皿++;
)
for(i=0;i<M;i++)prntf("%d",c[i]);
printf("\n");
4.(在二维数组a中找最大元素,输出其值和下标。
此题功能与形考册作业2第三大题第5小题的相同,只是a中数据不同。)
#include<stdio.h>
voidmain(){
inta⑶⑷={{1,2,7,8},{5,6,11,12},{9,10,3,4}};
intx=a[0][0];
intii=0zjj=0;
inti,j;
for(i=0;i<3;i++)
for(j=0;j<4;j++)
if(a[i][j]>x){x=a[i][j];ii=i;jj=j;}
printf("a[%d,%d]=%d\n",ii,jj,a[ii][jj]);
)
5.(通过比较找出最大字符串,将其存到si中;同时找出最小字符串,将其存到s2中。第
二个if前加else可提高一点效率,因为如果a[i]已经比si大了,自然就不可能比s2小,只需
要在a[i]不大于si时才有必要和s2比较。
此题功能与形考册作业2第三大题第2小题的相同,但本题采用数组,需要反复调用strcpy
复制字符串,效率较低。)
#include<stdio.h>
#include<string.h>
voidmain(){
chara[5][10]={"student","worker","soldier","peasant","cadre"};
charsl[10Ls2[10];
inti;
strcpy(sl,a[0]);strcpy|s2,a[0]);
for(i=1;i<5;i++){
if(strcmp(a[i],si)>0)strcpyfsl,a[i]);
elseif(strcmp(a[i]rs2)<0)strcpy(s2,a[i]);
)
printf("%s%s\n”,sl,s2);
)
4.3指出下列函数功能并上机调试和验证
(本题需要一点函数的知识。数组作为函数参数声明时不需要指定第
一维大小)
1.(将一维整型数组a的前n个元素中大于等于60的数换到小于60的数后面保存。)
voidfl(inta[]zintn)
(
inti=0,j=n-1,x;
do{
while(a[i]<60)i++;//找到第一个大于等于60的数
whilefaU]>=60)j-;//找到最后一个小于60的数
//如果大于等于60的数在前面则换到后面去
if(i<j){x=a[i];a[i]=a[j];a[j]=x;i++;j}
}while(i<j);//循环,直到大于等于60的数全部在小于60的数之后
)
2.(输出双精度数数组a的前n个元素中不小于平均值的元素,然后回车。
此题与形考册作业3第四大题第6小题类似,但本函数并未统计和返回符合条件的元素个数,
而是输出它们。)
voidf2(doublea[],intn)
|
inti;doublesum=0;
for(i=0;i<n;i++)sum+=a[i];
sum/=n;
for(i=0;i<n;i++)
if(a[i]>=sum)printf("%2.0lf",a[i]);
printf("\n");
3.(统计并输出一维字符数组a中逗号、分号、左右圆括号、左右方括号、左右花括号的
个数并输出。
函数最后一句多了个%)
voidf3(chara[])
{
inti,c[5]={0};
for(i=0;a[i];i++)
switch(a[i]){
case7:c[0]++;break;
casec[l]++;break;
case'(':
case')':c[2]++;break;
case
case']'*c[3]++;b-eak;
case
casec[4]++;break;
)
for(i=0;i<5;i++)printf("%d",c[i]);
printf("\n");
)
4.(用选择排序法按照字符串长度进行升序排序。
本函数中反复调用strlen求字符串长度,要花费较多时间,可考虑用一个整型数组保存字符
串长度以减少对strlen的调用。)
voidf4(charunsignedintm)
(
unsignedinti,j,k,w;
for(i=1;i<m;i++){
charx[N];
w=i-1;k=strlen(a(i-1]);
for(j=i;j<m;j++)
if(strlen(a[j])<k){k=strlen(a[j]);w=j;}
strcpy(x,a[i-1]);strcpy(a[i-1],a[w]);$trcpy(a[w],x);
)
)
4.4根据下列题目要求编写程序并上机调试和运行
1.(又是斐波纳契数列!因为要逆序显示,所以要在算出最后一项后再开始显示,可以用
数组先保存计算结果。当然,也可以使用笫6章学到的递归函数。)
ttinclude<stdio.h>
voidmain(){
intfibonacci[20]={0,1},i;
for(i=2;i<sizeof(fibonacci)/sizeof(fibonacci[0]);i++)
fibonacci[i]=fibonacci[i-1]+fibonacci[i-2];
for(i=sizeof(fibonacci)/sizeof(fibonacci[0]);i-;)
printf("%d",fibonacci[i]);
printf("\n");
2.(长度不超过50个字符,大小就最多为51。)
//include<stdio.h>
voidmain(){
charline[51];
inti,count[10]={0};
printf("请输入一行字符串(不超过50个字符):\n");
gets(line);//允许空格
for(i=0;line[i];i++){
intdigit=line(i)-'O';
if(digit>=0&&digit<=9)//是十进制数字字符
countfdigit]++;
)
for(i=0;i<10;i++)
printf("%d",count[i]);
printf("\n");
3.(无语。看三次不懂?再次无语。看十次不懂?还是先看看第3章吧。)
ttinclude<stdio.h>
voidmain(){
inta[][4]={{3,0,45},
(6,2,1,7},
(4.1,5,8}};
intb口⑷={{1,4,0,3},
{2.51,6},
{0.7,4,4},
{936,0});
//乘积矩阵行数等于第一个矩阵的行数,列数等于第二个矩阵的列数
intc[sizeof(a)/sizeof(a[0])][sizeof(b[0])/sizeof(b[0][0])];
inti,j,k;
for(i=0;i<sizeof(a)/$izeof(a[0]);i++)
for(j=0;j<sizeof(b[0])/sizeof(b(0][0]);j++)
for(c[i][j]=0,k=0;k<sizeof(b)/sizeof(b[0]);k++)
c[i]U]+=a[i][k]*b[k]U];
for(i=0;i<sizeof(a)/$izeof(a[0]);i++,printf("\n"))
for(j=0;j<sizeof(b[0])/sizeof(b[0][0]);j++)
printf("%10d",c[i][j]);
)
4.(此题题意不明:什么叫做“每个同学的总成绩和平均值”?“每个同学的总成绩”应
该是指对于每个学生将其各门课程成绩累加起来的数值。可是“平均值”呢?是指每一个
同学的总成绩按课程门数M平均,还是所有同学的总成绩加起来按学生人数N平均?
另外此程序中scanf的第一个参数里%01前面必须有空格,后面不能有空格,否则好像会有问
题。想念C++里的cin>>,多么方便!)
ttinclude<stdio.h>
#defineN3
ttdefineM2
voidmain(){
inta[N][M];
inti,j,sum;
for(i=0;i<N;i++){
printf("请输入第%d位同学所有%d门功课的成绩:”,i+1,M);
for(j=0;j<M;j++)
scanf("%d",a[i]+j);
)
printf("\n");
for(sum=0,i=0;i<N;i++){
intsumi=0;//该生总成绩
for(j=0;j<M;j++)
sumi+=a[i)[];
printf("第%d位同学%d门课程总成绩%d分,平均%5.2lf分\n”,
i+1,M.sumi,(double)sumi/M);
sum+=sumi;//各生成绩汇总
)
printf("\n所有同学平均总成绩%52f分\n",(float)sum/N);
第5章指针
5.1选择题
1.B2.A3.C4.C5.D6.A7.B8.C9.B10.D
11.A12.C13.B14.D15.B
(15用到了C++中的new进行动态分配,newint表示动态分配一个int变量)
5.2写出下列程序运行结果并上机验证
1.(统计并输出数组a中235的倍数各有多少。
注意三个if语句之间不能用else连起来,必须各自分开独立成句。因为一个数可能同时是2、
3、5中一个或多个数的倍数,需要分别判断。)
#include<stdio.h>
voidmain(){
inta[8]={25,18,36,42,17,54,30,G3};
int*p=a;
intc2,c3,c5;
c2=c3=c5=0;
while(p<a+8){
iff*p%2==0)c2++;
if(*p%3==0)c3++;
if(*p%5==o)c5++;
p++;
)
printf("%d%d%d\n"zc2,c3,c5);
)
2.(输出数组中第6~3项的值、它们的和以及平均值。)
ttinclude<stdio.h>
voidmain(){
inta[8]={46,38,72,55,24,63,50,37);
ints=0;
int*p=a+
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 财务印章管理内控制度
- 防止舞弊行为内控制度
- 教师职业行为负面清单、师德责任追究制度
- 学校关于开展领导干部亲属违规经商办企业和领导干部收送红包礼金问题专项治理工作方案五篇例文
- 2026年环保行业创新报告及污水处理技术趋势分析报告
- 2025年互联网保险理赔线上化解决方案报告
- 房地产项目管理规范与流程
- 2025年安防行业智能监控技术与AIoT发展报告
- 2025年光伏组件封装技术升级与耐候性技术提升报告
- 2025年钛合金加工十年分析:骨科植入物市场趋势报告
- 2025年河南体育学院马克思主义基本原理概论期末考试笔试题库
- 买房分手协议书范本
- 门窗安装专项施工方案
- 招聘及面试技巧培训
- 贵州兴义电力发展有限公司2026年校园招聘考试题库附答案
- 2025年水果连锁门店代理合同协议
- 耐克加盟协议书
- 朱棣课件教学课件
- 农业推广计划课件
- 苏教版四年级数学上册期末考试卷(附答案)
- 第七章重介质选矿课件
评论
0/150
提交评论