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\n" ,x,y);
    }
    else  if(x==0)        /* x=0*/
    {
        y=0;
        printf("x=%d,  y=%d\n",x,y);
    }
    else            /* 0<x<=100 */
    {
        y=1;
        printf("x=%d,  y=%d\n",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\n",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("最大值和最小值分别为: \n");
    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\n");
    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.\n ",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\n" ,x,y);
    }
    else  if(x<10||x>10)        /* 1=<x<10 */
    {
        y=2*x-1;
        printf("x=%d,  y=2*x-1=%d\n",x,y);
    }
    else            /* x>=10  */
    {
        y=3*x-11;
        printf("x=%d,  y=3*x-11=%d\n",x,y);
    }
}

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

方法一:

#include "stdio.h"
#include"math.h"
void main()
{
    int prime(int);
    int i,k,m;
    printf("300~400之间的素数为:\n");
    for(i=300; i<=400; i++)
    {
        m=prime(i);
        if(m==1)
        {
            k++;
            printf("%5d",i);
            if(k%5==0)
                printf("\n");
        }
    }
}
/*判断是否是素数

素数又称质数。所谓素数是指除了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("\n");
    }
    printf ("\n");
}

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("\n");
        printf("%d\t",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",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\n",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("\n");
}

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

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

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

方法一:

#include "stdio.h"
void main()
{
    int a[10];
    int i,j,t;
    printf("input 10 number:\n");
    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("\n");
}

方法二:

#include "stdio.h"
void main()
{
    int a[10];
    int i,j,t;
    printf("input 10 number:\n");
    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("\n");

}

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("该数组的新序列为:\n");
    for(i=0; i<5; i++)
    {
        for(j=0; j<4; j++)
            printf("%5d",b[i][j]);
        printf("\n");
    }
}

 

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\n",max);
    //求最大值的行列号
    for(i=0; i<3; i++)
        for(j=0; j<4; j++)
            if(a[i][j]==max)
                printf("行=%2d,列=%2d\n",i+1,j+1);
}

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

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

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

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

void main()
{
    char str1[80],str2[80],str3[80],longest[80];
    gets(str1);
    printf("\n");

    gets(str2);
    printf("\n");

    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\n",h);
    l=lcd(u,v,h);
    printf("最小公倍数=%d\n",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 \n",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\n",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\n",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:\n");
    for(i=0; i<5; i++)
        scanf("%f",&score_1[i]);
    printf("score_2:\n");
    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\n",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("\n");
}
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\n",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:\n");
    for (i=0; i<10; i++)
    {
        scanf("%d",&num[i]);
    }
    p=&num[0];
    sort(p,10);
    printf("Now,the sequence is:\n");
    for (i=0; i<10; i++)
    {
        printf("%d ",num[i]);
    }
    printf("\n");
}
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:\n");
    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("\n");

}
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:\n");
    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("\n");
}
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.\n",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("\nResoult:\n");
    for(i=0; i<4; i++)
        printf("%5s:%d\n",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:\n",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\n");
    for (i=0; i<N; i++)
    {
        printf("%5s%10s%9d",stu[i].num,stu[i].name,stu[i].age);
        printf("\n");
    }
    //输出平均成绩
    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:\n",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\n");
    for (i=0; i<N; i++)
    {
        printf("%5s%10s%9.2f",tea[i].num,tea[i].name,tea[i].pay);
        printf("\n");
    }
    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:\n",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\n");
    for (i=0; i<N; i++)
    {
        printf("%5s%10s%9.2f",work[i].num,work[i].name,work[i].pay);
        printf("\n");
    }
    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("\n");
}

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.\n",len);
}
int length(char *p)
{
    int n;
    n=0;
    while (*p!='\0')
    {
        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\n",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:\n");
    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("\n  NO.     cour1   cour2   cour3   cour4  aver\n");
    for(i=0; i<N; i++)
    {
        printf("\n NO %2d ",i+1);
        for(j=0; j<M; j++)
            printf("%8.2f",score[i][j]);
        printf("%8.2f\n",a_stu[i]);
    }
    //输出课程的平均成绩
    printf("\naverage:");
    for (j=0; j<M; j++)
        printf("%8.2f",a_cour[j]);
    printf("\n");
    //输出最好成绩的学生和课程
    h=highest();
    printf("highest:%7.2f   NO. %2d   course %2d\n",h,r,c);
}

void input_stu(void)
{
    int i,j;
    for (i=0; i<N; i++)
    {
        printf("\ninput score of student%2d:\n",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:\n");
    gets(line);
    printf("The longest word is :");
    for (i=longest(line); alphabetic(line[i]); i++)
        printf("%c",line[i]);
    printf("\n");
}
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("\n");
    }
    //下半部分
    for (i=0; i<=2; i++)
    {
        for (j=0; j<=i; j++)
            printf(" ");
        for (k=0; k<=4-2*i; k++)
            printf("*");
        printf("\n");
    }
}

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

#include "stdio.h"
void main()
{
    int a[10];
    int b[11];
    int i,m,j;
    printf("请输入一个数组:\n");
    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:\n");
    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:\n",i+1);
        gets(text[i]);
        for (j=0; j<60 && text[i][j]!='\0'; 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("\nupper case: %d\n",upp);
    printf("lower case: %d\n",low);
    printf("digit     : %d\n",dig);
    printf("space     : %d\n",spa);
    printf("other     : %d\n",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("\ncipher code  :%s",ch);
    j=0;
    while (ch[j]!='\0')
    {
        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("\noriginal text:");
    for (j=0; j<n; j++)
        putchar(tran[j]);
    printf("\n");
}

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\n",*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:\n",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\n");
    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\n",stu[i].avr);
    }
    printf("average=%5.2f\n",average);
    printf("The highest score is : student %s,%s\n",stu[maxi].num,stu[maxi].name);
    printf("his scores are:%6.2f,%6.2f,%6.2f,average:%5.2f.\n",    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:\n" );
    gets(str);
    copy(str, c);
    printf("the vovel letters are:%s\n",c);
}
void copy(char s[3],char m[2])
{
    int i,j;
    for(i=0,j=0; s[i]!='\0'; 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]='\0';
}

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:\n");
    scanf("%d",&n);
    if ((n<=12) && (n>=1))
        printf("It is %s.\n",*(month_name+n));
    else
        printf("It is wrong.\n");
}

猜你喜欢

转载自www.cnblogs.com/pam-sh/p/12616965.html
今日推荐