天天看點

第三次作業(字元,單詞統計)

題目要求:從檔案中讀取字元,然後統計字元的數目,和單詞的數目。

首先打開一個檔案,對裡面存的東西進行統計,剛開始判斷是否為單詞的組成部分:

代碼如下:

FILE *fp;//檔案指針
    char c; //檔案字元讀取存儲
    fp = fopen("D:\\a\\a.txt", "r");
    if (fp == NULL)
    {
        printf("檔案打開失敗");
        return 0;
    }
    while (feof(fp) != 1)
    {
        c = fgetc(fp);
        if (isalnum(c) != 0 || c == '_' || c == '.')
        {
            Word(fp);
            words[wordnum] = c;
            wordnum++;
        }
        else if (c == ' ')
        {
            space++;
        }
        else
        {
            character++;
        }
    }              

如果是單詞的組成部分之一,那麼函數跳入單詞判斷函數word()中,且将檔案指針傳進去,且該字元存入單詞存儲的數組中,

word()函數如下:

int Word(char *f)
{
    char c;
    while (feof(f) != 1)
    {
        c = fgetc(f);
        if (isalnum(c) != 0 || c == '_' || c == '.')
        {
            character++;
            words[wordnum] = c;
            wordnum++;
        }
        else if (c == ' ')
        {
            space++;
            word++;
            words[wordnum] = ' ';
            wordnum++;
            return 1;
        }
        else
        {
            word++;
            words[wordnum] = ' ';
            wordnum++;
            return 1;
        }
    }
}      

當檔案沒有結束時,判斷指針所指向的字元是否為單詞的組成部分,如果是字元數加一,該字元存入單詞數組中;如果是空格,空格字元數加一,字元數加一,單詞數加一,在單詞數組中存入一個空格字元;如果是其他字元,字元數加一,單詞數加一,在單詞數組中存入一個空格字元。傳回主函數。

輸出結果示例:

第三次作業(字元,單詞統計)

然後是單詞輸出,函數如下:

int show()
{
    int a;
    for (int i = 0; i < wordnum - 1; i++)
    {
        if (words[i] == ' ')
        {
            printf("\n");
            continue;
        }
        printf("%c", words[i]);
    }
    printf("謝謝使用");
}      

當數組中元素是空格時,說明是一個單詞結束了,如果是,輸出回車,且用continue跳出本次循環,

第三次作業(字元,單詞統計)

作業感想:

這個程式并不是太難,主要是用到有關檔案的知識,開始的時候感覺比較煩,因為要寫檔案,但是當寫完程式時,看着自己程式運作時感到非常高興,以前的我不怎麼願意用檔案,有時候都是用大的數組,或者是結構體進行存儲,但是突然發現寫檔案的代碼挺好玩的,比較有意思,以後還要多多練習,尤其是自己不太喜歡的地方。

總代碼:

#include<stdio.h>
#include<ctype.h>
#include<stdlib.h>
int character = 0;//字元數
int word = 0;//單詞數
int space = 0;//空格數
char words[1000];//單詞存儲
int wordnum = 0;//單詞存儲的數組位置
int Word(char *f);//檢驗是否為單詞
int show();//顯示單詞
int main()
{
    int choice;//選擇的輸入
    FILE *fp;//檔案指針
    char c; //檔案字元讀取存儲
    fp = fopen("D:\\a\\a.txt", "r");
    if (fp == NULL)
    {
        printf("檔案打開失敗");
        return 0;
    }
    while (feof(fp) != 1)
    {
        c = fgetc(fp);
        if (isalnum(c) != 0 || c == '_' || c == '.')
        {
            Word(fp);
            words[wordnum] = c;
            wordnum++;
        }
        else if (c == ' ')
        {
            space++;
        }
        else
        {
            character++;
        }
    }
    printf("檔案中字元,單詞統計如下:\n");
    printf("單詞數:%d,符号數:%d,空格數:%d\n", word, character, space);
    fclose(fp);
    printf("檢視單詞請按1,否則請按任意鍵");
    scanf_s("%d", &choice);
    if (choice == 1)
    {
        show();
    }
    else
        return 1;
}
int Word(char *f)
{
    char c;
    while (feof(f) != 1)
    {
        c = fgetc(f);
        if (isalnum(c) != 0 || c == '_' || c == '.')
        {
            character++;
            words[wordnum] = c;
            wordnum++;
        }
        else if (c == ' ')
        {
            space++;
            word++;
            words[wordnum] = ' ';
            wordnum++;
            return 1;
        }
        else
        {
            word++;
            words[wordnum] = ' ';
            wordnum++;
            return 1;
        }
    }
}
int show()
{
    int a;
    for (int i = 0; i < wordnum -1; i++)
    {
        if (words[i] == ' ')
        {
            printf("\n");
            continue;
        }
        printf("%c", words[i]);
    }
    printf("謝謝使用");

}