第一篇:C语言习题(详细解答)
程序设计基础(C语言版)习题
第01章 一.选择题
1.以下叙述中正确的是________。
A)程序设计的任务就是编写程序代码并上机调试 B)程序设计的任务就是确定所用数据结构 C)程序设计的任务就是确定所用算法 D)以上三种说法都不完整
【解析】 程序设计通常分为问题建模、算法设计、编写代码和编译调试四个阶段。所以选项A)、B)、C)说法都不完整。2.以下关于简单程序设计的步骤和顺序的说法中正确的是。A)确定算法后,整理并写出文档,最后进行编码和上机调试
B)首先确定数据结构,然后确定算法,再编码,并上机调试,最后整理文档 C)先编码和上机调试,在编码过程中确定算法和数据结构,最后整理文档 D)先写好文档,再根据文档进行编码和上机调试,最后确定算法和数据结构
【解析】设计一个能解决实际问题的计算机程序需要经过以下几个过程:① 建立模型。② 算法设计:给出解决问题的步骤,即算法。③ 算法表达:选择一种表达算法的工具,对算法进行清晰的表达。④ 编写程序:选择一种程序设计语言,把以上算法程序化,这称为编写程序。⑤ 程序调试:对编写好的程序进行调试,修改程序中的错误。⑥ 程序文档编写与程序维护。综上所述,B)选项是符合上述描述的,其他选项不恰当。3,叙述中正确的是________。A)C程序的基本组成单位是语句 B)C程序中的每一行只能写一条语句 C)简单C语句必须以分号结束 D)C语句必须在一行内写完
【解析】函数是C程序的基本组成单位;C语言书写风格很自由,不但一行可以写多个语句,还可以将一个语句写在多行中。故本题答案为C)。4.以下叙述中正确的是。
A)C程序中的注释只能出现在程序的开始位置和语句的后面 B)C程序书写格式严格,要求一行内只能写一个语句 C)C程序书写格式自由,一个语句可以写在多行上 D)用C语言编写的程序只能放在一个程序文件中
【解析】在C语言中,注释可以加在程序中的任何位置,选项A)错误。C程序可以分模块写在不同的文件中,编译时再将其组合在一起,选项D)错误。C程序的书写风格很自由,不但一行可以写多个语句,还可以将一个语句写在多行中。所以正确答案为选项C)。
5.以下关于C语言的叙述中正确的是。
A)C语言中的注释不可以夹在变量名或关键字的中间 B)C语言中的变量可以在使用之前的任何位置进行定义
C)在C语言算术表达式的书写中,运算符两侧的运算数类型必须一致 D)C语言的数值常量中夹带空格不影响常量值的正确表示
【解析】C语言中注释可以放在任何位置,但不能夹在变量名或关键字中间,选项A正确;C语言中的变量要在使用之前定义,C标准规定定义位置在相关程序块的首部,选项B错误;C语言中两侧数据类型可以不一致,系统可进行强制类型转换,选项C错误;C语言数值常量中不允许存在空格,选项D错误。6.以下关于C语言数据类型使用的叙述中错误的是。A)若要准确无误差地表示自然数,应使用整数类型 绪论
B)若要保存带有多位小数的数据,应使用双精度类型
C)若要处理如“人员信息”等含有不同类型的相关数据,应自定义结构体类型 D)若只处理“真”和“假”两种逻辑值,应使用逻辑类型
【解析】C语言中没有逻辑类型,若只处理“真”或“假”两种逻辑值,可以使用整型数“1”或“0”表示,故选D。第02章 一.选择题
1.有以下定义:int a;long b;double x,y;则以下选项中正确的表达式是。A)a%(int)(x-y)
B)a=x!=y;
C)(a*y)%b
D)y=x+y=x
【解析】A)选项中如果x与y的值相等那么取余时就会有除数为0的情况。C)选项中取余的两个数据都应为整数,不能有一方为实型变量,而a*y的结果为double型。D)选项表达式本身就错误,不能给表达式赋值。所以,本题答案为B)。2.有以下程序
#include
s=sizeof(A); t=sizeof(B);
printf(“%d,%dn”,s,t); } 在VC6平台上编译运行,程序运行后的输出结果是 A)2,4
B)4,4
C)4,8
D)10,6
【解析】sizeof的作用就是返回一个对象或者类型所占的内存字节数。在VC6中整型占4个字节,双精度实型占8个字节,所以选C)。
3.若有定义:double a=22;int i=0,k=18;,则不符合C语言规定的赋值语句是。A)a=a++,i++;
B)i=(a+k)<=(i+k);C)i=a%11;
D)i=!a;
【解析】C语言中取余运算符两侧的操作数只能是整型(若为char型,则会自动转换成整型)。4.有以下程序:
#include
printf(“%d,”,b=a+b);
printf(“%dn”,a=2*b);} 程序运行后的输出结果是________。A)0,0
B)1,0
C)3,2
D)1,2
【解析】 执行第一个printf语句时,b=a+b=1,所以输出1,执行第二个printf语句时,a=2*b=2,所以输出结果为2。5.若有定义语句:int a=3,b=2,c=1;,以下选项中错误的赋值表达式是。A)a=(b=4)=3; B)a=b=c+1;
C)a=(b=4)+c;
D)a=1+(b=c=4); 基本数据类型
【解析】在A)选项中,赋值语句b=4先把4赋值给整型变量b,之后执行(b=4)=3是把常量3赋值给常量4,但是由于C语言规定赋值运算符的左侧只能是变量,不能是常量或者表达式,因此A)选项错误。6.有以下定义:int a;long b;double x,y;则以下选项中正确的表达式是。A)a%(int)(x-y)
B)a=x!=y;
C)(a*y)%b
D)y=x+y=x
【解析】A)选项中如果x与y的值相等那么取余时就会有除数为0的情况。C)选项中取余的两个数据都应为整数,不能有一方为实型变量,而a*y的结果为double型。D)选项表达式本身就错误,不能给表达式赋值。所以,本题答案为B)。
7.若有定义语句:int x=10;,则表达式x-=x+x的值为________。A)-20
B)-10
C)0
D)10
【解析】 x-=x+x可化为:x=x-(x+x),由于x初始值为10,所以计算后,x=10-20=-10,因此选B)。二.填空题
1.以下程序的功能是:将值为三位正整数的变量x中的数值按照个位、十位、百位的顺序拆分并输出。请填空。
#include
参考答案:x%10 【解析】x=256,x%10=6。
2.以下程序运行后的输出结果是。
#include
a=(int)((double)(3/2)+0.5+(int)1.99*2); printf(“%dn”,a);
}
参考答案:3 【解析】本题中3/2=1,(double)(3/2)=1,(int)1.99*2=1*2=2,因此(int)(1+0.5+2)=(int)3.5=3。3.若有定义语句:int a=5;,则表达式:a++的值是____。
参考答案:5 【解析】 a++的含义是在使用a值以后,使a值加1,所以a++的值为5。4.若有语句double x=17;int y;,当执行y=(int)(x/5)%2;之后y的值为____。
参考答案:1 【解析】 y=(int)(x/5)%2=(int)(3.4)%2=3%2=1。
5.设变量a和b已正确定义并赋初值。请写出与a-=a+b等价的赋值表达式 ____。
参考答案:a=-b 【解析】a-=a+b等价于a=a-(a+b),等价于a=-b。第03章 一.选择题 1.有以下程序
#include
则输出结果是
A)1234
B)12
C)12
D)12
【解析】程序根据用户输入分别给字符型变量a、b、c、d赋值为'1'、'2'、'
char ch; int k; ch=′a′; k=12;
printf(“%c,%d,”,ch,ch,k); printf(“k=%dn”,k);
已知字符a的ASCII码值为97,则执行上述程序段后输出结果是 A)因变量类型与格式描述符的类型不匹配输出无定值 B)输出项与格式描述符个数不符,输出为零或不定值 C)a,97,12k=12 D)a,97,k=12
【解析】输出格式控制符%c表示将变量以字符的形式输出;输出格式控制符%d表示将变量以带符号的十进制整型数输出。所以第一个输出语句输出的结果为a,97,第二个输出语句输出的结果为k=12,所以选项D)为正确答案。3.有以下程序
#include
scanf(“%s”,a); gets(b);
printf(“%sn%sn”,a,b); } 程序运行时若输入:
how are you? I am fine <回车> 则输出结果是 A)how are you?
I am fine B)how
are you? I am fine C)how are you? I am fine
D)how are you?
解析】scanf函数会把空格字符作为输入的字符串之间的分隔符,因此字符串a为“how”。gets()函数读取字符串时,直至接受到换行符或EOF时才停止,并将读取的结果存放在指针所指向的字符数组中,因此其余输入的内容赋值给b。二.填空题
1.以下程序运行后的输出结果是。
#include
printf(“%d%dn”,a,b); }
参考答案:2008 【解析】整型变量a的值为200,b的值“010”是用八进制表示的“10”即十进制的“8”,最后输出格式均为%d,即十进制格式,所以输出为“2008”。
2.有以下程序(说明:字符0的ASCIl码值为48)#include
scanf(“%d”,&c1); c2=c1+9;
printf(“%c%cn”,c1,c2); } 若程序运行时从键盘输入48<回车>,则输出结果为。
参考答案:09 【解析】本题中通过ASCII码对字符变量赋值,由于字符0的ASCII码是48,因此字符变量c1为0,c2的ASCII码比c1大9,因此c2为9。第04章 一.选择题
1.若变量已正确定义,在if(W)printf(“%dn”,k);中,以下不可替代W的是。A)a<>b+c
B)ch=getchar()
C)a==b+c
D)a++
【解析】在C语言中,表示不等于不能用“<>”,而只能使用“!=”。其他选项均满足题目的要求。2.当变量c的值不为2、4、6时,值也为“真”的表达式是。A)(c==2)||(c==4)||(c==6)B)(c>=2&& c<=6)||(c!=3)||(c!=5)C)(c>=2&&c<=6)&&!(c%2)D)(c>=2&& c<=6)&&(c%2!=1)
【解析】满足表达式(c>=2&& c<=6)的整型变量c的值是2,3,4,5,6。当变量c的值不为2,4,6时,其值只能为3或5,所以表达式c!=3和c!=5中至少有一个为真,即不论c为何值,选项B)中表达式的值都为“真”。正确答案为B)。3.已知字母A的ASCII码值为65,若变量kk为char型,以下不能正确判断出kk中的值为大写字母的表达式是。A)kk>=′A′&& kk<=′Z′ B)!(kk>=′A′||kk<=′Z′)C)(kk+32)>=′a′&&(kk+32)<=′Z′ D)isalpha(kk)&&(kk<91)
【解析】C语言的字符以其ASCII码的形式存在,所以要确定某个字符是大写字母,只要确定它的ASCII码在'A'和'Z'之间就可以了,选项A)和C)符合此要求。在选项D)中,函数isalpha用来确定一个字符是否为字母,大写字母的ASCII码值的范围为65到90,所以如果一个字母的ASCII码小于91,那么就能确定它是大写字母。本题答案选B)。4.有以下程序:
#include < stdio.h>
main()
{ int a=l,b=2,c=3,d=0;
if(a==l && b++==2)
if(b!=2||c--!=3)
printf(“%d,%d,%dn”,a,b,c);
else printf(“%d,%d,%dn”,a,b,c); 选择结构
else printf(“%d,%d,%dn”,a,b,c);
} 程序运行后的输出结果是________。A)1,2,3 B)1,3,2 C)l,3,3 D)3,2,1
【解析】 程序首先执行第一个判断语句,a==1成立;b++==2,先判断b是否为2,再进行b加1操作,执行后b的值为3。继续执行第二个判断语句,注意程序此时进行逻辑或运算,b!=2的值为真,因此条件表达式b!=2||c--!=3的值为真,程序便不再执行第二个逻辑语句c--!=3,而直接进行输出操作。因此,本题正确答案为C)。5.执行以下程序段后,w的值为________。
int w='A',x=14,y=15;
w=((x‖y)&&(w<'a')); A)-1
B)NULL C)1
D)0
【解析】根据题目所给条件可知,x||y为1,w<'a'为1,1&&1结果为1。因此正确答案为C)。6.若变量已正确定义,有以下程序段:
int a=3,b=5,c=7;
if(a>b)a=b; c=a;
if(c!=a)c=b;
printf(“%d,%d,%dn”,a,b,c); 其输出结果是 A)程序段有语法错 B)3,5,3 C)3,5,5 D)3,5,7
【解析】两个if语句的判断条件都不满足,程序只执行了c=a这条语句,所以变量c的值等于3,变量b的值没能变化,程序输出的结果为3,5,3。所以正确答案为选项B)。7.有以下程序段:
int a,b,c;
a=10; b=50; c=30;
if(a>b)a=b,b=c; c=a;
printf(“a=%d b=%d c=%dn”,a,b,c); 程序的输出结果是________。A)a=10 b=50 c=10
B)a=10 b=50 c=30 C)a=10 b=30 c=10
D)a=50 b=30 c=50
【解析】该题考查if条件语句,当条件为真时,将b值赋给a,c值赋给b;当条件为假时,将a值赋给c。该题中if条件为假,所以将a的值赋给c,故a=10 b=50 c=10。8.有以下程序:
#include
main(){ int x=1,y=2,z=3;
if(x>y)if(y else printf(“%d”,++y); printf(“%dn”,x++); } 程序的运行结果是________。A)331 B)41 C)2 D)1 【解析】该题目考查if条件语句。else语句和最近的一个if语句配对。由于x>y为假,所以直接执行最后一行代码。9.有以下程序: #include switch(x) { case 1: switch(y) { case 0: a++; break; case 1: b++; break; } case 2:a++; b++; break; case 3:a++; b++; } printf(“a=%d,b=%dn”,a,b); } 程序的运行结果是 A)a=1,b=0 B)a=2,b=2 C)a=1,b=1 D)a=2,b=1 【解析】本题考查了 switch结构的内容。在C语言中,程序执行完一个case标号的内容后,如果没有break语句,控制结构会转移到下一个case继续执行,因为case 常量表达式只是起语句标号作用,并不是在该处进行条件判断。本题程序在执行完内部switch结构后,继续执行了外部switch结构的 case 2分支。最后a和b的值分别为2和1。二.填空题 1.在C语言中,当表达式值为0时表示逻辑值“假”,当表达式值为 时表示逻辑值“真”。 参考答案:非0 【解析】本题一定要明确一个概念,即:所有非0的数(并不只是“1”),在c语言中都表示逻辑值为“真”。 2.设x为int型变量,请写出一个关系表达式__ ,用以判断x同时为3和7的倍数时,关系表达式的值为真。 参考答案:(x%3==0)&&(x%7==0)【解析】x%3==0能保证x是3的倍数,x%7==0能保证x是7的倍数,(x%3==0)&&(x%7==0)能保证x是3的倍数并且 x是7的倍数。3.有以下程序 #include if(a==1) if(b!=2) if(c==3)d=1; else d=2; else if(c!=3)d=3; else d=4; else d=5; printf(“%dn”,d);} 程序运行后的输出结果是__。 参考答案:4 【解析】a==1为真,b!=2为假,c!=3为假,所以d=4。4.有以下程序 #include scanf(“%d”,&x); if(x>15)printf(“%d”,x-5); if(x>10)printf(“%d”,x); if(x>5)printf(“%dn”,x+5); } 若程序运行时从键盘输入12<回车>,则输出结果为。 参考答案:1217 【解析】本题中输入12时,第一条if的条件x>15不满足因此不执行,第二条if的条件x>10满足因此输出12,第三条if的条件x>5满足因此输出17。 5.以下程序运行后的输出结果是。 #include if(x==y)t=x;x=y;y=t; printf(“%d%dn”,x,y); } 参考答案:20 0 【解析】本题中if选择的条件x==y不满足,因此直接执行后面的x=y和y=t,则x的值为20,y的值为0。第05章 一.选择题 1.以下不构成无限循环的语句或语句组是 A)n=0; do{++n;}while(n<=0); 循环结构 B)n=0; while(1){n++;} C)n=10; while(n);{n--;} D)for(n=0,i=1;;i++) n+=i; 【解析】项A)中变量n的值,先自加1,再进行循环条件判断,此时循环条件n<=0不成立,跳出循环。所以正确答案为A)。2.有以下程序 #include while(y--); printf(“y=%dn”,y); } 程序执行后的输出结果是 A)y=0 B)y=-1 C)y=l D)while构成无限循环 【解析】当y减为1时判断while(y--),此时满足条件,但是y变成0。下次循环判断while(y--)时,因为y为0不满足条件跳出循环,但是此时也要执行y--,所以y变成了-1。打印输出时输出-1。3.有以下程序: #include do { if(i%3==1)if(i%5==2){ printf(“*%d”,i); break; } i++;} while(i!=0); printf(“n”); } 程序的运行结果是________。A)*7 B)*3*5 C)*5 D)*2*6 【解析】整个程序中只有对i增加的语句而没有对i减少的语句,所以2、3都不可能出现,选项B)和D)错误。而i=5时第一个if语句的表达式为假,所以选项C)也错误。4.以下程序段中的变量已正确定义: for(i=0;i<4;i++,i++) for(k=l;k<3;k++);printf(“*”); 程序段的输出结果是________。A)******** B)**** C)** D)* 【解析】 本题考察for循环语句,注意第二个for语句的后面有一个分号,即printf函数不属于循环体,无论循环执行多少次,printf(“*”)语句只执行一次。因此,本题正确答案为D)。5.有以下程序 #include for(;a<8;a++){b+=a;a+=2;} printf(“%d,%dn”,a,b);} 程序运行后的输出结果是 A)9,18 B)8,11 C)7,11 D)10,14 【解析】初始值a=1,b=2,第一次循环:b=b+a=2+1=3,a=a+2=1+2=3,a=a+1=3+1=4;第二次循环:b=b+a=3+4=7,a=a+2=4+2=6,a=a+1=6+1=7;第三次循环:b=b+a=7+7=14,a=a+2=7+2=9,a=a+1=9+1=10,故本题答案选D。6.有以下程序: #include for(i=3;i>=1;i--) { for(j=1;j<=2;j++)printf(“%d”,i+j); printf(“n”); } } 程序的运行结果是________。A)2 3 4 B)4 3 2 4 5 4 3 C)2 3 D)4 5 4 5 3 【解析】该题目主要考查for嵌套循环,要注意循环变量i和j的取值范围。输出结果为变量i和j的和。8.设变量已正确定义,以下不能统计出一行中输入字符个数(不包含回车符)的程序段是________。A)n=0;while((ch=getchar())!='n')n++; B)n=0;while(getchar()!='n')n++; C)for(n=0;getchar()!='n';n++); D)n=0;for(ch=getchar();ch!='n';n++); 【解析】 A)项每进行一次循环判断一个字符是否为回车,如果不是就进行下一次判断,因此可以统计出输入字符个数;B)项与A)项的判断相似,仅为是否将读入的数据赋值给一个变量,因此并不影响判断结果;C)想用for循环来判断,与B)项的判断完全相同,可以统计出输入字符个数;D)项中ch=getchar()是给变量ch赋初值,如果输入回车,则程序只循环一次,如果输入一个非回车的字符,则程序进入死循环。因此,本题正确答案为D)。9.有以下程序 #include for(i=1;i<3;i++) { for(j=3;j>0;j--) {if(i*j>3)break; m*=i*j; } } printf(“m=%dn”,m);} 程序运行后的输出结果是 A)m=6 B)m=2 C)m=4 D)m=5 【解析】第一次循环i=1,j=3和j=2时都能执行m*=i*j,此时得到m的值为6;然后进行第二次循环i=2,j=3时会执行break语句,内部循环直接结束,此时i再加1,也会导致退出外部循环,所以最终结果m的值为6。10.有以下程序 #include scanf(“%d”,&s); while(s>0){ switch(s){ case 1:printf(“%d”,s+5); case 2:printf(“%d”,s+4);break; case 3:printf(“%d”,s+3); default:printf(“%d”,s+1);break; } scanf(“%d”,&s); } } 运行时,若输入123450<回车>,则输出结果是 A)6566456 B)66656 C)66666 D)6666656 【解析】switch语句执行完一个case后面的语句后,流程控制转移到下一个case语句继续执行,遇到break会跳出本次循环。本题中输入1时会输出65,输入2时会输出6,输入3时会输出64,输入4时会输出5,输入5时会输出6,在输入0时不满足循环条件,程序执行结束。11.有以下程序段 int i,n;for(i=0;i<8;i++){ n=rand()%5; switch(n){ case 1: case 3:printf(“%dn”,n);break; case 2: case 4:printf(“%dn”,n);continue; case 0: exit(0); } printf(“%dn”,n); } 以下关于程序段执行情况的叙述,正确的是 A)for循环语句固定执行8次 B)当产生的随机数n为4时结束循环操作 C)当产生的随机数n为1和2时不做任何操作 D)当产生的随机数n为0时结束程序运行 【解析】当产生的随机数n为1或2时,由于没有遇到break,因此程序将分别顺序执行case 3与case 4;当n为3时,程序输出n的值后跳出switch语句;当n为4时,程序输出n的值后将继续执行下一次循环;当n为0时,程序执行exit函数结束运行。二.填空题 1.有以下程序 #include int m,n; scanf(“%d%d”,&m,&n); while(m!=n) { while(m>n)m=m-n; while(m } printf(“%dn”,m);} 程序运行后,当输入14<空格>7<回车>时,输出结果是_____。 参考答案:7 【解析】执行while(m #include do{ b=b/2;a+=b; } while(b>1); printf(“%dn”,a);} 参考答案:5 【解析】 第一次循环执行后,b=3,a=4,满足条件b>1,循环继续;第二次循环执行后,b=1,a=5,不满足条件b>1,结束循环。所以输出的a值为5。3.有以下程序: #include f1=0;f2=1; printf(“%d %d ”,f1,f2); for(i=3;i<=5;i++) { f=f1+f2;printf(“%d”,f); f1=f2;f2=f; } printf(“n”); } 程序运行后的输出结果是____。 参考答案:0 1 123 【解析】 第一个printf语句输出结果为0 1。循环体总共循环三次,第一次循环结果为,f=1,f1=1,f2=1;第二次循环结果为f=2,f1=1,f2=2;第三次循环结果为f=3,f1=2,f2=3。4.若有定义:int k;,以下程序段的输出结果是____。 for(k=2;k<6;k++,k++)printf(“##%d”,k); 参考答案:##2##4 【解析】在for循环语句中,自变量k的自增表达式为k++,k++。这是一个逗号表达式,所以输出结果为##2##4。5.以下程序运行后的输出结果是____。 #include main() { int k=1,s=0; do{ if((k%2)!=0)continue; s+=k;k++; }while(k>10); printf(“s=%dn”,s); } 参考答案:s=0 【解析】continue语句用于跳出本次循环,直接进行下一次循环。进行if判断时k的值为1不能够被2整除,因此执行continue退出本次循环,不对s进行任何操作,直接进行循环条件判断,此时k的值为1不满足循环条件,退出while循环,输出s的值为0。第06章 一.选择题 1.下列选项中,能正确定义数组的语句是 A)int num[0..2008]; B)int num[];C)int N=2008; D)#define N 2008 int num[N]; int num[N]; 【解析】选项A不符合C语言的语法要求;选项B中没有指定数组的大小;选项C中数组大小不能用变量来指定。2.下列定义数组的语句中,正确的是。 A)int N=10; B)#define N 10 C)int x[0..10]; D)int x[]; int x[N]; int x[N]; 【解析】A)中的N是一个变量,不可以用变量来定义数组,所以选项A)错误。C)中把所有的下标均列出不正确,此处只需指明数组长度即可。D)中在定义时没有指明数组长度不正确,如果不指明长度就应在定义时对数组元素进行赋值,而此选项没有,所以错误。故本题答案为B)。 3.若要定义一个具有5个元素的整型数组,以下错误的定义语句是 A)int a[5]={0}; B)int b[]={0,0,0,0,0}; C)int c[2+3]; D)int i=5,d[i]; 【解析】在进行数组的定义时,不能使用变量对数组的长度进行定义。其他选项均符合数组定义标准。4.以下错误的定义语句是。 A)int x[][3]={{0},{1},{1,2,3}}; B)int x[4][3]={{1,2,3},{1,2,3},{1,2,3},{1,2,3}}; C)int x[4][]={{1,2,3},{1,2,3},{1,2,3},{1,2,3}}; 数组 D)int x[][3]={1,2,3,4}; 【解析】本题考查的是二维数组的定义和初始化方法。C语言中,在定义并初始化二维数组时,可以省略数组的第一维的长度,但是不能省略第二维的长度。故选项C)错误。 5.若有定义:int a[2][3];,以下选项中对a数组元素正确引用的是。A)a[2][!1] B)a[2][3] C)a[0][3] D)a[1>2][!1] 【解析】C语言中数组下标是从0开始的,所以二维数组a[2][3]的第一维下标取值为0、1;第二维的下标取值为0、1、2,因而选项A)、B)、C)都是错误的,选项D)表示的是数组元素a[0][0]。所以正确答案为D)。6.有以下程序: #include printf(“%d,%dn”,strlen(a),sizeof(a)); } 程序运行后的输出结果是________。A)7,4 B)4,10 C)8,8 D)10,10 【解析】 strlen()用来返回字符串的长度,而sizeof()返回的是一个对象或者类型所占的内存字节数,即数组所占的内存。二.填空题 1.以下程序运行后的输出结果是。 #include for(i=1;i<=4;i++){ n[i]=n[i-1]*2+1;printf(“%d”,n[i]);} printf(“n”); } 参考答案:13715 【解析】本题中已知n[0]为0,根据循环的执行可以得到n[1]为1,n[2]为3,n[3]为7,n[4]为15,因此输出结果是13715。2.有以下程序 #include for(i=l;i<=4;i++) {n[i]=n[i-1]*3+1;printf(“%d ”,n[i]);} } 程序运行后的输出结果是。参考答案:1 4 13 40 【解析】第一次循环结果为:n[1]=0*3+1,即n[1]的值为1,打印输出1 ;第二次循环结果为:n[2]=1*3+1,即n[2]的值为4,打印输出4 ;第三次循环结果为:n[3]=4*3+1,即n[3]的值为13,打印输出13 ;第四次循环结果为:n[4]=13*3+1,即n[4]的值为40,打印输出40。3.有以下程序 #include int a[3][3]={{1,2,3},{4,5,6},{7,8,9}}; int b[3]={0},i; for(i=0;i<3;i++) b[i]=a[i][2]+a[2][i]; for(i=0;i<3;i++) printf(“%d”,b[i]); printf(“n”);} 程序运行后的输出结果是____。 参考答案:101418 【解析】当i=0时,b[0]=a[0][2]+a[2][0]=3+7=10;当i=1时,b[1]=a[1][2]+a[2][1]=6+8=14;当i=2时,b[2]=a[2][2]+a[2][2]=9+9=18,则打印结果为101418。4.有以下程序 #include for(i=0;i<2;i++)n[i]=0; for(i=0;i<2;i++) for(j=0;j<2;j++)n[j]=n[i]+1; printf(“%dn”,n[1]); } 结果为:__________参考答案:3 【解析】通过第一次 for(i=0;i<2;i++)n[i]=0;的循环语句可知,已经将数组n 中的两个元素都赋初值为0。接下来的循环中,第一次循环,外循环 i=0 的前提下:内循环j=0时,运行完n[0]=n[0]+1后n[0]为1;j=1时,运行完n[1]=n[0]+1后,n[1]为2。第二次循环,外循环i=1的前提下,内循环j=0时,运行完n[0]=n[1]+1后n[0]为3;j=1时,运行完n[1]=n[1]+1后,n[1]为3。 5.以下fun函数的功能是在N行M列的整型二维数组中,选出一个最大值作为函数值返回,请填空。(设M,N已定义)int fun(int a[N][M]){ int i,j,row=0,col=0; for(i=0; i for(j=0;j if(a[i][j]>a[row][co1]){row=i;col=j;} return(____); }参考答案:a[row][col] 【解析】通过程序可以看出,外循环是行,内循环是列。先在行不变的情况下找一行内最大的数据进行记录。通过语句 if(a[i][j]>a[row][col]){ row=i;col=j;}可知,如果变量a[i][j]大于a[row][col],将i赋给了row,将j赋给了col,所以a[row][col]是记录当前最大值的变量。6.有以下程序 #include for(i=0;i<3;i++) for(j=i;j<3;j++)printf(“%d”,a[i][j]); printf(“n”); } 程序运行后的输出结果是____。参考答案:123569 【解析】当i=0时,j=0、1、2时满足条件,则打印a[0][0]、a[0][1]、a[0][2];当i=1时,j=1、2时满足条件,则打印a[1][1]、a[1][2];当i=2时,j=2时满足条件,则打印a[2][2],所以打印结果为123569。7.有以下程序: #include scanf(“%s”,b);printf(“%s %sn”,a,b); } 程序运行时从键盘输入:How are you?<回车> 则输出结果为____。参考答案:How are you? How 【解析】用%s格式输入字符串时,空格和回车都作为输入数据的分隔符,不能被读入,因此数组b的输出结果为How。第07章 一.选择题 1.有以下程序: #include r=p;p=q;q=r; printf(“%d,%d,%d,%dn”,m,n,*p,*q); } 程序运行后的输出结果是________。A)1,2,1,2 B)1,2,2,1 C)2,1,2,1 D)2,1,1,2 【解析】 m和n的值不变,输出结果为1,2。指针*p和*q交换了指向的位置,即*p=&n,*q=&m,输出结果分别为2,1。2.以下程序段完全正确的是 A)int*p; scanf(“%d”,&p); B)int*p; scanf(“%d”,p); C)int k,*p=&k; scanf(“%d”,p); D)int k,*p; *p=&k; scanf(“%d”,p); 【解析】A)选项输入的是指针型变量p的地址,变量一定义就已分配好了地址不能再指定了,所以A错误。B)选项没有指定指针p应该指向的变量,没给变量赋初值。D)选项中,p是地址,*p是地址内存放的数据,它把整型变量k的地址赋给了*p,所以错误。 3.以下定义语句中正确的是。 A)int a=b=0; B)char A=65+1,b=′b′; C)float a=1,*b=&a,*c=&b; D)double a=0.0;b=1.1; 【解析】本题考查变量的定义方法。如果要一次进行多个变量的定义,则在它们之间要用逗号隔开。因此选项A)和D)错误;在选项C)中,变量c是一个浮点型指针,它只能指向一个浮点型数据,不能指向指针变量b;所以正确答案为B)。4.若有定义语句:double x,y,*px,*py;执行了px=&x;py=&y;之后,正确的输入语句是________。A)scanf(“%f%f”,x,y);B)scanf(“%f%f”&x,&y); 指针 C)scanf(“%lf%le”,px,py);D)scanf(“%lf%lf”,x,y); 【解析】 本题考查scanf函数,其格式为:scanf(“控制格式”,地址表列)。其中地址表列中应为要赋值变量的地址。本题要为变量x和y赋值,并定义了两个指针分别指向x和y,因此取得变量x和y的地址的方法有两种,一种是使用取地址符号“&”,即&x和&y,另一种是使用指针变量,即px和py。选项A)和D)中地址表列表示错误;选项B)中控制格式与地址表列之间应用逗号分开。因此,本题正确答案为C)。5.有以下程序: #include --p;y=*p;printf(“y=%dn”,y); } 程序的运行结果是 A)y=0 B)y=1 C)y=2 D)y=3 【解析】在程序中指针变量p初始指向a[3],执行p减1后,p指向a[2],语句y=*p的作用是把a[2]的值赋给变量y,所以输出为y=3。正确答案为D)。6.下列函数的功能是________。 fun(char *a,char *b){ while((*b=*a)!=' '){a++;b++;}} A)将a所指字符串赋给b所指空间 B)使指针b指向a所指字符串 C)将a所指字符串和b所指字符串进行比较 D)检查a和b所指字符串中是否有' ' 【解析】 表达式*b=*a是将a所指的字符赋给b所指的空间,然后,指针a和b依次后移,直到到达指针a所指字符串的结尾。7.设有定义:char *c;,以下选项中能够使字符型指针c正确指向一个字符串的是________。A)char str[]=“string”;c=str; B)scanf(“%s”,c); C)c=getchar(); D)*c=“string”; 【解析】 选项B)、D)中,没有为字符串分配空间,因此不能用c指向字符串。选项C)中getchar()函数返回一个字符,不能将字符赋给字符指针c。选项A)中首先定义了字符数组str,然后将str的首地址赋给指针c,这样就使指针c指向了字符串“string”。8.有以下程序 #include printf(“%cn”,*s+2); } 程序运行后的输出结果是 A)tuv B)字符t的ASCII码值 C)t D)出错 【解析】*s+2 相当于(*s)+2即先取出s所指的数据然后对其加2,s是字符串的首地址,所以*s即s[0]就是字符“r”,所以在 它的ASCII码上加上数字2就变成了字母“t”的ASCII码,所以以%c格式输出,即为选项C)。9.下列语句组中,正确的是 A)char *s;s=“Olympic”; B)char s[7];s=“Olympic”;C)char *s;s={“Olympic”}; D)char s[7];s={“Olympic”}; 【解析】若s被定义为指针,选项A表示将指针s指向一个字符串,选项C表示为指针s赋一个字符串的值,显然选项A正确,选项C错误;若s被定义为数组,且要为该数组直接赋值,则必须在定义时进行,因此选项B和选项D都错误。二.填空题 1.以下程序的功能是:借助指针变量找出数组元素中的最大值及其元素的下标值。请填空。 #include 参考答案:p 【解析】s指向当前最大的元素,当*p>*s时,表示当前p所指向的那个元素比s指向的元素大,则s应该记录当前最大的元素的地址。2.有以下程序 #include int a[]={1,2,3,4,5,6},*k[3],i=0; while(i<3) { k[i]=&a[2*i]; printf(“%d”,*k[i]); i++; } } 程序运行后的输出结果是______。参考答案:135 【解析】当i=0时,k[0]=&a[0];当i=1时,k[1]=&a[2];当i=2时,k[2]=&a[4],则打印结果为135。 3.以下程序的功能是:借助指针变量找出数组元素中最大值所在的位置并输出该最大值。请在输出语句中填写代表最大值的输出项。 #include for(p=a;p-a<10;p++)scanf(“%d”,p); for(p=a,s=a;p-a<10;p++)if(*p>*s) s=p; printf(“max=%dn”,______); } 参考答案:*s 【解析】因为题目中有 if(*p>*s)s=p;语句,可知如果p所指的元素的值比s所指的元素的值大,就把指针p的地址赋予指针s,即s指向当前值最大的元素,所以最后应该输出的元素的值为*s。第08章 一.选择题 1.以下叙述正确的是。函数 A)C语言程序是由过程和函数组成的 B)C语言函数可以嵌套调用,例如:fun(fun(x))C)C语言函数不可以单独编译 D)C语言中除了main函数,其他函数不可作为单独文件形式存在 【解析】C语言中只有函数没有过程,故选项A错误;C语言可以嵌套调用,故选项B正确;C语言函数可以单独编译成.dll文件,故选项C错误;C语言中除main函数以外,其他函数可作为单独文件形式存在,故选项D也错误。2.有以下程序: #include else return(fun(--a,--b)); } main(){ printf(“%dn”,fun(4,2));} 程序的运行结果是________。A)1 B)2 C)3 D)4 【解析】该题目考查函数参数传递以及if条件语句。当变量b为0时,将a的值返回给主调函数,因此a进行两次自减1后,将其值返回并输出。 3.下面的函数调用语句中func函数的实参个数是________。 func(f2(v1,v2),(v3,v4,v5),(v6,max(v7,v8))); A)3 B)4 C)5 D)8 【解析】C语言函数定义中,参数列表之间使用逗号分隔。该题目中func的函数列表中使用两个逗号,将3个参数分隔开。4.有以下程序: #include void fun(int *a,int *b) { int *c; c=a;a=b;b=c; } main() { int x=3, y=5, *p=&x, *q=&y; fun(p,q);printf(“%d,%d,”,*p,*q); fun(&x,&y);printf(“%d,%dn”,*p,*q); } 程序运行后的输出结果是________。A)3,5,5,3 B)3,5,3,5 C)5,3,3,5 D)5,3,5,3 【解析】 子函数fun功能为交换形式参数的值,即交换指针变量a和b的值。但是fun函数并不能够交换实参的值,因此fun(p,q)不能交换p和q的值,所以第一个printf语句的输出为3,5。第二个fun函数对x和y的地址进行了操作,同样不能交换x和y的值,并且不能影响p和q指针指向的数据,因此第二个printf语句的输出为3,5。5.有以下程序: #include int f(int x,int y) {return((y-x)*x);} main() { int a=3,b=4,c=5,d; d=f(f(a,b),f(a,c)); printf(“%dn”,d); } 程序运行后的输出结果是________。A)10 B)9 C)8 D)7 【解析】 将a、b、c的值分别带入f(a,b)和f(a,c)中计算得:f(a,b)=3,f(a,c)=6,再计算f(3,6),算出d=9。6.有以下程序: #include { if(x==y)return(x); else return((x+y)/2); } main() { int a=4,b=5,c=6; printf(“%dn”,fun(2*a,fun(b,c))) } 则运行结果为。A)3 B)6 C)8 D)12 【解析】函数fun的功能是求两个整数的平均值,返回值仍为整数。5和6的平均取整后为5,8和5的平均取整后为6。因此,本题答案为B)。7.有以下程序 #include m=f(f(f(n)));printf(“%dn”,m); } int f(int x){ return x*2;} 程序运行后的输出结果是 A)1 B)2 C)4 D)8 【解析】第一次调用的是最内层的f(n),即f(1)返回值2。第二次调用中间的f(f(n)),即f(2)返回值4。最后调用最外层的f(f(f(n))),即f(4)返回值8,最后打印输出。二.填空题 1.以下程序的输出结果是_________。 #include t=a; a=b; b=t; } main(){ int i=3,j=5,*p=&i,*q=&j; swap(p,q); printf(“%d %dn”,*p,*q); } 参考答案:3 5 【解析】函数swap(int *a,int *b)的功能是实现*a和*b中两个数据的交换,在主函数中调用swap(p,q)后,参形指针变量a和b分别指向i和j,在swap(int *a,int *b)执行完后,指针变量a和b分别指向j和i,而指针变量p,q所指向变量的值没有发生变化,所以输出结果为3 5。 2.以下fun函数的功能是:找出具有N个元素的一维数组中的最小值,并作为函数值返回。请填空。(设N已定义)int fun(int x[N]){ int i,k=0; for(i=0;i if(x[i] return x[k]; } 参考答案:i 【解析】通过函数中语句 return x[k]; 可知x[k]表示的是该一维数组中最小的值,所以当x[i]小于x[k]所代表的数值后应将i变量赋给k变量,使得x[k]表示当前值较小的那个数据。3.有以下函数 void prt(char ch,int n){ int i; for(i=1;i<=n;i++)printf(i%6!=0 ? “%c”:“%cn”,ch); } 执行调用语句prt('*',24);后,函数共输出了______ 行*号。 参考答案:4 【解析】本题中输出*并换行的条件是i能被6整除,否则输出*不换行。因此只有在i为6、12、18和24时*的输出才会换行,最终输出4行*。 4.请将以下程序中的函数声明语句补充完整。 #include int______; main() { int x,y,(*p)(); scanf(“%d%d”,&x,&y); p=max; printf(“%dn”,(*p)(x,y)); } int max(int a,int b) { return(a>b?a:b);} 参考答案:max(int a,int b)【解析】本题考的是函数声明。函数声明是把函数的名字、函数类型以及形参的类型、个数和顺序通知给编译系统。函数在被调用前必须先声明,因为main函数后面有max函数的定义。5.有以下程序,请在 __ 处填写正确语句,使程序可正常编译运行。 #include scanf(“%lf%lf”,&x,&y); p=avg; printf(“%fn”,(*p)(x,y)); } double avg(double a,double b){ return((a+b)/2);} 参考答案:double avg(double a ,double b);【解析】c语言编译器对于源代码的编译是顺序编译的,当任意一个函数中调用某个函数的时候,这个函数的原型必须在调用之前声明,否则就会出现编译错误。本题中需要在main函数调用avg之前对其进行声明。6.有以下程序: #include printf(“%d.”,x); } main(){ fun(6),printf(“n”);} 程序运行后的输出结果是________。 参考答案:1 3 6 【解析】 依次执行fun(6),fun(3),fun(1),当执行fun(6)时要调用fun(3),执行fun(3)时要调用fun(1),所以输出的结果为1 3 6。第09章 一.选择题 1.有以下程序: #include int b=2; int fun(int *k) { b=*k+b;return(b);} main() { int a[10]={1,2,3,4,5,6,7,8},i; for(i=2;i<4;i++){b=fun(&a[i])+b;printf(“%d”,b);} printf(“n”); 变量的属性和编译预处理 } 程序运行后的输出结果是________。A)10 12 B)8 10 C)10 28 D)10 16 解析】b为全局变量,在第一次执行for循环后b的值变为10并输出,第二次执行for循环后b的值变为28。因此,本题答案选C)。 2.在C语言中,只有在使用时才占用内存单元的变量,其存储类型是。A)auto和register B)extern和register C)auto和static D)static和register 【解析】在C语言中只有自动变量和寄存器变量在使用时才占用内存单元。所以正确答案为A)。3.设函数中有整型变量n,为保证其在未赋初值的情况下初值为0,应选择的存储类别是___C_____。A)auto B)register C)static D)auto或register 【解析】static(静态局部变量):有时我们希望函数中局部变量的值在函数调用结束后不消失而保留原值,这时就将局部变量指定为静态局部变量,如果定义静态局部变量时不赋值,则编译时自动赋初值0(对数据型变量)或空字符(对字符变量)。 auto(自动变量):函数中的局部变量,如不专门声明为static存储类别,都是动态地分配存储空间的,数据存储在动态存储区中。函数中的形参和在函数中定义的变量都属此类,在调用该函数时系统会给它们分配存储空间,在函数调用结束时自动释放这些存储空间。 register(寄存器变量):为了提高效率,C语言允许将局部变量的值放在CPU中的寄存器中,这种变量叫寄存器变量。 4.有以下程序: #include s=f(a);s=s+f(a);printf(“%dn”,s); } int f(int n){ static int a=1; n+=a++; return n; } 程序运行后的输出结果是__C______。A)7 B)8 C)9 D)10 【解析】 s=f(a)表达式第一次调用f(n)函数时,f(n)函数运行结果为n=4,a=2,即s等于4;s=s+f(a)表达式第二次调用f(n)函数时,f(n)函数运行结果为n=5,所以得到s值为9。5.有以下程序 #include x*=2;return x;} main(){ int i,s=1; for(i=1;i<=2;i++) s=fun(); printf(“%dn”,s);} 程序运行后的输出结果是 A)0 B)1 C)4 D)8 【解析】x被声明为静态变量,第一次调用fun()后,x值为2,第二次调用时直接执行x*=2,值为4。6.以下叙述中错误的是 A)在程序中凡是以“#”开始的语句行都是预处理命令行D B)预处理命令行的最后不能以分号表示结束 C)#define MAX是合法的宏定义命令行 D)C程序对预处理命令行的处理是在程序执行的过程中进行的 【解析】C语言中的预处理命令以符号#开头,这些命令是在程序编译之前进行处理的,选项D)的描述错误。故答案选D)。7.以下关于宏的叙述中正确的是_____C___。A)宏名必须用大写字母表示 B)宏定义必须位于源程序中所有语句之前 C)宏替换没有数据类型限制 D)宏调用比函数调用耗费时间 【解析】宏名可以大写,也可以小写。其有效范围为定义命令之后到本源文件结束。宏的调用是字符的替换,没有数据类型限制。二.填空题 1.以下程序的输出结果是_____。 #include return(t+=x); } main(){ int s,i; for(i=1;i<=5;i++)s=fun(i); printf(“%dn”,s); } 参考答案:15 【解析】static关键字用来声明“静态局部变量”,静态局部变量属于静态存储类别,在静态存储区内分配存储单元。在程序运行期间不释放变量的值。 2.以下程序运行后的输出结果是 ____。 #include int i; p=(char*)malloc(sizeof(char)*20); strcpy(p,“welcome”); for(i=6;i>=0;i--)putchar(*(p+i)); printf(“n”); free(p); } 参考答案:emoclew 【解析】本题中用malloc函数申请一个20个字符大小的空间,并用指针p指向空间的首地址。strcpy函数使“welcome”字符串存放到分配的空间,最后用putchar函数倒序输出字符串的前7个字符。p[0] = w ,p[1] = e ,p[2] = l , p[3] = c , p[4] = o , p[5] = m , p[6] = e。第10章 一.选择题 1.有以下程序: #include struct STU a={“Zhao”,'m',85.0,90.0},b={“Qian”,'f',95.0,92.0}; b=a; printf(“%s,%c,%2.0f,%2.0fn”,b.name,b.sex,b.score[0],b.score[1]); } 程序的运行结果是_____D___。A)Qian,f,95,92 B)Qian,m,85,90 C)Zhao,f,95,92 D)Zhao,m,85,90 【解析】该题目考查结构体数据类型,注意语句b=a,因此输出b.name为zhao,b.sex为m,依此类推。2.以下结构体类型说明和变量定义中正确的是。A A)typedef struct {int n; char c;}REC; REC t1,t2; B)struct REC; {int n; char c;}; REC t1,t2; C)typedef struct REC ; {int n=0; char c='A';}t1,t2; D)struct {int n; char c;}REC; REC t1,t2; 【解析】本题考查的是typedef的用法和结构体变量的定义方法。typedef可用于声明结构体类型,其格式为“typedef struct {结构元素定义}结构类型;”。本题正确答案为A)。3.若有以下语句 typedef struct S { int g;char h; }T; 以下叙述中正确的是 A)可用S定义结构体变量 B)可用T定义结构体变量 C)S是struct类型的变量 D)T是struct S类型的变量 复杂数据类型 【解析】此题考察的是结构体的定义方式。S是我们定义的结构体的名字,在题目中顺便将T定义为struct S类型,即T被定义为一个类型名。这样就可以用T来定义说明新的变量了。在此S与T 都不是变量的名称。4.下面结构体的定义语句中,错误的是__B______。 A)struct ord {int x;int y;int z;};struct ord a; B)struct ord {int x;int y;int z;}struct ord a; C)struct ord {int x;int y;int z;}a; D)struct {int x;int y;int z;}a; 【解析】 定义结构体变量有三种方式:①先声明结构体类型,再定义变量名,如选项A)所示;②在声明类型的同时定义变量,如选项C)所示;③直接定义结构体类型变量,如选项D)所示。5.有以下程序: #include printf(“%d,”,p->y); printf(“%dn',(++p)->x); } 程序的运行结果是________。A)10,1 B)20,1 C)10,2 D)20,2 【解析】数组名的值即为数组首地址,所以p->y可得第一个元素的y值,(++p)->x可得第二个元素的x值。6.设有定义: struct complex {int real,unreal;} datal={1,8},data2;则以下赋值语句中错误的是 A)data2=data1; B)data2=(2,6);C)data2.rea1=data1.real; D)data2.real=datal.unreal; 【解析】选项B需要强制转换数据类型,应该为(struct complex){2,6}。7.有以下程序 #include printf(”%d,“,++(p->x));printf(”%dn“,++(p->y)); } 程序运行后的输出结果是 A)1,2 B)4,l C)3,4 D)2,3 【解析】本题中定义了一个结构体数组dt[2],其中dt[0].x=1,dt[0].y=2,dt[1].x=3,dt[1].y=4。在main函数中指针p指向了结构体数组的第一个元素,因此p->x值为1,p->y值为2,自加运算的结果分别为2和3。8.有以下程序 #include { int a, b;}data[2]={10,100,20,200};main(){ struct S p=data[1]; printf(”%dn“,++(p.a)); } 程序运行后的输出结果是 A)10 B)11 C)20 D)21 【解析】本题中定义了一个结构体数组data[2],其中data[0].a=10,data[0].b=100,data[1].a=20,data[1].b=200。在main函数中结构体数组的第2个元素data[1]赋值给p,即p指向结构体数组的第2个元素,因此p.a的值为20,进行自加运算后结果为21。9.有以下定义和语句 struct workers {int num;char name[20];char c;struct {int day;int month;int year;}s;};struct workers w,*pw;pw=&w;能给w中year成员赋1980的语句是 A)*pw.year=1980; B)w.year=1980;C)pw->year=1980; D)w.s.year=1980; 【解析】结构体structure workers中的成员s是结构体类型,给w中成员year赋值的语句是w.s.year=1980,故选D。10.假定已建立以下链表结构,且指针p和q已指向如下图所示的结点: 则以下选项中可将q所指结点从链表中删除并释放该结点的语句组是 。A)(*p).next=(*q).next; free(p); B)p=q->next; free(q); C)p=q; free(q); D)p->next=q->next; free(q); 【解析】要将结点b从链表中删除,应先将a的指针域指向b结点的下一个结点,即p->next=q->next,然后释放指针q的空间。二.填空题 1.有以下程序: #include void funl(REC x){x.num=23;x.s=88.5;} main(){ REC a={16,90.0); fun1(a); printf(”%dn“,a.num); } 程序运行后的输出结果是______。 参考答案:16 【解析】 主函数中,通过funl()函数将a值传递给x,但没有把形参x的值返回,此时变量a的值并没有发生变化,所以输出a.num的值为16。2.设有定义: struct person { int ID;char name[12];}p; 请将scanf(”%d“,_______);语句补充完整,使其能够为结构体变量p的成员ID正确读入数据。 参考答案:&p.ID 【解析】结构体成员的引用通过符号”.“来表示,通过scanf语句对变量进行赋值时,要用取地址符&。3.下列程序的运行结果为_______。 #include #include struct A { int a;char b[10];double c;}; void f(struct A *t); main() { struct A a={1001,”ZhangDa“,1098.0); f(&a);printf(”%d,%s,%6.1fn“,a.a,a.b,a.c); } void f(struct A *t) { strcpy(t->b,”ChangRong“);} 参考答案:1001,ChangRong,1098.0 【解析】此题考的是结构体用法。函数f的功能为将结构体的第二个变量修改为ChangRong。主函数为运行f函数后,将结构体输出。 4.以下程序把三个NODETYPE型的变量链接成一个简单的链表,并在while循环中输出链表结点数据域中的数据。请填空。 #include struct node { int data;struct node *next;}; typedef struct node NODETYPE; main() { NODETYPE a,b,c,*h,*P; a.data=10;b.data=20;c.data=30;h=&a; a.next=&b;b.next=&c;c.next=′ ′; p=h; while(p){printf(”%d,“,p->data);__p=p->next ______;} printf(”n“); } 【解析】打印完一个链表结点的数据域中的数据域后,用p=p->next使链表指针指向下一个链表结点。第11章 一.选择题 文件 1.下列关于C语言文件的叙述中正确的是________。A)文件由一系列数据依次排列组成,只能构成二进制文件 B)文件由结构序列组成,可以构成二进制文件或文本文件 C)文件由数据序列组成,可以构成二进制文件或文本文件 D)文件由字符序列组成,其类型只能是文本文件 【解析】 文件由数据序列组成,可以构成二进制文件,也可以构成文本文件。2.有以下程序: #include int a[10]={1,2,3},i,n; fp=fopen(”d1.dat“,”w“); for(i=0;i<3;i++)fprintf(fp,”%d“,a[i]); fprintf(fp,”n“); fclose(fp); fp=fopen(”d1.dat“,”r“); fscanf(fp,”%d“,&n); fclose(fp); printf(”%dn“,n); } 程序的运行结果是 A)12300 B)123 C)1 D)321 【解析】在函数中首先把整型数组a[10]中的每个元素写入文件d1.dat中,然后再次打开这个文件,把文件d1.dat中的内容读入到整型变量n中,最后输出变量n的值。所以正确答案为B)。3.有以下程序: #include char *s1=”China“,*s2=”Beijing“; pf=fopen(”abc.dat“,”wb+“); fwrite(s2,7,1,pf); rewind(pf); /*文件位置指针回到文件开头*/ fwrite(s1,5,1,pf); fclose(pf); } 以上程序执行后abc.dat文件的内容是_B_______。A)China B)Chinang C)ChinaBeijing D)BeijingChina 【解析】该题目考查文件相关知识。”wb+“用于打开或建立二进制文件并允许对其进行读和写操作。文件操作先写入了s2,然后将文件指针移动到文件夹,再写入s1,这样s1就会覆盖掉一部分s2的内容。 4.有以下程序: #include f=fopen(”filea.txt“,”w“); fprintf(f,”abc“); fclose(f); } 若文本文件filea.txt中原有内容为:hello,则运行以上程序后,文件filea.txt中的内容为___C_____。A)helloabc B)abclo C)abc D)abchello 【解析】”w“表示建立一个供写入的文件。如果文件不存在,系统将用在fopen调用中指定的文件名建立一个新文件,如果指定的文件已存在,则将从文件的起始位置开始写入,文件中原有的内容将全部消失。5.有以下程序 #include FILE *fp;char str[10]; fp=fopen(”myfile.dat“,”w“); fputs(”abc“,fp);fclose(fp); fp=fopen(”myfile.dat“,”a+“); fprintf(fp,”%d“,28); rewind(fp); fscanf(fp,”%s“,str);puts(str); fclose(fp);} 程序运行后的输出结果是C A)abc B)28c C)abc28 D)因类型不一致而出错 【解析】首先打开文件写入字符串”abc“,然后关闭文件,再打开时文件指针定位到了最后,写入”28“,然后重定位位置指针到开始,读取字符串为”abc28“。 6.设fp已定义,执行语句fp=fopen(”file“,”w“);后,以下针对文本文件file操作叙述的选项中正确的是。B A)写操作结束后可以从头开始读 C)可以在原有内容后追加写 B)只能写不能读 D)可以随意读和写 【解析】本题中用”w“方式打开文件,只能向文件写数据。如果原来不存在该文件,则新创建一个以指定名字命名的文件;如果已存在该文件,则把原文件删除后重新建立一个新文件,而不是把内容追加到原文件后。 二.填空题 1.以下程序打开新文件f.txt,并调用字符输出函数将a数组中的字符写入其中,请填空。 #include char a[5]={'1','2','3','4','5'},i; fp=fopen(”f.txt“,”w“); for(i=0;i<5;i++)fputc(a[i],fp); fclose(fp); } 【解析】在这里需要定义文件指针,定义文件指针的格式为: FILE * 变量名。2.以下程序的功能是从名为filea.dat的文本文件中逐个读入字符并显示在屏幕上。请填空。 #include fp=fopen(___”filea.dat“,”r“_____); ch=fgetc(fp); while(!feof(fp)){ putchar(ch); ch=fgetc(fp); } putchar(′n′); fclose(fp); } 【解析】fopen函数的调用方式通常为 fopen(文件名,使用文件方式)。本题中要求程序可以打开filea.dat文件,并且读取文件中的内容。所以空白处应当填入 ”filea.dat“,”r“。3.以下程序用来判断指定文件是否能正常打开,请填空。 #include main() { FILE *fp; if(((fp=fopen(”test.txt“,”r“))==__NULL______)) printf(”未能打开文件!n“); else printf(”文件打开成功!n“); } 【解析】本题考查fopen函数的用法。若fopen不能实现打开任务时,函数会带回一个出错信息,出错原因可能是磁盘出现故障,磁盘无法建立新文件等,此时fopen函数将带回一个空指针NULL。因此通过判断返回值是否为NULL即可判断是否读取文件正确。 4.以下程序运行后的输出结果是___123456_____。 #include fp=fopen(”test.dat“,”wb“); fwrite(x,sizeof(int),3,fp); rewind(fp); fread(x,sizeof(int),3,fp); for(i=0;i<6;i++)printf(”%d“,x[i]); printf(”n"); fclose(fp); } 【解析】本题中fwrite函数向目标文件指针fp指向的文件test.dat中写入3个int数据,即123。rewind函数将文件内部的位置指针重新指向文件的开头。fread函数将从fp所指文件中读取3个int数据到x指向的地址,因此数组x的元素没有变化。 第七章 函数调用 7-1 写两个函数,分别求两个整数的最大公约数和最小公倍数,#include void main(){ int hcf(int,int);int lcd(int,int,int); int u,v,h,l;scanf(“%d,%d”,&u,&v); h=hcf(u,v);printf(“H.C.F=%dn”,h); l=lcd(u,v,h);printf(“L.C.D=%dn”,l);} int hcf(int u,int v){ int t,r;if(v>u){ t=u; u=v; v=t;} while((r=u%v)!=0){ u=v; v=r;} return(v);} int lcd(int u,int v,int h){ return(u*v/h);} 7-2 求方程ax*x+bx+c=0的根,用3个函数分别求当b*b-4ac大于0,等于0、小于0时的根并输出结果。从主函数输入abc的值。 #include void main(){ void greater_than_zero(float,float);void equal_to_zero(float,float);void smaller_than_zero(float,float);float a,b,c;printf(“input a,b,c:”);scanf(“%f,%f,%f”,&a,&b,&c); printf(“equation: %5.2f*x*x+%5.2f*x+%5.2f=0n”,a,b,c);disc=b*b-4*a*c;printf(“root:n”);if(disc>0){ greater_than_zero(a,b); printf(“x1=%fttx2=%fn”,x1,x2);} else if(disc==0){ equal_to_zero(a,b); printf(“x1=%fttx2=%fn”,x1,x2);} else { smaller_than_zero(a,b); printf(“x1=%f+%fitx2=%f-%fin”,p,q,p,q);} } void greater_than_zero(float a,float b){ x1=(-b+sqrt(disc))/(2*a);x2=(-b-sqrt(disc))/(2*a);} void equal_to_zero(float a,float b){ x1=x2=(-b)/(2*a);} void smaller_than_zero(float a,float b){ p=-b/(2*a);q=sqrt(-disc)/(2*a);} 7-3 写一个判断素数的函数,在主函数输入一个整数,输出是否素数的信息。 #include void main(){ int prime(int);int n;printf(“ninput an integer:”);scanf(“%d”,&n); if(prime(n)) printf(“n %d is a prime.n”,n);else printf(“n %d is not a prime.n”,n);} int prime(int n){ int flag=1,i;for(i=2;i if(n%i==0) flag=0;return(flag);} 7-4 写一个函数,使给定的一个3x3的二维整形数组转置,即行列转换。#include void main(){ void convert(int array[][3]);int i,j;printf(“input array:n”);for(i=0;i for(j=0;j scanf(“%d”,&array[i][j]); printf(“noriginal array :n”);for(i=0;i for(j=0;j printf(“%5d”,array[i][j]); printf(“n”);} printf(“convert array:n”);for(i=0;i for(j=0;j printf(“%5d”,array[i][j]); printf(“n”);} } void convert(int array[][3]){ int i,j,t;for(i=0;i for(j=i+1;j { t=array[i][j]; array[i][j]=array[j][i]; array[j][i]=t; } } 7-5 写一个函数,是输入的字符串按反序存放,在主函数中输入和输出字符窜。#include printf(“input string:”);scanf(“%s”,str); inverse(str); printf(“inverse string:%sn”,str);} void inverse(char str[]){ char t;int i,j;for(i=0,j=strlen(str);i<(strlen(str)/2);i++,j--){ t=str[i]; str[i]=str[j-1]; str[j-1]=t;} } 7-6 写一个函数,将两个字符窜连接。 #include concatenate(s1,s2,s);printf(“nThe new string is %sn”,s);} void concatenate(char string1[],char string2[],char string[]){ int i,j;for(i=0;string1[i]!=' ';i++) string[i]=string1[i];for(j=0;string2[j]!=' ';j++) string[i+j]=string2[j];string[i+j]=' ';} 7-7 写一个函数,将字符窜中元音字母复制到另一个字符窜,然后输出。#include void main(){ void cpy(char [],char []);char str[80],c[80];printf(“input string:”);gets(str); cpy(str,c); printf(“The vowel letters are:%sn”,c);} void cpy(char s[],char c[]){ int i,j;for(i=0,j=0;s[i]!=' ';i++) if(s[i]=='a'||s[i]=='A'||s[i]=='e'||s[i]=='E'||s[i]=='i'|| s[i]=='I'||s[i]=='o'||s[i]=='O'||s[i]=='u'||s[i]=='U') { c[j]=s[i]; j++; } c[j]=' ';} 7-13 输入10个学生5门课的成绩,分别用函数实现下列功能。1 计算每个学生平均分。2 计算每门课的平均分。找出所有50个分数中最高的分数所对应的学生和课程。4 计算平均方差。 #include void main(){ int i,j;float h;float s_var(void);float highest();void input_stu(void);void aver_stu(void);void aver_cour(void); input_stu();aver_stu();aver_cour(); printf(“n NO.cour1 avern”);for(i=0;i printf(“n NO %2d ”,i+1); for(j=0;j printf(“%8.2f”,score[i][j]); printf(“%8.2fn”,a_stu[i]);} printf(“naverage:”);for(j=0;j printf(“%8.2f”,a_cour[j]);printf(“n”); h=highest(); cour2 cour3 cour4 cour5 printf(“highest:%7.2f NO.%2d course %2dn”,h,r,c);printf(“variance %8.2fn”,s_var());} void input_stu(void){ int i,j;for(i=0;i printf(“ninput score of student%2d:n”,i+1); for(j=0;j scanf(“%f”,&score[i][j]);} } void aver_stu(void){ int i,j;float s;for(i=0;i for(j=0,s=0;j s+=score[i][j]; a_stu[i]=s/5.0;} } void aver_cour(void){ int i,j;float s;for(j=0;j s=0; for(i=0;i s+=score[i][j]; a_cour[j]=s/(float)N;} } float highest(){ float high;int i,j;high=score[0][0];for(i=0;i for(j=0;j if(score[i][j]>high) { high=score[i][j]; r=i+1; c=j+1; } return(high);} float s_var(void){ int i;float sumx,sumxn;sumx=0.0;sumxn=0.0;for(i=0;i sumx+=a_stu[i]*a_stu[i]; sumxn+=a_stu[i];} return(sumx/N-(sumxn/N)*(sumxn/N));} 7-14 写几个函数: 输入10个职工的姓名和职工号 按职工号由小到大的顺序排序,姓名顺序也随之调整。要求输入一个职工号,用折半查找法找出该职工的姓名,从主函数输入要查找的职工号,输出该职工姓名。 #include void main(){ void input(int [],char name[][8]);void sort(int [],char name[][8]);void search(int ,int [],char name[][8]);int num[N],number,flag=1,c;char name[N][8]; input(num,name);sort(num,name);while(flag==1){ printf(“ninput number to look for:”); scanf(“%d”,&number); search(number,num,name); printf(“continue ot not(Y/N)?”); getchar(); c=getchar(); if(c=='N'||c=='n') flag=0;} } void input(int num[],char name[N][8]){ int i;for(i=0;i printf(“input NO.: ”); scanf(“%d”,&num[i]); printf(“input name: ”); getchar(); gets(name[i]);} } void sort(int num[],char name[N][8]){ int i,j,min,templ;char temp2[8];for(i=0;i min=i; for(j=i;j if(num[min]>num[j]) min=j; templ=num[i]; strcpy(temp2,name[i]); num[i]=num[min]; strcpy(name[i],name[min]); num[min]=templ; strcpy(name[min],temp2);} printf(“n result:n”);for(i=0;i printf(“n %5d%10s”,num[i],name[i]);} void search(int n,int num[],char name[N][8]){ int top,bott,mid,loca,sign;top=0;bott=N-1;loca=0;sign=1; if((n loca=-1;while((sign==1)&&(top<=bott)){ mid=(bott+top)/2; if(n==num[mid]) { loca=mid; printf(“NO.%d , his name is %s.n”,n,name[loca]); sign=-1; } else if(n bott=mid-1; else top=mid+1;} if(sign==1 || loca==-1) printf(“%d not been found.n”,n);} 第八章 指针 8-1 1 输入3个整数,按由小到大的顺序输出 #include int *p1,*p2,*p3;p1=&a;p2=&b;p3=&c;scanf(“%d,%d,%d”,p1,p2,p3);if(*p1>*p2)swap(p1,p2);if(*p1>*p3)swap(p1,p3);if(*p2>*p3)swap(p2,p3);printf(“%d,%d,%dn”,a,b,c);} void swap(int*p1,int*p2){ int p;p=*p1;*p1=*p2;*p2=p;} 8-2 输入3个整数按有小到大的顺序输出。#include void main(){ void swap(char *,char *);char str1[20],str2[20],str3[20];printf(“input three line:n”);gets(str1);gets(str2);gets(str3); if(strcmp(str1,str2)>0) swap(str1,str2);if(strcmp(str1,str3)>0) swap(str1,str3);if(strcmp(str2,str3)>0) swap(str2,str3);printf(“Now,the order is:n”);printf(“%sn%sn%sn”,str1,str2,str3);} void swap(char *p1,char *p2){ char p[20];strcpy(p,p1);strcpy(p1,p2);strcpy(p2,p);} 8-3 输入10个整数,将其中最小的数与第一个数对换,把最大的数与最后一个数对换。写3个函数:1输入10个数;2 进行处理;3 输出10个数 #include void main(){ void input(int *); void max_min_value(int *); void output(int *);int number[10]; input(number); max_min_value(number); output(number); } void input(int *number) { int i;printf(“input 10 numbers:”);for(i=0;i<10;i++) scanf(“%d”,&number[i]);} void max_min_value(int *number) { int *max,*min,*p,temp;max=min=number;for(p=number+1;p if(*p>*max) max=p; else if(*p<*min) min=p; temp=number[0];number[0]=*min;*min=temp; if(max==number) max=min;temp=number[9];number[9]=*max;*max=temp;} void output(int *number) { int *p;printf(“Now,they are: ”);for(p=number;p printf(“%d ”,*p);printf(“n”);} 8-7 有一个字符窜,包含n个字符。写一个函数,将此字符窜中从m个字符开始的全部字符复制成为另一个字符窜。 #include void main(){ void copystr(char *,char *,int); int m;char str1[20],str2[20]; printf(“input string:”);gets(str1); printf(“which character that begin to copy?”);scanf(“%d”,&m); if(strlen(str1) printf(“input error!”);else { copystr(str1,str2,m); printf(“result:%sn”,str2);} } void copystr(char *p1,char *p2,int m) { int n;n=0;while(n n++; p1++;} while(*p1!=' '){ *p2=*p1; p1++; p2++;} *p2=' ';} 8-9 写一个函数,使给定的一个3x3的二维整形数组转置,即行列转换。 #include void main(){ void move(int *pointer);int a[3][3],*p,i;printf(“input matrix:n”); for(i=0;i<3;i++) scanf(“%d %d %d”,&a[i][0],&a[i][1],&a[i][2]); p=&a[0][0];move(p); printf(“Now,matrix:n”);for(i=0;i<3;i++) printf(“%d %d %dn”,a[i][0],a[i][1],a[i][2]);} void move(int *pointer){ int i,j,t;for(i=0;i<3;i++) for(j=i;j<3;j++) { t=*(pointer+3*i+j); *(pointer+3*i+j)=*(pointer+3*j+i); *(pointer+3*j+i)=t; } } 8-13 将n个数按输入顺序的逆序排列,用函数实现。 #include void main(){ void sort(char *p,int m);int i,n;char *p,num[20]; printf(“input n:”);scanf(“%d”,&n); printf(“please input these numbers:n”);for(i=0;i scanf(“%d”,&num[i]); p=&num[0];sort(p,n); printf(“Now,the sequence is:n”);for(i=0;i printf(“%d ”,num[i]);printf(“n”);} void sort(char *p,int m){ int i;char temp, *p1,*p2;for(i=0;i p1=p+i; p2=p+(m-1-i); temp=*p1; *p1=*p2; *p2=temp;} } 第九章 用户建立的数据类型 9-1 定义一个结构体变量(包扩年、月、日)。计算该日在本年中的第几天,注意闰年问题。 #include struct { int year;int month;int day;}date; void main(){ int days;printf(“input year,month,day:”);scanf(“%d,%d,%d”,&date.year,&date.month,&date.day); switch(date.month){ case 1: days=date.day; break;case 2: days=date.day+31;break;case 3: days=date.day+59;break;case 4: days=date.day+90;break;case 5: days=date.day+120;break;case 6: days=date.day+151;break;case 7: days=date.day+181;break;case 8: days=date.day+212;break;case 9: days=date.day+243;break;case 10: days=date.day+273;break;case 11: days=date.day+304;break;case 12: days=date.day+334;break;} if((date.year %4== 0 && date.year % 100!= 0 ||date.year % 400 == 0)&& date.month >=3) days+=1; printf(“%d/%d is the in %d.n”,date.month,date.day,days,date.year);} %dth day 9-2 写一个函数days,实现第一题的计算,由主函数将年、月、日传递给days函数,计算后将日子数传回主函数输出。 clude struct { int year;int month;int day;}date; void main(){ int i,days;int day_tab[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};printf(“input year,month,day:”);scanf(“%d,%d,%d”,&date.year,&date.month,&date.day); days=0;for(i=1;i days=days+day_tab[i];days=days+date.day;if((date.year%4==0 && date.year%100!=0 || date.year%400==0)&& date.month>=3) days=days+1; printf(“%d/%d is the in %d.n”,date.month,date.day,days,date.year);} %dth day 9-3 编写一个函数print,打印一个学生的成绩数组,该数组中有5个学生的数据记录,每个记录包括num.name,score[3],用主函数输入这些记录,用print函数输出这些记录。 #include struct student { char num[6];char name[8];int score[4];}stu[N]; void main(){ void print(struct student stu[6]);int i,j;for(i=0;i printf(“ninput score of student %d:n”,i+1); printf(“NO.: ”); scanf(“%s”,stu[i].num); printf(“name: ”); scanf(“%s”,stu[i].name); for(j=0;j<3;j++) { printf(“score %d:”,j+1); scanf(“%d”,&stu[i].score[j]); } printf(“n”);} print(stu);} void print(struct student stu[6]){ int i,j;printf(“n NO.name score1 score2 score3n”);for(i=0;i printf(“%5s%10s”,stu[i].num,stu[i].name); for(j=0;j<3;j++) printf(“%9d”,stu[i].score[j]); printf(“n”);} } 9-4 在第3题的基础上,编写一个函数input,用来输入5个学生的数据记录。 #include struct student { char num[6];char name[8];int score[4];} stu[N]; void main(){ void input(struct student stu[]);void print(struct student stu[]);input(stu);print(stu);} void input(struct student stu[]){ int i,j;for(i=0;i printf(“input scores of student %d:n”,i+1); printf(“NO.: ”); scanf(“%s”,stu[i].num); printf(“name: ”); scanf(“%s”,stu[i].name); for(j=0;j<3;j++) { printf(“score %d:”,j+1); scanf(“%d”,&stu[i].score[j]); } printf(“n”);} } void print(struct student stu[6]){ int i,j;printf(“n NO.name score1 score2 score3n”);for(i=0;i printf(“%5s%10s”,stu[i].num,stu[i].name); for(j=0;j<3;j++) printf(“%9d”,stu[i].score[j]); printf(“n”);} } 9-5 有10个学生,每个学生的数据包括学号、姓名、3门课程的成绩,从键盘输入10个学生数据,要求输出3门课程总成绩,以及最高分的学生数据(包括学号、姓名、3门课程成绩、平均分数) #include struct student { char num[6];char name[8];float score[3];float avr;} stu[N]; void main(){ int i,j,maxi;float sum,max,average;for(i=0;i printf(“input scores of student %d:n”,i+1); printf(“NO.:”); scanf(“%s”,stu[i].num); printf(“name:”); scanf(“%s”,stu[i].name); for(j=0;j<3;j++) { printf(“score %d:”,j+1); scanf(“%f”,&stu[i].score[j]); } } average=0;max=0;maxi=0;for(i=0;i sum=0; for(j=0;j<3;j++) sum+=stu[i].score[j]; stu[i].avr=sum/3.0; average+=stu[i].avr; if(sum>max) { max=sum; maxi=i; } } average/=N; printf(“ NO.name score1 score2 for(i=0;i printf(”%5s%10s“,stu[i].num,stu[i].name); for(j=0;j<3;j++) printf(”%9.2f“,stu[i].score[j]); printf(” %8.2fn“,stu[i].avr);} printf(”average=%5.2fn“,average);printf(”The highest score score3 averagen“);is : student %s,%sn”,stu[maxi].num,stu[maxi].name);printf(“his scores are:%6.2f,%6.2f,%6.2f,average:%5.2f.n”, stu[maxi].score[0],stu[maxi].score[1],stu[maxi].score[2],stu[maxi].avr);} 5-1 #include“stdio.h” void main(){ char c1,c2;printf(“c1:”);c1=getchar();if(c1>='a'&&c1<='z')c2=c1-32;else if(c1>='A'&&c1<='Z')c2=c1+32;else c2=c1;printf(“=>%cn”,c2);} 5-2 #include“stdio.h” void main(){ char c;printf(“c:”);c=getchar();if(c>='A'&&c<='Z') if(c=='A')printf(“没有前面的字母!”); else if(c=='Z')printf(“没有后面的字母!”); else printf(“前面的字母=%c,后面的字母=%c”,c-1,c+1);printf(“n”);} 5-3 #include“stdio.h” void main(){ int s;char g;printf(“s:”);scanf(“%d”,&s);if(s>=0&&s<=100){ switch(s/10){ case 9: case 10: g='A';break; case 8: g='B';break; case 7: g='C';break; case 6: g='D';break; default: g='E'; } printf(“g=%cn”,g);} else printf(“成绩不在百分制范围内!n”);} 5-4 #include“stdio.h” void main(){ int y,m,d,dok;int yy,mm,dd;printf(“y,m,d:”);scanf(“%d,%d,%d”,&y,&m,&d); switch(m){ case 1: case 3: case 5: case 7: case 8: case 10: case 12: if(d>0&&d<=31)dok=4; else dok=0; break; case 4: case 6: case 9: case 11: if(d>0&&d<=30)dok=3; else dok=0; break; case 2: if(y%4==0&&y%100!=0||y%400==0) if(d>0&&d<=29)dok=2; else dok=0; else if(d>0&&d<=28)dok=1; else dok=0; break; default: dok=0; } if(dok==0)printf(“月份或日期不对!n”); else{ switch(dok){ case 1: if(d==28){yy=y;dd=1;mm=m+1;} else{yy=y;dd=d+1;mm=m;} break; case 2:if(d==29){yy=y;dd=1;mm=m+1;} else{yy=y;dd=d+1;mm=m;} break; case 3:if(d==30){yy=y;dd=1;mm=m+1;} else{yy=y;dd=d+1;mm=m;} break; case 4:if(d==31) if(m==12){yy=y+1;dd=1;mm=1;} else {yy=y;dd=1;mm=m+1;} else{yy=y;dd=d+1;mm=m;} break; } printf(“Tomorrow:%d年%d月%d日n”,yy,mm,dd); } } 5-5 #include“stdio.h” void main(){ int a,b,c,t;printf(“a,b,c:”);scanf(“%d,%d,%d”,&a,&b,&c);if(a+b>c&&b+c>a&&a+c>b){ if(a>b){t=a;a=b;b=t;} if(a>c){t=a;a=c;c=t;} if(b>c){t=b;b=c;c=t;} if(a==b&&b==c)printf(“等边三角形.”); else if(a==b||b==c||a==c)printf(“等腰角形.”); else if(c*c==a*a+b*b)printf(“直角三角形.”); else printf(“任意三角形.”); printf(“n”);} else printf(“不能构成三角形!n”);} 6-1 #include“stdio.h” void main(){ int a,b,m,n,k;printf(“m,n:”);scanf(“%d,%d”,&m,&n); a=m;b=n;k=a%b;while(k){ a=b; b=k; k=a%b;} printf(“%dn”,(m*n/b));} 6-2 #include“stdio.h” void main(){ int n;int i,j,s;printf(“n=”);scanf(“%d”,&n);for(i=1;i<=n;i++){ s=0; for(j=1;j if(i%j==0)s=s+j; if(s==i){ printf(“%d:”,i); for(j=1;j if(i%j==0)printf(“%d ”,j); printf(“n”); } } } 6-3 #include“stdio.h” #include“math.h” void main(){ double x,y,zd,zx,x1,x2;zd=zx=50;for(x=0;x<=2;x=x+0.2){ y=2*pow(x,3)-3*pow(x,4)+6*pow(x,5)-4*x+50; if(y>zd){ zd=y;x1=x;} if(y 6-4 #include“stdio.h” void main(){ double x,sum=0,a,b,c;int i;printf(“x=”);scanf(“%lf”,&x);a=x;b=1.0;c=1.0;for(i=1;i<=10;i++){ sum=sum+a/(b*c); a=a*x*x; b=b+2; c=c*i;} printf(“y(%.2lf)=%lfn”,x,sum);} 7-1 /*选择排序*/ #include“stdio.h” void main(){ int i,j,n,k,temp;int a[10];printf(“n(<10):”);scanf(“%d”,&n);printf(“Original:”);for(i=0;i k=i; for(j=i+1;j if(a[j]?*/ if(k!=i){ temp=a[i]; a[i]=a[k]; a[k]=temp; } } printf(“Ordered:”);for(i=0;i 7-2 #include“stdio.h” void main(){ int a[3][3];int i,j,s=1;printf(“Input:n”);for(i=0;i<3;i++) for(j=0;j<3;j++){ scanf(“%d”,&a[i][j]); if(i==j)s=s*a[i][j]; } printf(“s=%dn”,s);} 7-3 /*杨辉三角*/ #include“stdio.h” void main(){ int x[7][7];int i,j;for(i=0;i<7;i++){ x[i][0]=1; x[i][i]=1;} for(i=2;i<7;i++) for(j=1;j x[i][j]=x[i-1][j]+x[i-1][j-1];for(i=0;i<7;i++){ for(j=0;j<=i;j++) printf(“%3d”,x[i][j]); printf(“n”);} } 7-4 #include if(str[i]!=str[j])break;if(i>j)printf(“%s是回文n”,str);else printf(“%s不是回文n”,str);} 7-5 /*输入一维数组的10个元素,并将最小值与第1个数交换,最大值与最后一个数交换,然后输出交换后的结果*/ #include printf(“Input:n”);zx=zd=0;for(i=0;i<10;i++){ scanf(“%d”,&a[i]); if(a[i] if(a[i]>a[zd])zd=i;} if(zx!=0){ int t; t=a[0]; a[0]=a[zx]; a[zx]=t;} if(zd!=9){ int t; t=a[9]; a[9]=a[zd]; a[zd]=t;} for(i=0;i<10;i++) printf(“%d ”,a[i]);printf(“n”);} 8-2 #include“stdio.h” double xexp(double x,int n){ double c;if(n==0)c=1.0;else c=x*xexp(x,n-1);return c;} void main(){ int n;double x; printf(“x:”);scanf(“%lf”,&x);printf(“n:”);scanf(“%d”,&n);printf(“Result=%gn”,xexp(x,n));} 8-3 #include“stdio.h” int find(int x[],int n,int y){ int i,pos=-1;for(i=0;i if(x[i]==y)pos=i;return pos;} void main(){ int a[10]={11,1,13,15,18,7,19,27,3,8};int i,y,pos; for(i=0;i<10;i++)printf(“%d ”,a[i]); printf(“ny:”);scanf(“%d”,&y);pos=find(a,10,y);if(pos==-1)printf(“Not found!n”);else printf(“Position=%dn”,pos);} 8-1 #include“stdio.h” #include“conio.h” //getch()#include“stdlib.h” //srand(),rand(),system(“cls”)#include“time.h” //time()void main(){ void init(int a[][5],int m,int n);void input(int a[][5],int m,int n); void output(int a[][5],int m,int n);int min(int b[][5],int m,int n);int a[5][5],ch='0';while(1){ system(“cls”);//清屏 printf(“1.初始化 2.键盘输入 0.结束程序:”); ch=getch();//头文件conio.h printf(“n”); if(ch=='0')break; else if(ch=='1'){ init(a,5,5); output(a,5,5); } else if(ch=='2'){ input(a,5,5); output(a,5,5); } else printf(“Error!n”); printf(“Min element:%dn”,min(a,5,5)); printf(“按任意键继续!n”); getch();} } void init(int a[][5],int m,int n){ int i,j;srand(time(0));//time(0)表示以当前的时间做种子,增加每次运行的随机性 for(i=0;i<5;i++) for(j=0;j<5;j++) a[i][j]=rand()%100;//随机数范围:0~32767,将它控制在0~99的范围 } void input(int a[][5],int m,int n){ int i,j;printf(“Input Array 5X5:n”);for(i=0;i for(j=0;j scanf(“%d”,&a[i][j]);} void output(int a[][5],int m,int n){ int i,j;printf(“Output Array 5X5:n”);for(i=0;i<5;i++){ for(j=0;j<5;j++) printf(“%2d ”,a[i][j]); printf(“n”);} } int min(int b[][5],int m,int n){ int i,j,zx;zx=b[0][0];for(i=0;i for(j=0;j if(i==j&&b[i][j] if(a[i]<0){nsum=nsum+a[i];z++;} else if(a[i]>0){psum=psum+a[i];f++;} else continue;pave=(z!=0?psum/z:0.0);nave=(f!=0?nsum/f:0.0);} void main(){ float a[10]={1.0,11.0,3.0,-1.5,-5.5,-2}; saver(a,10);printf(“pave=%.1f,nave=%.2fn”,pave,nave);} 8-5 #include“stdio.h” #include“math.h” void p1(int a,int b){ printf(“has two equal roots:%8.4fn”,-b/(2*a));} void p2(int a,int b, int disc){ float x1,x2;x1=(-b+sqrt(disc))/(2*a);x2=(-b-sqrt(disc))/(2*a);printf(“Has distant real roots:%8.4f and %8.4fn”,x1,x2);} void p3(int a,int b, int disc){ float real,image;real=-b/(2*a);image=sqrt(-disc)/(2*a);printf(“Has complex roots:n”);printf(“%8.4f+%8.4fin”,real,image);printf(“%8.4f-%8.4fin”,real,image);} void main() { int a,b,c,disc;printf(“a,b,c:”);scanf(“%d,%d,%d”,&a,&b,&c); disc=b*b-4*a*c;if(fabs(disc)<=1e-6)p1(a,b);else if(disc>1e-6)p2(a,b,disc);else p3(a,b,disc);} 8-6 #include“stdio.h” #include“stdlib.h” #include“conio.h” #include“time.h” void main(){ void printaverage(int score[][5],int m,int n); void printname(int score[][5],int m,int n);int score[10][5];int i,j;srand(time(0));for(i=0;i<10;i++) for(j=0;j<5;j++) score[i][j]=50+rand()%50+1;printf(“Output Students' score:n”);printf(“Course 1 5n”);printf(“-------------------------n”);for(i=0;i<10;i++){ printf(“No.%2d:”,i+1); for(j=0;j<5;j++) printf(“%3d ”,score[i][j]); printf(“n”);} printaverage(score,10,5);printname(score,10,5);} void printaverage(int score[][5],int m,int n){ int i,j,sum;printf(“nAverage score:n”);for(i=0;i sum=0; for(j=0;j sum=sum+score[i][j]; printf(“No.%d:%.1fn”,i+1,sum/5.0);} } void printname(int score[][5],int m,int n){ int i,j,max0,row0; for(j=0;j<5;j++){ max0=score[0][j]; for(i=0;i<10;i++) if(score[i][j]>max0){ max0=score[i][j]; row0=i; } printf(“Course %d,max score=%d,student:No.%dn”,j+1,max0,row0+1);} } 前 言 机械设计基础课程是高等工科学校近机类、非机类 专业开设的一门技术基础课。杨可桢、程光蕴主编的 《机械设计基础》, 因其内容精炼、深度适中、重点突 出、知识面宽而被众多高等学校作为主要教材在教学中 采用。 本书是根据原国家教委颁布的“高等工业学校机械 设计基础课程基本要求”, 汇集了编者多年来的教学经 验, 在深刻理解机械设计基础课程内容的基础上编写而 成的, 是杨可桢、程光蕴主编《机械设计基础》的配套 辅导书, 章节顺序和内容体系与教材完全一致, 并涵盖 了国内同类教材的重点内容。本书特点: 1.明确每章的教学基本要求和重点教学内容。重点介绍基本概念、基本理论、基本分析方法和设计方法。2.建立明晰的知识结构框架。.考点及经典题型精解。介绍考点的具体内容, 并详尽剖析, 总结解题规律、解题思路、解题技巧。4.详细的课后习题解答。5.自测试题及答案符合考点精神, 便于学习总结 和自我检验。 书后附有模拟试题五套。 参加本书编写工作的有: 西安电子科技大学李团结(第1 , 14 章)、西安石油大学秦彦斌(第3 章)、西安石油大学陆品(第13 章)、西安建筑科技大学史丽晨(第2 , 5 , 7 , 8 , 12 章)、西安建 筑科技大学郭瑞峰(第4 , 6 , 9 , 10 , 11 , 15 , 16 , 17 , 18 章及模 拟试题)。全书由郭瑞峰、史丽晨主编。 本书可作为近机类、非机类大学生学习《机械设计基础》课程 的参考书, 也可供电大、职大、函大、夜大等相关专业的学生学习使用, 也可作为考研辅导书, 还可供有关教师及工程技术人员 参考。 由于编者水平有限, 书中难免有谬误和不妥之处, 敬请读者批 评指正。编者 2005 年8 月于西安 机械设计基础导教² 导学²导考 目录 第 1 章平面机构的自由度和速度分析⋯⋯⋯⋯⋯⋯ 1 1.1 重点内容提要⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯ 1 1.2 重点知识结构图⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯ 6 1.3 考点及常见题型精解⋯⋯⋯⋯⋯⋯⋯⋯⋯ 6 1.4 课后习题详解⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯ 11 1.5 学习效果测试题及答案⋯⋯⋯⋯⋯⋯⋯⋯ 16 第2 章平面连杆机构⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯ 20 2.1 重点内容提要⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯ 20 2.2 重点知识结构图⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯ 26 2.3 考点及常见题型精解⋯⋯⋯⋯⋯⋯⋯⋯⋯ 27 2.4 课后习题详解⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯ 32 2.5 学习效果测试题及答案⋯⋯⋯⋯⋯⋯⋯⋯ 42 第3 章凸轮机构⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯ 50 3.1 重点内容提要⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯ 50 3.2 重点知识结构图⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯ 57 3.3 考点及常见题型精解⋯⋯⋯⋯⋯⋯⋯⋯⋯ 58 3.4 课后习题详解⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯ 67 3.5 学习效果测试题及答案⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯ 79 第4 章齿轮机构⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯ 84 4.1 重点内容提要⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯ 84 4.2 重点知识结构图⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯ 93 4.3 考点及常见题型精解⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯ 95 4.4 课后习题详解⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯ 101 4.5 学习效果测试题及答案⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯ 108 第5 章轮系⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯ 111 5.1 重点内容提要⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯ 111 5.2 重点知识结构图⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯ 114 5.3 考点及常见题型精解⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯ 115 5.4 课后习题详解⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯ 118 5.5 学习效果测试题及答案⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯ 131 第6 章间歇运动机构⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯ 137 6.1 重点内容提要⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯ 137 6.2 重点知识结构图⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯ 140 6.3 考点及常见题型精解⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯ 140 6.4 课后习题详解⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯ 142 6.5 学习效果测试题及答案⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯ 144 第7 章机械运转速度波动的调节⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯ 146 7.1 重点内容提要⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯ 146 7.2 重点知识结构图⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯ 149 7.3 考点及常见题型精解⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯ 149 7.4 课后习题详解⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯ 153 Ⅱ 机械设计基础导教² 导学²导考.5 学习效果测试题及答案⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯ 161 第8 章回转件的平衡⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯ 165 8.1 重点内容提要⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯ 165 8.2 重点知识结构图⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯ 168 8.3 考点及常见题型精解⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯ 168 8.4 课后习题详解⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯ 172 8.5 学习效果测试题及答案⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯ 183 第9 章机械零件设计概论⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯ 187 9.1 重点内容提要⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯ 187 9.2 重点知识结构图⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯ 194 9.3 考点及常见题型精解⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯ 195 9.4 课后习题详解⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯ 196 9.5 学习效果测试题及答案⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯ 206 第10 章联接⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯ 209 10.1 重点内容提要⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯ 209 10.2 重点知识结构图⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯ 217 10.3 考点及常见题型精解⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯ 218 10.4 课后习题详解⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯ 224 10.5 学习效果测试题及答案⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯ 240 第11 章齿轮传动⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯ 243 11.1 重点内容提要⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯ 243 11.2 重点知识结构图⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯ 254 11.3 考点及常见题型精解⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯ 255 11.4 课后习题详解⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯ 258 目录 Ⅲ.5 学习效果测试题及答案⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯ 274 第12 章蜗杆传动⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯ 277 12.1 重点内容提要⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯ 277 12.2 重点知识结构图⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯ 281 12.3 考点及常见题型精解⋯.⋯.⋯.⋯.⋯.⋯.⋯282 12.4 课后习题详解⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯ 286 12.5 学习效果测试题及答案⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯ 293 第13 章带传动和链传动⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯ 297 13.1 重点内容提要⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯ 297 13.2 重点知识结构图⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯ 306 13.3 考点及常见题型精解⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯ 307 13.4 课后习题详解⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯ 316 13.5 学习效果测试题及答案⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯ 324 第14 章轴 ⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯ 329 14.1 重点内容提要⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯ 329 14.2 重点知识结构图⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯ 333 14.3 考点及常见题型精解⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯ 334 14.4 课后习题详解⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯ 338 14.5 学习效果测试题及答案⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯ 347 第15 章滑动轴承⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯ 350 15.1 重点内容提要⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯ 350 15.2 重点知识结构图⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯ 356 15.3 考点及常见题型精解⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯ 357 15.4 课后习题详解⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯ 359 Ⅳ 机械设计基础导教² 导学²导考 15.5 学习效果测试题及答案⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯ 361 第16 章滚动轴承⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯ 363 16.1 重点内容提要⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯ 363 16.2 重点知识结构图⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯ 372 16.3 考点及常见题型精解⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯ 373 16.4 课后习题详解⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯ 379 16.5 学习效果测试题及答案⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯ 386 第17 章联轴器、离合器和制动器⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯ 390 17.1 重点内容提要⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯ 390 17.2 重点知识结构图⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯ 392 17.3 考点及常见题型精解⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯ 393 17.4 课后习题详解⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯ 396 17.5 学习效果测试题及答案⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯ 400 第18 章弹簧⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯ 403 18.1 重点内容提要⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯ 403 18.2 重点知识结构图⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯ 408 18.3 考点及常见题型精解⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯ 409 18.4 课后习题详解⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯ 411 18.5 学习效果测试题及答案⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯ 418 附录模拟试题及参考解答⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯ 420 附录A 模拟试题⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯ 420 附录B 模拟试题参考解答⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯ 439 参考文献⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯ 449 目录 Ⅴ 第1 章平面机构的自由度和速度分析 1.1 重点内容提要.1.1 教学基本要求(1)掌握运动副的概念及其分类。 (2)掌握绘制机构运动简图的方法。(3)掌握平面机构的自由度计算公式。 (4)掌握速度瞬心的概念, 能正确计算机构的瞬心数。(5)掌握三心定理并能确定平面机构各瞬心的位置。(6)能用瞬心法对简单高、低副机构进行速度分析。.1.2 构件和运动副及其分类 1.构件 构__________件是机器中独立的运动单元体, 是组成机构的基本要素之一。零件是机 器中加工制造的单元体, 一个构件可以是一个零件, 也可以是由若干个零件刚 性联接在一起的一个独立运动的整体。构件在图形表达上是用规定的最简单的 线条或几何图形来表示的, 但从运动学的角度看, 构件又可视为任意大的平面 刚体。 机构中的构件可分为三类:(1)固定构件(机架)。用来支承活动构件(运动构件)的构件, 作为研究机 构运动时的参考坐标系。 (2)原动件(主动件)。又称为输入构件, 是运动规律已知的活动构件, 即作 用有驱动力的构件。 (3)从动件。其余随主动件的运动而运动的活动构件。 (4)输出构件。输出预期运动的从动件。其他从动件则起传递运动的作用。2.运动副 运动副是由两构件组成的相对可动的联接部分, 是组成机构的又一基本要 素。由运动副的定义可以看出运动副的基本特征如下:(1)具有一定的接触表面, 并把两构件参与接触的表面称为运动副元素。(2)能产生一定的相对运动。因此, 运动副可按下述情况分类:(1)根据两构件的接触情况分为高副和低副, 其中通过点或线接触的运动 副称为高副, 以面接触的运动副称为低副。 (2)按构成运动副两构件之间所能产生相对运动的形式分为转动副(又称 为铰链)、移动副、螺旋副和球面副等。 (3)因为运动副起着限制两构件之间某些相对运动的作用, 所以运动副可 根据其所引入约束的数目分为Ⅰ 级副、Ⅱ 级副、Ⅲ 级副、Ⅳ 级副和Ⅴ 级副。 在实际机械中, 经常出现某一构件与其他构件在多处接触的联接情况, 这 时应注意分析各处接触所引入的约束情况, 并根据所引入独立约束的数目来判 定两构件形成运动副的类别及数目。总之, 两构件构成的运动副应至少要引入 一个约束, 也至少要具有一个自由度。因此,平面运动副的最大约束数为2 , 最小 约束数为1。至于运动副的图形表达则应按照国家标准规定的符号来绘制。.1.3 机构运动简图及其绘制 机构各部分的相对运动只决定于各构件间组成的运动副类型(转动副、移 动副及高副等)和各构件的运动尺寸(即确定各运动副相对位置的尺寸), 而与 构件的形状和外形尺寸等因素无关。所以, 描述机构运动原理的图形, 可以根据 机构的运动尺寸, 按一定的比例尺定出各运动副的位置, 再用规定的运动副的 代表符号和代表构件的简单线条或几何图形将机构的运动情况表示出来, 这种 与实际机构位置相同或尺寸成比例绘出的简单图形称为机构运动简图。可以看 出, 机构运动简图是剔除了与运动无关的因素而画出来的简图, 最清楚地揭示 了机构的运动特性。而设计机构, 也就是要确定机构方案和与运动有关的尺寸, 即设计机构运动简图。 机构运动简图绘制的步骤如下: 第一步: 认清机架、输入构件和输出构件。 第二步: 分清构件并编号。首先使主动件运动起来, 然后从主动件开始, 按 机械设计基础导教² 导学²导考 构件是运动单元体的概念分清机构中有几个构件, 并将构件(包括机架)按联接 顺序编号为1 , 2 , 3 , ⋯。 第三步: 认清运动副类型并编号。根据两构件间的相对运动形态或运动副 元素的形状, 认清运动副的类型并依次编号, 如A, B , C, ⋯。 第四步: 恰当地选择作图的投影平面。选择时应以能最简单、清楚地把机构 的运动情况表示出来为原则。一般选机构中的多数构件的运动平面为投影面。第五步: 以机架为参考坐标系, 将主动件置于一个适当的位置, 按比例定出 各运动副的位置, 并画出各运动副的符号及注出编号。 以机架为参考坐标系, 就是可先定出机架上运动副的位置, 并以此位置作 为基准, 画出机构中各构件相对于机架的位置关系, 所以机架本身是否水平或 倾斜是不必考虑的。 将主动件置于适当位置的目的是使画出的机构运动简图清晰, 就是代表构 件的线条尽量不交叉、不重叠。 第六步: 将同一构件的运动副用简单的线条连起来代表构件, 并注出构件 编号和原动件的转向箭头, 便绘出了机构的运动简图。.1.4平面机构自由度的计算 1.平面一般机构自由度的计算 其公式为 F = 3 nph(1.1)式(1.1)中, F 为机构的自由度, n为机构中活动构件的数目, pl 为机构中低副的 数目, ph 为机构中高副的数目。 为了使F 计算正确, 必须正确判断机构中n, pl 和ph 的数目, 因此, 应特别 注意处理好下列三种情况:(1)要正确判定机构中构件的数目和运动副的数目。构件是机构中的运动 单元体, 所以, 不论构件的结构如何复杂, 只要是同一个运动单元体, 它就是一 个构件。 对于运动副数目的确定, 应注意复合铰链的存在, 即当m(m > 2)个构件同 在一处以转动副联接时, 则构成复合铰链, 其转动副数应为(mpl(1.2)式(1.2)中, n 为机构中活动构件的数目, pl 为机构中移动副的数目。.1.5 速度瞬心及其应用 1.速度瞬心 速度瞬心是作相对平面运动的两构件上瞬时相对速度为零(即绝对速度相 等)的重合点, 即同速点。在机构中, 如果这两个构件都是运动的, 即其同速点处 4 机械设计基础导教² 导学²导考 的绝对速度不等于零, 则其瞬心称为相对瞬心。如果这两个构件之一是静止的, 即其同速点处的绝对速度为零, 则其瞬心称为绝对瞬心。2.瞬心总数 每两个构件有一个瞬心, 因此由N 个构件(含机架)组成的机构, 其瞬心数 目按组合关系可得 K = N(N2 pl1)/ 2 瞬心位置的确定 两构件直接以运动副联接 两构件不直接联接:三__________心定理 机构的速度分析 求两构件的角速度之比 求构件的角速度和速度 1.3 考点及常见题型精解.3.1 本章考点 本章考点有以下几个方面:(1)机构中的构件、运动副、复合铰链、局部自由度和虚约束等基本概念。6 机械设计基础导教² 导学²导考 (2)运用规定的符号, 绘制常用机构的机构运动简图。(3)平面机构自由度的正确计算。 (4)速度瞬心的概念和三心定理的正确运用。(5)用速度瞬心法作机构的速度分析。.3.2 常见题型精解 例1.1 试绘制图1.1(a)所示偏心回转油泵机构的运动简图(其各部分尺 寸可由图中直接量取), 并判断该机构是否具有确定的运动。图中偏心轮1 绕固 定轴心A 转动, 外环2 上的叶片a 在可绕轴心C转动的圆柱3 中滑动。当偏心轮 1 按图示方向连续回转时, 可将低压油由右端吸入, 高压油从左端排出。图1.1 解(1)选取合适的长度比例尺(μl)绘制此机构的运动简图, 如图1.1(b)所示。 (2)计算机构的自由度。 此机构为曲柄摇块机构。由图1.1(b)可知n = 3 , pl = 4 , ph = 0 , 由式(1.1)计算该机构的自由度为 F = 3 nph = 3 ³ 30 = 1 由于该机构有一个原动件, 所以此机构具有确定的运动。 【评注】绘制机构运动简图时, 关键是分析相连两个构件的约束关系, 确 定运动副的类型, 然后再用规定的符号表示出来。 例1.2 试计算图1.2 所示凸轮— 连杆组合机构的自由度。 解在图1.2 中, B, E 两处的滚子转动为局部自由度, C, F 虽各有两处与 第1 章平面机构的自由度和速度分析7 机架接触构成移动副, 但都可视为一个移动副, 该机构在D 处虽存在轨迹重合 的问题, 但由于D 处相铰接的双滑块为一个自由度为零的Ⅱ 级杆组, 即D处未 引入约束, 故机构中不存在虚约束。图1.2 将机构中的局部自由度除去不计, 则有n = 5 , pl = 6 , ph = 2 , 于是可得该 机构的自由度为 F = 3 nph = 3 ³ 52 = 1 【评注】如果将该机构中D处相铰接的双滑块改为相固联的十字滑块时, 则机构中就存在一个虚约束。在机构中, 两构件构成运动副所引入的约束起着 限制两构件之间某些相对运动、使相对运动或自由度减少的作用。但在机构中, 某些运动副和构件带入的约束可能与机构所受的其他约束相重复, 因而对机构 的运动实际上不起约束作用, 这种约束就是虚约束。例1.3 试计算图1.3 所示的精压机构的自由度。图1.3 解由图1.3 可以看出, 该机构中存在结构对称部分, 从传递运动的独立 8 机械设计基础导教² 导学²导考 性来看, 有机构ABCDE 就可以了, 而其余部分为不影响机构运动传递的重复 部分, 故引入了虚约束。 将机构中引入虚约束的重复部分去掉不计, 则n = 5 , pl = 7(C处为复合铰 链), ph = 0 , 于是可得该机构的自由度为 F = 3 nph = 3 ³ 50 = 1 【评注】存在虚约束的机构, 一般常具有相似或对称部分的结构特征。所 以, 如研究的机构在结构上具有相似或对称部分, 就有可能存在虚约束, 因而就 要注意分析, 以免发生错误。 例1.4 试计算图1.4 所示机构的自由度。图1.4 解图 1.4 所示的楔块机构全由移动副组成, 此机构中n = 3 , pl = 5 , 于是 由式(1.2)可得该机构的自由度为 F = 2 n5 = 1 【评注】这里应注意, 若机构中只存在移动副, 在各构件之间不出现相对 转动, 这时机构自由度的计算不能用式(1.1), 只能用式(1.2)来计算, 否则会导 致计算错误。 例1.5 图 1.5 所示的凸轮机构中, 已知R = 50 mm, lOA = 20 mm, lAC = 80 mm, ∟OAC = 90°, 凸轮1 以等角速度ω1 = 10 rad/ s 逆时针转动, 比例尺 μl = 0.002 m/ mm。试用瞬心法求从动件2 的角速度ω2。 解由三心定理求出所需的瞬心P12 , P13 和P23 , 则点P12 处的速度为 v = ω1(P13 P12)μl = ω2(P23 P12)μl 则 ω2 = ω1(P13 P12)P23 P12 = 10 ³ 12 52 = 2.31 r ad/ s(逆时针)【评注】利用速度瞬心法对某些平面机构, 特别是平面高副机构, 进行速 第1 章平面机构的自由度和速度分析9 度分析是比较简便的。求两构件的角速度之比, 一般先分别求出两构件与机架 的瞬心(绝对瞬心)和这两个构件的瞬心(相对瞬心), 然后连接三点成一直线, 那么两构件的角速度之比等于其绝对速度瞬心连线被相对速度瞬心分得的两 线段的反比。如果两构件的相对瞬心内分该连线, 则两构件转向相反, 反之则转 向相同。图1.5 例1.6 已知一牛头刨床机构的机构运动简图如图1.6 所示, 设在图示瞬 间构件1 的角速度为ω1 , 机构各部分尺寸见图。(1)计算此机构的自由度;(2)试求图示位置滑枕的速度vC。解(1)计算机构的自由度。 在该机构中, n = 5 , pl = 7(F 和F′处的移动副只能算一个), ph = 0 , 因此 该机构的自由度为 F = 3 n2 ³ 7 = 1(2)速度分析。 先求出构件3 的绝对瞬心P36 的位置, 再求出瞬心P13 的位置。因为P13 为 构件1 和3 的等速重合点, 所以 vP13 = ω1 AP13μl = ω3 P36 P13μl ω3 = ω1 AP13/ P36 P13(rad/ s)ω3 与ω1 转向相同, 因为P13 外分连线P36 P16 , 则有 vC = ω3 P36 Cμl(m/ s)(水平向左)或者求出瞬心P15 的位置, 直接利用瞬心P15 求得 vC = ω1 P15 Aμl(m/ s)(水平向左)【评注】应用速度瞬心进行平面机构的速度分析, 就是利用瞬心是两构件 10 机械设计基础导教²导学²导考 的等速重合点这一桥梁, 将两个构件的速度在瞬心处直接联系起来。图1.6 1.4 课后习题详解 1 至1 4 绘出图示机构的机构运动简图。 图1.7 题 1 1 图图1.8 题 1 2 图 第1 章平面机构的自由度和速度分析11 图1.9 题 1 3 图图1.10 题 1 4 图 解各机构运动简图如下: 图1.11 题 1 1 解图图1.12 题 1 2 解图 图1.13 题 1 3 解图图1.14 题 1 4 解图 5 至1 12 指出下列机构运动简图中的复合铰链、局部自由度和虚约 12 机械设计基础导教²导学²导考 束, 并计算各机构的自由度。 图1.15 题 1 5 图图1.16 题 1 6 图 图1.17 题 1 7 图图1.18 题 1 8 图 图1.19 题 1 9 图图1.20 题 1 10 图 第1 章平面机构的自由度和速度分析13 图1.21 题 1 11 图图1.22 题 1 12 图 5 解 F = 3nph = 3 ³ 61 = 1 1 6 解 F = 3nph = 3 ³ 81 = 1 1 7 解 F = 3nph = 3 ³ 80 = 2 1 8 解 F = 3nph = 3 ³ 61 = 1 1 9 解 F = 3nph = 3 ³ 42 = 2 1 10 解 F = 3 nph = 3 ³ 92 = 1 1 11 解 F = 3 nph = 3 ³ 42 = 2 1 12 解 F = 3 nph = 3 ³ 81 = 1 1 13 求出图1.23 所示导杆机构的全部瞬心和构件1 , 3 的角速比ω1/ ω3。图1.23 题 1 13 图 解该导杆机构的全部瞬心如图1.23 所示, 构件1 , 3 的角速比为 14 机械设计基础导教²导学²导考 ω1 ω3 = P34 P13 P14 P13 1 14 求出图1.24 所示正切机构的全部瞬心。设ω1 = 10 rad/ s , 求构件3 的速度v3。 图1.24 题 1 14 图 解该正切机构的全部瞬心如图1.24 所示, 构件3 的速度为 v3 = vP 13 14 P = ω1 lP = 0.2ω1 = 2 m/ s(方向垂直向上)1 15 如图1.25 所示为摩擦行星传动机构, 设行星轮2 与构件1 , 4 保持纯 滚动接触, 试用瞬心法求轮1 与轮2 的角速度之比ω1/ ω2。图1.25 题 1 15 图 第1 章平面机构的自由度和速度分析15 解要求轮1 与轮2 的角速度之比, 首先确定轮 1、轮2 和机架4 三个构件 的三个瞬心, 即P12 , P14 和P24 , 如图1.25 所示。则 13 ω1 ω2 =2 r2 r1 轮2 与轮1 的转向相反。1 16 试论证:(1)图1.26(a)所示的构件组合是不能产生相对运动的刚性桁架;(2)这种构件组合若满足图1.26(b)所示尺寸关系: AB = CD = EF , BC = AD , BE = AF , 则构件之间可以产生相对运动。图1.26 题 1 16 图 解(1)图1.26(a)中的构件组合的自由度为 F = 3 nph = 3 ³ 40 = 0 自由度为零, 为一刚性桁架, 所以构件之间不能产生相对运动。 (2)图1.26(b)中的CD 杆是虚约束, 去掉与否不影响机构的运动。故图 1.26(b)中机构的自由度为 F = 3 nph = 3 ³ 30 = 1 所以构件之间能产生相对运动。.5 学习效果测试题及答案.5.1 学习效果测试题 1 填空题 (1)平面机构中运动副引入的约束的数目最多为个, 而剩下的 16 机械设计基础导教²导学²导考 自由度最少为个。 (2)两个作平面平行运动的构件之间为接触的运动副称为低 副, 它有个约束;而为接触的运动副称为高副, 它有 个约束。 (3)速度瞬心是, 相对瞬心与绝对瞬心的相同点是, 而不同点是。 (4)当两构件组成转动副时, 其瞬心在处;组成移动副时, 其瞬 心在处;组成纯滚动的高副时, 其瞬心在处。 (5)若一机构共由六个构件组成, 那它共有个瞬心。1 2 计算图1.27 所示多杆机构的自由度。图1.27 测 1 2 图 3 在图1.28 所示机构中, AB瓛EF瓛CD , 试计算其自由度。图1.28 测 1 3 图 第1 章平面机构的自由度和速度分析17 1 4 计算图1.29 所示凸轮— 连杆阀门机构的自由度。图1.29 测 1 4 图 5 图 1.30 为一凸轮连杆组合机构, 设凸轮1 转动的角速度为ω1。绘出 该机构的全部瞬心, 并确定在图示位置时构件4 的角速度。图1.30 测 1 5 图.5.2 参考答案 1(1)2 , 1(2)面, 2 , 点线, 1(3)两构件的等速重合点, 等速重合点, 绝对速度是否等于零(4)转动副中心, 移动副法线的无穷远, 相切点(5)15 18 机械设计基础导教²导学²导考 2 F = 3 nph = 3 ³ 90 = 1 1 3 F = 3 nph = 3 ³ 62 = 2 1 4 F = 3 nph = 3 ³ 61 = 1 1 5 如图1.31 所示。ω4 = ω1 P14 P15 / P14 P45 图1.31 测 1 5 解图 第1 章平面机构的自由度和速度分析19 第2 章平面连杆机构 2.1 重点内容提要.1.1 教学基本要求 平面连杆机构是许多构件用低副(转动副或移动副)连接组成的平面机构。最简单的平面连杆机构是由四个构件组成的(称为平面四杆机构), 应用广泛, 是组成多杆机构的基础。 (1)熟悉平面四杆机构的基本形式及其演化机构。(2)重点掌握平面四杆机构的特性: 1)急回运动和行程速度变化系数。2)压力角和传动角。3)死点位置。 (3)掌握铰链四杆机构有整转副的条件。(4)熟练掌握平面四杆机构的作图设计方法。.1.2平面四杆机构的基本型式及其演化 1.平面四杆机构的基本型式 平面四杆机构的基本型式是平面铰链四杆机构, 组成机构的四个运动副都 是转动副。机构的四个杆件中, 固定杆件称为机架, 与机架相连的称为连架杆, 不与机架相连的称为连杆。其中可以整周回转的连架杆称为曲柄, 只能在小于 360°范围内摆动的称为摇杆。组成转动副的两个构件若能作整周转动, 则该转 动副称为整转副, 否则称为摆动副。 平面四杆机构根据两连架杆运动形式分为三种基本类型, 见表2.1。表2.1 铰链四杆机构的三种基本类型 机构名称两连架杆运动形式应用实例 曲柄摇杆机构一曲柄, 一摇杆缝纫机踏板, 牛头刨进给机构 双曲柄机构两个曲柄旋转式水泵, 惯性筛 双摇杆机构两个摇杆汽车转向机构, 鹤式起重机 2.铰链四杆机构的演化 (1)曲柄滑块机构。将曲柄摇杆机构ABCD(见图2.1(a))中摇杆CD 变为 无限长, 点C的轨迹就变为直线(见图2.1(b)), 摇杆CD 与机架AD 组成的转动 副就演化成移动副, 此时曲柄摇杆机构演化为曲柄滑块机构(见图2.1(c))。图2.1(2)导杆机构。当将曲柄滑块机构(见图2.2(a))中曲柄AB 作为机架, 则曲 柄滑块机构变为导杆机构(见图2.2(b))。 (3)摇块机构和定块机构。在曲柄滑块机构(见图2.2(a))中, 若取杆2 为固 定构件, 即可得到图2.2(c)所示的摆动滑块机构(称为摇块机构)。若将滑块3 作为机架, 则可得到定块机构(见图2.2(d))。 (4)双滑块机构。若将曲柄摇杆机构中两杆长趋于无穷, 可得到多种形式的 双滑块机构——— 正切机构(见图2.3(a))、正弦机构(见图2.3(b))、椭圆机构 (见图2.3(c))等。第2 章平面连杆机构21 图2.2 图2.3 图2.4 22 机械设计基础导教²导学²导考 (5)偏心轮机构。在曲柄滑块机构中, 当曲柄AB 尺寸较小时(见图.4(b)), 常改成图2.4(a)的偏心轮机构, 其回转中心A 与几何中心B 不重合, 其距离AB 等于曲柄长度。.1.3平面四杆机构的主要特性 1.急回特性 (1)急回运动。平面连杆机构的原动件等速回转, 而从动件空回行程的平均 速度大于工作行程的平均速度, 这种运动称为急回运动。 (2)行程速度变化系数K。用以衡量机构急回运动的程度, 定义为空回行程 速度和工作行程速度之比, 其计算式如下: K = v2 v1 = 180°+ θ 180°-θ(2.1)式中θ表示极位夹角, 是摇杆处于两极限位置时, 对应的曲柄所夹的锐角。(3)关于行程速度变化系数和急回运动有以下几个结论: 1)K > 1 , 即v2 > v1 时, 机构有急回特性。)当平面连杆机构在运动过程中极位夹角θ> 0 , 则有K > 1 , 机构便具有 急回运动特性。)θ越大, K 越大, 机构急回运动也越显著。所以, 可通过分析θ及K 的大 小, 判断机构是否有急回运动, 以及急回运动的程度。)急回运动的作用。在机械中可以用来节省动力和提高劳动生产率。5)已知K, 可求极位夹角:θ= 180°(K1)/(K + 1)。)确定一个固定铰链中心D, 然后根据几何条件作出摇杆的两个极限位置 机械设计基础导教²导学²导考 C1 D 与C2 D。)作∟C2 C1 P = 90°-θ, ∟C1 C2 P = 90°。)作Rt△C2 PC1 的外接圆, 则另一个固定铰链中心A 便在该外接圆上。最 后, 由其他附加条件可以把这个固定铰链中心位置定下来, 从而平面四杆机构 的设计就完成了。 图2.5 对于曲柄滑块机构或导杆机构, 基本方法同上, 只是在曲柄滑块机构中滑 块行程H与曲柄摇杆机构中摇杆的摆角θ作用是相对应的(见图2.5(b));在导 杆机构中, 从动件导杆的摆角θ与机构的极位夹角θ大小相等(见图2.5(c))。(2)按给定的连杆位置设计四杆机构。这类设计通常是已知连杆长度, 并知 道连杆在运动过程中的三个位置, 要求确定固定铰链中心。由于两个活动铰链 的运动轨迹是绕各自固定铰链中心的圆的一部分, 因此可用求圆心法来解决问 题(见图2.6)。 图2.6 第2 章平面连杆机构25 如果只给定连杆的两个位置, 则可根据其他附加条件得到确定解。2.用解析法设计平面四杆机构 这里只要求按给定连架杆位置设计四杆机构(见图2.7), 取l1 = 1 , 则其他 三个构件得到的是相对于构件1 的长度。根据列解析式可以得到如下方程式: cosθ= P0 cosψ+ P1 cos(θl3 l4 , P2 = l24 + l23 + 11 K + 1 = 180°³ 1.3AC2)= 1 2 ³(110l1 = 65e ≤ lBC(极限情况取等号)第2 章平面连杆机构33 综上所述, 要求lAB + e≤ lBC 即可。 (2)当B为周转副时, 要求BC 能通过两次与机架共线的位置。如图2.15 中 位置ABC1 F1 和ABC2 F2。 在位置ABC1 F1 时, 从线段BC1 来看, 要能绕过点C1 , 要求: lBCAC2)= 1 2 ³(1 193l21782l217821 K + 1 = 180°³ 1.2AC2)/ 2 , 摇杆长度l2 =(AC1 + AC2)/ 2。在得到具体各杆数据之后, 代入教材中 公式(2 3)和(2 3)′, 求最小传动角γmin , 能满足γmin ≥ 35°即可。2 7 设计一曲柄滑块机构。已知滑块的行程s = 50 mm, 偏距e = 16 mm, 行程速度变化系数K = 1.2。求曲柄和连杆的长度。 图2.19 题 2 7 解图 解作图步骤如下(见图2.19):(1)求θ,θ= 180° K1 1.2 + 1 ≈ 16.36°;并确定比例尺μl。 (2)作Rt△ EC1 C2 , 顶角∟ E = θ, C1 C2 = s = 50 mm。 (3)作Rt△ EC1 C2 的外接圆, 则圆周上任一点都可能成为曲柄中心。(4)作一水平线, 与C1 C2 相距e = 16 mm, 交圆周于点A。(5)由图量得AC1 = 34 mm, AC2 = 82 mm。解得 曲柄长度: l1 = 1 2(AC134)= 24 mm 连杆长度: l2 = 1 2(AC1 + AC2)= 1 2 ³(82 + 34)= 58 mm 2 8 设计一导杆机构。已知机架长度l4 = 100 mm, 行程速度变化系数 第2 章平面连杆机构37 K = 1.4 , 求曲柄长度。解如图2.20 所示, 作图步骤如下:(1)ψ= θ= 180°³ 1.41 K + 1 = 180°³ 1AC2)= 1 2 ³(2380.801 2 , P2 = 0.591 8 将该解代入教材中公式(2 8)求解得 l1 = 1 , l2 = 2.103 , l3 = 1.481 , l4 = 1.848 4 又因为实际l4 = lAD = 50 mm, 因此每个杆件应放大的比例尺为 50 1.848 4 = 27.05 , 故每个杆件的实际长度为 l1 = 1 ³ 27.05 = 27.05 mm, l2 = 2.03 ³ 27.05 = 56.88 mm l3 = 1.481 ³ 27.05 = 40.06 mm, l4 = lAD = 50 mm 2 13 图 2.25 所示机构为椭圆仪中的双滑块机构, 试证明当机构运动时, 构件2 的AB 直线上任一点(除A , B 及AB 的中点外)所画的轨迹为一椭圆。证明如图2.25 所示。在AB 上任取一点C, 下面求证点C的运动轨迹为 一椭圆。由图可知点C将AB 分为两部分, 其中AC = a, BC = b。又由图可知sinθ= y b , cosθ= x a , 两式平方相加得 x2 a2 + y2 b2 = 1 可见点C的运动轨迹为一椭圆。 第2 章平面连杆机构41 图2.25 题 2 13 图.5 学习效果测试题及答案.5.1 学习效果测试题 1 选择题 (1)导杆机构的极位夹角与导杆的摆角()相等。A.一定B.一定不C.不一定 (2)在铰链四杆机构中, 若最短杆与最长杆之和小于或等于其他两杆长度 之和, 且最短杆为机架, 则该机构有()个曲柄。A.一B.二C.三D.零 (3)下列机构中没有急回特性的机构是()。A.曲柄摇杆机构B.导杆机构 C.对心曲柄滑块机构D.偏心曲柄滑块机构 2 填空题 (1)机构处于死点位置时, 其压力角为, 传动角为。 (2)在曲柄摇杆机构中, 当为主动件时, 机构将出现死点位置。 (3)在平面四杆机构中, 已知行程速度变化系数为K, 则极位夹角的计算 公式是。 (4)机构的压力角α是指;α愈大, 则机构。传动角 γ=。 机械设计基础导教²导学²导考 (5)如图2.26 所示, 设已知四杆机构各构件的长度l1 = 100 mm, l2 = 350 mm, l3 = 200 mm, l4 = 400 mm。要使此机构成为双曲柄机构, 则应取杆 为机架;要使此机构为双摇杆机构, 则应取杆为机架。 (6)图2.27 的导杆机构, 已知曲柄lAB = 20 mm, 机架lAC = 40 mm, 试问 该机构的极位夹角θ = , 此机构的行程速度变化系数K =。 图2.26 测 2 2(5)图图2.27 测 2 2(6)图 3 说明图2.28 中机构的名称。并指出它是否有急回特性?若以构件1 为主动件, 哪种机构有死点?若以构件3 为主动件时呢? 图2.28 测 2 3 图 第2 章平面连杆机构43 2 4 何谓机构的急回运动及行程速度变化系数?其在机械设计中有何意 义?试举例加以说明。5 已知一平面铰链机构各构件的长度如图2.29 所示。试问:(1)这是铰 链四杆机构基本型式中的哪种机构?(2)若以AB 为原动件, 此机构有无急回运 动?为什么?(3)当以AB 为原动件时, 此机构的最小传动角发生在何处(在图上 标出)?(4)该机构在什么情况下会出现死点?在图上标出死点发生的位置。图2.29 测 2 5 图图2.30 测 2 6 图 6 图 2.30 所示的铰链四杆机构, 各构件的长度分别为lAB = 21 mm, lBC = 11 mm, lCD = 38 mm, lAD = 35 mm。(1)试证明构件BC能相对构件AB 作 整周转动;(2)当构件BC主动并相对于构件AB 连续转动时, 求构件AB 相对于 构件AD 摆动的角度(作图表示);(3)要想得到曲柄摇杆机构, 应以哪个构件为 机架, 其取值可以变化的范围是多少? 2 7 设计一偏置曲柄滑块机构。已知滑块行程H = 50 mm, 偏心距e = 20 mm, 行程速度变化系数K = 1.4。求曲柄和连杆长度, 并求αmax。2 8 设计一摆动导杆机构。若曲柄AB 长l1 = 45 mm, 机架AD 长l4 = 135 mm。用图解法求: 极位夹角θ, 导杆摆角θ, 并求行程速度变化系数K。2 9 有一曲柄摇杆机构, 行程速度变化系数K = 1.25 , l3 = 140 mm, l4 = 125 mm, l1 + l2 = 210 mm。用图解法求曲柄长度l1 , 连杆长度l2。2 10 如图2.31 所示, 设要求四杆机构两连架杆的三组对应位置分别为 θ1 = 35°,ψ1 = 50°;θ2 = 80°,ψ2 = 75°;θ3 = 125°,ψ1 = 105°, 机架长度lAD = 80 mm, 试用解析法求其余三杆长度。44 机械设计基础导教²导学²导考 图2.31 测 2 10 图.5.2 参考答案 1(1)A(2)B(3)C 2 2(1)90°, 0°(2)摇杆 (3)θ= 180° KlAB = 211 K + 1 = 180°³ 1.4AC2)= 1 2 ³(701 K + 1 = 180°³ 1.25l1 = 152 mm 曲柄长度: l1 = 1 2(AC2152)= 29 mm 连杆长度: l2 = 1 2(AC1 + AC2)= 1 2 ³(210 + 152)= 181 mm 2 10 将三组数值带入教材中公式(2 10), 可得 P0 = 1.581 5 , P1 =ω1), 这时凸轮与从动件之间的相对运动关系并不改变。但此时凸轮将固定不动, 而 移动从动件将一方面随导路一起以等角速度(ω1)绕点O转动, 另一方面又按已知的运动规律绕其摆动中心摆 动。由于从动件尖端应始终与凸轮廓线相接触, 故反转后从动件尖端相对于凸 轮的运动轨迹, 就是凸轮的轮廓曲线。根据这一原理, 可作出从动件尖顶在从动 件作这种复合运动中所占据的一系列位置点, 并将它们连接成光滑曲线, 即得 所求的凸轮轮廓曲线。这种设计方法称为反转法。2.用作图法设计凸轮廓线 (1)直动尖顶从动件盘形凸轮机构的作图法设计步骤。)选取尺寸比例尺, 根据已知条件作基圆和偏距圆以及从动件的初始 位置。)利用作图法画出从动件的位移线图, 并沿横轴按选定的分度值等分位移 线图。)沿(ω1)方向等分, 所得的各点即为轴心A在反转运动中依次占 据的位置。再以这些点为圆心, 以摆动从动件的长度AB 为半径作圆弧, 与基圆 的交点即为摆动从动件在反转运动中依次占据的各最低位置点。从动件的角位 移则是以从动件轴心各反转位置点为圆心顶点, 以从动件相应反转位置为起始 边向外转量取。 3.用解析法设计凸轮的轮廓曲线 用解析法设计凸轮轮廓线的关键是根据反转法原理建立凸轮理论轮廓和 实际轮廓的方程式。解析法的特点是从凸轮机构的一般情况入手来建立其廓线 方程的。例如, 对心直动从动件可看作是偏置直动从动件偏距e = 0 的情况;尖 顶从动件可看作是滚子从动件其滚子半径为零的情况。对于偏置直动滚子盘形 凸轮机构, 建立凸轮轮廓线直角坐标方程的一般步骤如下:(1)画出基圆及从动件起始位置, 即可标出滚子从动件滚子中心B 的起始 位置点B0。 (2)根据反转法原理, 求出从动件反转角δ1 时其滚子中心点B 的坐标方程 式, 即为凸轮理论轮廓方程式。 (3)作理论轮廓在点B 处的法线n n , 标出凸轮实际轮廓上与点B 对应的 点T 的位置。 (4)求出凸轮实际轮廓上点T 的坐标方程式, 即为凸轮实际轮廓方程式。其他类型的凸轮机构的解析法设计过程与上述的过程类似, 其关键是根据 几何关系建立凸轮理论轮廓和实际轮廓的方程。54 机械设计基础导教²导学²导考.1.5 设计凸轮机构应注意的问题 1.凸轮机构的压力角 所谓凸轮机构的压力角, 是指从动件与凸轮接触点处所受正压力的方向 (即凸轮轮廓线在接触点处的法线方向)与从动件上对应点速度方向所夹的锐 角, 用α表示, 它是影响凸轮机构受力情况的一个重要参数。当驱动从动件的有 用分力F′一定时, 压力角α越大, 则有害分力F″越大, 机构效率越低。当压力角 增大到一定程度, 凸轮机构将发生自锁。因此, 从减小推力和避免自锁的观点来 看, 压力角愈小愈好。一般来说, 凸轮轮廓线上不同点处的压力角是不同的, 在 设计时应使最大压力角不超过许用值。通常推程时, 直动从动件[α] = 30°, 摆动 从动件[α] = 45°。依靠外力使从动件与凸轮维持接触的凸轮机构, 回程不会出 现自锁, 只须校核推程压力角。 图3.2 所示的偏置直动尖顶从动件盘形凸轮中, 凸轮机构的压力角α与基 圆半径rmin 及偏距e 之间的关系为 tanα= d s2 / dδ1 ê e s2 +(r2 min”号, 可使压力角减小;反之, 当导路和瞬心P 在凸轮轴心O 的异侧时, 取“+”号, 压 力角将增大。因此, 为了减小推程压力角, 应将从动件导路向推程相对速度瞬心 的同侧偏置。但须注意, 用导路偏置法虽可使推程压力角减小, 但同时却使回程 压力角增大, 所以偏距e 不宜过大。2.凸轮基圆半径的确定 由式(3.1)可知, 在偏距一定、从动件的运动规律已知的条件下, 加大基圆 半径rmin , 可减小压力角α, 从而改善机构的传力特性。但此时机构的尺寸将会增 大。故在确定基圆半径rmin 时, 应在满足αmax < [α] 的条件下, 尽量使基圆半径小 些, 以使凸轮机构的尺寸不至过大。当然, 在实际的设计工作中, 还须考虑到凸 轮机构的结构、受力、安装、强度等方面的要求。 3.滚子从动件滚子半径的选择和平底从动件平底尺寸的确定 (1)滚子从动件滚子半径的选择。当凸轮理论轮廓为内凹时, 凸轮实际轮廓 的曲率半径ρ′等于理论轮廓的曲率半径ρ与滚子半径rT 之和, 即ρ′= ρ+ rT , 第3 章凸轮机构55 此时不论rT 多大, 实际轮廓总是可平滑地作出的;当凸轮理论轮廓为外凸时, ρ′= ρ-rT。若ρ> rT , 则ρ′> 0 , 实际轮廓为一平滑曲线;若ρ= rT , 则ρ′= 0 , 实际轮廓出现尖点, 这种尖点极易磨损, 磨损后就会改变原有的运动规律;若 ρ< rT , 则ρ′< 0 , 实际轮廓曲线将出现交叉, 在加工时自交部分的轮廓曲线将 被切去, 致使这一部分运动规律无法实现。由此可知, 从避免凸轮轮廓变尖和自 交的观点来看, 滚子半径rT 应小于理论轮廓的最小曲率半径ρmin。如果ρmin 过 小, 按上述条件选择滚子半径太小而不能满足安装和强度要求, 就应把凸轮基 圆尺寸加大, 重新设计凸轮轮廓。图3.2(2)平底从动件平底尺寸的确定。用作图法作出凸轮廓线, 即可确定出从动 件平底中心至从动件平底与凸轮廓线的接触点间的最大距离lmax , 从动件平底 长度l应取为l = 2lmax +(5 ~ 7)mm。lmax 也可用计算求得, 即lmax = | ds/ dδ|max。此外, 对于平底从动件凸轮机构, 有时也会产生失真现象, 解决的方法是适当增 大凸轮的基圆半径。 机械设计基础导教²导学²导考.2 重点知识结构图 凸轮 机构及 其设 计 凸轮 机构 的分类 按凸轮的形状分 盘形凸轮机构 移动凸轮机构 圆柱凸轮机构 按从动件的形状分 尖顶从动件凸轮机构 滚子从动件凸轮机构平底从动件凸轮机构 按从动件的运动形式分 直动从动件凸轮机构 对心直动从动件凸轮机构 偏置直动从动件凸轮机构 摆动从动件凸轮机构 推杆的 运动 形式 基本概念: 基圆、基圆半径、推程、升程、推程运动角、回程、回程运动角、休止、远休止角、近休止角、压力角 常 用的运 动形 式 运动规律 动力特性 冲击性质发生位置 适用场合 等速运动刚性冲击开始点、终止点低速轻载 等加速等减速运动柔性冲击开始点、中点、终止点中速轻载 余弦加速度运动柔性冲击开始点、终止点中低速重载 凸轮轮 廓曲线 设计 设计原理: 反转法原理 设计方法 图解法 ① 根据从动件的运动规律, 画出位移线图并沿横轴等分 ② 选出比例尺, 画出基圆及从动件起始位置 ③ 求出从动件在反转运动中占据的各个位置 ④ 求从动件尖顶在复合运动中依次占据的位置 ⑤ 将从动件尖顶的各位置点连成一条光滑曲线, 即为凸 轮理论轮廓曲线 ⑥ 用包络的方法求凸轮的实际轮廓曲线 解析法 ① 画出基圆及推杆起始位置, 取合适的直角坐标系 ② 根据反转法原理, 求出推杆反转角δ1 时理论廓线方程式 ③ 根据几何关系求出实际廓线方程式 主要 参数的选择 压力角: 从减小推力和避免自锁的观点来看, 压力角愈小愈好 基圆半径: 在满足压力角小于许用压力角的条件下, 尽量使基圆半径小些, 以使 凸轮机构的尺寸不至过大。在实际的设计工作中, 还需考虑凸轮机构 的结构、受力、安装、强度等方面的要求 滚子半径: 为了避免理论轮廓出现尖点和自交, 滚子半径应小于理论轮廓曲线 的最小曲率半径。设计时, 应尽量使滚子半径小些, 但考虑到强度、结构等限制, 通常按经验公式确定取滚子半径, 设计中验算理论轮廓 曲线的最小曲率半径 第3 章凸轮机构57 3.3 考点及常见题型精解.3.1 本章考点 本章考点有以下几个方面:(1)从动件常用的几种运动规律的特点及应用场合, 刚性冲击与柔性冲击。(2)凸轮机构理论轮廓与实际轮廓之间的关系。 (3)已知凸轮机构某一位置的机构运动简图, 分析凸轮机构, 如凸轮转过某 角度δ1 , 求从动件的位移、从动件的升程h 等。 (4)凸轮机构压力角的概念, 求凸轮机构在某一位置压力角的大小及凸轮 机构的压力角与凸轮机构受力的关系。 本章试题常有基本概念题、作图题及计算分析题。基本概念题常以问答、填 空、选择、判断等题型出现。在考试题中, 作图题所占比例最大, 应引起足够的 重视。.3.2 常见题型精解 例3.1 如图3.3(a)所示, 凸轮机构从动件的速度曲线由五段直线组成。 要求:在图上画出从动件的位移曲线、加速度曲线;判断哪几个位置有冲击存 在, 是刚性冲击还是柔性冲击?在图示的F 位置, 凸轮与从动件之间有无惯性力 作用, 有无冲击存在? 解由图3.3(a)可知, 在OA 段内(0 ≤ δ≤ π 2), 因从动件的速度v = 0 , 故此段为从动件的近休段, 从动件的位移及加速度均为零。在AB 段内(π 2 ≤ δ≤ 3π 2), 因v > 0 , 故为从动件的推程段;且在AB 段内, 因速度线图为上升的斜 直线, 故从动件先等加速上升, 位移曲线为抛物线运动曲线, 而加速度曲线为正 的水平直线段。在BC段内, 因速度曲线为水平直线段, 故从动件继续等速上升, 位移曲线为上升的斜直线, 而加速度曲线为与δ1 轴重合的线段。在CD 段内, 因 速度线为下降的斜直线, 故从动件继续等减速上升, 位移曲线为抛物线, 而加速 度曲线为负的水平线段。在DE 段内(3π 2 ≤ δ≤ 2π), 因v < 0 , 故为从动件的回 58 机械设计基础导教²导学²导考 程段, 因速度曲线为水平线段, 故从动件作等速下降运动。其位移曲线为下降的 斜直线, 而加速度曲线为与δ1 轴重合的线段, 且在点D 及E 处其加速度分别为 负无穷大和正无穷大。综上所述, 作出从动件的速度v 及加速度a 线图如图 3.3(b),(c)所示。 由从动件速度曲线和加速度曲线知, 在点D及E 处, 有速度突变, 且相应的 加速度分别为负无穷大和正无穷大。故凸轮机构在点D 及E 处有刚性冲击。而 在点A , B, C及D 处的加速度为有限值的突然变化, 故在这几处凸轮机构会有 柔性冲击。 在点F 处有正的加速度值, 故有惯性力, 但既无速度突变, 也无加速度突 变, 因此, 点F 处无冲击存在。图3.3 第3 章凸轮机构59 【评注】本例是针对从动件常用的几种运动规律的典型题。解题的关键是 对常用运动规律的位移、速度以及加速度线图的熟练, 特别是要会作常用运动 规律的位移、速度以及加速度线图。至于判断有无冲击以及冲击的类型, 关键要 看速度变化处加速度有无突变。若速度变化处加速度为无穷大, 则有刚性冲击;若加速度的突变为有限值, 则为柔性冲击。例3.2 对于图3.4(a)所示的凸轮机构, 要求:(1)写出该凸轮机构的名称;(2)在图上标出凸轮的合理转向;(3)画出凸轮的基圆;(4)画出从升程开始到图3.4(a)所示位置时从动件的位移s, 相对应的凸 轮转角θ, 点B 的压力角α。(5)画出从动件的升程H。图3.4 解(1)偏置直动滚子从动件盘形凸轮机构。 (2)为使推程压力角较小, 凸轮应该顺时针转动。 (3)以点O 为圆心, 以OB 为半径画圆得理论轮廓。连结OA 并延长交理论 轮廓于点B0 , 再以转动中心A 为圆心, 以AB0 为半径画圆得基圆, 其半径为 r0(见图3.4(b))。 (4)点B0 即为从动件推程的起点, 图3.4(b)所示位置时从动件的位移和 相应的凸轮转角分别为s,θ, 点B 处的压力角α = 0。 (5)AO 连线与凸轮理论轮廓的另一交点为B1 , 过B1 作偏距圆的切线交基 60 机械设计基础导教²导学²导考 圆于点C1 , 因此B1 C1 为升程H。 【评注】这是凸轮机构分析题目中一道基本题。题中所涉及的凸轮机构的 名称、基圆、压力角、位移等都是基本概念, 因此解此类题时, 应对本章的概念熟 练掌握。凸轮机构名称的命名, 一般的顺序为从动件的运动形式+ 从动件的形 式+ 凸轮的形式;凸轮的合理转向是指使推程压力角较小的凸轮转向。当偏置 与推程时凸轮和从动件的相对速度瞬心位于凸轮轴心的同侧时, 凸轮机构的压 力角较小。凸轮的基圆是指凸轮理论轮廓的基圆, 所以, 应先求出凸轮的理论轮 廓。另外, 过点B0 , B1 作偏距圆的切线时, 应注意此切线相对于点A 的位置。在 本题中, 过点B1 作偏距圆的切线应在点A 的下方。 例3.3 图 3.5(a)所示凸轮的廓线由三段圆弧(圆心分别在O, O′, O″点)及一段直线组成, 从动件为圆心在点B 的一段圆弧构成的曲底摆动从动件。试 用作图法求该凸轮机构的推程运动角δ01、回程运动角δ02、从动件的最大摆角 Φ, 从动件在图示位置时的角位移θ及压力角α, 以及凸轮从图示位置再转过70° 后从动件的角位移θ′及压力角α′。 图3.5 解以凸轮回转中心O为圆心, 以OA 为半径画圆, 此即摆动从动件的摆 动中心在反转运动中的轨迹圆β, 如图3.5(b)所示。 分别以O, O′, O″为圆心, 以凸轮实际轮廓中相应圆弧长加上滚子半径rT 为 第3 章凸轮机构61 半径作出凸轮的理论轮廓, 如图3.5(b)中细线轮廓。 O′O的延长线与理论轮廓的交点B0 为推程廓线的最低点, 以B0 为圆心, 以 AB 为半径画弧, 与轨迹圆β的交点A0 为推程起始点时摆动从动件摆动中心的 线性代数习题一 说明:本卷中,A-1表示方阵A的逆矩阵,r(A)表示矩阵A的秩,||||表示向量的长度,T表示向量的转置,E表示单位矩阵,|A|表示方阵A的行列式.一、单项选择题(本大题共10小题,每小题2分,共20分) 在每小题列出的四个备选项中只有一个是符合题目要求的,请将其代码填写在题后的括号内。错选、多选或未选均无分。 a11a12a133a113a123a131.设行列式a21a22a23=2,则a31a32a33=() a31a32a33a21a31a22a32a23a33A.-6 B.-3 C.3 D.6 2.设矩阵A,X为同阶方阵,且A可逆,若A(X-E)=E,则矩阵X=()A.E+A-1 B.E-A C.E+A D.E-A- 13.设矩阵A,B均为可逆方阵,则以下结论正确的是() A.AA-1B可逆,且其逆为B-1 B.AB不可逆 C.AB-1D.B可逆,且其逆为A-1 AA-1B可逆,且其逆为B-1 4.设1,2,…,k是n维列向量,则1,2,…,k线性无关的充分必要条件是A.向量组1,2,…,k中任意两个向量线性无关 B.存在一组不全为0的数l1,l2,…,lk,使得l11+l22+…+lkk≠0 C.向量组1,2,…,k中存在一个向量不能由其余向量线性表示 D.向量组1,2,…,k中任意一个向量都不能由其余向量线性表示 5.已知向量2(1,2,2,1)T,32(1,4,3,0)T,则=()A.(0,-2,-1,1)T B.(-2,0,-1,1)T C.(1,-1,-2,0)T D.(2,-6,-5,-1)T 6.实数向量空间V={(x, y, z)|3x+2y+5z=0}的维数是()A.1 B.2) (C.3 D.4 7.设是非齐次线性方程组Ax=b的解,是其导出组Ax=0的解,则以下结论正确的是 () A.+是Ax=0的解 C.-是Ax=b的解 8.设三阶方阵A的特征值分别为A.2,4,C. B.+是Ax=b的解 D.-是Ax=0的解 11,3,则A-1的特征值为()24B.1 3111, 24311,3 241D.2,4,3 9.设矩阵A=21,则与矩阵A相似的矩阵是() 1A.1123 01B.102 2C. D. 21 10.以下关于正定矩阵叙述正确的是()A.正定矩阵的乘积一定是正定矩阵 C.正定矩阵的行列式一定大于零 二、填空题(本大题共10小题,每空2分,共20分) 请在每小题的空格中填上正确答案,错填、不填均无分。 11.设det(A)=-1,det(B)=2,且A,B为同阶方阵,则det((AB))=__________. 3B.正定矩阵的行列式一定小于零 D.正定矩阵的差一定是正定矩阵 112.设3阶矩阵A=42t23,B为3阶非零矩阵,且AB=0,则t=__________. 1-131k13.设方阵A满足A=E,这里k为正整数,则矩阵A的逆A=__________. 14.实向量空间R的维数是__________. 15.设A是m×n矩阵,r(A)=r,则Ax=0的基础解系中含解向量的个数为__________. 16.非齐次线性方程组Ax=b有解的充分必要条件是__________. n17.设是齐次线性方程组Ax=0的解,而是非齐次线性方程组Ax=b的解,则A(32)=__________. 18.设方阵A有一个特征值为8,则det(-8E+A)=__________. 19.设P为n阶正交矩阵,x是n维单位长的列向量,则||Px||=__________. 20.二次型f(x1,x2,x3)x15x26x34x1x22x1x32x2x3的正惯性指数是__________. 三、计算题(本大题共6小题,每小题9分,共54分) 222121.计算行列式142126142. 114121222.设矩阵A=35,且矩阵B满足ABA=4A+BA,求矩阵B. -1-1-123.设向量组1(3,1,2,0),2(0,7,1,3),3(1,2,0,1),4(6,9,4,3),求其一个极大线性无关组,并将其余向量通过极大线性无关组表示出来. 124.设三阶矩阵A=24533,求矩阵A的特征值和特征向量. 4225.求下列齐次线性方程组的通解. x1x35x40 2x1x23x40xxx2x023412242026.求矩阵A=3010360110110的秩. 1 2四、证明题(本大题共1小题,6分) a1127.设三阶矩阵A=a21a12a22a32a13a23的行列式不等于0,证明: a33a31a13a11a121a21,2a22,3a23线性无关. aaa313233 线性代数习题二 说明:在本卷中,A表示矩阵A的转置矩阵,A表示矩阵A的伴随矩阵,E表示单位矩阵。的行列式,r(A)表示矩阵A的秩。 一、单项选择题(本大题共10小题,每小题2分,共20分) 在每小题列出的四个备选项中只有一个是符合题目要求的,请将其代码填写在题后的括号内。错选、多选或T * A表示方阵A未选均无分。 1.设3阶方阵A的行列式为2,则 12A()A.-1 B.14 C.14 D.1 x2x1x22.设f(x)2x22x12x2,则方程f(x)0的根的个数为() 3x23x23x5A.0 B.1 C.2 D.3 3.设A为n阶方阵,将A的第1列与第2列交换得到方阵B,若AB,则必有(A.A0 B.AB0 C.A0 D.AB0 4.设A,B是任意的n阶方阵,下列命题中正确的是()A.(AB)2A22ABB2 B.(AB)(AB)A2B2 C.(AE)(AE)(AE)(AE)D.(AB)2A2B2 a1ba1b2a1b35.设A1a2b1aa0,b2b22b3,其中aii0,i1,2,3,则矩阵A的秩为(a3b1a3b2a3b3A.0 B.1 C.2 D.3 6.设6阶方阵A的秩为4,则A的伴随矩阵A*的秩为()A.0 B.2))C.3 D.4 7.设向量α=(1,-2,3)与β=(2,k,6)正交,则数k为()A.-10 C.3 B.-4 D.10 x1x2x348.已知线性方程组x1ax2x33无解,则数a=()2x2ax421A.C.1 2B.0 D.1 1 29.设3阶方阵A的特征多项式为A.-18 C.6 EA(2)(3)2,则A() B.-6 D.18 10.若3阶实对称矩阵A(aij)是正定矩阵,则A的3个特征值可能为()A.-1,-2,-3 C.-1,2,3 B.-1,-2,3 D.1,2,3 二、填空题(本大题共10小题,每小题2分,共20分) 请在每小题的空格中填上正确答案。错填、不填均无分。 3011.设行列式D42,其第3行各元素的代数余子式之和为__________.2253212.设Aaabb,B,则AB__________.aabb1032013.设A是4×3矩阵且r(A)2,B0,则r(AB)__________.10314.向量组(1,2),(2,3)(3,4)的秩为__________.15.设线性无关的向量组α1,α2,…,αr可由向量组β1,β2,…,βs线性表示,则r与s的关系为__________.x1x2x3016.设方程组x1x2x30有非零解,且数0,则__________.xxx031217.设4元线性方程组Axb的三个解α1,α2,α3,已知1(1,2,3,4)T,23(3,5,7,9)T,r(A)3.则方程组的通解是__________.18.设3阶方阵A的秩为2,且A25A0,则A的全部特征值为__________.2111a019.设矩阵A0有一个特征值2,对应的特征向量为x2,则数a=__________.413220.设实二次型f(x1,x2,x3)xTAx,已知A的特征值为-1,1,2,则该二次型的规范形为__________.三、计算题(本大题共6小题,每小题9分,共54分)21.设矩阵A(,22,33),B求 (,2,3),其中,,2,3均为3维列向量,且A18,B2.AB.111011122X101122.解矩阵方程0.110432123.设向量组α1=(1,1,1,3),α2=(-1,-3,5,1),α3=(3,2,-1,p+2),α4=(3,2,-1,p+2)问p为何值时,该向量组线性相关?并在此时求出它的秩和一个极大无关组.T T T T2x1x2x3124.设3元线性方程组x1x2x32, 4x5x5x1231(1)确定当λ取何值时,方程组有惟一解、无解、有无穷多解? (2)当方程组有无穷多解时,求出该方程组的通解(要求用其一个特解和导出组的基础解系表示).25.已知2阶方阵A的特征值为1(1)求B的特征值;(2)求B的行列式.26.用配方法化二次型性变换.四、证明题(本题6分)27.设A是3阶反对称矩阵,证明 22f(x1,x2,x3)x122x22x34x1x212x2x3为标准形,并写出所作的可逆线 11及2,方阵BA2.3A0.习题一答案 习题二答案 线性代数习题三 说明:在本卷中,A表示矩阵A的转置矩阵,A表示矩阵A的伴随矩阵,E是单位矩阵,|A|表示方阵A的行列式,r(A)表示矩A的秩.一、单项选择题(本大题共10小题,每小题2分,共20分)在每小题列出的四个备选项中只有一个是符合题目要求的,请将其代码填写在题后的括号内。错选、多选或未选均无分。 1.设A为3阶矩阵,|A|=1,则|-2A|=()A.-8 B.-2 C.2 D.8 TT *12.设矩阵A=1,B=(1,1),则AB=()111A.0 B.(1,-1)C. D.111 3.设A为n阶对称矩阵,B为n阶反对称矩阵,则下列矩阵中为反对称矩阵的是()A.AB-BA B.AB+BA C.AB D.BA 12*-14.设矩阵A的伴随矩阵A=34,则A=() A.143112112142 B.C.D.3431 342122225.下列矩阵中不是初等矩阵的是()..101001100A.010 B.010 C.030 0001000016.设A,B均为n阶可逆矩阵,则必有() 100 D.010 201A.A+B可逆 B.AB可逆 C.A-B可逆 D.AB+BA可逆 7.设向量组α1=(1,2), α2=(0,2),β=(4,2),则()A.α1, α2,β线性无关 B.β不能由α1, α2线性表示 C.β可由α1, α2线性表示,但表示法不惟一 D.β可由α1, α2线性表示,且表示法惟一 8.设A为3阶实对称矩阵,A的全部特征值为0,1,1,则齐次线性方程组(E-A)x=0的基础解系所含解向量的个数为()A.0 B.1 C.2 D.3 2x1x2x309.设齐次线性方程组x1x2x30有非零解,则为()xxx0231A.-1 B.0 C.1 D.2 10.设二次型f(x)=xAx正定,则下列结论中正确的是()A.对任意n维列向量x,xAx都大于零 B.f的标准形的系数都大于或等于零 C.A的特征值都大于零 D.A的所有子式都大于零 二、填空题(本大题共10小题,每小题2分,共20分)请在每小题的空格中填上正确答案。错填、不填均无分。11.行列式 TT0112的值为_________.1212.已知A=23,则|A|中第一行第二列元素的代数余子式为_________.1113 313.设矩阵A=,P=,则AP=_________.012414.设A,B都是3阶矩阵,且|A|=2,B=-2E,则|AB|=_________.15.已知向量组α1,=(1,2,3),α2=(3,-1,2), α3=(2,3,k)线性相关,则数k=_________.16.已知Ax=b为4元线性方程组,r(A)=3, α1, α2, α3为该方程组的3个解,且 -113251,13,则该线性方程组的通解是_________.37491117.已知P是3阶正交矩,向量3,0,则内积(P,P)_________.2218.设2是矩阵A的一个特征值,则矩阵3A必有一个特征值为_________.1219.与矩阵A=03相似的对角矩阵为_________.12T 20.设矩阵A=,若二次型f=xAx正定,则实数k的取值范围是_________.2k 三、计算题(本大题共6小题,每小题9分,共54分)012021.求行列式D=101221010210的值.01012022.设矩阵A=100,B210,求满足矩阵方程XA-B=2E的矩阵X.001000112223.若向量组11,21,36,40的秩为2,求k的值.13k2k232224.设矩阵A110,b1.1210(1)求A;(2)求解线性方程组Ax=b,并将b用A的列向量组线性表出.25.已知3阶矩阵A的特征值为-1,1,2,设B=A+2A-E,求(1)矩阵A的行列式及A的秩.(2)矩阵B的特征值及与B相似的对角矩阵.2- 1x12y12y2y326.求二次型f(x1,x2,x3)=-4 x1x2+ 2x1x3+2x2x3经可逆线性变换x22y12y2y3所得的标准形.x2y3 3四、证明题(本题6分)27.设n阶矩阵A满足A=E,证明A的特征值只能是1.2线性代数习题三答案第二篇:C语言课后习题解答
第三篇:大学C语言课本课后习题相应答案及详细解答
第四篇:机械设计基础 第五版 课后习题答案 详细解答
第五篇:线性代数习题及解答