2011年1月16日 星期日

上禮拜大刀的C程式期末考題目與我的答案

第一題:設計一程式,計算一個文字檔中,各個字元字母出現的次數,如文字檔為:


程式碼:
#include<stdio.h>
#include<stdlib.h>
int c[26];//c[0]是放有多少個A,c[1]是放有多少個B......
int main(void)
{
    FILE *f;
    char ch,fn[30];
    int count(char),appear(),i;
    printf("請輸入檔名:");
    scanf("%s",fn);
    if((f=fopen(fn,"r"))==NULL)
    {
        printf("Uh~Oh~\n檔案:%s 無法正確開啟喔!\n",fn);
        system("pause");
        exit(1);//結束這個程式
    }
    printf(" 字母   次數\n------ ------\n");
    for(i=0;i<26;i++) c[i]=0;//c[0]~c[26]的內容全部代入0
    while((ch=getc(f))!=EOF) count(ch);//每讀取文字檔的一個字,就跑副程式count
    appear();
    system("pause");
    return 0;
}

//
int count(char ch)
{
    int i;
    for(i=0;i<26;i++)
    {
        //字元變數若放65的話,%d出來是65,%c出來是A
        //字元變數若放97的話,%d出來是97,%c出來是a
        if(ch==i+65) c[i]++;//若符合這個大寫字母,就把相對應的c[i]變數內容+1
        if(ch==i+97) c[i]++;//若符合這個小寫字母,就把相對應的c[i]變數內容+1
    }
    return 0;
}

//把A到Z顯示列表出來!
int appear()
{
    int i;   
    for(i=0;i<26;i++)
    {
        if(c[i]!=0) printf("   %c    %4d\n",i+65,c[i]);
    }
    return 0;
}

執行結果:


第二題:設計一程式,求出小於10000的整數中,所有符合完美數的整數
如:6的因數有1、2、3,其中1+2+3=6

程式碼:
#include<stdio.h>
#include<stdlib.h>
int num;
int main(void)
{
    for(num=2;num<10000;num++)//從2~10000交給副程式asd去試
    {
        asd(num);                     
    }
    printf("\n");
    system("pause");
    return 0;
}


int asd(int a)

    int af=a/2;//把目前的數除二(到時候因數處裡布包含本身的數)
    int i,c[af],sum=0;//sum為所有因數總和
    for(i=0;i<af;i++) c[i]=0;
    //把所有的因數分別放入c變數陣列
    for(i=1;i<af+1;i++)
    {
        if(a%i==0)
        {
                   c[i-1]=i;
                  
        }
    }
    //把放在陣列c(剛算出的因數)裡的通通加起來
    for(i=0;i<af;i++)
    {
         sum=sum+c[i];
         //printf("%d ",c[i]);
    }
    //若因數總和sum有沒有等於目前原先的數,有的話即是完美數,就顯示出來!
    if(sum==a) printf("%d ",a);
    return 0;
}

執行結果:


PS.我的執行結果圖中有「sh: pause: not found」,因為我是用gcc編譯,不是Dev C++,gcc不認得「system("pause");」,沒關係!先不用去裡它!