计算机软件技术基础习题一解答

计算机软件技术基础习题一解答
计算机软件技术基础习题一解答

∑∑∑

====n 1i n 1j 3n

1

k n 16

2)

1)(n n(n 21)n(n 2161)1)(2n n(n 21 i 21i 2121)i(i j 1n

1i n

1i n 1i 2n

1i i

1j n 1i i 1j j

1k ++=

++++=

=+=??? ??+==∑∑∑∑∑∑∑∑========习题解答

3.设n 为正整数, 分析下列各程序段中加下划线的语句的执行次数。 (1) for (int i = 1; i <= n; i++)

for (int j = 1; j <= n; j++) { c[i][j] = ;

for (int k = 1; k <= n; k++)

c[i][j] = c[i][j] + a[i][k] * b[k][j]; }

(2) x = 0; y = 0;

for (int i = 1; i <= n; i++) for (int j = 1; j <= i; j++) for (int k = 1; k <= j; k++) x = x + y; (3) int i = 1, j = 1; while (i<=n && j<=n) {

i = i + 1; j = j + i; } (4)* int i =1; do{

for (int j = 1; j <= n; j++) i = i + j; }while(i<100 + n); 【解答】

(1) (2)

(3)i = 1时,i = 2,j = j + i = 1 + 2 = 2 + 1,

i = 2时,i = 3,j = j + i = ( 2 + 1 ) + 3 = 3 + 1 + 2,

i = 3时,i = 4,j = j + i = ( 3 + 1 + 2 ) + 4 = 4 + 1 + 2 + 3,

i = 4时,i = 5,j = j + i = ( 4 + 1 + 2 + 3 ) + 5 = 5 + 1 + 2 + 3 + 4, ……

i = k 时,i = k + 1,j = j + i = ( k + 1 ) + ( 1 + 2 + 3 + 4 + … + k ),

解出满足上述不等式的k 值,即为语句i = i + 1的程序步数。

()()()n

2

3

3k k 21k k 1k n

i 1k j 2k

1

i ≤++=+++∴≤++=∑=Θ

(4) for 语句每执行一次,语句i=i+j 将执行n 次,而i 的值会增加(1)

2

n n + 因此,当for 语句执行k 次后,i 的值将变为

(1)

12

n n k

++ 故最终for 语句的执行次数k 为满足

(1)

11002

n n k

n ++≥+ 的最小整数k ,语句i = i + j 的程序步数为n*k 。

4.试编写一个函数计算n!*2n

的值,结果存放于数组A[arraySize]的第n 个数组元素中,0 n arraySize 。若设计算机中允许的整数的最大值为maxInt ,则当n>arraySize 或者对

于某一个k (0 k n),使得k!*2k

> maxInt 时,应按出错处理。可有如下三种不同的出错处理方式:

(1) 用printf 显示错误信息及exit(1)语句来终止执行并报告错误;

(2) 用返回整数函数值0, 1来实现算法,以区别是正常返回还是错误返回;

(3) 在函数的参数表设置一个引用型的整型变量来区别是正常返回还是某种错误返回。 试讨论这三种方法各自的优缺点,并以你认为是最好的方式实现它。 【解答】 #include <>

const int arraySize = 100; const int MaxInt = 0x7fffffff; int calc( int T[ ], int n ) { int i, value = 1;T[0]=1; if ( n != 0 ) {

int edge = MaxInt / n / 2; for ( i = 1; i < n; i++ ) { value *= i*2;

T[i] = value;

if ( value > edge ) return 0; }

value *= n * 2; }

T[n] = value;

printf("A[ %d ]= %d\n”,n,T[n]); return 1; }

void main ( ) {

int A[arraySize]; int i;

for ( i = 0; i < arraySize; i++ ) if ( !calc ( A, i ) ) {

printf("failed at %d .\n", i ); break;

} }

/*---------顺序表结构的定义.为简化起见,表元素我们使用整型数据----------- -----------数据元素从data[0]处开始存储---------------------------------*/ typedef struct /*注意typedef 的使用*/ {

int data[MAXSIZE]; /*数据域*/ int length; /*表长*/ }listtype;

5.设有一个线性表 (a 0, a 1, …, a n-2, a n-1) 存放在一个一维数组A[arraySize]中的前n 个数组元素位置。请编写一个函数将这个线性表原地逆置,即将数组的前n 个原址内容置换为 (a n-1, a n-2, …, a 1, a 0)。最后分析此算法的时间复杂度及空间复杂度。 【解答】

void inverse (listtype * A) { int tmp;

int n= A->length;

for( int i = 0; i <= ( n-1 ) / 2; i++ ){ tmp = A->data[i]; A->data[i] = A->data[n-i-1]; A->data[n-i-1] = tmp; } }

时间复杂度:需进行n/2次循环,因此时间复杂度为O(n);

空间复杂度:使用一个整形辅助存储单元tmp ,因此空间复杂度为O(1)。

6.顺序表的插入和删除要求仍然保持各个元素原来的次序。设在等概率情形下, 对有127个元素的顺序表进行插入, 平均需要移动多少个元素? 删除一个元素, 又平均需要移动多少个元素?

【解答】

若设顺序表中已有n 个元素。又设插入或删除表中各个元素的概率相等,则在插入时因有n+1个插入位置(可以在表中最后一个表项后面追加),每个元素位置插入的概率为1/(n+1),但在删除时只能在已有n 个表项范围内删除,所以每个元素位置删除的概率为1/n 。 插入时平均移动元素个数AMN(Averagy Moving Number )为

()5.632n 21)n(n 1n 1)01)1n (n (1n 1i n 1n 1

AMN n

0i ==++=+++-++=-+=∑=Λ

删除时平均移动元素个数AMN 为

6321

n 21)n (n n 10)12)(n 1)((n n 11)i (n n 1AMN 1n 0i =-=-=+++-+-=--=∑-=Λ

7.利用顺序表的操作,实现以下的函数。并分析你所编制的函数的时间复杂度,并分析(2)与(3)的时间复杂度出现差异的原因。

(1) 从顺序表中删除具有给定值x 的所有元素。

(2) 从顺序表中删除其值在给定值s 与t 之间(要求s 小于t )的所有元素。

(3) 从有序顺序表中删除其值在给定值s与t之间(要求s小于t)的所有元素。

(4) 将两个有序顺序表la,lb合并成一个新的有序顺序表lc。

(5) 从顺序表中删除所有其值重复的元素,使表中所有元素的值均不相同。

【解答】

(1) 从顺序表中删除具有给定值x的所有元素。

void DelValue(listtype * L, int x ){

int i = 0, j;

while ( i < L->length ) /*循环, 寻找具有值x的元素并删除它*/

if (L->data[i] == x ) { /*删除具有值x的元素, 后续元素前移*/ for (j = i;j < L->length-1; j++ ) L->data[j] = L->data[j+1];

L-length--; /*表长减1*/

}

else i++;

}

(2) 实现删除其值在给定值s与t之间(要求s小于t)的所有元素的函数如下:void DelValue_s_to_t (listtype *L,int s, int t){

int i,j;

if ( L->length == 0 || s >= t ) {

printf(“List is empty or parameters are illegal!\n”); exit(1); }

i = 0;

while ( i < L->length) /*循环, 寻找具有值x的元素并删除它*/ if (L->data[i]>=s &&L->data[i]<= t){

/*删除满足条件的元素, 后续元素前移*/ for ( j = i; j < L->length-1; j++ ) L->data[j] = L->data[j+1];

L->length--; /*表长减1*/

}

else i++;

}

(3) 实现从有序顺序表中删除其值在给定值s与t之间的所有元素的函数如下:

void DelValue_s_to_t_1 (listtype *L,int s int t){

int i,j,k;

if ( L->length == 0 || s >= t ){

printf(“List is empty or parameters are illegal!\n”); exit(1); } for (i = 0; i < L->length; i++ ) /*循环, 寻找值≥s 的第一个元素*/ if ( L->data[i] >= s ) break; /*退出循环时, i指向该元素*/ if ( i < L->length ) {

for (j = 1; i + j < L->length; j++ )/*循环, 寻找值 > t 的第一个元素*/

if (L->data[i+j] > t ) break; /*退出循环时, i+j指向该元素*/

for (k = i+j; k < L->length; k++ ) /*删除满足条件的元素, 后续元素前移*/ L->data[k-j] = L->data[k];

L->length-= j; /*表长减j*/

}

}

(4) 实现将两个有序顺序表合并成一个新的有序顺序表的函数如下:

listtype * Merge(listtype *LA,listtype *LB ){

/*合并有序顺序表LA与LB成为一个新的有序顺序表并由函数返回

listtype *LC;

int value1,value2;

int i,j,k;

initiatelist(LC);

if (LA->length + LB->length > MAXSIZE) {

printf(“表上溢/n”; exit(1);

}

i = 0, j = 0, k = 0;

value1 = LA->data[i];

value2 = LB->data[j];

while (i < LA->length && j < LB->length ) {

/*循环, 两两比较, 小者存入结果表*/

if (value1 <= value2){

LC->data[k] = value1; i++; value1=LA->data[i];}

else {

LC->data[k] = value2; j++; value2=LB->data[j];}

k++;

}

while( i < LA->length){ /*当LA表未检测完, 继续向结果表传送*/ LC->data[k] = value1; i++; k++; value1 = LA->data[i];

}

while( j < LB->length){ /*当LB表未检测完, 继续向结果表传送*/ LC->data[k] = value2; j++; k++; value2 = LB->data[j];

}

LC->length = k;

return LC;

}

(5) 实现从表中删除所有其值重复的元素的函数如下:

void DelDouble(listtype *L){

int i,j,k;

int tmp;

if(L->length == 0 ){

printf(“表空\n”; exit(1);

}

i=0;

while ( i < L->length ) { /*循环检测*/

j = i + 1;

tmp = L->data[i];

while( j < L->length ) { /*对于每一个i, 重复检测一遍后续元素*/ if( tmp == L->data[j]) { /*如果相等,删除此结点,后续元素前移*/ for( k = j+1; k < L->length; k++ ) L->data[k-1] = L->data[k];

L->length--; /*表最后元素位置减1*/

}

else j++;

}

i++; /*检测完L->data[i], 检测下一个*/ }

}

8.线性表可用顺序表或链表存储。试问:

(1) 两种存储表示各有哪些主要优缺点?

(2) 如果有n个表同时并存,并且在处理过程中各表的长度会动态发生变化,表的总数也可能自动改变、在此情况下,应选用哪种存储表示?为什么?

(3) 若表的总数基本稳定,且很少进行插入和删除,但要求以最快的速度存取表中的元素,这时,应采用哪种存储表示?为什么?

【解答】

(1) 顺序存储表示是将数据元素存放于一个连续的存储空间中,实现顺序存取或(按下标)直接存取。它的存储效率高,存取速度快。但它的空间大小一经定义,在程序整个运行期间不会发生改变,因此,不易扩充。同时,由于在插入或删除时,为保持原有次序,平均需要移动一半(或近一半)元素,修改效率不高。

链接存储表示的存储空间一般在程序的运行过程中动态分配和释放,且只要存储器中还有空间,就不会产生存储溢出的问题。同时在插入和删除时不需要保持数据元素原来的物理顺序,只需要保持原来的逻辑顺序,因此不必移动数据,只需修改它们的链接指针,修改效率较高。但存取表中的数据元素时,只能循链顺序访问,因此存取效率不高。

(2) 如果有n个表同时并存,并且在处理过程中各表的长度会动态发生变化,表的总数也可能自动改变、在此情况下,应选用链接存储表示。

如果采用顺序存储表示,必须在一个连续的可用空间中为这n个表分配空间。初始时因不知道哪个表增长得快,必须平均分配空间。在程序运行过程中,有的表占用的空间增长得快,有的表占用的空间增长得慢;有的表很快就用完了分配给它的空间,有的表才用了少量的空间,在进行元素的插入时就必须成片地移动其他的表的空间,以空出位置进行插入;在元素删除时,为填补空白,也可能移动许多元素。这个处理过程极其繁琐和低效。

如果采用链接存储表示,一个表的存储空间可以连续,可以不连续。表的增长通过动态存储分配解决,只要存储器未满,就不会有表溢出的问题;表的收缩可以通过动态存储释放实现,释放的空间还可以在以后动态分配给其他的存储申请要求,非常灵活方便。对于n个表(包括表的总数可能变化)共存的情形,处理十分简便和快捷。所以选用链接存储表示较好。

(3) 应采用顺序存储表示。因为顺序存储表示的存取速度快,但修改效率低。若表的总数基本稳定,且很少进行插入和删除,但要求以最快的速度存取表中的元素,这时采用顺序存储表示较好。

/*---------链表结构的定义.为简化起见,表元素我们使用整型数据-----------

-----------此链表带头结点--------------------------------------------*/

typedef struct mynode{

int data; /*数据域:整型*/

struct mynode *next; /*指针域*/

} node, linklisttype;

9.试写出计算线性链表长度的算法。

int lengthsl(linklisttype *L){

linklisttype * p;

int len;

if(L == NULL){return –1;}

p = L->next; /* p指向链表L的头结点*/

len = 0;

while(p != NULL){

len++;

p = p->next;

}

return len;

}

10.设有一个表头指针为h的单链表。试设计一个算法,通过遍历一趟链表,将链表中所有结点的链接方向逆转,如下图所示。要求逆转结果链表的表头指针h指向原链表的最后一个结点。

【解答】

void LinkListInverse(linklisttype *L){

linklisttype *p, *pre, *next;

if(L == NULL || L->next == NULL ) return; /*表未初始化,或为空表*/

p = L->next;

pre = L;

while( p != NULL ) { /*循环修改链表中所有结点的后继指针的指向*/ next = p->next; /*取当前结点的后继指针*/

p->next = pre; /*当前结点的后继改为指向其原来的前驱*/

pre = p , p=next; /*指针后移*/

}

L->next->next = NULL; /*原第一个结点改为最后一个结点*/

L->next = pre; /*链表的头结点指向原最后一个结点*/

}

11.设有一线性链表,其结点值均为整数。试将该线性链表分解为两个线性链表,其中一链表中的结点值均为负整数,而另一链表中结点的值均为正整数,并删除结点值为零的结点。【解答】

void LinkListDispose(linklisttype * L,linklisttype * LA,linklisttype * LB){

/*

将链表L分解为LA、LB两个链表,其中LA中结点值均为正,LB中结点值均为负,

并删除结点值为零的结点,最后释放L的头结点。

*/

linklisttype *p , *pt , *pa, * pb;

LA = initiatesl();

pa = LA; /*指向LA中的最后一个结点*/

LB = initiatesl();

pb = LB; /*指向LB中的最后一个结点*/

If(L == NULL || L->next == NUUL) return; /*L为空指针或L为空表*/

p = L->next; /*p指向链表L的第一个结点*/

while(p != NULL) /*遍历链表L*/

if(p->data > 0){ /*将p链入链表LA的pa后*/

pa->next = p;

pa = p;

p = p->next;

}

elseif(p->data < 0){ /*将p链入链表LB的pb后*/

pb->next = p;

pb = p;

p = p->next;

}

else{ /*删除值为0的结点*/

pt = p->next; /*记录当前结点的后继,以便删除当前结点*/

free(p);

p = pt;

}

pa->next = NULL;

pb->next = NULL;

free(L);

}

12.设ha和hb分别是两个带表头结点的非递减有序单链表的表头指针, 试设计一个算法, 将这两个有序链表合并成一个非递减有序的单链表。要求结果链表仍使用原来两个链表的存储空间, 不另外占用其它的存储空间。表中允许有重复的数据。

【解答】

void linklistMerge(linklisttype *LA,linklisttype *LB ){

/*合并有序链表LA与LB,结果存入LA中,并释放LB的头结点 */

linklisttype *pa, *pb , *pre ,*pn;

if(LA == NULL || LB == NULL ||) return;

if(LA->next == NULL){ /*LA为空表,则直接将LB链入LA即可*/ LA->next = LB->next;

free(LB);

retrun;

}

if(LB->next == NULL) return; /*LB为空表,则直接返回即可*/

pa = LA->next, pb = LB->next ,pre=LA;

while (pa != NULL && pb != NULL) /*循环, 两两比较, 小者存入结果表*/ if(pa->data > pb->next){ /*将pb链入LA,然后pb指针后移*/ pre->next = pb;

pn = pb->next;

pb->next = pa;

pb = pn;

pre = pre->next

}

else{ /*pa指针后移*/

pa = pa->next;

pre = pre->next;

}

if(pb != NULL) /*将pb剩余结点链入LA*/

pre->next = pb;

free(LB);

}

13.设ha和hb分别是两个带表头结点的非递减有序单链表的表头指针, 试设计一个算法, 将这两个有序链表合并成一个非递增有序的单链表。要求结果链表仍使用原来两个链表的存储空间, 不另外占用其它的存储空间。表中允许有重复的数据。

【解答】

Linklisttype * linklistMerge_inverse(linklisttype *LA,linklisttype *LB ){

/*合并有序链表LA与LB,结果存入LC中,并释放LA、LB的头结点 ,函数返回LC*/ linklisttype *pa, *pb , *p;

if(LA == NULL || LB == NULL ||) return;

LC = initiatesl();

pa = LA->next, pb = LB->next;

while (pa != NULL && pb != NULL) /*循环, 两两比较, 大者存入LC*/ if(pa->data > pb->next){ /*将pa链为LC的第一个结点*/

p = pa->next;

pa->next = LC->next;

LC->next = pa;

pa = p;

}

else{ /*将pa链为LC的第一个结点*/

p = pb->next;

pb->next = LC->next;

LC->next = pb;

pb = p;

}

while(pa != NULL){ /*将pa剩余结点链入LC*/ p = pa->next;

pa->next = LC->next;

LC->next = pa;

pa = p;

}

while(pb != NULL){ /*将pb剩余结点链入LC*/ p = pb->next;

pb->next = LC->next;

LC->next = pb;

pb = p;

}

free(LA);

free(LB);

}

14.在一个循环链表中寻找值为x的结点,并将该结点移到第一个结点之前。

【解答】设此循环链表为单链表,则其类型定义与一般单链表相同

typedef struct mynode cyclelisttype;

void search_movefirst(cyclelisttype *CL, int x){

cyclelisttype * p , *pre;

if(CL == NULL) return;

p = CL->next;

pre = CL;

while(p != CL)

/*查找x,注意与普通单链表在判断是否到表尾上的不同*/

if(p->data == x)

break;

else{

pre = p;

p = p->next;

}

if(p != CL){ /*查找成功*/

per->next = p->next; /*在原来位置删除p*/

p->next = CL->next; /*p插入到CL后*/

CL->next = p;

}

16.铁路进行列车调度时, 常把站台设计成栈式结构的站台,如

右图所示。试问:

()132)16/(16

12=*+C (1) 设有编号为1,2,3,4,5,6的六辆列车, 顺序开入栈式结构的站台, 则可能的出栈序列有多少种?

(2) 若进站的六辆列车顺序如上所述, 那么是否能够得到435612, 325641, 154623和135426的出站序列, 如果不能, 说明为什么不能; 如果能, 说明如何得到(即写出"进栈"或"出栈"的序列)。

【解答】

(1) 可能的不同出栈序列有 种。

(2) 不能得到435612和154623这样的出栈序列。因为若在4, 3, 5, 6之后再将1, 2出栈,则1, 2必须一直在栈中,此时1先进栈,2后进栈,2应压在1上面,不可能1先于2出栈。154623也是这种情况。出栈序列325641和135426可以得到。

325641

1 1 13 135 **** ****

2 13542 135426

17.试证明:若借助栈可由输入序列1, 2, 3, …, n 得到一个输出序列p 1, p 2, p 3, …, p n (它是输入序列的某一种排列),则在输出序列中不可能出现以下情况,即存在i < j < k ,使得p j < p k < p i 。(提示:用反证法)

【解答】

因为借助栈由输入序列1, 2, 3, …, n ,可得到输出序列p 1, p 2, p 3, …, p n ,如果存在下标i, j, k ,满足i < j < k ,那么在输出序列中,可能出现如下5种情况:

① i 进栈,i 出栈,j 进栈,j 出栈,k 进栈,k 出栈。此时具有最小值的排在最前面p i 位置,具有中间值的排在其后p j 位置,具有最大值的排在p k 位置,有p i < p j < p k , 不可能出现p j < p k < p i 的情形;

② i 进栈,i 出栈,j 进栈,k 进栈,k 出栈,j 出栈。此时具有最小值的排在最前面p i 位置,具有最大值的排在p j 位置,具有中间值的排在最后p k 位置,有p i < p k < p j , 不可能出现p j < p k < p i 的情形;

③ i 进栈,j 进栈,j 出栈,i 出栈,k 进栈,k 出栈。此时具有中间值的排在最前面p i 位置,具有最小值的排在其后p j 位置,有p j < p i < p k , 不可能出现p j < p k < p i 的情形;

④ i 进栈,j 进栈,j 出栈,k 进栈,k 出栈,i 出栈。此时具有中间值的排在最前面p i 位置,具有最大值的排在其后p j 位置,具有最小值的排在p k 位置,有p k < p i < p j , 也不可能出现p j < p k < p i 的情形;

⑤ i 进栈,j 进栈,k 进栈,k 出栈,j 出栈,i 出栈。此时具有最大值的排在最前面p i 位置,具有中间值的排在其后p j 位置,具有最小值的排在p k 位置,有p k < p j < p i , 也

不可能出现p j < p k < p i的情形;

18.将编号为0和1的两个栈存放于一个数组空间V[m]中,栈底分别处于数组的两端。当第0号栈的栈顶指针top[0]等于-1时该栈为空,当第1号栈的栈顶指针top[1]等于m时该栈为空。两个栈均从两端向中间增长。当向第0号栈插入一个新元素时,使top[0]增1得到新的栈顶位置,当向第1号栈插入一个新元素时,使top[1]减1得到新的栈顶位置。当top[0]+1 == top[1]时或top[0] == top[1]-1时,栈空间满,此时不能再向任一栈加入新的元素。试定义这种双栈(Double Stack)结构的类定义,并实现判栈空、判栈满、插入、删除算法。

【解答】

双栈的类型定义如下:

typedef struct{

int top0,top1;

elemtype data[MAXSIZE];

}DoubleStack;

判栈空

int DoubleStackEmpty(DoubleStack * DS,int StackNo){

/*DS:指向双栈的指针,StackNo:0或1,指定要判断的是第0栈,还是第一栈if(StackNo==0)

return(DS->top0 < 0);

else

retrun(DS->top1 >= MAXSIZE);

}

判栈满

int DoubleStackFull(DoubleStack * DS){

return(DS->top1-DS->top0==1);

}

入栈

int PopDoubleStack(DoubleStack * DS,int StackNo,elemtype x){

/*将数据元素x插入到栈StackNo中*/

if(DoubleStackFull(DS)) return(FALSE);/*栈满溢出*/

if(StackNo==0){/*对第0栈插入*/

DS->top0++;

DS->data[top0]=x;

}

else{/*对第1栈插入*/

DS->top1--;

DS->data[top1]=x;

}

return(TRUE);

}

删除算法

elemtype PushDoubleStack(DoubleStack * DS,int StackNo){

/*从StackNo栈中删除并返回一个元素,若栈空,则返回NULL*/

if(DoubleStackEmpty(DS,StackNo)) return(NULL);

if(StackNo==0){/*对0号栈进行操作*/

DS->top0--;

return(DS->data[DS->top0+1]);

}

else{

DS->top1++;

return(DS->data[DS->top1-1]);

}

}

19.改写顺序栈的进栈成员函数Push(x),要求当栈满时执行一个stackFull( )操作进行栈满处理。其功能是:动态创建一个比原来的栈数组大二倍的新数组,代替原来的栈数组,原来栈数组中的元素占据新数组的前MaxSize位置。

【解答】

void push(stack * S,elemtype x) {

if(StackEmpty(S)) stackFull(S); 据教案中给出的优先级,回答以下问题:

(1) 在表达式求值的过程中,如果表达式e含有n个运算符和分界符,问操作数栈(NS)中最多可存入多少个元素?

(2) 如果表达式e含有n个运算符,且括号嵌套的最大深度为6层,问栈中最多可存入多少个元素?

【解答】

(1) 如果表达式e含有n个运算符和分界符,则可能的运算对象有n+1个。因此在利用后缀表达式求值时所用到的运算对象栈中最多可存入n+1个元素。

(2) 同上。

21.表达式的中缀表示为a * x - b / x^2,试利用栈将它改为后缀表示ax * bx2^/ -。写出转换过程中栈的变化。(^表示乘方运算)

【解答】

若设当前扫描到的运算符ch的优先级为icp(ch),该运算符进栈后的优先级为isp(ch),

isp也叫做栈内(in stack priority)优先数,icp也叫做栈外(in coming priority)优先数。当刚扫描到的运算符ch的icp(ch)大于isp(stack)时,则ch进栈;当刚扫描到的

运算符ch的icp(ch)小于isp(stack)时,则位于栈顶的运算符退栈并输出。从表中可知,icp(“(”)最高,但当“(”进栈后,isp(“(”)变得极低。其它运算符进入栈中后优先数都升1,这样可体现在中缀表达式中相同优先级的运算符自左向右计算的要求。运算符优先数相等的情况只出现在括号配对“)”或栈底的“;”号与输入流最后的“;”号配对时。前者将连续退出位于栈顶的运算符,直到遇到“(”为止。然后将“(”退栈以对消括号,后者将结束算法。

步序扫

项类型动作栈的

变化

输出

0 ';' 进栈, 读下一符号;

1 a操作数直接输出, 读下一符号;A

2 *操作符 isp ( ' ; ' ) < icp ( ' * ' ), 进栈,

读下一符号

; *A

3 x操作数直接输出, 读下一符号; * a x

4 -操作符 isp ( ' * ' ) > icp ( ' - ' ), 退栈

输出

; a x *

isp ( ' ; ' ) < icp ( ' - ' ), 进栈,

读下一符号

; - a x *

5 b操作数直接输出, 读下一符号; - a x * b

6 /操作符 isp ( ' - ' ) < icp ( '/' ), 进栈, 读

下一符号

; -/ a x * b

7 x操作数直接输出, 读下一符号; -/ a x * b x

8 ^操作符 isp ( ' / ' ) < icp ( '^' ), 进栈, 读

下一符号

;-/^ a x * b x

9 2操作数直接输出, 读下一符号;-/^ a x * b x 2 10;操作符 isp ( '↑' ) > icp ( ' ; ' ), 退栈输

; -/ a x * b x 2^

isp ( ' / ' ) > icp ( ' ; ' ), 退栈

输出

; - a x * b x 2^/

isp ( ' - ' ) > icp ( ' ; ' ), 退栈输出; a x * b x 2^/

-

结束

22.设循环队列的容量为70(序号从1到70),经过一系列入队和退队运算后,有:

(1)front=15,rear=46;

(2)front=45,rear=10

问在上述两种情况下,循环队列中各有多少个元素?

【解答】

(1)队列中元素的个数为(MAXSIZE+rear-front) %MAXSIZE = (70+46-15)%70=31

(2)队列中元素的个数为(MAXSIZE+rear-front) %MAXSIZE = (70+10-45)%70=35

23.设用链表表示一个双端队列,要求可在表的两端插入,但限制只能在表的一端删除。试编写基于此结构的队列的插入(enqueue)和删除(dequeue)算法,并给出队列空和队列满的条件。

设此队列含头结点,队头指针front指向头结点,限定在表头端删除

队列空:队尾指针指向头结点,即rear=front时,队空

队列满:因为是链表,所以,只有内存空间不足时才会有队满的问题。

void insertqueue(queuetype *Q,int location,elemtype x){

/*Q:指向队列的指针;location:插入位置,0表示队头,1表示队尾;x:数据元素*/ node *p;

p=(node *)malloc(sizeof(node));

p->data = x;

if(location==0){/*在队头处插入*/

p->next = Q->front->next;

Q->front->next = p;

if(Q->rear==Q->front) Q->rear = p;/*对空表插入*/

}

else{/*在队尾处插入*/

p->next = NULL;

Q->rear->next = p;

Q->rear = p;

}

}

elemtype deletequeue(queuetype *Q){

elemtype x;

node * p;

if(Q->rear == Q->front) return(NULL); /*空队列*/

p = Q->front->next;

x = p->data;

Q->front->next = p->next;

if(Q->rear == p) Q->rear = Q->front /*对只有一个元素的队列进行删除*/ free(p);

return(x);

}

24.所谓回文,是指从前向后顺读和从后向前倒读都一样的不含空白字符的串。例如did,madamimadam,pop即是回文。试编写一个算法,以判断一个串是否是回文。

【解答1】

将字符串中全部字符进栈,然后将栈中的字符逐个与原字符串中的字符进行比较。算法如下:

int palindrome (string S) {

stacktype * st;

int yes = 1, i = 0;

while(S[i] != “\0”){

push (st,S[i]); i++; /*扫描字符串,所有字符进栈*/

}

i = 0;

while(S[i] != “\0” ) /*比较字符串*/ if(S[i] == ( )){pop(st); i++; } else {yes = 0; break; } return(yes);

}

【解答2】

采用递归算法,判断从s 到e 中的字符串是否回文,通过函数返回是或不是。

int palindrome(char A[ ], int start, int end) { if (A[start] != A[end] ) return 0; else if ( s > e ) return 1;

else palindrome ( A, start+1, end-1 ); }

25.设A[n][n]为一个上三角矩阵,将A 中所有非零元素按列序顺次存入一维数组B 中,则A 与B 元素的对应关系是什么? 【解答】上三角矩阵如下所示

???????

????

?????nn n n n a a a a a a a a a a Λ

M O M M M ΛΛΛ

000

000333223221131211

其数据元素满足Aij=0,对所有的i>j

上三角矩阵正好是一个下三角矩阵的转秩,我们知道,一个下三角矩阵按行压缩存储时,矩阵元素与一维数组的对应关系为

A[i][j]B[i*(i+1)/2+j],对所有的i>j ;

因此,下三角矩阵按列序存储在一维数组中的元素对应关系为

A[i][j]B[j*(j+1)/2+i],对所有的i

26.编写串的替换函数Replace(str,str1,str2),将主串str 中所有子串str1替换为str2。 【解答】见书p58

软件技术基础习题答案

操作系统 1.如何理解虚拟机的概念? 答:虚拟机就是在裸机上扩展一层软件,将硬件实现细节隐藏起来,使用户能够更方便、更灵活使用的计算机。 2.什么是多道程序设计,它的主要优点是什么? 答:多道程序设计就是允许多个程序同时进入内存并运行。主要优点:提高资源利用率,从而提高了系统的吞吐量。 3.试述分时系统与实时系统,并比较它们的区别。 答:分时系统是指能够允许多个用户同时使用一台计算机的系统。实时系统是指能够及时响应随机发生的外部事件,并在严格的时间范围内完成对该事件处理的系统。实时系统对系统响应速度要求更高,可靠性要求更高。(或者说明分时系统与实时系统各自特点) 4.一般从哪几方面对操作系统的性能进行评价? 1)可靠性 2)方便性 3)效率 4)可维护性 5)可移植性 5.试说出几种你所熟悉的操作系统名称,并说明其特征。 答:Linux特征:支持多用户、多任务,具有良好的用户界面,设备独立性,系统安全性能高,良好的可移植性。 Windows特征:支持多用户、多任务,具有友好的图形用户界面,强大的内存管理功能,可靠性高,操作简单。 6.根据你试用计算机系统的经验,说明操作系统的作用。 答:控制和管理计算机系统内各种硬件和软件资源、合理有效地组织计算机系统的工作,为用户提供一个使用方便可扩展的工作环境,从而起到连接计算机和用户的接口作用。 7.如何理解网络操作系统的主要功能? 答:用于管理网络通信和共享资源,协调各主机上任务的运行,并向用户提供统一的、有效的网络接口,包括网络管理、通信、资源共享、系统安全和多种网络应用服务。 8.如何理解进程的概念?进程与程序的区别是什么?进程与作业的联系和区别是什么?答:进程是一个可以并发执行的程序或程序段在一个数据集合上的执行过程,他是系统分配资源的基本单位。 区别:1)经常是一个动态的概念,是执行程序的动态过程,它因创建而产生,因调度而执行,因撤销而消亡。而程序是一个静态的概念,是进程运行的静态文本。 2)进程能真实地描述并发执行,且具有并发性,而程序没有。 3)一个进程可以执行一个或多个程序。 4)程序可以作为一种软件资源长期保持着,而进程则是程序的一次执行过程,是暂时的,是动态地产生和终止的,它不具有存储性。 作业和进程的联系两者静态描述的结构相似,作业是由程序,数据和JCB组成,进程是由程序或程序段,数据,PCB组成。区别:作业是用户向计算机提交任务实体,而进程是完成用户任务的执行实体;一个作业可由多个进程组成,且必须至少有一个进程。作业一般用于批处理系统中,而进程用在所有多道系统中。 9.理解进程的三种基本状态和发生状态转换的原因。 答:进程的三种基本状态分别执行状态,就绪状态和等待状态。简单来说是由于CPU以及

软件技术基础试题及答案

软件技术基础试题及答案

软件技术基础 系班级姓名成绩 得分评卷 人一、填空题(每空1分,共25分) 1.数据结构作为一门学科,主要研究数据 的、存储结构以及 三方面内容。 2.当对一个线性表经常进行插入或删除操作时,则 宜采用存储结构;而经常进行的是访问操作,而很少进行插入或删除操作时,则宜采用存储结构。 3.在线性结构中,首结点有个前驱结点, 其余每个结点有且只有个前驱结点。4.限定在表的一端进行插入,在表的另一端进行删 除的线性表称为;限定在表的一端进行插入和删除运算的线性表称为。 5.一个8阶的下三角矩阵B按行优先顺序压缩存储 第2页,共19页

6. 第3页,共19页

7. 8.操作系统通过记载、跟 踪、控制进程的执行,它是进程存在的唯一标志。 作业调度程序是从处于状态的作业中选取一个作业并把它装入主存。 12A.软件生命周期瀑布模型一般可分为问题分析、、、 和软件维护五个阶段。 , 得分评卷 人二、选择题(每小题1分,共10分)下列语句正确的是()。 A. int *p=&x; B. int *p=x; C. int p=&x; D. int *p=*x; 2. int a[ ]={1,2,3,4,5},b[5],*p; 则下列语句中不 正确的语句是()。 A. p=b+1; B.p=&a[3]; C. p=a; D.b=a; 3. 设有以下说明语句 struct node{ int a;float b;};struct node node1,node2,*pnode; 则下列语句中正确是()。 A. node1=node2; B. 第4页,共19页

西电《软件技术基础》上机大作业答案解析

说明 每个实验题目含有一个main函数和一些函数,与实验题目相关的基本运算的函数定义和main函数定义的代码在附录以及对应的文件夹中给出,供上机实验参考使用。对于每个题目,只需要根据题目要求设计算法,补充函数定义,然后对程序进行编译、调试。

实验一线性表 一、实验目的 1.熟悉线性表的顺序和链式存储结构 2.掌握线性表的基本运算 3.能够利用线性表的基本运算完成线性表应用的运算 二、实验内容 1.设有一个线性表E={e1, e2, … , e n-1, e n},设计一个算法,将线性表逆置,即使元素排列次序颠倒过来,成为逆线性表E’={ e n , e n-1 , … , e2 , e1 },要求逆线性表占用原线性表空间,并且用顺序表和单链表两种方法表示,分别用两个程序来完成。(文件夹:顺序表逆置、单链表逆置) 2.已知由不具有头结点的单链表表示的线性表中,含有三类字符的数据元素(字母、数字和其他字符),试编写算法构造三个以循环链表表示的线性表,使每个表中只含有同一类的字符,且利用原表中的结点空间,头结点可另辟空间。(文件夹:分解单链表) 实验二栈和队列 一、实验目的 1.熟悉栈和队列的顺序和链式存储结构 2.掌握栈和队列的基本运算 3.能够利用栈和队列的基本运算完成栈和队列应用的运算 二、实验内容 1.设单链表中存放有n个字符,试编写算法,判断该字符串是否有中心对称的关系,例如xyzzyx是中心对称的字符串。(提示:将单链表中的一半字符先依次进栈,然后依次出栈与单链表中的另一半字符进行比较。)(文件夹:判字符串中心对称) 2.假设以数组sequ[m]存放循环队列的元素,同时设变量rear和quelen 分别指示循环队列中队尾元素的位置和内含元素的个数。编写实现该循环队列的入队和出队操作的算法。 提示:队空的条件:sq->quelen==0;队满的条件:sq->quelen==m。(文件夹:循环队列)实验三串 一、实验目的 1.熟悉串的顺序存储结构 2.掌握串的基本运算及应用 二、实验内容 1.串采用顺序存储结构,编写朴素模式匹配算法,查找在串中是否存在给定的子串。(文件夹:模式匹配) 2.若S是一个采用顺序结构存储的串,利用C的库函数strlen和strcpy(或strncpy)编写

软件技术基础模拟题

《软件技术基础》模拟题 一、填空题 1. 软件工程的传统途径是_____________方法学。 2. 一般说来,软件生命周期由_____________、软件开发和软件维护三个时期组成。 3. _______________的目的就是用最小的代价在尽可能短的时间内确定该软件项目是否能够开发,是否值得去开发。 4. 数据流图描述系统的_____________模型。 5. 数据字典的用途是作为_____________阶段的工具。 6. 在可行性研究以后,如果确认开发一个新的软件系统是必要的而且是可能的,那么就进入___________阶段。 7. ER模型中包含“实体”、“联系”和“_____________”三个基本成分。 8. 结构化分析方法是面向_____________进行需求分析的方法。 9. _____________是对一个软件结构内不同模块之间互联程度的度量。 10. _____________标志一个模块内各个元素彼此结合的紧密程度,它是信息隐蔽和局部化概念的自然扩展。 11. 面向数据流的设计方法把信息流映射成软件结构,信息流的类型决定了映射的方法。信息流有变换流和_____________两种类型。 12. 衡量模块独立性的两个定性的度量标准是内聚性和_________。 13. 在详细设计阶段,经常采用的工具有程序流程图、盒图、_________。 14. Jackson图不仅可表示程序结构,还可表示_________。 15. 20世纪70年代中期出现了“面向数据结构”的设计方法,其中有代表性的是Jackson方法和_________方法。 16. 面向对象有三个基本要素,它们是抽象、封装性和________。 17. 所谓对象模型就是表示静态的、________的系统的“数据”性质。 18. 维护的副作用有编码副作用、数据副作用和________副作用。 19. 软件测试是为了__________而执行程序的过程。 20. 白盒测试是结构测试,黑盒测试是________测试。 二选择 1. 研究开发资源的有效性是进行_______可行性研究的一方面。 A. 经济 B. 技术 C. 操作 D. 社会 2. 软件生命周期中时间最长的阶段是______阶段。 A. 需求分析 B. 详细设计 C. 测试 D. 维护 3. 瀑布模型是一种_________。

计算机软件技术基础(第三版)沈被娜 课后习题答案较全

第一章信息与计算机 1.1 什么是信息?信息与数据的区别和联系在何处? 信息定义之一:信息是现实世界中存在的客观实体、现象、关系进行描述的数据。信息定义之二:信息是经过加工后并对实体的行为产生影响的数据。 与数据的区别和联系:数据定义:数据是现实世界客观存在的实体或事物的属性值,即指人们听到的事实和看到的景象。我们把这些数据收集起来,经过处理后,即得到人们需要的信息。信息和数据的关系可以归结为: 1. 信息是有一定含义的数据。 2. 信息是经过加工(处理)后的数据。 3. 信息是对决策有价值的数据。 1.2 信息有哪些基本属性? 信息的基本属性有: 1. 事实性。 2. 等级性。 3. 可压缩性。 4. 可扩散性。 5. 可传输性。 6. 共享性。 7. 增值性和再生性。 8. 转换性。 1.3 计算机的主要特点是什么? 计算机最主要的特点是: 1. 高速自动的操作功能。 2. 具有记忆的能力。 3. 可以进行各种逻辑判断。 4. 精确高速的计算能力。 1.5 完整的计算机系统应该包括哪几部分? 目前最完整的计算机系统学说认为由五部分组成: 1. 人员 2. 数据 3. 设备 4. 程序 5. 规程 1.6 什么是计算机硬件?什么是计算机软件? 硬件:泛指实际存在的物理设备,包括计算机本身及其外围设备。

微型计算机的硬件系统:主机、外存储器、输入设备、输出设备、微机的系统总线。 软件:是指计算机程序、方法、规则的文档以及在计算机上运行它时所必须的数据。计算机软件一般分为系统软件和应用软件。 1.8 软件技术发展的几个阶段各有什么特点?它与硬件的关系如何? 第一阶段:高级语言阶段特点:这一时期,编译技术代表了整个软件技术,软件工作者追求的主要目的是设计和实现在控制结构和数据结构方面表现能力强的高级语言。但在这一时期内,编译系统主要是靠手工编制,自动化程度很低。硬件关系:此时期计算机的硬件要求仅能用机器指令来编制可运行的程序。 第二阶段:结构程序设计阶段特点:在程序的正确性方面,提出了结构化程序设计思想使程序的可靠性提高了。程序设计方法论方面,提出由顶向下法和自底向上法。使程序模块化,使问题的复杂性和人的思维统一起来了。出现了软件生产管理。硬件关系:磁盘问世,操作系统发展,非数值计算应用发展,通信设备完善,网络发展,集成电路发展等使软件复杂性增加产生软件危机,在此背景下发展了软件技术。 第三阶段:自动程序设计阶段特点:向集成化、一体化发展。出现了软件开发环境。程序设计基本方法进一步改进。硬件关系:集成电路迅速发展以及高分辨率终端的出现,为个人计算机发展提供了条件,再加上人工智能、专家系统研究的发展,使程

软件技术基础模拟试题及参考答案

软件技术基础模拟试题(第二十次省统考) 一、是非判断题(正确选填A,错误选填B)(每小题1分,共10分) 1、数据元素是数据的基本单位,数据项是数据的最小单位。() 2、栈是特殊的线性表,须用一组地址连续的存储单元来存储其元素。() 3、引入虚拟存储技术后,逻辑内存总容量是由地址总线的位置确定的。() 4、编译程序是一种常用应用软件。() 5、顺序文件和链接文件的长度都可以动态变化。() 6、在文件系统中采用目录管理文件。() 7、允许多用户在其终端上同时交互地使用计算机的操作系统称为实时系统。() 8、程序、数据、和进程控制块是构成一个进程的三要素。() 9、黑盒测试时,既要考虑程序的内部逻辑结构又要考虑其外部特性。() 10、软件的总体设计和详细设计都要用PAD图形工具。() (参考答案:1~10:ABABB ABABB) 二、单项选择题:(每小题1分,共5分) 1、允许用户把若干作业提交计算机系统集中处理的操作系统称为()。 A分时操作系统B实时操作系统C网络操作系统D批处理操作系统2、分配到必要资源并获得了处理机时的进程的状态称为()。 A就绪状态B执行状态C等待状态D阻塞状态 3、利用通道技术可以在()之间直接交换数据。 A内存与CPU B CPU与外设C内存与外设D内存、CPU和外设三者4、以下的准则中哪个不是软件设计的准则()。 A编程语言选择准则B信息屏蔽准则 C结构化和模块化准则D抽象准则 5、有一数列:97657613294958经过一趟排序后得到: 65971376294958请问使用的是何种排序方法?() A简单插入排序B冒泡排序C2路归并排序D快速排序 (参考答案:DBCAC) 软件技术基础模拟试题(第十九次省统考) 一、是非判断题(正确选填A,错误选填B)(每小题1分,共10分) 1、在目前,用于保证软件质量的主要手段是进行软件测试。() 2、使用DMA方式传送数据期间不需要CPU干预。() 3、线性顺序队列会产生“假溢出”,而线性循环队列则不会。() 4、对同一种算法,用高级语言编写的程序比用低级语言编写的程序运行速度快。() 5、在线性表中,数据的存储方式有顺序和链接两种。() 6、进程由程序块、文件控件块和数据块三部分组成。() 7、在面向对象的程序设计中,派生类只能从一个基类产生。() 8、操作系统是用户和硬件的接口。() 9、个人计算机中可配置的最大内存容量受地址总线位数的限制。() 10、软件维护中最困难的问题是软件配置不全。() (参考答案:1~10:A、A、A、B、A、B、A、A、A、B) 二、单项选择题:(每小题1分,共5分)

软件技术基础教学大纲资料

《软件技术基础》教学大纲 课程编号:23000840 适用专业:电子信息类(非计算机专业) 学时数:40 学分数: 2.5 开课学期:第4学期 先修课程:《C语言》 考核方式:笔试(闭卷) 执笔者:沈晓峰编写日期:2015年3月审核人(教学副院长): 一、课程性质和目标 授课对象:电子信息工程专业大学二年级本科生 课程类别:学科拓展课程 教学目标: 本课程是针对工科电子信息类本科生开设的一门学科拓展课程。着重培养学生在软件设计领域的基本素质,基本方法和设计理念。授课对象为大学二年级学生,课程任务是通过本课程的学习和相关实验的练习,使学生掌握数据结构、操作系统等软件技术的基本理论知识,具有一定的软件开发能力。 二、教学内容和要求 1、课堂理论教学要求和学时安排(32学时) 1)C程序设计(4学时) (1)C语言回顾,指针的基本概念、运算方法和使用(2学时)。 (2)结构体的基本概念和使用方法(2学时)。 2)数据结构(20学时) (1)数据结构的基本概念(2学时):理解数据结构的基本概念;理解线性和非线性结构的概念。 (2)线性数据结构(9学时):理解表、栈、队列等线性数据结构的概念,存储方式及基于不同存储方式的相关操作的实现方法。 a.理解表的概念及顺序表的存储特点,掌握其创建、插入、删除等实现方法(2 学时); b.掌握单链表、双链表、循环链表的创建、插入、删除方法(2学时); c.理解栈的概念及结构特点,掌握顺序栈及链栈的出栈、入栈操作的实现方法 (2学时);

d.理解队列的概念及特点,掌握顺序、循环队列的创建、出队、入队、判空、判满等操作。掌握链队列的创建及出队、入队(2学时); e.理解数组的概念及二维数组的存放方式,掌握对称矩阵及稀疏矩阵的压缩存储方法(1学时)。 (3)非线性数据结构(5学时):了解典型非线性数据结构的基本概念、存储和访问方式。 a.理解二叉树、满二叉树、完全二叉树的概念及基本性质(1学时); b.掌握二叉树的三种遍历算法、树和二叉树的转换方法(2学时); c.理解图的基本概念及性质,掌握图的邻接矩阵、邻接图存储方式(2学时)。 (4)结构查找和排序(4学时):理解查找和排序的基本概念,掌握三种查找(顺序、二分、分块)和三种排序(简单插入,简单选择和冒泡)方法和实现。 3)操作系统(8学时) (1)操作系统的基本概念(2学时):了解操作系统的基本概念,操作系统发展的历 程和现代操作系统的基本特征。 (2)处理机管理(4学时);理解进程、进程的状态、描述方式、进程控制的手段, 进程的同步和互斥,进程通信和死锁等基本概念,理解进程调度的相关方法。 (3)作业管理(2学时):理解作业、作业的状态、描述方式、作业控制的手段,等 基本概念,理解作业调度的相关方法。 通过这一章的学习同学们应该理解一个用户作业提交给计算机之后,操作系统控制计算机来执行该用户作业的基本流程。 2、实验安排(8学时) 共设置5组实验,分为上机实验和课外实验两部分:上机实验包括两个实验,课外实验包括3个实验,详细实验内容见实验教学大纲。 三、考核方式 课程最后成绩构成包括:期末考试卷面成绩(70%),平时成绩(10%),实验成绩(20%)。 实验部分的考核包含上机实验和课外实验,实验成绩采用实验出勤、实验考核、实验报告和实验程序验证相结合的方式给出。 四、教材和参考资料 1、教材 《软件技术基础》,黄迪明,电子科技大学出版社,1998年 2、参考资料

14秋天大《计算机软件技术基础(1)》在线作业一答案

《计算机软件技术基础(1)》在线作业一 1. 在设计阶段,当双击窗体上的某个控件时,所打开的窗口是()。 A. 工程资源管理器窗口 B. 工具箱窗口 C. 代码窗口 D. 属性窗口 正确答案:C 满分:5 分得分:5 2. 下面哪条语句可以正确地声明一个动态数组:()。 A. Dim A(n) As Integer B. Dim A(1 To n) As Integer C. Dim A() As Integer D. Dim A( , ) As Integer 正确答案:C 满分:5 分得分:5 3. 从键盘上输入两个字符串,分别保存在变量str1、str2中。确定第二个字符串在第一个字符串中起始位置的函数是()。 A. Left B. Mid C. String D. Instr 正确答案:D 满分:5 分得分:5 4. 下列叙述中正确的是()。 A. 在窗体的Form_Load事件过程中定义的变量是全局变量 B. 局部变量的作用域可以超出所定义的过程 C. 在某个Sub过程中定义的局部变量可以与其它事件过程中定义的局部变量同名,但其作用域只限于该过程 D. 在调用过程时,所有局部变量被系统初始化为0或空字符串 正确答案:C 满分:5 分得分:5 5. 设标签Label1的Caption属性值为默认值,则该标签控件Name属性和Caption属性的值分别为()。 A. “Label”、“Label” B. “Label1”、“Label1” C. “Label”、“Label1” D. “Label1”、“Label” 正确答案:B 满分:5 分得分:5 6. 下面的动作中,不能引发一个按钮Click事件的是:()。 A. 在按钮上单击 B. 在按钮上右击 C. 把焦点移至按钮上,然后按回车键 D. 如果按钮上有快捷字母,按“Alt+该字母” 正确答案:B 满分:5 分得分:5 7. 在窗体Form1的Click事件过程中有以下语句:Label1.Caption=”Visual BASIC”设标签的原Caption属性值为默认值,则该语句执行之后该标签控件Name属性和Caption属性的值分别为()。

软件技术基础模拟试题

软件技术基础模拟试题(第二十四次省统考) 一、是非判断题(正确选填A,错误选填B)(每小题1分,共10分) 1. 顺序表和线性链表的物理存贮形式都是顺序存贮。( 1 ) 2. 数据类型是某种程序设计语言中已实现的数据结构。( 2 ) 3. 如果通过软件测试没有发现错误,则说明软件是完全正确的。( 3 ) 4. 快速原型模型可以有效地适应用户需求的动态变化。( 4 ) 5. 不同进程之间的动作在时间上不能重叠。( 5 ) 6. 分区式存储管理能够进行存储空间共享。( 6 ) 7. 链接文件和索引文件都可以非连续存放。( 7 ) 8. 中断处理一般分为中断响应和中断处理两个步骤。前者由软件实施,后者主要由硬件实施。( 8 ) 9. 在C++语言中,“重载”表达了最简单的多态性。( 9 ) 10.进程调度根据一定的调度算法,从等待队列中挑选出合适的进程。( 10 ) (参考答案:1~10:ABBAB BABAB ) 二、单项选择题:(每小题1分,共5分) 1. 在数据结构中,一个存储结点存放一个(11 )。 11 (A) 数据项(B) 数据元素(C) 数据结构(D) 数据类型 2. 把逻辑地址转变为存储的物理地址的过程称作(12 )。 12 (A) 编译(B) 连接(C) 运行(D) 重定位 3. SPOOLing技术可以实现设备的(13 )分配。 13 (A) 虚拟(B) 共享(C) 独占(D) 物理 4. 允许用户把若干作业提交计算机系统集中处理的操作系统称为(14 )。 14 (A) 分时操作系统(B) 实时操作系统 (C) 网络操作系统(D) 批处理操作系统 5. 进程从运行状态进入就绪状态的原因可能是(15 )。 15 (A) 被选中占有处理机(B) 时间片用完 (C) 等待的事件已发生(D) 等待某一事件 (参考答案:BBADB) 软件技术基础模拟试题(第二十三次省统考) 一、是非判断题(正确选填A,错误选填B)(每小题1分,共10分) 1. 数据在计算机内在中的表示是指数据的存储结构。( 1 ) 2. 能影响中断响应次序的技术是中断优先级和中断屏蔽。( 2 ) 3. 链表可以随机访问任意一个结点,而顺序表则不能。( 3 ) 4. 作业与进程的主要区别是前者是由用户提交,后者是由系统自动生成。( 4 ) 5. Windows、OS/2、Linux微机操作系统都是多用户多任务操作系统。( 5 ) 6. 数据的逻辑结构是从逻辑关系上描述数据,它与数据的存储结构无关,是独立于计算机的。 ( 6 ) 7. 流式文件和记录式文件都以字符为基本单位进行存取。( 7 ) 8. 不定长文件是指字段的长度不固定。( 8 ) 9. 软件工程的三要素包括方法、工具和环境。( 9 ) 10.软件结构是以指令为基础而组成的一种控制层次结构。( 10 ) (参考答案:1~10:AABAB ABBBB) 二、单项选择题:(每小题1分,共5分) 1. 若进栈序列为1,2,3,4,且进栈过程中可以出栈,则不可能出栈的序列是 ( 11 ). 11 (A) 1,4,3,2 (B) 2,3,4,1 (C) 3,1,4,2 (D) 3,4,2,1

软件技术基础教学大纲资料

软件技术基础》教学大纲 课程编号: 23000840 适用专业:电子信息类(非计算机专业) 学时数: 40学分数: 2.5 开课学期:第4 学期 先修课程: 《C 语言》 考核方式:笔试(闭卷) 执笔者:沈晓峰编写日期:2015 年3月审核人(教学副院长): 一、课程性质和目标授课对象:电子信息工程专业大学二年级本科生课程类别:学科拓展课程教学目标: 本课程是针对工科电子信息类本科生开设的一门学科拓展课程。着重培养学生在软件设计领域的基本素质,基本方法和设计理念。授课对象为大学二年级学生,课程任务是通过本课程的学习和相关实验的练习,使学生掌握数据结构、操作系统等软件技术的基本理论知识,具有一定的软件开发能力。 二、教学内容和要求 1、课堂理论教学要求和学时安排(32 学时) 1) C 程序设计(4 学时) (1)C 语言回顾,指针的基本概念、运算方法和使用( 2 学时)。 (2)结构体的基本概念和使用方法(2 学时)。 2)数据结构(20 学时) (1)数据结构的基本概念(2 学时):理解数据结构的基本概念;理解线性和非线性结构的概念。 (2)线性数据结构(9 学时):理解表、栈、队列等线性数据结构的概念,存储方式及基于不同存储方式的相关操作的实现方法。 a. 理解表的概念及顺序表的存储特点,掌握其创建、插入、删除等实现方法(2 学时); b. 掌握单链表、双链表、循环链表的创建、插入、删除方法( 2 学时); c. 理解栈的概念及结构特点,掌握顺序栈及链栈的出栈、入栈操作的实现方法 (2 学时); d. 理解队列的概念及特点,掌握顺序、循环队列的创建、出队、入队、判空、判满等操作。掌握链 队列的创建及出队、入队(2 学时); e. 理解数组的概念及二维数组的存放方式,掌握对称矩阵及稀疏矩阵的压缩存储方法 (1 学时)。

软件技术基础试题(含答案)

《操作系统》 选择题: (bs30)1. 分页式存储管理的主要特点是(B)。 (A) 要求作业全部同时装入内存(B) 不要求作业装入到内存的连续区域 (C) 要求扩充外存容量(D) 不要求处理缺页中断 (bs30)2. 进程从运行状态进入就绪状态的原因可能是(D)。 (A) 被选中占有处理机(B) 等待某一事件(C) 等待的事件已发生(D) 时间片用完 (bs30)3. 多道程序设计是指(D)。 (A) 在实时系统中并发运行多个程序(B) 在分布系统工程中同一时刻运行多个程序 (C) 在一台处理机上同一时刻运行多个程序(D) 在一台处理机上并发运行多个程序 (bs29)2. 进程从运行状态进入就绪状态的原因可能是( A )。 (A) 时间片用完(B) 等待某一事件(C) 等待的事件已发生(D) 被选中占有处理机(bs29)4. 以下(D)不是实时操作系统的特点。 (A) 高可靠性(B) 及时响应(C) 高效性(D) 通用性 (bs28)3. 任何两个并发进程之间( A )。 (A) 可能存在同步或互斥关系(B) 一定存在同步关系 (C) 一定彼此独立无关(D) 一定存在互斥关系 (bs28)4. 以下的哪个特征不是分时操作系统的主要特征(B)。 (A) 分时性(B) 独占性(C) 交互性(D) 多路性 (bs27)2. 以下(D)不是实时操作系统的特点。 (A) 高可靠性(B) 及时响应(C) 中断管理(D) 独立性 (bs27)3. 若当前进程因时间片用完而让出处理机时,该进程应转变为(B)状态。 (A) 运行(B) 就绪(C) 等待(D) 完成 (bs26)3. 在多道程序设计系统中,处于后备状态的作业要经过(D)调度后才能真正执行。 (A) 作业调度(B) 作业调度和设备调度(C) 进程调度(D) 作业调度和进程调度 (bs25)1. 把高级语言的源程序翻译成二进制代码的过程称为:(A)。 (A) 编译(B) 连接(C) 运行(D) 重定位 (bs25)2. 把逻辑地址转变为内存的物理地址的过程称作(D)。 (A) 地址分配(B) 地址连接(C) 地址调用(D) 地址变换 (bs25)4. 在操作系统中,进程最基本的特征是(A)。 (A) 动态性和并发性(B) 顺序性和可再现性 (C) 与程序的对应性(D) 执行过程的封闭性 (bs24)2. 把逻辑地址转变为存储的物理地址的过程称作(D)。 (A) 编译(B) 连接(C) 运行(D) 重定位 (bs24)3. SPOOLing技术可以实现设备的(B)分配。 (A) 虚拟(B) 共享(C) 独占(D) 物理 (bs24)4. 允许用户把若干作业提交计算机系统集中处理的操作系统称为(D)。 (A) 分时操作系统(B) 实时操作系统 (C) 网络操作系统(D) 批处理操作系统 (bs24)5. 进程从运行状态进入就绪状态的原因可能是(B)。 (A) 被选中占有处理机(B) 时间片用完 (C) 等待的事件已发生(D) 等待某一事件 (bs23)2. 任何两个并发进程之间( D) (A) 一定存在互斥关系(B) 一定存在同步关系 (C) 一定彼此独立无关(D) 可能存在同步或互斥关系

软件技术基础试题及答案

软件技术基础 系班级姓名成绩得分评卷人 一、填空题(每空1分,共25分) 1.数据结构作为一门学科,主要研究数据的、存储结构以及 三方面内容。 2.当对一个线性表经常进行插入或删除操作时,则宜采用存储结构;而经常进 行的是访问操作,而很少进行插入或删除操作时,则宜采用存储结构。 3.在线性结构中,首结点有个前驱结点,其余每个结点有且只有个前驱结点。 4.限定在表的一端进行插入,在表的另一端进行删除的线性表称为;限定在表 的一端进行插入和删除运算的线性表称为。 5.一个8阶的下三角矩阵B按行优先顺序压缩存储在一维数组中,则数组的大小应设 为。 6.按照二叉树的定义,具有3个结点的二叉树形态有种;具有65个结点的完全二叉 树其深度为; 深度为10的完全二叉树最多有个结点 7.在长度为n的顺序表的第i个位置上插入一个元素,元素的移动次数为;删除 第i个元素时,需要从前向后依次前移个元素。(1≤i≤n+1) 8. 顺序存储结构的循环队列中,设front 和rear分别为队头和队尾指示器,该队列中能存放的 最大元素的个数为M AX-1,则判断队列为满的条件为,而判断队列为空的条件是。 9. 设D={A,B,C,D,E},R={},结构(D,R)描述 的数据结构是。 10.系统出现死锁一定是同时保持了,,和 环路条件这四个必要条件。 11.操作系统通过记载、跟踪、控制进程的执行,它是进程存在的唯一 标志。作业调度程序是从处于状态的作业中选取一个作业并把它装入主存。12A.软件生命周期瀑布模型一般可分为问题分析、、、

和软件维护五个阶段。 , 得分评卷人 二、选择题(每小题1分,共10分) 1. 已知:int x; 下列语句正确的是()。 A. int *p=&x; B. int *p=x; C. int p=&x; D. int *p=*x; 2. int a[ ]={1,2,3,4,5},b[5],*p; 则下列语句中不正确的语句是()。 A. p=b+1; B.p=&a[3]; C. p=a; D.b=a; 3. 设有以下说明语句 struct node{ int a;float b;}; struct node node1,node2,*pnode; 则下列语句中正确是()。 A. node1=node2; B. pnode.a=10; C. return (node1+node2); D. scanf(“%d %f”,node1); 4. 线性链表不具有的特点是()。 A. 可随机访问任一个结点B.不必事先估计所需存储空间大小 C. 插入与删除时不必移动元素D.所需空间与线性表长度成正比 5. 若让元素1,2,3依次进栈,则出栈次序不可能出现()种情况。 A.3,2,1 B.2,1,3 C.3,1,2 D.1,3,2 6. 有向图的邻接表中,顶点Vi的出度是()。 A. 依附于Vi的弧数 B.Vi链表中的邻接结点个数 C. Vi在表结点中出现的次数 D. Vi度的一半 7. 某二叉树的先序序列和后序序列正好相反,则该二叉树一定是()的二叉树。 A.空或只有一个结点B.深度等于其结点数 C.任一分支结点均无左子树D.任一分支结点均无右子树

最新计算机软件技术基础(第三版)习题答案

第一章 1.1什么是信息?信息与数据的区别和联系在何处? 信息定义之一:信息是现实世界中存在的客观实体、现象、关系进行描述的数据。 信息定义之二:信息是经过加工后并对实体的行为产生影响的数据。 与数据的区别和联系: 数据定义:数据是现实世界客观存在的实体或事物的属性值,即指人们听到的事实和看到的景象。 我们把这些数据收集起来,经过处理后,即得到人们需要的信息。 信息和数据的关系可以归结为: 1.信息是有一定含义的数据。 2.信息是经过加工(处理)后的数据。 3.信息是对决策有价值的数据。 1.2信息有哪些基本属性? z信息的基本属性有: 1.事实性。 2.等级性。 3.可压缩性。 4.可扩散性。 5.可传输性。 6.共享性。 7.增值性和再生性。 8.转换性。 1.3计算机的主要特点是什么? 计算机最主要的特点是: 1.高速自动的操作功能。 2.具有记忆的能力。 3.可以进行各种逻辑判断。 4.精确高速的计算能力。 1.5完整的计算机系统应该包括哪几部分? 目前最完整的计算机系统学说认为由五部分组成: 1.人员 2.数据 3.设备 4.程序 5.规程 1.6什么是计算机硬件?什么是计算机软件? 硬件:泛指实际存在的物理设备,包括计算机本身及其外围设备。 微型计算机的硬件系统:主机、外存储器、输入设备、输出设备、微机的系统总线。 软件:是指计算机程序、方法、规则的文档以及在计算机上运行它时所必须的数据。 计算机软件一般分为系统软件和应用软件。 1.8 软件技术发展的几个阶段各有什么特点?它与硬件的关系如何? 第一阶段:高级语言阶段 特点:这一时期,编译技术代表了整个软件技术,软件工作者追求的主要目的是设计和实现在控制结构和数据结构方面表现能力强的高级语言。但在这一时期内,编译系统主要是靠手工编制,自动化程度很低。 硬件关系:此时期计算机的硬件要求仅能用机器指令来编制可运行的程序。

2020年春季考试《计算机软件技术基础(1)》在线考核试题_13.doc

1.有一函数Function F(ByVal a As Integer, ByVal b As Integer) As Integer,()在调用时将发生错误。 A.Call F(1, 2) B.Y = F(F(2, 3), 4) C.Z = F(2.3, 5) D.X = F(3) 【参考答案】: D 2.表达式1.5 + 3 \ 2 > 2 Or 7 Mod 3 < 4 的运算结果是()。 A.True B.0 C.1 D.False 【参考答案】: A 3.结构化程序设计所规定的三种基本控制结构是(?)。 A.输入、处理、输出 B.树形、网形、环形 C.顺序、选择、循环 D. 主程序、子程序、函数 【参考答案】: C 4.int(198.555*100+0.5)/100的值()。 A.是198 B.是199.6 C.是198.56 D.是200 【参考答案】: C 5.加载窗体时触发的事件是( )。 A.Click B.Load C.Gotfocus D.DoubleClick 【参考答案】: B 6.下面叙述不正确的是()。 A.一个控件只能有一个事件处理过程 B.用户与应用交互可以触发事 件 C.Visual https://www.360docs.net/doc/a27710943.html, 是集成了事件驱动的编程模型 D.即使用户与应用程序不进行交互,有些事件也可能发生 【参考答案】: A

7.设X=lO,y=7,表达式x\6+y*3的值为()。 A.24 B.22 C.25 D.0 【参考答案】: B 8.鼠标的移动触发()事件。 A.Click B.Mousedown C.MouseUp D.MouseMove 【参考答案】: D 9.在https://www.360docs.net/doc/a27710943.html,窗体第一次显示之前,下列()窗体事件发生。 A.Activated B.GotFocus C.Click D.Load 【参考答案】: D 10.文本框的( )属性用于设置或返回文本框中的文本内容。 A.Text B.(名称) C.Caption https://www.360docs.net/doc/a27710943.html, 【参考答案】: A 11.已知A$="12345678",则表达式Val(Mid(A, 1, 4) + Mid(A, 4, 2))的值为 ()。 A.123456 B.123445 C.8 D.6 【参考答案】: B 12.DrawArc方法绘制的图形是()。 A.圆 B.椭圆 C.弧 D.扇形 【参考答案】: C

软件技术基础--上机实验三

姓名:吴振国学号:2011019190006 上机实验三 题目一: 一、程序流程说明 (1)创建一个链栈,(2)编写输出,进栈出站函数,(3)编写主函数 二、程序代码 #include #include #define LEN sizeof(node_type) typedef struct node { int data; struct node *next; }node_type; typedef struct { node_type *top; int length; }lstack_type; lstack_type *create_list(void) { lstack_type *p;

p=(lstack_type *)malloc(sizeof(lstack_type)); p->top=NULL; p->length=0; return(p); } void print(node_type *head) { node_type *p; printf("Now ,those records are:\n"); p=head; if(head!=NULL) { do{ printf("%4d",p->data); p=p->next; } while(p!=NULL); } } int push(lstack_type *lp, int x) { node_type *p; p=(node_type *)malloc(LEN);

if(p!=NULL) { p->data = x; p->next = lp->top; lp-> top = p; lp->length++; return(1); } else return(0); } int pop(lstack_type *lp) { node_type *p; int x; if(lp->top==NULL){ printf("stack is underflow"); return(0); } else{ x = lp->top->data; p = lp->top; lp->top = lp->top->next; lp->length--;

VB软件技术基础模拟题及参考答案

软件技术基础模拟试题(第二十次省统考) 1、是非判断题(正确选填A,错误选填B)(每小题1分,共10 分) 1、数据元素是数据的基本单位,数据项是数据的最小单位。( ) 2、栈是特殊的线性表,须用一组地址连续的存储单元来存储其元素。( ) 3、引入虚拟存储技术后,逻辑内存总容量是由地址总线的位置确定的。( ) 4、编译程序是一种常用应用软件。( ) 5、顺序文件和链接文件的长度都可以动态变化。( ) 6、在文件系统中采用目录管理文件。( ) 7、允许多用户在其终端上同时交互地使用计算机的操作系统称为实时系统。( ) 8、程序、数据、和进程控制块是构成一个进程的三要素。( ) 9、黑盒测试时,既要考虑程序的内部逻辑结构又要考虑其外部特性。( ) 10、软件的总体设计和详细设计都要用PAD图形工具。( ) (参考答案:1~10:ABABB ABABB) 2、单项选择题:(每小题1分,共5分) 1、允许用户把若干作业提交计算机系统集中处理的操作系统称为 ( )。  A 分时操作系统 B 实时操作系统 C 网络操作系统 D 批处理操作系统 2、分配到必要资源并获得了处理机时的进程的状态称为( )。  A 就绪状态 B 执行状态 C 等待状态 D 阻塞状态3、利用通道技术可以在( )之间直接交换数据。  A 内存与CPU B CPU与外设 C 内存与外设 D 内存、CPU和外设三者 4、以下的准则中哪个不是软件设计的准则( )。  A 编程语言选择准则 B 信息屏蔽准则  C 结构化和模块化准则 D 抽象准则 5、有一数列:97 65 76 13 29 49 58 经过一趟排序后得到: 65 97 13 76 29 49 58 请问使用的是何种排序方法?( )  A 简单插入排序 B 冒泡排序 C 2路归并排序 D 快速排序 (参考答案:DBCAC )

计算机软件技术基础课后题答案

数据结构习题答案 第一节概论 一、选择题 1.要求同一逻辑结构的所有数据元素具有相同的特性,这意味着( )。 A.数据元素具有同一的特点 *B.不仅数据元素包含的数据项的个数要相同,而且对应数据项的类型要一致 C.每个数据元素都一样 D.数据元素所包含的数据项的个数要相等 2.数据结构是一门研究非数值计算的程序设计问题中计算机的( (1) )以及它们之间的( (2) )和运算的学科。 (1) A.操作对象 B.计算方法 *C.物理存储D.数据映像 (2) A.结构 *B.关系 C.运算 D.算法3.数据结构被形式地定义为(D,R),其中D是( (1) )的有限集合,R是D上( (2) )的有限集合。 (1) A.算法 *B.数据元素 C.数据操作D.逻辑结构 (2)A.操作 B.映像 C.存储 *D.关系4.在数据结构中,从逻辑上可以把数据结构分为( )。A.动态结构和静态结构 B.紧凑结构和非紧凑结构*C.线性结构和非线性结构 D.部结构和外部结构5.线性表的顺序存储结构是一种( )的存储结构。

*A.随机存取 B.顺序存取 C.索引存取 D.Hash 存取 6.算法分析的目的是( )。 A.找出数据结构的合理性 B.研究算法中的输入和输出的关系 *C.分析算法的效率以求改进 D.分析算法的易懂性和文档性 7.计算机算法指的是( (1) ),它必须具备输入、输出和( (2) )等五个特征。 (1) A.计算方法 B.排序方法 *C.解决某一问题的有限运算序列 D.调度方法 (2) A.可行性、可移植性和可扩充性 *B.可行性、确定性和有穷性 C.确定性,有穷性和稳定性 D.易读性、稳定性和安全性 8.线性表若采用链表存储结构,要求存中可用存储单元的地址( )。 A.必须是连续的 B.部分必须是连续的 C.一定是不连续的 *D.连续不连续都可以 9.在以下的叙述中,正确的是( )。 A.线性表的线性存储结构优于链式存储结构*B.二维数组是它的每个数据元素为一个线性表的线性表 C.栈的操作方式是先进先出 D.队列的操作方式是先进后出 10.根据数据元素之间关系的不同特性,以下四类基本的逻辑结构反映了四类基本的数据组织形式,其中解释错误的是( )。

《计算机软件技术基础》试题答案

《计算机软件技术基础》试题 1.线性表的链式存储结构与顺序存储结构相比优点是 CD 。 A. 所有的操作算法实现简单 B. 便于随机存取 C. 便于插入和删除 D. 便于利用零散的存储器空间 2.线性表是具有n 个 C 的有限序列。 A. 表元素 B. 字符 C. 数据元素 D. 数据项 E. 信息项 3.若长度为n 的线性表采用顺序存储结构,在其第I 个位置插入一个新元素的算法的时间复杂度为 C 。(1≤I ≤n+1) A. O(0) B. O(1) C. O(n) D. O(n 2 ) 4.设A 是一个线性表(a 1,a 2,…,a n ),采用顺序存储结构,则在等概率的前提下,平均每插入一个元素需要移动的元素个数为 B ,平均每删除一个元素需要移动的元素个数为 A ;若元素插在a i 与a i+1之间(0≤I ≤n-1)的概率为 ) 1() (2+-n n i n ,则平均每插入一个 元素所要移动的元素个数为 C ; A. 21 -n B. 2n C. 3 12+n D. 4 13+n 5.下列函数中,按它们在∞→n 时的无穷大阶数,最大的是 D 。 A. log n B. nlog n C. 2n/2 D. n!

6.将下图所示的s所指结点加到p所指的结点之后,其语句应为: D 。 A. s->next=p+1; p->next=s; B. (*p).next=s; (*s).next=(*p).next; C. s->next=p->next; p->next=s->next; D. s->next=p->next; p->next=s; 7.将两个各有n个元素的有序表归并为一个有序表时,其最少的比较次数是 A 。 A. n B. 2n-1 C. n-1 D. 2n 8.下面的程序段是合并两个无头结点链表(ha和 hb)为一个无头结点链表ha的过程,作为参数的两个链表都是按结点的data域由大到小链接的。合并后新链表的结点仍按此方式链接。请填写下述空框,使程序能正确运行。 1. #define NULL 0 typedef struct node{ int data; struct node *next; }node, linklisttype; void combine(linklisttype *ha, linklisttype *hb){ linklisttype *h, *p; h = (linklisttype *)malloc(sizeof(linklisttype)); h->next = NULL; p = h;

相关文档
最新文档