这道练习题训练了:
1.结构体数组
2.二分查找
3.指针操作
----
都不难。但非常基础,我认为非常好,做完了记到博客上来,题目见k&R,实现例如以下:
/** Practice of struct array. K&R 6-1* @author : wusuopubupt* @date : 2014-09-18*/#include <stdio.h>
#include <ctype.h>
#include <string.h>#define MAXWORD 100typedef struct key_{char *word;int count;
} key;key key_tab[] = {{"auto", 0},{"break", 0},{"case", 0},{"char", 0},{"const", 0},{"continue", 0},{"default", 0},{"for", 0},{"int", 0},{"void", 0},{"while", 0}
};int getword(char *word, int n);
int binary_search(key key_tab[], char *word, int n);
key *binary_search2(key *key_tab, char *word, int n);int getword(char *word, int n) {int c;char *w = word;while(isspace(c = getchar())) {;}if(c != EOF) {*w++ = c;}if(!isalpha(c)) {*w = '\0';return c;}while(n > 0) {c = getchar();if(isalnum(c)) {*w++ = c;}else {break;}n--;}*w = '\0';return w[0];
}int binary_search(key key_tab[], char *word, int n) {int low = 0;int high = n-1;int mid;int result;while(low <= high) {mid = (low+high) / 2;result = strcmp(word, key_tab[mid].word);if(result < 0) {high = mid-1;}else if(result > 0) {low = mid + 1;}else {return mid;}}return -1;
}/* implemented with pointer */
key *binary_search2(key *key_tab, char *word, int n) {key *low = key_tab;key *high = key_tab + n-1;key *mid;int result;while(low <= high) {//mid = (low+high) / 2; /* error: can not use pointer+pointer d*/mid = low + (high-low) / 2; /* pointer + num */result = strcmp(word, mid->word);if(result < 0) {high = mid-1;}else if(result > 0) {low = mid + 1;}else {return mid;}}return NULL;
}int main1() {int i;int n_keys = sizeof(key_tab) / sizeof(key_tab[0]);char word[MAXWORD];while(getword(word, MAXWORD) != EOF) {if(isalpha(word[0])) {if((i = binary_search(key_tab, word, n_keys)) >= 0) {key_tab[i].count++;}}}i = 0;while(i < n_keys) {printf("%s : %d\n", key_tab[i].word, key_tab[i].count);i++;}return 0;
}int main() {int n_keys = sizeof(key_tab) / sizeof(key_tab[0]);char word[MAXWORD];key *k = NULL;while(getword(word, MAXWORD) != EOF) {if(isalpha(word[0])) {if((k = binary_search2(key_tab, word, n_keys)) != NULL) {k->count++;}}}int i = 0;while(i < n_keys) {printf("%s : %d\n", key_tab[i].word, key_tab[i].count);i++;}return 0;
}