阅读以下函数说明和C代码,将C程序中(1)~(5)空缺处的内容补充完整。
【说明】
对给定的字符集合及相应的权值,采用哈夫曼算法构造最优二叉树,并用结构数组存储最优二叉树。例如,给定字符集合{a,b,c,d}及其权值2、7、4、5,可构造如图6-15所示的最优二叉树,以及相应的结构数组Ht(如表6-14所示,其中数组元素Ht[0]不用)。
结构数组Ht的类型定义如下:
define MAXLEAFNUM 20
struct node{
char ch; /*扫当前节点表示的字符,对于非叶子节点,此域不用*/
Int weight; /*当前节点的权值*/
int parent; /*当前节点的父节点的下标,为0时表示无父节点*/
int lchild, rchild;
/*当前节点的左、右孩子节点的下标,为0时表示无对应的孩子节点*/
)Ht[2*MAXLEAFNUM];
用“0”或“广标识最优二叉树中分支的规则是:从一个节点进入其左(右)孩子节点,就用“0”(或“1”)标识该分支,如图6-15所示。
若用上述规则标识最优二叉树的每条分支后,从根节点开始到叶子节点为止,按经过分支的次序将相应标识依次排列,可得到由“0”、“1”组成的一个序列,称此序列为该叶子节点的前缀编码。例如,图6-15所示的叶子节点a、b、c、d的前缀编码分别是110、0、111、10。
函数void LeafCode(int root,int n)的功能是:采用非递归方法,遍历最优二叉树的全部叶子节点,为所有的叶子节点构造前缀编码。其中,形参root为最优二叉树的根节点下标;形参n为叶子节点个数。在函数void LeafCode(int root,int n)构造过程中,将Ht[p].weight域用做被遍历节点的遍历状态标志。
函数void Decode(char *buff,int root)的功能是:将前缀编码序列翻译成叶子节点的字符序列,并输出。其中,形参root为最优二叉树的根节点下标;形参buff指向前缀编码序列。
【函数4.1】
char **HC;
void LeafCode(int root, int n)
{ /*为最优二叉树中的n个叶子节点构造前缀编码,root是树的根节点下标*/
int I,p=root,cdlen=0;
char code[20];
Hc = (char **)malloc((n+1)*sizeof(char *)); /*申请字符指针数组*/
For(i = 1;i<= p;++I)
Ht [i]. weight = 0; /*遍历最优二叉树时用做被遍历节点的状态标志* /
While (p) { /*以非递归方法遍历最优二叉树,求树中每个叶子节点的编码*/
If(Ht[p].weight == 0) { /*向左*/
Ht[p].weight = 1;
If(Ht[p].lchild != 0) {
p = Ht[p].lchild;
code[cdlen++] = '0';
}
else if(Ht[p].rchild == 0) { /*若是叶子节点,则保存其前缀编码*/
Hc[p] = (char *)malloc((cdlen+1)*sizeof(char));
(1);
strcpy (Hc [p],code);
}
}
else if(Ht[p].weight == 1) { /*向右*/
Ht [p].weight = 2;
If(Ht[p].rchild != 0) {
p = Ht [p].rchild;
code[cdlen++] ='1';
}
}
else { /*Ht[p].weight == 2,回退/
Ht [p].weight = 0;
p =(2);
(3); /*退回父节点*/
}
} / *while .结束* /
}
【函数4.2】
void Decode(char *buff,int root)
{ int pre = root,p;
while(*buff != '\0') {
p = root;
&
第1题
阅读以下应用程序说明和C程序,将C程序段中(1)~(7)空缺处的语句填写完整。
【说明】
以下【C程序】的功能是,逐一从指定课程成绩文件中读入学生的考号和成绩,对同一学生汇总他(她)的总成绩,并按如图6-14所示格式输出名次(按总成绩由高到底的顺序)、总成绩、同一名次的学生人数、同一名次学生的学号(按学号由小到大的顺序)。
该应用程序约定学生学习课程不超过30种,课程成绩文件的第1个数字就是课程号。统计过程中,同一课程号的成绩文件不能重复输入。
该应用程序采用链表结构存储学生的相关信息,链表中的每个表元对应一位学生。在数据输入过程中,形成一个按学号从小到大顺序链接的有序链表。当数据输入结束后,程序按总成绩从高到低,学号从小到大的顺序对链表排序。最后程序按指定格式输出链表中的信息。
【C程序】
include<stdio.h>
define M 30
define NLEN 10
typedef struct node {
int cur_s; /* 最近输入成绩的科目*/
Char no[NLEN];
int score;
struct node *next;
} NODE;
int s[M], sp, ss, i, mark, order, C;
FILE *fp; NODE *h, *U, *V, *p;
Char fname[80], no[NLEN], ans;
main()
{ for(h = NULL, sp = 0; ;)
{ printf("输入科目成绩文件名(输入aaaa表示强行结束)。 \n");
while(1)
{ scanf("%s", fname);
if (strcmp(fname, "aaaa") == 0)
break;
if ((fp = fopen(fname, "r")) == NULL)
printf("不能打开文件%s, 请重新输入科目文件名。 \n", fname);
else
break;
}
if (strcmp(fname, "aaaa") == 0) break;
fscanf(fp, "%d", &ss); /* 输入科目号 */s[sp]=s;
for (i=0; s[i] ! = ss; 1++);
if ( (1) )
{ printf("该科目的成绩已输入,请输入别的科目成绩文件。\n");
continue;
}
sp++;
while (fscanf(fp, "%s%d", no, &mark) == 2)
{ /* 在链表中寻找最近输入的学号 */
for(v = h; v != NULL && strcmp(v-> no, no)<0; u=v, v= v-> next);
if (v !=NULL && strcmp(v->no, nb) == 0)
{ /* 该生已有成绩 */
if (V->cur_s != ss)
{ /* 该生的当前科目成绩是第一次输入 */
v->score += mark; /* 累计总成绩 */
v->cur_s = ss;
} /* 同一科目成绩重复输入,后输入成绩被忽略 */
}
else
{ p = (NODE *)malloc(sizeof(NODE)); /* 一位新的学生 */
strcpy(p->no,no);
p->score = mark;
p->cur_s = ss;
p-> next = v;
第2题
阅读以下说明及C++程序代码,将应填入(n)处的语句写在对应栏内。
【说明】
本程序的功能是根据矩形左上角和右下角顶点坐标生成一个矩形对象,然后输出该矩形4个顶点的坐标,计算并输出该矩形的面积。
【C++代码】
include<iostream>
using namespace std;
class MyPoint( //表示平面坐标系中的点的类
double x;
double y;
public:
MyPoint (double x,double y){this->x=x;this->y=y;}
double getX()const{(1);}
double getY()const{ return y;}
void show()const{ cout<<'('<<x<<','<<y<<')';}
};
class MyRectangle{ //表示矩形的类
MyPoint upleft; //矩形的左上角顶点
MyPoint down right; //矩形的右下角顶点
public:
MyRectangle(MyPoint upleft,MyPoint downright);
MyPoint getUpLeft()const{return up_left;} //返回左上角坐标
MyPoint getDownRight()const{return down_right;} //返回右下角坐标
MyPoint getUpRight()const; //返回右上角坐标
MyPoint getDownLeft()const; //返回左下角坐标
double area()const; //返回矩形的面积
};
MyRectangle:: MyRectangle((2)):
up left(p1),down_right(p2){}
MyPoint MyRectangle::getUpRight()const
{
return MyPoint(down_right.getX(),up_left.getY());
}
MyPoint MyRectangle::getDownLeft()const
{
return MyPeint((3));
}
double (4) ::area()const
{
return (getUpLeft(),getX()-getDownRight().getX())*
(getDownRight().getY()-getUpLeft().getY());
}
int main( )
{
MyRectangle r(MyPoint(0,2),MyPoint(2,0));
r.getUpLeft(),show();
r.getUpRight().show();
r.getDown Right().show();
(5);
cout<<r.area()<<end1;
return 0;
}
第3题
阅读以下说明和C语言程序,将应填入(n)处的字句写在对应栏内。
【说明】
本程序对某电码文(原文)进行加密形成密码文,其加密算法如下:
假定原文为C1,C2,C3,…,Cn加密后形成的密文为S1,S2,S3,…,Sn,首先读入正整数 key(key>1)作为加密钥匙,并将密文字符位置按顺时针方向连成一个环,如下图所示:
加密时从S1位置起顺时针计数,当数到第key个字符位置时,将原文中的字符放入该密文字符位置中,同时从环中除去该字符位置;接着从环中下一个字符位置起继续计数,当再次数到第key个字符位置时,将原文中字符C2放入其中,并从环中除去该字符位置:依次类推,直至n个原文字符全部放入密文环中。由此产生的 S1S2…Sn即为原文的密文。
例如,当Key=3时,原文this is a decoding system的密文为:
aotgnhedi ys d imietsnc ss
当Key=4时,该原文的密文为:
ssdtyd htegiasiscnm e ion
本程序将电码的原文存放在字符数组old中,加密钥匙存放在整数key中。函数decode用于将原文old加密并返回密文字符数组的首指针。其中函数采用一个双向循环链表CODE来表示密文环:函数strlen用于计算一个字符串中的字符个数(不包括字符串结尾符'\O')。为了简单起见,程序中假设内存容量足以满足动态存储单元分配的要求。
include <stdio.h>
include <stdlib.h>
typedef struct node
{ char ch;
struct node *forward;/* Link to next node. */
struct node *backward;/* Link to previous node.*/
} CODE;
int strlen(char *s)
{ int len=0;
while (*s++!='\0')
len++;
return(len);
}
char *decode(char *otd,int key)
{ char *New; int length,count,i;
CODE *loop,*p;
length=strlen(old);
loop=(CODE *) malloc(length*sizeof(CODE));
for (i=1;i<length-1;i++)
{ loop[i],forward=&loop[i+1];
(1)
}
loop[0].backward=&loop[length-1];
loop[0],forward=&loop[1];
loop[length-1].forward=loop;
(2)
for (p=loop,i=0;i<length;i++)
{ for (count=1 ;count<key;count++
p=p->forward;
(3)
p->backward->forward=p->forward;
p->forward->backward=p->backward;
(4)
}
New=(char *)malloc((length+1) *sizeef(char));
for (i=0;i<length;i++)
(5)
New[length]='\0';
return (New);
}
void main()
{ char old[256];
int key, num=0;
printf("\nPlease input the telegraph: \n");
while (num<255 && (old[num++]=getchar())!='\n');
old [(num==255)?num:num-1]='\0';
do
{ printf("\nPlease input Key (Key>1):");
scanf("%d",&key);
} while (key<=1);
printf( "\nThe decode of telegraph:'%s'is:\n'%s'\n",old,decode(old,key));
}
第4题
阅读下列函数说明和C函数,将应填入(n)处的字句写在对应栏内。
[说明]
循环队列的类型定义如下(其中队列元素的数据类型为datatype):
typedef struct{
datatype data[MAXSIZE]; /*数据的存储区*/
int front,rear; /*队首、队尾指针*/
int num; /*队列中元素的个数*/
}c _ SeQueue; /*循环队*/
下面函数及其功能说明如下:
(1) c_SeQueue* Init_SeQueue():新建队列;
(2) int ln_SeQueue( c_SeQueue *q, datatype x):将元素x插入队列q,若成功返回1否则返回0;
(3) int Out_SeQueue (c_SeQueue *q, datatype *x):取出队列q队首位置的元素,若成功返回1否则返回0。
[函数]
c_SeQueue* Init_SeQueue()
{ q=malloc(sizeof(c_SeQueue));
q->front=q->rear=MAXSIZE-1;
(1);
return q;
}
int In_SeQueue( c_SeQueue *q, datatype x)
{ if(q->num= =MAXSIZE) return 0; /*队满不能入队*/
else {
q->rear=(2);
q->data[q->rear]=x;
(3);
return 1; /*入队完成*/
}
}
int Out_SeQueue( c_SeQueue *q, datatype *x)
{ if (q->num= =0) return 0; /*队空不能出队*/
else{
*x=(4); /*读出队首元素*/
q->front=(5);
q->num- -;
return 1; /*出队完成*/
}
}
第5题
阅读以下说明和流程图,回答问题1~2,将解答填入对应的解答栏内。
[说明]
下面的流程图描述了计算自然数1到N(N≥1)之和的过程。
[流程图]
[问题1] 将流程图中的(1)~(3)处补充完整。
[问题2] 为使流程图能计算并输出1*3+2*4+…+N*(N+2)的值,A框内应填写(4);为使流程图能计算并输出不大于N的全体奇数之和,B框内应填写(5)。
第6题
阅读以下应用程序说明和C程序,将C程序段中(1)~(6)空缺处的语句填写完整。
【说明】
某大学征询学生意见,从各学院预选的n(n≤60)位优秀大学生中,评选出“十佳大学生”。以下【C程序】对各位学生选票进行相关的统计、排序等处理。
(1)各学院预选的优秀大学生按1,2,…顺序连续编号,每个编号用两个字符表示,即01,02,…。
(2)所回收的选票按以下格式存于文件source中,每行字符串对应一张选票。其中,姓名占10个字符,学院名称占30个字符,大学生编号占20个字符。
(3)对应名次的大学生编号可以有空缺,但必须用00表示。
(4)若编号超出规定范围,或编号重复出现,按照废票处理。
(5)按选票中所列“十佳大学生”顺序给出各名大学生的得分。评分标准如下:
一 二 三 四 五 六 七 八 九 十
15 12 9 7 6 5 4 3 2 1
(6)按各位大学生得分数由高到低顺序排队,并按以下格式列出“十佳大学生”排行表。
名次 大学生编号 合计得分 合计得票数
若得分相同,则得票数多的在前;若得分和得票数都相同,则编号小的在前。
以下【C程序】中所应用到的函数fopen、fclose和fgets都是I/O程序库中的函数。
【C程序】
include <stdio. h>
define n 60
long int tn[n], td[n], score[n+1][10], order[n];
char s[80];
int mark[]=(15,12,9,7,6,5,4,3,2,1);
FILE *fp, *fopen();
Main()
{ int c, g, k, I, j, b[10];
long int e, d, t, tt, dd;
char * p;
for(i=0; i<=n; i++)
for(j=0; j<10; j++)
score[i][j]=0;
fP=fopen("source", "r"); /*以读方式打开文件source*/
p=fgets(s, 80, fp); /*读fp所指文件的下一行字符串于s*/
while(*p){
g=l; k=0; p+=40;
while(k<10){
c=((*p++)-'0')*10+((*p++)-'0');
b[k++]=c)
if(c<=n){
if(c)
{ i=0;
While( (1) );
If( (2) ){g=0; break;}
}
else{g=0; break;}
}
If(g)
For(i=0; i<k; i++)
If(b[i])
(3);
p=fgets(s, 80, fP);
}
Fclose(fp); /*关闭fp所指文件*/
For(i=1; i<n; i++){
For(t=0, d=0, j=0; j<10; j++){
t +=(e=score[i][j]);
d +=e * mark[j];
}
tn[i-1]=t; td[i-1]=d; order[i-1]=i;
}
For(i=0; i<n-1; i++){
k=i;
for(j=i+1; j<n; j++)
if(
第7题
阅读以下应用说明及Visual Basic程序代码,根据要求回答问题1至问题3。
【说明】
在Visual Basic程序中,设计一个“个人所得税计算器”,其应用程序的运行窗口如图6-16所示。
窗口中的3个文本框和两个按钮的名称分别为Txt_salary、Txt_base、TxL_tax、Cmd_compute和 Cmd_quit。“个人所得税计算器”程序运行时,文本框Txt_base中存放的是免税金额基数(应扣除的基本费用)。当用户在文本框Txt_salary中输入月收入(工资或薪金)并单击【计算】按钮(Cmd_compute后,Txt_tax框中就显示计算所得的应纳税额。文本框Txt_base和Txt_tax在运行时不接受用户输入,Txt_base的内容以灰色显示。
个人工资(或薪金)所得税是按照超额累进的税率来征收的,其计算方法如下:以每月收入总额减去免税金额基数后的余额作为该月的月应纳税所得额,再将应纳税所得额按相应级数采用相应的税率进行累进计算。目前的免税金额基数为1 600元,税率如表6-15所示。
(注:本表所称全月应纳税所得额是指依照本法第六条的规定,以每月收入额减除费用1600元后的余额或者减除附加减除费用后的余额)
设某个人的全月应纳税所得额为M(元),用下面的公式计算其应缴纳的个人所得税额S(元):
若0<M≤500,则S=M×5%;
若500<M≤2000,则S=500×5%+(M-500)×10%;
若2000<M≤5000,则S=500×5%+1500×10%+(M-2000)×15%;
若5000<M≤20000,则S=500×5%+1500×10%+3000×15%+(M-5000)×20%;
假设某程序员2008年5月份工资总额为4700元,减去1600元后,应纳税所得额为3100元,其应缴纳的个人所得税额为500×5%+1500×10%+1100×15%=340元。
在开发过程中,需要编写的程序代码如下。
【Visual Bask程序】
Option Base 0
Private Sub Cmd compute-Click()
Dim paylevel,taxPrate
paylevel=Array(0,500,2000,5000,20000,40000,60000,80000,100000,1000001
taxPrate=Array(5,10,15,20,25,30,35,40,45)
M=(1)
S = 0
If (M>0) Then
For j =1 To 9
If (2) Then
s=s+(paylevel(j)-paylevel(j-1))*taxPrate(j-1)/100
Else
(3)
Exit For
End if
Next j
End if
(4)=Str$(S)
End Sub
Private Sub Cmd_quit_Click()
End
End Sub
Private Sub Form_Load()
Txt_tax.Text = " "
Txt_salary.Text = " "
Txt_base.Text = 1600
Txt_tax.Locked = True
Txt_base.Enabled =(5)
End Sub
请根据【说明】信息和如图6-16的显示效果,将【Visual Basic程序】中(1)~(5)空缺处的程序语句填写完整。
第8题
阅读以下应用程序说明和C程序,将C程序段中(1)-(7)空缺处的语句填写完整。
[说明]
以下[C程序]所完成的功能是在3X3方格中填入数字1~N(N≥10)内的某9个互不相同的整数,使所有相邻两个方格内的两个整数之和为质数。系统输出满足该要求的所有填法。系统的部分输出结果如图3-18所示。
图3-18 系统的部分输出结果
3×3方格从第1行左上角方格开始的序号分别为0、1、2,第2行左边方格开始的序号分别为3、4、 5,第3行左下角方格开始的序号分别为6、7、8。以下[C程序]采用试探法,即从序号为0的方格(左上角)开始,为当前方格寻找一个合理的可填整数,并在当前位置正确填入后,为下一方格寻找可填入的合理整数。如不能为当前方格寻找一个合理的可填整数,就要后退到前一方格,调整前一方格的整数。直至序号为8的方格(右下角)也填入合理的整数时,就找到了一个解,将该解输出,并调整序号为8的方格所填的整数,继续去找下一个解。
为了检查当前方格的填入整数的合理性,C程序引入二维数组checkMatrix,用于存放需要进行合理性检查的相邻方格的序号。
[C程序]
include <stdio.h>
define N 12
int a [9]; /* 用于存储方格所填入的整数 */
int b[N+1];
int pos;
checkMatrix[][3] = {{-1},{0,-1},{1,-1},{0,-1},{1,3,-1},{2,4,-1},{3,-1} {4,6,-1}, 5,7,-1}};
void write(int a[])
{ int i, j;
for ( i = 0; i < 3; i++)
for ( j = 0; j < 3; j++)
printf("%3d",a[3*i+j]);
printf("\n");
}
}
int isPrime(int m)
{ int i;
if (m == 2)
return 1;
if (m == 1 || m % 2 == 0)
return 0;
for (i = 3; i * i <= m; )
{ if (m % i == O)
return 0;
i+ =2;
}
return 1;
}
int selectNum(int start)
{ int j;
for (j = start; j <= N; j++)
if (b[j])
return j;
return 0;
}
int check ( ) /* 检查填入pos位置的整数是否合理 */
{ int i, j;
for (i = 0; (j =(1)) >= 0; i++)
if (!isPrime(a[pos] + a[j]))
(2);
(3);
}
extend () /* 为下一方格找一个尚未使用过的整数 * /
{ a[(4)] = selectNum(1);
b[a[pos]] = 0;
}
void change() /* 为当前方格找下一个尚未使用过的整数(找不到回溯) */
{ int j;
while (pos >= 0 && (j = selectNum((5) ) == 0
(6);
if (pos < 0)
return;
b[a[pos]] = 1;
a[pos] = j;
b[j] = 0;
}
find ( )
{ int k = 1;
pos = 0; a[pos] = 1; b[a[pos]] = 0;
de {
if (ok)
if ( (7) ) {
write (a);
change( );
}
else
extend( );
else
change( );
ok = check(pos);
} while (pos >=0);
}
main( )
第9题
阅读以下某客房管理系统的算法说明和程序流程图,根据要求回答问题1至问题4。
【算法说明】
某商务交流中心共有N间客房。每间客房的房间号、房间等级、床位数及占用状态分别存放在数组ROOM、RANK、NBED和STATUS中。房间等级值为1、2或3。房间的状态值为0(空闲)或1(占用)。客房是以房间(不是床位)为单位出租的。
程序流程图(见图2-11)所反映的算法是,根据几个散客的要求预订一间空房。程序的输入为:人数M,房间等级要求尺(R=0表示任意等级都可以)。程序的输出为:所有可供选择的房间号。
在图2-11所示的程序流程图中,若要某个房间I被选中,则需要满足什么条件?
第10题
阅读以下说明和Java代码,将应填入(n)处的语句写在对应栏内。
【说明】
本程序通过移动滑动条修改颜色RGB值,从而控制颜色。程序中有一个面板、3个标签和3个滑动条,标签和滑动条一一对应,分别对应三原色红、绿、蓝,任意拖动其中的一个滑动条,所对应的颜色值就会发生变化,面板的颜色也会发生对应的变化,如下图所示,滑动条值的范围是0~255。
【Java代码】
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class simple extends JFrame. implements AdjustmentListener{
public simple(){
setTitle("simple");
setSize(300, 200);
addWindowListener(new WindowAdapter(){
public void windowClosing((1)){
System.exit(0);
}
});
Container contentPane=getContentPane();
JPanel p=(2);
p.setLayout(new GridLayout(3, 2));
p.add(redLabel=new JLabel("Red 0"));
p.add(red=new JScrollBar(Adjustable. HORIZONTAL, 0, 0, 0, 255));
red.setBlocklncrement(16);
red.addAdjustmentListener(this);
p.add(greenLabel=(3) ("Green 0"));
p.add(green=new JScrollBar(Adjustable.HORIZONTAL 0, 0, 0, 255));
green setBIocklncrement(16);
green.addAdjustmentListener(this);
p.add(blueLabel=new JLabel("Blue 0"));
p.add(btue=new JScrollBar(Adjustable. HORIZONTAL, 0, 0, 0, 255));
blue,setBIocklncrement(16);
blue.addAdjustmentListener(this);
contentPane.add(p, "South");
colorPanet=new JPanel();
colorPanet.setBackground(new Color(0, 0, 0));
contentPane.add((4),"Center");
} public void adjustmentValueChanged(AdjustmentEvent evt){
redLabel.setText("Red"+red.getValue());
greenLabel.setText("Green"+green.getValue());
blueLabel.setText("Blue"+blue.getValue());
coiorPanel.setBackground(new Color(red.getValue(), green.getValue(), blue.getValue()));
colorPanel.repaint();
}
public static void main(String[] args){
JFrame. f=(5);
f.show();
}
private JLabel redLabel;
private JLabel greenLabel;
private JLabel blueLabel;
private JScrollBar red;
private JScroilBar green;
private JScrollBar blue;
private JPanel colorPanel;
为了保护您的账号安全,请在“上学吧”公众号进行验证,点击“官网服务”-“账号验证”后输入验证码“”完成验证,验证成功后方可继续查看答案!