1. 程式人生 > >39個C語言小程式(適合新手)

39個C語言小程式(適合新手)

1 %c 輸入 2 個數字(0--9),將 2 個數字組成 2 位數並每位上的數字不能相同,以%d 輸出。
#include <stdio.h>

int main()
{
        char a,b;
        int sum;
        printf("輸入兩個數字(0~9\n");
        scanf("%c %c",&a,&b);

        if(a==b){
                printf("兩數不能相等!\n");
        }else if( a<'0'|| a >'9' || b < '0' || b > '9'){
                printf("兩個數必須為0~9的數字\n");
        }else {
                sum=(a-'0')*10 + (b-'0');
                printf("result = %d\n",sum);    
        }
        return 0;
}
考點:if else的用法,以及ascii碼中數值的大小,這個可以用man ascii檢視ascii表格
------------------------------------------------------------------------------------------------------------------------------
2. 從鍵盤上輸入一個字元,如果它是大寫字母,則把它轉換成小寫字母輸出;否則,直接輸出。
#include <stdio.h>

int main(){
        char a;

        printf("輸入一個字元");
        scanf("%c",&a);

        if(a>='A' && a<='Z'){
                a=a+32;
                printf("%c\n",a);
        }else if(a>='a' && a<='z'){
                printf("%c\n",a);
        }else{
                printf("請輸入一個字元\n");
        }

        return 0;
}
考點:ascii碼中大小寫字母之間的差值,以及if else用法
------------------------------------------------------------------------------------------------------------------------------
3. 程式設計輸入一串字串將字串中,字母、數字和其他符號歸類,並統計出各個字元的個數。
int charsize(char a[]);//字串長度函式
void classify(int n,int *a,int *b,int *c,char *ptr);//統計
int main()
{
        char ch[200];
        int i;
        int a=0,b=0,c=0;

        printf("輸入一個字串\n");
        scanf("%s",ch);

        charsize(ch);
        classify(charsize(ch),&a,&b,&c,ch);

        printf("總共輸入%d個字元\n\n",charsize(ch),b);
        printf("字母有%d個\n數字有%d個\n其他有%d個\n",a,b,c);
        
        return 0;
}
//統計字串的長度,也可以用string.h庫中的函式,stelrn(char *str)函式來確定字串長度,新手建議自己動手寫。
int charsize(char a[])
{
        int n=0;
        
        while(*(a+n) != '\0')
        {
                n++;
        }

        return n;
}
//分類其中a,b,c,分別代表字母,數字,和其他。
void classify(int n,int *a,int *b,int *c,char *ptr)
{
        int i;

        for(i=0;i<n;i++){
                if((*(ptr+i)>='a'&&*(ptr+i)<='z')||(*(ptr+i)>='a'&&*(ptr+i)<='z')){
                        (*a)++;
                }
                else if((*(ptr+i)>='0'&&*(ptr+i)<='9')){
                        (*b)++;
                }
                else{
                        (*c)++;
                }
        }
        return ;
}
考點:分函式,以及傳參時簡單的一級指標的應用
------------------------------------------------------------------------------------------------------------------------------
4. 從鍵盤上輸入一個百分制成績 score,按下列原則輸 出 其 等 級 : score≥90 , 等 級 為 A ;80≤score<90,等級為 B;70≤score<80,等級為C;60≤score<70,等級為 D;score<60,等級為E。
#include <stdio.h>

void score(int temp)
{
        switch(temp)
        {
                case 10:
                        printf("The score is : A");
                        break;
                case 9 :
                        printf("The score is : A");
                        break;
                case 8 :
                        printf("The score is : B");
                        break;
                case 7 :
                        printf("The score is : C");
                        break;
                case 6 :
                        printf("The score is : D");
                        break;
                default:
                        printf("The score is : E");
                        break;
        }
        printf("\n");
        return ;
}

int main()
{
        int sco,temp;

        printf("輸入一個學生成績:\n");
        scanf("%d",&sco);

        temp = sco/10;
        score(temp);

        return 0;
}

考點:分函式、switch語句的用法

------------------------------------------------------------------------------------------------------------------------------

5. 程式設計實現以下功能:讀入兩個運算數(data1 和 data2)及一個運算子(op),計算表示式 data1 opdata2 的值,其中 op 可為‘+’,‘-’,‘*’,‘/’(用 switch 語句實現)

這裡我們將+ - * / 以及main函式,分別用add.c  sub.c  mul.c  div.c main.c 分別來寫,注意:這裡並不是分檔案,只是C語言的靈活寫法

//add.c
#include <stdio.h>
int add(int x,int y,int *res)
{
        *res = x + y ;
        return 0;
}
//sub.c
#include <stdio.h>

int sub(int d1,int d2,int *res)
{
        *res = d1 - d2 ;
        return 0;
}
//sub.c
#include <stdio.h>

int mul(int x,int y,int *p)
{
        *p = x * y ;
        return 0;
}
//div.c
#include<stdio.h>
int div(int x,int y,int *res)
{
        if( y == 0 )
        {
                return 1;
        }
        else
        {
                *res = x / y ;
                return 0;
        }
}
//main.c
#include <stdio.h>

extern int add(int x,int y,int *res);
extern int sub(int x,int y,int *res);
extern int mul(int x,int y,int *res);
extern int div(int x,int y,int *res);
extern void display(int x,int *y);    
int (*fun)(int x,int y,int *res);    //函式的指標

int main()
{
        char op;
        int data1,data2,result;  //result變數用來儲存運算後儲存的結果。
        printf("輸入 A op B ,eg: 5 + 4 :\n");
        scanf("%d %c %d",&data1,&op,&data2);
        switch(op)
        {
                case '+':fun = add;break;
                case '-':fun = sub;break;
                case '*':fun = mul;break;
                case '/':fun = div;break;
        }
        display(fun(data1,data2,&result),&result);//fun函式:將data1和data2的運算結果,儲存在result中
        return 0;
}
這裡編譯的時候需要將.c檔案全部編譯:gcc add.c mul.c sub.c  div.c main.c  -o exe
考點:extern關鍵字的靈活用法
------------------------------------------------------------------------------------------------------------------------------

6. 下面程式的功能是用 while 語句求 1 至 1000的數,且一行只打印五個數。

#include <stdio.h>
int main()
{
	int i=0;
	int count=0;
	
	while(i<1000);
	{
		if((i%3==2)&&(i%5==3)&&(i%7==2))
		{
			printf("%5d",i);
			count++; 
			if(count%5==0)
			{
				printf("\n");
			}
		}
		i++;
	}

	return 0;
}
考點:while()語句
------------------------------------------------------------------------------------------------------------------------------

7. 求 fibonacci 數列的前 40 個數。該數列的生成方法為:F1=1,F2=1,Fn=Fn-1+Fn-2(n>=3),即從第 3 個數開始,每個數等於前 2 個數之和。

#include <stdio.h>
#if 1
int fibonacci();                                //外部函式宣告(extern)
int main()
{
        int i;
        for(i=0;i<40;i++){
                if(i%4==0){                  //每4個數為一行
                        printf("\n");
                }
                printf("%10d",fibonacci()); //列印fibonacci數列
        }
        printf("\n");
    return 0;
}

/*
 函式功能:計算fibonacci數列的下一個值
 返回值  :last(fibonacci數列下一個值)
 */

int fibonacci()
{
        static int last                 = 0;
        static int last_but_one = 1;
        int next;
        
        next             = last    +   last_but_one;
        last_but_one = last;            //注意賦值順序,防止last被覆蓋
        last             = next;

        return last;                    //下一個數值
}
/*
static:靜態變數,函式結束後,變數不會被收回,佔用的內從空間還在,
            空間裡儲存的數值還存在。

  1     0       1      1       2        3       5
l_b_o   l       n             l_b_o     l       n

last_but_one : l_b
last         : l
next         : n
*/

考點:static關鍵字

------------------------------------------------------------------------------------------------------------------------------

8. 編寫程式,輸出用一元人民幣兌換成 1 分、2 分和5 分硬幣的不同兌換方法。

#include <stdio.h>

int main()
{
        int i;                  //兌換成5分的兌換方法,最多可兌換20個。
        int j;                  //兌換成2分的兌換方法,最多可兌換50個。
        int k;                  //兌換成1分的兌換方法,最多可兌換100個。
        int count=0;            //迴圈次數(種類)
        for(i=0;i<=100/5;i++)                           //5分迴圈次數
        {
                printf("Five cents: %-5d",i);           //2分迴圈次數
                for(j=0;j<=(100-5*i)/2;j++)
                {
                        count++;
                        if(j%5 == 0)
                        {
                                printf("\n");
                        }
                        printf("Two cents: %-5d",j);
                        k = 100 - 5*i - 2*j;            //5分,2分已知,1分兌換方法固定
                        printf("One cent:%-5d",k);
                }
                printf("\n");
        }
        printf("the count is : %d\n",count);
        return 0;
}
------------------------------------------------------------------------------------------------------------------------------
9. 打印出 100~1000 之間的所有“水仙花數”(“水仙花數”是指一個 3 位數,各位數字的立方和等於該數本身。 153=1 +5 +3 , 就是“水仙花數” )如:153
#include <stdio.h>
mypower(int x,int y);//求x的y次冪,x底數,y冪數
int is_flower();
int part();

int main()
{
        int i;
        for(i=100;i<1000;i++)
        {
                if(is_flower(i))
                {
                        printf("%6d",i);
                }
        }
        printf("\n");
        return 0;
}

int is_flower(int n)//一個數是否為水仙花數
{
        int sum=0;
        int i;
        for(i=0;i<3;i++)
        {
                sum += part(n,i);//i=0,個位的3次方;i=1,十位的3次方;i=2,百位的3次方
        }
        if(n == sum)
        {
                return 1;
        }
        else
        {
                return 0;
        }
}

int part(int num,int digital)//num:輸入的數,digital:輸入的數的每位數為多少
{
        int s;
        int ss;
        s = num/mypower(10,digital)%10;//分離一個百位數,求底數
        ss = mypower(s,3);        //求這個底數的三次方
        return ss;
}
double mypower(double x,double y)
{
        double sum=1;
        int i;
        if(y==0)
        {
                return 1.0;
        }
        if(y>0)
        {       
                for(i=0;i<y;i++)
                {
                        sum=sum*x;
                }
        }
        if(y<0)
        {
                for(i=y;i<0;i++)
                {
                        sum=sum*x;
                }
                sum=1.0/sum;
        }
        return sum;
}
------------------------------------------------------------------------------------------------------------------------------
10. 程式設計取滿足式 11+20+29+38 ...... +n ≤100 的 n。
#include<stdio.h>

int main()
{
        int i;
        int a = 11;
        int q = 9;
        int n,nn;                       //nn = n+1
        int sum = 0;                    //前n項總和
        int sum_but_next = 0;           //前n+1項總和
        for(i=0;i<10;i++)
        {
                n   = q * i + a;
                nn  = q * (i+1) + a; 
                sum = sum + n;
                sum_but_next = sum + nn;
                if(sum <= 100 && sum_but_next >= 100)
                {
                        printf("i = %d\n",i);   //輸出第n項
                        printf("n = %d\n",n);   //項數n為多少
                }
        }
        return 0;
}
-----------------------------------------------------------------------------------------------------------------------------
11. 下面程式的功能是從鍵盤輸入一個字串,然後反序輸出輸的字串
#include <stdio.h>
#include <string.h>

int main()
{
        int i;
        char arra[128];
        char arrb[128];
        
        printf("輸入字串\n");
        scanf("%s",arra);                       //輸入的字串存入arra陣列中
        for(i=0;i<strlen(arra);i++)             //strlen(arra)求arra字串的長度
        {
                arrb[strlen(arra)-1-i] = arra[i];   //將arra中的字串倒序存入arrb中
        }
        printf("%s\n",arrb);

        return 0;
}
------------------------------------------------------------------------------------------------------------------------------
12. 下面程式的功能是顯示具有 n 個元素的陣列 s 中的最大元素,輸出最大數值和其位置。
#include <stdio.h>
#define N 6
void input(int n,int *ptr); //輸入函式,從鍵盤上輸入N個數,N為define N 定義的數 
int fun_max(int n,int a[]); //查詢最大值,[email protected]:最大值下標
int main()
{
        int arr[N];

        input(N,arr);    //輸入函式,輸入N個元素,arr:儲存陣列的元素
        printf("the max is arr[%d] = %d\n",fun_max(N,arr),*(arr+fun_max(N,arr)));

        return 0;
}
/*
 *功能:查詢一個數組中的最大數位置
 * */
int fun_max(int n,int a[])
{
        int i;
        int temp = *a;
        int count = 0;

        for(i=0;i<n-1;i++)
        {
                if(temp < *(a+i+1))
                {
                        temp = *(a+i+1);
                        count = i+1;
                }
        }
        return count;
}
/*
 *功能    :輸入一個數組。
 *param   :n:輸入陣列的個數,*ptr:指向陣列的指標
 * @return:空
 * */
void input(int n,int *ptr)
{
        int i,j;
        printf("Input %d Integer:\n",n);
        
        for(i=0;i<n;i++)
        {
                scanf("%d",&j);
                *(ptr+i) = j;
        }
}
------------------------------------------------------------------------------------------------------------------------------
13. x 的值轉換為二進位制數,所得的二進位制數放在一個一維陣列中返回,二進位制數的最低位放在下標為 0 的元素中。
#include <stdio.h>
void output(int n,int *ptr);//輸出顯示一個數組的內容,
                            //n:陣列中元素的個數,*ptr,陣列指標。
int main()
{
        int x;
        int i = 0;
        int arr[20]={0};

        printf("please input a num\n");
        scanf("%d",&x);
        while(1){
                *(arr+i)=x % 2;
                x = x / 2;
                i++;
                if(x == 0){
                        break;
                }
        }
        output(i,arr);
        return 0;
}

void output(int n,int *ptr)
{
        int i;

        for(i=0;i<n;i++)
        {
                printf("%4d",*(ptr+i));
        }
        printf("\n");
}
------------------------------------------------------------------------------------------------------------------------------
14. 以下程式是用來輸入 5 個整數,並存放在陣列中,找出最大數與最小數所在的下標位置,並把二者對調,然後輸出調整後的 5 個數。
//lib.h
#ifndef LIB_H
#define LIB_H

int fun_max(int n,int a[]);
int fun_min(int n,int a[]);
void input(int n,int *ptr);
void output(int n,int *ptr);
void swap(int *x,int *y);

#endif
//lib.c
#include <stdio.h>
int fun_max(int n,int a[]){ //n:陣列中元素個數,a[]:陣列指標,指向要查詢的陣列
    int i;
    int temp = *a;         //取第一項,然後逐次與下一相比較
    int count = 0;
    for(i=0;i<n-1;i++){
        if(temp < *(a+i+1)){ //如果下於下一項,那麼最大值為下一項
            temp = *(a+i+1);//將最大值賦給temp
            count = i+1;    //下表值加1。
        }
    }
    return count;
}
int fun_min(int n,int a[]){
    int i;
    int temp = *a;
    int count = 0;

    for(i=0;i<n-1;i++){
        if(temp > *(a+i+1)){
            temp = *(a+i+1);
            count = i+1;
        }
    }
    return count;
}
void input(int n,int *ptr){
    int i,j;
    printf("Input %d Integer:\n",n);

    for(i=0;i<n;i++){
        scanf("%d",&j);
        *(ptr+i) = j;
    }
}
void output(int n,int *ptr){
    int i;

    for(i=0;i<n;i++){
        printf("%4d",*(ptr+i));
    }
    printf("\n");
}
void swap(int *x,int *y){
    int sw;
    sw = *x;
    *x = *y;
    *y = sw;
}
//main.c
#include <stdio.h>
#include "lib.h"
#define N 5

int main()
{
        int arr[N]={0};
        
        input(N,arr);   //輸入一個數組
        printf("the max is arr[%d] = %d\n",fun_max(N,arr),*(arr+fun_max(N,arr)));
        printf("the min is arr[%d] = %d\n",fun_min(N,arr),*(arr+fun_min(N,arr)));
        swap(arr+fun_max(N,arr),arr+fun_min(N,arr));    //交換兩個陣列中的數
        output(N,arr);  //輸出一個數組
        return 0;
}
------------------------------------------------------------------------------------------------------------------------------
15. 首先對 a 所指的 N 行 N 列的矩陣,找出各行中的最大的數,再求這 N 個最大值中的最小的那個數。
#include <stdio.h>
#define N 4    //行數
#define M 4    //列數

void twoutput(int n,int m,int (*ptr)[m]);//輸出一個二位陣列
void twoinput(int n,int m,int (*ptr)[m]);//輸入一個二位陣列
int find_max(int n,int m,int (*ptr)[m]); //查詢二位陣列中每行的最大值,@return:最大值下標
int fun_max(int n,int a[]);//查詢最大值,@return:最大值下標
int fun_min(int n,int a[]);//查詢最小值,@return:最小值下標

int main()
{       
    int arb[N];        //儲存每行最大的數
    int arr[N][M];     //輸入的二位陣列
    int sum;
    twoinput(N,M,arr); //提示輸入一個二位陣列
    twoutput(N,M,arr); //輸出這個二位陣列的數
    for(sum=0;sum<N;sum++)
    {
        printf("第%d行最大的數是%d \n",sum+1,arr[sum][find_max(sum,M,arr)]);
        //              printf("s=%d\n",find_max(sum,M,arr));
        //              printf("第%d行最大的數是%d \n",sum+1,*(*(arr+sum)+find_max(sum,M,arr)));
        arb[sum] = arr[sum][find_max(sum,M,arr)]; //
    }
    printf("\n");
    printf("%d 行最大元素為 %d\n",N,*(arb+fun_max(N,arb)));
    printf("%d 行最小元素為 %d\n",N,*(arb+fun_min(N,arb)));
    return 0;
}
int find_max(int n,int m,int (*ptr)[m]){
    int temp = *(*(ptr+n));
    int count=0;
    int i;
    for(i=0;i<m-1;i++){   
        if(temp < *(*(ptr+n)+i+1)){   
            temp = *(*(ptr+n)+i+1);
            count= i+1;
        }   
    }   
    return count;
}
int fun_max(int n,int a[]){
    int i;
    int temp = *a;
    int count = 0;

    for(i=0;i<n-1;i++){
        if(temp < *(a+i+1)){
            temp = *(a+i+1);
            count = i+1;
        }
    }
    return count;
}
int fun_min(int n,int a[])
{
    int i;
    int temp = *a;
    int count = 0;

    for(i=0;i<n-1;i++){
        if(temp > *(a+i+1)){
            temp = *(a+i+1);
            count = i+1;
        }
    }
    return count;
}
void twoinput(int n,int m,int (*ptr)[m]){
    printf("請輸入%d行%d列的陣列,共%d個元素\n",n,m,n*m);

    int i,j;
    for(i=0;i<n;i++){   
        for(j=0;j<m;j++){   
            scanf("%d",(*(ptr+i)+j));
        }   
    }   
}
void twoutput(int n,int m,int (*ptr)[m]){
    int i,j;
    for(i=0;i<n;i++){   
        for(j=0;j<m;j++){   
            printf("%-3d",*(*(ptr+i)+j));
        }   
        printf("\n");
    }   
}
------------------------------------------------------------------------------------------------------------------------------
16. 在陣列中查詢最大的數與陣列中最後一個數交換,並查詢陣列中最小的數與陣列第一個數交換。
#include <stdio.h>
#define N 6

void swap(int *x,int *y);   //交換
void input(int n,int *ptr); //輸入
void output(int n,int *ptr);//輸出
int fun_max(int n,int a[]); //查詢最大值,@return:最大值下標
int fun_min(int n,int a[]); //查詢最小值,@return:最小值下標

int main(){       
    int arr[N];

    input(N,arr);                     //輸入一個一維陣列
    fun_max(N,arr);                   //查詢陣列中的最大值
    swap(arr+fun_max(N,arr),arr+N-1); //與陣列中最後一個數交換
    fun_min(N,arr);                   //查詢最小值
    swap(arr+fun_min(N,arr),arr);     //與陣列中的第一個數交換
    output(N,arr);                    //輸出交換後的陣列
    return 0;
}
int fun_max(int n,int a[]){
    int i;
    int temp = *a;
    int count = 0;

    for(i=0;i<n-1;i++){
        if(temp < *(a+i+1)){
            temp = *(a+i+1);
            count = i+1;
        }
    }
    return count;
}
int fun_min(int n,int a[]){
    int i;
    int temp = *a;
    int count = 0;

    for(i=0;i<n-1;i++){
        if(temp > *(a+i+1)){
            temp = *(a+i+1);
            count = i+1;
        }
    }
    return count;
}
void input(int n,int *ptr){
    int i,j;
    printf("Input %d Integer:\n",n);

    for(i=0;i<n;i++){
        scanf("%d",&j);
        *(ptr+i) = j;
    }
}
void output(int n,int *ptr){
    int i;

    for(i=0;i<n;i++){
        printf("%4d",*(ptr+i));
    }
    printf("\n");
}
void swap(int *x,int *y){
    int sw;
    sw = *x;
    *x = *y;
    *y = sw;
}
------------------------------------------------------------------------------------------------------------------------------
17. 將字元變數的值插入已經按 ASCII 碼值從小到大排好序的字串中
#include <stdio.h>
#include <string.h>

void order(int n,char a[]);//排序
void insert_char(char a[],char ch);//插入一個字元ch到陣列a[]中

int main()
{
    char i;
    char arra[128]={0};

    printf("請輸入一字串: ");
    scanf("%s",arra);
    order(strlen(arra),arra); //排序,從小到大
    printf("字串的排序為: %s\n",arra);

    printf("請插入一個字元: ");
    getchar();
    scanf("%c",&i);
    insert_char(arra,i);      //插入一個字元
    printf("字元插入結果為: %s\n",arra);

    return 0;
}
void order(int n,char a[])
{
    char swap;
    int i,j;
    for(i=0;i<n-1;i++){
        for(j=0;j<n-1-i;j++){
            if(*(a+j) > *(a+j+1)){
 swap = *(a+1+j);
                *(a+1+j) = *(a+j);
                *(a+j) = swap;
} } }}void insert_char(char a[],char ch){ int i = 0; for(i=0;i<=strlen(a);i++) { if(ch < a[strlen(a)-i]) //從後往前比 { *(a+strlen(a)+1-i) = *(a+strlen(a)-i); //將最大字元往後挪一位 *(a+strlen(a)-i)=ch; //將字元插入中間 } }} ------------------------------------------------------------------------------------------------------------------------------18. 下面程式的功能是從鍵盤上輸入兩個字串,對兩個字串分別排序;然後將它們合併,合併後的字串按 ASCII 碼值從小到大排序,並刪去相同的字元。
#include <stdio.h>
#include <string.h>

void order(int n,char a[]);            //排序
void del_same(int n,char a[],char b[]);//消除相同字元
int main()
{
        char a[256];
        char b[64];
        char res[256]={0};
        
        printf("輸入第一個字串:");
        scanf("%s",a);
        order(strlen(a),a);          //對輸入的第一個字串排序
        printf("排列後      結果:%s\n",a);
        
        printf("輸入第二個字串:");
        scanf("%s",b);
        order(strlen(b),b);          //對輸入的第二個字串排序
        printf("排列後      結果:%s\n",b);
        
        strcat(a,b);                 //合併兩個字串
        order(strlen(a),a);          //合併後排序
        printf("合併後      結果:%s\n",a);

        del_same(strlen(a),a,res);   //刪除相同的字元
        printf("去掉相同字元結果:%s\n",res);

        return 0;
}

void order(int n,char a[])
{
        char swap;
        int i,j;
        for(i=0;i<n-1;i++)
        {
                for(j=0;j<n-1-i;j++)
                {
                        if(*(a+j) > *(a+j+1))
                        {
                                swap = *(a+1+j);
                                *(a+1+j) = *(a+j);
                                *(a+j) = swap;
                        }
                }
        }
}
void del_same(int n,char a[],char b[])
{
        int i;
        int j=0;
        for(i=0;i<=strlen(a);i++)
        {
                if( *(a+i) != *(a+1+i)) 
                {
                        *(b+j) = *(a+i);
                        j++;
                }
        }
}
------------------------------------------------------------------------------------------------------------------------------
19. 一數列 包含 10 個數,已按升序排列,現要求,能夠從指定位置開始的 n 個數按逆序重新排列並輸出新的完整數列(例如:1 ,2,3,4,5,6,7,8,9,10。若要求把從第 4 個數開始的 5 個數逆序重新排列,新數列為 1,2,3,8,7,6,5,4,9,10)
#include <stdio.h>
#define N 10

void input(int n,int *ptr);      //輸入陣列
void output(int n,int *ptr);     //輸出陣列
void order(int n,int a[]);       //對陣列排序
void swap(int *x,int *y);        //交換
void new_alignment(int n,int m,int a[]);//新的排序區間n,m為區間的開始和末尾

int main()
{
    int a,b;
    int arr[N];

    input(N,arr);
    order(N,arr);
    printf("升序排列後為:");
    output(N,arr);

    printf("區間[n,m]為調換區,請輸入n m\n");
    scanf("%d %d",&a,&b);
    new_alignment(a,b,arr);
    printf("排序後的數列:");
    output(N,arr);

    return 0;
}

void new_alignment(int n,int m,int a[]){
    int i;
    int temp;
    for(i=0;i<(m-n)/2;i++)       //將要指定的區間內容進行調換
    {
        swap((a+i+n-1),(a+m-2-i));
    }
}
void swap(int *x,int *y){
    int sw;
    sw = *x;
    *x = *y;
    *y = sw;
}
void input(int n,int *ptr){
    int i,j;
    printf("Input %d Integer:\n",n);

    for(i=0;i<n;i++){
        scanf("%d",&j);
        *(ptr+i) = j;
    }
}
void output(int n,int *ptr){
    int i;

    for(i=0;i<n;i++){
        printf("%4d",*(ptr+i));
    }
    printf("\n");
}
void order(int n,int a[]){
    int swap;
    int i,j;
    for(i=0;i<n-1;i++){
        for(j=0;j<n-1-i;j++){
            if(*(a+j) > *(a+j+1)){
                swap = *(a+1+j);
                *(a+1+j) = *(a+j);
                *(a+j) = swap;
            }
        }
    }
}

------------------------------------------------------------------------------------------------------------------------------

20. 10 個學生圍一圈,從第一個學生開始數數,數到 3 的學生退出,顯示最後剩餘的學生號碼。

#include <stdio.h>
int main()
{
        int arr[128];
        int x,a,i=0,j=0;
        int count=0;
        printf("輸入學生數量x = \n");
        scanf("%d",&x);
        for(a=1;a<=x;a++){      
                *(arr+a-1) = a;  //將10個學生編號為1~10 
        }
/************************************************/      
        while(j < x-1)       //10個學生,那麼迴圈數9次,就剩下最後一個 
        {
                if(*(arr+i) != 0 )
                {
                        count++;      //如果不為0,開始數數
                }
                if(count == 3)    //如果數到三
                {
                        count = 0;    //重新開始數
                        *(arr+i) = 0; //退出後將其位置填0
                        j++;          //當前數的次數+1,
                }
                i++;        //陣列中的數迴圈數數
                if(i == x)  //如果到10了,從第一個數接著數
                {
                        i = 0;
                }
        }
/***************************************************/
        for(i=0;i<10;i++)
        {
                printf("%-3d",*(arr+i));
        }
        printf("\n");
        return 0;
}
------------------------------------------------------------------------------------------------------------------------------
21. 程式的功能是輸入 10 個整數,將它們存入陣列a 中,再輸入一個數 x,然後在陣列中查詢 x,如果找到,輸出相應的下標(如有多個元素與 x 相等,只要輸出下標值最小的那個元素的下標),否則,輸出“Not Found”。
#include <stdio.h>
#define N 10

void input(int n,int *ptr);   //輸入陣列
void output(int n,int *ptr);  //輸出陣列
void find_num(int n,int a[],int *m,int b[]); //查詢陣列

int main()
{
    int arr[N];     //輸入一個數組
    int nu[N];      //儲存查詢後索引號的陣列
    int s=0;        //標記,有多少個相同元素

    input(N,arr);
    find_num(N,arr,&s,nu);
    printf("x 的索引為:\n");
    output(s,nu);//輸出結果
    return 0;
}
void find_num(int n,int a[],int *m,int num[])
{
    int x,i;

    printf("input a num:\n");
    scanf("%d",&x);
    for(i=0;i<n;i++)
    {
        if(x == *(a+i))    //如果輸入的x與陣列中的元素相同
        {
            *(num+*m) = i; //將索引號存入陣列num中,
            (*m)++;        //有意個相等,那麼標記就+1。
        }
    }
    if(*m == 0) //如果一次都不相等,那麼就是沒有找到
    {
        printf("Not Found!");
    }
    printf("\n");
}
void input(int n,int *ptr){
    int i,j;
    printf("Input %d Integer:\n",n);

    for(i=0;i<n;i++){
        scanf("%d",&j);
        *(ptr+i) = j;
    }
}
void output(int n,int *ptr){
    int i;

    for(i=0;i<n;i++){
        printf("%4d",*(ptr+i));
    }
    printf("\n");
}
------------------------------------------------------------------------------------------------------------------------------
22. 求數列中第二小的數
#include <stdio.h>
#define N 5

void input(int n,int *ptr);//輸入一個數組
void order(int n,int a[]); //排序

int main()
{
    int arr[N];
    input(N,arr);                 //輸入一個數組
    order(N,arr);                 //對著個數組排序
    printf("第二小的數 = %d\n",*(arr+1));
    return 0;
}
void order(int n,int a[])
{
    int swap;
    int i,j;
    for(i=0;i<n-1;i++)
    {
        for(j=0;j<n-1-i;j++)
        {
            if(*(a+j) > *(a+j+1)){
                swap = *(a+1+j);
                *(a+1+j) = *(a+j);
                *(a+j) = swap;
            }
        }
    }
}
void input(int n,int *ptr)
{
    int i,j;
    printf("Input %d Integer:\n",n);

    for(i=0;i<n;i++)
    {
        scanf("%d",&j);
        *(ptr+i) = j;
    }
}
------------------------------------------------------------------------------------------------------------------------------
23. 統計兩個陣列中相應元素大於、等於或小於的次數,並由此決定那個陣列較大。
#include <stdio.h>
#include <string.h>
void compare();
int main()
{
        compare();   //比較兩個陣列
        return 0;
}
void compare()
{
        char arra[128];
        char arrb[128];
        int i,s,a=0,b=0,c=0;
        printf("輸入第一個字串:");
        scanf("%s",arra);
        printf("輸入第二個字串:");
        scanf("%s",arrb);

        if(strlen(arra) >= strlen(arrb))
        {
                s = strlen(arra);   //s為比較次數,兩個陣列那個字串長度長取哪個
        }else{
                s = strlen(arrb);
        }

        for(i=0;i<s;i++)
        {
                if(*(arra+i) > *(arrb+i)){
                        a++;            //大於的次數
                }else if(*(arra+i) < *(arrb+i)){
                        b++;            //小於的次數
                }else if(*(arra+i) == *(arrb+i)){
                        c++;            //等於的次數
                }
        }
        printf("\n");
        if( a > b ){
                printf("第 一 個字串大\n");
        }else if(a < b){
                printf("第 二 個字串大\n");   
        }else{
                printf(" 兩個字串相等\n");
        }
        printf("第1個字串相應元素 大於 第二個的次數為:%d次\n",a);
        printf("                    小於               :%d次\n",b);
        printf("                    等於               :%d次\n",c);

}
------------------------------------------------------------------------------------------------------------------------------
24. 請編寫一個函式 fun,它的功能是:將一個字串轉換為一個整數
#include <stdio.h>
#include <string.h>

int main()
{
        char arr[256]={0};
        char brr[128]={0};
        int i,j=0;
        int sum = 0;

        printf("輸入一個數字字串:");
        scanf("%s",arr);
        for(i=0;i<strlen(arr);i++)    //輸入的字串,將數字取出來存入brr中
        {
                if(arr[i] >= '0' && arr[i] <= '9')
                {
                        brr[j] = arr[i];
                        j++;
                }
        }
        for(i=0;i<strlen(brr);i++)    //對brr中的字元數子進行轉換,轉黃乘整數
        {
                sum = sum*10+(brr[i]-'0');
        }
        printf("sum = %d\n",sum);

        return 0;
}
------------------------------------------------------------------------------------------------------------------------------
25. 編寫一個函式,該函式可以統計一個字串在另一個字串中出現的次數。
#include <stdio.h>
#include <string.h>
int statistic(char a[],char b[]); //統計b在a中出現的次數
int main()
{
        char a[128];
        char b[32];
        printf("請輸入一個字串char_1:");
        scanf("%s",a);
        getchar();
        printf("請輸入查詢字串char_2:");
        scanf("%s",b);
        statistic(a,b); //統計b在a中出現的次數,返回值:出現的次數
        printf("字串char_2在char_1中出現 %d 次。\n",statistic(a,b));
        return 0;
}
int statistic(char a[],char b[])
{
        int i,j,s=0,k=0;
        for(i=0;i<strlen(a);i++)                //字串char1長度,將每個字元都跟char2的比較
        {
                if(*(a+i) == *b)
                {
                        for(j=0;j<strlen(b);j++)        //字串char2長度,判斷char1當前字串開頭的後的每位字元,是否都與char2的每位
字元相等
                        {
                                if(a[i+j] == b[j])
                                {
                                        s++;//如果有一個相等,則s就+1,
                                }else{
                                        s=0;
                                } 
                                if(s == strlen(b))//如果s等於有strlen(b),則證明這每位的字元都相等
                                {
                                        k++;                            //k+1,證明該char2在char1中出現了1次
                                        s=0;                            //重新計數
                                }
                        }
                }
        }
        return k;
}
------------------------------------------------------------------------------------------------------------------------------
26. 該程式功能是執行時輸入 n,輸出 n 各位數字之和(如 n=1308,則輸出 12,n=-3204 則輸出 9)
#include <stdio.h>
#include <string.h>
int main()
{
        char arr[128];
        int i,sum = 0;

        printf("請輸入n:");
        scanf("%s",arr);

        if(*arr == '-'){
                for(i=1;i<strlen(arr);i++)
                {       
                        sum += (*(arr+i)-'0');
                }
                printf("sum = %d\n",sum);
        }
        else{
                for(i=0;i<strlen(arr);i++)
                {
                        sum += (*(arr+i)-'0');
                }
                printf("sum = %d\n",sum);
        }
        return 0;
}

------------------------------------------------------------------------------------------------------------------------------
27. 統計整數的各位數字中零的個數,並求各位數字中最大者的個數及最大數輸出。

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

int fun_max(int n,char a[]);//差炸最大值下標
int main()
{
    char a[128],s;
    int i;
    int couna = 0;
    int counb = 0;
    printf("請輸入一個整數: \n");
    scanf("%s",a);
    s=*(a+fun_max(strlen(a),a));  //s為陣列中的最大數
    for(i=0;i<strlen(a);i++)
    {
        if( *(a+i)>='0' && *(a+i)<='9' )
        {
            if(*(a+i)=='0')       //統計0的個數
            {
                couna++;
            }
            else if(*(a+i) == s)  //統計最大數的個數
            {
                counb++;
            }
        }
    }
    printf("該整數有 %d 個 0\n",couna);
    printf("該整數最大數為%c\n",s);
    printf("該整數有 %d 個 %c\n",counb,s);
    return 0;
}
int fun_max(int n,char a[])
{
    int i;
    int temp = *a;
    int count = 0;

    for(i=0;i<n-1;i++)
    {
        if(temp < *(a+i+1))
        {
            temp = *(a+i+1);
            count = i+1;
        }
    }
    return count;
}

------------------------------------------------------------------------------------------------------------------------------
28. 計算一個英文句子中最長的單詞的長度。假設英文句子只有字母和空格,連續的字母為單詞,句子以‘.‘結束。(利用一級指標)

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

int fun_max(int n,int a[]);

int main()
{
    char arr[128];
    int sum[64];
    int i, a = 0, b = 0;
    printf("輸入一個英文句子,單詞以空格分離,結束用‘.’標註\n");
    gets(arr);
    for(i=0;i<=strlen(arr);i++)
    {
        if(*(arr+i) != ' ' && *(arr+i) != '.')
        {
            a++;                    //當前連續字母個數
        }else{                          //如果遇到空格或者'.'的時候,證明一個單詞結束,a代表單詞的個數
            *(sum+b) = a;   //將 a 的值存入陣列sum中,a的數值為空格前面單詞的字元數
            a=0;                    //將 a 清零,重新記錄下一個
            b++;                    //記錄有多少個單詞
        }
    }
    printf("最長的單詞長度為 %d 個位元組\n",*(sum+fun_max(b,sum))); //fun_max(b,sum)為新陣列最大數的索引
    return 0;       
}
int fun_max(int n,int a[])
{
    int i;
    int temp = *a;
    int count = 0;

    for(i=0;i<n-1;i++)
    {
        if(temp < *(a+i+1))
        {
            temp = *(a+i+1);
            count = i+1;
        }
    }
    return count;
}
------------------------------------------------------------------------------------------------------------------------------

29. 輸入一個字串,然後按下面要求輸出一個新的字串。新串是在原串中的每兩個字元之間分別插入 1、3、5,......個字元'#'形成的。例如,原串為"abcd"、那麼新串為"a#b###c#####d"。如果原串中只有一個字元,則新串與原串相同。

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int new_mamory_count(int count);          //新開闢空間總個數,count:原記憶體字元個數
void insert(int count,char *ptr,char a[]);//將輸入的字元插入新開闢的空間中
int main()
{               
        char a[64],ch;
        char *pstr=(char *)malloc(sizeof(char));
        int i,len = 1,count=0;
        int sum = 0;
        memset(pstr,0,len);
        while(1)
        {
                scanf("%c",&ch);
                if(ch != '\n')
                {
                        pstr=(char *)realloc(pstr,len);//將原pstr所指堆中的內容拷貝到新開闢的記憶體中,新地址重新賦給pstr,空間大小+1,
用於判斷下一個。
                        len ++;                        //空間+1,用於下一個
                        *(pstr+count) = ch;            //將值賦給開闢的空間
                        *(a+count) = ch;               //儲存輸入字元
                        count ++;                      //索引+1,存放資料,也是元素個數
                }
                else                               //如果遇到回車,退出
                {
                        break;
                }
        }
        sum = new_mamory_count(count);
        pstr = realloc(pstr,sum+1);           //sum+count+1開闢新空間大小,+1多開闢一個用於存'\0'
        *(pstr+sum+1) = '\0';                 //最後一個空間存'\0'
        memset(pstr,'#',sum);                 //剩餘空間填 # 
        
        insert(count,pstr,a);                 //將輸入的字串插入
        printf("%s\n",pstr);
        free(pstr);
        return 0;
}
int new_mamory_count(int count)          //新開闢空間總個數,count:原記憶體字元個數
{
        int sum;
        int i;
        for(i=0;i<count-1;i++)               //count:輸入元素個數
        { 
                sum = sum + 2*i +1;             //統計字母中要插入 # 的個數
        }
        sum = sum + count;
        return sum;
}
void insert(int count,char *ptr,char a[])
{
        int sum;
        int i;
        for(i=0;i<count;i++)                //在對應的位置插入字元陣列中a[]中的各元素。
        {
                sum = sum + 2*i + 1;
                *(ptr+sum-i-1) = *(a+i);
        }
}

------------------------------------------------------------------------------------------------------------------------------

30. 在執行檔名後輸入十個字串,通過函式找出最長的那個串

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

int fun_max(int n,int a[]); //查詢最大值下標
int main (int argc,char *argv[])   //argc:統計 ./ 後面輸入字串串的個數。*argc[]:陣列指標,儲存各個陣列的收地址
{
        char temp;
        int i,j;
        int arr[32];
        for(i=1;i<argc;i++)
        {   
                arr[i-1] = strlen(*(argv+i)); //統計每個字串的長度,並一次存入陣列arr中
        }
        fun_max(argc-1,arr);
        
        printf("%s\n",argv[fun_max(argc,arr)+1]);
        
        return 0;
}

/*
*功能:查詢一個含有N個數組中最小元素的位置
* @retuan:count:索引
* */

int fun_max(int n,int a[])
{
        int i;
        int temp = *a;
        int count = 0;

        for(i=0;i<n-1;i++)
        {
                if(temp < *(a+i+1))
                {
                        temp = *(a+i+1);
                        count = i+1;
                }
        }
        return count;
}

------------------------------------------------------------------------------------------------------------------------------
31. 將字串中的數字串取出存入各個陣列中,例如:如 adfad1234adfj4561,則分別取出 1234、4561 放
到陣列中,並轉置,既放進去是 4321,1654;
/*功能:在字串str中查詢數字字串
  引數:
  str:查詢的字串
  pNumStrLen:在查詢的字串中第一個數字字串的長度
  返回值:查詢成功返回第一個數字串的首地址 查詢失敗返回null
*/
char *findNumStr(char *pstr, int *pNumStrLen);

設計思路:
1 計算源串有多少個數字串
2 char *findNumStr(char *pstr, int *pNumStrLen);
獲取每個數字串的長度並儲存
3 為每個數字串開闢足夠空間並將每個首地址儲存
4 將每個數字串的內容複製到每個新開闢的記憶體空間中

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

char *findNumStr(char *pstr,int *pNumStrlen){
        int i;
        int nu_ch = 0,count_nu = 0;
        char *p = NULL;
        
        for(i=0;i<strlen(pstr);i++){
                if( pstr[i] >= '0' && pstr[i] <= '9'){
                        nu_ch++;
                }
        }
        if(nu_ch != 0){
                for(i=0;i<strlen(pstr);i++){
                        if( pstr[i] >= '0' && pstr[i] <= '9'){
                                p = pstr+i - count_nu;
                                count_nu++;
                        }else if(count_nu != 0){
                                *pNumStrlen = count_nu;
                                return p;
                        }
                }
        }
        else 
        {
                return NULL;
        }
}
int main()
{
        char pstr[64];
        char *p=NULL;
        int pNumStrlen = 0;

        printf("輸入字串\n");
        scanf("%s",pstr);                               //列印收地址
        printf("字串首地址       = %p\n",pstr);

        p = findNumStr(pstr,&pNumStrlen);
        printf("第一個數字串首地址 = %p\n",p);

        printf("第一個數字串的長度 = %d\n",pNumStrlen);

        return 0;
}
------------------------------------------------------------------------------------------------------------------------------
32.搜尋競價排名系統,在大量的資訊尋找一個特定的資訊,排序是按照某個關鍵字的大小遞增或遞減。
#include <stdio.h>
#include <string.h>

#define ARRAY_NUM(a, len) (sizeof(a)/(len))

void keySort(char (*p)[21], int arrayNum);
int findKey(char *keyStr, char (*p)[21], int arrayNum);

int main()
{       
        char array[][21]={"牛仔裝","牛仔褲","牛仔服","耳環","帽廠","中國印染","電熨斗","旗袍","棉紡織品","毛皮","襯衣","男女皮鞋",
        "鴨絨枕","被褥","芭蕾舞衣","長統襪","毛紡織業","真絲服裝","羅口手套","手套","褲襪","印染棉布","中國絲綢","胸罩","鞋城",
        "褲子","羊絨紗","加密鎖","羊毛衫","針織產品","紡織印染","雨披","領結","毛皮服裝","潛水服","羊毛","混紡布","女式服裝",
        "羊駝絨","棉毛衫褲","圍巾","西服","羊毛衫","拖鞋","襪業","運動服","制服","女士大衣","內衣","內褲","皮手套","襪子","鞋襪",
        "帽子","尖頭鞋","飛行帽","鞋墊","挎包","童裝","羊毛","馬海毛","開司米","羊毛線","純羊毛","皮靴","胸針", "冰茶","清茶",
        "冰糖","雪糕","茶葉","飯館","醬","香菇","猴頭","蘆筍","小麥","杏茶","河蟹","海藻","燕窩","麵包","燕麥片","海帶","米醋",
        "扎啤","洋酒","話梅","粽子","柑橘","滷味","花粉","杏仁露","花生醬","香蘭素","海藻酸","酒具","乳製品","茉莉花茶","乾貝",
        "醬菜","豆汁","脆棗","蝦皮","堅果仁","菠菜","矽藻","冰激淋","黃豆","木耳","小米","辣椒醬","檸檬酸","礦泉水","紅酒",
        "米粉","牛肉乾","棗","小籠包","辣醬油","鮮奶油","海蟄","菜花","冬筍","棗脯","果膠糖","蝦米","棗泥","方糖","榴蓮","香椿",
        "滷肉","桔子","壓縮餅乾","豆腐","墨魚","墨魚仔","烏魚蛋","炸醬麵","奶油蛋糕","黃油醬","豆餅","鮮荔枝","瓶裝啤酒",
        "水煮魚","香辣蟹","福壽螺","巧克力","鮮奶","蘋果","果汁","冰紅茶"};
        //根據字元的長度排序
        int arrayNum=ARRAY_NUM(array, 21);
        int i;
        keySort(array, arrayNum);
        for(i=0; i<arrayNum; i++)
        {
                printf("%s\n", array[i]);
        }

        char keyStr[1024];
        int resultIndex=0;

        memset(keyStr, 0, sizeof(keyStr));
        printf("輸入關鍵字:");
        scanf("%s", keyStr);

        resultIndex=findKey(keyStr, array, arrayNum);
        if(resultIndex != -1)
        {
                printf("%s is found!\n", array[resultIndex]);
        }
        else
        {
                printf("%s isnot found!\n", keyStr);
        }
        return 0;
}
int findKey(char *keyStr, char (*p)[21], int arrayNum)
{
        int i;
        for(i=0;i<arrayNum;i++)
        {
                if(strcmp(keyStr,*(p+i)) == 0)
                {
                        return i;
                }
        }

        return -1;
}
void keySort(char (*p)[21], int arrayNum)
{
        int i, j;
        int len1, len2;
        char buf[50];
        for(i=0;i<arrayNum-1;i++)
        {
                for(j=0;j<arrayNum-1-i;j++)
                {
                        if(strlen( *(p+j) ) > strlen( *(p+j+1) ) ) 
                        {
                                strcpy( buf , (*(p+j)) );
                                strcpy( (*(p+j)) , (*(p+j+1)) );
                                strcpy( (*(p+j+1)) , buf ) ;
                        }
                }
        }
        return;
}

------------------------------------------------------------------------------------------------------------------------------

33. 結構體中存n(從鍵盤接受)人的姓名和年齡,輸出年齡最大者的姓名和年齡。
Struc student{
char name[20];
int age;
}

//pub.h
#ifndef PUB_H
#define PUB_H

#include <iostream>

using namespace std;

#endif
#include "pub.h"

int fun_max(int n,struct student_t *p);//查詢陣列中的最大值,返回值為其索引
struct student_t{
        char name[68];
        int age;
};

int main()
{       
        int i,index;
        int stuNum;
        int arr[64];
        struct student_t person[30];

        cout<<"輸入學生人數"<<endl;
        cin>>stuNum;

        for(i=0;i<stuNum;i++)
        {
                cout<<"輸入姓名,年齡"<<endl;
                cin>>(person+i)->name;
                cin>>(person+i)->age;
//              arr[i] = (person+i)->age; //將年齡存入陣列arr中
        }

        index = fun_max(stuNum,person);           //s為最大值索引
//      printf("name:%s   age:%d\n",person[index].name,person[index].age);
        cout<<"姓名:"<<person[index].name<<endl;
        cout<<"年齡: "<<person[index].age<<endl;
        return 0;
}
int fun_max(int n,struct student_t *p)
{
        int i;
        int temp = p[0].age;
        int count = 0;

        for(i=1;i<n;i++)
        {
                if(temp < p[i].age)
                {
                        temp = p[i].age;
                        count = i;
                }
        }
        return count;
}

------------------------------------------------------------------------------------------------------------------------------
34. 統計學生成績,功能包括輸入學生姓名和成績,按成績從高到低排序輸出,對前 70%的學生為合格,而後 30%的學生不合格。
Strucr Student{
char *name;
int scoer;
}

//lib.h
#ifndef _WORK34_H
#define _WORK34_H

typedef struct student_t{
        int score;
        char name[32];
}STU;
void input_student(int *p,STU *ptr);
void order(int *p,STU *ptr,STU *ppr);
void output_student(int *p,STU *ptr);

#endif
//lib.c
#include <stdio.h>
#include "lib.h"
void input_student(int *p,STU *ptr)
{
        int i;
        for(i=0;i<*p;i++)
        {
                printf("請輸入第%d個學生姓名\n",i+1);
                scanf("%s",(ptr+i)->name);
                printf("請輸入第%d個學生成績\n",i+1);
                scanf("%d",&(ptr+i)->score);
        }
}
void order(int *p,STU *ptr,STU *ppr)
{
        int i,j;
        for(i=0;i<*p-1;i++)
        {
                for(j=0;j<*p-1-i;j++)
                {
                        if((ptr+j)->score < (ptr+j+1)->score ) //如果第一個結構體中學生成績小於第二個
                        {
                                *ppr = *(ptr+j);                   //直接交換兩個結構體
                                *(ptr+j) = *(ptr+j+1);
                                *(ptr+j+1) = *ppr;
                        }
                }
        }
}
void output_student(int *p,STU *ptr)
{
        int i;
        for(i=0;i<*p;i++)
        {
                if(i == 0){
                        printf("合格學生為\n");
                }
                printf("姓名:%-15s成績:%d\n",(ptr+i)->name,(ptr+i)->score);
                if(i == (int)((*p)*0.7)){            //前70%為合格,後%30為不合格
                        printf("不合格學生為\n");
                }
        }
}
//main.c
#include <stdio.h>
#include "lib.h"
int main()
{
        STU ptr[128];             //存放學生姓名和成績
        STU ppr[128];             //結構體型別陣列,用來儲存臨時交換的值
        int sum;
        printf("請輸入學生總數:");
        scanf("%d",&sum);         //輸入學生人數
        input_student(&sum,ptr);  //輸入每個學生的姓名和成績
        order(&sum,ptr,ppr);      //對ptr陣列中的學生排序
        output_student(&sum,ptr); //輸入成績

        return 0;
}

------------------------------------------------------------------------------------------------------------------------------
35. 輸入 x 個學校,每個學校 y 個班級,每個班級 z個學生,列印每個學校所有成績的和。
Struct School{
struct class *sch_class;
}
struct class{
struct Student *class_student;
}
struct Student{
int stu_id;
int stu_score;
}

#include <stdio.h>
#include <stdlib.h>
#define X 2
#define Y 3
#define Z 2
typedef struct Student_t{
        int stu_id;
        int stu_score;
}STU;
typedef struct Class_t{
        struct Student_t *stu_ptr;
}CLA;
typedef struct School_t{
        struct Class_t *cla_ptr;
}SCH;

int main()
{       
        int i,j,k;
        int sum = 0,su = 0,s = 0;

        SCH *sch_ptr = (SCH *)malloc( X *sizeof(SCH));
        for(i=0;i<X;i++)
        {
                (sch_ptr+i)->cla_ptr = (CLA *)malloc( Y * sizeof(CLA));
                for(j=0;j<Y;j++)
                {
                        ((sch_ptr+i)->cla_ptr+j)->stu_ptr = (STU *)malloc( Z * sizeof(STU));
                        for(k=0;k<Z;k++)
                        {
                                printf("輸入第%d個學校,第%d個班級,第%d個學生的 ID 和 成績:\n",i+1,j+1,k+1);
                                scanf("%d %d",&(((sch_ptr+i)->cla_ptr+j)->stu_ptr+k)->stu_id,&(((sch_ptr+i)->cla_ptr+j)->stu_ptr+k)->stu_score);
                                sum = sum + (((sch_ptr+i)->cla_ptr+j)->stu_ptr+k)->stu_score;
                        }
                        su = su + sum ;
                        sum = 0;
                }
                s = s + su;
                printf("第%d個學校學生的總成績為:%d\n",i+1,su);
                s = 0;
        }
        printf("\n");
        return 0;
}

------------------------------------------------------------------------------------------------------------------------------

36. 定義結構體包括資料域和指向本身結構體的指標,並定義三個這樣結構體變數,
(1)將三個變數連線 x 的指標域指向 y,y 的指標域指向 z,z 的指標域指向 NULL,並在主函式中列印其資料域的值。
p=link(x, y, z);
根據p列印x、y、z的資料
(2)將 y 刪除,遍歷列印鏈的值
void delete(y.data, p);
根據p列印資料域內容
(3)將 y 新增到鏈上,遍歷列印鏈的值。
insertHead(p, y);
根據p列印資料域->y.data x.data z.data

#include <stdio.h>
typedef struct Pointer_t{
        int data;
        struct Pointer_t *ptr; 
}POT;
POT *link(POT *x,POT *y,POT *z)
{
        POT *p = x;
        x->ptr = y;
        y->ptr = z;
        z->ptr = NULL;
        return p;
}
void delete(POT *p,POT *y)
{
        p->ptr = y->ptr;
}
POT *insertHead(POT *p,POT *y)
{
        POT *pnew = y;
        y->ptr = p;
        return pnew;
}
int main()
{
        POT *p = NULL;
        POT x;
        POT y;
        POT z;
        
        printf("輸入 X Y Z :\n");
        scanf("%d %d %d",&x.data,&y.data,&z.data);
        
        p = link(&x,&y,&z);   //根據p列印x,y,z的數值
        printf("P=%d P1=%d P2=%d\n",p->data,p->ptr->data,p->ptr->ptr->data);
        
        delete(p,&y);           //將y鏈刪除
        printf("P=%d P1=%d\n",p->data,p->ptr->data);
        
        p = insertHead(p,&y); //將y新增到鏈上
        printf("P=%dX P1=%d P2=%d\n",p->data,p->ptr->data,p->ptr->ptr->data);
        return 0;
}
------------------------------------------------------------------------------------------------------------------------------
37. 實現計算器功能輸入+、-、*、/輸出計算的結果
struct opt{
int (*p_add)(int, int);
int (*p_sub)(int, int);
int (*p_div)(int, int);
int (*p_mul)(int, int);
}
//lib.h
#ifndef _WORK37_H
#define _WORK37_H

struct arithmetic_t{
        int (*p_add)(int,int);
        int (*p_sub)(int,int);
        int (*p_div)(int,int);
        int (*p_mul)(int,int);
};
int add(int x,int y);
int sub(int x,int y);
int div(int x,int y);
int mul(int x,int y);

#endif
//lib.c
#include <stdio.h>
#include "lib.h"

int add(int x,int y) //加
{
        int sum;
        sum = x + y;
        return sum;
}
int sub(int x,int y) //減
{
        int sum;
        sum = x - y;
}
int div(int x,int y) //乘
{
        int sum;
        if(y == 0)
        {
                printf("data2 不能為 0\n");
        }else{
                sum = x / y;
        }
        return sum;
}
int mul(int x,int y) //除
{
        int sum;
        sum = x * y;
        return sum;
}
//main.c
#include <stdio.h>
#include "lib.h"
int main()
{
    struct arithmetic_t op;
        int data1,data2,ret;
        char ch;
        printf("輸入 運算子 data1 data2\n");
        scanf("%c %d %d",&ch,&data1,&data2);
        switch(ch)
        {
                case '+':op.p_add = add;ret = op.p_add(data1,data2);break;
                case '-':op.p_sub = sub;ret = op.p_sub(data1,data2);break;
                case '/':op.p_div = div;ret = op.p_div(data1,data2);break;
                case '*':op.p_mul = mul;ret = op.p_mul(data1,data2);break;
        }
        printf("sum = %d\n",ret);
        return 0;
}
------------------------------------------------------------------------------------------------------------------------------
38. 根據以下要求編寫函式。
1)、輸入引數是 unsigned char 型別
2)、引數的格式是:
bit      數值    含義
0~1     2      輸出字串“你是”
其他            輸出字串“我是”
2~4     5      輸出字串“集團”
其他            輸出字串“股份”
5~7     4      輸出字串“員工”
其他             輸出字串“職員”
#include <stdio.h>

struct pack_t{
        unsigned a:2;
        unsigned b:3;
        unsigned c:3;
};
union pack_k{
        char ch;
        struct pack_t byte;
};
int main()
{
        union pack_k ch;
        printf("輸入一個字元:\n");
        scanf("%c",&ch.ch);
        if(ch.byte.a == 2){
                printf("你是");
        }else{
                printf("我是");
        }
        if(ch.byte.b == 3){
                printf("集團");
        }else{
                printf("股份");
        }
        if(ch.byte.c == 3){
                printf("員工!\n");
        }else{
                printf("職員!\n");
        }
        return 0;
}
------------------------------------------------------------------------------------------------------------------------------
39. 編寫程式,從鍵盤輸入 3 個學生的資料,將它們存入檔案 student;然後再從檔案中讀出資料,顯示在螢幕上。
Struct Student{
int stu_id;
char *stu_name;
int stu_age;
char addr[200];
}
#include <stdio.h>
#define N 3
struct Student_t{
        int stu_id;
        char stu_name[200];
        int stu_age;
        char addr[200];
};
void write(struct Student_t *data,int n);
void read(struct Student_t *date,int n);
int main()
{
        FILE *fp=NULL,*fpr=NULL;      //定義兩個檔案流
//      size_t num;
        struct Student_t data[3]={0}; //fwrite寫檔案的緩衝區
        struct Student_t date[3]={0}; //fread 讀檔案的緩衝區
/***************************寫入***********************************/
        fp = fopen("student","w");
        if(fp == NULL){
                printf("file open failt!\n");
                return 1;
        }
        write(data,3);
        fwrite(data,sizeof(struct Student_t),3,fp); //緩衝區、結構體長度
        fclose(fp);                                 //每次讀入位元組數
        printf("file write success!\n");            //檔案流入口
/***************************讀出***********************************/
        fpr = fopen("student","r");
        if(fpr == NULL){
                printf("file open failt!\n");
                return 1;
        }
        fread(date+1,sizeof(struct Student_t),1,fpr);
        read(date,3);
        fclose(fpr);
        printf("file read success!\n");
/******************************************************************/
        return 0;
}
void write(struct Student_t *data,int n)        //輸入學生資訊
{       
        int i;
        for(i=0;i<3;i++){
                printf(