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);

int main() {
	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 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;
}

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

时间: 2024-10-13 11:27:22

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

K&amp;R_6.5用二叉树统计单词出现的次数

因为预先不知道出现的单词列表,无法方便地排序并使用折半查找:也不能分别对输入中的每个单词都执行一次线性查找,开销太大-->O(n^n). 所以考虑使用二叉树的数据结构(O(n*logn))来组织这些单词,实现如下: ----- /* * My practice of K&R 6.5 * */ #include <stdio.h> #include <stdlib.h> #include <string.h> #include <ctype.h>

C语言K&R习题系列——统计文档中每个单词所占字母个数,以直方图形式输出

原题: Write a program to print a histogram of the lengths of words in its input. It is easy to draw the histogram with the bars horizontal; a vertical orientation is more challenging. 这也是我第一个过百行的代码(带注释,空格什么的) 主要分两个部分:输入和输出 #include < stdio.h > #define

C语言K&R习题系列——统计一段文字中各个字母出现的频率

原题: /*Write a program to print a histogram of the frequencies of *difficent characters in it inputs */ 这个和上一个类似 输入部分 #include < stdio.h >    #define NUM_CHARS 256    main ( void )  { int c; int done = 0; int thisIdx = 0; long frequrr[NUM_CHARS + 1];

《C专家编程》笔记(一)——C语言的历史、K&amp;R C和ANSI C

1. C语言的许多特性是为了方便编译器设计者而建立的.于是C语言的语言特性有:数组下标从0而非1开始:C语言的基本数据类型直接与底层硬件相对应:auto关键字只对创建符号表入口的编译器设计者有意义:表达式中的数组名可以看作是指针:float被自动扩展为double(ANSI C中不再如此):不允许嵌套函数(简化了编译器):register关键字,为编译器设计者提供线索,却把包袱丢给了程序员. 2. C编译器不曾实现的一些功能必须通过其他途径实现(编译器实现的功能,如加减乘除.指针.取地址).在C

K&amp;R 学习笔记 第一章

今天开始学习C语言,为了之后的游戏开发学习做好基础,其实在大一的时候学校有C语言的课程,学的马马虎虎,教学也比较浅显,感觉并不能学习到C语言的精髓.在经过多人推荐下,入手了K&R ,看了第一章之后,才发现的确值得这么多人称赞. 其实大多数书的第一章都是差不多的,以Hello World 引出本书学习的知识体系的顺序,有趣的是之后的练习,也是要花一番功夫的. 1.4 提到了幻数,所谓幻数,就是在程序中直接使用的数字.C语言的传统方式是使用#define行来对付幻数.C语言预处理程序是一个强有力的工

The C Programming Language(K&R) 扣细节随记(施工中...

各种糟糕,入坑这么久才开始看K&R的The C Programming Language学C,而且还是为了应付开学某场滚回本体的考试(虽然觉着即使复习了还会被各种吊打),废话不多说,开始施工.? ? |--> 导言 整数除法会执行舍位,故要先乘后除. 数据类型: 关键字 位长(字节) 范围 格式化字符串 char 1 bytes -128..127(或0..255,与体系结构相关) ?%c unsigned char 1bytes 0..255 ?%c,?%hhu signed char 1

C语言K&R习题系列——句子中一个空格代替多个空格的四种方法

原题: Write a program to copy its input to its output, replacing each string of one or more blanks by a single blank. 第一种: 这种最常用,设置一个inspace作为布尔变量,标志当前输入是否在字符中,或在字符外 #include <stdio.h>   int main(void) {   int c;   int inspace=0;     while((c = getcha

C语言K&R习题系列——使用缓冲区函数接受长字符输入

原题: Write a program to print all input lines that are longer than 80 characters.  ,实现起来不算难,关键是用到了缓冲区,很不错的一种思想! /* Write a program to print all input lines  * that are longer than 80 characters  */    #include < stdio.h >    #define MINLENGTH 81    /

程序猿之---C语言细节16(看了绝对值,编译类型ANSI C和K&amp;R C类型判断,c编译器类型转换bug的细节)

主要内容:编译类型ANSI C和K&R C类型判断,c编译器bug的细节 #include <stdio.h> int main() { // 例子1 :编译器类型判断 /* * K&R采用无符号保留原则,即当一个无符号类型与ing 或更小的整型混合使用时,结果类型为无符号 * ANSI C采用值保留原则, 即当把几个整数操作数像下面这样混合使用时,结果类型可能为有符号也可能为无符号 * ,结果取决于操作数的类型的相对大小 */ if(-1 < (unsigned cha