首页 > 通信工程师
题目内容 (请给出正确答案)
[主观题]

分别用字符数组和字符指针作函数参数两种方法编程实现在字符串每个字符间插入一个空格的功能。

查看答案
答案
收藏
如果结果不匹配,请 联系老师 获取答案
您可能会需要:
您的账号:,可能还需要:
您的账号:
发送账号密码至手机
发送
安装优题宝APP,拍照搜题省时又省心!
更多“分别用字符数组和字符指针作函数参数两种方法编程实现在字符串每…”相关的问题
第1题
试题四(共 15 分) 阅读以下说明和 C 函数,将应填入 (n) 处的字句写在答题纸的对应栏内。 [说明]

试题四(共 15 分)

阅读以下说明和 C 函数,将应填入 (n) 处的字句写在答题纸的对应栏内。

[说明]

计算机在处理算术表达式时,首先将其转换为后缀表达式。例如,表达式

“46+5*(120-37)”的后缀表达式形式为“46 5 120 37 - * +” 。

计算后缀表达式时,从左至右扫描后缀表达式:若遇到运算对象,则压入栈中;遇到运算符,则从栈中弹出相关运算对象进行计算,并将运算结果压入栈中,重复以上过程,直到后缀表达式扫描结束。例如,后缀表达式“46 5 120 37 - * +”的计算过程为:

a. 依次将 46、5、120、37 压入栈中;

b. 遇到“-”,取出 37、120,计算 120–37,得 83,将其压入栈中;

c. 遇到“*”,取出 83、5,计算 5*83,得 415,将其压入栈中;

d. 遇到“+”,取出 415、46,计算 46+415,得 461,将其压入栈中;

e. 表达式结束,则计算过程完成。

函数 computing(char expr[],int *result)的功能是基于栈计算后缀形式的表达式(以串形式存入字符数组 expr)的值,并通过参数 result 返回该值。函数的返回值为-1/0 分别表示表达式有/无错误。假设表达式中仅包含数字、空格和算术运算符号,其中所有项均以空格分隔,且运算符仅包含加(“+”)、减(“-”)、乘(“*”)、除(“\”)。

函数 computing 中所用栈的基本操作的函数原型说明如下:

void InitStack(STACK *s):初始化栈。

void Push(STACK *s, int e): 将一个整数压栈,栈中元素数目增 1。

void Pop(STACK *s):栈顶元素出栈,栈中元素数目减 1。

int Top(STACK s):返回非空栈的栈顶元素值,栈中元素数目不变。

int IsEmpty(STACK s):若s 是空栈,则返回1 否则返回 0。

[C 函数]

int computing(char expr[], int *result)

{

STACK s; int tnum, a,b; char *ptr;

InitStack(&s);

ptr = expr; /*字符指针指向后缀表达式串的第一个字符*/

while (*ptr!='\0') {

if (*ptr==' ') { /*当前字符是空格*/

(1) ; /*字符指针指向下一字符*/

continue;

}

else

if (isdigit(*ptr)) {

/*当前字符是数字,则将该数字开始的数字串转换为数值*/

tnum = (2) ;

while (*ptr>=’0’ && *ptr <=’9’) {

tnum = tnum * 10 + (3) ;

ptr++;

}

Push((4) );

}

else /*当前字符是运算符或其他符号*/

if (*ptr=='+'||*ptr=='-'||*ptr =='*'||*ptr =='/'){

if (!IsEmpty(s)) {

a = Top(s); Pop(&s); /*取运算符的第二个运算数*/

if (!IsEmpty(s)) {

b = Top(s); Pop(&s); /*取运算符的第一个运算数*/

}

else return -1;

}

else return -1;

switch (*ptr) {

case '+': Push(&s,b+a); break;

case '-': Push(&s,b-a); break;

case '*': Push(&s,b*a); break;

case '/': Push(&s,b/a); break;

}

}

else

return -1;

ptr++; /*字符指针指向下一字符*/

} /* while */

if (IsEmpty(s)) return -1;

else {

(5) = Top(s); Pop(&s); /*取运算结果*/

if (!IsEmpty(s)) return -1;

return 0;

}

}

点击查看答案
第2题
下面关于数组的描述错误的是

A.在C++语言中数组的名字就是指向该数组第一个元素的指针

B.长度为n的数组,下标的范围是0~n-1

C.数组的大小必须在编译时确定

D.数组只能通过值参数和引用参数两种方式传递给函数

点击查看答案
第3题
字符数组和字符指针的使用方法完全相同。()
点击查看答案
第4题
以下涉及字符串数组、字符指针的程序段,没有编译错误的是

点击查看答案
第5题
阅读以下函数说明和C语言函数,将应填入(n)处的字句写在对应栏内。 [说明1] 函数void fun(char*w

阅读以下函数说明和C语言函数,将应填入(n)处的字句写在对应栏内。

[说明1]

函数void fun(char*w,char x,int*n)用来在w数组中插入x,w数组中的数已按由小到大顺序存放,n指存储单元中存放数组中数据的个数,插入后数组中的数仍有序。

[C函数1]

void fun(char*W,char x,int*n)

{ int i,P;

p=0;

w[*n]=x;

while(x>w[p]) (1) ;

for(i=*n,i>p;i--)w[i]=(2);

w[p]=x;

++*n;

}

[说明2]

函数void revstr(char*s)将字符串s逆置。例如:字符串“abcde”,经过逆置后变为“edcba”。

[C函数2]

void revstr(char*s)

{ char*p,c;

if(s==NULL)return;

p=(3); /*p指向字符串s的最后一个有效字符*/

while(s<p){ /*交换并移动指针*/

C=*s;

(4)=*p;

(5)=c;

}

}

点击查看答案
第6题
若有语句:char *line[5];,以下叙述中正确的是

A.定义line是一个数组,每个数组元素是一个基类型为char为指针变量

B.定义line是一个指针变量,该变量可以指向一个长度为5的字符型数组

C.定义line是一个指针数组,语句中的*号称为间址运算符

D.定义line是一个指向字符型函数的指针

点击查看答案
第7题
若有语句:Char * line[5];,以下叙述中正确的是()。 A.定义line是一个数组,每个数组元素是一个基

若有语句:Char * line[5];,以下叙述中正确的是()。

A.定义line是一个数组,每个数组元素是一个基类型为Char的指针变量

B.定义line是一个指针变量,该变量可以指向一个长度为5的字符型数组

C.定义line是一个指针数组,语句中的*号称为间址运算符

D.定义line是一个指向字符型函数的指针

点击查看答案
第8题
若有语句:char*line[5];,以下叙述中正确的是()。

A.定义line是一个数组,每个数组元素是一个基类型为char的指针变量

B.定义line是一个指针变量,该变量可以指向一个长度为5的字符型数组

C.定义line是一个指针数组,语句中的*号称为间址运算符

D.定义line是一个指向字符型函数的指针

点击查看答案
第9题
以下四种说法中,正确的一项是()A.C++允许在字符串上进行整体操作B.语句: char vn[]="Brown": 将v

以下四种说法中,正确的一项是()

A.C++允许在字符串上进行整体操作

B.语句: char vn[]="Brown": 将vn定义成一个有5个元素的数组,因为"Brown"中含有5个字符

C.对指针只要赋给一个地址值就可以了

D.一维的指针数组实际上是一个二维数组

点击查看答案
第10题
以下程序打开新文件f.txt,并调用字符输出函数将a数组中的字符写入其中,请填空。include<stdio.

以下程序打开新文件f.txt,并调用字符输出函数将a数组中的字符写入其中,请填空。

include<stdio.h>

main()

{________*fp;

char a[5]=(’1’,’2’,’3’,’4’,’5’),i;

fp=fopen(”f.txt”,”w”);

for(i=0;i<5;i++)fputc(a[i],fp);

fclose(fp);

}

点击查看答案
第11题
阅读以下预备知识、函数说明和C代码,将应填入(n)处的字句写在答题纸的对应栏内。 【预备

阅读以下预备知识、函数说明和C代码,将应填入(n)处的字句写在答题纸的对应栏内。

【预备知识】

①对给定的字符集合及相应的权值,采用哈夫曼算法构造最优二叉树,并用结构数组存储最优二叉树。例如,给定字符集合{a,b,c,d}及其权值2、7、4、5,可构造如图3所示的最优二叉树和相应的结构数组Ht(数组元素Ht[0]不用)(见表5)。

图3最优二叉树

表5 结构数组Ht

结构数组Ht的类型定义如下:

define MAXLEAFNUM 20

struct node{

char ch;/*当前结点表示的字符,对于非叶子结点,此域不用*/

int weight;/*当前结点的权值*/

int parent;/*当前结点的父结点的下标,为0时表示无父结点*/

int lchild,rchild;

/*当前结点的左、右孩子结点的下标,为0时表示无对应的孩子结点*/

}Ht[2*MAXLEAFNUM];

②用′0′或′1′标识最优二叉树中分支的规则是:从一个结点进入其左(右)孩子结点,就用′0′(′1′)标识该分支(示例如图3所示)。

③若用上述规则标识最优二叉树的每条分支后,从根结点开始到叶子结点为止,按经过分支的次序,将相应标识依次排列,可得到由′0′、′1′组成的一个序列,称此序列为该叶子结点的前缀编码。例如图3所示的叶子结点a、b、c、d的前缀编码分别是110、0、111、10。

【函数5.1说明】

函数void LeafCode(int root,int n)的功能是:采用非递归方法,遍历最优二叉树的全部叶子结点,为所有的叶子结点构造前缀编码。其中形参root为最优二叉树的根结点下标;形参n为叶子结点个数。

在构造过程中 ,将Ht[p].weight域用作被遍历结点的遍历状态标志。

【函数5.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(He[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结束*/

}

【函数5.2说明】

函数void Decode(char*buff,int root)的功能是:将前缀编码序列翻译成叶子结点的字符序列并输出。其中形参root为最优二叉树的根结点下标;形参buff指向前缀编码序列。

【函数5.2】

void Decode(char*buff,int root)

{ int pre=root,p;

while(*buff!=′\0′){

p=root;

while(p!=0){/*存在下标为p的结点*/

pre=p;

if((4) )p=Ht[p].lchild;/*进入左子树*/

else p=Ht[p].rchild;/*进入右子树*/

buff++;/*指向前缀编码序列的下一个字符*/

(5) ;

printf(″%c″,Ht[pre].ch);

}

}

点击查看答案
退出 登录/注册
发送账号至手机
密码将被重置
获取验证码
发送
温馨提示
该问题答案仅针对搜题卡用户开放,请点击购买搜题卡。
马上购买搜题卡
我已购买搜题卡, 登录账号 继续查看答案
重置密码
确认修改