c语言(清华大学出版社)
- 格式:pdf
- 大小:8.00 MB
- 文档页数:50
第八章选择题1. C2.A3.B4.C5.D6.B7.B8.A9.D 10.D 11.C 12.C填空题1.n、n+12. 43.8.25( 折半查找所在块 )4.左子树、右子树5.266.顺序、(n+1)/2、O(log2n)7.m-1、[m/2]-18.直接定址应用题1.进行折半查找时,判定树是唯一的,折半查找过程是走了一条从根节点到末端节点的路径,所以其最大查找长度为判定树深度[log2n]+1.其平均查找长度约为[log2n+1]-1.在二叉排序树上查找时,其最大查找长度也是与二叉树的深度相关,但是含有n个节点的二叉排序树不是唯一的,当对n个元素的有序序列构造一棵二叉排序树时,得到的二叉排序树的深度也为n,在该二叉树上查找就演变成顺序查找,此时的最大查找长度为n;在随机情况下二叉排序树的平均查找长度为1+4log2n。
因此就查找效率而言,二分查找的效率优于二叉排序树查找,但是二叉排序树便于插入和删除,在该方面性能更优。
3. 评价哈希函数优劣的因素有:能否将关键字均匀的映射到哈希表中,有无好的处理冲突的方法,哈希函数的计算是否简单等。
冲突的概念:若两个不同的关键字Ki和Kj,其对应的哈希地址Hash(Ki) =Hash(Kj),则称为地址冲突,称Ki和K,j为同义词。
(1)开放定址法(2)重哈希法(3)链接地址法4.(1)构造的二叉排序树,如图(2)中序遍历结果如下:10 12 15 20 24 28 30 35 46 50 55 68(4)平均查找长度如下:ASLsucc = (1x1+2x2+3x3+4x3+5x3)/12 = 41/128.哈希地址如下:H(35) = 35%11 = 2H(67) = 67%11 = 1H(42) = 42%11 = 9H(21) = 21%11 = 10H(29) = 29%11 = 7H(86) = 86%11 = 9H(95) = 95%11 = 7H(47) = 47%11 = 3H(50) = 50%11 = 6H(36) = 36%11 = 3H(91) = 91%11 = 3第九章选择题1. D2.C3.B4.D5.C6.B7.A8.A9.D 10.D填空题1.插入排序、交换排序、选择排序、归并排序2.移动(或者交换)3.归并排序、快速排序、堆排序4.保存当前要插入的记录,可以省去在查找插入位置时的对是否出界的判断5.O(n)、O(log2n)6.直接插入排序或者改进了的冒泡排序、快速排序7.Log2n、n8.完全二叉树、n/29.1510.{12 38 25 35 50 74 63 90}应用题11.(1)Shell排序(步长为5 3 1)每趟的排序结果初始序列为100 87 52 61 27 170 37 45 61 118 14 88 32步长为5的排序14 37 32 61 27 100 87 45 61 118 170 88 52步长为3的排序结果14 27 32 52 37 61 61 45 88 87 170 100 118步长为1的排序结果14 27 32 37 45 52 61 61 87 88 100 118最后结果14 27 32 37 45 52 61 61 87 88 100 118 170(2)快速排序每趟的排序结果如图初始序列100 87 52 61 27 170 37 45 61 118 14 88 32第一趟排序[32 87 52 61 27 88 37 45 61 14]100[118 170]第二趟排序[14 27]32[61 52 88 37 45 61 87]100 118[170]第三趟排序14[27]32[45 52 37]61[88 61 87]100 118[170]第四趟排序14[27]32[37]45[52]61[87 61]88 100 118[170]第五趟排序14[27]32[37]45[52]61[87 61]88 100 118[170]最后结果14[27]32[37]45[52]61[61]87 88 100 118[170](3)二路归并排序每趟的排序结果初始序列[100][87][52][61][27][170][37][45][61][118][14][88][32]第一趟归并[87 100][52 61][27 170][37 45][61 118][14 88][32]第二趟归并[52 61 87 100][27 37 45 170][14 61 88 118][32]第三趟归并排序[27 37 45 52 61 87 100 170][14 32 61 88 118]第四趟归并排序[14 27 32 37 45 52 61 61 87 88 100 118 170]最后结果14 27 32 37 45 52 61 61 87 88 100 118 17012.采用快速排序时,第一趟排序过程中的数据移动如图:算法设计题1.分析:为讨论方便,待排序记录的定义为(后面各算法都采用此定义):#define MAXSIZE 100 /* 顺序表的最大长度,假定顺序表的长度为100 */ typedef int KeyType; /* 假定关键字类型为整数类型 */typedef struct {KeyType key; /* 关键字项 */OtherType other; /* 其他项 */}DataType; /* 数据元素类型 */typedef struct {DataType R[MAXSIZE+1]; /* R[0]闲置或者充当哨站 */int length; /* 顺序表长度 */}sqList; /* 顺序表类型 */设n个整数存储在R[1..n]中,因为前n-2个元素有序,若采用直接插入算法,共要比较和移动n-2次,如果最后两个元素做一个批处理,那么比较次数和移动次数将大大减小。
第5章习题解答一、选择题1.以下叙述中错误的是。
A)对于double类型数组,不可以直接用数组名对数组进行整体输入或输出B)数组名代表的是数组所占存储区的首地址,其值不可改变C)在程序执行中,当数组元素的下标超出所定义的下标范围时,系统将给出“下标越界”的出错信息D)可以通过赋初值的方式确定数组元素的个数解析:对于double类型数组,不能直接用数组名对数组进行整体输入或输出。
所以选项A的说法是正确的。
数组名代表数组所占内存区的首地址,是一个固定指针,其值不可改变,因此选项B也是正确的。
在C语言一维数组定义时可以不指定数组长度,由赋初值的初值个数决定数组的长度。
因此选项D也是正确的。
C语言程序在执行时,不检查数组元素的下标是否越界,如果出现越界,可能会引起系统死机,因此选项C不正确。
答案:C2.有以下程序:/* 文件路径名:ex5_1_2\main.c */#include <stdio.h> /* 标准输入/出头文件*/int main(void) /* 主函数main() */{char s[] = "abcde"; /* 定义字符数组*/s += 2; /* s自加2 */printf("%d\n", s[0]); /* 输出s[0] */return 0; /* 返回值0, 返回操作系统*/}执行后的结果是。
A)输出字符a的ASCII码B)输出字符c的ASCII码C)输出字符c D)程序出错解析:数组s[]的首地址值s是不可改变的,故该程序编译时会出错。
答案:D3.有以下程序:/* 文件路径名:ex5_1_3\main.c */#include <stdio.h> /* 标准输入/出头文件*/int main(void) /* 主函数main() */{int a[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}, *p = &a[3], *q = p + 2; /* 定义数组及变量*/printf("%d\n", *p + *q); /* 输出*p + *q之值*/return 0; /* 返回值0, 返回操作系统*/}程序运行后的输出结果是。
习题 9一.选择题1. A2. A3. A4. A5.B6.C二编程题9.2 编写一函数,判断N×N矩阵是否为上三角阵。
上三角阵是指不含主对角线,下半三角都是0的矩阵。
#include <stdio.h>int fun(int x[][3],int n){int flag=1,i,j;for(i=1;i<n;i++)for(j=0;j<i;j++)if(x[i][j]!=0){flag=0;break;}return flag;}void main(){int a[3][3]={{1,4,5},{0,2,6},{0,0,3}};int result=fun(a,3);if(result==1)printf("此矩阵是上三角矩阵!\n");elseprintf("此矩阵不是上三角矩阵!\n");}9.3 有一个字符串,包含n个字符,将字符串从第i 个字符到第j个字符间的字符逆置。
程序代码:#include <stdio.h>#include <string.h>void invertsub(char *str,int i,int j){char *p,*q,c;int n=0;p=q=str;if(str==NULL)printf("str is NULL!\n");else if(i<=0||j>strlen(str))printf("i and j value error!\n");else {while(*p!='\0'&&n!=i-1){ p++;n++; }q=p;while(*q!='\0'&&n!=j-1){q++;n++;}while(p<q){c=*p;*p++=*q;*q--=c;}}}void main(){char str[]="abcdefg";printf("%s\n",str);invertsub(str,2,5);printf("%s\n",str);}9.4 题目:有n个整数,使其前面各数顺序向后移m个位置,最后m个数变成最前面的m个数.程序源代码:main(){int number[20],n,m,i;printf("the total numbers is:");scanf("%d",&n);printf("back m:");scanf("%d",&m);for(i=0;i<n-1;i++)scanf("%d,",&number[i]);scanf("%d",&number[n-1]);move(number,n,m);for(i=0;i<n-1;i++)printf("%d,",number[i]);printf("%d",number[n-1]);}move(array,n,m)int n,m,array[20];{int *p,array_end;array_end=*(array+n-1);for(p=array+n-1;p>array;p--)*p=*(p-1);*array=array_end;m--;if(m>0) move(array,n,m);}9.5 输入n个整数,将最小数与第一个数对换,把最大数与最后一个数对换程序源代码:main(){int number[10];input(number);max_min(number);output(number);}input(number)int number[10];{int i;for(i=0;i<9;i++)scanf("%d,",&number[i]);scanf("%d",&number[9]);}max_min(array)int array[10];{int *max,*min,k,l;int *p,*arr_end;arr_end=array+10;max=min=array;for(p=array+1;p<arr_end;p++)if(*p>*max) max=p;else if(*p<*min) min=p;k=*max;l=*min;*p=array[0];array[0]=l;l=*p;*p=array[9];array[9]=k;k=*p;return;}output(array)int array[10];{ int *p;for(p=array;p<array+9;p++)printf("%d,",*p);printf("%d\n",array[9]);}9.6 输入n个字符串,按由小到大顺序输出。
c语言程序设计答案(清华大学出版社)C语言程序设计是一门基础而重要的计算机编程课程,它不仅教授编程语言的语法和结构,更培养了解决问题的逻辑思维能力。
《C语言程序设计》一书由清华大学出版社出版,是众多高校计算机专业学生的必读教材。
以下是该书的一些答案解析,以帮助学生更好地理解和掌握C 语言的相关知识。
第一章:C语言概述- C语言的特点:C语言是一种结构化语言,具有高效、灵活、功能强大等特点。
- C语言的发展历史:C语言由丹尼斯·里奇在20世纪70年代初期开发,最初用于UNIX操作系统。
第二章:数据类型、运算符和表达式- 基本数据类型:包括整型(int)、字符型(char)、浮点型(float和double)。
- 运算符:包括算术运算符、关系运算符、逻辑运算符、位运算符等。
- 表达式:由常量、变量、运算符和函数调用组成的组合,用于计算和赋值。
第三章:控制语句- 顺序结构:程序按照代码的顺序执行。
- 选择结构:使用`if`、`switch`等语句进行条件判断。
- 循环结构:使用`for`、`while`、`do-while`等语句进行重复执行。
第四章:数组- 一维数组:连续存储的相同类型元素集合。
- 二维数组:可以看作是一维数组的集合。
- 数组的初始化:可以使用花括号进行初始化。
第五章:函数- 函数的定义:使用`return`类型和函数名定义。
- 函数的调用:通过函数名和参数列表调用。
- 递归函数:函数内部调用自身。
第六章:指针- 指针变量:存储变量地址的变量。
- 指针的运算:包括地址运算和指针的自增自减。
- 指针与数组:指针可以方便地访问数组元素。
第七章:结构体与联合体- 结构体:可以包含不同类型的数据成员。
- 联合体:所有成员共享同一块内存空间。
第八章:预处理指令- 宏定义:使用`#define`定义常量或宏。
- 文件包含:使用`#include`引入头文件。
第九章:位运算- 位运算符:包括位与(&)、位或(|)、位非(~)、位异或(^)等。
c语⾔程序设计答案(常东超)清华⼤学出版社第⼀章⼀、选择题1.1 D 1.2 A 1.3 B 4.4 B⼆、填空题1.5 .exe1.6 .c .obj .exe1.7 顺序选择循环第⼆章⼀、选择题2.1 C 2.2 D 2.3 B 2.4 D 2.5 B 2.6 B 2.7 C 2.8 A 2.9 C 2.10 A 2.11 B 2.12 A 2.13 D 2.14 A 2.15 C 2.16 B 2.17 B 2.18 C 2.19 A 2.20 D 2.21 A 2.22 B 2.23 A 2.24 D 2.25 B 2.26 A 2.27 B2.28 A 2.29 C 2.30 D 2.31 A 2.32 A⼆、填空题2.33 1 22.34 4.2 4.22.353.82.36 123.4600002.37 int float double char2.38 double a1=1,a2=1;2.39 存储单元2.40 a*b/c (a*b)/c b*a/c2.41 把10赋给a2.42 0 0 8.5 90 10 2 2.5 0 02.43 (1) char *p; p=&ch(2) char *p=&ch(3) p=&ch(4) ch=’A’; *p=’A’;(5) printf(“%c”,ch); putchar(ch);2.44 1102.45 (1) s=p+3;(4) *(s+1)(5) 2(6) 30 402.46 000011112.47 a&02.48 x | 11111111000000002.49 ch & 01011111第三章3.1 C 3.2 C 3.3 D 3.4 B 3.5 C 3.6 C 3.7 D 3.8 B 3.9 C3.10 D 3.11 A 3.12 B 3.13 D 3.14 C 3.15 A 3.16 D⼆、填空题3.17 (1)-200,2500(2)i=-200,j=2500(3)i=-200j=25003.18 12 0 03.19 ⼀条语句;3.20 ;3.21 100 15.81 1.89234100 TAB 15.81 TAB1.89234100 ↙15.81↙1.89234注:,TAB 和回车可以任意组合三、编程题略第四章⼀、选择题4.1 A 4.2 A 4.3 A 4.4 D 4.5 B 4.6 B 4.7 2 4.8 1 4.9 16 4.10 C 4.11 C 4.12 B 4.13 D⼆、填空题4.14 ⾮0 04.15 低4.16 ⾼4.17 ⾼4.18 ⾼于4.21 (a)x<=0 (b) 14.22 3 2 24.23 14.24 a:b c:t14.25 *#三、编程题略第五章⼀、选择题5.1 D 5.2 B 5.3 C 5.4 D 5.5 B 5.6 D 5.7 C 5.8 B 5.9 A 5.10 B 5.11 A⼆、填空题5.12 543215.13 295.15 -15.16 25005.17 115.18 09182736455.19 d=1.0 k++ k<=n5.20 t*105.21 x>=0 x5.22 32三、编程题略第6,7章答案第⼀题:选择题第⼆题:填空题7.10 8,177.11 57457.12 随机值7.13 07.14 5 7 9 117.15 9.0000007.19 AGAAGAG7.20 63857.21 GFEDCB7.22 goodgood!7.23 XYZA7.24 110第三题:编程题7.25void fun(int *w,int p,int n) {int i,j=0,t;while(j<=p){t=w[0];for(i=1;iw[i-1]=w[i];w[n-1]=t;j++;}7.26int fun(char *s){int flag=0,num=0; while(*s){if(*s==' ')flag=0;else if(flag==0){num++;flag=1;}}7.27void fun(int *a,int *b){int i;for(i=0;i<11;i++)b[i]=0;for(i=0;i{switch(a[i]/10){case 0:b[0]++;break; case 1:b[1]++;break; case 2:b[2]++;break; case 3:b[3]++;break; case 4:b[4]++;break; case 5:b[5]++;break; case 6:b[6]++;break; case 7:b[7]++;break; case 8:b[8]++;break; case 9:b[9]++;break; default:b[10]++;}}}void fun(int y,int b[],int *m) { int i,k=0;for(i=1;i<=y;i++)if(y%i==0&&i%2==1)b[k++]=i;*m=k;}char *pp=a;int k=0;while(pp{if(*pp!='*')a[k++]=*pp;pp++;}while(*p){a[k++]=*p;p++;}a[k]='\0';}7.30void fun(int m,int *k,int xx[]) { int n=0,i,j;for(i=2;i{for(j=2;jif(i%j==0)break;if(jxx[n++]=i;}*k=n;}7.31int fun(int m){int i,flag=1;flag=0;break;}return flag;}void main(){int m;printf("Please input a number: ");scanf("%d",&m);if(fun(m)==1)printf("%d is a prime number!\n",m);else printf("%d is not a prime number!\n",m); } 7.32#includedouble fun(int n){double sum=0.0;int i,sign=1;for(i=1;i<=n;i++){sum+=sign*1.0/i;sign=-sign;}return sum;}void main(){int n;printf("Please input a number: ");scanf("%d",&n);printf("The result is %lf\n",fun(n));double fun(int m){double sum=1.0;int i;for(i=2;i<=m;i++)sum-=1.0/(i*i);return sum;}void main(){int m;printf("Please input a number: "); scanf("%d",&m);printf("The result is %lf\n",fun(m)); }。