填空题[说明] 本程序的函数sum(int,i int total,int sigma,int rear,int d[],int n)用来从已知数组d的前n个元素中找出所有部分元素序列之和等于total的元素序列,约定数组d的元素都是正整数,且都小于等于total。 函数sum使用递归方法找出全部解答。参数i表示递归函数当前考虑元素d[i],参数sigma是调用前已选取的部分序列的元素和,参数rear是后面还未考虑的那部分元素的元素和。 函数对元素d[i]有两种可能的选择方案: (1)考虑元素d[i]被包含在新的部分元素序列中的可能性。如果在当前部分元素序列之后接上d[i],新序列的元素和不超过total,则函数将d[i]包含在当前部分元素序列中。如果新的部分元素序列的元素和等于total时,新的部分元素序列就是一个解答,函数将其输出;否则,若继续考虑后面的元素还有可能找到解答时,函数就递归去考虑后面的元素,寻找解答。最后,函数应恢复原来部分元素序列中不包含d[i]的状态。 (2)考虑元素d[i]不被包含在新的部分元素序列中的可能性。如果继续向d[i]之后考虑还是有希望能得到和为total的部分元素序列,函数将新序列不包含d[i也作为一种可能的选择,并递归去考虑后面的元素,寻找解答。 [程序1—7] #include<stdio.h> #define N 100 int a[N]; int fig[N]; sum(int i,im total,int sigma,int rear,int d[],int t) int j; /*考虑元素d[i]被包含在新的部分元素序列中的可能性*/ if(sigma+d[i]<=total) /*如果d[i]与当前序列的和不超过total*/ flg[i]=1; /*d[i]被考虑在当前部分元素序列中*/ if( (1) ==total) /*输出解*/ for(j=0;flg[j]==0;j++); printf("%4d=%d",total,d[j]); for(j++;j<=i;j++) if(flg[j]) printf("+%d",d[j]); printf("\n"); else /*继续考虑后面的元素有可能找到解答时*/ if(i<n-1&&rear+sigma>=total) sum(i+1,total, (2) ,rear-d[i],d,n); (3) ; /*考虑元素d[i]不被包含在新的部分元素序列中的可能性*/ if(i<n-1&&rear-d[i]+tigma>=total) sum(i+1,total, (4) ,rear-d[i],d,n); main() int ij,n,total,s,d; printf("输入total!/n");scanf("%d",&total); printf("输入n!/n");scanf("%d",&n); for(s=i=0;i<n;= printf("输入第%d个元素>0且<=%d)\n",i+1,total; scanf("%d",&d); if(d<1 || d>total) printf("出错,请重新输入!\n"); continue; S+=a[i++]=d; sum(0,total,0, (5) ,a,n); printf("\n\n");
填空题阅读以下说明和C函数,填充函数中的空缺。
[说明]
函数Insert _key(*root,key)的功能是将键值key插入到*root指向根结点的二叉查找树中(二叉查找树为空时*root为空指针)。若给定的二叉查找树中已经包含键值为key的结点,则不进行插入操作并返回0;否则申请新结点、存入key的值并将新结点加入树中,返回1。
提示:
二叉查找树又称为二叉排序树,它或者是一棵空树,或者是具有如下性质的二叉树:
若它的左子树非空,则其左子树上所有结点的键值均小于根结点的键值;
若它的右子树非空,则其右子树上所有结点的键值均大于根结点的键值;
左、右子树本身就是二叉查找树。
设二叉查找树采用二叉链表存储结构,链表结点类型定义如下:
typedef struct BiTrrode{
int key _value; /*结点的键值,为非负整数*/
struct BiTnode *left,*right; /*结点的左、右子树指针*/
}BiTnode, *BSTree;
[C函数]
int Insert _key(BsTree *root,int key)
{
BiTnode *father=NULL,*p=*root,*s;
while(______&&key!=p->key_value){/*查找键值为Key的结点*/
father=p;
if(key<p->key_value)p=______; /*进入左子树*/
else p=______; /*进入右子树*/
}
if (p) return 0; /*二叉查找树中已存在键值为key的结点,无须再插入*/
s=(BiTraode*)malloc(______);/*根据结点类型生成新结点*/
if (!s) return-1;
s->key_value=key; s->left=NULL; s->right=NULL;
if(!father)
______; /*新结点作为二叉查找树的根结点*/
else /*新结点插入二叉查找树的适当位置*/
if(key<father->key_value)father->left=s;
else father->right=s;
return 1:
}
填空题阅读以下说明和C程序,填充程序中的空缺。 [说明] 埃拉托斯特尼筛法求不超过自然数N的所有素数的做法是:先把N个自然数按次序排列起来,1不是素数,也不是合数,要划去;2是素数,取出2(输出),然后将2的倍数都划去;剩下的数中最小者为3,3是素数,取出3(输出),再把3的倍数都划去;剩下的数中最小者为5,5是素数(输出),再把5的倍数都划去。这样一直做下去,就会把不超过N的全部合数都筛掉,每次从序列中取出的最小数构成的序列就是不超过N的全部质数。 下面的程序实现埃拉托斯特尼筛法求素数,其中,数组元素sieve[i](i>0)的下标i对应自然数i,sieve[i]的值为1/0分别表示i在/不在序列中,也就是将i划去(去掉)时,就将sieve[i]设置为0。 [C程序] #include <stdio.h> #define N 10000 int main() char sieve[N+1]=(0); int i=0,k; /*初始时2~N都放入sieve数组*/ for(i=2;______;i++) sieve[i]=1; for(k=2;;) /*找出剩下的数中最小者并用K表示*/ for(;k<N+1&&sieve[k]==0;______); if(______) break; print("%d/t",k); /*输出素数*/ /*从sieve中去掉k及其倍数*/ for(i=k;i<N+1;i=______) ______; return 0; /*end of main*/
填空题阅读以下说明和C语言程序,填补空缺。
[说明]
某电信公司记录了每个用户的详细通话情况(每次通话数据记录在一行),现将某用户某月的通话数据存入一个文本文件“dial.txt”中,其数据格式如下:
拨入或拨出标记通话开始时间通话结束时间对方号码 注1:数据字段以一个空格作为分隔符。
注2:拨入和拨出标记均为小写字母。拨入标记为“i”,表示其他用户呼叫本机,本机用户不需付费;拨出标记为“o”,表示本机呼叫其他用户,此时本机用户需要付费。
注3:通话开始和结束时间的格式均为:HH:MM:SS。其中HH表示小时,取值00~23;MM表示分钟,取值00~59;SS表示秒,取值00~59。从通话开始到结束这段时间称为通话时间,假定每次通话时间以秒为单位,最短为1秒,最长不超过24小时。
注4:跨月的通话记录计入下个月的通话数据文件。 例如“o 23:01:12
00:12:15…”表示本次通话是本机呼叫其他用户,时间从23时01分12秒至次日的0时12分15秒,通话时间为71分03秒。
下面程序的功能是计算并输出该用户本月电话费(单位:元)。 通话计费规则为:
(1)月通话费按每次通话费累加;
(2)每次的通话费按通话时间每分钟0.08元计算,不足1分钟时按1分钟计费。
对于每次的拨出通话,程序中先分别计算出通话开始和结束时间相对于当日0点0分0秒的时间长度(以秒为单位),然后算出本次通话时间和通话费。
例如,若输入文件dial.txt的数据如下所示,则输出fee=7.44。 o 14:05:23 14:11:25
82346789 i 15:10:00 16:01:15 13890000000 o
10:53:12 11:07:05 63000123 o 23:01:12 00:12:15
13356789001 [C语句程序代码]
#include<stdio.h> FILE *fin; int main(
) { char str[80];
int h1, h2, m1, m2, s1, s2; long t_start,
t_end, interval; int c; double
fee=0; fin=fopen("dial. txt", "r")j;
if (!fin) return -1;
while(!feof(fin)) { if(!fgets(str, 80, fin))
break; if({{U}} (1) {{/U}})
continue; h1=(str[2]-48)*10+str[3]-48;
m1=(str[5]-48)*10+str[6]-48;
s1=(str[8]-48)*10+str[9]-48; h2=(str[11]-48)*10+str[12]-48;
m2=(str[14]-48)*10+str[15]-48;
s2=(str[17]-48)*10+str[18]-48;
t_start=h1*60*60+m1*60+s1; /*通话开始时间*/
t_end=h2*60*60+m2*60+s2; /*通话结束时间*/ if({{U}}
(2) {{/U}}) /*若通话开始和结束时间跨日*/
interval={{U}} (3) {{/U}} -t_start+t_end;
else interval=t_end-t_start;
c={{U}} (4) {{/U}};
/*计算完整分钟数表示的通话时间*/ if(interval%60)
{{U}} (5) {{/U}};
fee+=c*0.08; } fclose(fin);
printf("fee=%.21f/n", fee);
return 0; }
填空题 阅读下列说明和C++代码,回答问题。 [说明]
已知下列程序运行时的输出应为: 1:1 1:1
1:1 [C++程序] 01 #include
<iostream> 02 using namespace std;
03 class stick{ 04 protect;
05 {{U}} (1) {{/U}}{}; 06 Stock(int
n, int pr=1) { 07 shares=n; share_val=pr;
08 }; 09 void~stock( ) {};
10 public: 11 //成员函数
12 void output( ){ 13 {{U}}
(2) {{/U}}<<shares<<":"<<share val<<endl; 14
} 15 private: 16
//成员变量 17 int shares; 18
int share_val; 19 };
20 21 void main( ){ 22
Stock a(1); a. output( ); 23 Stock b;
b. output( ); 24 Stock C=Stock(
); c.output( ); 25 }
请补齐上述代码中的空缺(1)和(2)。
填空题[说明] 假设一个算术表达式中可以包含以下三种括号:“(”和“)”、“[”和“]”、“”和“”,并且这三种括号可以按照任意的次序嵌套使用。 下面仅考虑表达式中括号的匹配关系,其他问题暂时忽略。例如,表达式“[a.(b.5)]*c[]”中的括号是完全匹配的,而表达式“[a-(b-5]))*c”中的括号不是完全匹配的,因为“(”与“]”不能匹配,而且多了一个“)”,即缺少一个与“)”相匹配的“(”。 函数ifMatched(char expr[])的功能是用栈来判断表达式中的括号是否匹配,表达式以字符串的形式存储在字符数组expr中。若表达式中的括号完全匹配,则该函数的返回值为Matched,否则返回值为 该函数的处理思路如下: (1)设置一个初始为空的栈,从左至右扫描表达式。 (2)若遇上左括号,则令其入栈;若遇上右括号,则需要与栈顶的左括号进行匹配。 (3)若所遇到的右括号能与栈顶的左括号配对,则令栈顶的左括号出栈,然后继续匹配过程;否则返回Mismatched,结束判断过程。 (4)若表达式扫描结束,同时栈变为空,则说明表达式中的括号能完全匹配,返回Mached。 函数ifMached中用到了两种用户自定义数据类型BOOL和STACK,其中,BOOL类型的定义如下: STACK(即栈类型)的定义省略,栈的基本操作的函数原型说明如下: ● void InitStack(STACK*S):初始化一个空栈。 ● void Push(STACK*S,char e):将一个字符压栈,栈中元素数目增1。 ● void Pop(STACK*S):栈顶元素出栈,栈中元素数目减1。 ● char Top(STACK S):返回非空栈S的栈顶元素值,栈中元素数目不变。 ● int IsEmpty(STACK S):若S是空栈,则返回1,否则返回0。 [程序1—6] BOOL ifMatched(char expr[]) char*cptr; /*cptr指向表达式中的字符*/ STACK S; char e; InitStack(*cptr!='/0'; (1) if(*cptr=='('||*cptr=='['||*cptr=='') (2) ; else if(*cptr==')'||*cptr=='') if(IsEmpty(S)) return Mismatched; e= (3) ; /*取栈顶的左括号*/ if(*cptr==')/&&e !='(')return Mismatched; if(*cptr==']'&&e!='[')return Mismatched; if(*cptr==')'&&e!'')return Mismatched; (4) ; if( (5) )return Matched; return Mismatched;
填空题阅读以下说明和C函数,将应填入______处的语句或语句成分写在对应栏内。 [说明1] 函数deldigit(char*s)的功能是将字符串s中的数字字符去掉,使剩余字符按原次序构成~个新串,并保存在原串空间中。其思路是:先申请一个与s等长的临时字符串空间并令t指向它,将非数字字符按次序暂存入该空间,最后再复制给s。 [C函数] void deldigit(char*s) char*t=(char*)malloc(______); /*申请串空间*/ int i,k=0; if(!t) return; for(i=0;i<strlen(s);i++= if(!(*(s+i)>='0'&&*(s+i)<='9')) t[k++]=______; ______='/0' /*设置串结束标志*/ strcpy(s,t); free(t); [说明2] 函数reverse(char*s,int len)的功能是用递归方式逆置长度为len的字符串s。例如,若串s的内容为“abcd”,则逆置后其内容变为“dcba”。 [C函数] void reverse(char*s,int len) char ch; if(______) ch=*s; *s=*(s+len-1); *(s+len-1)=ch; reverse(______);
填空题[说明]下面流程图的功能是:在已知字符串A中查找特定字符串B,如果存在,则输出B串首字符在A串中的位置,否则输出-1。设串A由n个字符A(0)、A(1)、…、A(n-1)组成,串B由m个字符B(0)、B(1)、…、B(m-1)组成,其中n≥m>0。在串A中查找串B的基本算法如下:从串A的首字符A(0)开始,取子串A(0)A(1)…i(m-1)与串B比较;若不同,则再取子串A(1)A(2)…A(m)与串B比较,以此类推。例如,字符串“CABBRFFD”中存在字符子串“BRF”(输出3),不存在字符子串“RFD”(输出-1)。在流程图中,i用于访问串A中的字符(i=0,1,…,n-1),j用于访问串B中的字符(j=0,1,…,m-1)。在比较A(i)A(i+1)…A(i+m-1)与B(0)B(1)…B(m-1)时,需要对A(i)与B(0)、A(i+1)与B(1)、…、A(i+j)与B(j)、…逐对字符进行比较。若发现不同,则需要取下一个子串进行比较,以此类推。[流程图]本题流程图如图8-30所示。
填空题[说明]函数sort(NODE*head)的功能是:用冒泡排序法对单链表中的元素进行非递减排序。对于两个相邻节点中的元素,若较小的元素在后面,则交换这两个节点中的元素值。其中,head指向链表的头节点。排序时,为了避免每趟都扫描到链表的尾节点,设置一个指针endptr,使其指向下趟扫描需要到达的最后一个节点。例如,对于图8-25(a)所示的链表进行一趟冒泡排序后,得到图8-25(b)所示的链表。链表的节点类型定义如下:typedefStruetNodeintdata;structNode*next;NODE;[C语言函数]voidsort(NODE*head)NODE*ptr,*preptr,*endptr;inttempdata;ptr=head->next;while(1)/*查找表尾节点*/ptr=ptr->next;endptr=ptr;/*令endptr指向表尾节点*/ptr=(2);while(ptr!=endptr)while((3))if(ptr->data>ptr->next->data)tempdata=ptr->data;/*交换相邻节点的数据*/ptr->data=ptr->next->data;ptr->next->data=tempdata;preptr=(4);ptr=ptr->next;endptr=(5);ptr=head->next;
填空题阅读以下说明和C++代码,填充代码中的空缺。[说明]下面的程序用来计算并寻找平面坐标系中给定点中最近的点对(若存在多对,则输出其中的一对即可)。程序运行时,先输入点的个数和一组互异的点的坐标,通过计算每对点之间的距离,从而确定出距离最近的点对。例如,在图所示的8个点中,点(1,1)与(2,0.5)是间距最近的点对。[C++代码]#include<iostream>#include<cmath>usingnamespacestd;classGPointprivate:doublex,y;public:voidsetX(doublex)this->x=x;voidsetY(doubleY)this->y=Y;doublegetX()returnthis->x;doublegetY()returnthis->y;;classComputeDistancepublic:doubledistance(GPointa,GPointb)returnsqrt((a.getX()-b.getX())*(a.getX()-b.getx())+(a.getY()-b.getY())*(a.getY()-b.getY()));;intmain()inti,j,numberofP0ints=0;cout<<"输入点的个数:";cin>>numberOfPOints;______points=newGPoint[numberOfPoints];//创建保存点坐标的数组memset(points,0,sizeof(points));cout<<"输入"<<numberOfPoints<<"个点的坐标:";for(i=0;i<numberOfPoints;i++)doubletmpx,tmpy;Cin>>tmpx>>tmpy;points[i].setX(tmpx);points[i].setY(tmpy);______computeDistance=newComputeDistance();intp1=0,p2=1;//p1和p2用于表示距离最近的点对在数组中的下标doubleshortestDistance=computeDistance->distance(points[p1],points[p2]);//计算每一对点之间的距离for(i=0;i<numberOfPoints;i++)for(j=i+1;j<______;j++)doubletmpDistance=computeDistance->______;if(______)p1=i;p2=j;shortestDiStance=tmpDistance;cout<<"距离最近的点对是:(";cout"points[p1].getX()<<",”<<points[p1].getY()<<")和(";cout<<points[p2].getX()<<","<<points[p2].getY()<<")"<<endl;deletecomputeDiStance;return0;
填空题{{B}}试题五{{/B}}阅读以下说明和C语言函数,回答问题。[说明]已知包含头节点(不存储元素)的单链表的元素已经按照非递减方式排序,函数compress(NODE*head)的功能是去掉其中重复的元素,使得链表中的元素互不相同。处理过程中,当元素重复出现时,保留元素第一次出现所在的节点。图8-29(a)、(b)是经函数compress()处理前后的链表结构示例图。链表的节点类型定义如下:typedefstructNode{intdata;structNode*next;}NODE;[C语言函数]voidcompress(NODE*head){NODE*ptr,*q;ptr={{U}}(1){{/U}};/*取得第一个元素节点的指针*/while({{U}}(2){{/U}}while(qfree(q);q=ptr->next;}{{U}}(5){{/U}}=ptr->next;}/*endofwhile*/}/*endofcompress*/
填空题阅读以下说明和C函数,填充函数中的空缺。 [说明] 函数Insert _key(*root,key)的功能是将键值key插入到*root指向根结点的二叉查找树中(二叉查找树为空时*root为空指针)。若给定的二叉查找树中已经包含键值为key的结点,则不进行插入操作并返回0;否则申请新结点、存入key的值并将新结点DHA树中,返回1。 提示: 二叉查找树又称为二叉排序树,它或者是一棵空树,或者是具有如下性质的二叉树: 若它的左子树非空,则其左子树上所有结点的键值均小于根结点的键值; 若它的右子树非空,则其右子树上所有结点的键值均大于根结点的键值; 左、右子树本身就是二叉查找树。 设二叉查找树采用二叉链表存储结构,链表结点类型定义如下: typedef struct BiTnode int key _value; /*结点的键值,为非负整数*/ struct BiTnode *left,*right; /*结点的左、右子树指针*/ BiTnode,*BSTree; [C函数] int Insert _key(BSTree *root,int key) BiTnode *father=NULL,*p=*root,*s; while(______&&key!=p->key _value)(/*查找键值为key的结点*/ father=p; if(key<p->key _value)p=______; /*进入左子树*/ else p=______; /进入右子树*/ if(p) return 0; /*二叉查找树中已存在键值为key的结点,无需再插入*/ s=(BiTnode *)malloc(______);/*根据结点类型生成新结点*/ if(!s)rettlrn -1; s->key _value=key; s->left=NULL; s->right=NULL; if(!father) ______; /*新结点作为二叉查找树的根结点*/ else /*新结点插入二叉查找树的适当位置*/ if(key<father->key _value)father->left=s; else father->right=s; return 1;
填空题{{B}}试题二{{/B}}阅读以下说明和C程序,回答问题。
[说明] 下面的程序用Dole
Rob算法生成N阶(N为奇数)魔方阵(各行、列、对角线数字之和相等)。该算法的过程为:从1开始,按如下方法依次插入各自然数,直到N2为止。
①在第一行的正中插入1。
②新位置应当处于最近插入位置的右上方,若该位置已超出方阵的上边界,则新位置取应选列的最下一个位置;若超出右边界,则新位置取应选行的最左一个位置。
③若最近插入的元素是N的整数倍,则选同列的下一行位置为新位置。 例如,3阶魔方阵如下所示:
8 1 6 3 5 7 4
9 2 [C程序]
#include<stdio.h> #include<stdlib.h>
#define SIZE 50 main( )
{ int row, col, n, value;
int a[SIZE+1][SIZE+1]; /*不使用下标为0的元素*/
printf("请输入要输出魔方阵的阶数n(奇数, <%d):n=", SIZE);
scanf("%d", if(!(n%2) || n<1 ||
{{U}}(1) {{/U}}){ printf("输入数据有误!/n");
exit(0); }
row=1; col=(n+1)/2; value=1; while(value<={{U}} (2)
{{/U}}) { a[row][col]=value;
/*计算下一位置*/ if(value%n!=0){
row--; {{U}}(3) {{/U}};
if(row<1)row=n; if(col>n){{U}} (4)
{{/U}}; } else row++;
value={{U}} (5) {{/U}};
} printf("/n%d阶魔方阵如下所示:/n/n", n);
for(row=1; row<=n; row++){ for(col=1; col<=n;
col++) printf("%5d", a[row][col]);
printf("/n"); }
}
填空题【说明】
以下程序的功能是计算三角形、矩形和正方形的周长并输出。
程序由4个类组成:类Triangle、Rectangle和Square分别表示三角形、矩形和正方形;抽象类 Figure提供了一个纯虚拟函数getGirth(),作为计算上述3种图形周长的通用接口。
【C++程序】
# include < iostream. h >
# include < math. h >
class Figure {
public:
virtual double getGirth() =0; //纯虚拟函数 };
class Rectangle:
1
{
protected:
double height;
double width;
public:
Rectangle(){};
Rectangle( double height, double width) {
this→height = height;
this→width = width;
}
double getGirth ( ) {
return
2
;
}
};
class Square:
3
{
public:
Square( double width) {
4
;
} };
class Triangle:
5
{
double la;
double lb;
double lc;
public:
Triangle( double la,double lb,double lc){
this→la = la; this→Lb = lb; this→lc = lc;
}
double getGirth ( ) {
}
return la + lb + lc;
}
};
void main( ) {
Figure * figures
= {
new Triangle ( 2,3,3 ),new Rectangle (5,8) , new Square
5
};
for (inti =0;i<3;i++){
cout < < "figures [" < < i < <" ] girth =" < < ( figures [ i ] ) →getGirth ( ) < < end1;
}
}
填空题{{B}}试题六{{/B}}阅读以下说明和流程图,填补流程图中的空缺。[说明]下面流程图的功能是:在已知字符串A中查找特定字符串B,如果存在,则输出B串首字符在A串中的位置,否则输出-1。设串A由n个字符A(0)、A(1)、…、A(n-1)组成,串B由m个字符B(0)、B(1)、…、B(m-1)组成,其中n≥m>0。在串A中查找串B的基本算法如下:从串A的首字符A(0)开始,取子串A(0)A(1)…i(m-1)与串B比较;若不同,则再取子串A(1)A(2)…A(m)与串B比较,以此类推。例如,字符串“CABBRFFD”中存在字符子串“BRF”(输出3),不存在字符子串“RFD”(输出-1)。在流程图中,i用于访问串A中的字符(i=0,1,…,n-1),j用于访问串B中的字符(j=0,1,…,m-1)。在比较A(i)A(i+1)…A(i+m-1)与B(0)B(1)…B(m-1)时,需要对A(i)与B(0)、A(i+1)与B(1)、…、A(i+j)与B(j)、…逐对字符进行比较。若发现不同,则需要取下一个子串进行比较,以此类推。[流程图]本题流程图如图8-30所示。
填空题[说明] 对于具有n个元素的整型数组a,需要进行的处理是删除a中所有的值为0的数组元素,并将a中所有的非0元素按照原顺序连续地存储在数组空间的前端。下面分别用函数CompactArr_v1和CompactArr_v2来实现上述处理要求,函数的返回值为非零元素的个数。 函数CompactArr_v1(int a[],intn)的处理思路是:先申请一个与数组a的大小相同的动态数组空间,然后顺序扫描数组a的每一个元素,将遇到的非0元素依次复制到动态数组空间中,最后再将动态数组中的元素传回数组a中。 函数CompactArr_v2(int a[],int n)的处理思路是:利用下标i(初值为0)顺序扫描数组a的每一个元素,下标k(初值为0)表示数组a中连续存储的非0元素的下标。扫描时,每遇到一个数组元素,i就增1,而遇到非0元素并将其前移后k才增1。 [程序1-4] int CompactArr_v1(int a[],int n) int i,k; int*temp=(int*)malloc(n* (1) if(!temp) return-1; for(i=0,k=0;i<n;i++) if(a[i]!=0) (2) =a[i]; for(i=0; (3) ;i++) a[i]=temp[i]; return k; [程序1-5] int CompactArr v2(int a[],int n) int i,k; for(i=0,k=0;i<n;i++) if(a[i]!=0) (4) =a[i]; return k;
填空题阅读以下说明和C++代码,将应填入______处的语句或语句成分写在对应栏内。 [说明] 某数据文件students.txt的内容为100名学生的学号和成绩,下面的程序将文件中的数据全部读入对象数组,按分数从高到低进行排序后选出排名前30%的学生。 [C++代码] #include <iostream> #include <fstream> #include <string> using namespace std; class Student private: string sNO; //学号 int credit;//分数 public: Student(string a,int b)sNO=a;credit=b; Student() int getCredit(); void out(); ; ______::getCredit() return credit; ______::out() Cout<<"SNO:"<<sNO<<",Credit="<<credit<<endl; class SortStudent public: void sort(Student *s,int n); SortStudent() ; void SortStudent::sort(Student *s,int n) for(int i=0;i<n-1;i++) for(int j=i+1;j<n;j++) if(s[i].______<s[j].______> Student temp=s[i];s[i]=s[j];s[j]=temp; int main(int argc,char* argv[]) const int number=100; //学生总数 ifstream students; students.open("students.txt"); if(!students.is open()) throw 0; Student *testStudent=______[number]; int k=0; string s; while(getline(students,s,'/n'))//每次读取一个学生的学号和成绩 Student student(s.substr(0,s.find(',')),atoi(s.substr(s.find(',')+1).c_str())); testStudent[k++]=student; Students.closeo; ______; ss.sort(testStudent,k); cout<<"top 30%:"+endl; for(k=0;k<number*0.3;k++) testStudent[k].out(); delete[]testStudent; return 0;
填空题阅读以下说明和C函数,将应填入______处的语句或语句成分写在对应栏内。[说明]已知单链表L含有头节点,且节点中的元素值以递增的方式排列。下面的函数DeleteList在L中查找所有值大于minK且小于maxK的元素,若找到,则逐个删除,同时释放被删节点的空间。若链表中不存在满足条件的元素,则返回-1,否则返回0。例如,某单链表如图1所示。若令minK为20,maxK为50,则删除后的链表如图2所示。链表节点类型定义如下:typedefStructNodeintdata;structNode*next;Node,*LinkList;[C函数]intDeleteList(LinkListL,intminx,intmaxK)/*在含头节点的单链表L中删除大于minx且小于maxK的元素*/______*q=L,*p=L->next;/*p指向第一个元素节点*/intdeiTag=0;while(p)if(p->data<=minK)iq=p;p=______;elseif(p->data<maxK=/*找到删除满足条件的节点*/q->next=______free(p);p=______;delTag=1;elsebreak;if(______)return-1;return0;
填空题阅读以下说明和Java程序,填充程序中的空缺,将解答填入对应栏内。[说明]下面的程序用来计算并寻找平面坐标系中给定点中最近的点对(若存在多对,则输出其中的一对即可)。程序运行时,先输入点的个数和一组互异的点的坐标,通过计算每对点之间的距离,从而确定出距离最近的点对。例如,在图所示的8个点中,点(1,1)与(2,0.5)是间距最近的点对。[Java代码]importJava.util.Scanner;classGPoint{privatedoubiex,y;publicvoidSetX(aoublex){this.x=x;}publicvoidsetY(doubley){this.y=y;}publicdoublegetX(){returnthis.x;}publicdoublegetY(){returnthis.y;}classFindNearestPoints{publicstaticvoidmain(String[]args){Scannerinput=newScanner(System.in);System.out.print("输入点的个数:");intnumberOfPoints=input.nextint();________points=newGPoint[numberOfPoints];//创建保存点坐标的数组System.out.print("请输入"+numberOfPoints+"个点的坐标");for(inti=0;i<;i++){points[i]=________;points[i].setX(input.nextDouble());points[i].setY(input.nextDouble());}FindNearestPointsfnp=newFindNearestPoints();intp1=0,p2=1;//p1和p2用于表示距离最近的点对在数组中的下标doubleshortestDistance=fnp.getDistance(points[p1],points[p2]);//计算每一对点之间的距离for(inti=0;i<;i++){for(intj=1+1;j<________;j++){doubletmpDistance=fnp.________;//计算两点间的距离if(________){p1=i;p2=j;shortestDistance=tmpDistance;}}}System.out.println("距离最近的点对是("+points[p1].getX()+","+points[p1].getY()+")和("+points[p2].getX()+","+points[p2].getY()+")");}publicdoublegetDistance(GPointpt1,GPointpt2){retumMath.sqrt((pt2.getX()-pt1.getX())*(pt2.getX()-ptllgetX())+(pt2.getY()-pt1.getY())*(pt2.getY()-pt1.getY());}}
填空题【函数1.2说明】
函数merge(int a[],int n,int b[],int m,int *c)是将两个从小到大有序数组a和b复制合并出一个有序整数序列c,其中形参n和m分别是数组a和b的元素个数。
【函数1.2】
void merge(int a[ ],int n,int b[ ],int m,int *c)
{ int i,j;
for(i=j:0;i<n && j<m;)
*c++ =a[i] <b[j]? a[i++]:b[j++];
while(i<n)
1
;
while(j<m)
2
;
}
