问答题

【说明】 以下【C程序】的功能是从文件text_01.ini中读入一篇英文短文,统计该短文中不同单词和它的出现次数,并按词典编辑顺序将单词及它的出现次数输出到文件word_xml.out中。 该C程序采用一棵有序二叉树存储这些单词及其出现的次数,一边读入一边建立。然后中序遍历该二叉树,将遍历经过的二叉树上节点的内容输出。 程序中的外部函数 int getword(FILE *fpt,char *word) 从与fpt所对应的文件中读取单词置入word,并返回1;若已无单词可读,即到文件尾部时,则函数返回0。 【C程序】 #include <stdio.h> #include <malloc.h> #include <ctype.h> #include <string.h> #define INF "TEXT_01.INI" #define OUTF "WORD_XML.OUT" typedef struct treenode { char *word; int count; struct treenode *left, *right; } BNODE; int getword(FILE *fpt,char *word); void binary tree(BNODE **t,char *word) { BNODE *ptr, *p; int cmpres; p = NULL; (1) ; while (ptr) { /*寻找插入位置*/ cmpres = strcmp(word, (2) ); /* 保存当前比较结果*/ if (!cmpres) { (3) return; } else { (4) ; ptr = cmpres > 0 ptr->right : ptr->left; } } ptr = (BNODE *)malloc(sizeof(BNODE)); ptr->right = ptr->left = NULL; ptr->word = (char *)malloc(strlen(word)+1); strcpy(ptr->word,word); ptr->count = 1; if (p == NULL) (5) ; else if (cmpres > 0) p->right = ptr; else p->left = ptr; } } void midorder(FILE *fpt, BNODE *t) { if ( (6) ) return; midorder(fpt , t->left); fprintf(fpt , " %s %d\n " , t->word , t->count); midorder(fpt , t->right); } void main() { FILE *fpt; char word[40]; BNODE *root = NULL; if ((fpt = fopen(INF , "r")) == NULL) { printf("Can’t open file %s\n",INF); return; } while (getword(fpt,word) == 1) binary_tree( (7) ); fclose(fpt); fopen(OUTF,"w"); midorder(fpt, root); fclose(fpt); }

【参考答案】

(1)ptr=*t (2)ptr->word (3)ptr->count++或其等价形式 (4)P=ptr (5)*t=......

(↓↓↓ 点击下方‘点击查看答案’看完整答案 ↓↓↓)
热门 试题

问答题
【说明】喜迎2008年北京奥运会!以下【C程序】能将一个给定汉字(例如,奥运会的“会”字)的点阵逆时针旋转90°,并输出旋转前后的点阵数据及字形。图1-15是汉字“会”字的16×16点阵字形,用数字0表示空白位置,用数字1表示非空白位置,“会”字的第1行即可表示成如下的{0,1}序列:0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0如果把它看做一个字的16个位,“会”字的第1行可以用十六进制数0100来表示。同理,“会”字的第2行可以用十六进制数0240表示,第3行可以用十六进制数0420表示……依此类推,用16个双字节整型数即可存放一个汉字点阵字形。“会”字的点阵数据及字形如图1-15的左半部分所示。将一个汉字逆时针旋转90°,就是把该汉字点阵的最右列作为旋转后新点阵的第1行,次最右列作为旋转后新点阵的第2行……依此类推来形成一个旋转后的点阵字形。图1-15的右半部分就是将“会”字逆时针旋转90°后的点阵数据和字形(提示:读者可将书本顺时针旋转90°,以查看旋转90°后的点阵字形)。在【C程序】中,数组old存放着“会”字的16个双字节整型点阵数据。函数turnleft能将该点阵数据逆时针旋转90°,旋转后的点阵数据存放在数组new中。函数display能将旋转前后的点阵数据加以编辑,用字符“.”表示值为0的位,用字符“x”表示值为1的位,从而将旋转前后的点阵按行输出其十六进制的数据和字形,如图1-15所示。【C程序】#include <stdio.h>#define EMPTY ’.’#define NONEMPTY ’x’#define LEFT 0#define RIGHT 1main (){ static unsigned old[16]={ 0x0100,0x0240,0x0420,0x0810,0x1004,0x23c2,0x4001,0x8ff8,0x0100,0x0200,0x0400,0x0800,0xl000,0x2004,0x7ffe,0x0001};unsigned new[16];turnleft (old, new);display (old,new);}turnleft (old,new)unsigned old[],new[];{ int row, k;for (row=0;row<16;row++)for ( (1) ;k<16;k++)new[row]|=((old[k]>> (2) )&1) << (3) ;}display (old, new)unsigned *old,*new;{ char out[2] [17],letter[2];int row, col;letter[O] = EMPTY;letter[1] = NONEMPTY;out[LEFT] [16]=out[RIGHT] [16]= (4) ;for (row = 0;row<16;row++,old++,new++){ for (col = 0;co1<16;++col){ out[LEFT] [col] = letter[ ( (5) ) &1];out[RIGHT] [col] = letter[ ( (6) ) &1];}printf( n %4x %s ,*old,&out[LEFT] [0]);printf( %4x %s ,*new,&out[RIGHT] [0]);}}