サイトマップ / C言語講座出入り口総目次目次:ファイル二分木探索(バイナリサーチ)||デモ用

青い直線

デモ用ファイル

ファイル名を”Wtest.c”に変更し、コンパイル済のソースと同じフォルダに置いて下さい。

青い直線
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>

#define  NUM_KW  25

typedef struct {
    char name[10]
    int count;
} KEYWORD;


KEYWORD keyword[NUM_KW] = {
    {"break", 0},
    {"case", 0},
    {"char", 0},
    {"continue", 0},
    {"do", 0},
    {"double", 0},
    {"else", 0},
    {"enum", 0},
    {"extern", 0},
    {"float", 0},
    {"for", 0},
    {"if", 0},
    {"int", 0},
    {"long", 0},
    {"register", 0},
    {"return", 0},
    {"short", 0},
    {"static", 0},
    {"struct", 0},
    {"switch", 0},
    {"typedef", 0},
    {"union", 0},
    {"unsigned", 0},
    {"void", 0},
    {"while", 0}
};

int GetWord(FILE *fp, char *temp);
int BSearch(char *word);
void ShowResult(void);
void main(void);


int GetWord(FILE *fp, char *temp)
{
    int c;
    int n = 0;
	
    while ((c =while ((c = getc(fp)) != EOF) {

        if (!n && !isalpha(c))
            continue;

        else if (n && !isalpha(c)) {
            temp[n] = '\0';
            return (n);
        }

        else if (isalpha(c)) {
            temp[n] = (char)c;
            n++;
        }
    }
    return (0);
}


int BSearch(char *word)	
{
    int left = 0;
    int right = NUM_KW - 1;
    int mid;
    int x;

    while (left <= right) {
        mid = left + (right - left) / 2;	
        x = strcmp(keyword[mid].name, word);
        if (x > 0)
            right = mid -1;
        else if (x < 0)
            left = mid + 1;
        else {
            keyword[mid].count += 1;
            return (mid);
        }
    }
    return (-1);
}


void ShowResult(void)
{
    int i;

    for (i = 0; i < NUM_KW ; i++) {
        printf("%10s %3d  ", keyword[i].name, keyword[i].count);
        if (!((i + 1) % 4))
            printf("\n");
    }
}

void main(void)
{
    FILE *fp;
    char word[100];

    if ((fp = fopen("wtest.c", "r")) == NULL) {
        fprintf(stderr, "Can't Open C Source File!\n");
        exit(2);
    }

    while (GetWord(fp, word)) {
        BSearch(word) ;
    }
    ShowResult(  ) ;
    fclose(fp);
}
青い直線

サイトマップ / C言語講座出入り口総目次目次:ファイル二分木探索(バイナリサーチ)||デモ用