月度归档:2015年05月

C语言用直方图统计单词长度

使用直方图打印输入单词的长度

C语言程序设计语言习题,打印输入中单词长度的直方图。翻遍互联网,没有一个称心的答案,好的程序无法编译,或者运行出错。
1-13习题: 编写一个程序,打印输入中单词长度的直方图。水平方向的直方图比较容易绘制,垂直方向的则要困难一些。

这是使用水平方向打印直方图的代码:

基本上,注释已经非常明确了。也比较简洁,以前写的代码,现在看还非常陌生,好歹完全理解了。代码不需要使用数组。

#include <stdio.h>

/*
 * 编写一个程序,打印输入中单词长度的直方图。水平方向的直方图比较容易
 * 绘制,垂直方向的直方图则要困难些。
 */
#define BEGIN 1
#define IN  1
#define OUT 0

int main(void)
{
        int i, c;
        int state;

        state = OUT;
        i = BEGIN;
        while ((c = getchar()) != EOF) {
                if (c == ' ' || c == '\t' || c == '\n') {
                        if (state == IN) {
                                putchar('\n');
                                ++i;
                                state = OUT;
                        }
                } else if (state == OUT) {
                        printf("%d: ", i);
                        putchar('*');
                        state = IN;
                } else {
                        putchar('*');
                }
        }

        return 0;
}

C语言下编译及执行结果:

回车后统计输入单词的直方图,结束程序使用, win系统下使用 回车结束程序。

[lhf@localhost 1.6]$ ./1-13
1 ab word ()4332
1: *
2: **
3: ****
4: ******
op faey zc---
5: **
6: ****
7: *****

继续阅读

c语言统计文本单词计数

统计文本中字符信息

实现linux中wc命令的最简模式:

[lhf@localhost 1.5]$ wc 01.c 02.c 03.c
 15  23 131 01.c
 13  18 127 02.c
 14  20 128 03.c
 42  61 386 总用量

使用C语言重现命令(50行左右)

/*
 * Name:        count.c
 * Title:       the number of line, word, characters in file
 * Descripts:   count the number of line, word, characters in file
 * Author:      lnesuper
 * Copyrighte:  GPL
 * Date:        2015.5.25
 * Use:         count [file1] [file2]...
 */
#include <stdio.h>
#include <stdlib.h>

#define IN 1    /* inside a word */
#define OUT 0   /* outside a word */

int main(int argc, char * argv[])
{
        if (argc == 1) {
                printf("\aUsing: count [file1] [file2]...\n");
                exit(EXIT_FAILURE);
        }

        int c, nl, nw, nc, state;       /* line, word, character */

        int nl_total, nw_total, nc_total;
        nl_total = nw_total = nc_total = 0;

        int n;
        for (n = 1; n < argc; n++) {
                FILE * file = fopen(argv[n], "r");
                if (file == NULL) {
                        printf("Can't open file %s\n", argv[n]);
                        exit(EXIT_FAILURE);
                }
                nl = nw = nc = 0;
                state = OUT;
                while ((c = fgetc(file)) != EOF) {
                        ++nc;
                        if (c == '\n')
                                ++nl;
                        if (c == ' ' || c == '\t' || c == '\n')
                                state = OUT;
                        else if (state == OUT) {
                                ++nw;
                                state = IN;
                        }
                }
                nl_total += nl;
                nw_total += nw;
                nc_total += nc;
                printf("%d %d %d %s\n", nl, nw, nc, argv[n]);
                fclose(file);
        }
//      printf("total information:\n");
        printf("%d %d %d total\n", nl_total, nw_total, nc_total);

        return 0;
}

程序编辑

编译 -Wall 用于显示全部警告信息,最后对比而这结果,显示完全相同。

[lhf@localhost 1.5]$ gcc -Wall -o count count.c
[lhf@localhost 1.5]$ ./count 01.c 02.c 03.c
15 23 131 01.c
13 18 127 02.c
14 20 128 03.c
42 61 386 total
[lhf@localhost 1.5]$ wc 01.c 02.c 03.c
 15  23 131 01.c
 13  18 127 02.c
 14  20 128 03.c
 42  61 386 总用量
[lhf@localhost 1.5]$

yum 错误 TypeError: rpmdb open failed

无法用yum安装,错误如下

TypeError: rpmdb open failed

解决办法

是因为RPM数据库出现损坏导致的,它导致所有的软件的升级、安装甚至是删除都会出现问题,终端出现乱码,YUMEX也用不成,RPM命令也用不成。原因是RPM数据库被破坏,解决方法如下:

$ su            切换到root权限
# cd /var/lib/rpm/
# for i in `ls | grep 'db.'`;do mv $i $i.bak;done
# rpm --rebuilddb     重建该数据库
# yum clean all

在windows平台上使用开源软件nodepad++和MinGW自己打造IDE

在win平台上的使用的IDE简介

C/C++的的win平台IDE非常多,对于初学者建议使用轻量级的Dev-c++就非常不错, 当然也可以选择其他的编译器,但建议初学者从简单入手。
dev-c++ 有两个版本,老版本已经不更新了,新版本点这里下载:
dev-C++ 新版调试的时候有可能出现“没有调试信息”调试,解决办法:打开主菜单的“工具”选项,选择“编译”选项,继续选择“代码生成/优化”选项,选择“连接器”选项,在“产生调试信息”选项框内选择“YES”,最后保存退出。
vc6是过期产品,另外有太多与标准不兼容细节,建议抛弃,至于vs2010和vs2013,程序庞大,配置繁琐,下载请自行google。

本文介绍怎样使用nodepad++和MinGW自己打造IDE

why: nodepad++是win平台的非常优秀编辑器,平常查看网上的代码非常方便。并且支持自定义运行程序,网上教程有非常多。

第一步下载程序

Nodepad++ 下载:http://notepad-plus-plus.org/
MinGW网盘下载:mingw-GCC4.6.2,建议下载
dev-C++使用的MinGW: dev-C++使用的MinGW
官方下载:官方下载, 安装需要联网,比较繁琐。
minGW安装:建议安装到C:\根目录下。

MinGW的环境配置

以下配置以MinGW安装到C:\下,压缩文件请解压到该目录。例如:C:\MinGw\ 注意下面是bin目录
桌面上右击“我的电脑”,选择“高级选项配置”,打开”环境变量”,在“系统变量”里双击“Path”变量,在弹出的窗口内末尾后面添加如下代码
如果末尾文本有“;”,则下面代码去除“;”后添加

;c:\MinGW\bin

继续阅读

hangman猜字游戏

C++ primer plus 16.3例题

实际上,书中的例题是有bug的。下面贴出正确的代码

// hangman.cpp -- some string methods
#include <iostream>
#include <string>
#include <cstdlib>
#include <ctime>
#include <cctype>
using std::string;

const int NUM = 26;
const string wordlist[NUM] = {
	"apiary", "beetle", "cereal", "danger", "ensign", "florid", "garage",
	"health", "insult", "jackal", "keeper", "loaner", "manage", "nonce",
	"onset", "plaid", "quilt", "remote", "stolid", "train", "useful",
	"valid", "whence", "xenon", "yearn", "zippy"
};

int main(void)
{
	using std::cout;
	using std::cin;
	using std::tolower;
	using std::endl;

	std::srand(std::time(0));
	char play;
	cout << "Will you play a word game? <y/n> ";
	cin >> play;
	play = tolower(play);
	while (play == 'y') {
		string target = wordlist[std::rand() % NUM];
		int length = target.length();
		string attempt(length, '-');
		string badchars;
		int guesses = 6;
		cout << "Guess may secret word. It has " << length
 			<< " letters, and you guess\n"
			<< "one letter at a time. You get " << guesses
			<< " wrong guesses.\n";
		cout << "Your word: " << attempt << endl;

		while (guesses > 0 && attempt != target) {
			char letter;
			cout << "Guess a letter: ";
			cin >> letter;
			if (badchars.find(letter) != string::npos
				|| attempt.find(letter) != string::npos) {
				cout << "You already guessed that. \
					Try again.\n";
				continue;
			}
			unsigned long loc = target.find(letter);// 这里一定要用unsigned long来声明变量
			if (loc == string::npos) {
				cout << "Oh, bad guess!\n";
				--guesses;
				badchars += letter;	// add to string
			} else {
				cout << "Good guess!\n";
				attempt[loc] = letter;
				// check if letter appears again
				loc = target.find(letter, loc + 1);
				while (loc != string::npos) {
					attempt[loc] = letter;
					loc = target.find(letter, loc + 1);
				}
			}
			cout << "Your word: " << attempt << endl;
			if (attempt != target) {
				if (badchars.length() > 0)
					cout << "Bad choices: " << badchars 
						<< endl;
				cout << guesses << " bad guesses left\n";
			}
		}
		if (guesses > 0)
			cout << "That's right!\n";
		else
			cout << "Sorry, the word is " << target << ".\n";

		cout << "Will you play another? <y/n> ";
		cin >> play;
		play = tolower(play);
	}

	cout << "Bye\n";

	return 0;
}