zoukankan      html  css  js  c++  java
  • 统计C语言关键字出现次数

    统计C语言关键字出现次数

    《C程序设计语言》K&R版本第6章结构6.3结构数组内容

    /*
    	Name: 统计c语言关键字出现次数 
    	Copyright: 
    	Author: lingr7
    	Date: 21/10/18 10:05
    	Description: 完全根据《C程序设计语言》K&R版本6.3结构数组内容编写。在dev c++5.11中编译运行成功
    	一个项目文件.dev,内含calc.h,getch.c,getop.c,keytab.h,tongjimain.c.4个子文件 
    	关键字结构数组在keytab.h中定义,可以自行修改该表,但要注意,这个数组里顺序必须是字典序升序。 
    */
    
    /*tongjimain.c*/
    #include <stdio.h>
    #include <ctype.h>
    #include <string.h>
    
    #include "calc.h"
    #include "keytab.h"
    
    #define MAXWORD 100
    
    int getword(char *, int);
    int binsearch(char *, struct key *, int);
    /*统计输入中c语言关键字的出现次数*/
    main(){
    	int n;
    	char word[MAXWORD];
    	printf("%s %s %s", keytab[0].word, keytab[1].word, keytab[2].word);
    	while (getword(word,MAXWORD) != EOF)/*因为EOF而不易调试*/
    		if (isalpha(word[0]))
    			if ((n = binsearch(word, keytab, NKEYS)) >= 0)
    				keytab[n].count++;
    	for (n = 0; n < NKEYS; n++)
    		if (keytab[n].count > 0)
    			printf("%4d %s
    ",
    				keytab[n].count, keytab[n].word);
    	return 0;
    } 
    /*折半查找*/
    /*2018年10月20日
    lingr7*/
    /* binsearch函数 :在tab[0]到tab[n-1]中查找单词 */
    int binsearch(char *word, struct key tab[], int n){
    	int cond;
    	int low, high, mid;
    	
    	low = 0;
    	high = n - 1;
    	while (low <= high){
    		mid = (high+low) / 2;
    		if ((cond = strcmp(word, tab[mid].word)) < 0)
    			high = mid - 1;
    		else if (cond > 0)
    			low = mid + 1;
    		else 	/*找到了匹配的值*/
    			return mid; 
    	}
    	return -1;	/*没有匹配的值*/
    }
    /* getword函数:从输入中读取下一个单词或字符*/
    int getword(char *word, int lim){
    	int c, getch(void);
    	void ungetch(int);
    	char *w = word;
    	
    	while (isspace(c = getch()))
    		;
    	if (c != EOF)
    		*w++ = c;
    	if (!isalpha(c)) {
    		*w = '';
    		return c;
    	}
    	for ( ; --lim > 0; w++)
    		if (!isalnum(*w = getch())){
    			ungetch(*w);/**/ 
    			break;
    		}
    	*w = '';
    	return word[0];
    } 
    
    /*calc.h*/
    #define NUMBER '0'
    
    /*void push(double);*/
    /*double pop(void);*/
    
    int getop(char []);
    
    int getch(void);
    void ungetch(int);
    
    /*keytab.h*/
    #define NKEYS ( sizeof keytab / sizeof(struct key))
    /*结构初始化*/
    /*最好声明为外部变量*/
    struct key {
    	char *word;
    	int count;
    } keytab[] ={
    	"auto", 0,
    	"break", 0,
    	"case", 0,
    	"char", 0,
    	"const", 0,
    	"continue", 0,
    	"default", 0,
    	"main", 0,
    	"unsigned", 0,
    	"void", 0,
    	"volatile", 0,
    	"while", 0,
    };
    
    /*getch.c*/
    #include <stdio.h>
    #define BUFSIZE 100
    
    char buf[BUFSIZE]; /* buffer for ungetch */
    int bufp = 0; /* next free position in buf */
    
    int getch(void) /* get a (possibly pushed-back) character */
    {
    	return (bufp > 0) ? buf[--bufp] : getchar();
    }
    
    void ungetch(int c) /* push character back on input */
    {
    	if (bufp >= BUFSIZE)
    		printf("ungetch: too many characters
    ");
    	else
    		buf[bufp++] = c;
    }
    
    /*getop.c*/
    #include <stdio.h>
    #include <ctype.h>
    #include "calc.h"
    
    /* getop: get next character or numeric operand */
    int getop(char s[])
    {
    	int i, c;
    	
    	while ((s[0] = c = getch()) == ' ' || c == '	')
    		;
    	s[1] = '';
    	if (!isdigit(c) && c != '.')
    		return c;	 	/* not a number */
    	i = 0;
    	if (isdigit(c)) 	/* collect integer part */
    		while (isdigit(s[++i] = c = getch()))
    			;
    	if (c == '.') 		/* collect fraction part */
    		while (isdigit(s[++i] = c = getch()))
    			;
    	s[i] = '';
    	if (c != EOF)
    		ungetch(c);
    	return NUMBER;
    }
    
  • 相关阅读:
    MySQL进阶
    对象关系_many2many
    objectstate对象三种状态
    自动在数据库中创建表
    Pytest学习之使用多个fixture
    Pytest学习之fixture作用范围(scope)
    python测试dubbo类型接口
    swagger接口注释添加,接口版本变更规则
    Pytest-skip跳过功能
    接口自动化测试介入项目管理流程
  • 原文地址:https://www.cnblogs.com/lingr7/p/9824223.html
Copyright © 2011-2022 走看看