1. 程式人生 > >C 2012年筆試題(保)

C 2012年筆試題(保)

 

1 程式改錯

1.1 下面程式段的功能是交換兩個字元陣列的內容(每個字串字元數均不超過100)  (8分)   【 見2012年筆試題1.1】

void StrSwap(char *pa,char *pb)
{		char *temp;
		temp = pa;
		pa = pb;
		pb = temp;
}

分析:該程式中pa,pb兩個字元指標變數只是形式引數,剛開始pa指向陣列pa[100]的的首元素,指向pb[100]首元素;交換後pa指向陣列pb[100]的的首元素,指向pa[100]首元素;而且該程式段執行結束後pa,pb兩個變數由記憶體回收,因此最後兩個字元陣列的內容沒有改變。

改正:

方法一:

void copy(char *pa,char *pb)
{
    while(*pb!=0)
    {
        *pa=*pb;
         pa++;
         pb++;
    }
    *pa=0;
}
void StrSwap(char *pa,char *pb)
{
    char temp[100];
    copy(temp,pa);
    copy(pa,pb);
    copy(pb,temp);
}

方法二:

void swap (char *pa ,char *pb )
{
    if(strlen(pa)!=strlen(pb))exit(-1);  //若長度不一致,則返回
    char tmp;
    int i=-1;
    while(pa[++i])
    {
        tmp=pa[i];
        pa[i]=pb[i];
        pb[i]=tmp;
    }
}

方法三:

void swap (char *pa ,char *pb )
{
    if(strlen(pa)!=strlen(pb))exit(-1);
    char tmp[100];
    strcpy(tmp,pa);
    strcpy(pa,pb);
    strcpy(pb,tmp);
}

1.2 程式段如下  【 見2012年筆試題1.2】

char a[] = “House”;
char *b = “House”;
b[2] = ‘r’; 
a[2] = ‘r’;
b = a;
b[2] = ‘r’;

分析: 

b[2] = ‘r’; //不能對字元常量賦值

a = b;  a是一個地址常量,不能把地址賦給一個常量

2 簡答題

2.1下面程式中,arr[]、numb、item分別是整型陣列、陣列元素個數、某一整數,程式功能是遍歷陣列arr,查詢與item相等的元素,並輸出該元素的下標。但是此程式不嚴謹,請問它可能導致什麼樣的異常結果?為什麼?(5分)    【 見2012年筆試題2.1】

for(numb = 0;arr[numb] != item;numb --);
printf(“%d”,numb);

問題:只能遍歷首元素,之後陣列下標會越界,而且最多隻能找到一個。

修改:

for(  ; numb>0 ; numb--)
     if( arr[numb-1] == item)
        printf("%d ",numb-1);

2.2 下面程式段中各個常量、變數分別儲存在記憶體中的什麼位置、各按什麼樣的順序儲存、各佔多少個位元組?(提示:整型變數佔2個位元組,字元佔1個位元組,指標佔4個位元組)(10分)

【見2015年筆試題】

int k;  //全域性未初始化區
void main()  //棧區(stack),存放函式的引數值,區域性變數的值等
{
char *p = “hello”;  //hello\0 在常量區, p在棧區
char q[]= ”hello”;  //hello 在常量區, q在棧區

char ch;   // 棧
int k;   // 棧
func(k); 
}
void func(int m) // 棧
{
int n; // 棧
	 ……
}

2.3在呼叫函式時,如果形參和實參分別是下列情況,則相應的呼叫方式是什麼?(5分)   【見2012年筆試題2.3】

(1) 實參和形參都是陣列元素   //傳值呼叫(值傳遞)

(2) 形參是指標  //傳地址呼叫(地址傳遞)

(3) 實參和實參都是陣列  //傳地址呼叫(地址傳遞)

3  程式設計題(共60分)

3.1 編寫一個函式,使之能完成以下功能:把一個字串逆序排列。(10分)

 方法一:

#include "stdio.h"
#include "string.h"
void reverse(char str[])
{
    char ch;
    int i,l=strlen(str);
    for(i=0; i<l/2; i++)
    {
        ch=str[i];
        str[i]=str[l-i-1];
        str[l-i-1]=ch;
    }
}
int main()
{
    char ss[]="abcdefg";
    reverse(ss);
    printf("%s",ss);
    return 0;
}

方法二:

# include <stdio.h>
# include <string.h>

int  change(char *str)
{
    int i,len=0;
    char c;
    for( ; str[len]!='\0'; len++); //求字串長度
    for(i=0; i<len/2; i++)
    {
        c=str[i];
        str[i]=str[len-i-1];
        str[len-i-1]=c;
    }
    return len;
}

void main()
{
    int i,len;
    char str[20];
    printf("請輸入一個字串:");
    gets(str);
    len=change(str);
    printf("將字串中的字元互換輸出為:");

    for(i=0; i<len; i++)
    {
        printf("%c",str[i]);
    }
    printf("\n");
}

3.2  編寫一個函式,使之能完成以下功能:利用遞迴方法找出一個數組中的最大值和最小值,要求遞迴呼叫函式的格式如下:MinMaxValue(arr,n,&max,&min),其中arr是給定的陣列,n是陣列的個數,max、min分別是最大值和最小值。(15分)  【見2015年筆試題【保】】 

方法一:

#include "stdio.h"
#define N 10

void MinMaxValue(int arr[],int n,int *max,int *min)
{
    if(n>=0)
    {
        if(*max<arr[n])
            *max=arr[n];

        if(*min>arr[n])
            *min=arr[n];

        MinMaxValue(arr,n-1,max,min);
    }
}

int main()
{
    int max=-32768,min=32767;  //int最小數就是 -32768最大數就是 32767
    int a[]= {1,54,23,65,87,12,54,87,98,233};
    MinMaxValue(a,N-1,&max,&min); //傳入地址
    printf("Max=%d,Min=%d\n",max,min);
    return 0;
}

方法二:

#include "stdio.h"
#define N 10

void MinMaxValue(int arr[],int n,int *max,int *min)
{
    if(n>0)
    {
        if(*max<arr[n])
            *max=arr[n];

        if(*min>arr[n])
            *min=arr[n];

        MinMaxValue(arr,n-1,max,min);
    }
}

int main()
{
    int a[]= {1,-8,23,65,87,12,54,887,98,233};
    int max=a[0],min=a[0];
    MinMaxValue(a,N-1,&max,&min);
    printf("Max=%d,Min=%d\n",max,min);
    return 0;
}

方法三:

#include<stdio.h>
void MinMaxValue(int arr[],int n,int *max,int *min)
{
    if(n==0) return;
    if(arr[n-1]>*max)
        *max=arr[n-1];
    if(arr[n-1]<*min)
        *min=arr[n-1];
    MinMaxValue(arr,n-1,max,min);
}
void main()
{
    int arr[]= {1,3,4,2,56,5};
    int max=arr[0],min=arr[0];
    MinMaxValue(arr,sizeof(arr)/sizeof(int),&max,&min);  //sizeof(arr)/sizeof(int)指陣列長度
    printf("%d-%d\n",max,min);
}

3.3 【檔案】編寫一個函式,使之能完成以下功能:把file1.doc的內容全部複製到file2.doc中,file1.doc中全部是字元(含空格),要求複製時,在file2.doc中的每一行都要加上行號,例如:行號*(其中“*”表示具體的數字)。最後該函式返回file1.doc中的字元個數(不包括空格)。(10分)

方法一:

#include <stdio.h>
#include <stdlib.h>

int exam()
{
    char ch;
    int count=0,row=0;
    FILE *fp1,*fp2;
    fp1=fopen("D:\file1.doc","r+");
    while(!feof(fp1))
    /*
feof是C語言標準庫函式,其原型在stdio.h中,其功能是檢測流上的檔案結束符,如果檔案結束,則返回非0值,否則返回0
    */
    {
        ch=getc(fp1);  //getc取一個字元
        fp2=fopen("D:\file2.doc ","a+");
        if(ch!=' ')
            count++;
        if(ch=='\n')
        {
            row++;
            fprintf(fp2,"行號:%d",row);
            fprintf(fp2,"\n");

        }
        else
        {
            putc(ch,fp2);
        }
        fclose(fp2);
    }
    fclose(fp1);
    return count;
}

int main()
{
    int sum=exam();
    printf("Sum=%d\n",sum);
    return 0;
}

方法二: 

# include <stdio.h>
# include <stdlib.h>

void main()
{
    FILE *fp1,*fp2;
    int count=0, row=0;
    char c;

    fp1=fopen("D:/file1.txt","r");
    fp2=fopen("D:/file2.txt","w");

    if(fp1== NULL)
    {
        printf("檔案不能開啟!\n"); // 當前目錄不存在 file1.txt 檔案 或者 該檔案損壞
        exit(0);
    }
    if(fp2== NULL)
    {
        printf("檔案不能開啟!\n");
        exit(0);
    }

    while( (c=fgetc(fp1)) != EOF )
    {
        if(c!=' ')
            count++;
        if(c=='\n')
        {
            row++;
            fprintf(fp2,"行號:%d",row);
        }
        fputc(c,fp2);
    }
    
    fclose(fp1);
    fclose(fp2);
    printf("count=%d,row=%d\n",count,row);
}

方法三:

#include<stdio.h>
void main()
{
    FILE *fin,*fout;
    int count=0,line=0;
    if(!(fin=fopen("D:/file1.txt","r")))
        printf("error");
    if(!(fout=fopen("D:/file2.txt","w")))
        printf("error");
    fprintf(fout,"行號%d ",line++);
    while(!feof(fin))
    {
        char ch=fgetc(fin);
        putchar(ch); //輸出字元到顯示輸出框
        if((ch!=' ')&& (ch!='\n'))
            count++;
        fputc(ch,fout); //複製到檔案中
        if(ch=='\n')
            fprintf(fout,"行號%d ",line++); //一行結束時,重新在複製檔案中列印行號
    }
    fprintf(fout,"總個數%d ",count--);  //最後在複製檔案中列印總個數
    printf("總個數%d ",count--);  //輸出總個數到顯示輸出框
    fclose(fin);
    fclose(fout);
}

3.4 編寫一個完整的程式,使之能完成以下功能:從鍵盤中輸入若干個整數,用連結串列儲存這些輸入的數,並要求儲存的順序與輸入的順序相反。(10分) 【見2016年筆試題4.4】

方法一:

# include <stdio.h>
# include <malloc.h>

struct node
{
    int val;
    struct node *next;
};


//建立連結串列
struct node*  createList()
{
    struct node *head,*p;
    int i,len,val;

    //建立頭結點
    head = (struct node*)malloc( sizeof(struct node) );

    if(head==NULL)
    {
        printf("空間申請失敗!\n");
        return NULL;
    }

    head->val=NULL;
    head->next=NULL;

    printf("請輸入結點數目:\n");

    scanf("%d",&len);

    printf("\n\n");

    for(i=0; i<len; i++)
    {
        p = (struct node*)malloc( sizeof(struct node) );

        if(p==NULL)
        {
            printf("空間申請失敗!\n");
            return NULL;
        }

        printf("請輸入第%d個結點的值:\n", i+1);

        scanf("%d",&val);
        // 頭插法建表
        p->val=val;

        p->next = head->next;

        head->next=p;

    }

    return head;
}
//連結串列輸出
void  traverse(struct node *head)
{
    struct node *p=head->next;
    if(p == NULL)
    {
        printf("連結串列為空!\n");
        return ;
    }

    while(p!=NULL)
    {
        printf("%d ",p->val);
        p=p->next;
    }

    printf("\n");
}


void main()
{
    struct node *head;

    head = createList();

    printf("\n連結串列建立完成並遍歷輸出:\n\n");

    traverse(head);

}

方法二:

#include "stdio.h"
#include "stdlib.h"
struct sList
{
    int data;
    struct sList *next;
};
struct sList *head=NULL;
struct sList *creat() //建立連結串列
{
    int n;
    struct sList *p,*q;//q new
    head=(struct sList *)malloc(sizeof(struct sList));
    head->next=NULL;
    p=head;
    while(1)
    {
        printf("(0結束)n=");
        scanf("%d",&n);
        if(n<=0) break;
        else
        {
            //尾插法,順序接收
            q=(struct sList *)malloc(sizeof(struct sList));
            q->data=n;
            p->next=q;
            q->next=NULL;
            p=q;
        }
    }
    return head;
}
void ShowList(struct sList *head) //顯示連結串列
{
    struct sList *p=head->next;
    while(p!=NULL)
    {
        printf("%d\t",p->data);
        p=p->next;
    }
}
int main()
{
    struct sList *p,*newhead,*p1;
    ShowList(creat());
    printf("\n");
    p=head->next;
    newhead=head;
    //連結串列倒置
    newhead->next=NULL;
    while(p!=NULL)
    {
        p1=p;
        p=p->next;
        p1->next=newhead->next;
        newhead->next=p1;
    }
    head=newhead;
    printf("\n");
    ShowList(head);
    return 0;
}

方法三:

#include<stdio.h>
#include<malloc.h>
struct Node
{
    struct Node*next;
    int data;
};
void main()
{
    int i=0,n;
    struct Node *head,*p;
    printf("格式:第一行資料的個數,第二行,輸入資料空格隔開\n");
    scanf("%d",&n);
    head=malloc(sizeof(struct Node));
    head->next=NULL;
    for(; i<n; i++)
    {
        int temp;
        scanf("%d",&temp);
        p=malloc(sizeof(struct Node));
        p->data=temp;
        //頭插法
        p->next=head->next;
        head->next=p;
    }
    //列印輸出
    p=head->next;
    while(p)
    {
        printf("%d\n",p->data);
        p=p->next;
    }
}

3.5 【檔案+堆疊】編寫一個完整的程式,使之能完成以下功能:一段名為file.c的程式,該程式中含有括號,現要檢查程式中的括號是否配對,提示:利用堆疊實現。(15分)  【見2015年筆試題【保】6】

程式碼:

#include <stdio.h>
#define Stack char
#define Max 999
int judge(char p[])
{
    int len=strlen(p);
    int top=-1,i;
    Stack s[Max];
    for(i=0; i<len; i++)
    {
        switch(p[i])
        {
        case '(':
        case '[':
        case '{':
            s[++top]=p[i];
            break;
        case ')':
            if(s[top]=='(')
                top--;
            else return 0;
            break;
        case ']':
            if(s[top]=='[')
                top--;
            else return 0;
            break;
        case '}':
            if(s[top]=='{')
                top--;
            else return 0;
            break;
        }
    }
    if(top==-1)
        return 1;  //輸出1表示匹配成功
    else
        return 0;   //輸出0表示匹配失敗
}
void main()
{
    char p[Max];
    FILE * fin;
    if(!(fin=fopen("D:/file1.txt","r")))
        printf("failed");
    while(!feof(fin))
    {
        fscanf(fin,"%s",p);
    }
    printf("%d\n",judge(p));
    fclose(fin);
}

3.6  將輸入的一個數質因分解,如Input 90,Print:90=2*3*3*5.

方法一:

#include <stdio.h>
#include <math.h>
int a[100];
//判斷是否是質數
int isPrime(int n)
{
    int i;
    for(i=2; i<=sqrt(n); i++)
        if(n%i==0)
            return 0;
    return 1;
}
int main()
{
    int i,j,in;
    while(scanf("%d",&in)&&in>-1)
    {
        if(in==0||in==1)
            printf("沒有質因數");
        else
        {
            j=0;
            printf("%d=",in);
            while(in>3)
            {
                //質數從2開始,判斷i是否是質數
                for(i=2; i<=in; i++)
                {
                    if(isPrime(i)&&in%i==0)
                        break;
                }
                in=in/i;
                //把滿足的質數存於陣列中
                a[j++]=i;
            }
            if(in>1)
                a[j++]=in;
            //輸出
            for(i=0; i<j; i++)
            {
                printf("%d",a[i]);
                if(i<j-1)
                    printf("*");
            }
            printf("\n");
        }
    }
    return 0;
}

方法二:

# include <stdio.h>

void main()
{
    int i,j,k,val;
    printf("請輸入一個正整數:");
    scanf("%d",&val);

    printf("將該正整數分解質因數輸出為: ");
    printf("%d=",val);
    //以下為演算法
    for(i=2 ; i<=val; i++)
    {
        while(val!=i)
        {
            if(val%i == 0)
            {
                printf("%d*",i);
                val=val/i;
            }
            else
                break ;
        }
    }
    printf("%d",val);
    printf("\n");
}

3.7  

方法一:

# include <stdio.h>

void main()
{
    float sum=1, sum1=1, sum2=1, sum3, x;

    int i, n, flag=-1;

    printf("請輸入x的值:\n");
    scanf("%f", &x);

    printf("請輸入n的值:\n");
    scanf("%d", &n);

    for(i=1; i<=n; i++)
    {
        sum1 = sum1*x;  //sum1為x^n
        sum2 = sum2*i;  //sum2為n!
        sum3 = sum1/sum2 * flag;  //sum3為 x^n/n!
        flag = -flag;  //變號
        sum = sum + sum3;
    }
    printf("Sum=%f\n", sum );

}

方法二:

#include "stdio.h"
#include "math.h"
int nJie(int a);
int main()
{
    int i,n,sign;
    float ex=1,temp,x,fenmu,fenzi;
    printf("n=");
    scanf("%d",&n);
    printf("x=");
    scanf("%f",&x);
    for(i=1; i<=n; i++)
    {
        fenzi=pow(x,i);//計算以x為底的i次方值
        fenmu=nJie(i);
        temp=fenzi/fenmu;
        //變號
        if(i%2==0)
            sign=1;
        else
            sign=-1;
        ex+=sign*temp;
    }
    printf("ex=%6.2f",ex);
    return 0;
}
//求a!
int nJie(int a)
{
    int i,ex=1;
    for(i=1; i<=a; i++)
        ex*=i;
    return ex;
}

#include "stdio.h"

#include "math.h"

int nJie(int a);

int main()

{

int i,n,sign;

float ex=1,temp,x,fenmu,fenzi;

printf("n=");

scanf("%d",&n);

printf("x=");

scanf("%f",&x);

for(i=1;i<=n;i++){

fenzi=pow(x,i);

fenmu=nJie(i);

temp=fenzi/fenmu;

if(i%2==0) sign=1;

else sign=-1;

ex+=sign*temp;

}

printf("ex=%6.2f",ex);

return 0;

}

int nJie(int a)

{

int i,ex=1;

for(i=1;i<=a;i++)

ex*=i;

return ex;

相關推薦

C 2012試題

  1 程式改錯 1.1 下面程式段的功能是交換兩個字元陣列的內容(每個字串字元數均不超過100)  (8分)   【 見2012年筆試題1.1】 void StrSwap(char *pa,char *pb) { char *temp;

C語言經典試題

1、請填寫bool , float, 指標變數 與“零值”比較的if 語句。 提示:這裡“零值”可以是0, 0.0 , FALSE 或者“空指標” 。例如int 變數n 與“零值”比較的if 語句為: if ( n == 0 ) if ( n

c++實現二叉樹及試題1

1.建立二叉樹2.前序遍歷<遞迴與非遞迴> 3.中序遍歷<遞迴與非遞迴> 4.後序遍歷<遞迴與非遞迴> 5.層次遍歷  6.獲得節點葉子的個數7.二叉樹獲得的高度8.二叉樹交換的左右兒子9.求兩個節點pNode1和pNode2在以[R為樹

2016阿里巴巴c/c++研發工程師線上試題選擇題

自己回憶的題目,反正就這個意思(一個六個選項,沒有全部羅列) 一個單鏈表,已知一個有倆個相鄰的結點A和B,此時有一個新結點 r,問在A結點後插入r,如何執行() A. r->ne

C/C++試題很多

微軟亞洲技術中心的面試題!!! 1.程序和執行緒的差別。 執行緒是指程序內的一個執行單元,也是程序內的可排程實體. 與程序的區別: (1)排程:執行緒作為排程和分配的基本單位,程序作為擁有資源的基本單位 (2)併發性:不僅程序之間可以併發執行,同一個

php常規試題

內容管理 www 語言 圖片 user 是否 最適 name 開始 1.如何用php的環境變量得到一個網頁地址的內容?ip地址又要怎樣得到? Gethostbyname() echo $_SERVER ["PHP_SELF"];echo $_SERVER ["SERVER_

Java試題3

scan abd bst spl 輸出 rst != first adf /** * 輸入: * safab qeabd abdfe (以空格隔開) * ab * 輸出ab出現的次數並逆序輸出含有ab的字符串 * 輸出: * 3 * a

Java試題2

spl res new void scan system.in lin () static /** * 一個物體從高h處下落,下落後會反彈到離地面高上一次下降高度的1/2,求當第m次接觸地面時走過路徑的長度 * 輸入: * 100,1

Java試題5

stat 裏的 pre 做的 靜態 string main clas 答案 class Test{ int getValue(){ static int i=0; i++; return i; } p

Java試題——執行緒安全、String、StringBuffer、StringBuilder

1.什麼是執行緒安全? 簡單地說法:執行緒安全可以簡單理解為一個方法或者一個例項可以在多執行緒環境中使用而不會出現問題。 複雜的說法:當多個執行緒訪問同一個物件時,如果不用考慮這些執行緒在執行時環境下的排程和交替執行,也不需要進行額外的同步,或者在呼叫方進行任何其他的協調操作,呼叫這個物件的

Java試題

1.以下java程式程式碼,執行後的結果是() java.util.HashMap map=new java.util.HashMap(); map.put("name",null); map.put("name","Jack"); System.out.println(map.s

Java試題

1.關於抽象類與最終類,下列說法錯誤的是?  A. 抽象類能被繼承,最終類只能被例項化  B. 抽象類和最終類都可以被宣告使用  C. 抽象類中可以沒有抽象方法,最終類中可以沒有最終方法  D. 抽象類和最終類被繼承時,方法可以被子類覆蓋   答案:

某找房網 試題

一、題目說明: 傻傻的搏鬥 小智和小春兩個遊戲菜鳥要進行電競搏鬥,小智有X點HP,每次攻擊便使對方丟失A點生命值,每次攻擊完後需要冷卻C秒,小春有Y點HP,每次攻擊會使對方丟失B點生命值,每次攻擊完後需要冷卻D秒。玩家HP小於等於0時便死亡,若小智最終存活,則輸出XIAOZHI,若

某找房網 試題

一、題目描述:  給你一個合法的算術表示式,只包含整數和加號,減號。但整數不一定都是十進位制的數,可能是八進位制,十六進位制,規定包含字首0x的是十六進位制,包含字首0的是八進位制,其他情況是十進位制。現在你能計算出這個式子的最終的值嗎? 說明:輸入的表示式式子只會是整數

No.25 經典試題:模擬實現strcpy,strcat,strcmp,strstr,memcpy

直接上程式碼: 1. //模擬實現strcpy #include <stdio.h> #include <assert.h> char* my_strcpy(char* dest, const char* src) { char* ret = dest ;

No.23 經典試題:用巨集來計算偏移量,判斷大小端聯合體法,指標法

寫一個巨集,計算結構體中某變數相對於首地址的偏移,並給出說明 判斷大小端 程式碼1: //寫一個巨集,計算結構體中某變數相對於首地址的偏移,並給出說明 //定義的這個巨集將結構體裡邊的變數的地址取出後再強轉成char型,然後進行相減。 //注意:&s ==

軟體測試工程師試題

軟體測試筆試題(答案) 判斷題1.軟體測試的目的是儘可能多的找出軟體的缺陷。(Y) 2.Beta 測試是驗收測試的一種。(Y) 3.驗收測試是由終端使用者來實施的。(N) 4.專案立項前測試人員不需要提交任何工件。(Y) 5.單元測試能發現約80%

木子網羅java試題

1.問:Java提供哪幾種運算子? 答:算術運算子、關係運算符、位運算子、邏輯運算子、賦值運算子、其他運算子。 答案相關連結 2.問:從下列選項選出java.lang包中的方法,用來比較兩個物件是否相等,相等返回true。 A.toString() B.equals() C.compare

木子網羅資料庫試題

1.問:刪除表資料,同時保留表結構,()方法比()方法效率高 A.delete B.drop table C.truncate table D.delete all 答:C,A 解析: truncate table 命令將快速刪除資料表中的所有記錄,但保留

網易遊戲試題1

題目描述: 小明是幼兒園的一名老師。某天幼兒園園長給小朋友們每人發一顆糖果,小朋友們拿到後發現有一些同學拿到的糖果顏色和自己相同,有一些同學糖果顏色和自己不同。  假定每個小朋友只知道有多少同學和自己拿到了相同顏色的糖果。  上課後,有一部分小朋友興奮的把這一結果告訴小