C程序设计教程课后习题答案吉顺如版

时间:2019-05-13 01:09:17下载本文作者:会员上传
简介:写写帮文库小编为你整理了多篇相关的《C程序设计教程课后习题答案吉顺如版》,但愿对你工作学习有帮助,当然你在写写帮文库还可以找到更多《C程序设计教程课后习题答案吉顺如版》。

第一篇:C程序设计教程课后习题答案吉顺如版

第1章习题

一、选择题

1、A

2、D

3、C

4、D

5、B

6、C

7、C

8、B

9、B

10、A

二、填空题

1、一,函数体

2、main(主),main(主)

3、编译,目标

4、.c,.obj,.exe

5、缩进,无影响,/* */

三、程序分析题

1、***************** Very good!*****************

2、a=12,b=5 a=17,b=22

3、r= 5.50,s=95.033098

四、编程题

1.用printf()函数在屏幕上输出自己的班级、学号、姓名。#include“stdio.h” void main(){ printf(“班级:BX1109n”);printf(“学号:111003530901n”);printf(“姓名:王孟荣n”);}

2.从键盘输入两个整数,计算它们的和、差、积、商,并在屏幕上输出结果。

#include void main(){ int x,y,a,b,c;float d;printf(“Please Input Two Integers:n”);scanf(“%d%d”,&x,&y);a=x+y;b=x-y;c=x*y;d=1.0*x/y;printf(“a=%dnb=%dnc=%dnd=%fn”,a,b,c,d);}

第2章习题

一、选择题 1~5 BCDCD 6~10 DBBCA

二、填空题

1.单精度浮点型、双精度浮点型、字符型 2.0 3.x%10*10+x/10 4.5.5 5.5.7 20 6.sin(sqrt(x*x))/(a*b)7.,8.1111011 173 7B 9.3 3 10.3

三、程序分析题 1. 7,8,10 2. 1,3 3.5 F 4.(int)i=12, 12.50 5. 4 61 57 9 112

四、编程题

1.编写程序,求表达式c=21%9-(float)a+4/b*b的值,假设表达式中a和b的值分别由键盘输入。

#include void main(){ int a,b;float c;printf(“Please input data a,b: ”);scanf(“%d%d”,&a,&b);c=21%9-(float)a+4/b*b;printf(“c=%5.2fn”, c);} 2.编写程序,从键盘输入两个整数存入变量a和b中,求a2-b2的值并输出。#include void main(){ int a,b,c;printf(“Please input data a,b: ”);scanf(“%d%d”,&a,&b);c=a*a-b*b;printf(“c=%dn”, c);}

第3章习题

一、选择题 1 D 2 C 3 A、B A B B B、C B D D

二、填空题

1.有穷性 确定性 可行性 2.# 3.从终端(键盘)输入一个字符 4.m d 5.97,g 6.123.456000, 123.46, 123 7.格式控制符不正确(输入数据时不能控制列宽和小数位数)8.63,63,77,3f 9.%f%f &x,&y 10. ch ch

三、程序分析题 1.c=11 2.a=123 f=457 3.x=345 y=3.460000 4.a=1,b=3 a=3,b=1 5.(题目需修改为:从键盘输入一个除a和z以外的小写字母)

程序的功能:从键盘输入一个除a和z以外的小写字母,求出该字母对应的大写字母的前趋和后继字母,然后顺序输出此三个大写字母,每个字母所占列宽为3。运行结果: 假如输入:f ' 输出: E F G

四、编程题

1.编写程序,计算的值并输出(保留3位小数),其中a、b的值由键盘输入。#include #include void main(){ float a, b,x;scanf(“%f%f”, &a, &b);x=(a*a+b*b)/sqrt(3*(a+b));printf(“x=%.3fn”,x);}

2.编写程序,从键盘输入一个梯形的上底a、下底b和高h,输出梯形的面积s。

#include #include void main(){ float a, b,h,s;scanf(“%f,%f,%f”, &a,&b,&h);s=(a+b)*h/2;printf(“梯形面积s=%.2fn”,s);}

3.编写程序,在屏幕上输入你姓名的第一个字母,显示出该字母以及下面的信息: Hello!This is a c program.My name is [第一个字母]

#include void main(){ char name;name=getchar();putchar(name);printf(“nHello!n”);printf(“This is a c program.n”);printf(“My name is %cn”,name);}

第4章习题

一、选择题 1 B 2 B 3 C B C A C B A C C

二、填空题 1.!&& || 2.1 3.a b 4.1 5.0 6.x%4= =0 && x%100!=0 7.5 6 8.A 9.x<0 || x>10 && x<50 10.-1

三、程序分析题 1. No 2.-2 3.5 3 2 4. #& 5.(1)2(2)3 CC a=2,b=2,c=4

四、编程题

1.有一个函数如下: x2-2(x<5)y= 3x+5(5≤x<50)x-(x≥50)

编写程序,输入x的值,计算相应的y值输出(保留3位小数)。#include #include void main(){ float x,y;scanf(“%f”, &x);if(x<5)y=x*x-2;else if(x<50)y=3*x+5;else y=x-sqrt(4*x-1);printf(“x=%f, y=%.3fn”, x,y);}

2.编写一个程序,根据输入的三角形的三条边判断是否能组成三角形,如果可以则输出它的面积和三角形类型(等边、等腰、直角、一般三角形)。#include #include void main(){ float a, b, c, s, area;scanf(“%f,%f,%f”, &a,&b,&c);if(a+b>c && b+c>a && a+c>b){ s=(a+b+c)/2;area=sqrt(s*(s*(s-a)*(s-b)*(s-c)));printf(“area=%fn”,area);if(a==b && b==c)printf(“等边三角形n”);else if(a==b || a==c || b==c)printf(“等腰三角形n”);else if((a*a + b*b== c*c)||(a*a + c*c== b*b)||(b*b + c*c == a*a))printf(“直角三角形n”);else printf(“一般三角形n”);} else printf(“不能组成三角形n”);}

3.设奖金税率r有如下的要求(n代表奖金): 0 n<1000 5% 1000≤n<2000 r= 8% 2000≤n<3000 10% 3000≤n<6000 15% 6000≤n

用switch多分支选择语句编写程序,输入奖金值,计算并输出相应的税率和实际应得奖金值。

#include void main(){ float n, r, s;int m;printf(“请输入奖金值:”);scanf(“%f”, &n);if(n>=6000)m=6;else m=n/1000;switch(m){ case 0: r=0;break;case 1: r=0.05;break;case 2: r=0.08;break;case 3: case 4: case 5: r=0.1;break;case 6: r=0.15;break;} s=n-r*n;printf(“税率r=%.0f%%, 奖金值n=%.2f, 实际应得奖金值s=%.2fn”,r*100, n, s);}

4.从键盘输入任意4个数a、b、c、d,按照从大到小的顺序排列后重新输出。#include void main(){ int a, b, c, d,t;scanf(“%d,%d,%d,%d”, &a,&b,&c,&d);if(a

5.给出一个不超过4位数的正整数,判断它是几位数,并按逆向输出各位数字。例1234,输出为4321。#include void main(){ int num,i,j,k,m;printf(“输入一个少于4位的正整数:”);scanf(“%d”,&num);if(num>=0 && num<=9999){ if(num>1000 && num<=9999){ printf(“是一个4位数n”);m=num%10;/*求个位上的数字*/ k=num/10%10;/*求十位上的数字*/ j=num/100%10;/*求百位上的数字*/ i=num/1000;/*求千位上的数字*/ printf(“逆序数为:%d%d%d%dn”,m,k,j,i);} else if(num>=100){ printf(“是一个3位数n”);m=num%10;/*求个位上的数字*/ k=num/10%10;/*求十位上的数字*/ j=num/100;/*求百位上的数字*/ printf(“逆序数为:%d%d%dn”,m,k,j);} else if(num>=10){printf(“是一个2位数n”);m=num%10;/*求个位上的数字*/ k=num/10;/*求十位上的数字*/ printf(“逆序数为:%d%dn”,m,k);} else {printf(“是一个1位数n”);printf(“逆序数为:%dn”,num);} } else printf(“是一个无效的数n”);}

第5章习题

一、选择题 1 B 2 C 3 B C A B D B A B

二 填空题

1.循环 switch 2.4,7 3.6 4.# # 5.0 2 6.18 7.1 8.sum=80 9.c=getchar()n:m 10.i %13= =0 break 三 程序分析题 1.output1:21 6 output2: 5 6 output3: 5 7 7 2.n=7 3.Max=18 Min=3 4.1*1=1 2*1=2 2*2=4 3*1=3 3*2=6 3*3=9 5.0 1 2 3 1 2 3 0 2 3 0 1 3 0 1 2

四、编程题

1.从键盘上输入若干字符,以按Enter键结束,统计其中字符A或a的个数。#include “stdio.h” main(){ char ch;int k=0;while((ch=getchar())!='n'){ if(ch=='A' || ch=='a')k=k+1;} printf(“%dn”,k);} 2.利用=×…的前100项之积计算p的值。#include main(){ double term, result = 1;/*累乘项初值应为1*/ int n;for(n=2;n<=100;n = n + 2){ term=(double)(n * n)/((n-1)*(n+1));/*计算累乘项*/ result = result * term;} printf(“result = %fn”, 2*result);} 3.用1元5角钱人民币兑换5分、2分和1分的硬币(每一种都要有)共100枚,问共有几种兑换方案?每种方案各换多少枚? #include main(){ int x,y,z,count=0;for(x=1;x<=28;x++)for(y=1;y<=73;y++){ z=100-x-y;if(5*x+2*y+z==150){ count++;printf(“%d,%d,%dn”,x,y,z);} } printf(“count=%dn”,count);} 4.鸡兔同笼,共有98个头,386只脚,编程求鸡、兔各多少只。#include main(){ int x, y;for(x=1;x<=97;x++){ y=98-x;if(2*x+4*y==386)printf(“鸡=%d,兔=%d”,x,y);} } 5.将一个正整数分解质因数。例如:输入90,打印出90=2*3*3*5。#include main(){ int n,i;printf(“nplease input a number:n”);scanf(“%d”,&n);printf(“%d=”,n);for(i=2;i<=n;i++)while(n!=i){ if(n%i==0){ printf(“%d*”,i);n=n/i;} else break;} printf(“%d”,n);6.从键盘任意输入一个4位数x,编程计算x的每一位数字相加之和。例如,输入x为1234,则由1234分离出其千位

1、百位

2、十位

3、个位4,然后计算1+2+3+4=10,并输出10。#include #include main(){ int i1,i2,i3,i4,k,n;printf(“Inputdatais:”);scanf(“%d”,&n);k=fabs(n);/*取绝对值*/ i1=k/1000;/*分离出千位*/ i2=(k-i1*1000)/100;/*分离出百位*/ i3=(k-i1*1000-i2*100)/10;/*分离出十位*/ i4=k%10;/*分离出个位*/ printf(“The sum of the total bit is %dn”,i1+i2+i3+i4);}

7.打印出所有“水仙花数”,所谓“水仙花数”是指一个三位数,其各位数字立方和等于该数本身。例如:153是一个水仙花数,因为153=13+53+33。#include void main(){ int i,j,k,n;printf(“parcissus numbers are:n”);for(n=100;n<1000;n++){ i=n/100;j=n/10-i*10;k=n%10;if(n==i*i*i+j*j*j+k*k*k)printf(“%dn”,n);} }

8.利用泰勒级数sin(x)≈计算sin(x)的值。要求最后一项的绝对值小于10-5,并统计出此时累加了多少项(x由键盘输入)。#include #include main(){ int n=1,count=1;float x;double sum,term;/*因为位数多,所以定义为双精度 */ printf(“Input x: ”);scanf(“%f”, &x);sum=x;term=x;/*赋初值*/ do { term=-term*x*x/((n+1)*(n+2));sum=sum+term;/*累加 */ n=n+2;count++;}while(fabs(term)>=1e-5);printf(“sin(x)=%.1f,count=%dn”,sum,count);} 9.编写一个猜数游戏:任意设置一个整数,请用户从键盘上输入数据猜想设置的数是什么,告诉用户是猜大了还是小了。10次以内猜对,用户获胜;否则,告诉用户设置的数据是什么。

#include void main(){int num=123,x,n;printf(“hint:0num)printf(“bigger!n”);if(x

10.编程输出以下图案。* *** ***** ******* ***** *** * #include main(){ int i,j;for(i=1;i<=4;i++){ for(j=20-i;j>=1;j--)printf(“%c”,' ');for(j=0;j<2*i-1;j++)printf(“*”);printf(“n”);} for(i=3;i>=1;i--){ for(j=20-i;j>=1;j--)printf(“%c”,' ');for(j=0;j<2*i-1;j++)printf(“*”);printf(“n”);} }

第6章习题

一、选择题 1 D 2 A 3 D B D C B D B D

二 填空题 1.0 2.14 m 3.10 7 4.数据类型

5.strcpy(S2,S1)#include 6.0 3 7.7,6 8.sum=0 i==j a[i][j] 9.4 10.Tony 三 程序分析题 1.max=85 min=5 sum=180 aver=30.00 2.a=2 b=2 c=2 d=2 e=1 f=2 g=2 3.j=45 4.Ti_saCPorm Tss_Pgm 5.1 1 1 5

四、编程题

1.从键盘输入15个整数,存放在数组中,找出其中最小数并指出其所在的位置。#include #define N 15 main(){int min,i,j,a[N];printf(“Enter N integers:n”);for(i=0;ia[i]){ min=a[i];j=i;} printf(“%d,%d”,min,j);}

2.将输入的十进制正整数化为十六进制数。#include main(){ int i,x,j,a[20];printf(“请输入一个正整数:”);while(1){ scanf(“%d”,&x);if(x<0)printf(“数据输入错误,请重新输入一个正整数:”);else break;} i=0;while(x){ a[i]=x%16;x=x/16;i++;} for(j=i-1;j>=0;j--)if(a[j]<=9)printf(“%d”,a[j]);else if(a[j]<=15)printf(“%c”,a[j]+'A'-10);printf(“n”);}

3.从键盘输入一行字符,统计其中有多少单词,假设单词之间以逗号分隔。#include void main(){ char string[81];int i,num=0,word=0;char c;gets(string);for(i=0;(c=string[i])!='';i++)if(c==',')word=0;else if(word==0){ word=1;num++;} printf(“There are %d words in the line.n”,num);}

4.从键盘输入一字符串,放在字符数组a中,将字符数组a中下标值为偶数的元素按从小到大排序。

#include #include void main(){ char a[80],t,m;int i,j,k;printf(“请输入一字符串:”);gets(a);k=strlen(a);for(i=0;i<=k-2;i+=2){ m=i;for(j=i+2;j<=k;j+=2)if(a[m]>a[j])m=j;if(m!=i){t=a[i];a[i]=a[m];a[m]=t;} } puts(a);printf(“n”);}

5.编写程序输出以下杨辉三角形(要求输出10行)。1 1 1 1 2 1 1 3 3 1 1 4 6 4 1 1 5 10 10 5 1 … … … … … …

#include #include void main(){ int i,j,a[10][10];for(i=0;i<10;i++){ a[i][0]=a[i][i]=1;for(j=1;j

6.编程将s数组中的字符串的正序和反序进行连接,形成一个新串放在t数组中。例如,当s数组中字符串为“ABCD” 时,则t数组中的内容应为:“ABCDDCBA”。#include #include main(){ char s[100], t[100];int i,d;printf(“Please enter string S:”);scanf(“%s”,s);d=strlen(s);for(i=0;i

7.某公司在传输数据过程中为了安全要对数据进行加密,若传递的是四位的整数,对其进行加密的规则为:每位数字都加上5,然后用和除以10的余数代替该数字,再将第一位和第四位交换,第二位和第三位交换。如:输入数字7659,则加密后的数字为4012 #include main(){ int a,i,aa[4],t;printf(“输入一个需加密的四位数整数:”);scanf(“%d”,&a);aa[0]=a%10;aa[1]=a%100/10;aa[2]=a%1000/100;aa[3]=a/1000;for(i=0;i<=3;i++){aa[i]+=5;aa[i]%=10;} for(i=0;i<=3/2;i++){ t=aa[i];aa[i]=aa[3-i];aa[3-i]=t;} printf(“加密后的数字为:”);for(i=3;i>=0;i--)printf(“%d”,aa[i]);printf(“n”);}

8.编写程序查找数值18在以下二维数组中第一次出现的位置。3 4 5 18 8 12 16 54 43 34 18 7

#include main(){ int i,j,a[3][4]={{3,4,5,18}, {8,12,16,54}, {43,34,18,7}};for(i=0;i<3;i++){ for(j=0;j<4;j++)if(a[i][j]==18)break;if(j<4)break;} printf(“数值18第一次出现的位置在%d行,第%d列n”,i+1,j+1);}

9.设有4行4列的数组a,其元素a[i][j]=3*i+2*j-6。编写程序,实现如下功能:(1)求第二行4元素的累加和;(2)求第四列4元素的平均值;

(3)求主对角线4元素中负数的个数。#include void main(){ int a[4][4],i,j,s=0,m=0;float n=0;for(i=0;i<4;i++)for(j=0;j<4;j++)a[i][j]=3*i+2*j-6;printf(“原始数组为:n”);for(i=0;i<4;i++){ for(j=0;j<4;j++)printf(“%3d”,a[i][j]);printf(“n”);} for(j=0;j<4;j++)s+=a[1][j];printf(“第二行4元素累加和为:%dn”,s);for(j=0;j<4;j++)n+=a[j][3];printf(“第四列4元素平均值为:%.2fn”,n/4.0);for(i=0;i<4;i++)if(a[i][i]<0)m++;printf(“主对角线4元素中负数的个数为:%dn”,m);}

10.约瑟夫环问题:编号为1,2,3,...,n的n个人按顺时针方向围坐一圈,每人持有一个正整数密码。一开始任选一个正整数m作为报数上限值,从第一个人开始按顺时针报数,报到m时停止,报m的人出列,将他的密码作为新的m值,从他在顺时针方向的下一个人开始重新从1报数,如此下去,直到所有人全部出列为止。设计程序求出出列顺序。

分析:设整型数组a中保存n个人的密码,对应的人出列后,数组元素置0作为标志。顺时针确定下一个人的方法,可将下标加1,再对n求余。#include #define N 100 main(){ int a[100];int i,j,m,n,k=0;printf(“输入人数n和任选的一个正整数m:”);scanf(“%d%d”,&n,&m);printf(“输入n个人的密码: ”);for(i=0;i

第7章习题

一、选择题 1 A 2 D 3 D B A D C D B A

二 填空题 1.main()2.main()3.函数首部

4.解决函数必须“定义在前,使用在后”的原则问题 5.int 6.定义 调用

7.地址传递 值传递 8.return void 9.void f(float a,float b)float f(float a,float b)10.static 三 程序分析题 1.a=48 2.8,17 3.2721 4.BASIC C COBOL FORTRAN PASCAL Smalltalk 5.6 1 2 3 6 5 4

四、编程题

1.写一个判断素数的函数,在主函数输入一个整数,输出是否素数的信息。#include #include void main(){int prime(int);int n;printf(“Input 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

2.写一个函数,用于实现函数strcmp()的功能,能将两个字符串进行比较,将两个字符串中第一个不相同字符的ASCII码值之差作为函数的返回值。#include int MyStrcmp(char s[], char t[]);main(){ char str1[20],str2[20];printf(“Input string:”);gets(str1);printf(“Input another string:”);gets(str2);if(MyStrcmp(str1,str2)>0)printf(“str1>str2n”);else if(MyStrcmp(str1,str2)<0)printf(“str1

int MyStrcmp(char s[], char t[]){ int i;for(i=0;s[i]==t[i];i++)if(s[i]=='')return 0;return(s[i]-t[i]);}

3.写一个函数,用于实现函数strcat()的功能, 能将两个字符串连接。#include void main(){void concatenate(char string1[],char string2[],char string[]);char s1[100],s2[100],s[100];printf(“input string1:”);scanf(“%s”,s1);printf(“input string2:”);scanf(“%s”,s2);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]='';}

4.从键盘任意输入10个整数,用函数编程实现将其中最大数与最小数的位置对换后,再输出调整后的数组。#include #define ARRSIZE 10 void MaxMinExchang(int a[], int n){ int maxValue=a[0], minValue=a[0], maxPos=0, minPos=0;int i, temp;for(i=1;i maxValue){ maxValue = a[i];maxPos = i;} else if(a[i] < minValue){ minValue = a[i];minPos = i;} } temp = a[maxPos];a[maxPos] = a[minPos];a[minPos] = temp;} main(){ int a[ARRSIZE],i;printf(“Input %d Numbers:n”,ARRSIZE);for(i=0;i

5.写一函数,能对给定的一个二维数组(3×3)进行转置(即行列互换)。#include #define N 3 int array[N][N];void main(){ void convert(int array[][3]);int i,j;printf(“input array:n”);for(i=0;i

void convert(int array[][3]){int i,j,t;for(i=0;i

6.写一函数,能用“起泡法”对输入的10个字符按由小到大顺序排序。#include #include #define N 10 char str[N];void main(){void sort(char str[]);int i,flag;for(flag=1;flag==1;){printf(“input string:n”);scanf(“%s”,str);if(strlen(str)>N)printf(“string too long,input again!”);else flag=0;} sort(str);printf(“string sorted:n”);for(i=0;i

void sort(char str[]){int i,j;char t;for(j=0;jstr[i+1]){t=str[i];str[i]=str[i+1];str[i+1]=t;} }

7.编写一个函数,由实参传来一个字符串,统计此字符串中字母、数字、空格和其他字符的个数。

#include int letter,digit,space,others;void main(){void count(char str[]);char text[80];printf(“input string:n”);gets(text);printf(“string:”);puts(text);letter=0;digit=0;space=0;others=0;count(text);printf(“nletter:%dndigit:%dnspace:%dnothers:%dn”,letter,digit,space,others);}

void count(char str[]){int i;for(i=0;str[i]!='';i++)if((str[i]>='a'&& str[i]<='z')||(str[i]>='A' && str[i]<='Z'))letter++;else if(str[i]>='0' && str [i]<='9')digit++;else if(str[i]==32)space++;else others++;}

8.编写程序输出3~10000内的可逆素数。可逆素数是指:一个素数将其各位数字的顺序倒过来构成的反序数也是素数。如157和751均为素数,它们是可逆素数。要求调用两个子函数实现。

#include #include #include int invert(int a){ int s=0;while(a>0){ s=10*s+a%10;a/=10;} return s;} int prime(int a){ int i;for(i=2;i<=(int)sqrt(a);i++)if(a%i==0)return 0;return 1;}

main(){ int i;for(i=3;i<10000;i++)if(prime(i))if(prime(invert(i)))printf(“%5d”,i);printf(“n”);}

9.编写一个函数,实现将一个十进制数转换成八进制数。#include #include void main(){ int i,n;char a[33];void trans10_8(char x[],int m);printf(“nInput a positive integer:”);scanf(“%d”,&n);trans10_8(a,n);for(i=strlen(a)-1;i>=0;i--)printf(“%c”,a[i]);printf(“n”);}

void trans10_8(char x[],int m){ int r,i=0;while(m>0){ r=m%8;x[i]=r+48;m=m/8;i++;} x[i]='';}

10.编写一个函数,实现对由实参传来的一个字符串,将其字符顺序颠倒后重新存放。#include #include void main(){void inverse(char str[]);char str[100];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<(int)(strlen(str)/2);i++,j--){t=str[i];str[i]=str[j-1];str[j-1]=t;} }

第八章编程题答案

1.输入2个字符串,每个字符串的长度均不超过80字符,用自己实现的cmpstr()函数完成这两个字符串的大小比较,cmpstr()函数的功能和字符串比较函数strcmp()的功能相同。#include #include int cmpstr(char *s1, char *s2){ char *p, *q;p=s1;q=s2;while(*p!='' && *q!=''){ if(*p==*q){ p++;q++;} else break;} return *p-*q;}

void main(){ char str1[81], str2[81];int c;printf(“请输入第1个字符串:”);gets(str1);printf(“请输入第2个字符串:”);gets(str2);c=cmpstr(str1,str2);if(c>0)printf(“字符串%s 大于 字符串%sn”,str1,str2);else if(c<0)printf(“字符串%s 小于 字符串%sn”,str1,str2);else printf(“字符串%s 等于 字符串%sn”, str1, str2);} 3.定义一个函数delSubstr(),删除字符串中第k个字符开始的m个字符,例如删除字符串abcde第2个字符开始的3个字符,则删除后结果为ae;又如删除字符串abcde第4个字符开始的5个字符,则删除后结果为abc。#include #include int delSubstr(char *str, int k, int m){ char *p, *q;if(k<=0||m<=0)return-1;else if(k>strlen(str))return-2;else if(k+m>strlen(str)){ str[k-1]='';return 1;} else { p=str+k-1;q=str+k+m-1;while(*q!='')*p++=*q++;*p='';return 1;} }

void main(){ char str[81];int k, m, state;printf(“请输入字符串:n”);gets(str);printf(“请输入要删除的子串起始字符的序号和子串长度:n”);scanf(“%d%d”, &k, &m);state = delSubstr(str, k, m);if(state<0)printf(“要删除子串起始字符的序号或子串长度输入错误!n”);else printf(“删除指定子串后的字符串为:%sn”, str);} 4.定义一个函数delSpechar(),使用字符指针删除字符串中的所有指定字符(如把字符串“I love you!”中的o字符删除,得到“I lve yu!”)。#include #include void delSpechar(char *str, char ch){ char *p, *q;p=str;while(*p!=''){ if(*p==ch){ q=p;while(*q!=''){ *q=*(q+1);q++;} } else p++;} }

void main(){ char str[81], ch;printf(“请输入一个字符串:”);gets(str);printf(“请输入要从字符串中删除的字符:”);ch = getchar();delSpechar(str, ch);printf(“删除所有指定字符后的字符串为:%sn”, str);} 5.求整型二维数组a[M][N]中的最大元素值及最大元素的位置(用指针法引用数组元素)。#include #define M 3 #define N 4 void max(int(*pa)[N], int *pRow, int *pCol){ int i, j;for(i=0;ipa[*pRow][*pCol]){ *pRow = i;*pCol = j;} }

void main(){ int a[M][N]={{4,2,7,9},{1,3,13,0},{-5,6,-11,10}};int row=0, col=0;max(a, &row, &col);printf(“二维数组中的最大元素值为a[%d][%d]=%dn”, row, col, a[row][col]);} 6.已知字符串str[80],编写函数lstrchar(),实现在数组str中查找字符ch首次出现的位置,如果字符串中找不到该字符,则返回-1。#include #include int lstrchar(char *str1, char ch1){ char *p,i=1;p=str1;while(*p!=''){ if(*p==ch1)break;else { p++;i++;} } if(*p=='')return-1;else return i;}

void main(){ char ch,str[80];int poi;printf(“请输入字符串:”);gets(str);printf(“请输入待查找的字符:”);scanf(“%c”,&ch);poi=lstrchar(str,ch);if(poi==-1)printf(“字符串中不存在指定字符!n”);else printf(“该字符在字符串中出现的第一个位置为%dn”, poi);} 7.定义一个整型二维数组并初始化,编程求该数组所有元素的和。要求:分别用数组下标法、一级指针法、二级指针法实现。/*数组下标法*/ #include #define M 3 #define N 4 int sum(int b[M][N]){ int i, j, s=0;for(i=0;i

void main(){ int a[M][N]={{4,2,7,9},{1,3,13,0},{-5,6,-11,10}};printf(“二维数组中的所有元素之和为%dn”, sum(a));}

/*一级指针法*/ #include #define M 3 #define N 4 int sum(int *pa){ int i,s=0;for(i=0;i

/*二级指针法*/ #include #define M 3 #define N 4 int sum(int(*pa)[N]){ int i,j,s=0;for(i=0;i

return s;} void main(){ int a[M][N]={{4,2,7,9},{1,3,13,0},{-5,6,-11,10}};printf(“二维数组中的所有元素之和为%dn”, sum(a));} 8.输入一行数字字符存入字符数组str[80]中,用num[10]中的数组元素作为计数器来统计每个数字字符的个数。用下标为0的元素统计字符“0”的个数,用下标为1的元素统计字符“1”出现的次数,„„。输出每个奇数字符出现的次数。#include void count(char *str, int num[]){ int i=0;while(str[i]!=''){ switch(str[i]){ case '0': num[0]++;break;case '1': num[1]++;break;case '2': num[2]++;break;case '3': num[3]++;break;case '4': num[4]++;break;case '5': num[5]++;break;case '6': num[6]++;break;case '7': num[7]++;break;case '8': num[8]++;break;case '9': num[9]++;break;} i++;} } void main(){ char str[80],*p=str;int num[10]={0}, i;printf(“请输入一行数字字符:”);gets(p);count(p,num);for(i=1;i<10;i+=2)printf(“数字串中%d出现的次数为%dn”,i,num[i]);} 9.在主函数中输入10个不等长字符串,用另一函数sort()对它们排序,然后在主函数中输出已排好序的字符串。要求:每个字符串长度均不超过30字符,用指针数组进行处理。#include #include #define M 10 #define N 31 void sort(char *pstr[]){ int i,j;char *t;for(i=0;i0){ t = pstr[j];pstr[j] = pstr[j+1];pstr[j+1] = t;} } } void main(){ char str[M][N], *pstr[M]={NULL};int i;printf(“请输入10个字符串,每个字符串均不超过30个字符:n”);for(i=0;i #include void main(){ char ch[1000],*p=ch;int a[50],*q=a,num=0,i;gets(ch);for(;*p!='';p++)if(*p>='0' && *p<='9'){ *q=(*p)-'0';p++;while(*p>='0' && *p<='9')*q=(*q)*10+(*(p++)-'0');num+=1;q+=1;} for(i=0,q=a;i

第二篇:C语言程序设计教程课后习题答案

C语言程序设计教程课后习题答案

第一章 C语言程序设计概述 -习题答案 算法的描述有哪些基本方法?

1、自然语言

2、专用工具C语言程序的基本结构是怎样的?举一个例子说明。

1、C语言程序由函数构成;

2、“/*”与“*/”之间的内容构成C语言程序的注释部分;

3、用预处理命令#include、#define可以包含有关文件或预定义信息;

4、大小写字母在C语言中是有区别的;

5、除main()函数和标准库函数外,用户也可以自己编写函数,应用程序一般由多个函数组成,这些函数指定实际所需要做的工作。C语言有什么特点?

1、具有结构语言的特点,程序之间很容易实现段的共享;

2、主要结构成分为函数,函数可以在程序中被定义完成独立的任务,独立地编译代码,以实现程序的模块化;

3、运算符丰富,包含的范围很广;

4、数据类型丰富;

5、允许直接访问物理地址,即可直接对硬件进行损伤,实现汇编语言的大部分功能;

6、限制不太严格,程序设计自由度大,这样使C语言能够减少对程序员的束缚;

7、生成的目标代码质量,程序执行效率高,同时C语言编写的程序的可移植性好。★指出合法与不合法的标识符命名。

AB12--√ leed_3--a*b2--× 8stu--× D.K.Jon--× EF3_3--√ PAS--√ if--× XYZ43K2--√ AVE#XY--× _762--√ #_DT5--× C.D--×说明下列Turbo C热键的功能。

F2:源文件存盘 F10:调用主菜单 F4:程序运行到光标所在行(用于调试程序)Ctrl+F9:编译并链接成可执行文件 Alt+F5:将窗口切换到 DOS 下,查看程序运行结果。说明下列Turbo C方式下输入并运行下列程序,记录下运行结果。

①main()

{printf(“********************n”);printf(“ welcome you n”);printf(“ very good n);printf(”********************n“);} ②main()

{ int a,b,c,t;printf(”please input three numbers;“);scanf(”%d,%d,%d“,&a,&b,&c);/*教材S是错误的*/ t=max(max(a,b),c);printf(”max number is:%dn“,t);} int max(int x, int y){ int z;if(x>y)z=x;else z=y;return(z);} 答

运行结果:

******************** welcome you very good ******************** 运行结果:

please input three numbers;3,1,4 /*左侧下划线内容为键盘输入*/ max number is:4 7 一个C程序是由若干个函数构成的,其中有且只能有一个___函数。

main()8 在Turbo C环境下进行程序调试时,可以使用Run下拉菜单的___命令或按___键转到用户屏幕查看程序运行结果。

1、User screen

2、Alt+F5 9 ★C语言对标识符与关键字有些什么规定?

1、标识符用来表示函数、类型及变量的名称,它是由字母、下划线和数字组成,但必须用字母或下划线开头。

2、关键字是一种语言中规定具有特定含义的标识符,其不能作为变量或函数名来使用,用户只能根据系统的规定使用它们。C源程序输入后是如何进行保存的?

是以C为扩展名保存的纯文本文件。

第二章 C语言程序的基本数据类型与表达式 -习题答案 ★指出下列常数中哪些是符合C语法规定的。

''--× '101'--× ”“--× e3--× 019--√ 0x1e--√ ”abn“--√ 1.e5--×(2+3)e(4-2)--× 5.2e2.5--×请找出下列程序中的错误,改正后写出程序运行结果。

①void main(){int x,y=z=5,aver;x=7 AVER=(x+y+z)/3 printf(”AVER=%dn“,aver);} ②void main()

{ char c1='a';c2='b';c3='c';int a=3.5,b='A' printf(”a=%db='“endn”,a,b);printf(“a%cb%cbc%ctabcn”,c1,c2,c3);} 答

main(){int x,y=5,z=5,aver;x=7;aver=(x+y+z)/3;printf(“AVER=%dn”,aver);}

运行结果:AVER=5 ②main()

{ char c1='a', c2='b', c3='c';int a=3,b='A';printf(“a=%d,b='%c'”end“n”,a,b);printf(“a%cb%cbc%ctabcn”,c1,c2,c3);}

运行结果:a=3,b='A'“end”

aabcc abc 3 写出下列赋值的结果,表格中写了数值的是要将它赋给其他类型的变量,将所有的空格填上赋值后的数据(实数保留到小数点后两位)。int 99

-1 char 'h'

unsigned int

float

55.78

long int

答 int 99 104 66 55 68-1 char 'c' 'h' 'B' '7' 'D'

unsigned int 99 104 66 55 68 65535

float 99.00 104.00 66.00 55.78 68.00-1.00

long int 99 104 66 55 68-1

★写出程序运行结果。

①void main(){int i,j;i=8,j=10;printf(“%d,%d,%d,%dn”,i,j,++i,j++);} ②main()

{ int a=1,b=2,c=30;;printf(“%d,%d,%d,%dn”,a=b=c,a=b==c,a==(b=c),a==(b==c));} 注意:a=b=c,a=b==c之间应为逗号,教材有误 答

运行结果: 9,11,9,10 运行结果: 30,1,0,0

③void main()

{int a=10,b=20,c=30,d;d=++a<=10||b-->=20||c++;printf(“%d,%d,%d,%dn”,a,b,c,d);}

运行结果: 11,19,30,1

★写出下面表达式的值(设a=10,b=4,c=5,d=1,x=2.5,y=3.5)。⑴a%=(b%=3)

⑵n++,a+=a-=a*=a ⑶(float)(a+c)/2+(int)x%(int)y ⑷a*=b+c ⑸++a-c+b++ ⑹++a-c+++b ⑺a

⑼a+b,18+(b=4)*3,(a/b,a%b)

⑽x+a%3*(int)(x+y)%2/4+sizeof(int)⑾a

⑴0 ⑵0 ⑶9.500000 ⑷90 ⑸10 ⑹10 ⑺'A' ⑻2 ⑼4.5 ⑽1 ⑾0 ⑿20 ⒀0 下列每组表达式中,被执行后结果完全等价的是哪些(设a、b、m是已被赋值的整型变量)?

①m=(a=4,4*5)与m=a=4,4*5 ②(float)(a/b)与(float)a/b ③(int)a+b与(int)(a+b)④m%=2+a*3与m=m%2+a*3 ⑤m=1+(a=2)+(b=3)与a=2,b=3,m=1+a+b 答

①前面是赋值表达式,而后面的是一个逗号表达式,所以一定不同;

②前面的表达式中a/b结果为一整数,结果已经取整,精度可能受到影响,之后强制float后才为浮点型,后面的是先将a转换为float后再与b相除,其值保证了精度,所以不同。

③因为a、b均为整数,其前后两个表达式的计算结果是一致的。

④前一表达式是一算术表达式,而后者为一赋值表达式,此为一点不同;另外,前一表达式的m只被赋过一次值,后一表达式中的m曾两次被赋值,第一次赋值时与第一表达式中的值一致,第二次赋值后即不再相同。⑤前后表达式的计算结果应该是一致的:a=2, b=3, m=6 7 条件表达式x>0?x:-x的功能是什么?

如果x的值是一正数,则表达式的值为x值;如果x的值是一非正数,则表达式的值为-x。其实该表达式的值即为x的绝对值,C语言中提供了一个函数fabs(x)即可完成此功能,该函数包含在math.h头文件中。用一个条件表达式描述从a、b、c中找出最大都赋给max.答

max=a>(b>c?b:c)?a:(b>c?b:c);9 ★若x为int型变量,则执行以下语句后x的值为()。x=6;x+=x-=x*x;A.36 B.-60 C.60 D.-24 答 B.10 ★若有以下类型说明语句: char w;int x;float y;double z;则表达式w*x+z-y的结果为()类型。A.float B.char C.int D.double 答 D.第三章 顺序结构程序设计 -习题答案 变量k为float类型,调用函数scanf(“%d”,&k),不能使变量k得到正确数值的原因是___。

格式修饰符与变量类型不一致。因为%d输入的数据类型应该为十进制整数,而&k为占用4个字节的float类型变量的地址。★a=1234,b=12,c=34,则执行“printf(“|%3d%3d%-3d|n”,a,b,c);”后的输出是___。

|1234 1234 |

分析如下:

①%3d为右对齐输出变量,且指定输出变量的值宽度为3个字符位,如果变量实际位数小于3,则左端补空格,如果变量实际位数大于3,则按实际长度输出,不受限制。

②%-3d为左对齐输出变量,在输出变量时,如是变量实际位数小于3,则在右端补空格,否则按实际输出。★设有“int a=255,b=8;”,则“printf(“%x,%on”,a,b);”输出是___。答 ff,10 ①如果“printf(“%X,%on”,a,b);”则输出为FF,10。说明在输出十六进制字母时,其大小写受格式修饰符的限制,如果是“%x”则输出小写,如果是“%X”则输出大写。

②如果希望在输出十六进制时输出前导符0x或0X,则以上输出语句应改“printf(“%#x,%on”,a,b);”为或“printf(“%#X,%on”,a,b);”。本条解释不必须掌握。★以下程序输出的结果是___。main(){ int a1=1,a2=0,a3=2;printf(“%d,%d,%dn”,a1,a1+a2+a3,a3-a1);} 答 1,3,1 5 printf函数中用到格式符%5s,其中5表示输出字符占用5列。如果字符串长度大于5,则按___输出;如果字符串长度小于5,则按___输出。

①实际 ②左端补空格 6 ★已定义变量如下: int a1,a2;char c1,c2;若要求输入a1、a2、c1和c2的值,正确的输入函数调用语句是___。

scanf(“%d,%d,%c,%c”,&a1,&a2,&c1,&c2);7 输入两个整型变量a、b的值,输出下列算式以及运算结果___。a+b、a-b、a*b、a/b、(float)a/b、a%b 每个算式占一行。如a=10,b=5,a+b输出为:10+5=15 答

设int a=10,b=5;以下为输出语句及结果: ①printf(“%d+%d=%dn”,a,b,a+b);10+5=15 ②printf(“%d-%d=%dn”,a,b,a-b);10-5=5 ③printf(“%d*%d=%dn”,a,b,a*b);10*5=50 ④printf(“%d/%d=%dn”,a,b,a/b);10/5=2 ⑤printf(“%(float)d/%d=%fn”,a,b,(float)a/b);(float)10/5=2.000000 ⑥printf(“%d%%%d=%dn”,a,b,a%b);10%5=0 8 ★输入一个非负数,计算以这个数为半径的圆周长和面积。答

#define PI 3.1415926 main(){ float r,l,area;printf(“Input a positive:”);scanf(“%f”,&r);l=2*PI*r;area=PI*r*r;printf(“l=%ftarea=%fn”,l,area);} 9 输入任意一个3位数,将其各位数字反序输出(例如输入123,输出321)。

main(){ int x,y;printf(“Input a number(100-999):”);scanf(“%d”,&x);y=100*(x%10)+10*(x/10%10)+x/100;/*注意分析此处算法*/

第三篇:完整的delphi程序设计教程课后习题答案

1.239页1题小时钟 procedure TForm1.Timer1Timer(Sender: TObject);var xt,yt:integer;h,m,s,ms:word;begin decodetime(time,h,m,s,ms);xt:=paintbox1.clientwidth div 2;yt:=paintbox1.clientheight div 2;paintbox1.refresh;paintbox1.canvas.moveto(xt,yt);paintbox1.canvas.pen.width:=3;paintbox1.canvas.lineto(xt+round(sin((60*h+m)/(12*60)*2*pi)*100), yt-round(cos((60*h+m)/(12*60)*2*pi)*100));paintbox1.canvas.moveto(xt,yt);paintbox1.canvas.pen.width:=2;paintbox1.canvas.lineto(xt+round(sin(m/60*2*pi)*140), yt-round(cos(m/60*2*pi)*140));paintbox1.canvas.moveto(xt,yt);paintbox1.canvas.pen.width:=1;paintbox1.canvas.lineto(xt+round(sin(s/60*2*pi)*180), yt-round(cos(s/60*2*pi)*180));end;end.2.239页3题求两点间的距离 procedure TForm1.Button1Click(Sender: TObject);begin paintbox1.Refresh;formpaint(sender);end;procedure TForm1.FormPaint(Sender: TObject);var xt,yt:integer;ax,ay,bx,by:integer;begin xt:=paintbox1.ClientWidth div 2;yt:=paintbox1.Clientheight div 2;paintbox1.canvas.MoveTo(xt,0);paintbox1.canvas.lineTo(xt,2*yt);paintbox1.canvas.MoveTo(0,yt);paintbox1.canvas.lineTo(2*xt,yt);ax:=strtoint(edit1.text);ay:=strtoint(edit2.text);bx:=strtoint(edit3.text);by:=strtoint(edit4.text);

edit5.Text:=floattostr(sqrt((ax-bx)*(ax-bx)+(ay-by)*(ay-by)));

paintbox1.canvas.MoveTo(xt+ax*10,yt-ay*10);

paintbox1.canvas.lineTo(xt+bx*10,yt-by*10);end;end.3.226页5题输入学生成绩 var

Form1: TForm1;type

studentrecord=record xh,xm:string[6];xb:boolean;yy,sx,dz:integer;end;

implementation {$R *.dfm} procedure

TForm1.Button1Click(Sender: TObject);

var t:studentrecord;

f,f1:file of studentrecord;p1,p2:boolean;begin

assignfile(f,'c:my documentsstu.dat');reset(f);

assignfile(f1,'c:my documentsstu1.dat');rewrite(f1);

while not eof(f)do begin read(f,t);

p1:=(t.sx>=85)and(t.yy>=85)and(t.dz>=85);

p2:=t.sx+t.yy+t.dz>=270;if p1 or p2 then write(f1,t);end;

closefile(f);closefile(f1);end;

procedure

TForm1.FormCreate(Sender: TObject);

var t:studentrecord;f:file of studentrecord;xingbie:string;begin

assignfile(f,'c:my documentsstu.dat');reset(f);

while not eof(f)do begin read(f,t);if t.xb then xingbie:='男' else

xingbie:='女';

listbox1.Items.Add(t.xh+' '+t.xm+' '+xingbie+' '+inttostr(t.sx)+

' '+inttostr(t.yy)+' '+inttostr(t.dz));end;

closefile(f);end;

procedure

TForm1.Button2Click(Sender: TObject);begin close;end;end.4.226页8题保存获得奖学金者 var

Form1: TForm1;type

studentrecord=record xh,xm:string[6];xb:boolean;yy,sx,dz:integer;end;

implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject);var t:studentrecord;f,f1:file of studentrecord;p1,p2:boolean;begin assignfile(f,'c:my documentsstu.dat');reset(f);assignfile(f1,'c:my documentsstu1.dat');rewrite(f1);while not eof(f)do begin read(f,t);p1:=(t.sx>=85)and(t.yy>=85)and(t.dz>=85);p2:=t.sx+t.yy+t.dz>=270;if p1 or p2 then write(f1,t);end;closefile(f);closefile(f1);end;procedure TForm1.FormCreate(Sender: TObject);var t:studentrecord;f:file of studentrecord;xingbie:string;begin assignfile(f,'c:my documentsstu1.dat');reset(f);while not eof(f)do begin read(f,t);if t.xb then xingbie:='男' else xingbie:='女';listbox1.Items.Add(t.xh+' '+t.xm+' '+xingbie+' '+inttostr(t.sx)+ ' '+inttostr(t.yy)+' '+inttostr(t.dz));end;closefile(f);end;procedure TForm1.Button2Click(Sender: TObject);begin close;end;end.5.166页22题素数 procedure

TForm1.Button1Click(Sender: TObject);type

sushuset=set of byte;var

sushu:sushuset;i,j,n,m,k:longword;s,s0:string;begin

n:=strtoint(edit1.text);m:=strtoint(edit2.text);if n mod 2=0 then n:=n+1;k:=m-n;

if k>255 then

showmessage('范围太大,请重新输入区间端点!')else begin

sushu:=[0..k];for i:=2 to n-1 do for j:=n to m do

if j mod i =0 then sushu:=sushu-[j-n];for i:=n to m div 2 do for j:= i+1 to m do

if j mod i =0 then sushu:=sushu-[j-n];s:='';s0:='';

for i:=n to m do if i-n in sushu then begin

if length(s0+' '+inttostr(i))>60 then begin

s:=s+s0+chr(13);s0:='' end;

s0:=s0+' '+inttostr(i);end;s:=s+s0;label1.caption:=s;

groupbox1.Top:=(panel1.Top-groupbox1.height)div 2;end;end;

procedure

TForm1.FormCreate(Sender: TObject);begin

groupbox1.Top:=(panel1.Top-groupbox1.height)div 2;end;

procedure

TForm1.Edit1KeyPress(Sender: TObject;var Key: Char);var j:set of char;begin

j:=['0'..'9',#8];

if not(key in j)then key:=#0;end;end.6.148页12题整除的数 implementation {$R *.dfm}

function d7(x:integer):boolean;begin

if x mod 7=0 then d7:=true else d7:=false;end;

function d17(x:integer):boolean;begin

if x mod 17=0 then d17:=true else d17:=false;end;

procedure

TForm1.FormActivate(Sender: TObject);var

n:integer;begin

for n:=1000 to 4000 do if d7(n)and d17(n)then memo1.Lines.Add(inttostr(n));end;end.7.148页17题求斐波那契数列问题 implementation {$R *.dfm} function fib(n:integer):int64;begin case n of 1,2:fib:=1;else fib:=fib(n-1)+fib(n-2);end;end;procedure TForm1.Button1Click(Sender: TObject);var k:integer;begin memo1.lines.clear;for k:=1 to strtoint(edit1.text)do memo1.lines.add(format('%2d %3d',[k,fib(k)]));end;end.8.120页10题,判断是否是闰年 procedure TForm1.Button1Click(Sender: TObject);var y,m:integer;begin y:=strtoint(edit1.text);m:=strtoint(edit2.text);label3.Caption:='';if((y mod 4 = 0)and(y mod 100 <> 0))or(y mod 400=0)then label3.Caption:=edit1.text+'年是闰年,' else label3.Caption:=edit1.text+'年不是闰年,';case m of 3,4,5:Label3.Caption:=Label3.Caption+edit2.Text+'月份是春天,';6,7,8:Label3.Caption:=Label3.Caption+edit2.Text+'月份是夏天,';9,10,11:Label3.Caption:=Label3.Caption+edit2.Text+'月份是秋天,';else Label3.Caption:=Label3.Caption+edit2.Text+'月份是冬天,';end;

case m of

1,3,5,7,8,10,12:Label3.Caption:=Label3.Caption+'共有31天,';

4,6,9,11:Label3.Caption:=Label3.Caption+'共有30天,';else

if((y mod 4 = 0)and(y mod 100 <> 0)or(y mod 400=0))then Label3.Caption:=Label3.Caption+'共有29天,' else

Label3.Caption:=Label3.Caption+'共有28天,';end;end;end.9.120页11题求和的 procedure

TForm1.Button1Click(Sender: TObject);var

n,k,j:integer;s:int64;begin

n:=strtoint(edit1.text);j:=0;s:=0;

for k:=1 to n do begin j:=j+k;s:=s+j;end;

panel2.Caption:=format('s = %d',[s]);edit1.setfocus;end;

procedure

TForm1.Edit1KeyPress(Sender: TObject;var Key: Char);var b:boolean;begin

b:=(key<>#8)and(key<#48)or(key>#57);

if b then key:=#0;end;end.10.120页12题男人,女人,小孩各有多少人 procedure

TForm1.Button1Click(Sender: TObject);var

x,y,z:integer;p:string;begin

memo1.clear;for x:=0 to 16 do for y:=0 to 24 do begin

z:=30-x-y;

if 3*x+2*y+z/1=50 then begin

p:=format('%3d %3d %3d',[x,y,z]);

memo1.lines.add(p);end;end;end;end.11.98页2题求长方体的表面积 procedure

TForm1.Button1Click(Sender: TObject);var

s,l,k,h:double;begin

l:=strtofloat(edit1.text);k:=strtofloat(edit2.text);h:=strtofloat(edit3.text);s:=2*l*k+2*k*h+2*l*h;label1.Caption:=floattostr(s);end;end.12.98页5题计算圆的面积和周长 procedure

TForm1.Edit1KeyPress(Sender: TObject;var Key: Char);var r:real;b:boolean;begin b:=(key<>#8)and(key<>'.')and(key<>#13)and(key<#48)or(key>#57);if b then key:=#0;if key =#13 then begin if edit1.text='' then edit1.text:='0';r:=strtofloat(edit1.text);if radiobutton1.Checked then label1.Caption:=format('圆的面积为: %f',[pi*r*r]);if radiobutton2.Checked then label1.Caption:=format('圆的周长为: %f',[2*pi*r]);if radiobutton3.Checked then label1.Caption:=format('圆的面积为: %f'+chr(13)+ '周长为: %f',[pi*r*r,2*pi*r]);edit1.SelectAll;end;end;procedure TForm1.RadioButton1Click(Sender: TObject);var sender0:tobject;key:char;begin sender0:=edit1;key:=#13;form1.edit1keypress(sender0,key);end;procedure TForm1.RadioButton2Click(Sender: TObject);var sender0:tobject;key:char;begin sender0:=edit1;key:=#13;form1.edit1keypress(sender0,key);end;procedure TForm1.RadioButton3Click(Sender: TObject);var sender0:tobject;key:char;begin

sender0:=edit1;key:=#13;

form1.edit1keypress(sender0,key);end;end.13.98页6题统计奇数和偶数的个数

procedure

TForm1.Button1Click(Sender: TObject);var

k,j,n:word;begin k:=0;

n:=combobox1.items.count;for j:=1to n do

if strtoint(combobox1.items[j-1])mod 2 = 0 then k:=k+1;

label1.caption:=format('共有: '+#13+'%d个偶数,'+#13+'%d个奇数。',[k,n-k]);end;

procedure

TForm1.Button2Click(Sender: TObject);begin

combobox1.items.clear;end;

procedure

TForm1.ComboBox1KeyPress(Sender: TObject;var Key: Char);begin if(key =#13)and(combobox1.text<>'')then

//按键后接收输入的选项 begin

combobox1.items.insert(0,combobox1.text);

//按键后移去选项

combobox1.selstart:=0;combobox1.text:='';end;

if key = #27 then

if combobox1.itemindex<>-1 then

combobox1.items.Delete(combobox1.itemindex);end;end.14.98页8题设置倒计时的时间,并进行倒计时 procedure

TForm1.Timer1Timer(Sender: TObject);var

m,n,s,h:integer;begin

timer1.Tag:=timer1.Tag-1;m:=timer1.Tag;if m<0 then begin

timer1.enabled:=false;

showmessage('预定的时间到了!');edit1.Text:='0';end else begin s:=m;

n:=s div 60;s:=s mod 60;h:=n div 60;n:=n mod 60;

maskedit1.text:=format('%d:%d:%d',[h,n,s]);

if n <> strtoint(edit1.text)then edit1.Text:=inttostr(n);end;end;

procedure

TForm1.Button1Click(Sender: TObject);begin

timer1.enabled:=True;

timer1.Tag:=strtoint(edit1.Text)*60;end;end.

第四篇:C#应用程序设计教程 第二版+课后习题答案

第一章

1.判断题

(1)×(2)√(3)√(4)×(5)×

(6)√ 2.选择题

(1)C(2)B(3)B(4)C(5)D

(6)C 3.编程题

using System;using System.Collections.Generic;using System.Linq;using System.Text;

namespace ConsoleApplication1 { class Program { static void Main(string[] args){ Console.WriteLine(“Hello C#”);} } }

第二章

1.判断下列符号哪些是合法的C#变量名称

北京 abc _xyz x_y 2.根据要求写出C#表达式(1)N%3==0 & N%5==0(2)(char)new Random().Next(67,74)(3)Math.Pow(x,3)*y/(x+y)(4)Math.Sqrt(b*b-4*a*c)3.判断题

(1)×(2)√(3)√(4)√(5)√

(6)×(7)√(8)√(9)√(10)×(11)√(12)× 4.选择题

(1)B(2)C(3)B(4)B

(5)C

(6)B(7)D(8)B(9)C(10)A 5.分析并写出下列程序运行结果(1)a=21,b=9,c=16

y=4(2)b=41(3)s=6(4)a[0]=28

a[1]=15

a[2]=39

a[3]=48

a[4]=39 6.程序填空

(1)① 3 ② a[i] ③ a[i] ④ a[5-i] ⑤ a[5-i](2)① i % 5 == 0 | i % 7 == 0 ② s+ i 7.编程题(1)static void Main(string[] args){ int s,i,j;for(i = 2;i < 1000;i++){ s = 0;for(j = 1;j < i;j++){ if(i % j == 0)s += j;} if(i == s)Console.WriteLine(“{0}”,i);} }(2)static void Main(string[] args){ int[,] a = {{2,5,18,4 },{3,4,9,2},{4,1,16,8},{5,2,14,6}};int i,j,k,max,maxj;for(i = 0;i < 4;i++){ max = a[i,0];maxj = 0;for(j = 1;j < 4;j++){ if(max < a[i,j]){max = a[i,j];maxj = j;} } for(k = 0;k < 4;k++){ if(a[k, maxj] < max)break;} if(k == 4)Console.WriteLine(“鞍点:第{0}行,第{1}列”,i+1,maxj+1);} }(3)

static void Main(string[] args){ int a = 20, b = 16,i=20;do { if(i % a == 0 & i % b == 0)break;i++;} while(true);Console.WriteLine(“最小公倍数:{0}”,i);i = 16;do { if(a % i == 0 & b % i == 0)break;i--;} while(true);Console.WriteLine(“最大公约数:{0}”,i);}(4)

static void Main(string[] args){ int i, j,k;float s = 1.0f;for(i = 2;i < 11;i++){ k=1;for(j = 2;j <= i;j++)k += j;s += 1.0f / k;} Console.WriteLine(“s={0}”,s);}(5)

static void Main(string[] args){ String s = “a,b2>4[AG6p(”;int i, n1=0,n2=0,n3=0,n4=0;for(i=0;i=65 & s[i]<=90)n1++;if(s[i]>=97 & s[i]<=122)n2++;if(s[i]>=48 & s[i]<=57)n3++;} n4=s.Length-n1-n2-n3;Console.WriteLine(“大写字母个数:{0};小写字母个数:{1};数字个数:{2};其余字符个数:{3}”,n1,n2,n3,n4);}(6)

static void Main(string[] args){ int i,s = 1;for(i = 0;i < 5;i++){ s = 2 *(s + 1);} Console.WriteLine(“小猴子第一天摘了{0}个桃子”,s);}

说明:由最后一天往前推算。后一天吃了前一天桃子数量的一半多1个,剩余桃子数量是前一天桃子数量的一半减1,则,前一天的桃子数量是后一天的桃子数量加1的2倍。

第三章

1.判断题

(1)√(2)×(3)√

(4)√(5)√(6)×(7)√(8)×(9)×

(10)√

(11)√(12)√(13)√(14)×(15)√(16)√(17)×(18)√(19)√(20)×(21)×(22)√(23)√(24)√(25)×(26)×(27)× 2.选择题

(1)C(2)B(3)C(4)D

(5)C

(6)B(7)D(8)C(9)A(10)A(11)B(12)A(13)D(14)B

(15)C

3.分析下列程序的运行结果(1)s=32,s1=32,s2=34

x=11,y=21(2)x1=3,x2=4

y1=1,y2=4 4.编程题(1)

class Student { public string studentid;public string studentname;private string birthplace;private DateTime birthdate;public Student(string id, string name){ studentid = id;studentname = name;} public string StudentId { get { return studentid;} set { studentid = value;} } public string StudentName { get { return studentname;} set { studentname = value;} } public string BirthPlace { get { return birthplace;} set { birthplace = value;} } public DateTime BirthDate { get { return birthdate;} set { birthdate = value;} } public int Age { get { return DateTime.Now.Year1, p1.yp1.x)*(p2.xp1.y)*(p2.yv2;if(radioButton3.Checked ==true)v = v1 * v2;if(radioButton4.Checked ==true){ if(v2!= 0)v = v1 / v2;} textBox3.Text = v.ToString();} 3.利用4.6节知识,参考图4-29设计具有菜单、工具栏和状态栏的Windows窗口应用程序。

第五章

1.判断题

(1)√(2)×(3)√(4)√(5)×

(6)√(7)×

2.选择题

(1)A(2)无答案,应该是TextReader(3)A(4)C

(5)A(6)C 3.编程题

创建Windows窗口用于程序,在窗口上放置一个Button控件,名称为button1,编写其Click事件处理方法:

private void button1_Click(object sender, EventArgs e){ int i, j;int[,] a=new int[3,3];int[,] b = new int[3, 3];int[,] c = new int[3, 3];string s1;string[] ss;FileStream fs = new FileStream(@“d:data1.txt”,FileMode.Open);StreamReader sr=new StreamReader(fs,Encoding.Default);StreamWriter sw;BinaryWriter bw;for(i = 0;i < 3;i++){ s1 = sr.ReadLine();ss = s1.Split(' ');for(j = 0;j < 3;j++){ a[i, j] = int.Parse(ss[j]);} } for(i = 0;i < 3;i++){ s1 = sr.ReadLine();ss = s1.Split(' ');for(j = 0;j < 3;j++){ b[i, j] = int.Parse(ss[j]);} } sr.Close();fs.Close();for(i = 0;i < 3;i++)for(j = 0;j < 3;j++)c[i, j] = a[i, j] + b[i, j];SaveFileDialog sfd = new SaveFileDialog();sfd.Filter = “文本文件(*.txt)|*.txt”;if(sfd.ShowDialog()== DialogResult.OK){ fs = new FileStream(sfd.FileName, FileMode.OpenOrCreate);sw = new StreamWriter(fs,Encoding.Default);for(i = 0;i < 3;i++){ for(j = 0;j < 3;j++){ sw.Write(c[i, j]);sw.Write(“ ”);} sw.Write(“n”);} sw.Close();fs.Close();} sfd.Filter = “二进制文件(*.bin)|*.bin”;if(sfd.ShowDialog()== DialogResult.OK){ fs = new FileStream(sfd.FileName, FileMode.OpenOrCreate);bw = new BinaryWriter(fs);for(i = 0;i < 3;i++)for(j = 0;j < 3;j++)bw.Write(c[i, j]);bw.Close();fs.Close();} } 说明:data1.txt文件中共9行整数,每行3个整数,每个数据之间以一个空格隔开。

第六章

1.判断题

(1)√(2)×(3)×(4)×(5)√

(6)√(7)√(8)×(9)×(10)√

2.选择题

(1)C(2)D(3)C(4)A

(5)B(6)C(7)B(8)D 3.编程题

创建Windows窗口应用程序,在窗口上放置一个toolStrip控件,并在其中添加两个组合框,名称分别为toolStripComboBox1和toolStripComboBox2,给toolStripComboBox1添加选项:短划线、点划线、双点划线、虚线、实线,给toolStripComboBox2添加选项:1、2、3、4。给窗口添加如下私有字段:

private Graphics g1;private DashStyle dashstyle=DashStyle.Solid;private float penwidth=1;private Pen pen1;private bool beDraw = false;private Point p1, p2;编写comboBox1和comboBox2的SelectedIndexChanged事件处理方法:

private void comboBox1_SelectedIndexChanged(object sender, EventArgs e){ dashstyle =(DashStyle)comboBox1.SelectedIndex;}

private void comboBox2_SelectedIndexChanged(object sender, EventArgs e){ penwidth =float.Parse(comboBox2.Text);} 编写Form3的Load、MouseDown、MouseMove和MouseUp以及工具栏上两个组合框的SelectedIndexChanged事件处理方法:

private void Form3_Load(object sender, EventArgs e){ toolStripComboBox1.SelectedIndex = toolStripComboBox1.Items.Count-1;toolStripComboBox2.SelectedIndex = 0;} private void Form3_MouseDown(object sender, MouseEventArgs e){ pen1 = new Pen(Color.Red, penwidth);pen1.DashStyle = dashstyle;beDraw = true;p1 = e.Location;g1 = this.CreateGraphics();} private void Form3_MouseMove(object sender, MouseEventArgs e){ if(beDraw == true){ p2 = e.Location;g1.DrawLine(pen1, p1, p2);p1 = p2;} } private void Form3_MouseUp(object sender, MouseEventArgs e){ beDraw = false;} private void toolStripComboBox1_SelectedIndexChanged(object sender, EventArgs e){ dashstyle =(DashStyle)toolStripComboBox1.SelectedIndex;} private void toolStripComboBox2_SelectedIndexChanged(object sender, EventArgs e){ penwidth = float.Parse(toolStripComboBox2.Text);}

第七章

1.判断题

(1)√(2)×(3)×(4)×(5)√

(6)×(7)√(8)×(9)√(10)×(11)√(12)×(13)√(14)√(15)√(16)√

2.选择题

(1)A(2)D(3)C(4)A

(5)D(6)B(7)C(8)D(9)B(10)C(11)C 12)C 13)A 14)B 15)D 16)D 3.编程题

(1)创建Windows窗口应用程序,在窗口上放置两个Button控件,名称分别为button1和button2,再放置一个ComboBox控件和DataGridView控件,名称分别为comboBox1和dataGridView1。

编写button1的Click事件处理方法:

private void button1_Click(object sender, EventArgs e){ OleDbConnection con = new OleDbConnection();OleDbCommand com = new OleDbCommand();con.ConnectionString =@“Provider=microsoft.jet.oledb.4.0;data source=d:aaa.mdb”;con.Open();com.CommandType = CommandType.Text;com.CommandText = “select * from Score where score>80”;com.Connection = con;OleDbDataReader dr = com.ExecuteReader();comboBox1.Items.Clear();while(dr.Read()== true){ if(dr.IsDBNull(dr.GetOrdinal(“StudentID”))== false)

comboBox1.Items.Add(dr[“StudentID”]);} } 说明:为了使用ADO.NET的OLEDB访问方式,需要添加下列引用:

using System.Data.OleDb;(2)界面与(1)相同。

编写button2的Click事件处理方法:

private void button2_Click(object sender, EventArgs e){ OleDbConnection con = new OleDbConnection();OleDbCommand com = new OleDbCommand();con.ConnectionString = @“Provider=microsoft.jet.oledb.4.0;data source=d:aaa.mdb”;con.Open();OleDbDataAdapter da = new OleDbDataAdapter(“select Class as 班级,avg(Score)as平均成绩 from Score group by Class”, con);DataSet ds = new DataSet();da.Fill(ds, “平均成绩表”);dataGridView1.DataSource =ds.Tables[“平均成绩表”];}(3)参考7.7节的学生信息管理程序,编写通讯录管理程序,细节略。

第五篇:量子力学教程课后习题答案

量子力学习题及解答

第一章

量子理论基础

1.1

由黑体辐射公式导出维恩位移定律:能量密度极大值所对应的波长与温度T成反比,即

T=b(常量);

并近似计算b的数值,准确到二位有效数字。

根据普朗克的黑体辐射公式,(1)

以及,(2),(3)

这里的的物理意义是黑体内波长介于λ与λ+dλ之间的辐射能量密度。

本题关注的是λ取何值时,取得极大值,因此,就得要求

对λ的一阶导数为零,由此可求得相应的λ的值,记作。但要注意的是,还需要验证对λ的二阶导数在处的取值是否小于零,如果小于零,那么前面求得的就是要求的,具体如下:

如果令x=,则上述方程为

这是一个超越方程。首先,易知此方程有解:x=0,但经过验证,此解是平庸的;另外的一个解可以通过逐步近似法或者数值计算法获得:x=4.97,经过验证,此解正是所要求的,这样则有

把x以及三个物理常量代入到上式便知

这便是维恩位移定律。据此,我们知识物体温度升高的话,辐射的能量分布的峰值向较短波长方面移动,这样便会根据热物体(如遥远星体)的发光颜色来判定温度的高低。

1.2

在0K附近,钠的价电子能量约为3eV,求其德布罗意波长。

根据德布罗意波粒二象性的关系,可知

E=h,如果所考虑的粒子是非相对论性的电子(),那么

如果我们考察的是相对性的光子,那么

E=pc

注意到本题所考虑的钠的价电子的动能仅为3eV,远远小于电子的质量与光速平方的乘积,即,因此利用非相对论性的电子的能量——动量关系式,这样,便有

在这里,利用了

以及

最后,对

作一点讨论,从上式可以看出,当粒子的质量越大时,这个粒子的波长就越短,因而这个粒子的波动性较弱,而粒子性较强;同样的,当粒子的动能越大时,这个粒子的波长就越短,因而这个粒子的波动性较弱,而粒子性较强,由于宏观世界的物体质量普遍很大,因而波动性极弱,显现出来的都是粒子性,这种波粒二象性,从某种子意义来说,只有在微观世界才能显现。

1.3

氦原子的动能是(k为玻耳兹曼常数),求T=1K时,氦原子的德布罗意波长。

根据,知本题的氦原子的动能为

显然远远小于这样,便有

这里,利用了

最后,再对德布罗意波长与温度的关系作一点讨论,由某种粒子构成的温度为T的体系,其中粒子的平均动能的数量级为kT,这样,其相庆的德布罗意波长就为

据此可知,当体系的温度越低,相应的德布罗意波长就越长,这时这种粒子的波动性就越明显,特别是当波长长到比粒子间的平均距离还长时,粒子间的相干性就尤为明显,因此这时就能用经典的描述粒子统计分布的玻耳兹曼分布,而必须用量子的描述粒子的统计分布——玻色分布或费米公布。

1.4

利用玻尔——索末菲的量子化条件,求:

(1)一维谐振子的能量;

(2)在均匀磁场中作圆周运动的电子轨道的可能半径。

已知外磁场H=10T,玻尔磁子,试计算运能的量子化间隔△E,并与T=4K及T=100K的热运动能量相比较。

玻尔——索末菲的量子化条件为

其中q是微观粒子的一个广义坐标,p是与之相对应的广义动量,回路积分是沿运动轨道积一圈,n是正整数。

(1)设一维谐振子的劲度常数为k,谐振子质量为μ,于是有

这样,便有

这里的正负号分别表示谐振子沿着正方向运动和沿着负方向运动,一正一负正好表示一个来回,运动了一圈。此外,根据

可解出

这表示谐振子的正负方向的最大位移。这样,根据玻尔——索末菲的量子化条件,有

为了积分上述方程的左边,作以下变量代换;

这样,便有

这时,令上式左边的积分为A,此外再构造一个积分

这样,便有

(1)

这里

=2θ,这样,就有

(2)

根据式(1)和(2),便有

这样,便有

其中

最后,对此解作一点讨论。首先,注意到谐振子的能量被量子化了;其次,这量子化的能量是等间隔分布的。

(2)当电子在均匀磁场中作圆周运动时,有

这时,玻尔——索末菲的量子化条件就为

又因为动能耐,所以,有

其中,是玻尔磁子,这样,发现量子化的能量也是等间隔的,而且

具体到本题,有

根据动能与温度的关系式

以及

可知,当温度T=4K时,当温度T=100K时,显然,两种情况下的热运动所对应的能量要大于前面的量子化的能量的间隔。

1.5

两个光子在一定条件下可以转化为正负电子对,如果两光子的能量相等,问要实现实种转化,光子的波长最大是多少?

关于两个光子转化为正负电子对的动力学过程,如两个光子以怎样的概率转化为正负电子对的问题,严格来说,需要用到相对性量子场论的知识去计算,修正当涉及到这个过程的运动学方面,如能量守恒,动量守恒等,我们不需要用那么高深的知识去计算,具休到本题,两个光子能量相等,因此当对心碰撞时,转化为正风电子对反需的能量最小,因而所对应的波长也就最长,而且,有

此外,还有

于是,有

尽管这是光子转化为电子的最大波长,但从数值上看,也是相当小的,我们知道,电子是自然界中最轻的有质量的粒子,如果是光子转化为像正反质子对之类的更大质量的粒子,那么所对应的光子的最大波长将会更小,这从某种意义上告诉我们,当涉及到粒子的衰变,产生,转化等问题,一般所需的能量是很大的。能量越大,粒子间的转化等现象就越丰富,这样,也许就能发现新粒子,这便是世界上在造越来越高能的加速器的原因:期待发现新现象,新粒子,新物理。

第二章波

函数和薛定谔方程

2.1证明在定态中,几率流与时间无关。

证:对于定态,可令

可见无关。

2.2

由下列定态波函数计算几率流密度:

从所得结果说明表示向外传播的球面波,表示向内(即向原点)

传播的球面波。

解:

在球坐标中

同向。表示向外传播的球面波。

可见,反向。表示向内(即向原点)

传播的球面波。

补充:设,粒子的位置几率分布如何?这个波函数能否归一化?

∴波函数不能按方式归一化。

其相对位置几率分布函数为

表示粒子在空间各处出现的几率相同。

2.3

一粒子在一维势场

中运动,求粒子的能级和对应的波函数。

解:无关,是定态问题。其定态S—方程

在各区域的具体形式为

Ⅰ:①

Ⅱ:②

Ⅲ:③

由于(1)、(3)方程中,由于,要等式成立,必须

即粒子不能运动到势阱以外的地方去。

方程(2)可变为

令,得

其解为

根据波函数的标准条件确定系数A,B,由连续性条件,得

由归一化条件

可见E是量子化的。

对应于的归一化的定态波函数为

#

2.4.证明(2.6-14)式中的归一化常数是

证:

(2.6-14)

由归一化,得

∴归一化常数

#

2.5

求一维谐振子处在激发态时几率最大的位置。

解:

令,得

由的表达式可知,时。显然不是最大几率的位置。

可见是所求几率最大的位置。

#

2.6

在一维势场中运动的粒子,势能对原点对称:,证明粒子的定态波函数具有确定的宇称。

证:在一维势场中运动的粒子的定态S-方程为

将式中的代换,得

利用,得

比较①、③式可知,都是描写在同一势场作用下的粒子状态的波函数。由于它们描写的是同一个状态,因此之间只能相差一个常数。方程①、③可相互进行空间反演

而得其对方,由①经反演,可得③,④

由③再经反演,可得①,反演步骤与上完全相同,即是完全等价的。

④乘

⑤,得

可见,当时,具有偶宇称,当时,具有奇宇称,当势场满足时,粒子的定态波函数具有确定的宇称。#

2.7

一粒子在一维势阱中

运动,求束缚态()的能级所满足的方程。

解法一:粒子所满足的S-方程为

按势能的形式分区域的具体形式为

Ⅰ:

Ⅱ:

Ⅲ:

整理后,得

Ⅰ:

Ⅱ:.⑤

Ⅲ:

Ⅰ:

Ⅱ:.⑧

Ⅲ:

各方程的解为

由波函数的有限性,有

因此

由波函数的连续性,有

整理(10)、(11)、(12)、(13)式,并合并成方程组,得

解此方程即可得出B、C、D、F,进而得出波函数的具体形式,要方程组有非零解,必须

为所求束缚态能级所满足的方程。#

解法二:接(13)式

#

解法三:

(11)-(13)

(10)+(12)

(11)+(13)

(12)-(10)

(b)

k

a

ctgk

k)

()

()

()

(1

=

Þ

+

合并:

利用

#

解法四:(最简方法-平移坐标轴法)

Ⅰ:

(χ≤0)

Ⅱ:

(0<χ<2)

Ⅲ:

(χ≥2)

束缚态<<

因此

由波函数的连续性,有

(7)代入(6)

利用(4)、(5),得

#

2.8分子间的范德瓦耳斯力所产生的势能可以近似表示为

求束缚态的能级所满足的方程。

解:势能曲线如图示,分成四个区域求解。

定态S-方程为

对各区域的具体形式为

Ⅰ:

Ⅱ:

Ⅲ:

Ⅳ:

对于区域Ⅰ,粒子不可能到达此区域,故

.①

对于束缚态来说,有

各方程的解分别为

由波函数的有限性,得

由波函数及其一阶导数的连续,得

由⑦、⑧,得

(11)

⑨、⑩得

(12)

令,则①式变为

联立(12)、(13)得,要此方程组有非零解,必须

把代入即得

此即为所要求的束缚态能级所满足的方程。

#

附:从方程⑩之后也可以直接用行列式求解。见附页。

此即为所求方程。

#

补充练习题一

1、设,求A

=?

解:由归一化条件,有

利用

#

2、求基态微观线性谐振子在经典界限外被发现的几率。

解:基态能量为

设基态的经典界限的位置为,则有

在界限外发现振子的几率为)

(2

0

0

0

x

a

x

a

x

e

dx

e

dx

e

a

a

a

p

a

y

p

a

p

a

w

¥

¥

=

+

=

ò

ò

式中为正态分布函数

当。查表得

∴在经典极限外发现振子的几率为0.16。

#

3、试证明是线性谐振子的波函数,并求此波函数对应的能量。

证:线性谐振子的S-方程为

把代入上式,有

把代入①式左边,得

当时,左边

=

右边。

n

=

3,是线性谐振子的波函数,其对应的能量为。

第三章

量子力学中的力学量

3.1

一维谐振子处在基态,求:

(1)势能的平均值;

(2)动能的平均值;

(3)动量的几率分布函数。

解:(1)

(2)

(3)

动量几率分布函数为

#

3.2.氢原子处在基态,求:

(1)r的平均值;

(2)势能的平均值;

(3)最可几半径;

(4)动能的平均值;

(5)动量的几率分布函数。

解:(1)

(3)电子出现在r+dr球壳内出现的几率为

当为几率最小位置

是最可几半径。

(4)

(5)

动量几率分布函数

#

3.3

证明氢原子中电子运动所产生的电流密度在球极坐标中的分量是

证:电子的电流密度为

在球极坐标中为

中的和部分是实数。

可见,#

3.4

由上题可知,氢原子中的电流可以看作是由许多圆周电流组成的。

(1)求一圆周电流的磁矩。

(2)证明氢原子磁矩为

原子磁矩与角动量之比为

这个比值称为回转磁比率。

解:(1)

一圆周电流的磁矩为

(为圆周电流,为圆周所围面积)

(2)氢原子的磁矩为

在单位制中

原子磁矩与角动量之比为

#

3.5

一刚性转子转动惯量为I,它的能量的经典表示式是,L为角动量,求与此对应的量子体系在下列情况下的定态能量及波函数:

(1)

转子绕一固定轴转动:

(2)

转子绕一固定点转动:

解:(1)设该固定轴沿Z轴方向,则有

哈米顿算符

其本征方程为

(无关,属定态问题)

令,则

取其解为

(可正可负可为零)

由波函数的单值性,应有

∴m=

0,±1,±2,…

转子的定态能量为

(m=

0,±1,±2,…)

可见能量只能取一系列分立值,构成分立谱。

定态波函数为

A为归一化常数,由归一化条件

转子的归一化波函数为

综上所述,除m=0外,能级是二重简并的。

(2)取固定点为坐标原点,则转子的哈米顿算符为

无关,属定态问题,其本征方程为

(式中设为的本征函数,为其本征值)

令,则有

此即为角动量的本征方程,其本征值为

其波函数为球谐函数

转子的定态能量为

可见,能量是分立的,且是重简并的。

#

3.6

设t=0时,粒子的状态为

求此时粒子的平均动量和平均动能。

解:

可见,动量的可能值为

动能的可能值为

对应的几率应为

上述的A为归一化常数,可由归一化条件,得

动量的平均值为

#

3.7

一维运动粒子的状态是

其中,求:

(1)粒子动量的几率分布函数;

(2)粒子的平均动量。

解:(1)先求归一化常数,由

动量几率分布函数为

(2)

#

3.8.在一维无限深势阱中运动的粒子,势阱的宽度为,如果粒子的状态由波函数

描写,A为归一化常数,求粒子的几率分布和能量的平均值。

解:由波函数的形式可知一维无限深势阱的分布如图示。粒子能量的本征函数和本征值为

动量的几率分布函数为

先把归一化,由归一化条件,∴

3.9.设氢原子处于状态

求氢原子能量、角动量平方及角动量Z分量的可能值,这些可能值出现的几率和这些力学量的平均值。

解:在此能量中,氢原子能量有确定值

角动量平方有确定值为

角动量Z分量的可能值为

其相应的几率分别为,其平均值为

3.10一粒子在硬壁球形空腔中运动,势能为

求粒子的能级和定态函数。

解:据题意,在的区域,所以粒子不可能运动到这一区域,即在这区域粒子的波函数

()

由于在的区域内。只求角动量为零的情况,即,这时在各个方向发现粒子的几率是相同的。即粒子的几率分布与角度无关,是各向同性的,因此,粒子的波函数只与有关,而与无关。设为,则粒子的能量的本征方程为

令,得

其通解为

波函数的有限性条件知,有限,则

A

=

0

由波函数的连续性条件,有

其中B为归一化,由归一化条件得

归一化的波函数

#

3.11.求第3.6题中粒子位置和动量的测不准关系

解:

3.12

粒子处于状态

式中为常量。当粒子的动量平均值,并计算测不准关系

解:①先把归一化,由归一化条件,得

/

是归一化的②

动量平均值为

(奇被积函数)

#

3.13利用测不准关系估计氢原子的基态能量。

解:设氢原子基态的最概然半径为R,则原子半径的不确定范围可近似取为

由测不准关系

对于氢原子,基态波函数为偶宇称,而动量算符为奇宇称,所以

又有

所以

可近似取

能量平均值为

作为数量级估算可近似取

则有

基态能量应取的极小值,由

代入,得到基态能量为

补充练习题二

1.试以基态氢原子为例证明:的本征函数,而是的本征函数。

可见,可见,是的本征函数。

2.证明:的氢原子中的电子,在的方向上被发现的几率最大。

解:

∴的电子,其

当时

为最大值。即在方向发现电子的几率最大。

在其它方向发现电子的几率密度均在~之间。

3.试证明:处于1s,2p和3d态的氢原子的电子在离原子核的距离分别为的球壳内被发现的几率最大(为第一玻尔轨道半径)。

证:①对1s态,令

易见,当不是最大值。

为最大值,所以处于1s态的电子在处被发现的几率最大。

②对2p态的电子

易见,当为最小值。

为几率最大位置,即在的球壳内发现球态的电子的几率最大。

③对于3d态的电子

易见,当为几率最小位置。

为几率最大位置,即在的球壳内发现球态的电子的几率最大。

4.当无磁场时,在金属中的电子的势能可近似视为

其中,求电子在均匀场外电场作用下穿过金属表面的透射系数。

解:设电场强度为,方向沿χ轴负向,则总势能为,势能曲线如图所示。则透射系数为

式中为电子能量。,由下式确定

令,则有

∴透射系数

5.指出下列算符哪个是线性的,说明其理由。

①;

②;

解:①是线性算符

②不是线性算符

③是线性算符

6.指出下列算符哪个是厄米算符,说明其理由。

7、下列函数哪些是算符的本征函数,其本征值是什么?

①,②,③,④,⑤

解:①

不是的本征函数。

不是的本征函数,其对应的本征值为1。

可见,是的本征函数,其对应的本征值为-1。

是的本征函数,其对应的本征值为-1。

是的本征函数,其对应的本征值为-1。

8、试求算符的本征函数。

解:的本征方程为

(的本征值)

9、如果把坐标原点取在一维无限深势阱的中心,求阱中粒子的波函数和能级的表达式。

解:

方程(分区域):

Ⅰ:

Ⅲ:

Ⅱ:

标准条件:

取,即

粒子的波函数为

粒子的能级为

由归一化条件,得

粒子的归一化波函数为

10、证明:处于1s、2p和3d态的氢原子中的电子,当它处于距原子核的距离分别为的球壳处的几率最(为第一玻尔轨道半径)。

证:

令,则得

∴为几率最小处。

∴为几率最大处。

令,则得

为最大几率位置。

时,∴为几率最小位置。

令,得

同理可知

为几率最小处。

为几率最大处。

11、求一维谐振子处在第一激发态时几率最大的位置。

解:

令,得,∴

为几率最小处。,∴

为几率最大处。

6.设氢原子处在的态(为第一玻尔轨道半径),求

①的平均值;

②势能的平均值。

解:①

12、粒子在势能为的场中运动。证明对于能量的状态,其能量由下式决定:

(其中)

证:方程

Ⅰ:

Ⅱ:

Ⅲ:

则得

Ⅰ:

Ⅱ:

Ⅲ:

其通解为

利用标准条件,由有限性知

由连续性知

由①、②,得

由③、④,得

把⑤、⑥代入,得

整理,得

由,得

###

13、设波函数,求

解:

14、说明:如果算符和都是厄米的,那么

(+)也是厄米的证:

+也是厄米的。

15、问下列算符是否是厄米算符:

解:①

因为

不是厄米算符。

是厄米算符。

##

16、如果算符满足关系式,求证

证:

17、求

解:

=

018、解:

=

0

第四章

态和力学量的表象

4.1.求在动量表象中角动量的矩阵元和的矩阵元。

解:

#

4.2

求能量表象中,一维无限深势阱的坐标与动量的矩阵元。

解:基矢:

能量:

对角元:

当时,#

4.3

求在动量表象中线性谐振子的能量本征函数。

解:定态薛定谔方程为

两边乘以,得

跟课本P.39(2.7-4)式比较可知,线性谐振子的能量本征值和本征函数为

式中为归一化因子,即

#

4.4.求线性谐振子哈密顿量在动量表象中的矩阵元。

解:

#

4.5

设已知在的共同表象中,算符的矩阵分别为

求它们的本征值和归一化的本征函数。最后将矩阵对角化。

解:的久期方程为

∴的本征值为的本征方程

其中设为的本征函数共同表象中的矩阵

当时,有

由归一化条件

对应于的本征值0。

当时,有

由归一化条件

∴归一化的对应于的本征值

当时,有

由归一化条件

∴归一化的对应于的本征值

由以上结果可知,从的共同表象变到表象的变换矩阵为

∴对角化的矩阵为

按照与上同样的方法可得的本征值为的归一化的本征函数为

从的共同表象变到表象的变换矩阵为

利用S可使对角化

#

4.6求连续性方程的矩阵表示

解:连续性方程为

写成矩阵形式为

第五章

微扰理论

5.1

如果类氢原子的核不是点电荷,而是半径为、电荷均匀分布的小球,计算这种效应对类氢原子基态能量的一级修正。

解:这种分布只对的区域有影响,对的区域无影响。据题意知

其中是不考虑这种效应的势能分布,即

为考虑这种效应后的势能分布,在区域,在区域,可由下式得出,由于很小,所以,可视为一种微扰,由它引起的一级修正为(基态)

∴,故。

#

5.2

转动惯量为I、电偶极矩为的空间转子处在均匀电场在中,如果电场较小,用微扰法求转子基态能量的二级修正。

解:取的正方向为Z轴正方向建立坐标系,则转子的哈米顿算符为

取,则

由于电场较小,又把视为微扰,用微扰法求得此问题。的本征值为

本征函数为的基态能量为,为非简并情况。根据定态非简并微扰论可知

#

5.3

设一体系未受微扰作用时有两个能级:,现在受到微扰的作用,微扰矩阵元为;都是实数。用微扰公式求能量至二级修正值。

解:由微扰公式得

能量的二级修正值为

#

5.4设在时,氢原子处于基态,以后受到单色光的照射而电离。设单色光的电场可以近似地表示为,及均为零;电离电子的波函数近似地以平面波表示。求这单色光的最小频率和在时刻跃迁到电离态的几率。

解:①当电离后的电子动能为零时,这时对应的单色光的频率最小,其值为

②时,氢原子处于基态,其波函数为

在时刻,微扰

其中

在时刻跃迁到电离态的几率为

对于吸收跃迁情况,上式起主要作用的第二项,故不考虑第一项,O

θ

α

x

y

z()

其中

取电子电离后的动量方向为Z方向,取、所在平面为面,则有

#

5.5基态氢原子处于平行板电场中,若电场是均匀的且随时间按指数下降,即

求经过长时间后氢原子处在2p态的几率。

解:对于2p态,可取三值,其相应的状态为

氢原子处在2p态的几率也就是从跃迁到的几率之和。

(取方向为Z轴方向)

=

0

=

0

由上述结果可知,∴

当时,其中

#

5.6计算氢原子由第一激发态到基态的自发发射几率。

解:

由选择定则,知是禁戒的故只需计算的几率

2p有三个状态,即

(1)先计算z的矩阵元

(2)计算x的矩阵元

(3)计算的矩阵元

(4)计算

#

5.7

计算氢原子由2p态跃迁到1s态时所发出的光谱线强度。

解:

若,则

#

5.8求线性谐振子偶极跃迁的选择定则

解:

时,即选择定则为

#

补充练习三

1、一维无限深势阱中的粒子受到微扰

作用,试求基态能级的一级修正。

解:基态波函数(零级近似)为

∴能量一级修正为

2、具有电荷为的离子,在其平衡位置附近作一维简谐振动,在光的照射下发生跃迁。设入射光的能量为。其波长较长,求:

原来处于基态的离子,单位时间内跃迁到第一激发态的几率。

②讨论跃迁的选择定则。

(提示:利用积分关系

答:①

②仅当,所以谐振子的偶极跃迁的选择定则是)

解:①

(对于一维线性谐振子~)

其中

一维线性谐振子的波函数为

跃迁几率,当时的跃迁为禁戒跃迁。

可见,所讨论的选择定则为。

#

3、电荷e的谐振子,在时处于基态,时处于弱电场之中(为常数),试求谐振子处于第一激发态的几率。

解:取电场方向为轴正方向,则有

当经过很长时间以后,即当时。

实际上在以后即可用上述结果。

#

第七章

自旋与全同粒子

7.1.证明:

证:由对易关系

反对易关系,得

上式两边乘,得

7.2

求在自旋态中,和的测不准关系:

解:在表象中、、的矩阵表示分别为

在态中

讨论:由、的对易关系

[,]

要求

在态中,∴

可见①式符合上式的要求。

7.3.求的本征值和所属的本征函数。

解:的久期方程为

∴的本征值为。

设对应于本征值的本征函数为

由本征方程,得

由归一化条件,得

对应于本征值的本征函数为

设对应于本征值的本征函数为

由本征方程

由归一化条件,得

对应于本征值的本征函数为

同理可求得的本征值为。其相应的本征函数分别为

7.4

求自旋角动量方向的投影

本征值和所属的本征函数。

在这些本征态中,测量有哪些可能值?这些可能值各以多大的几率出现?的平均值是多少?

解:在表象,的矩阵元为

其相应的久期方程为

所以的本征值为。

设对应于的本征函数的矩阵表示为,则

由归一化条件,得

可见,的可能值为

相应的几率为

同理可求得

对应于的本征函数为

在此态中,的可能值为

相应的几率为

7.5设氢的状态是

①求轨道角动量z分量和自旋角动量z分量的平均值;

②求总磁矩的z分量的平均值(用玻尔磁矩子表示)。

解:ψ可改写成从ψ的表达式中可看出的可能值为

0

相应的几率为的可能值为

相应的几率为

7.6

一体系由三个全同的玻色子组成,玻色子之间无相互作用。玻色子只有两个可能的单粒子态。问体系可能的状态有几个?它们的波函数怎样用单粒子波函数构成?

解:体系可能的状态有4个。设两个单粒子态为,则体系可能的状态为

7.7

证明和组成的正交归一系。

解:

=0

同理可证其它的正交归一关系。

7.8

设两电子在弹性辏力场中运动,每个电子的势能是。如果电子之间的库仑能和相比可以忽略,求当一个电子处在基态,另一电子处于沿x方向运动的第一激发态时,两电子组成体系的波函数。

解:电子波函数的空间部分满足定态S-方程

考虑到,令

其中,对于基态,对于沿χ方向的第一激发态,两电子的空间波函数能够组成一个对称波函数和一个反对称波函数,其形式为

而两电子的自旋波函数可组成三个对称态和一个反对称态,即

综合两方面,两电子组成体系的波函数应是反对称波函数,即

独态:

三重态:

主要参考书:

[1]

周世勋,《量子力学教程》,高教出版社,1979

[2]

张宏宝编

量子力学教程学习辅导书,高等教育出版社2004.2

下载C程序设计教程课后习题答案吉顺如版word格式文档
下载C程序设计教程课后习题答案吉顺如版.doc
将本文档下载到自己电脑,方便修改和收藏,请勿使用迅雷等下载。
点此处下载文档

文档为doc格式


声明:本文内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:645879355@qq.com 进行举报,并提供相关证据,工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。

相关范文推荐

    C程序设计教程与实验 吉顺如主编 语言实验7报告参考

    C语言实验报告参考:(以下都是改正后的,童鞋们时间忙的话可直接照抄!!)仅作参考,欢迎大虾补充完善!! .... 一、 1 、for(i=0;i......

    C语言程序设计教程 课后习题参考答案

    《C语言程序设计教程》 课后习题参考答案 习题1 1. (1)编译、链接.exe (2)函数主函数(或main函数) (3)编辑编译链接 2. (1)-(5):DDBBC (6)-(10):ABBBC 3. (1)答:C语言简洁、紧凑,使用方便、灵......

    80X86语言程序设计教程(杨季文)课后习题答案

    第二章 答案 题2.1 8086/8088通用寄存器的通用性表现在何处?8个通用寄存器各自有何专门用途?哪些寄存器可作为存储器寻址方式的指针寄存器? 答:8086/8088通用寄存器的通用性表现......

    C语言程序设计教程_杨路明__课后习题答案

    C语言程序设计教程 杨路明 课后习题答案 北京邮电大学出版社 第一章 1、算法描述主要是用两种基本方法:第一是自然语言描述,第二是使用专用工具进行算法描述 2、c语言程序的结......

    C语言程序设计教程 第五章 课后习题参考答案

    P124 2古典问题:兔子总数(斐波那契数列) #include int main { int f1=1,f2=1,f,i,k=0; printf("%dt %dt",f1,f2); k=k+2; for(i=3;i0) { n=a%10; printf("%d",n); a=......

    经济法教程第一章课后习题答案

    经济法教程第一章课后习题答案 单选: BBABBDABCBDDDBDD多选: DEABCABCABDABCDCDBCDEABCDAD 案例分析: 一、 1、未届满。 2、该承诺导致诉讼时效中断,诉讼时效期间重新计算。 3、......

    《C语言程序设计教程》课后题答案

    《C语言程序设计教程》课后题答案 第一章 一选择题 1.A 2.B 3.C 4.D 5.B 6.C 二.填空题 1.程序 2.算法 3.main或主 4.编译 5.编译 6. .obj 7.库函数 8.文本或ASCII码......

    C语言程序设计教程第九章习题答案

    1、li 45 300.0 chang 30 200.0 chang 2、 #include struct students { char sid[100]; char name[100]; float score; }student; void main { int i; float j; pri......