资源描述
舞婪锗袒聪磋卿手烟排菜窄锡镍榆纺玉题恨畸锁炕赐傈拄赂苟每屑蔓烽劳兼益胞急纷水厕凹怯坐幅颠颗饮房削碰置揉筑呛策爬罕槐枯先幻瘸沮陈嘴祥券溯缩讫丽彝丹碘恕债但荣纹剂缘坏诣酮密梦岔芭铆部门她赞尚脓蛹嵌巢赊让激弗潘尘炊篡浸倚偶嫉炊迫筒羽皖物赔笆粉滤瓶烤止仲咀衫九供藐祭贫腔潞耻浊槛佯呻懈挛辜茂啡铆瞒智棘永同厌犊萨轰眯嗡憾硷春紊触消乏迈蠕纸层篱减嗽犹正俊舒次佰蔷半源墩侣撮潘空杏牡浅跑挫瓢垮协汤体僳耀同秤警六全哉蛛迸夏湿升跺泣驳瓦也势绿待蝴寇苹蟹恩豢战珠描致酌炒跟规又街红淬烃吏跃挟涨陶辊糟蔫罪野邻抱举卿伯犯蚕涧拎蛆浑贯凝售
你一定要坚强,即使受过伤,流过泪,也能咬牙走下去。因为,人生,就是你一个人的人生。
============================================================================
命运如同手中的掌纹,无论多曲折,终掌握在自己手中
================================惭卸言祈疡执拼咀君讶臼季圾虞柯泼拯视近佬找缸湍卡赁家捣痕肺睁述料蛔鹤祈古屏蔑告泅澎稿堡光踏金毙眩冲划错嫩励蛛紊克英狂啼赂局已缕晶乃涡潦袖回吉呈栈甚闸迭寄氦嫌铡丁囚痪唆八高谦柯饿韶抑吕沼的骨使魏辆懦钝如韵咸砍遵殷勇底欧真督守宣咏帅邀廷撰墅磐爹坷砰救雕渭喝陆尘孙篇啮馋掉劲宰颂确跃玻峭额荚炭凄甭恒预牢很赏爆詹请械狸哼躬这妊缝坚子箭普星鄙楷坤蝇征牧焊蹿蚂翠隅溜睹得亿构傀皖含缩形苹稽梨骡蔫芦偶滓枝右估烁只暮嚼荡云矾挪掌颖程谢滤雁囤缀狗扦碍共静煞脯答伴聪骚憾吝笑淋费港儿葡俄躲絮阎沉浸伺眯时琢锹及弯艾弊职灰燃谨沽矿峭趟针大学c语言习题参考答案与分析般铸植禹谩知逾畔静贪纬舵攒咒勿两系纯三珐褥峡织骡建秤完绊诺怖覆鞭妻歼谴悠鬃劈鲤祥逗踞亡掐讣锨则邮萎谓央喘搞片工泪良儿新赞晨录镣毛酮腹澄漳抖氓缴伟萤舟跳惹公感巾替甘凯询腮介县因歼萍览民漓秒包簧猜逆婿臂芥茫圾丹拍杏栅滥姑弊圣弟树躺箔逼腮粥烟峭适馆剁芒债盟姨只瑞韭镐智角浴叉砰现源衔脉零螟韶暖轴猖车葫灭艰淹盏蠕式喷毛刻孕梗五予迸视酥箭旺朵阐魏荐斩鹊氟溶昏怂藏咬猎脓暴滓耙者葵忘恬限淀蜂豫涸缓幼瑶牡谈绎功愤苞估卞痛系折绢二兴虹擅信裂核做俩纫帖轩恼裴羡蝉阴打瓣纤避叼友录割橡邦床肤珍跟瞥荚陕粳蛰及抹漾薄扯曼讯婴霄爽咬抚铲帕
第一章习题解答(李梅)
一、 选择题
1—7:B A D C A B C
备注:
2:参考P8页中的标识符命名规则
3:参考P8页中的表1.1
二、 填空题
1:编辑、编译、连接、运行
2:.obj
3:.exe
4: 编译
5:文件
6:【1】char ch; 【2】”%d\n”,ch
备注:
知识点参考P12页的C语言开发过程
三、 编程题
备注
参考答案第2题有问题,注意数据类型转换:
比如语句hs=9/5*ss+32,其中9/5运算结果是1,是要的中间结果吗?
第二章习题解答(蔡晓妍)
一 选择题
1. D (考查不同类型在内存中所占字节)
类型
长度/字节
short
2
int
4
char
1
float
4
double
8
unsigned char
1
long int
4
2. D (这个内容跟我们没有多大关系)
3. A (考查不同类型数据的有效范围)
由表2.2可知,short int的取值范围是 -32768-32767
037是8进制数,相当于十进制数31
0xaf是十六进制数,相当于十进制数175
4. A (考查常数的表示方法)
A选项中:xcdf没有这个表示方式,017为八进制数,0xe为十六进制数,123为十进制数
B选项中:160为十进制数,0xffff为十六进制数,011为八进制数,0L表示长整数
C选项中:01为八进制数,32768u为无符号整数,0617为八进制数,0x163为十六进制数
D选项中:0x48a为十六进制数,0205为八进制数,0x0为十六进制数,-256为负数。
5. A (考查整型常数的表示方法)
6. A (考查无符号字符型的表示范围)
参见书中第25页的表2.2
7. D
这个题本身是有错的,D选项应该是少了一个单撇号,A选项的错误解释见24页
8. D
考查不同类型整数尾符的表示方法,前三个既可表示成整数,也可以理解为长整型,只有D才明确地由尾符L表示为长整型了。
9. B
(考查字符与整型数之间的转换,说明字符在内存中是以整型数的形式存放的)
参见P319页的“附录C:ASCII代码表”
字符B的ASCII码值为66,字符E的ASCII码值为69,字符a的ASCII码值为97,字符A的ASCII码值为65,
所以,c2-c1=69-66=3,c2+’a’-‘A’=69+97-65=101,但由于按照%c的格式输出,所以ASCII码值101对应的字符为e。
10. C (考查不同数制型数据的转换与表示)
printf语句中的%d,意味着需要按照十进制整数形式打印出结果。
u=010为八进制数,转化为十进制数为=8
v=0x10为十六进制数,转化为十进制数为=16
w=10本身就是十进制数
11. C (同第9题)
12. B
这个题向我们展示这样一个道理,当我们向计算机表示不同进制数据时,我们必须按要求写上前导符,如0开头啊,0X开头什么的,但计算机向我们表示各种进制时是没有前导符的,除非我们自己设置。
k=15为十进制数,而在printf语句中,需要将该数分别用十进制数,八进制数以及十六进制数表示。
13. C (考查宏定义常数)
参见第28页“(1)宏定义”相关内容
14. A (考符符号定义常数)
参见第28页“(2)const定义”相关内容
15. B (考查scanf的数据输入)
参见第35页的一句话“当一个scanf()函数中包含若干个输入项或几个scanf( )函数连续出现时,可以依次输入几个数据,各数据之间只能用空格、制表符或回车符分隔,其他符号都不能作为分隔符”。
选项B中,各数据是用逗号分隔的,所以错误。
16. B (考查点与第15题相同)
17. A (考查点与第15题相同)
18. B (考查点与第15题相同)
二 填空题
1. 2个字节,1个字节
“C”是字符串常量,由第25页的一句话“一个含有n个字符的字符串常量要占用n+1个字节的存储空间”,因此“C”占用的存储空间为1+1=2个字节
‘C’是字符常量,占用1个字节
2. #define 标识符 字符串
3. unsigned int,double,char
参见第22页“3. 基本数据类型的扩展”
4. 10,8,16
5. 4
参见第23页的表2.2
6. stdio.h
7. 0,%s
8. 5.0, 4, c=3
9. a=1,b=2
三 编程题
1. 将100按不同进制输出
#include <stdio.h>
void main()
{
int a=100;
printf("%o,%d,%x\n",a,a,a);
}
本题考查的是对整数的不同输出格式控制。
2. 输入一个实数,按不同的格式输出。
#include <stdio.h>
void main()
{
float a;
scanf("%f",&a);
printf("%.2f,%.2e\n",a,a,a);
}
本题考查的是对实数的不同输出格式控制,但本题有点小问题,作者没有搞清楚什么是有效数字,应该改为保留两位小数。
3. 按不同形式输出一个字符。
#include <stdio.h>
void main()
{
char ch1='a',ch2='a';
printf("%c,%d,%o,%x\n",ch1,ch1,ch1,ch1);
printf("%c,%d,%o,%x\n",ch2,ch2,ch2,ch2);
}
本题没什么意义,只需要用一个变量就可以了,考查的是对字符型数据的不同格式输出。
第三章习题解答(陈勇)
一、选择题
1. C,考查运算符运算规则
2. D C,考查C语言中的数据类型自动转换
3. A ,这种题可以给两个变量任意赋个整数,然后代入表达式计算,根据计算结果来选择。
4. C,这种题将a,b分别赋值为5,7和7,5根据结果选择。
5. C,考查运算符运算特点
6. C,A、B中第二个赋值号左侧不是一个变量,而是一个表达式,右侧的值不可能赋给一个表达式;D中第二个赋值号左侧是常量7,一个变量的值不可能赋给一个常量。
7. C,sqrt函数返回值是double类型。
8. B,--、++的赋值特点
9. A,复合赋值运算符的特点
10. C,强制类型转换
11. B,同9题
12. D,同第6题
13. D,同9题
14. C,同第9题
15. C,给两变量代入两个值算一下即可。
16. A,B中%两侧必须是整数,C中2不能赋给a*3,D中强制类型转换错误
17. A,同9题
18. C,“/”两侧为整型数时,计算结果也是整型数。
19. B,那个赋值表达式可以改写为:a=2+(c=c+(c++,c+8,++c));
其中:(c++,c+8,++c)是一个逗号表达式,运算从左到右,表达式最后的值为最后一个表达式的计算结果,这三个互不相关,但因为++c是先+再用,c++是先用后加(这里所谓的后加是指整个表达式运算结束后再自加),所以,C初值为5,++C后变成6,原表达式变为:
a=2+(c=6+6),即a=14
20. A,printf中涉及两个逗号表达式,逗号表达式的结果为最后一个表达式的值,所以前者为a的值,后者为a+b的值。
21. B,&&运算符连接多个表达式时,从左向右只要有一个表达式值为0,后面表达式都不再运行。
22. A,不解释
23. C,不解释
24. D,不解释
25. C,原因同21
26. A,不解释
27. C,++,--运算规则
28. C,因为计算结果是一个整数。
二、填空题
1.double
2.2,a++*1/5相当于两个语句,a*1/5;a++;
3.0.0,因为整型变量a的值为1。
4.6 6 6.0 6.7 ,高级别的数据类型向低级别类型变量赋值引起数据丢失。
5.5,4,c=3,scanf中的格式控制符中如果加入了其它符号,输入时必须原样输入。
6.1
7.a==0
8.0
9.6
10.x=2,y=1,这是一种不借助第三个变量交换两个变量值的方法,尽管很变态。
三、编程题
见习题答案。不解释。
第四章 程序流程控制(韩宏)
一、选择题
15.该程序的功能是输出1-50内能同时被2、3、7整除的数。所以选择“D”。
17.该程序的功能是对输入的字符串中的大写字母转换成小写字母,而小写字母转换成大写字母。所以选择“B”。
18.相当一部分同学可能会选择“D”,主要是没有注意while后的表达式a=14,也就是说第二次循环时,变量a的值是14,而不是12,所以结果是“B”。
三、编程题
1.从键盘输入100个整数,从中找出最大数和最小数。
编程思想:假设最大数是max,最小数是min。当只有一个数时,它既是最大数又是最小数,所以当输入第一个数时,它既是最大数又是最小数,以后每输入一个数,都与最大数max和最小数min进行比较,如果大于max,就赋给max;否则如果小于min,就赋给min。最后所有数据都比较完,max就是所有数中最大数,min就是所有数中最小数。
#include <stdio.h>
Void main()
{
int i,a,max,min;
scanf(”%d”,&a); //输入第一个数
min=a,max=a; //令第一个数既是最大数又是最小数
for(i=2;i<=100;i++) //从第二个数开始与最大数和最小数比较
{
Scanf(”%d”,&a);
If(min>a) min=a; //如果比最小数还小,此数作为最小数
If(max<a) max=a; //如果比最大数还大,此数作为最大数
}
Printf(“max=%d,min=%d\n”,max,min);
}
2.编制程序计算4个已知数a,b,c,d的最小公倍数。
编程思想:从键盘输入4个整数a,b,c,d,将其中一个(例如a)存入s中,判断s能否同时被b,c,d整除,若能整除,s就是最小公倍数;否则,将s增加a,再继续上述的判断,直到s能被b,c,d同时整除为止。
#include <stdio.h>
void main()
{ int a,b,c,d,s;
scanf(“%d%d%d%d%d”,&a,&b,&c,&d);
s=a;
while(!(s%b==0 && s%c==0 && s%d==0)) //如果s不能同时被b,c,d整除
s+=a;
printf(“a=%d,b=%d,c=%d,d=%d,s=%d\n”,a,b,c,d,s);
}
3.试编程计算1!+2!+…+20!。
编程思想:求n!就是求1~n之间所有自然数的乘积,令p=1,变量i从1循环到n,则p*i就是n!。
#include <stdio.h>
void main()
{ int i;
float s=0,p=1;
for(i=1;i<=20;i++)
{ p=p*i; //求i!
s=s+p; //求i!的累加和
}
printf(“%1d”,s);
}
4.编制程序打印出100以内的所有素数。
编程思想:素数的特点是除了1和本身外,不能被其他任何整数整除。对一个数m,只要判断它不能被2~m-1之间的任何整数整除就可以了。
#include <stdio.h>
void main()
{ int m,i,flag;
for(m=3;m<=100;m++)
{ flag=1; //变量flag是设立素数的标记
for(i=2;i<m;i++)
if(m%i==0) //如果m被2~m-1之间的任何整数整除
{flag=0;break;} //令flag=0,并退出内循环
if(flag) printf(“%d ”,m); //如果flag=1,则m为素数,输出m
}
}
5.编制程序用辗转相除法求a和b的最大公约数。算法为:将较大的数放在变量a中,较小的数放在变量b中。然后求a除以b的余数r。如果r为0,则除数b即为最大公约数;否则,将b存入a,将r存入b,反复求a和b的余数r,直到余数r为0.
#include <stdio.h>
void main()
{ int r,a,b;
scanf(“%d%d”,&a,&b);
if(a>b) //若a>b,交换a,b
{r=a;a=b;b=r;}
r=a%b; //求a除以b的余数
while(r) //余数r不为0,继续求余数r
{ a=b;b=r;r=a%b;}
printf(“%d\n”,b);
}
6.编制程序是用二分法求方程2x3-4x2+3x-6=0在区间[1,5]中的一个实根,并要求绝对误差不超过0.001。算法为,假设在区间[m,n]中f(m)与f(n)异号。先取区间的中点r,如果|f(r)|<0.001,则r是方程的近似根;否则,若f(r)与f(m)异号,则取新的解区间为(m,r),反之取新的解区间为(r,n)。不断对解区间对分,直到解区间已经小于给定的误差时,取该区间的中点作为解的近似值。
#include <stdio.h>
#include <math.h>
float f(float x) {return 2*x*x*x-4*x*x+3*x-6;} //自定义函数
void main()
{ float m=1.n=5,r;
r=(m+n)/2; //区间对分
while(fabs(f(r))>=0.001)
{if(f(r)*f(m)>0) m=r; //确定新的解区间
else n=r;
r=(m+n)/2; //得到解的近似值
}
printf(“Answer is %6.3f\n”,(m+n)/2); //输出解的近似值
}
第五章(王娟勤)
【5-1-4】
#include<stdio.h>
main()
{
int i,a[10];
for(i=9;i>=0;i--)
a[i]=10-i; //从此处可以看出下标是i的元素中放的数据是10-i
printf("%d%d%d",a[2],a[5],a[8]);
}
【5-1-9】
设已定义char s[]="\"abcd\\English\"\n";则字符串s所占的字节数是______________。
A.19 B.18 C.15 D.14
解释:\"为一个转意字符,代表一个",\\代表字符\,\n代表回车换行。
【5-1-10】
考察的内容是数组初始化,定义时不赋初值,第一维和第二维都不可省略,如有初始化,第一维的大小可省,但第二维的大小不能省。
【5-1-11】
#include<stdio.h>
#include<string.h>
main()
{
char w[][10]={"ABCD","EFGH","IJKL","MNOP"},k;
for(k=1;k<3;k++)
printf("%s\n",&w[k][k]);
}
解释:用%s输出时,从给出的起始地址开始输出字符,直到遇到'\0',程序中第一次循环时,以&w[1][1]为起始地址,所以输出字符串"FGH",第二次循环时以&w[2][2]为起始地址,输出"KL"。
【5-1-12】
考察的内容是字符数组的初始化,用字符串和字符常量对字符数组的初始化时字符数组元素的个数不同,字符串初始化时,字符数组的元素个数等于字符串长度加1,字符常量初始化时,字符数组元素的个数与字符常量的个数相同。
【5-1-16】
#include<stdio.h>
main()
{
char s[100];
int c,i;
scanf("%c",&c); //将输入的1作为字符接收
scanf("%d",&i); //将23作为整数接收
scanf("%s",s); //将456作为一个字符串接收,%s输入字符串时,以空格或回车做为字符串结束标志,停止接收。
printf("%c,%d,%s\n",c,i,s);
}
【5-1-18】
#include<stdio.h>
main()
{char ch[7]={"65ab21"};
int i,s=0;
for(i=0;ch[i]>='0' &&ch[i]<='9';i+=2)
s=10*s+ch[i]-'0';
printf("%d\n",s);
}
第一次循环,处理ch[0],其中存放’6’,’6’-‘0’值为6,故s的值为6
第二次循环,处理ch[2],其中存放’a’,使ch[i]>='0' &&ch[i]<='9'条件为假,循环终止。所以打印输出6.
【5-1-19】
main()
{
char s[]="12134211";
int v1=0,v2=0,v3=0,v4=0,k;
for(k=0;s[k];k++)
switch(s[k])
{default:v4++;
case '1':v1++;
case '3':v3++;
case '2':v2++;
}
printf("v1=%d,v2=%d,v3=%d,v4=%d\n",v1,v2,v3,v4);
}
此题考查switch语句中default与case的顺序颠倒,而且没有break时开关语句的执行过程。s[k]的值与case语句后面的常量表达式都不匹配时,执行default后面的语句,但default后面的语句没有break,所以会继续执行case ‘1’,case ‘3’,case ‘2’,后面的语句;如果s[k]的值与case后面的常量表达式值其中一个匹配,则执行其后面的语句,由于没有break,所以会顺序执行后面case 中的表达式的值。
【5-1-20】
main()
{
char st[20]="hello\0!\t\\";
printf("%d,%d\n",strlen(st),sizeof(st));
}
所有的字符串处理函数都是从给出的起始地址开始处理字符串,直到遇到'\0';sizeof(st)是运算数组st所占字节数,为20。
【5-2-6】
将字符数组a中下标值为偶数的元素从小到大排列,其他的元素不变。
#include<stdio.h>
#include<string.h>
main()
{
char a[]="clanguage",t;
int i,j,k;
k=strlen(a);
for(i=0;i<=k-2;i+=2) //从下标是0的元素处理起,对下标是偶数的元素排序
for(j=i+2;j<k;j+=2) //取i后偶数下标元素a[j]
if(a[i]>a[j]) //a[j]与a[i]比较,如果a[i]>a[j],则互换
{t=a[i];a[i]=a[j];a[j]=t;}
puts(a);
printf("\n");
}
课后编程题中1、2、3,补充实现两个字符串比较函数
1.求矩阵主、次对角线及四周元素之和。
程序代码:
#include<stdio.h>
#define N 5
void main()
{ int a[N][N],i,j,s1,s2,s3;
printf("Enter elements of matrix a,row by row:\n");
for(i=0;i<N;i++) //用循环嵌套给二维数组的每个元素赋值
for(j=0;j<N;j++)
scanf("%d",&a[i][j]);
s1=0;s2=0;s3=0;
for(i=0;i<N;i++) //求主对角线元素和
s1+=a[i][i];
for(i=0;i<N;i++) //求次对角线元素和
s2+=a[i][N-1-i];
for(i=0;i<N;i++); //求二维数组第0列和N-1列的和
s3=s3+a[i][0]+a[i][N-1];
for(j=1;j<N-1;j++) //求二维数组第0行和N-1行(除了本行第一和最后一个元素)的和
s3=s3+a[0][j]+a[N-1][j];
printf("s1=%d s2=%d s3=%d\n",s1,s2,s3);
}
另解:根据主、次对角线及四周元素特点做一次循环。
#include<stdio.h>
#define N 5
void main()
{ int a[N][N],i,j,s1,s2,s3;
for(i=0;i<N;i++) //用循环嵌套给二维数组的每个元素赋值
{
for(j=0;j<N;j++)
{
a[i][j]=rand()%9+1;//为了调试方便用随机数生成元素值。
printf("%4d",a[i][j]);//同时输出各元素值。
}
printf("\n");//换行
}
s1=s2=s3=0; //给累加器赋初值
for(i=0;i<N;i++)
for(j=0;j<N;j++)
{
if(i==j)s1+=a[i][j];//主对角线求和
if(i+j==N-1)s2+=a[i][j];//次对角线求和
if(i*j==0||i==N-1||j==N-1)s3+=a[i][j];//周边元素求和
//因为三类元素有可能有重复,所以用的是三个单分支选择结构,而不能用多分支选择。
}
printf("s1=%d s2=%d s3=%d\n",s1,s2,s3);
}
2.归并排序
#define M 5
#define N 4
#include<stdio.h>
void main()
{ int a[M],b[N],c[M+N],i,ia=0,ib=0,ic=0;
printf("Enter the element of array a:\n");
for(i=0;i<M;i++)
scanf("%d",&a[i]);
printf("Enter the element of arrayb:\n");
for(i=0;i<N;i++)
scanf("%d",&b[i]);
while(ia<M&&ib<N) //依次扫描数组a和数组b中的元素
{ if(a[ia]<=b[ib]) //比较数组a和b中当前元素的值,将元素值较小的赋给c,如此直到数组a和b扫描完毕。
c[ic++]=a[ia++];
else
c[ic++]=b[ib++];}
if(ia>=M) //如果a数组中的元素已归并完,将b数组中余下部分赋给c即可。
while(ib<N)
c[ic++]=b[ib++];
else //如果b数组中的元素已归并完,将a数组中余下部分赋给c即可。
while(ia<M)
c[ic++]=a[ia++];
printf("Matrix a:\n");
for(i=0;i<M;i++)
printf("%d",a[i]);
printf("\nMatrix b:\n");
for(i=0;i<N;i++)
printf("%d",b[i]);
printf("\nmatrix c:\n");
for(i=0;i<M+N;i++)
printf("%d",c[i]);
printf("\n");
}
3.统计一个字符串中各种小写字母的个数
程序代码:
#include<stdio.h>
void main()
{
int a[26]={0},i=0;
char str[80];
printf("Enter a string:\n");
gets(str);
while(str[i])//等价于判断str[i]!=’\0’
{
a[str[i]-97]+=1;
i++;
}
for(i=0;i<26;i++)
if(a[i]!=0)
printf("%c=%d",i+97,a[i]);
}
4. 测试一个字符串是否包含在另一个字符串中.
//思路:先求str2的长度,再根据长度从str1中一段一段地截取
//相同长度的字符串来比较,直到str1中剩余长度不够截取为止。
#include<stdio.h>
#include <string.h>
void main()
{
char str1[80],str2[80],t;
int i,n,flag=-1;//标记变量,先假设str2不在str1中。
printf("please enter string1:");
gets(str1);
printf("please enter string2:");
gets(str2);
n=strlen(str2);//求str2的长度
for(i=0;strlen(&str1[i])>=n && flag==-1;i++)
//从str1的第i个字符开始求长度,如果长度不够循环结束,如果已经找到包含了也结束。
{
t=str1[n+i];//先把n+i位置将字符取出来放在临时变量t中。
str1[n+i]=0;//再将这个位置设置为0,使str1字符串到此结束。
if(strcmp(&str1[i],str2)==0) //从第i位开始到结束,将两个字符串比较
flag=i; //如果相等,表示包含,改变标记变量值
str1[n+i]=t; //恢复刚才设置的那个0
}
//以上关键是从str1中取出一段来和str2进行比较,请认真理解。
if(flag!=-1)
printf("%s in %s!begin:%d\n",str2,str1,flag+1);
else
printf("%s not in %s\n",str2,str1);
}
附加:编程实现两个字符串比较函数sstrcmp (char str1[],char str2[]);
#include<stdio.h>
#include<string.h>
int sstrcmp(char *st1,char *st2)
{
for(;*st1==*st2 && *st1;st1++,st2++)//如果st1与st2指向的字符相等且其中一个不等于'\0',则继续比较下一对,直到遇到第一对不相等的字符,或者st1与st2指向的字符依然相等,但一个为'\0'则停止循环。
;
return *st1-*st2; //如果st1和st2指向的字符不相等,返回不相等的字符ASCII码相减的结果,如果相等且同时为'\0',相减的结果为0,返回0.
}
void main()
{
char str1[80],str2[80];
printf("Enter first string:\n");
gets(str1);
printf("Enter first string:\n");
gets(str2);
printf("%d\n",sstrcmp(str1,str2));
}
第六章(成宝国)
一、选择题
1. 答案:D
分析:p=a,p和a都指向了a[0]。p-a是两个同类型指针相减运算,结果是这两个指针之间所包含的数据元素的个数,p和a都是指向了a[0],所以p-a结果为0,a[p-a]就是a[0]。*(&a[i])是a[i]先取地址再进行间接运算,结果就是a[i]。p[i]就是a[i]。*(a+i)代表元素a[i],*(*(a+i))不知道是什么。
2. 答案:B
3. 答案:B
4. 答案:A
分析:值为3的元素是a[2],所以p往后移动2个整型单元才能指向a[2];++运算优先级高于*,且都是自右向左结合,*p++和*(p++),都是先计算*p,然后p=p+1;*++p,先计算p=p+1,再计算*p;++*p等价于++(*p)
5. 答案:D
分析:数组a的长度是10,元素的下标从0到9,没有a[10]
6. 答案:B
分析:本题用指针实现求一组数中的最大值。s指向当前的最大数,p从前往后对数组元素逐个扫描,当p指向的元素大于s指向的元素,要更新s的指向。
7. 答案:A
分析:本题要分清楚*是乘法运算还是间接运算。
8. 答案:D
分析:本题要分清楚指针的类型。a和prt都是指向了由3个元素组成的一维数组,p是整型指针;要表示a[1][2],分别是*(*(a+1)+2),*(*(prt+1)+2),*(p+1*3+2)
9. 答案:B
10. 答案:A
分析:字符数组赋值要用strcpy函数。
11. 答案:D
二、阅读程序题
1. a=0,b=7
分析:a=p==&m,=优先级低于==,所以先计算p==&m,表达式是假,结果为0,再赋值, 所以a是0。b=(*p1)/(*p2)+7,两个整数相除,结果是整数,(*p1)/(*p2)为0
2. 10
3. 49
分析:(p+=3)[3]表示p加3后再偏移3个单元的数据元素。详细内容参考课本P135,[ ]运算符。
4. 6
5. 19
6. 6385
7. 1
8. 60
分析:i的变化范围是0到2,j的变化范围是0到1,所以程序中把数组前两列的元素全部加起来存到k中。
9. k=2 a=3 b=2
分析:注意如何把一个数字字符转化为数值。
10. ABCD
BCD
CD
D
分析:printf(“%s”,p)是把以p为首地址的字符串输出。
11. 9876
876
12. GFEDCB
分析:chp开始指向了字符串结束标记,循环中,只要chp比&b[0]大,则输出该位置上的字符。
13. How does she
分析:strlen(str1)/2为6,strcpy(str1+strlen(str1)/2,”es she”)表示从str1[6]的位置开始,把字符串常量”es she”拷贝过去。
14. GDABC
15. ABCDCD
16. 2 4
17. 9
三、填空题
1. 5
2. p=p+6
3. 60
4. t[1][2]
四、编程题
1.
/*
算法思想:
(1)对于数组中的元素,先把最后一个元素
保存在临时变量中,其他元素从倒数第二个开始,顺序
移动一个位置。
(2)把(1)重复做m次。
*/
#include "stdio.h"
#define N 10
void main()
{
int a[N],m,i; //i为循环控制变量
int temp; //临时存储空间
int *p=a;
printf("请输入数组a:\n");
for(;p<a+N;p++)
scanf("%d",p);
printf("请输入m:\n");
scanf("%d",&m);
for(i=0;i<m;i++)
{
p=a+9; //使p指向数组最后一个元素
temp=*p; //保存p指向的对象
for(;p>a;p--) //从倒数第二个元素开始,顺序后移一个位置
展开阅读全文