zoukankan      html  css  js  c++  java
  • 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[]numbitem分别是整型数组、数组元素个数、某一整数,程序功能是遍历数组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 在常量区, 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]!=''; 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("
    ");
    }
    

    3.2  编写一个函数,使之能完成以下功能:利用递归方法找出一个数组中的最大值和最小值,要求递归调用函数的格式如下:MinMaxValue(arr,n,&max,&min),其中arr是给定的数组,n是数组的个数,maxmin分别是最大值和最小值。(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
    ",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
    ",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
    ",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=='
    ')
            {
                row++;
                fprintf(fp2,"行号:%d",row);
                fprintf(fp2,"
    ");
    
            }
            else
            {
                putc(ch,fp2);
            }
            fclose(fp2);
        }
        fclose(fp1);
        return count;
    }
    
    int main()
    {
        int sum=exam();
        printf("Sum=%d
    ",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("文件不能打开!
    "); // 当前目录不存在 file1.txt 文件 或者 该文件损坏
            exit(0);
        }
        if(fp2== NULL)
        {
            printf("文件不能打开!
    ");
            exit(0);
        }
    
        while( (c=fgetc(fp1)) != EOF )
        {
            if(c!=' ')
                count++;
            if(c=='
    ')
            {
                row++;
                fprintf(fp2,"行号:%d",row);
            }
            fputc(c,fp2);
        }
        
        fclose(fp1);
        fclose(fp2);
        printf("count=%d,row=%d
    ",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!='
    '))
                count++;
            fputc(ch,fout); //复制到文件中
            if(ch=='
    ')
                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("空间申请失败!
    ");
            return NULL;
        }
    
        head->val=NULL;
        head->next=NULL;
    
        printf("请输入结点数目:
    ");
    
        scanf("%d",&len);
    
        printf("
    
    ");
    
        for(i=0; i<len; i++)
        {
            p = (struct node*)malloc( sizeof(struct node) );
    
            if(p==NULL)
            {
                printf("空间申请失败!
    ");
                return NULL;
            }
    
            printf("请输入第%d个结点的值:
    ", 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("链表为空!
    ");
            return ;
        }
    
        while(p!=NULL)
        {
            printf("%d ",p->val);
            p=p->next;
        }
    
        printf("
    ");
    }
    
    
    void main()
    {
        struct node *head;
    
        head = createList();
    
        printf("
    链表创建完成并遍历输出:
    
    ");
    
        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	",p->data);
            p=p->next;
        }
    }
    int main()
    {
        struct sList *p,*newhead,*p1;
        ShowList(creat());
        printf("
    ");
        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("
    ");
        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("格式:第一行数据的个数,第二行,输入数据空格隔开
    ");
        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
    ",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
    ",judge(p));
        fclose(fin);
    }

    3.6  将输入的一个数质因分解,如Input 90Print: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("
    ");
            }
        }
        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("
    ");
    }

    3.7  

    方法一:

    # include <stdio.h>
    
    void main()
    {
        float sum=1, sum1=1, sum2=1, sum3, x;
    
        int i, n, flag=-1;
    
        printf("请输入x的值:
    ");
        scanf("%f", &x);
    
        printf("请输入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
    ", 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;
    }
  • 相关阅读:
    通过HttpListener实现简单的Http服务
    WCF心跳判断服务端及客户端是否掉线并实现重连接
    NHibernate初学六之关联多对多关系
    NHibernate初学五之关联一对多关系
    EXTJS 4.2 资料 跨域的问题
    EXTJS 4.2 资料 控件之Grid 那些事
    EXTJS 3.0 资料 控件之 GridPanel属性与方法大全
    EXTJS 3.0 资料 控件之 Toolbar 两行的用法
    EXTJS 3.0 资料 控件之 combo 用法
    EXTJS 4.2 资料 控件之 Store 用法
  • 原文地址:https://www.cnblogs.com/pam-sh/p/12609679.html
Copyright © 2011-2022 走看看