阅读以下说明和C语言函数,将应填入(n)处的语句写在对应栏内。
【说明】
下面的程序构造一棵以二叉链表为存储结构的二叉树。
【函数】
BitTree *createbt(BitTree *bt)
{
BitTree *q;
struct node *s[30];
int j,i;
char x;
printf("i,x=");
scant("%d,%c",&i,&x);
while(i!=0 && x!='$')
{
q=(BitTree *}malloc(sizeof(BitTree));//生成一个结点
(1);
q->lchild=NULL;
q->rchild=NULL;
(2) ;
if ((3))
{
j=i/2; // j为i的双亲结点
if(i%2==0)
(4); //i为j的左孩子
else
(5); //i为j的右孩子
}
printf("i,x=");
scanf("%d,%c",&i,&x);
}
return s[i];
}
第1题
阅读以下说明和C语言程序,将应填入(n)处的字句写在对应栏内。
【说明】
魔方阵,又叫幻方,在我国古代称为“纵横图”。由1…N2共N2个自然数构成每行、每列及两对角线上各数之和都相等的N×N方阵,这样的方阵就叫做N阶魔方阵。顾名思义,奇阶魔方阵就是N为奇数的幻方。
奇数阶魔方阵的生成方法如下:
(1)第一个位置在第一行正中。
(2)新位置应当处于最近一个插入位置右上方,但如果右上方位置已超出方阵上边界,则新位置取应选列的最下一个位置;如果超出右边界,则新位置取应选行的最左一个位置。
(3)若最近一个插入元素为N的整数倍,则选下面一行同列上的位置为新位置。本题要求输入一个数据n,然后打印由自然数1到n2的自然数构成的魔方阵(n为奇数)。例如,当n=3时,魔方阵为:
8 1 6
3 5 7
4 9 2
了解其生成方法后,就可以根据此方法来写出程序了。首先设置int变量i,j,m, n。其中i标记魔方阵的行;j标记魔方阵的列;n表示魔方阵的维数,通过输入得到;通过m递加得到插入的数据。数组a[MAX][MAX]用于存放魔方阵元素。这里预定义了 MAX的大小,没有采用动态分配,在此设置为15,即最大求得15×15阶魔方阵。
【程序】
include <stdio.h>
define MAX 15
void main()
{
int n;
int m=1;
int i,j;
int a[MAX][MAX];
printf("Please input the rank of matrix:");
scanf("%d",&n);
i=0;
(1)
while((2))
a[i][j]=m;
m++;
i--;
j++;
if((m-1)%n==0 && m>1)
{
(3)
j=j-1;
}
if(j>(n-1)) //超出上界
(4)
if(j>(n-1))
(5)
}
for(i=0;i<n;i++) //输出魔方阵
for(j=0;j<n;j++)
{
if(a[i][j]/10==0)
printf("%d ",a[i][j]); //对程序无影响,只是使输出的数每一列对齐
else
printf("%d ",a[i][j]);
if(j==(n-1))
printf("\n");
}
}
第2题
阅读以下说明和C语言函数,将应填入(n)处的语句写在对应栏内。
【说明】
本程序从正文文件text.in中读入一篇英文短文,统计该短文中不同单词及出现次数,并按词典编辑顺序将单词及出现次数输出到正文文件word.out中。
程序用一棵有序二叉树存储这些单词及其出现的次数,边读入边建立,然后中序遍历该二叉树,将遍历经过的二叉树上的结点内容输出。
【函数】
include <stdio.h>
include <malloc.h>
include <ctype.h>
include <string.h>
define INF "text.in"
define OUTF "word.our'
typedef struct treenode {
char *word;
int count;
struct treenode *left, *right;
} BNODE;
int getword(FILE *fpt, char *word)
{ char c;
c=fgetc(tpt);
if (c==EOF)
return 0;
while(!(tolower(c)>= 'a' && tolower(c)<= 'z'))
{ c=fgetc(fpt);
if (c==EOF)
return 0;
} /* 跳过单词间的所有非字母字符 */
while(tolower(c)>= 'a' && tolower(c)<= 'z')
{ *word++=c;
c=fgetc(fpt);
}
*word='\0';
return 1;
}
void binary_tree(BNODE **t, char *word)
{ BNODE *ptr, *p; int compres;
p=NULL;
(1);
while (ptr) /* 寻找插入位置 */
{ compres=strcmp(word, ptr->word);/* 保存当前比较结果 */
if (!compres)
{ (2); return;}
else
{ p=ptr;
ptr=compres>0 ? ptr->right: ptr->left;
}
}
ptr=(BNODE *)malloc(sizeof(BNODE));
ptr->left=ptr->right=NULL;
ptr->word=(char *)malloc(strlen(word)+1);
strcpy(ptr->word, word);
(3);
if (p==NULL)
*t=ptr;
else if (compres>0)
p->right=ptr;
else
p->left=ptr;
}
void midorder(FILE *fpt, BNODE *t)
{ if (t==NULL)
return;
midorder(fpt,(4));
fprintf(fpt, "%s %d\n", t->word, t->count);
midorder(fpt, t->right);
}
void main()
{ FILE *fpt; char word[40];
BNODE *root=NULL;
if ((fpt=fopen(INF, "r"))==NULL)
{ printf("Can't open file %s\n", INF);
return;
}
while(getword(fpt, word)==1)
binary_tree((5));
fclose(fpt);
fpt=fopen(OUTF, "w");
if (fpt==NULL)
{ printf("Can't open fife %s\n", OUTF);
return;
}
midorder(fpt, root);
fclose(fpt);
}
第3题
阅读以下函数说明和C语言函数,将应填入(n)处的语句写在对应栏内。
【函数2.1说明】
将一个正整数分解质因数。例如:输入90,打印出90=2*3*3*5。
【函数2.1】
Fun1 (int n)
{
int i;
for(i=2;i<=n;i++)
{
while ((1))
{
if (n%i==0)
{
printf("%d*",i);
(2);
}
else
break;
}
}
printf("%d",\n);
}
【函数2.2说明】
下面程序的功能是:海滩上有一堆桃子,5只猴子来分。第1只猴子把这堆桃子平均分为5份,多了一个,这只猴子把多的一个扔入海中,拿走了一份。第2只猴子把剩下的桃子又平均分成5份,又多了一个,它同样把多的一个扔入海中,拿走了一份。第 3、4、5只猴子都是这样做的,问海滩上原来最少有多少个猴子?
【函数2.2】
main()
{
int i,m,j,k,count;
for(i=4;i<10000;i+=4)
{
count=0;
(3);
for(k=0;k<5;k++)
{
(4);
i=j;
if(j%4==0)
(5);
else
break;
}
i=m;
if(count==4)
{
printf("%d\n",count);
break;
}
}
}
第4题
阅读下列说明和C++代码,请回答问题1至问题3。
【说明】
已知下列程序运行时的输出应为:
1:1
1:1
1:1
【C++程序】
01 include <iostream>
02 using namespace std;
03 class Stock{
04 protect:
05 (1) {};
06 Stock(iht n, int pr=1){
07 shares = n; share_val=pr;
08 };
09 void~Stock(){};
10 public:
11 //成员函数
12 void output(){
13 (2) << 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。
第5题
阅读以下说明和C程序,将应填入(n)处的字句写在对应栏内。
【说明】
下面的程序用DoleRob算法生成N阶(N为奇数)魔方阵(各行、列、对角线数字之和相等)。该算法的过程为:从1开始,按如下方法依次插入各自然数,直到N2为止。
a.在第一行的正中插入1。
b.新位置应当处于最近插入位置的右上方,若该位置已超出方阵的上边界,则新位置取应选列的最下一个位置;若超出右边界,则新位置取应选行的最左一个位置。
c.若最近插入的元素是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",&n);
if (!(n % 2)||n < 1 ||(1)) {
printf("输入数据有误!\n"); exit(0);
}
row=1; col = (n+1)/2; value=1;
while(value< =(2)) {
a[row][col] = value;
/*计算下一位置*/
if(value%n !=0){
row--; (3);
if(row<1) row=n;
if(col>n)(4);
}
else row++;
value =(5);
}
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");
}
}
第6题
阅读以下说明及Visual Basic程序代码,将应填入(n)处的字句写在答题纸的对应栏内。
【说明】
甲乙两地之间的铁路线上有二十多个火车站,为方便乘客查询票价,特开发了火车票价查询程序,其运行窗口如下图所示。乘客只要通过
两个下拉列表框分别选择起点与终点站名,再单击“查询”按钮,则票价文本框中就会显示相应的票价。
在开发过程中,设选择起点和终点站名的组合框(ComboBox)名分别为ST和SP,显示票价的文本框(TextBox)名为Price,“查询”按钮
(CommandButton)名为Query;设ST与SP中的诸列表项完全相同,且都是从甲地开始依次排列,从第i站到第j站的票价存放在二维对称矩阵P的元
素P(i,j)中。假设从甲地到第i站行驶的距离存放在 d(i)中,火车票价等于其行驶距离乘以C(常数)。
【Visual Basic代码】
Dim p(30,30) As Single '通用声明
Const C=0.2
Private Sub Form_Load()
Dim d (30) As Single
(1)="甲地" '在ST组合框中设置首个列表项
… '在ST和SP中设置其他列表项(若干行语句)
… '对数组d(i)赋值(若干行语句)
For i=0 to ST. (2) -1 '对ST中各列表项循环
For j=0 to SP. (2) -1 '对SP中各列表项循环(这两处填写内容相同)
P (i,j)=(3)
Next j
Next i
End Sub
Private Sub query_Click()
i=(4) '组合框ST中选择的当前项编号
j=… '组合框SP中选择的当前项编号(语句略)
(5)=str$ ( p (i,j))
End Sub
第7题
阅读以下说明和C语言函数,将应填入(n)处的字句写在答题纸的对应栏内。
【说明】
一棵非空二叉树中“最左下”结点定义为:若树根的左子树为空,则树根为“最左下”结点;否则,从树根的左子树根出发,沿结点的左
子树分支向下查找,直到某个结点不存在左子树时为止,该结点即为此二叉树的“最左下”结点。例如,下图所示的以 A为根的二叉树的“最
左下”结点为D,以C为根的子二叉树中的“最左下”结点为C。
二叉树的结点类型定义如下:
typedef stmct BSTNode{
int data;
struct BSTNode*lch,*rch;//结点的左、右子树指针
}*BSTree;
函数BSTree Find Del(BSTree root)的功能是:若root指向一棵二叉树的根结点,则找出该结点的右子树上的“最左下”结点*p,并从
树于删除以*p为根的子树,函数返回被删除子树的根结点指针;若该树根的右子树上不存在“最左下”结点,则返回空指针。
【函数】
BSTrce Find_Del(BSTreeroot)
{ BSTreep,pre;
if ( !root ) return NULL; /*root指向的二叉树为空树*/
(1); /*令p指向根结点的右子树*/
if ( !p ) return NULL;
(2); /*设置pre的初值*/
while(p->lch){ /*查找“最左下”结点*/
pre=p;p=(3);
}
if ((4)==root) /*root的右子树根为“最左下”结点*/
pre->rch=NULL;
else
(5)=NULL; /*删除以“最左下”结点为根的子树*/
reurn p;
}
第8题
阅读以下说明及Visual Basic程序代码,将应填入(n)处的字句写在答题纸的对应栏内。
【说明】
某个文本文件中存放了若干个非零数值有效数据,每个数据占一行,最后一行以数字“0”作为结束标志。下面的程序用于计算该文件中这
些数据之和,其运行窗口如下。
用户只要通过驱动器列表框、目录列表框和文件列表框,选择文本文件所在的驱动器、文件夹及相应的文件名,再单击“累计”按钮,就
能在“总计”文本框中看到该文本文件中的数据之和。
在开发过程中,设驱动器列表框名为Drivel,目录列表框名为Dirl,文件列表框名为Filel,存放数据的文本文件名为D:\test\vb7\datA
.txt,“累计”按钮名为sum,“总计”文本框(TextBox)名为textl。
【Visual Basic代码】
Private Sub Drivel_Change()
Dirl.Path=(1) '户选择的驱动器反映到目录列表框中
End Sub
Private Sub Dirl_Change()
Filel.Path=(2) '用户选择的文件夹改变文件列表框内容
End Sub
Private Sub sum_Click()
Dim (3) As New FileSystemOject, (4) As TextStxeam
'创建自己的文件系统对象,说明自己的文本流对象
If Right (Dirl.Path,1)="\"Then
SetmyTextFile=fso.OpenTextFile (Dirl.Path+Filel.FileNamc)
Else
SetmyTextFile=fso.OpenTextFile(Dirl.Path+”\’+Filel.FileName)
End“
S=0
Do
d=Val (myTextFilE.ReadRow)
S=S+d
Loop While (5)
Textl.Text=Str$(S)
End Sub
第9题
阅读以下说明和C语言函数,将应填入(n)处的字句写在答题纸的对应栏内。
【说明】
假设一个剧场有N*N个座位,顾客买票时可以提出任意有效的座号请求。下面用二维数组a[N][N]模拟剧场中的座位,a[i][j]圆等于0表示
第i排第j列(0≤i,j≤N-1)的票尚未售出。
函数int Find(int a[][N],int R,int*row,int*col)的功能是:在部分票已售出的情况下,找出剧场中的R*R个空座位,要求这些座位
的排列形成一个正方形。若找到满足要求的一个座位排列,则函数返回1,并算出该正方形左上角的行、列号;若未找到,则返回0。
例如,一个7X7个座位的剧场如下图(a)所示,已售出部分座位的剧场如下图(b)所示,图中阴影部分表示已售出的座位,从下图(b)中找出
的3X3正方形空座位如下图(c)中斜线区所示。
【函数】
int Find(int a[][N] int R,int*row,iht*col)
{int i,j,k,c,t;int FOUND=0;
for(i=0;!FOUND&&i<N-R+1;i++) { /*从第0排开始查找*/
(1);
while (j<N-R+1&&!FOUND) {
for (k=0;(2)&&a[i][j+k]==0;k++); /*查找第i排连续的R个空座位*/
if (k>=R) { /*找到第i排连续的R个空座位*/
for (c=0;c<R;c++) { /*查找其余的R*(R-1)个座位*/
for (t=1;t<R;t++)
if (a[(3)][j+c]!=0) break;
if (t<R) break;
}/*for*/
if ((4)) FOUND=1;
}/*if*/
(5;
}/*while*/
}/*fori*/
if (FOUND) {
*row=i-1; *col=j-1; /*计算正方形区域的左上角坐标*/
return 1;
}
return 0;
}
第10题
阅读以下说明和算法,完善算法并回答问题,将解答写在对应栏内。
[说明]
假设以二维数组G[1..m,1..n]表示一幅图像各像素的颜色,则G[i,j]表示区域中点(i,j]处的颜色,颜色值为0到k的整数。
下面的算法将指定点(i0,j0)所在的同色邻接区域的颜色置换为给定的颜色值。约定所有与点(i0,j0)同色的上、下、左、右可连通的点组成同色邻接区域。
例如,一幅8×9像素的图像如图1-1所示。设用户指定点(3,5),其颜色值为0,此时其上方(2,5)、下方(4,5)、右方(3,6)邻接点的颜色值都为0,因此这些点属于点(3,5)所在的同色邻接区域,再从上、下、左、右四个方向进行扩展,可得出该同色邻接区域的其他点(见图1-1中的阴影部分)。将上述同色区域的颜色替换为颜色值7所得的新图像如图1-2所示。
[算法]
输入:矩阵G,点的坐标(i0,j0),新颜色值newcolor。
输出:点(i0,j0)所在同色邻接区域的颜色置换为newcolor之后的矩阵G。
算法步骤(为规范算法,规定该算法只在第七步后结束):
第一步:若点(i0,j0)的颜色值与新颜色值newcolor相同,则(1);
第二步:点(i0,j0)的颜色值→oldcolor;创建栈S,并将点坐标(i0,j0)入栈;
第三步:若(2),则转第七步;
第四步:栈顶元素出栈→(x,y),并(3);
第五步:
1) 若点(x,y-1)在图像中且G[x,y-1]等于oldcolor,则(x,y-1)入栈S;
2) 若点(x,y+1)在图像中且G[x,y+1]等于oldcolor,则(x,y+1)入栈S;
3) 若点(x-1,y)在图像中且G[x-1,y]等于oldcolor,则(x-1,y)入栈S;
4) 若点(x+1,y)在图像中且G[x+1,y)等于oldcolor,则(x+1,y)入栈S:
第六步:转(4);
第七步:算法结束。
[问题]
是否可以将算法中的栈换成队列?回答:(5)。
为了保护您的账号安全,请在“上学吧”公众号进行验证,点击“官网服务”-“账号验证”后输入验证码“”完成验证,验证成功后方可继续查看答案!