1. 程式人生 > >C 2010年筆試題

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);
    }
}

2 輸入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);
}

4 輸入成績,要求輸出成績等級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);
    }
}

5 有一個函式:寫一段程式,輸入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");
}

7求Fibonacci數列的前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");
}