Chinaunix首页 | 论坛 | 博客
  • 博客访问: 688322
  • 博文数量: 156
  • 博客积分: 3402
  • 博客等级: 中校
  • 技术积分: 1639
  • 用 户 组: 普通用户
  • 注册时间: 2010-07-13 14:06
个人简介

业余编程爱好者

文章分类

全部博文(156)

文章存档

2014年(1)

2013年(13)

2012年(46)

2011年(38)

2010年(58)

分类: LINUX

2012-05-31 17:13:44

    《编程珠玑》里讲到了一个绝妙的算法例子。对一本词典,找出所有的变位词。变位词就是组成这几个单词的字母一样,但顺序不一样。这个变位词算法可以用于猜字谜之类的游戏。算法很巧妙,先找出相同模式的单词,用系统排序集中在一起,再输出有相同模式的变位词。该例子的重点是让我们知道,可以用一系列的小工具来完成一个非常复杂的过程,而不必编写一个专用的复杂混乱的代码。让我见识到了重定向和管道命令的妙用,整个程序由四个小程序组成的。

anagram_change.c   用于将原字典中大写的单词字母全部转化为小写

点击(此处)折叠或打开

  1. #include <stdio.h>

  2. int main()
  3. {
  4.     int c;
  5.     while((c = getchar()) != EOF) {
  6.         if(c >= 'A' && c <= 'Z')
  7.             c += 32;
  8.         printf("%c", c);
  9.     }
  10. }


anagram_sign.c   将每个单词中字母排序,标识每个单词

点击(此处)折叠或打开

  1. #include <stdio.h>
  2. #include <string.h>
  3. #define WORDMAX 50

  4. int charcomp(char *x, char *y)
  5. {
  6.     return *x - *y;
  7. }

  8. int main()
  9. {
  10.     char word[WORDMAX], sign[WORDMAX];
  11.     while (scanf("%s", word) != EOF) {
  12.         strcpy(sign, word);
  13.         qsort(sign, strlen(sign), sizeof(char), charcomp);
  14.         printf("%s %s\n", sign, word);
  15.     }
  16.     return 0;
  17. }
anagram_squash.c  将模式相同的单词输出在同一行上

点击(此处)折叠或打开

  1. #include <stdio.h>
  2. #include <string.h>
  3. #define WORDMAX 50

  4. int main()
  5. {
  6.     char word[WORDMAX], sig[WORDMAX], oldsig[WORDMAX];
  7.     int linenum = 0;
  8.     strcpy(oldsig, "");
  9.     while (scanf("%s %s", sig, word) != EOF) {
  10.         if(strcmp(oldsig, sig) != 0 && linenum > 0)
  11.             printf("\n");
  12.         strcpy(oldsig, sig);
  13.         linenum++;
  14.         printf("%s\t\t", word);
  15.     }
  16.     printf("\n");
  17.     return 0;
  18. }

在win系统中 只要输入以下命令:

点击(此处)折叠或打开

  1. anagram_change.exe < dictionary | anagram_sign.exe | sort | anagram_squash.exe > gramlist.txt
linux系统中也差不多。
阅读(1351) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~