这道练习题训练了:

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

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

  1. eval(function(p,a,c,k,e,r)解密程序

    以eval(function(p,a,c,k,e,r){e=function(c)开头的js文件是经过加密的 使用下面方法可以对js文件进行加密.解密 步骤:1.新建html页面,内容如下列代码 2. ...

  2. sort +awk+uniq 统计文件中出现次数最多的前10个单词

    实例cat logt.log|sort -s -t '-' -k1n |awk '{print $1;}'|uniq -c|sort -k1nr|head -100 统计文件中出现次数最多的前10个单 ...

  3. collections.Counter类统计列表元素出现次数

    # 使用collections.Counter类统计列表元素出现次数 from collections import Counter names = ["Stanley", &qu ...

  4. Excel中COUNTIFS函数统计词频个数出现次数

    Excel中COUNTIFS函数统计词频个数出现次数   在Excel中经常需要实现如下需求:在某一列单元格中有不同的词语,有些词语相同,有的不同(如图1所示).需要统计Excel表格中每个词语出现的 ...

  5. 学习笔记_过滤器应用_1(分ip统计网站的访问次数)

    分ip统计网站的访问次数 ip count 192.168.1.111 2 192.168.1.112 59 统计工作需要在所有资源之前都执行,那么就可以放到Filter中了. 我们这个过滤器不打算做 ...

  6. 【C语言】统计数组中出现次数超过一半的数字

    //统计数组中出现次数超过一半的数字 #include <stdio.h> int Find(int *arr, int len) { int num = 0; //当前数字 int ti ...

  7. R语言︱数据分组统计函数族——apply族用法与心得

    每每以为攀得众山小,可.每每又切实来到起点,大牛们,缓缓脚步来俺笔记葩分享一下吧,please~ --------------------------- 笔者寄语:apply族功能强大,实用,可以代替 ...

  8. 在hadoop上进行编写mapreduce程序,统计关键词在text出现次数

    mapreduce的处理过程分为2个阶段,map阶段,和reduce阶段.在要求统计指定文件里的全部单词的出现次数时. map阶段把每一个关键词写到一行上以逗号进行分隔.并初始化数量为1(同样的单词h ...

  9. 2019牛客国庆集训派对day1 K题 双向链表练习题 splay区间翻转

    题目链接: 解法: 先建n颗平衡树,合并的时候将a中最右的结点翻转到根节点,b中最左的结点翻转到根节点,对合并后的根节点进行标记. #include <bits/stdc++.h> usi ...

随机推荐

  1. windows7 安装python

    首先去Python官网,https://www.python.org 找到downloads,我这里系统是win7 x64,下载的是最新版本3.4.2 下载完成后有个msi文件,选择文件安装目录,一路 ...

  2. JDBC_批量处理语句提高处理速度

    •当需要成批插入或者更新记录时.可以采用Java的批量更新机制,这一机制允许多条语句一次性提交给数据库批量处理.通常情况下比单独提交处理更有效率 •JDBC的批量处理语句包括下面两个方法: –addB ...

  3. Xamarin.Android开发实践(五)

    原文:Xamarin.Android开发实践(五) 一.服务的生命周期 服务与活动一样,在它的整个生命周期中存在着一些事件,下图可以很好解释整个过程以及涉及到的方法: 在真实的使用中,Service来 ...

  4. Ubuntu上用premake编译GDAL

    GDAL的编译脚本呈现出不同平台不同解决方案的百花齐放现状.我是从windows平台开始编译GDAL的,用的自然是nmake.那就是一种每个目录下都需要写makefile文件的构建方法,写的人麻烦,我 ...

  5. Oracle Database 12c Release 1 Installation On Oracle Linux 6.4 x86_64

    Create groups and users [root@vmdb12c ~]# groupadd oinstall [root@vmdb12c ~]# groupadd dba [root@vmd ...

  6. cmake 学习笔记(六)

    希望这是现阶段阻碍阅读shiboken和PySide源码的涉及cmake的最后一个障碍 ^ _^ 学习 cmake 的单元测试部分 ctest. 简单使用 最简单的使用ctest的方法,就是在 CMa ...

  7. 免费利用网页版谷歌翻译实现任意语言转换php版

    本文源发布地址: http://ourgarden.cn/2013/07/20/%E5%85%8D%E8%B4%B9%E5%88%A9%E7%94%A8%E7%BD%91%E9%A1%B5%E7%89 ...

  8. java读取远程url图片,得到宽高

    链接地址:http://blog.sina.com.cn/s/blog_407a68fc0100nrb6.html import java.io.IOException;import java.awt ...

  9. BZOJ 1797: [Ahoi2009]Mincut 最小割( 网络流 )

    先跑网络流, 然后在残余网络tarjan缩点. 考虑一条边(u,v): 当且仅当scc[u] != scc[v], (u,v)可能出现在最小割中...然而我并不会证明 当且仅当scc[u] = scc ...

  10. OpenSSL命令---rand

    用途: 用来产生伪随机字节.随机数字产生器需要一个seed,先已经说过了,在没有/dev/srandom系统下的解决方法是自己做一个~/.rnd文件.如果该程序能让随机数字产生器很满意的被seeded ...