第5章 数组习题参考答案
- 格式:doc
- 大小:89.00 KB
- 文档页数:12
《C程序设计》课外作业及参考答案说明:(1)章节顺序按照PowerPoint电子教案;(2)教材上的作业注明了章节和题号;(3)所用教材是《C程序设计(第二版)》谭浩强清华大学出版社;第一章C语言概述1.1 简答题:写出C语言的主要特点(教材习题1.1)。
1.2填空题:1.C语言与操作系统并称“栾生兄弟”。
2.C语言俗称为形式。
3.C源程序文件经过处理后产生目标文件,目标文件经处理后生成可执行文件。
1.3 单项选择题1. 以下说法中正确的是。
(A)C语言程序总是从第一个定义的函数开始执行(B)在C语言程序中,要调用的函数必须在main函数中定义(C)C语言程序总是main函数开始(D)C语言程序中的main函数必须放在程序的开始部分2. 以下正确的C标识符是。
(A)_125 (B)C# (C)C++ (D)A$1.4 多项选择题1. 以下关于C语言的说法中,错误的是。
(A)俗称为“低级语言的高级形式”,因此功能简单(B)不是结构化程序设计语言(C)可能直接访问内存(D)语法限制不严2. 以下标识符属于C语言关键字的有。
(A)integer (B)else (C)include (D)while第二章C语言基本数据类型、变量、常量与表达式2.1简答题1.求下面算术表达式的值。
(教材习题3.9)a)x+a%3*(int)(x+y)%2/4设x=2.5, a=7, y=4.7b)(float)(a+b)/2+(int)x%(int)y设a=2, b=3, x=3.5, y=2.52.写出下面程序的运行结果。
(教材习题3.10)main(){ int i, j, m, n;i=8; j=10; m=++i; n=j++;printf("%d,%d,%d,%d", i, j, m, n);}3.写出下面表达式运算后a的值,设原来a=12。
设a和n已定义为整型变量。
(教材习题3.12)a)a+=a b) a-=2 c) a*=2+3b)d) a/=a+a e) a%=(n%=2), n的值等于5 f) a+=a-=a*=a4.C语言中如何表示“真”和“假”?系统如何判断一个量的“真”和“假”?2.2 填空题1. 写出下面各逻辑表达式的值。
第5章汇编语言程序设计习题参考答案1.(1) BUFF DB 240 DUP(?)(2) xx DB “BYTE”,”WORD”2.:0000H,则内存分配如下:V AR1V AR2V AR3V AR4V AR53.(1) 段的类型:段的类型有4种,分别是代码段、数据段、堆栈段和附加段。
(2) 段的定义:定义段使用伪指令SEGMENT/ENDS来定义的。
即:段名SEGMENT [定位类型] [组合类型] […类别‟]……段名ENDS(3) 选项的作用和含义:定位类型:告诉汇编程序如何确定逻辑段的边界在存储器的位置,共有4种。
①BYTE:表示逻辑段从字节的边界开始,即本段的起始地址紧接前一段。
②WORD:表示逻辑段从字的边界开始,即本段的起始地址必须是偶数。
③PARA:表示逻辑段从节的边界开始,即本段的起始地址后4位为0。
④PAGE:表示逻辑段从节的边界开始,即本段的起始地址后8位为0。
组合类型:告诉汇编程序当装入存储器时各个逻辑段如何进行组合,共有6种。
①不组合:如果缺省,则不组合。
② PUBLIC:对于不同逻辑段只要有相同段名就把他们集中成一段装入内存。
③ STACK:同PUBLIC相同,但仅限于堆栈段。
④ COMMON:对于不同逻辑段若有相同的段名,则都从同一地址装入。
⑤ MENORY:表示在几个逻辑段连接时,本段定位在地址最高的地方。
⑥ AT 表达式:表示以表达式的值来定位段地址。
‘类别’:在连接时决定各逻辑段的装入顺序。
4. 假设程序中有4个不同类型的段,则名为initprogram宏指令的宏定义如下:initprogram MACRO csname,dsname,esname,ssnameASSUME CS:csname,DS:dsname,ES:esname,SS:ssnameSTART: MOV AX,dsnameMOV DS,AXMOV AX,esnameMOV ES,AXMOV AX,ssnameMOV SS,AXENDM5.假设需传送的数据块为字节数据块,则名为Datastranaction宏指令的宏定义如下:Datastranaction MACRO buffer1,buffer2,lengthLEA SI,buffer1LEA DI,buffer2MOV CX,lengthCLDREP MOVSBENDM6.有效地指令为:(2)、(5)、(9)无效的指令为:(1) 数据类型不一致(3) 两个操作数不能同时为存储器操作数(4) CS不能作为目的操作数(6) 不能用两个变址寄存器作有效地址分量(7) 一个操作数不能是两个变量名的表达式(8) 基址和变址只能相加不能相减(10) 目的操作数不能是立即数(11) 在有效地址中不能减基址或变址严格地说:(9)也不对,因为没有指出存储器的数据类型,即操作数类型不明确。
南京晓庄学院数据结构题库参考标准答案数据结构与算法习题册(课后部分参考答案)《数据结构与算法》课程组⽬录课后习题部分第⼀章绪论 (1)第⼆章线性表 (3)第三章栈和队列 (5)第四章串 (8)第五章数组和⼴义表 (10)第六章树和⼆叉树 (13)第七章图 (16)第九章查找 (20)第⼗章排序 (23)第⼀章绪论⼀. 填空题1. 从逻辑关系上讲,数据结构的类型主要分为集合、线性结构、树结构和图结构。
2. 数据的存储结构主要有顺序存储和链式存储两种基本⽅法,不论哪种存储结构,都要存储两⽅⾯的内容:数据元素和数据元素之间的关系。
3. 算法具有五个特性,分别是有穷性、确定性、可⾏性、输⼊、输出。
4. 算法设计要求中的健壮性指的是算法在发⽣⾮法操作时可以作出处理的特性。
⼆. 选择题1. 顺序存储结构中数据元素之间的逻辑关系是由 C 表⽰的,链接存储结构中的数据元素之间的逻辑关系是由 D 表⽰的。
A 线性结构B ⾮线性结构C 存储位置D 指针2. 假设有如下遗产继承规则:丈夫和妻⼦可以相互继承遗产;⼦⼥可以继承⽗亲或母亲的遗产;⼦⼥间不能相互继承。
则表⽰该遗产继承关系的最合适的数据结构应该是B 。
A 树B 图C 线性表D 集合3. 算法指的是 A 。
A 对特定问题求解步骤的⼀种描述,是指令的有限序列。
B 计算机程序C 解决问题的计算⽅法D 数据处理三. 简答题1. 分析以下各程序段,并⽤⼤O记号表⽰其执⾏时间。
(1) (2)i=1;k=0; i=1;k=0;While(i{ {k=k+10*i; k=k+10*i;i++; i++;} }while(i<=n)⑴基本语句是k=k+10*i,共执⾏了n-2次,所以T(n)=O(n)。
⑵基本语句是k=k+10*i,共执⾏了n次,所以T(n)=O(n)。
2. 设有数据结构(D,R),其中D={1, 2, 3, 4, 5, 6},R={(1,2),(2,3),(2,4),(3,4),(3,5),(3,6),(4,5),(4,6)}。
程序设计基础(C语言版)习题第01章绪论一.选择题1.以下叙述中正确的是________。
A)程序设计的任务就是编写程序代码并上机调试B)程序设计的任务就是确定所用数据结构C)程序设计的任务就是确定所用算法D)以上三种说法都不完整参考答案:D【解析】程序设计通常分为问题建模、算法设计、编写代码和编译调试四个阶段。
所以选项A)、B)、C)说法都不完整。
2.以下关于简单程序设计的步骤和顺序的说法中正确的是。
A)确定算法后,整理并写出文档,最后进行编码和上机调试B)首先确定数据结构,然后确定算法,再编码,并上机调试,最后整理文档C)先编码和上机调试,在编码过程中确定算法和数据结构,最后整理文档D)先写好文档,再根据文档进行编码和上机调试,最后确定算法和数据结构参考答案:B【解析】设计一个能解决实际问题的计算机程序需要经过以下几个过程:①建立模型。
②算法设计:给出解决问题的步骤,即算法。
③算法表达:选择一种表达算法的工具,对算法进行清晰的表达。
④编写程序:选择一种程序设计语言,把以上算法程序化,这称为编写程序。
⑤程序调试:对编写好的程序进行调试,修改程序中的错误。
⑥程序文档编写与程序维护。
综上所述,B)选项是符合上述描述的,其他选项不恰当。
3.以下叙述中正确的是________。
A)C程序的基本组成单位是语句B)C程序中的每一行只能写一条语句C)简单C语句必须以分号结束D)C语句必须在一行内写完参考答案:C【解析】函数是C程序的基本组成单位;C语言书写风格很自由,不但一行可以写多个语句,还可以将一个语句写在多行中。
故本题答案为C)。
4.以下叙述中正确的是。
A)C程序中的注释只能出现在程序的开始位置和语句的后面B)C程序书写格式严格,要求一行内只能写一个语句C)C程序书写格式自由,一个语句可以写在多行上D)用C语言编写的程序只能放在一个程序文件中参考答案:C【解析】在C语言中,注释可以加在程序中的任何位置,选项A)错误。
程序设计基础(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)错误。
第5章网络层1.给出两个适合于使用面向连接服务的示例应用,再给出两个最好使用无连接服务的例子。
答案:文件传送、远程登录和视频点播需要面向连接的服务,在另一方面,信用卡验证和其他的销售点终端、电子资金转移,以及许多形式的远程数据库访问最好使用无连接服务。
2.有没有虚电路服务需要以非顺序的方式投递分组的情况?请解释。
答案:有。
例如中断信号就应该跳过在它前面的数据,进行不遵从顺序的投递。
典型的例子是当一个终端用户键入退出(或kill)键时,由退出信号产生的分组应该立即发送,并且应该跳过当前队列中排在前面等待程序处理的任何数据(即已经键入但尚未被程序读取的数据)。
3.数据报网络把每个分组都作为独立的单元进行路由选择,虚电路网络则不必这样做,每个数据分组都遵循一个事先确定好的路由。
这个事实是否意味着虚电路网络不需要从任意源到任意目的地为分组进行路由选择的能力?答案:不对。
虚电路网络需要从任意源到任意目的地为连接建立分组选择路由的能力。
4. 图5-1的网络拓扑图中,每个圆圈代表一个网络结点,每一条线代表一条通信线路,线上的标注表示两个相邻结点之间的权值。
请根据Dijkstra最短通路算法找出图中A结点到其它每个结点的最短距离和下一站路由表。
在答案中要求:(1)依次列出每一步的工作结点(从S 中选出的u);(2)给出从A结点到其它每个结点的最短距离和下一站路由表。
5-1 网络拓扑图答案:初始化:S = { B(2 )、C(3 )、D(4)、E(5)、F(6)、G(7)、H(8)、I(9)、J(10) } ;以下均用括号中的数字代表各结点。
1代表结点A。
目的节点 1 2 3 4 5 6 7 8 9 10下一站- 2 3 0 0 0 0 0 0 0目的节点 1 2 3 4 5 6 7 8 9 10最短距离- 8 4 ∞∞∞∞∞∞∞以下计算中,对数组R和数组D,只列出其下一站和最短距离。
While u 删去u的S (u,v) C=D(u) C<D(v)的v R 数组 D 数组巡环次+weight (u,v)5.给出连接建立时可能要协商的协议参数的3个例子。
循环结构程序设计P115 5.1 用while计算1至100的合.#include<stdio.h>int main(){int i=1,sum=0;while(i<=100) //对于需要运算的值,要么在运算前可以赋值,要么一开始要指定.{sum=sum+i;i++;}printf("The sum is %d .\n",sum);return 0;}P117 5.2 用do-while来做1至100的合.#include<stdio.h>int main(){int i=1,sum=0;do// do-while可以做的事,用while都可以做到.{ //do-while先做一次执行,再判断条件,而while却是先做一个条件,再执行.sum=sum+i;i++;}while(i<=100);printf("The sum is %d .\n",sum);return 0;}P118 5.3 比较do-while与while的差别.#include<stdio.h>{int i,sum=0;printf("Please input a number :");scanf("%d",&i); //输入10以内,正常,11的话,则sum仍然是0.while(i<=10){sum=sum+i;i++;}printf("The sum of 1-10 is %d .\n",sum);return 0;}#include<stdio.h>int main(){int i,sum=0;printf("Please input a number :");scanf("%d",&i); //输入10以内,结果一样.输入11的话,先做操作,所以sum=11.do{sum=sum+i;i++;}while(i<=10); //此重点在于理解二者的差别.printf("The sum of 1-10 is %d .\n",sum);return 0;}P126 5.4 break的例子.#include<stdio.h>int main(){int i,b=0,a,c;for(i=0;i<=1000;i++){printf("Please input amount :"); //循环体内套有输出语句以及跳出语句.scanf("%d",&a);b=b+a;if(b>=100)break; //break是用于跳出循环,对if无效,对while for switch 这一类.}}c=b/i;printf("conut is %d , aver is %d ",i+1,c); //注意%号后的形式,否则可能输出错误.return 0;}P127 5.5 continue的例子.#include<stdio.h>int main(){int i;for(i=1;i<20;i++){if(i%3!=0){continue; //跳过本次I,执行下一个i.}printf("%d ",i);}printf("\n");return 0;}P128 5.6 形成一个4*5的矩阵.#include<stdio.h>int main(){int i,j,a=0; //没有给初值,会出现警告: 使用了未初始化的局部变量“a”.for(i=1;i<=4;i++){for(j=1;j<=5;j++,a++) // a用来控制换行.{if(a%5==0){printf("\n");}printf("%d\t",i*j);}}printf("\n");return 0;}P131 5.7 用一个交错的式子求哌的近似值.#include<stdio.h>#include<math.h>int main() //四分之哌等于(1)-(1/3)+(1/5)-(1/7)+(1/9)-(1/11).{float s=1,n=1,m,sum=0,t;for(m=1;;m=m+2) //不确定哪项才会小于等于十的负六次方,所以不指定,无限下去.{ //不指定第二项,执行语句中应该有控制跳出的句子,否则死循环.t=(s)*(n/m); //这是第一项,s是符号,if(fabs(t)<=1e-6) //应该写在这里,题目要求这一项不累加进去.{break;}sum=sum+t; //因为累加项在这里,所以,一旦跳出就不会累加进来了.s=s*(-1); //变号一次.}printf("四分之一哌的值是%f.\n",sum);printf("一个完整哌的值是%f.\n",sum*4);return 0;}//下面这段小代码用来验证关于数值型数据类型的关系.去掉注释,可运行.//如果出现类似值为全1或是全零的话,一般可以考虑数据类型赋值或是定义错了的问题.//#include <stdio.h> //这是关于int float double三者关复杂关系的,乱啊,如果看不懂,可以通过实验自己明白来.////int main() //在C语言中,1.0认为是实数,即是double型,所以,如果你把它用float输出的话,会有警告:警告 1 warning C4305: “=”: 从“double”到“float”截断.//{// float m,a,b,c; //一旦定义了是这种类型的话,输出或是赋值的时候只能扩展不能截断,意思就是能变成double型,不能变成int型啦.而且后面的赋值会跟着它变成相应的类型.比如下面的m=1,其实得到的是m=1.0.// int d,e,f;// m=1;// a=1.0/3;// b=1/3;// c=m/3;// d=1.0;// e=1/4;// f=1.0/4;// printf("%lf(float用double的%lf来输出是可以的.)\n%f\n%f\n%f\n",m,a,b,c); //不管上面定义什么,这边写的输出类型是什么,就按相应的类型输出,有可能会出错,所以建议按定义的类型来输出.当然扩展的是不会错的,截断的是会错的,比如float可以用%lf来输出,而不能用%d来输出.// printf("%d\n%d\n%d\n",d,e,f); //但是,不相应的int型不可以用%f来输出的.因为int float就不同种类,一个是整数,一个是小数,float double同样是有小数点的!!!!// return 0;//}#include<stdio.h>int main() //这个就是著名的Fibonacci(费波那契数列问题){int f1=1,f2=1,f3,i;printf("%12d\n%12d\n",f1,f2);for(i=1;i<=38;i++) //注意,这是个基础问题,(i=1;i<=5;i++)这里其实进行了次运算,因为有f1,f2,要求有个,所以要有个.要么写<=38,要么写<39,边界问题一定要注意,不可以太随意!!!!{f3=f1+f2;printf("%12d\n",f3); //这个问题同样适用于"一对兔子一个月生一对"的问题.,f1=f2; //f1=f1+f2;此时它们各是,所以,现在的f1是.f2=f3; //f2=f2+f1;此时的f1已经是最先二者之和了.可以不用到f3.}return 0;}#include<stdio.h>#include<math.h>int main(){double num;int i;printf("Please input a number :");scanf("%lf",&num); //因为sqrt要求是浮点型,那就给它浮点型,需要时再强制转换.for(i=2;i<=sqrt(num);i++) //这边是<=号没错.{if((int)num%i==0) //如果在这期间有任何一个可以为零的话,则不是素数.{break; //当然跳出.}} //执行到这里的时候,i=5,已经变成了!!if(i<=sqrt(num)){printf("Not %d",(int)num);}else//如上所述,i=5,超出了求根的值,所以是素数.{printf("Yes %d",(int)num);}return 0;}P137 5.10 求100至200间的素数.#include<stdio.h>//不解释,HOHO>>>>...#include<math.h>int main(){double j;int i,k=0;for(j=100;j<=200;j++){for(i=2;i<=sqrt(j);i++){if((int)j%i==0){break;}}k=k+1; //这里是布局的开头.学习一下,有助逻辑.if(i<=sqrt(j)){printf("Not %d ",(int)j);if(k%5==0) //5个换一次行.{printf("\n");}}else{printf("Yes %d ",(int)j);if(k%5==0){printf("\n");}}}return 0;}P139 5.11 密码转换.#include<stdio.h>int main(){char c;c=getchar();while(c!='\n') //这也可以用数组来实现.{if((c>='a'&&c<='z')||(c>='A'&&c<='Z')){if((c>='w'&&c<='z')||(c>='W'&&c<='Z')){c=c-22;}else{c=c+4;}printf("%c",c);c=getchar(); //套在循环里,依次得到字母,而while中判断回车为结束.}}printf("\n"); //这是布局问题.return 0;}P140 0.3 最大公约数和最小公倍数.#include<stdio.h>//最大公约数用累除法,除到无余数时的被除数是最大公约数.main (){int m, n, c, d;int gcd(); //这是最大公约数的缩写,此处调用函数,可以不写里面的实参.int lcm(); //这是最小公倍数的缩写,此处调用函数,可以不写里面的实参.printf("Please input two number :\n");scanf("%d %d",&m,&n);c=gcd(m,n); //c获取最大公约数d=lcm(m,n); //d获取最小公倍数printf("The GCD of %d and %d is : %d !\n", m, n, c);printf("The LCM of %d and %d is : %d !\n", m, n, d);return 0;}int gcd(int x, int y) //最大公约数Greatest Common Divisor{int temp;while(x%y!=0){temp=y; //y在下一轮中作为除数,即是下一轮中的X,所以先闪一边去.y=x%y; //x,y的余数作为下一轮中的Y,由x%y来取得.x=temp; //刚才temp中存储了y的值,现在拿出来作为下一轮中的X使用.}return y; //这是每一轮中的被除数,按原理来,这就是最大公约数,即累除法的原理. }int lcm(int x, int y) //最小公倍数Lowest Common Multiple{int i, temp;if(x<y) //此段代码结果是保证二者大的数在X上,小的数在Y上.即小于号降序.{ //以下为经典三行码,实现两个数的互换.temp=x;x=y;y=temp;}for(i=1; i<=y; i++) //设定一个区间,从1至大的数之间的循环.{if(!((x*i)%y)) //此式子如有余数,加上"!"号,会是假,则不返回,进行下一轮.{ //如此往复,直到取模无余数,那么小的数X乘以区间当前的I值,就是最小公倍数.return x*i;}}}P140 0.4 判断一串输入的字符.#include<stdio.h>int main(){char ch;int a=0,b=0,c=0,d=0,e=0;printf("Please input the string\n");while((ch=getchar())!='\n') //直到回车.{if(ch<='z'&&ch>='a'){a++;}else if(ch==' '){c++;}else if(ch<58&&ch>47){d++;}else if(ch<='Z'&&ch>='A'){b++;}else{e++;}}printf("大写%d 小写%d 空格%d 数字%d 其它%d\n",a,b,c,d,e);}#include<stdio.h>//不理解时可以百度或是谷歌更多的信息.int main() //想办法既快速做完,又要消化理解!!!{int temp,i,a,n,sum=0; //主逻辑,友好性暂时放松.scanf("%d %d",&a,&n); //a是数字,n是要乘的个数.temp=a; //先把第一阶的值存起来.for(i=0;i<n;i++){sum=sum+a;printf("%d + ",a); //事关布局.a=a*10+temp; //重点是每次乘,然后加上上一个数.}printf("= %d .",sum);return 0;}P140 0.6 1!+2!+3!+4!.....的值. #include<stdio.h>int main() //1!+2!+3!+4!.....{int i,j,k,sum=0,m=1;scanf("%d",&k); //比如设定为,值为.for(i=1;i<=k;i++) //第一层循环,指定到.{for(j=1;j<=i;j++) //第二层循环,指定至当前数.{m=m*j;} //到此是阶乘的结构.sum=sum+m;m=1;}printf("%d",sum); //完全不理解时,搜索并参考.return 0; //尝试自己做,第一次做出来就是自己的东西了. }#include<stdio.h>int main(){int a,b;double c,asum=0,bsum=0,csum=0;for(a=1;a<=100;a++) //三个块分别注释验证结果.{asum=asum+a;}for(b=1;b<=50;b++) //在VS运行中,注意*.cpp为C++语言.{bsum=bsum+b*b; //为了避免语言差别,请注意文件名为*.c.}for(c=1;c<=10;c++) //c作浮点运算,所以定义在double类型中.{csum=csum+1/c;}printf("%lf",asum+bsum+csum);return 0;}PP#include<stdio.h>#include<math.h>int main(){int j,k,s[6],x=100,y,sum=0;for(j=153;j<=154;j++){for(k=2;k>=0;k--){s[k]=j%(int)pow(10,k+1)/(int)pow(10,k);y=pow(s[k],3);sum+=y;printf("%d-%d--%d\t",k,s[k],j);}printf("%d\n",sum);}return 0;}P140 0.8 水仙花数.//#include <stdio.h> //一步步的发现问题.////int main() //在%和/号之间,以前pow.以后再做.//{// int i,j,k,a,b,c,sum=0; //这里逻辑对,算出来却错了.// for(i=2;i<=4;i++) //计算机在想什么,看来它的大脑难以模拟.// {// for(j=pow(10,i);j<=pow(10,i+1)-1;j++) //我不完全明白它遵守的逻辑. // {// for(k=0;k<=i;k++)// {// sum+=pow((j%pow(10,i+1)/pow(10,i)),3);// }// if(sum==j)// {// printf("%d 是水仙花数!\n",j);// }// sum=0;// }// }// return 0;//} //为什么还是无法实现?!#include<stdio.h>#include<math.h>int main(){int a,b,c,i,sum=0; //这里只计算三位数的.for(i=100;i<1000;i++){a=i/100;b=i%100/10;c=i%10;sum+=a*a*a+b*b*b+c*c*c;if(sum==i){printf("%d 是水仙花数.\n",i);}sum=0;}return 0;}P141 0.9 完数.#include<stdio.h>int main(){int i,j,r;for(i=1;i<=1000;i++) //零是个临界值,不能包括它.{r=0; //每次清零重来.类似水仙中的sum.for(j=1;j<i;j++){if(i%j==0) //除得尽即是因子.{r=r+j; //然后累加进去.}}if(r==i) //若相等.{printf("%d 是完数.\n",i);}}return 0;}P141 0.10 2/1+3/2+5/3+8/5+13/8…#include<stdio.h>int main() //10.007051{double i,a=2,b=1,c,s=0; //a是分子,b是分母.for(i=0;i<6;i++) //二十可以用户指定.{s+=a/b; //中间储值变量.c=a+b;b=a;a=c;}printf("%lf\n",s);return 0;}#include<stdio.h>int main() //从一百开始,减一半再自加两次,下降一次,反弹一次.{double sum=100,high=100,up,donw,i;for(i=1;i<10;i++) //不管指定到哪个数,都不会超过三百.{up=high/2;donw=up;high=donw; //自咬尾巴问题.sum+=donw*2;}printf("%lf %lf\n",donw,sum);return 0;}P141 0.12 猴子吃桃子.#include<stdio.h>int main() //从一百开始,减一半再自加两次,下降一次,反弹一次.{int i,sum=1;for(i=1;i<=10;i++) //临界要清楚,结果要与手算的前几个实例相匹配.{printf("倒数第%d天还剩有%d个桃子.\n",i,sum);sum=(sum+1)*2;}//printf("%d\n",sum);return 0;}#include<stdio.h>#include<conio.h>main() //只关注左半部分.右半部分无视空格.{int i,j,k,m=6; //m可指定,指定中心点位置.可任意奇偶.for(i=1;i<=m;i++) //上半部分.其实也是正三角.{for(j=1;j<=m-i;j++) //一到中心点前i个位置填充空格.printf(" ");for(k=1;k<2*i;k++) //空格后向前填充星号的个数.是奇数.一,三,五... printf("*");printf("\n");}for(i=m-1;i>0;i--) //下半部分.其实也是倒三角.{ //减一是因为行数问题.这是中心行以下的.for(j=m-1;j>=i;j--)printf(" ");for(k=1;k<2*i;k++)printf("*");printf("\n");}getch(); //用户反应后结束.但,没必要.}。
绪论1.将下列复杂度由小到大重新排序:A.2n B.n! C.n5D.10 000 E.n*log2 (n)【答】10 000< n*log2(n)< n5< 2n < n!2.将下列复杂度由小到大重新排序:A.n*log2(n) B.n + n2 + n3C.24D.n0.5【答】24< n0.5< n*log2 (n) < n + n2 + n33.用大“O”表示法描述下列复杂度:A.5n5/2 + n2/5 B.6*log2(n) + 9nC.3n4+ n* log2(n) D.5n2 + n3/2【答】A:O (n5/2) B:O (n) C:O (n4) D:O (n2)4.按照增长率从低到高的顺序排列以下表达式:4n2 , log3n, 3n , 20n , 2000 , log2n , n2/3。
又n!应排在第几位?【答】按照增长率从低到高依次为:2000, log3n, log2n , n2/3 , 20n , 4n2 , 3n。
n!的增长率比它们中的每一个都要大,应排在最后一位。
5. 计算下列程序片断的时间代价:int i=1;while(i<=n){printf(“i=%d\n”,i);i=i+1;}【答】循环控制变量i从1增加到n,循环体执行n次,第一句i的初始化执行次数为1,第二句执行n次,循环体中第一句printf执行n次,第二句i从1循环到n,共执行n次。
所以该程序段总的时间代价为:T(n) = 1 + n + 2n = 3n+ 1 = O(n)6. 计算下列程序片断的时间代价:int i=1;while(i<=n){int j=1;while(j<=n){int k=1;while(k<=n){printf(“i=%d,j=%d,k=%d\n”,I,j,k);k=k+1;}j=j+1;}i=i+1;}【答】循环控制变量i从1增加到n,最外层循环体执行n次,循环控制变量j从1增加到n,中间层循环体执行n次,循环控制变量k从1增加到n,最内层循环体执行n次,所以该程序段总的时间代价为:T(n) = 1 + n + n{1 + n + n[1 + n + 2n +1] +1 +1}+ 1= 3n3 + 3n2 +4n +2= O(n3)2. 线性表1.试写一个插入算法int insertPost_seq(palist, p, x ),在palist所指顺序表中,下标为p的元素之后,插入一个值为x的元素,返回插入成功与否的标志。
第5章数组习题参考答案第1题'方法1Dim a(), b(), c() '定义a,b数组用于存放两组数据,C数组存放a,b相加的结果a = Array(1, 3, 5, 2, 4, 18, 50, 25) 'a数组赋值b = Array(5, 27, 30, 35, 60, 41, 87, 33) 'b数组赋值n = UBound(a) '计算数组最大下标For i = 0 To n '输出数组aPrint a(i);Next iPrintFor i = 0 To n '输出数组bPrint b(i);Next iPrintReDim c(0 To n) '定义(确定)数组c实际大小For i = 0 To nc(i) = a(i) + b(i)Next iFor i = 0 To n '输出数组cPrint c(i);Next iPrint'方法2Dim a(0 To 7), b(0 To 7), c() '定义a,b数组存放两组数据,C数组存放a,b相加的结果n = UBound(a) '计算数组最大下标For i = 0 To n '数组a赋值、输出a(i) = Val(InputBox("输入数据"))Print a(i);Next iPrintFor i = 0 To n '输出数组bb(i) = Val(InputBox("输入数据"))Print b(i);Next iPrintReDim c(0 To n) '定义(确定)数组c实际大小For i = 0 To nc(i) = a(i) + b(i)Next iFor i = 0 To n '输出数组cPrint c(i);Next iPrint第2题'方法1Dim a() '定义a,b数组用于存放两组数据,C数组存放a,b相加的结果x = Val(InputBox("输入行数"))y = Val(InputBox("输入列数"))ReDim a(1 To x, 1 To y)For i = 1 To x '数组a赋值For j = 1 To ya(i, j) = Int(Rnd() * 100)Next jNext iFor i = 1 To x '输出a数组For j = 1 To yPrint a(i, j);Next jPrintNext iPrintMax = a(1, 1) '设最大数为a(1,1)row = 1 '则最大数行下标为1col = 1 '则最大数列下标为1For i = 1 To x '求最大数max及其所在的行row、列colFor j = 1 To yIf Max < a(i, j) ThenMax = a(i, j)row = icol = jEnd IfNext jNext iPrint "最大数为:"; Max; "行为:"; row; "列为:"; col'方法2Dim a() '定义a,b数组用于存放两组数据,C数组存放a,b相加的结果x = Val(InputBox("输入行数"))y = Val(InputBox("输入列数"))ReDim a(1 To x, 1 To y)For i = 1 To xFor j = 1 To ya(i, j) = Int(Rnd() * 100) '数组a赋值Print a(i, j); '数组a输出Next jPrintNext iMax = a(1, 1) '设最大数为a(1,1)row = 1 '则最大数行下标为1col = 1 '则最大数列下标为1For i = 1 To x '求最大数max及其所在的行row、列col For j = 1 To yIf Max < a(i, j) ThenMax = a(i, j)row = icol = jEnd IfNext jNext iPrint "最大数为:"; Max; "行为:"; row; "列为:"; col第3题'方法1Dim a(1 To 10) '定义a数组存放10个数据For i = 1 To 10 '数组a赋值a(i) = Int(Rnd() * 100)Next iFor i = 1 To 10 '输出数组aPrint a(i);Next iPrint'数组元素数值交换For i = 1 To 5t = a(i)a(i) = a(11 - i)a(11 - i) = tNext iFor i = 1 To 10 '输出交换后a数组各元素值Print a(i);Next iPrint'方法2Dim a(1 To 10) '定义a数组存放10个数据For i = 1 To 10 '数组a赋值a(i) = Int(Rnd() * 100)Print a(i); '输出数组aNext iPrint'数组元素数值交换For i = 1 To 5t = a(i)a(i) = a(11 - i)a(11 - i) = tNext iFor i = 1 To 10 '输出交换后a数组各元素值Print a(i);Next iPrint'方法3Dim a(1 To 10) '定义a数组存放10个数据For i = 1 To 10 '数组a赋值a(i) = Val(InputBox("输入数据"))Print a(i); '输出数组aNext iPrint'数组元素数值交换For i = 1 To 5t = a(i)a(i) = a(11 - i)a(11 - i) = tNext iFor i = 1 To 10 '输出交换后a数组各元素值Print a(i);Next iPrint'方法4 任意多个元素值交换Dim a()n = Val(InputBox("输入数据个数"))ReDim a(1 To n) '定义a数组存放n个数据For i = 1 To n '数组a赋值a(i) = Int(Rnd() * 100)Print a(i); '输出数组aNext iPrint'数组元素数值交换For i = 1 To n \ 2t = a(i)a(i) = a(11 - i)a(11 - i) = tNext iFor i = 1 To n '输出交换后a数组各元素值Print a(i);Next iPrint第4题'方法1Dim a(0 To 10) As Integer '定义a数组存放各分数段统计结果n = Val(InputBox("输入学生人数"))For i = 1 To n '数组a赋值score = Val(InputBox("输入学生成绩"))Print score;If score < 60 Thena(5) = a(5) + 1ElseIf score <= 69 Thena(6) = a(6) + 1ElseIf score <= 79 Thena(7) = a(7) + 1ElseIf score <= 89 Thena(8) = a(8) + 1ElseIf score <= 100 Thena(9) = a(9) + 1End IfNext iPrintPrint "输出各分数段统计结果如下:"Print "<60人数"; a(5)Print "60~69人数"; a(6)Print "70~79人数"; a(7)Print "80~89人数"; a(8)Print "90~100人数"; a(9)'方法2Dim a(0 To 10) As Integer '定义a数组存放各分数段统计结果n = Val(InputBox("输入学生人数"))For i = 1 To n '数组a赋值score = Val(InputBox("输入学生成绩"))Print score;m = score \ 10 '构造m与数组a元素下标对应If m < 6 Thena(5) = a(5) + 1ElseIf m < 7 Thena(6) = a(6) + 1ElseIf score < 8 Thena(7) = a(7) + 1ElseIf score < 9 Thena(8) = a(8) + 1ElseIf score <= 10 Thena(9) = a(9) + 1End IfNext iPrintPrint "输出各分数段统计结果如下:"Print "<60人数"; a(5)Print "60~69人数"; a(6)Print "70~79人数"; a(7)Print "80~89人数"; a(8)Print "90~100人数"; a(9)'方法3Dim a(0 To 10) As Integer '定义a数组存放各分数段统计结果n = Val(InputBox("输入学生人数"))For i = 1 To n '数组a赋值score = Val(InputBox("输入学生成绩"))Print score;m = score \ 10 '构造m与数组a元素下标对应a(m) = a(m) + 1 'm对应的分数段数组元素累加Next iFor i = 0 To 5 '<60分的分数段数组元素累加s = s + a(i)Next iPrintPrint "输出各分数段统计结果如下:"Print "<60人数"; sPrint "60~69人数"; a(6)Print "70~79人数"; a(7)Print "80~89人数"; a(8)Print "90~100人数"; a(9)第5题身份证号码数字编码表'方法1Dim ID As String '定义ID存放身份证号码Dim a(0 To 16) '定义a数组存放身份证号码数字Dim w() '定义w数组存放加权因子Dim y() '定义y数组存放第18位编码表校验码w = Array(7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2) 'a数组赋值y = Array(1, 0, x, 9, 8, 7, 6, 5, 4, 3, 2) 'b数组赋值ID = InputBox("输入身份证号码")n = Len(ID) '计算身份证号码长度For i = 1 To n '输出数组aChar = Mid(ID, i, 1) '获得身份证号码每一位字符a(i - 1) = Val(Char) '将身份证号码字符转化为数值s = s + a(i - 1) * w(i - 1) '计算权求和sum(ai*wi)Next iy18 = s Mod 11 '计算模y=mod(s,11)Print y(y18) '输出校验码第6题Dim a(1 To 30) As Long '定义a数组存放数列各项a(1) = 1a(2) = 1For i = 3 To 30 '计算数列各项a(i) = a(i - 1) + a(i - 2)Next iFor i = 1 To 30 '输出数列各项Print a(i);Next i第7题Dim a(1 To 15) As String '定义a数组存放产生的字符a(1) = Chr(Int(Rnd() * (90 - 65 + 1) + 65)) '产生第一个字符For i = 2 To 15 '产生其它的字符,比较相同后重新产生a(i) = Chr(Int(Rnd() * (90 - 65 + 1) + 65)) '产生一个新的字符,For j = 1 To i - 1 '新产生的字符与其前产生的字符比较If a(i) = a(j) Then '若与其前产生的字符相同i = i - 1 '则i值减1,达到重新产生的目的Exit ForEnd IfNext jNext iFor i = 1 To 15 '输出数组Print a(i);Next iPrint第8题Dim a() '定义a数组存放数据n = Val(InputBox("数组大小")) '输入数组大小ReDim a(1 To n) '定义实际数组大小For i = 1 To na(i) = Int(Rnd() * 100) '数组赋值Next iFor i = 1 To n '数组输出Print a(i);Next iPrintx = Val(InputBox("插入数组的位置"))y = Val(InputBox("输入插入的数据"))n = n + 1 '计算新数组大小ReDim Preserve a(1 To n) '重新定义新数组大小,保留原数组元素值For i = n To x + 1 Step -1 '从后向前,数组元素值依次后移a(i) = a(i - 1) '数组元素值后移动1位Next ia(x) = y '将数据插入到指定的数组元素For i = 1 To n '数组输出Print a(i);Next iPrint第9题Dim a() '定义a数组存放数据n = Val(InputBox("数组大小")) '输入数组大小ReDim a(1 To n) '定义实际数组大小For i = 1 To na(i) = Int(Rnd() * 100) '数组赋值Next iFor i = 1 To n '数组输出Print a(i);Next iPrinty = Val(InputBox("输入删除的数据"))p = 0 '默认删除的数不在数组中For i = 1 To n '查找删除的数是否在数组中If a(i) = y Then '若删除的数在数组中存在p = 1 '则标记p为1m = i '记录删除的数在数组中的位置m(下标)Exit For '结束查找End IfNext iIf p = 1 Then '若删除的数在数组中存在,则进行删除n = n - 1 '重新设定数组元素个数For i = m To n '从m位置处,数组元素值依次前移a(i) = a(i + 1) '数组元素值前移动1位Next iReDim Preserve a(1 To n) '重新定义新数组大小,保留原数组元素值End IfFor i = 1 To n '数组输出赋值Print a(i);Next iPrint第10题'方法1Dim a() '定义a数组用于存放m*n矩阵数据m = Val(InputBox("输入行数没m"))n = Val(InputBox("输入列数n"))ReDim a(1 To m, 1 To n)For i = 1 To m '数组a赋值For j = 1 To na(i, j) = Int(Rnd() * 100)Next jNext iFor i = 1 To m '输出a数组For j = 1 To nPrint a(i, j);Next jPrintNext iPrints1 = 0 's1存放所有元素的和For i = 1 To m '求所有元素的和For j = 1 To ns1 = s1 + a(i, j) '所有元素累加Next jNext is2 = 0 's2存放非四周的所有元素和For i = 2 To m - 1 '求除去四周的所有元素的和For j = 2 To n - 1s2 = s2 + a(i, j) '非四周元素累加Next jNext is = s1 - s2 '求四周元素的和Print "四周元素和为:"; s'方法2Dim a() '定义a数组用于存放m*n矩阵数据m = Val(InputBox("输入行数没m"))n = Val(InputBox("输入列数n"))ReDim a(1 To m, 1 To n)For i = 1 To m '数组a赋值For j = 1 To na(i, j) = Int(Rnd() * 100)Next jNext iFor i = 1 To m '输出a数组For j = 1 To nPrint a(i, j);Next jPrintNext iPrints1 = 0 's1存放第一行所有元素的和s2 = 0 's2存放最后一行所有元素的和For j = 1 To n '求第一行、最后一行元素的和s1 = s1 + a(1, j) '第一行所有元素累加s2 = s2 + a(m, j) '最后一行所有元素累加Next js3 = 0 's3存放第一列、最后一列元素和For i = 2 To m - 1 '求第一列、最后一列除去第一行、最后一行元素的和s3 = s3 + a(i, 1) + a(i, n) '第一列、最后一列元素累加Next is = s1 + s2 + s3 '求四周元素和Print "四周元素和为:"; s, s1, s2, s3第11题'方法1 定义a、b分别存放运动员号码、成绩Dim a() '定义a数组号码Dim b() '定义b数组存放成绩a = Array("011", "095", "041", "070", "008", "009", "021", "061", "006", "004") 'a数组赋值b = Array(12.4, 11.1, 13.4, 12.1, 12.4, 10.4, 14.4, 15.1, 15.4, 11.4) 'b数组赋值n = UBound(a) '计算数组长度For i = 0 To n '输出数组a,bPrint a(i); b(i)Next i'比较交换法排序For i = 0 To n - 1For j = i + 1 To nIf b(i) > b(j) Thent = b(i): b(i) = b(j): b(j) = t '成绩交换s = a(i): a(i) = a(j): a(j) = s '对应的号码交换End IfNext jNext iPrint "排序后成绩为:"For i = 0 To n '输出数组a,bPrint a(i); b(i)Next i'方法2 选择法排序,定义a、b分别存放运动员号码、成绩Dim a() '定义a数组号码Dim b() '定义b数组存放成绩a = Array("011", "095", "041", "070", "008", "009", "021", "061", "006", "004") 'a数组赋值b = Array(12.4, 11.1, 13.4, 12.1, 12.4, 10.4, 14.4, 15.1, 15.4, 11.4) 'b数组赋值n = UBound(a) '计算数组长度For i = 0 To n '输出数组a,bPrint a(i); b(i)Next i'选择法排序For i = 0 To n - 1k = iFor j = i + 1 To nIf b(k) > b(j) Thenk = jEnd IfNext jt = b(i): b(i) = b(k): b(k) = t '成绩交换s = a(i): a(i) = a(k): a(k) = s '对应的号码交换Next iPrint "排序后成绩为:"For i = 0 To n '输出数组a,bPrint a(i); b(i)Next i'方法3 选择法排序,定义a数组为自定义数据类型,数组元素存放运动员号码与成绩Private Type sport '自定义数据类型,ID存放运动员号码、score存放运动员成绩id As String * 3 '定义运动员号码字段score As Single '定义运动员成绩字段End TypePrivate Sub Command1_Click()Dim a(1 To 10) As sport '定义a数组为自定义类型Dim s As sport '定义s变量自定义类型n = 3 'UBound(a) '计算数组长度For i = 1 To n '数组a元素赋值a(i).id = InputBox("输入第" & i & "个号码")a(i).score = Val(InputBox("输入第" & i & "个成绩"))Next iPrint "排序前成绩为:"For i = 1 To n '输出数组a元素值Print a(i).id; a(i).scoreNext i'比较交换法排序For i = 1 To n - 1k = iFor j = i + 1 To nIf a(k).id > a(j).id Thenk = jEnd IfNext js = a(i): a(i) = a(k): a(k) = s 'a数组元素值交换Next iPrint "排序后成绩为:"For i = 1 To n '输出数组aPrint a(i).id; a(i).scoreNext iEnd Sub。