问答题试题三(共15分)阅读以下说明和C函数,将应填入(n)处的字句写在答题纸的对应栏内。[说明]若一个矩阵中的非零元素数目很少且分布没有规律,则称之为稀疏矩阵。对于m行n列的稀疏矩阵M,进行转置运算后得到n行m列的矩阵MT,如图3-1所示。图3-1稀疏矩阵M及其转置矩阵MT为了压缩稀疏矩阵的存储空间,用三元组(即元素所在的行号、列号和元素值)表示稀疏矩阵中的一个非零元素,再用一维数组逐行存储稀疏矩阵中的所有非零元素(也称为三元组顺序表)。例如,图3-1所示的矩阵M相应的三元组顺序表如表3-1所示,其转置矩阵MT的三元组顺序表如表3-2所示。函数TransposeMatrix(MatrixM)的功能是对用三元组顺序表表示的稀疏矩阵M进行转置运算。对M实施转置运算时,为了将M中的每个非零元素直接存入其转置矩阵MT三元组顺序表的相应位置,需先计算M中每一列非零元素的数目(即MT中每一行非零元素的数目),并记录在向量num中;然后根据以下关系,计算出矩阵M中每列的第一个非零元素在转置矩阵MT三元组顺序表中的位置:cpot[0]=0cpot[j]=cpot[j-1]+num[j-1]/*j为列号*/类型ElemType、Triple和Matrix定义如下:typedefintElemType;typedefstruct{/*三元组类型*/intr,c;/*矩阵元素的行号、列号*/ElemTypee;/*矩阵元素的值*/}Triple;typedefstruct{/*矩阵的三元组顺序表存储结构*/introws,cols,elements;/*矩阵的行数、列数和非零元素数目*/Tripledata[MAXSIZE];}Matrix;[C函数]intTransposeMatrix(MatrixM){intj,q,t;int*num,*cpot;MatrixMT;/*MT是M的转置矩阵*/num=(int*)malloc(M.cols*sizeof(int));cpot=(int*)malloc(M.cols*sizeof(int));if(!num||!cpot)returnERROR;MT.rows=(1);/*设置转置矩阵MT行数、列数和非零元数目*/MT.cols=(2);MT.elements=M.elements;if(M.elements>0){for(q=0;q
问答题【说明】已知对某载客车辆(Car)进行类建模,如图5-1所示,其中类Engine表示发动机引擎,类Wheel表示车轮,类Body表示车身,类Driver表示司机,类Passenger表示乘客。【C++代码】constint{{U}}(1){{/U}}=7;//定义最多载客数constintMAXWHEELS=5;//定义最多轮胎数classBody{//此处代码省略};//车身类classPassenger{//此处代码省略};//乘客类classWheel{//此处代码省略};//车轮类classDriver{//司机类public:stringname;//表示第几路公交车司机Driver(stringdriverName):name({{U}}(2){{/U}}){}///构造函数};classEngine{//引擎类public:stringengineNo;//引擎编号Engine(stringengineNo){{{U}}(3){{/U}}->engineNo=engineNo;}//构造函数};classCar{//汽车类protected:Engine*engine;Driver*driver;Bodybody;Wheel*wheels[MAX_WHEELS];Passenger*passengers[MAX_PASSENGERS];public:Car(Driver*driver){//构造函数this->driver=driver;engine=newEngine("TX6536型号引擎");for(intindex=0;index<MAXWHEELS;index++){wheels[index]=newWheel();}for(intindex=0;index<MAX_PASSENGERS;index++){passengers[index]=NULL;}}virtual~Car(){//析构函数for(intindex=0;index<MAX_WHEELS;index++)deletewheels[index];delete{{U}}(4){{/U}};}intgetPassengerNumber(){//获取车上乘客数量//此处代码省略}voidgetOnPassenger(Passenger*aPassenger){//乘客上车//此处代码省略}voidrun(){//开车if(driver==NULL){cout<<"司机尚未上车!";return;}//此处代码省略}};voidmain(){Driverdriver("第五路公交车司机");Carcar({{U}}(5){{/U}});Passengerpassengers[MAX_PASSENGERS];for(intindex=0;index<MAXPASSENGERS;index++)//乘客上车处理car.getOnPassenger(&passengers[index]);car.run();}
问答题
问答题[说明]
用链式存储结构实现的栈称为链栈。若链栈元素的数据类型为datatype,以LinkStack记链栈结构,其类型定义为:
typedef struct node
{ datatype data;
stmct node * next;
} StackNode, * LinkStack;
由于栈的主要操作都是在栈顶进行的,因此我们把链表的头部作为栈顶。设top为栈顶指针,即:LinkStack top。
下面各函数的功能说明如下:
(1)LinkStack Init_LinkStack():建立并返回空的链栈;
(2)int Empty_LinkStack(LinkStack top):判断top所指链栈是否空;
(3)LinkStack Push_LinkStack(LinkStacktop,datatypex):将数据x压人top所指链栈的栈顶,返回新栈指针;
(4)LinkStack Pop_LinkStack (LinkStacktop, datatype*x):弹出top所指链栈的栈顶元素x,返回新栈指针。
[函数]
LinkStaek Init_LinkStack( )
{ returnNULL;
int Empty_LinkStack ( LinkStaek top)
if(top = = NULL) return 1;
else return 0;
LinkStaek Push_LinkStaek( LinkStaektop, datatype X)
{ StaekNode *s;
s=malloc (sizeof(StaekNode) );
{{U}}(1) {{/U}}= x;
{{U}}(2) {{/U}}= top;
{{U}} (3) {{/U}};
return top;
}
LinkStaek Pop_LinkStack (LinkStacktop, datatype * x)
{ StaekNode *p;
if(top = = NULL) return NULL;
else{
* x ={{U}} (4) {{/U}};
p = top;
{{U}} (5) {{/U}};
free (p);
return top;
}
}
问答题【程序2.1说明】 求所有满足如下条件的三位数:它除以11得的商等于它各位数字的平方和。例如 550,除以11商为50,50=52+52+02。 【程序2.1】 void main() { int i, j,n,s; for(i=100;i<=999;i++) { n=i; j=n/11; s=0; while({{U}} (1) {{/U}}) { {{U}}(2) {{/U}} n/=10; } if({{U}} (3) {{/U}}) printf("%d/t",i); } } 【程序2.2说明】 本程序输入一字符串,将其中的大写字母改变成小写字母。 【程序2.2】 void main() { int i=0; char s[120]; scanf("%s",s); while({{U}} (4) {{/U}}) { if({{U}} (5) {{/U}}) s[i]=s[i]- 'A'+'a'; i++; } printf("%s/n",s); }
问答题【算法说明】某商务交流中心共有N间客房。每间客房的房间号、房间等级、床位数及占用状态分别存放在数组ROOM、RANK、NBED和STATUS中。房间等级值为1、2或3。房间的状态值为0(空闲)或1(占用)。客房是以房间(不是床位)为单位出租的。程序流程图(见图2-11)所反映的算法是,根据几个散客的要求预订一间空房。程序的输入为:人数M,房间等级要求尺(R=0表示任意等级都可以)。程序的输出为:所有可供选择的房间号。1.【问题】在图2-11所示的程序流程图中,若要某个房间I被选中,则需要满足什么条件?
问答题【算法说明】
某英汉词典文件包含N个记录(N>1),每个记录有两个字段:一个是英文单词,另一个是相应的汉语解释。各个记录按英文单词的词典顺序排列,各英文单词并不重复。
本算法用于维护、更新该英汉词典文件。维护、更新的方法是:首先输入一个英文单词及其汉语解释,然后在该词典中查找输入的英文单词,若找到,则用输入的汉语解释更新原有的解释;若找不到,则需要将输入的英文单词及其汉语解释插入到该词典的适当位置,使各记录仍按英文单词的词典顺序排列。
【算法】
第一步 读入英汉词典文件,并将读入的N个英文单词依次存放在字符串数组ENG中,将相应的汉语解释依次存放在字符串数组CN中。数组元素CN(i)给出了数组元素ENG(i)的解释。
第二步 输入英文单词及其汉语解释,将它们分别存放在字符串变量E和C中。若E为空串或都是空格,则转向第四步。
第三步 根据变量E的值,用二分法在数组ENG中查找。具体步骤如下:
1.1→L,N→H
2.INT((L+H)/2)→K
3.若E=ENG(K),则C→CN(K),转向第二步
若E<ENG(K),则K-1→{{U}} (1) {{/U}};若E>ENG(K),则K+1→{{U}} (2) {{/U}}
4.若H<L则
对I=N,L,-1(始值,终值,增量)循环执行:
ENG(I)→ENG(I+1)
CN(I)→CN(I+1)
然后,将E和C分别存入{{U}} (3) {{/U}}和{{U}} (4) {{/U}},N+1→N最后转向第二步
否则,转向{{U}} (5) {{/U}}
第四步 将数组ENG和CN输出,形成新的英汉词典文件,算法结束。
问答题【说明】
编写程序,生成一个新文本文件,它由一个已知文本文件的所有偶数行组成。要求已知文本文件名和新文本文件名均从键盘输入。请填空完善程序。
【C语言程序】
#include<stdio.h>
main()
{
FILE *oldf,*newf;
char ch,fname[20];
int i;
do{
printf("Enter name of existed text file to be read:");
scanf("%s",fname);
if((oldf=fopen(fname,"r"))==NULL)
printf("File %s can't open!/n",fname);
}while(oldf==NULL);
do{
printf("Enter mane of new text file to be written:");
scanf("%s",fname);
if(({{U}} (1) {{/U}}==NULL)
printf("File %s can't open!/n",fname);
}while({{U}} (2) {{/U}});
i=1;
while(!feof(oldf))
{
while((ch=fgetc(oldf))!={{U}} (3) {{/U}})
{
if(i%2=={{U}} (4) {{/U}})
fputc(ch,newf);
}
fputc('/n',newf);
{{U}} (5) {{/U}};
}
fclose(oldf);
fclose(newf);
}
问答题【说明】有数组A(4,4),把1到16个整数分别按顺序放入A(1,1),…,A(1,4),A(2,1),…,A(2,4),A(3,1),…,A(3,4),A(4,1),…,A(4,4)中,下面的流程图用来获取数据并求出两条对角线元素之积。【流程图】
问答题[说明]
本程序包含的函数及其功能说明如下:
(1)函数first_insert()的功能是在已知链表的首表元之前插入一个指定值的表元;
(2)函数reverse_copy()的功能是按已知链表复制出一个新链表,但新链表的表元链接顺序与
已知链表的表元链接顺序相反;
(3)函数Print_link()用来输出链表中各表元的值;
(4)函数free_link()用来释放链表全部表元空间。
[程序]
#include <stdio. h >
#include <malloe. h >
typodef struct node {
int val;
struct node * next;
} NODE;
void first_insert(NODE * * p,int v)
{ NODE *q = (NODE *) malloe(sizeof(NODE));
q->val = v; q->next = *p; /* 为新表元赋值*/
* p ={{U}} (1) {{/U}}; }
NODE * reverse_copy( NODE * p)
{ NODE * u;
for(u=NULL; p!=NULL; p=p->next) first_insert({{U}} (2) {{/U}});
return u;
}
void printlink(NODE * p )
{ for(;{{U}} (3) {{/U}}) prinff("%d/t", p->val);
printf(" /n");
}
void free_link( NODE * p)
{ NODE * u;
while(p! =NULL) { u=p->next;free(p);{{U}} (4) {{/U}}; }
void main( ) { NODE * link1 , * link2;
int i;
link1 = NULL;
for(i=1; i<= 10; i+ + )first_insert(
link2 = reverse_copy(link1 );
{{U}} (5) {{/U}};
free_link( linkl ) ;free_link(link2); }
问答题【说明】 设串s和串t采用顺序存储结构,编写函数实现串s和串t的比较操作,要求比较结果包括大于、小于和等于3种情况。 【函数】 int StrCompare(SStrType s, SStrType t) int n=s.length, m= (1) , i,j,tag; i=0; j=0; while( (2) ) if( (3) ) i++; j++; else if(s.str[i]>t.str[j]) tag=1; return tag; else tag=-1; return tag; if(n==m) tag=0; else if( (4) ) tag=1; else if(n<m) tag=-1; (5) ;
问答题【说明】
将一正整数序列{K1,K2,…,K9}重新排列成一个新的序列,新序列中,比K1小的数都在K1的前面(左面),比K1大的数都在K1的后面(右面),最后调用writeDat()函数的新序列输出到文件out.dat中。
在程序中已给出了10个序列,每个序列有9个正整数,并存入数组a[10][9]中,分别求出这10个新序列。
例:序列{6,8,9,1,2,5,4,7,3}
经重排后成为{3,4,5,2,1,6,8,9,7}
【函数】
#include < stdio. h >
#include < conio. h >
void jsValue( int a [10] [9] )
{ int i,j,k,n,temp;
int b[9];
for(i=0;i<10;i++)
{ temp=a[i] [0];
k=8;n=0;
for(j=8;j=0;j--)
{ if(temp < a[i] [j]){{U}} (1) {{/U}}=a[i][j];
if(temp >a[i] [j]){{U}} (2) {{/U}}=a[i][j];
if(temp =a[i] [j]){{U}} (3) {{/U}}= temp;
}
for(j=0;j<9;j++) a[i][j] =b[j];
}
}
void main( )
int a[10] [9] = {{6,8,9,1,2,5,4,7,3},{3,5,8,9,1,2,6,4,7},
{8,2,1,9,3,5,4,6,7}, {3,5,1,2,9,8,6,7,4},
{4,7,8,9,1,2,5,3,6}, {4,7,3,5,1,2,6,8,9},
{9,1,3,5,8,6,2,4,7}, {2,6,1,9,8,3,5,7,4},
{5,3,7,9,1,8,2,6,4}, {7,1,3,2,5,8,9,4,6}
};
int i,j;
{{U}} (4) {{/U}};
for(i=0;i<10;i++) {
for(j=0;j<9;j++) {
printf("%d",a[i] [j] );
if({{U}} (5) {{/U}})printf(",");
}
printf(" /n" );
}
getch( );
}
问答题[说明]本程序在3×3方格中填入1到10以内9个互不相等的整数,使所有相邻两个方格内的两个整数之和为质数。程序的输出是全部满足条件的方格。方格的序号如下图所示。程序采用试探法,从序号为0的方格开始,依次为当前方格寻找一个合理的可填整数,并在当前位置正确填入后,为下一方格寻找可填入的合理整数;如不能为当前方格寻找一个合理的可填整数,就要后退到前一方格,调整前一方格的填入整数;当序号为8的方格也填入合理的整数后,就找到了一个解。为检查当前方格所填整数的合理性,程序引入数组CheckMatrix,存放需要进行合理性检查的相邻方格的序号。事实上,CheckMatrix中只要求第i个方格中的数向前兼容,即填写第4个方格时,只检查在它之前、与之相邻的第1,3个方格是否满足和为素数的条件。[程序]#include<stdio.h>intpos,a[9],b[11];/*用于存储方格所填入的整数*/voidwrite(inta[])/*方格输出函数*/{……}intisPrime(intm)/*素数判断函数,若m为素数则返回1,否则返回0*/{……}intselectNum(intstart)/*找到start到10之间尚未使用过的最小的数,若没有则返回0*/{intj;for(j=start;j<=10;j++)if(b[j])returnj;return0;}intcheck()/*检查填入pos位置的整数是否合理*/{inti,jintcheckMatrix[][3]={{-1},{0,-1},{1,-1},{0,-1},{1,3,-1},{2,4,-1},{3,-1},{4,6,-1},{5,7,-1}};for(i=0;(j={{U}}(1){{/U}})>=0;i++)if(!isPrime({{U}}(2){{/U}}))return0;return1;}voidextend()/*为下一方格找一个尚未使用过的整数*/{{{U}}(3){{/U}}=selectNum(1);b[a[pos]]=0;}voidchange()/*为当前方格找下一个尚未使用过的整数,若找不到则回溯*/{intj;while(pos>=0if(pos<0)return;{{U}}(4){{/U}};a[pos]=j;b[j]=0;}voidfind(){intok=1;pos=0;a[pos]=1;b[a[pos]]=0;do{if(ok)if({{U}}(5){{/U}}){write(a);change();}elseextend();elsechange();ok=check(pos);}while(pos>=0);}voidmain(){inti;for(i=1;i<=10;i++)b[i]=1;find();}
问答题【说明】在一个矩阵中,如果其零元素的个数远远多于其非零元素的个数时,称这样的矩阵为稀疏矩阵。稀疏矩阵通常采用三元组数组表示。每个非零元素用一个三元组来表示,即非零元素的行号、列号和它的值。然后按某种顺序将全部非零元素的三元组存于一个数组中。例如,对于以下二维数组:intx[3][4]={{1,0,0,0},{0,5,0,0),{0,0,7,2}};可用以下数组a来表示:inta[][3]={{3,4,4},{0,0,1},{1,1,5),{2,2,7},{2,3,2}};其中三元数组a的第1行元素的值分别存储稀疏矩阵×的行数、列数和非零元素的个数。下面的流程图描述了稀疏矩阵转换的过程。【流程图】
问答题试题六(共15分)阅读以下说明和Java程序,填补代码中的空缺(1)~(6),将解答填入答题纸的对应栏内。[说明]很多依托扑克牌进行的游戏都要先洗牌。下面的Java代码运行时先生成一副扑克牌,洗牌后再按顺序打印每张牌的点数和花色。[java代码]
问答题1说明】
本程序可以打印出如下图形(菱形):
*
***
*****
*******
*****
***
*
【函数2.1】
main()
{
int i,j,k;
for(i=0;i<=3;i++)
{
for(j=0;j<=2-i;j++)
printf(" ");
for({{U}} (1) {{/U}})
printf("*");
printf("/n");
}
for(i=0;i<=2;i++)
{
for({{U}} (2) {{/U}})
printf(" ");
for(k=0;k<=4-2*i;k++)
printf("*");
printf("/n");
}
}
【函数2.2说明】
通过本程序,可以从键盘输入一个字符串,将小写字母全部转换成大写字母,然后输出到一个磁盘文件“CsaiWgm”中保存,输入的字符串以“!”结束。
【函数2.2】
#include "stdio.h"
main()
{
FILE *fp;
char str[100],filename[10];
int i=0;
if((fp=fopen("CsaiWgm","w"))==NULL)
{
printf("cannot open the file/n");
exit(0);
}
printf("please input a string:/n");
gets(str);
while({{U}} (3) {{/U}})
{
if(str[i]>='a'
fputc(str[i],fp);
{{U}}(5) {{/U}};
}
fclose(fp);
fp=fopen("CsaiWgm","r");
fgets(str,stden(str)+1,fp);
printf("%s/n",str);
fclose(fp);
}
问答题[说明]
二叉树的二叉链表存储结构描述如下:
typedef struct BiTNode
{ datatype data;
struct BiTNode *lchild, * rchild; /*左右孩子指针*/
}BiTNode,* BiTree;
对二叉树进行层次遍历时,可设置一个队列结构,遍历从二叉树的根结点开始,首先将根结点指针入队列,然后从队首取出一个元素,执行下面两个操作:
(1) 访问该元素所指结点;
(2) 若该元素所指结点的左、右孩子结点非空,则将该元素所指结点的左孩子指针和右孩子指针顺序入队。
此过程不断进行,当队列为空时,二叉树的层次遍历结束。
下面的函数实现了这一遍历算法,其中Visit(datatype a)函数实现了对结点数据域的访问,数组queue[MAXNODE]用以实现队列的功能,变量front和rear分别表示当前队首元素和队尾元素在数组中的位置。
[函数]
void LevelOrder(BiTree bt) /*层次遍历二叉树bt*/
{ BiTree Queue[MAXNODE];
int front,rear;
if(bt= =NULL)return;
front=-1;
rear=0;
queue[rear]={{U}} (1) {{/U}};
while(front{{U}} (2) {{/U}}){
{{U}}(3) {{/U}};
Visit(queue[front]->data); /*访问队首结点的数据域*/
if(queue[front]—>lchild!:NULL)
{ rear++;
queue[rear]={{U}} (4) {{/U}};
}
if(queue[front]->rchild! =NULL)
{ rear++;
queue[rear]={{U}} (5) {{/U}};
}
}
}
问答题[C语言函数]
bool Del_elem(STACK*s,char para_ch)
{
STACK s_bgk; /*定义临时工作栈s_bak,*/
char ch;
bool tag=FALSE;
{{U}} (1) {{/U}} /*初始化临时工作栈s_bak*/
/*,将栈*s中所有比para_ch更接近栈顶的元素暂时存放在临时工作栈s bak中*/
while(!IsEmpty(*s)){
ch={{U}} (2) {{/U}}; /*取栈顶元素*/
Pop(s);
if(ch=para_ch){
tag=TRUE;
break;
}
{{U}} (3) {{/U}};
}
/*将暂存于临时工作栈s_bak中的元素存回栈*s*/
while({{U}} (4) {{/U}})
ch=Top(s_bak);
{{U}} (5) {{/U}}
Push(s,ch)
}
return tag;
}
问答题阅读以下说明和C代码,填充代码中的空缺,将解答填入答题纸的对应栏内。
[说明1]
下面的函数countChar(char*text)统计字符串text中不同的英文字母数和每个英文字母出现的次数(英文字母不区分大小写)。
[C代码1]
int countChar(char *text)
{
int i,sum=0; /*sum保存不同的英文字母数*/
char *ptr;
int c[26]={0}; /*数组C保存每个英文字母出现的次数*/
/*c[0]己录字母A或a的次数,c[1]记录字母B或b的次数,依此类推*/
ptr=______; /*ptr初始时指向字符串的首字符*/
while (*ptr) {
if (isupper(*ptr) )
c [*ptr-"A"]++;
else
if (islower(*ptr))
c[*ptr-"a"]++;
______; /*指向下一个字符*/
}
for(i=0;i<26; i++)
if(______)sum++;
return sum;
}
[说明2]
将下面C代码2中的空缺补全后运行,使其产生以下输出。
f2:f2:f2:2
f3:f3:1
[C代码2]
#include<stdio.h>
int f1(int(*f)(int));
int f2(int);
int f3(int);
int main()
{
printf("%d\n",f1(______));
printf("%d\n",f1(______));
return 0;
}
int f1(int(*f)(int))
{
int n=0;
/*通过函数指针实现函数调用,以返回值作为循环条件*/
while (______) n++;
return n;
}
int f2(int n)
{
printf("f2:");
return n*n-4;
}
int f3(int n)
{
printf("f3:");
return n-1;
}
问答题试题五阅读以下应用说明及VisualBasic程序代码,将应填入_(n)处的字句写在答题纸的对应栏内。[应用说明5.1]本应用程序的窗体中有一个下拉式列表框(名称为Combo1)和两个文本框(名称分别为Txt1和Txt2)。运行时,用户从Combo1的列表中进行选择,程序就会将选中条目的内容以及编号(从0开始)分别在文本框Txt1和Txt2中显示出来。[程序代码5.1]PrivateSubCombo1_Click()Txt1.Text=Combol.(1)Txt2.Text=Combol.(2)EndSub(注:可供(2)处选择的选项:List,Index,ListIndex,ListCount,Number)[应用说明5.2]本应用程序的运行窗口如下图所示:当用户在输入框(名为TxtIn)中输入数值数据,并从下拉式列表框(名为CmbOp)中选择所需的运算后,输出框(名为TxtOut)中就会显示运算的结果。用户单击“清除”按钮(名为CmdClear)后,输入框和输出框都清空。开发该应用的部分程序代码如下:[程序代码5.2]PrivateSubCmbOp_Click()DimDataInAsDouble,DataOutasDoubleDataIn=(3)SelectCase(4)Case"取整数部分"DataOut=Int(DataIn)Case"求平方根"IfDataIn<0ThenMsgBox$("负数不能开平方!")ElseDataOut=Sqr(DataIn)EndIfCase"取绝对值"DataOut=Abs(DataIn)(5)TxtOut.Text=str$(DataOut)EndSub
