主题:急救!急救!
救急!救急!
英文小说存于一个文本文件中。带统计的词汇集合要一次输入完毕,几统计工作必须在程序的一次运行只后就全部完成。 程序的输出结果是每个词的出现次数和出现位置所在行的行号,格式自行设计 以C源程序模拟英文小说,C语言的保留字集作为待统计的词汇集 每读如一行,就统计每个词在行中出现的次数,出现位置所在行的行号可以用链表存储。如某行中出现了不止一次,不必存多个相同的行号 每个字符串间是用回车键表示该行输入完毕的,不是空格键 。
本人写的代码如下:
#include<iostream.h>
#include<malloc.h>
#include <stdio.h>
#include <string.h>
#define OK 1
#define ERROR 0
#define MAX 100
#define m 5//保留字的个数
#define n 7//每个保留字的最大长度
#define p 2//源程序共有几行
typedef int ElemType;
typedef int status;
typedef struct
{
char ch[MAX];
int length;
}HString;
typedef struct linknode
{
ElemType data;
struct linknode *next;
}LNode;
LNode *SetNULL()//初始化链表
{
LNode *h;
h=(LNode *)malloc(sizeof(LNode));
h->next=NULL;
return (h);
}
status ListInsert(LNode *h,ElemType e)//插入行号在链表尾结点
{
LNode *p,*q;
p=(LNode *)malloc(sizeof(LNode));
p->next=NULL;
p->data=e;
q=h;
while(q->next!=NULL)
q=q->next;
q->next=p;
return OK;
}
status ListDelete(LNode *h)//删除第一个结点并用e返回该结点的值
{
ElemType e;
LNode *p;
p=h->next;
h->next=p->next;
e=p->data;
free(p);
return (e);
}
status StrAssign(HString &T,char chars[])//初始化串
{
strcpy(T.ch,chars);//拷贝字符数组到串中
T.length=strlen(chars);
return OK;
}
status clearString(HString &S)//销毁串
{
char *cha;
cha=S.ch;
if(cha)
{
free(cha);
S.length=0;
}
return OK;
}
status Index(HString &s1,HString &s2)//实现匹配功能
{
int i,j,count=0;//count用于计算在一行中有几个该保留字
i=j=0;
while(s1.ch[i])
{
if(s1.ch[i]=='"')//如果是双引号就i++一直到另外一个双引号,是为了防止出现输出语句时引号有和保留字相同的单词
{
do
{i++;}
while(s1.ch[i]!='"');
i++;
}
if(s2.ch[j]=='\0'&&s1.ch[i]<'a'&&s1.ch[i]>'z')//匹配成功
{
count++;
i++;
j=0;
}
else if(s1.ch[i]==s2.ch[j])
{
i++;
j++;
}
else
{
i++;
j=0;
}
}
return (count);
}
status main()
{
int i,j,num,k;
int c[m],d[m];
char str[MAX],b[m][n];
LNode *h[m];
HString strg[p],s[m];
cout<<"请输入要比较的保留字:"<<endl;
for(i=0;i<m;i++)
{
gets(b[i]);
h[i]=SetNULL();
c[i]=0;
d[i]=0;
StrAssign(s[i],b[i]);
}
j=0;
cout<<"请输入源程序:"<<endl;
for(k=0;k<p;k++)
{
gets(str);
StrAssign(strg[k],str);
j++;
for(i=0;i<m;i++)
{
num=Index(strg[k],s[i]);
if(num)
{
ListInsert(h[i],j);
c[i]=c[i]+num;
d[i]=d[i]+1;
}
clearString(strg[k]);
}
}
for(i=0;i<m;i++)
{
cout<<"保留字""<<endl;
puts(b[i]);
cout<<"在文章中出现了"<<c[i]<<"次"<<endl;
cout<<"出现在的行号数为:";
for(j=0;j<d[i];j++)
cout<<ListDelete(h[i]);
cout<<endl;
}
return OK;
}
为什么越改越错,请各位高手帮我看一下,不胜感激。
在此谢过了。谢谢。
[fly]急救[/fly][em10]
英文小说存于一个文本文件中。带统计的词汇集合要一次输入完毕,几统计工作必须在程序的一次运行只后就全部完成。 程序的输出结果是每个词的出现次数和出现位置所在行的行号,格式自行设计 以C源程序模拟英文小说,C语言的保留字集作为待统计的词汇集 每读如一行,就统计每个词在行中出现的次数,出现位置所在行的行号可以用链表存储。如某行中出现了不止一次,不必存多个相同的行号 每个字符串间是用回车键表示该行输入完毕的,不是空格键 。
本人写的代码如下:
#include<iostream.h>
#include<malloc.h>
#include <stdio.h>
#include <string.h>
#define OK 1
#define ERROR 0
#define MAX 100
#define m 5//保留字的个数
#define n 7//每个保留字的最大长度
#define p 2//源程序共有几行
typedef int ElemType;
typedef int status;
typedef struct
{
char ch[MAX];
int length;
}HString;
typedef struct linknode
{
ElemType data;
struct linknode *next;
}LNode;
LNode *SetNULL()//初始化链表
{
LNode *h;
h=(LNode *)malloc(sizeof(LNode));
h->next=NULL;
return (h);
}
status ListInsert(LNode *h,ElemType e)//插入行号在链表尾结点
{
LNode *p,*q;
p=(LNode *)malloc(sizeof(LNode));
p->next=NULL;
p->data=e;
q=h;
while(q->next!=NULL)
q=q->next;
q->next=p;
return OK;
}
status ListDelete(LNode *h)//删除第一个结点并用e返回该结点的值
{
ElemType e;
LNode *p;
p=h->next;
h->next=p->next;
e=p->data;
free(p);
return (e);
}
status StrAssign(HString &T,char chars[])//初始化串
{
strcpy(T.ch,chars);//拷贝字符数组到串中
T.length=strlen(chars);
return OK;
}
status clearString(HString &S)//销毁串
{
char *cha;
cha=S.ch;
if(cha)
{
free(cha);
S.length=0;
}
return OK;
}
status Index(HString &s1,HString &s2)//实现匹配功能
{
int i,j,count=0;//count用于计算在一行中有几个该保留字
i=j=0;
while(s1.ch[i])
{
if(s1.ch[i]=='"')//如果是双引号就i++一直到另外一个双引号,是为了防止出现输出语句时引号有和保留字相同的单词
{
do
{i++;}
while(s1.ch[i]!='"');
i++;
}
if(s2.ch[j]=='\0'&&s1.ch[i]<'a'&&s1.ch[i]>'z')//匹配成功
{
count++;
i++;
j=0;
}
else if(s1.ch[i]==s2.ch[j])
{
i++;
j++;
}
else
{
i++;
j=0;
}
}
return (count);
}
status main()
{
int i,j,num,k;
int c[m],d[m];
char str[MAX],b[m][n];
LNode *h[m];
HString strg[p],s[m];
cout<<"请输入要比较的保留字:"<<endl;
for(i=0;i<m;i++)
{
gets(b[i]);
h[i]=SetNULL();
c[i]=0;
d[i]=0;
StrAssign(s[i],b[i]);
}
j=0;
cout<<"请输入源程序:"<<endl;
for(k=0;k<p;k++)
{
gets(str);
StrAssign(strg[k],str);
j++;
for(i=0;i<m;i++)
{
num=Index(strg[k],s[i]);
if(num)
{
ListInsert(h[i],j);
c[i]=c[i]+num;
d[i]=d[i]+1;
}
clearString(strg[k]);
}
}
for(i=0;i<m;i++)
{
cout<<"保留字""<<endl;
puts(b[i]);
cout<<"在文章中出现了"<<c[i]<<"次"<<endl;
cout<<"出现在的行号数为:";
for(j=0;j<d[i];j++)
cout<<ListDelete(h[i]);
cout<<endl;
}
return OK;
}
为什么越改越错,请各位高手帮我看一下,不胜感激。
在此谢过了。谢谢。
[fly]急救[/fly][em10]