• C 2010年笔试题


    1 有一个函数, 写一段程序,输入的值,输出的值。

    #include <stdio.h>
    void main()
    {
        int x,y;
        printf("输入x:");
        scanf("%d",&x);
        if(x<0||x>100)        /* x<0或x>100*/
        {
            y=-1;
            printf("x=%3d,   y=%d
    " ,x,y);
        }
        else  if(x==0)        /* x=0*/
        {
            y=0;
            printf("x=%d,  y=%d
    ",x,y);
        }
        else            /* 0<x<=100 */
        {
            y=1;
            printf("x=%d,  y=%d
    ",x,y);
        }
    }

    输入3个数a,b,c,按大由到小的顺序输出  

    #include <stdio.h>
    void main ( )
    {
        float a,b,c,t;
        printf("please enter a,b,c:");
        scanf("%f,%f,%f",&a,&b,&c);
        if(a<b)
        {
            t=a;
            a=b;
            b=t;
        }
        if(a<c)
        {
            t=a;
            a=c;
            c=t;
        }
        if(b<c)
        {
            t=b;
            b=c;
            c=t;
        }
        printf("%7.2f%7.2f%7.2f
    ",a,b,c);
    }

    3  输入4个数,输出4个数中的最大值、最小值。

    #include <stdio.h>
    void main()
    {
        float  t,a,b,c,d;
        printf("请输入四个数:");
        scanf("%f,%f,%f,%f",&a,&b,&c,&d);
        if (a<b)
        {
            t=a;
            a=b;
            b=t;
        }
        if (a<c)
        {
            t=a;
            a=c;
            c=t;
        }
        if (a<d)
        {
            t=a;
            a=d;
            d=t;
        }
        if (b<c)
        {
            t=b;
            b=c;
            c=t;
        }
        if (b<d)
        {
            t=b;
            b=d;
            d=t;
        }
        if (c<d)
        {
            t=c;
            c=d;
            d=t;
        }
        printf("最大值和最小值分别为: 
    ");
        printf("max=%5.2f   min=%5.2f",a,d);
    }

    输入成绩,要求输出成绩等级A、B、C、D、E或error。90分以上为‘A’,80~89分为‘B’,70~79分为‘C’,60~69分为‘D’,0~60分为‘E’。若输入成绩低于0分和高于100分则输出error。  

    #include <stdio.h>
    void main()
    {
        float score;
        char grade;
        printf("请输入学生成绩:");
        scanf("%f",&score);
        if (score>100||score<0)
            printf("error
    ");
        else
        {
            switch((int)(score/10))
            {
            case 10:
            case 9:
                grade='A';
                break;
            case 8:
                grade='B';
                break;
            case 7:
                grade='C';
                break;
            case 6:
                grade='D';
                break;
            case 5:
            case 4:
            case 3:
            case 2:
            case 1:
            case 0:
                grade='E';
            }
            printf("成绩是 %5.1f,相应的等级是%c.
     ",score,grade);
        }
    }

    有一个函数:写一段程序,输入x的值,输出y的值。

    #include <stdio.h>
    void main()
    {
        int x,y;
        printf("输入x:");
        scanf("%d",&x);
        if(x<1)               /* x<1 */
        {
            y=x;
            printf("x=%3d,   y=x=%d
    " ,x,y);
        }
        else  if(x<10||x>10)        /* 1=<x<10 */
        {
            y=2*x-1;
            printf("x=%d,  y=2*x-1=%d
    ",x,y);
        }
        else            /* x>=10  */
        {
            y=3*x-11;
            printf("x=%d,  y=3*x-11=%d
    ",x,y);
        }
    }

    6  输出300~400之间的全部素数,并按每行5个数输出。

    方法一:

    #include "stdio.h"
    #include"math.h"
    void main()
    {
        int prime(int);
        int i,k,m;
        printf("300~400之间的素数为:
    ");
        for(i=300; i<=400; i++)
        {
            m=prime(i);
            if(m==1)
            {
                k++;
                printf("%5d",i);
                if(k%5==0)
                    printf("
    ");
            }
        }
    }
    /*判断是否是素数
    
    素数又称质数。所谓素数是指除了1和它本身以外,不能被任何整数整除的数,例如17就是素数,因为它不能被2~16的任一整数整除。
    
    思路1):因此判断一个整数m是否是素数,只需把m被 2 ~ m-1 之间的每一个整数去除,如果都不能被整除,那么m就是一个素数。
    
    思路2):另外判断方法还可以简化。m不必被 2 ~ m-1 之间的每一个整数去除,只需被 2 ~ √m  之间的每一个整数去除就可以了。如果m不能被 2 ~ √m 间任一整数整除,m必定是素数。例如判别17是是否为素数,只需使17被2~4之间的每一个整数去除,由于都不能整除,可以判定17是素数。
    
    原因:因为如果m能被 2 ~ m-1 之间任一整数整除,其二个因子必定有一个小于或等于,另一个大于或等于。例如16能被2,4,8整除,16=2*8,2小于4,8大于4,16=4*4,4=√16,因此只需判定在2~4之间有无因子即可。
    
    */
    int prime(int i)
    {
        int j,flag=1;
        for(j=2; j<=sqrt(i); j++)
            if(i%j==0)
                flag=0;
        return(flag);
    }

    方法二:

    # include <stdio.h>
    # include <math.h>
    void main()
    {
        int m,k,i,n=0;
        for(m=300; m<=400; m=m+1)
        {
            k=sqrt(m);
            for (i=2; i<=k; i++)
                if (m%i==0) break;
            if (i>=k+1)
            {
                printf("%d ",m);
                n=n+1;
            }
            //每五个一行输出
            if(n%5==0) printf("
    ");
        }
        printf ("
    ");
    }

    7Fibonacci数列的前20个数,并将其分5行输出

    扩展:求 F(0)=0,F(1)=1,F(n)=F(n-1)+F(n-2)(n≥2,n∈N*)

    #include <stdio.h>
    #include <stdlib.h>
    
    int fun(int x)
    {
        if(x == 0 || x == 1)
            return 1;
        if(x > 1)
            return fun(x - 1)+fun(x - 2);
    }
    void main()
    {
        int n,f;
        printf("请输入n:");
        scanf("%d",&n);
        f = fun(n);
        printf("%d",f);
    }
    #include<stdio.h>
    
    int main()
    {
        int i;
        int f[20] = { 1,1 };
        for (i = 2; i < 20; i++)
            f[i] = f[i - 2] + f[i - 1];
        //打印输出
        for (i = 0; i < 20; i++)
        {
            if(i%5==0)
                printf("
    ");
            printf("%d	",f[i]);
        }
        return 0;
    }

    8 求(1!+3)+(2!+3)+(3!+3)+......+(n!+3)

    #include <stdio.h>
    
    void main()
    {
        double t=1,sum=0;
        int n,i;
        printf("输入n:");
        scanf("%d",&n);
        for (i=1; i<=n; i++)
        {
            t=t*i; //求n!
            sum=t+3+sum;
        }
        printf("1!+3+...+%d!+3=%f
    ",n,sum);
    }

    9  有一分数序列,求其前20项的和

    #include <stdio.h>
    void main()
    {
        int i,n=20;
        double a=2,b=1,s=0,t;
        for (i=1; i<=n; i++)
        {
            //a是分母,b是分子
            s=s+b/a;  //
            t=a,
            a=a+b,
            b=t;
        }
        printf("sum=%16.10f
    ",s);
    }
     

    10  输出小于500的所有的“水仙花数”,所谓“水仙花数”是指一个3位数,其各位数字立方和等于该数本身。例如,153是一个水仙花数,因为

    #include <stdio.h>
    void main()
    {
        int i,j,k,n;
        printf("parcissus numbers are ");
        for (n=100; n<500; n++)
        {
            i=n/100; //百位数
            j=n/10-i*10; //十位数
            k=n%10; //个位数
            if (n==i*i*i + j*j*j + k*k*k)
                printf("%d ",n);
        }
        printf("
    ");
    }

    11 给一个不多于6位的正整数,要求:①求出它是几位数;②分别输出每一位数字;③按逆序输出各位数字,例如原数为158,应输出851。

    #include "stdio.h"
    void main()
    {
        int n,m;
        printf("输入一个不多于六位的数字:");
        scanf("%d",&n);
        if(n<1000000&&n>99999)
            printf("它是六位数
    ");
        if(n<100000&&n>9999)
            printf("它是五位数
    ");
        if(n<10000&&n>999)
            printf("它是四位数
    ");
        if(n<1000&&n>99)
            printf("它是三位数
    ");
        if(n<100&&n>9)
            printf("它是二位数
    ");
        if(n<10&&n>=0)
            printf("它是一位数
    ");
        printf("各位数字按逆序输出为:
    ");
        while(n!=0)
        {
            m=n%10;
            n=n/10;
            printf("%3d",m);
        }
    }

    12 5+55+555+5555+55555的值。

    #include <stdio.h>
    void main()
    {
        int  a=5,n=5,i=1,sn=0,tn=0;
        for(i=1; i<=n; i++)
        {
            tn=tn+a;  /*赋值后的tn为i个 a组成数的值*/
            sn=sn+tn; /*赋值后的sn为多项式前i项之和*/
            a=a*10;
        }
        printf("a+aa+..+aaaaa=%d
    ",sn);
    }

    13 输入10个整型整数,用起泡法对这10个数排序,并该由小到大顺序在屏幕上输出。

    方法一:

    #include "stdio.h"
    void main()
    {
        int a[10];
        int i,j,t;
        printf("input 10 number:
    ");
        for(i=0; i<10; i++)
            scanf("%d",&a[i]);
        //冒泡排序
        for(i=0; i<9; i++)  //n-1趟
            for(j=0;j<9-i;j++)  //
                if(a[j]>a[j+1])
                {
                    t=a[j];
                    a[j]=a[j+1];
                    a[j+1]=t;
                };
        for(i=0; i<10; i++)
            printf("%5d ",a[i]);
        printf("
    ");
    }

    方法二:

    #include "stdio.h"
    void main()
    {
        int a[10];
        int i,j,t;
        printf("input 10 number:
    ");
        for(i=0; i<10; i++)
            scanf("%d",&a[i]);
        for(i=0; i<10; i++)
    
            for(j=i; j<9; j++)
                if(a[i]>a[j+1])
                {
                    t=a[i];
                    a[i]=a[j+1];
                    a[j+1]=t;
                };
        for(i=0; i<10; i++)
            printf("%5d ",a[i]);
        printf("
    ");
    
    }
    

    14  将一个二维数组a的行和列的元素互换(即行列互换),存到另一个二维数组b中。

    #include "stdio.h"
    void main()
    {
        int  a[4][5],b[5][4];
        int i,j;
        for(i=0; i<4; i++)
            for(j=0; j<5; j++)
                scanf("%d",&a[i][j]);
        for(i=0; i<5; i++)
            for(j=0; j<4; j++)
                b[i][j]=a[j][i];
        printf("该数组的新序列为:
    ");
        for(i=0; i<5; i++)
        {
            for(j=0; j<4; j++)
                printf("%5d",b[i][j]);
            printf("
    ");
        }
    }

     

    15  在一个3*4的二维数组a中,要求编程求出其中值最大的那个元素的值,并输出其所在的行号和列号。

    #include "stdio.h"
    
    void main()
    {
        int a[3][4],i,j,max;
        //输入数据
        for(i=0; i<3; i++)
            for(j=0; j<4; j++)
                scanf("%d",&a[i][j]);
        //求最大值
        max=a[0][0];
        for(i=0; i<3; i++)
            for(j=0; j<4; j++)
                if(max<a[i][j])
                    max=a[i][j];
        printf("max=%d
    ",max);
        //求最大值的行列号
        for(i=0; i<3; i++)
            for(j=0; j<4; j++)
                if(a[i][j]==max)
                    printf("行=%2d,列=%2d
    ",i+1,j+1);
    }

    16 输入一行字符,统计其中有多少个单词,单词之间用空格分隔开。

    #include "stdio.h"
    void main()
    {
        int i,j=0;
        char str[80];
        gets(str);
        for(i=0; str[i]!=''; i++)
            if(str[i+1]==' '||str[i+1]=='')
                j++;
        printf("单词个数为%d
    ",j);
    }

    17 3个字符串,要求找出其中最大者。

    #include "stdio.h"
    #include <string.h>
    
    void main()
    {
        char str1[80],str2[80],str3[80],longest[80];
        gets(str1);
        printf("
    ");
    
        gets(str2);
        printf("
    ");
    
        gets(str3);
        /*
            strcmp(s1,s2)字符串比较函数,按字典排序的方式进行比较
            s1 == s2,返回0
            s1 > s2,返回正整数
            s1 < s2,返回负整数
            strcpy(s1,s2):字符串复制函数
        */
        strcpy(longest,str1);
        if(strcmp(str1,str2)<0)
            strcpy(longest,str2);
        if(strcmp(str2,str3)<0)
            strcpy(longest,str3);
        printf("the longest is %s",longest);
    }

    18 输入两个整数,要求用一个函数求出其中的大者,并在主函数中输出此值。

    方法一:

    #include "stdio.h"
    void main()
    {
        int f(int a,int b);
        int m,n,max;
        printf("请输入两个数:");
        scanf("%d,%d",&m,&n);
        max=f(m,n);
        printf("max=%d",max);
    }
    int f(int a,int b)
    {
        int c;
        c=a>b?a:b;
        return(c);
    }

    方法二:

    #include "stdio.h"
    void main()
    {
        int f(int a,int b);
        int m,n,max;
        printf("请输入两个数:");
        scanf("%d,%d",&m,&n);
        max=f(m,n);
        printf("max=%d",max);
    }
    int f(int a,int b)
    {
        int c;
        if(a>b)
            c=a;
        else
            c=b;
        return(c);
    }

    19 输入两个整数,要求用一个函数求出其最大公约数和最小公倍数,并在主函数中调用该子函数。链接

    #include <stdio.h>
    void main()
    {
        int hcf(int,int);
        int lcd(int,int,int);
        int u,v,h,l;
        scanf("%d,%d",&u,&v);
        h=hcf(u,v);
        printf("最大公约数=%d
    ",h);
        l=lcd(u,v,h);
        printf("最小公倍数=%d
    ",l);
    }
    //最大公约数
    int hcf(int u,int v)
    {
        int t,r;
        //保证u是最大的
        if (v>u)
        {
            t=u;
            u=v;
            v=t;
        }
        //辗转相除法
        while ((r=u%v)!=0)
        {
            u=v;
            v=r;
        }
        return(v);
    }
    //最小公倍数
    int lcd(int u,int v,int h)
    {
        return(u*v/h);
    }

    20 输入4个整数,找出其中最大的数。用函数的嵌套调用来处理

    #include <stdio.h>
    void main()
    {
        int max_4(int a,int b,int c,int d);
        int a,b,c,d,max;
        printf("Please enter 4 interger numbers:");
        scanf("%d %d %d %d",&a,&b,&c,&d);
        max=max_4(a,b,c,d);
        printf("max=%d 
    ",max);
    }
    int max_4(int a,int b,int c,int d)
    {
        int max_2(int a,int b);
        int m;
        m=max_2(a,b);
        m=max_2(m,c);
        m=max_2(m,d);
        return(m);
    }
    int max_2(int a,int b)
    {
        return(a>b?a:b);
    }

    21 5!

    方法一【递归】:

    #include <stdio.h>
    void  main()
    {
        long fac(int n);
        long y;
        y=fac(5);
        printf("5!=%ld
    ",y);
    }
    
    long fac(int n)
    {
        long f;
        if(n<0)
            printf("n<0,data error!");
        else if(n==0,n==1)
            f=1;
        else
            f=fac(n-1)*n;
        return(f);
    }

    方法二【非递归】:

    #include <stdio.h>
    void  main()
    {
        long fac(int n);
        long y;
        y=fac(5);
        printf("5!=%ld
    ",y);
    }
    
    long fac(int n)
    {
        long f=1;
        int i;
        if(n<0)
            printf("n<0,data error!");
        else if(n==0,n==1)
            f=1;
        else
            for(i=1;i<=5;i++)
            {
                f=i*f;
            }
        return(f);
    }
    

    22 编写一个函数,用来分别求数组score_1(有5个元素)和数组score_2(有10个元素)各元素的平均值。

    #include "stdio.h"
    void main()
    {
        float f(float score[],int n);
        float score_1[5],score_2[10],aver_1,aver_2;
        int i;
        printf("score_1:
    ");
        for(i=0; i<5; i++)
            scanf("%f",&score_1[i]);
        printf("score_2:
    ");
        for(i=0; i<10; i++)
            scanf("%f",&score_2[i]);
        aver_1=f(score_1,5);
        aver_2=f(score_2,10);
        printf("aver_1=%f,aver_2=%f
    ",aver_1,aver_2);
    }
    float f(float score[],int n)
    {
        int i;
        float aver,sum=0;
        for(i=0; i<n; i++)
            sum=sum+score[i];
        aver=sum/n;
        return(aver);
    }

    23  将一个数组中的值按逆序重新存放。例如,原来顺序为8,6,5,4,1改后成为1,4,5,6,8。

    代码:

    #include "stdio.h"
    void main()
    {
        int a[6],b[6],i;
        printf("请输入一个数组:");
        for(i=0; i<6; i++)
            scanf("%d",&a[i]);
        printf("逆序排列后的数组是:");
        for(i=0; i<6; i++)
        {
            b[i]=a[5-i];
            printf("%4d ",b[i]);
        }
    }

    24  用递归法将一个整数n转换成字符串。例如,输入483,应输出字符串“483”,n的位数不确定,可以是任意位数的整数

    #include <stdio.h>
    
    void main()
    {
        void convert(int n);
        int number;
        printf("input an integer: ");
        scanf("%d",&number);
        printf("output: ");
        //若是一个负数
        if (number<0)
        {
            putchar('-');
            putchar(' ');   /* 先输出一个‘-’号和空格 */
            number=-number;
        }
        convert(number);
        printf("
    ");
    }
    void convert(int n)
    {
        int i;
        if ((i=n/10)!=0)
            convert(i);
        putchar(n%10+'0');
        putchar(32);// putchar(32) 差不多是 putchar(' '); 的意思,输出一个空格
    }

    25 用指针实现输入3个整数并按从小到大的顺序输出

    #include "stdio.h"
    void main()
    {
        void exchange(int * p1,int * p2,int * p3);
        int n1,n2,n3;
        int * p1,* p2,* p3;
        printf("input three integer n1,n2,n3:");
        scanf("%d,%d,%d",&n1,&n2,&n3);
        p1=&n1;
        p2=&n2;
        p3=&n3;
        exchange(p1,p2,p3);
        printf("Now,the order is:%d,%d,%d",n1,n2,n3);
    }
    void exchange(int * p1,int * p2,int * p3)
    {
        void swap(int * p1,int * p2);
        if(* p1>* p2)
            swap( p1, p2);
        if(* p1>* p3)
            swap(p1,p3);
        if(* p2>* p3)
            swap(p2,p3);
    }
    void swap(int * p1,int * p2)
    {
        int p;
        p=* p1;
        * p1=* p2;
        * p2=p;
    }

    26  用指针实现输入3个整数并按从大到小的顺序输出

    #include <stdio.h>
    void main ( )
    {
        void paixu(int * p1,int * p2);
        int a,b,c,* p1,* p2,* p3;
        printf("please enter a,b,c:");
        scanf("%d,%d,%d",&a,&b,&c);
        p1=&a;
        p2=&b;
        p3=&c;
        if(a<b)
            paixu(p1,p2);
        if(a<c)
            paixu(p1,p3);
        if(b<c)
            paixu(p2,p3) ;
        printf("%5d%5d%5d
    ",a,b,c);
    }
    void paixu(int * p1,int * p2)
    {
        int t;
        t=* p1;
        * p1=* p2;
        * p2=t;
    }

    27  用指针实现将数组b[10]中的元素按逆序存放

    #include <stdio.h>
    void main()
    {
        void sort (int *p,int m);
        int i;
        int *p,num[10];
        printf("please input these numbers:
    ");
        for (i=0; i<10; i++)
        {
            scanf("%d",&num[i]);
        }
        p=&num[0];
        sort(p,10);
        printf("Now,the sequence is:
    ");
        for (i=0; i<10; i++)
        {
            printf("%d ",num[i]);
        }
        printf("
    ");
    }
    void sort (int *p,int m)
    {
        int i;
        int temp, *p1,*p2;
        for (i=0; i<m/2; i++)
        {
            p1=p+i;
            p2=p+(m-1-i);
            temp=*p1;
            *p1=*p2;
            *p2=temp;
        }
    }


    28  冒泡法实现对10个整数按从大到小的顺序排序输出(要求用指针实现)

    #include "stdio.h"
    void main()
    {
        void  swap(int * p1,int * p2);
        int a[10],* p ,i,j;
        printf("input 10 number:
    ");
        for(i=0; i<10; i++)
            scanf("%d",&a[i]);
        p=a;
        for(i=0; i<10; i++)
            for(j=i; j<9; j++)
                if(a[i]<a[j+1])
                    swap(p+i,p+j+1);
        for(i=0; i<10; i++)
            printf("%5d ",a[i]);
        printf("
    ");
    
    }
    void  swap(int * p1,int * p2)
    {
        int t;
        t=* p1;
        * p1=* p2;
        * p2=t;
    }

    29 选择法实现对10个整数按从小到大的顺序排序输出(要求用指针实现)。

    #include "stdio.h"
    void main()
    {
        void  swap(int * p1,int * p2);
        int a[10],* p ,i,j;
        printf("input 10 number:
    ");
        for(i=0; i<10; i++)
            scanf("%d",&a[i]);
        p=a;
        for(i=0; i<10; i++)
            for(j=0; j<9-i; j++)
                if(a[j]>a[j+1])
                    swap(p+j,p+j+1);
        for(i=0; i<10; i++)
            printf("%5d ",a[i]);
        printf("
    ");
    }
    void  swap(int * p1,int * p2)
    {
        int t;
        t=* p1;
        * p1=* p2;
        * p2=t;
    }

    30  定义一个结构体变量(包括年、月、日)。计算当天是本年中的第几天,注意闰年问题。

    #include <stdio.h>
    struct
    {
        int year;
        int month;
        int day;
    } date;
    void main()
    {
        int days;
        printf("input year,month,day:");
        scanf("%d,%d,%d",&date. year,&date.month,&date.day);
        switch(date.month)
        {
        case 1:
            days=date.day;
            break;
        case 2:
            days=date.day+31;
            break;
        case 3:
            days=date.day+59;
            break;
        case 4:
            days=date.day+90;
            break;
        case 5:
            days=date.day+120;
            break;
        case 6:
            days=date.day+151;
            break;
        case 7:
            days=date.day+181;
            break;
        case 8:
            days=date.day+212;
            break;
        case 9:
            days=date.day+243;
            break;
        case 10:
            days=date.day+273;
            break;
        case 11:
            days=date.day+304;
            break;
        case 12:
            days=date.day+334;
            break;
        }
        //判断是否是闰年
        if ((date.year %4== 0 && date.year % 100 != 0
                ||date.year % 400 == 0) && date.month >=3)  days+=1;
        printf("%d/%d is the %dth day in %d.
    ",date.month,date.day,days,date.year);
    }

    31. 设计候选人得票统计程序,要求有4个侯选人(分别是Zhang 、Wang 、Li、 Zhao),选民每次输入一个被选人的姓名,最后统计出各人的得票结果。

    #include <string.h>
    #include <stdio.h>
    struct person
    {
        char name[20];
        int count;
    } leader[4]= {"zhang",0,"wang",0,"li",0,"zhao",0};
    void main()
    {
        int i,j;
        char leader_name[20];
        for (i=1; i<=10; i++)
        {
            scanf("%s",leader_name);
            for(j=0; j<4; j++)
                if(strcmp(leader_name,leader[j].name)==0)//strcmp字符串比较函数
                    leader[j].count++;
        }
        printf("
    Resoult:
    ");
        for(i=0; i<4; i++)
            printf("%5s:%d
    ",leader[i].name,leader[i].count);
    }

    32  定义一个包括学号、姓名、年龄的学生结构体,要求实现三个学生信息的输入输出,并输出平均年龄

    #include <stdio.h>
    #define N 3
    struct student
    {
        char num[6];
        char name[20];
        int age;
    } stu[N];
    void main()
    {
        int i,aver=0;
        for(i=0; i<N; i++)
        {
            printf("input scores of student %d:
    ",i+1);
            printf("NO.:");
            scanf("%s",stu[i].num);
            printf("name:");
            scanf("%s",stu[i].name);
            printf("age :");
            scanf("%d",&stu[i].age);
        }
        printf("   NO.      name   age
    ");
        for (i=0; i<N; i++)
        {
            printf("%5s%10s%9d",stu[i].num,stu[i].name,stu[i].age);
            printf("
    ");
        }
        //输出平均成绩
        for(i=0; i<N; i++)
            aver=aver+stu[i].age;
        aver=aver/3;
        printf("aver=%d",aver);
    }

    33 定义一个包括教师编号、姓名、工资的教师结构体,要求实现三个教师信息的输入输出,并输出平均工资。

    #include <stdio.h>
    #define N 3
    struct teacher
    {
        char num[6];
        char name[20];
        float pay;
    } tea[N];
    void main()
    {
        int i;
        float aver=0;
        for(i=0; i<N; i++)
        {
            printf("input scores of student %d:
    ",i+1);
            printf("NO.:");
            scanf("%s",tea[i].num);
            printf("name:");
            scanf("%s",tea[i].name);
            printf("pay :");
            scanf("%f",&tea[i].pay);
        }
        printf("   NO.      name   pay
    ");
        for (i=0; i<N; i++)
        {
            printf("%5s%10s%9.2f",tea[i].num,tea[i].name,tea[i].pay);
            printf("
    ");
        }
        for(i=0; i<N; i++)
            aver=aver+tea[i].pay;
        aver=aver/N;
        printf("aver=%f",aver);
    }

    34  定义一个包括职员号、姓名、工资的职员结构体,要求实现三个职员信息的输入输出,并输出平均工资

    #include <stdio.h>
    #define N 3
    struct worker
    {
        char num[6];
        char name[20];
        float pay;
    } work[N];
    void main()
    {
        int i;
        float aver=0;
        for(i=0; i<N; i++)
        {
            printf("input scores of worker %d:
    ",i+1);
            printf("NO.:");
            scanf("%s",work[i].num);
            printf("name:");
            scanf("%s",work[i].name);
            printf("pay :");
            scanf("%f",&work[i].pay);
        }
        printf("   NO.      name   pay
    ");
        for (i=0; i<N; i++)
        {
            printf("%5s%10s%9.2f",work[i].num,work[i].name,work[i].pay);
            printf("
    ");
        }
        for(i=0; i<N; i++)
            aver=aver+work[i].pay;
        aver=aver/N;
        printf("aver=%f",aver);
    }

    35 建立动态数组,输入5个学生的成绩,另外用一个函数检查其中有无低于60分的,输出不合格的成绩。

    #include <stdio.h>
    #include <stdlib.h>
    void main()
    {
        void check(int *); //函数声明
        int *p1,i;
        p1=(int *)malloc(5*sizeof(int));// 动态数组
        for(i=0; i<5; i++)
            scanf("%d",p1+i);
        check(p1);
        free(p1);
    }
    
    void check(int *p)
    {
        int i;
        printf("They are fail:");
        for(i=0; i<5; i++)
            if (p[i]<60)
                printf("%d ",p[i]);
        printf("
    ");
    }

    36 写一函数,求一个字符串的长度。在main函数中输入字符串,并输出其长度(要求用指针实现)。

    #include <stdio.h>
    void main()
    {
        int length(char *p);
        int len;
        char str[20];
        printf("input string:  ");
        scanf("%s",str);
        len=length(str);
        printf("The length of string is %d.
    ",len);
    }
    int length(char *p)
    {
        int n;
        n=0;
        while (*p!='')
        {
            n++;
            p++;
        }
        return(n);
    }

    37 有一个一维数组score,内放10个学生成绩,用一个函数求平均成绩,并将10个成绩中不及格(小于60)的成绩和该成绩在数组中的序号输出。

    #include "stdio.h"
    void main()
    {
        void fail(float score[],int n);
        float score[10];
        int i;
        for(i=0; i<10; i++)
            scanf("%f",&score[i]);
        averfail(score,10);
    }
    void averfail(float score[],int n)
    {
        int i;
        float averscore=0;
        for(i=0; i<n; i++)
        {
            averscore = averscore+score[i];
            if(score[i]<60)
                printf("成绩为%f,序号为%d
    ",score[i],i+1);
        }
        averscore=averscore/n;
        printf("平均成绩:%f",averscore);
    }

    38. 有一个一维数组内放10个数,设计函数,求出10个数中的最大值、最小值、平均值。

    #include "stdio.h"
    void main()
    {
        int a[10],i,max,min,sum=0;
        float average;
        printf("input 10 number:
    ");
        for(i=0; i<10; i++)
            scanf("%d",&a[i]);
        //求最大值,平均值
        max=a[0];
        for(i=0; i<10; i++)
        {
            sum=sum+a[i];
            if(a[i]>max)
                max=a[i];
        }
        average=sum/10.0;
        //求最小值
        min=a[0];
        for(i=0; i<10; i++)
        {
            if(a[i]<min)
                min=a[i];
        }
        printf("max=%d,average=%f,min=%d",max,average,min);
    }

    39. 【有问题】找出一个2维数组中的鞍点,即该位置上的元素在该行上最大、在该列上最小。

    #include "stdio.h"
    int main()
    {
        int a[4][5];
        int i,j,k,m;
        for(i=0; i<4; i++)
        {
            for(j=0; j<5; j++)
            {
                scanf("%d",&a[i][j]);
            }
        }
    
        for(i=0; i<4; i++)
        {
            for(j=0; j<5; j++)
            {
                //列比大小
                for(m=0; m<4; m++)
                {
                    if(a[i][j]<a[m][j])
                    {
                        //行比大小
                        for(k=0; k<5; k++)
                        {
                            if(a[i][j]>a[i][k])
                                continue;
                        }
                    }
                }
            }
        }
        printf("i=%d,j=%d",i,j);
        return 0;
    }

    40. 输入8个学生4门课的成绩,分别用函数实现如下功能:

       1) 计算每个学生平均分;

       2) 计算每门课的平均分;

       3) 找出32个分数中最高分所对应的学生和课程。

    #include <stdio.h>
    #define N 8
    #define M 4
    float score[N][M];
    float a_stu[N],a_cour[M];
    int r,c;
    void main()
    {
        int i,j;
        float h;
        float highest();
        void input_stu(void);
        void aver_stu(void);
        void aver_cour(void);
        //输入成绩
        input_stu();
        //计算学生的平均成绩
        aver_stu();
        //计算课程的平均成绩
        aver_cour();
        //输出学生的平均成绩
        printf("
      NO.     cour1   cour2   cour3   cour4  aver
    ");
        for(i=0; i<N; i++)
        {
            printf("
     NO %2d ",i+1);
            for(j=0; j<M; j++)
                printf("%8.2f",score[i][j]);
            printf("%8.2f
    ",a_stu[i]);
        }
        //输出课程的平均成绩
        printf("
    average:");
        for (j=0; j<M; j++)
            printf("%8.2f",a_cour[j]);
        printf("
    ");
        //输出最好成绩的学生和课程
        h=highest();
        printf("highest:%7.2f   NO. %2d   course %2d
    ",h,r,c);
    }
    
    void input_stu(void)
    {
        int i,j;
        for (i=0; i<N; i++)
        {
            printf("
    input score of student%2d:
    ",i+1);
            for (j=0; j<M; j++)
                scanf("%f",&score[i][j]);
        }
    }
    void aver_stu(void)
    {
        int i,j;
        float s;
        for (i=0; i<N; i++)
        {
            for (j=0,s=0; j<M; j++)
                s+=score[i][j];
            a_stu[i]=s/5.0;
        }
    }
    void aver_cour(void)
    {
        int i,j;
        float s;
        for (j=0; j<M; j++)
        {
            s=0;
            for (i=0; i<N; i++)
                s+=score[i][j];
            a_cour[j]=s/(float)N;
        }
    }
    float highest()
    {
        float high;
        int i,j;
        high=score[0][0];
        for (i=0; i<N; i++)
            for (j=0; j<M; j++)
                if (score[i][j]>high)
                {
                    high=score[i][j];
                    r=i+1;
                    c=j+1;
                }
        return(high);
    }
    

    41  用一个函数实现将一行字符串中的最长的单词输出。此行字符串从主函数传递给该函数

    #include <stdio.h>
    #include <string.h>
    void main()
    {
        int alphabetic(char);
        int longest(char []);
        int i;
        char line[100];
        printf("input one line:
    ");
        gets(line);
        printf("The longest word is :");
        for (i=longest(line); alphabetic(line[i]); i++)
            printf("%c",line[i]);
        printf("
    ");
    }
    int alphabetic(char c)
    {
        if ((c>='a' && c<='z')||(c>='A'&&c<='z'))
            return(1);
        else
            return(0);
    }
    int longest(char string[])
    {
        int len=0,i,length=0,flag=1,place=0,point;
        for (i=0; i<=strlen(string); i++)
            if (alphabetic(string[i]))
                if (flag)
                {
                    point=i;
                    flag=0;
                }
                else
                    len++;
            else
            {
                flag=1;
                if (len>=length)
                {
                    length=len;
                    place=point;
                    len=0;
                }
            }
        return(place);
    }
    

    42.输出金字塔图案(要求用循环实现

    #include <stdio.h>
    void main()
    {
        /*                i         0~2*i           0~2-i
       *      上半部分    0   *1个 0~2*0   空6/2=3  0~2-0
      ***                 1    *3个 0~2*1  空4/2=2  0~2-1
     *****                2    *5个 0~2*2  空2/2=1  0~2-2
    *******               3    *7个 0~2*3  空0      0~2-3
     *****    下半部分    0   *5个  0~4-2*0         空2/2=1  0~0
      ***                 1    *3个  0~4-2*1        空4/2=2  0~1
       *                  2    *1个  0~4-2*2        空6/2=3  0~2
                                     0~4-2*i                 0~i
        */
        int i,j,k;
        //上半部分
        for (i=0; i<=3; i++)
        {
            for (j=0; j<=2-i; j++)
                printf(" ");
            for (k=0; k<=2*i; k++)
                printf("*");
            printf("
    ");
        }
        //下半部分
        for (i=0; i<=2; i++)
        {
            for (j=0; j<=i; j++)
                printf(" ");
            for (k=0; k<=4-2*i; k++)
                printf("*");
            printf("
    ");
        }
    }
    

    43 要有一个已排好序的数组,求输入一个数后,按原来排序的规律将她插入数组中

    #include "stdio.h"
    void main()
    {
        int a[10];
        int b[11];
        int i,m,j;
        printf("请输入一个数组:
    ");
        for(i=0; i<10; i++)
            scanf("%d",&a[i]);
        printf("请输入一个任意的整数:");
        scanf("%d",&m);
        //找到插入位置
        for(i=0; i<10; i++)
            if(m<a[i])
                break;
        for(j=0; j<11; j++)
        {
            //将插入位置前的复制到b中
            if(i>j)
                b[j]=a[j];
            //将插入位置后的复制到b中
            else if(i<j)
                b[j]=a[j-1];
            //将插入位置复制到b中
            else b[j]=m;
        }
        printf("该数组的重新排序为:");
        for(j=0; j<11; j++)
            printf("%d  ",b[j]);
    }

    44  写一个判断素数的函数,在主函数输入一个整数,输出是否素数的信息

    #include "stdio.h"
    #include "math.h"
    void main()
    {
        int prime(int n);
        int m;
        printf("please input a integer:
    ");
        scanf("%d",&m);
        if(prime(m))
            printf("%d is a prime",m);
        else
            printf("%d is not a prime",m);
    
    }
    int prime(int i)
    {
        int flag=1,n;
        for(n=2; n<=sqrt(i); n++)
        {
            if(i%n==0)
                flag=0;
        }
        return(flag);
    }

    45 有一篇文章,共有4行文章,每行有60个字符。要求分别统计出其中英文大写字符、小写字母、数字、空格以及其他字符的个数

    #include <stdio.h>
    void main()
    {
        int i,j,upp,low,dig,spa,oth;
        char text[4][60];
        upp=low=dig=spa=oth=0;
        for (i=0; i<4; i++)
        {
            printf("please input line %d:
    ",i+1);
            gets(text[i]);
            for (j=0; j<60 && text[i][j]!=''; j++)
            {
                if (text[i][j]>='A'&& text[i][j]<='Z')
                    upp++;
                else if (text[i][j]>='a' && text[i][j]<='z')
                    low++;
                else if (text[i][j]>='0' && text[i][j]<='9')
                    dig++;
                else if (text[i][j]==' ')
                    spa++;
                else
                    oth++;
            }
        }
        printf("
    upper case: %d
    ",upp);
        printf("lower case: %d
    ",low);
        printf("digit     : %d
    ",dig);
        printf("space     : %d
    ",spa);
        printf("other     : %d
    ",oth);
    }

    46. 有一行电文,已按下面规律译成密码:

    A→Z    a→z

    B→Y    b→y

    C→X    c→x/

    即第1个字母变成第26个字母,第i个字母变成第(26 – i + 1)个字母。非字母符号不变。要求编程序将密码译回原文,并输出密码和原文。

    #include <stdio.h>
    void main()
    {
        int j,n;
        char ch[80],tran[80];
        printf("input cipher code:");
        gets(ch);
        printf("
    cipher code  :%s",ch);
        j=0;
        while (ch[j]!='')
        {
            if ((ch[j]>='A') && (ch[j]<='Z'))
                tran[j]=155-ch[j];  //
            else if ((ch[j]>='a') && (ch[j]<='z'))
                tran[j]=219-ch[j];  //
            else
                tran[j]=ch[j];
            j++;
        }
        n=j;
        printf("
    original text:");
        for (j=0; j<n; j++)
            putchar(tran[j]);
        printf("
    ");
    }

    47 有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下来的是原来第几号的那位(要求用指针知识实现)。【见2015年笔试题

    #include <stdio.h>
    void main()
    {
        int i,k,m,n,num[50],*p;
        printf("input number of person: n=");
        scanf("%d",&n);
        p=num;
        for (i=0; i<n; i++)
            *(p+i)=i+1;
        i=0;
        k=0;
        m=0;
        while (m<n-1)
        {
            if (*(p+i)!=0)  k++;
            if (k==3)
            {
                *(p+i)=0;
                k=0;
                m++;
            }
            i++;
            if (i==n) i=0;
        }
        while(*p==0) p++;
        printf("The last one is NO.%d
    ",*p);
    }

    48 有10个学生,每个学生的数据包括学号、姓名、3门课程的成绩,从键盘输入10个学生数据,要求输出3门课程总平均成绩,以及最高分的学生的数据(包括学号、姓名、3门课程成绩、平均分数)(用结构体)。

    #include <stdio.h>
    #define N 10
    struct student
    {
        char num[6];
        char name[8];
        float score[3];
        float avr;
    } stu[N];
    void main()
    {
        int i,j,maxi;
        float sum,max,average;
        for (i=0; i<N; i++)
        {
            printf("input scores of student %d:
    ",i+1);
            printf("NO.:");
            scanf("%s",stu[i].num);
            printf("name:");
            scanf("%s",stu[i].name);
            for (j=0; j<3; j++)
            {
                printf("score %d:",j+1);
                scanf("%f",&stu[i].score[j]);
            }
        }
        average=0;
        max=0;
        maxi=0;
        for (i=0; i<N; i++)
        {
            sum=0;
            for (j=0; j<3; j++)
                sum+=stu[i].score[j];
            stu[i].avr=sum/3.0;
            average+=stu[i].avr;
            if (sum>max)
            {
                max=sum;
                maxi=i;
            }
        }
        average/=N;
        printf("   NO.      name   score1   score2   score3     average
    ");
        for (i=0; i<N; i++)
        {
            printf("%5s%10s",stu[i].num,stu[i].name);
            for (j=0; j<3; j++)
                printf("%9.2f",stu[i].score[j]);
            printf("    %8.2f
    ",stu[i].avr);
        }
        printf("average=%5.2f
    ",average);
        printf("The highest score is : student %s,%s
    ",stu[maxi].num,stu[maxi].name);
        printf("his scores are:%6.2f,%6.2f,%6.2f,average:%5.2f.
    ",    stu[maxi].score[0],stu[maxi].score[1],stu[maxi].score[2],stu[maxi].avr);
    }
    

    49  写一个函数,将一个字符串中的元音字母复制到另一个字符串,然后输出

    #include "stdio.h"
    void main()
    {
        void copy(char s[3],char m[2]);
        char str[80],c[80];
        printf("input str:
    " );
        gets(str);
        copy(str, c);
        printf("the vovel letters are:%s
    ",c);
    }
    void copy(char s[3],char m[2])
    {
        int i,j;
        for(i=0,j=0; s[i]!=''; i++)
            if(s[i]=='a'||s[i]=='A'||s[i]=='o'||s[i]=='O'||s[i]=='u'||s[i]=='U'||s[i]=='i'||s[i]=='I'||s[i]=='e'||s[i]=='E')
            {
                m[j]=s[i];
                j++;
            }
        m[j]='';
    }

    50 编一程序,输入月份号,输出该月的英文月名。例如,输入3,则输出March,要求用指针数组处理。

    #include <stdio.h>
    void main()
    {
        char * month_name[13]= {"illegal month","January","February","March","April",
                                "May","June","july","August","September","October", "November","December"
                               };
        int n;
        printf("input month:
    ");
        scanf("%d",&n);
        if ((n<=12) && (n>=1))
            printf("It is %s.
    ",*(month_name+n));
        else
            printf("It is wrong.
    ");
    }
  • 相关阅读:
    常用的清理 Kubernetes 集群命令
    mask彻底禁用systemctl服务
    ansibleplaybook指定role limit
    极速理解设计模式系列:16.迭代器模式(Iterator Pattern)
    极速理解设计模式系列:19.备忘录模式(Memento Pattern)
    极速理解设计模式系列:8.策略模式(Strategy Pattern)
    极速理解设计模式系列:6.适配器模式(Adapter Pattern)
    PostSharp AOP编程:2.PostSharp的OnMethodBoundaryAspect类基本组成
    极速理解设计模式系列:18.访问者模式(Visitor Pattern)
    极速理解设计模式系列:10.抽象工厂模式(Abstract Factory Pattern)
  • 原文地址:https://www.cnblogs.com/pam-sh/p/12616965.html
Copyright © 2020-2023  润新知