K&R练习题6-1统计关键词出现的次数

这道练习题训练了:

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 100

typedef 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;
}



github: https://github.com/wusuopubupt/LearningC/blob/master/K%26R/chp6/keyword_count.c



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值