2016年計算機軟體水平測試一年有兩次考試機會,同學們參考了嗎?下面本站小編為大家分享的是計算機軟考程式設計師模擬試題,希望對大家備考有所幫助!
●試題一
閱讀下列函式說明和C程式碼,把應填入其中n處的字句寫在答卷的對應欄內。
【函式1.1說明】
函式strcpy(char*to,char*from)將字串from複製到字串to。
【函式1.1】
void strcpy(char*to,char*from)
{while( (1) );}
【函式1.2說明】
函式merge(int a[ ],int n,int b[ ],int m,int *c)是將兩個從小到大有序陣列a和b複製合併出一個有序整數序列c,其中形參n和m分別是陣列a和b的元素個數。
【函式1.2】
void merge(int a[ ],int n,int b[ ],int m,int *c)
{ int i,j;
for(i=j=0;i
*c++=a[i]
while( (2) )*c++=a[i++];
while( (3) )*c++=b[j++];
}
【函式1.3說明】
遞迴函式sum(int a[ ],int n)的返回值是陣列a[ ]的前n個元素之和。
【函式1.3】
int sum(int a[ ],int n)
{ if(n>0)return (4) ;
else (5) ;
}
●試題二
閱讀下列函式說明和C程式碼,將應填入(n)處的字句寫在答題紙的對應欄內。
【說明】
該程式執行後,輸出下面的數字金字塔
【程式】
#include
main ()
{char max,next;
int i;
for(max=′1′;max<=′9′;max++)
{for(i=1;i<=20- (1) ;++i)
printf(" ");
for(next= (2) ;next<= (3) ;next++)
printf("%c",next);
for(next= (4) ;next>= (5) ;next--)
printf("%c",next);
printf("n");
}
}
●試題三
閱讀下列函式說明和C程式碼,將應填入(n)處的字句寫在答題紙的對應欄內。
【說明】
函式diff的功能是:根據兩個由整數(都大於-32768)按升序構成的單鏈表L1和L2(分別由A,B指向)構造一個單鏈表L3(由*r指向),要求L3中的所有整數都是L1,並且不是L2中的整數,還要求L3中的所有整數都兩兩不等。
【函式】
#include
C.h>
typedef struct node{
int d;
struct node *next
}Node;
void diff(Node *A,Node *B,Node **r)
{
int lastnum;
Node*p;
*r=NULL;
if(!A)return;
while( (1) )
if(A->dd)
{
lastnum=A->d;
p=(Node*)malloc(sizeof(Node));
p->d=lastnum;
p->next=*r; (2) ;
do
A=A->next;
while( (3) );
}
else if(A->d>B->d)
B=B->next;
else{
(4) ;
lastnum=A->d;
while (A && A->d==lastnum)A=A->next;
}
while(A)
{
lastnum=A->d;
p=(Node*)malloc(sizeof(Node));
p->d=lastnum;
(5) ;
*r=p;
while (A && A->d==lastnum) A=A->next;
}
}
●試題四
閱讀下列程式說明和C程式碼,將應填入(n)處的字句寫在答題紙的對應欄內。
【說明】
本程式從若干個原始檔案合併成的合併檔案中恢復出其中一個或全部原始檔案。所有檔案均作為二進位制檔案進行處理。合併檔案中先順序儲存各原始檔案,然後順序儲存各原始檔案的控制資訊,即檔名、檔案長度和在合併檔案中的位置(偏移量 )。其結構為:
typedef struct{char fname [256]/*原始檔名*/
long length;/*原始檔案長度(位元組數)*/
long offset;/*原始檔案在合併檔案中的位置(偏移量)*/
}FileInfo;
在合併檔案最後儲存如下一個特殊的標誌資訊作為合併檔案的結束標記:
FileInfo EndF1ag={"Combined File",0,_offset};
其中_offset是第一個原始檔案的控制資訊在合併檔案中的位置(偏移量)。
啟動本程式的'命令列的格式是:
程式名合併檔名[原始檔名]
如果不指定原始檔名,預設恢復合併檔案中的所有原始檔案。
程式中涉及的部分檔案操作的庫函式簡要說明如下:
int fread (void *buffer,int size,int count,FILE *fbin):從二進位制檔案流fbin中讀取count塊長度為size位元組的資料塊到buffer指向的儲存區。返回值為實際讀取的資料塊數。
int fwrite(void *buffer,int size,int count,FILE *fbin):各引數和返回值的意義與fread相同,但對檔案進行寫操作。
int fseek(FILE *fbin,long offset,int position):將檔案流fbin的讀/寫位置以position為基準移動offset位元組。position的值可以是SEEK_SET(檔案頭),SEEK_CUR(當前位置),SEEK_END(檔案尾);offset為正,表示向檔案尾方向移動,為負表示向檔案頭方向移動,為零表示到基準位置。
long ftell(FILE *fbin):返回檔案流fbin的當前讀/寫位置(相對於檔案頭的偏移量)。上述偏移量均以位元組為單位,即偏移位元組數。
【程式】
#include
#include
typedef struct{char fname[256];long length;long offset;
}FileInfo;
void copyfile(FILE *fin,FILE *fout,int fsize)
{char buf[1024];int siz=1024;
while(fsize !=0){/*每次複製siz個位元組,直至複製完fsize個位元組*/
if(siz >fsize) (1) ;
fread(buf,1,siz,fin);fwrite(buf,1,siz,fout);
fsize= (2) ;}
}
int dofile(FILE *fin,FileInfo *inp)
{ long offset;
FILE *fout;
if((fout=fopen(inp->fname,"wb"))==NULL){
printf("建立檔案錯誤:%sn",inp->fname);
return 1;
}
offset= (3) ;/*保留合併檔案讀/寫位置*/
fseek( (4) );/*定位於被恢復檔案首*/
copyfile(fin,fout,inp->length);
fclose(fout);
printf("n---檔名:%n檔案長:%1d.
n",inp->fname,inp->length);
(5) ;/*恢復合併檔案讀/寫位置*/
return 0;
}
int main(int argc,char *argv[])
{FileInfo finfo;
char fname[256];FILE *fcmbn;
if(argc<2){printf("輸入合併檔名:");scanf("%s",fname);}
else strcpy(fname,argv[1]);
if((fcmbn=fopen(fname,"rb"))==NULL){
printf("檔案開啟錯誤:%sn",fname);return 1;
}
fseek(fcmbn,-sizeof(FileInfo),SEEK_END);/*定位於合併檔案末尾的標誌資訊*/
fread(&finfo,1,sizeof(FileInfo),fcmbn);
if(th!=0 || strcmp(e,"CombinedFile")){
printf("指定的檔案不是合法的合併檔案n");
fclose(fcmbn);return 2;
}
fseek(fcmbn,et,SEEK_SET);/*定位於首個原始檔案的控制資訊*/
for(;;){/*恢復一個(argc>2)或全部(argc=2)原始檔案*/
fread(&finfo,1,sizeof(FileInfo),fcmbn);
if(th==0)break;
if(argc>2 && strcmp(e,argv[2]))continue;
if(dofile(fcmbn,&finfo)!=0)break;
}
fcolse(fcmbn);return 0;
}