C语言课设——单词统计系统
课设是大一做的,很简陋的用c做的小程序,传上来给大家分享一下。
当时vc实在是装不上了,一气之下用记事本写的,所以排版很乱。
当时接的课设要求核心是用冒泡法,所以就是用冒泡法写的,其他方法当然也可以,只要把核心的那部分替换成你要的方法就行了。
下面是代码部分:
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
struct word{
char w[20]; //存储单词
int i; //出现次数
int n[10]; //记录位置
}a[200];
int num1=0,num2=0; //1记录字符数,2记录单词数
FILE *fp=NULL; //文件指针
char file[1000]; //存储所有数据
void openfile() //打开文件并取出数据
{
//char s[100];
//printf("请输入文件完整的路径:");
//scanf("%s",&s);
//gets(s);
if(fp!=NULL)
printf("文件已打开\n");
else if((fp=fopen("d:\\chapter.dat","r"))==NULL)
{
printf("打开失败,请检查路径是否正确或文件是否存在\n");
exit(0);
}
else
{
printf("打开文件成功!\n");
while(!feof(fp))
{
file[num1]=fgetc(fp);
num1++;
}
fclose(fp);
}
}
void keep() //存入文件
{
FILE *ft;
int i;
if((ft=fopen("d:\\out.dat","w"))==NULL)
{
printf("打开文件“out.dat”失败\n");
exit(0);
}
fputs("单词名 数量\n",ft);
for(i=1;i<num2;i++)
{
fprintf(ft,"%s",a[i].w);
fprintf(ft," %d\n",a[i].i);
}
fclose(ft);
printf("生成数据已导入至文件d:out.dat中\n");
}
void account() //统计
{
char word[20];
int i=0,j=0,k=0,flag=0; //i统计
if(fp==NULL)
{
printf("文件未打开\n");
}
else
{
strcpy(word," ");
for(;i<=num1;i++)
{
if((file[i]>='a'&&file[i]<='z')||(file[i]>='A'&&file[i]<='Z')) //存入单词
{
if(file[i]>='A'&&file[i]<='Z')
file[i]=file[i]-'A'+'a';
word[j]=file[i];
word[j+1]='\0';
j++;
}
else if(file[i]==' '&&file[i+1]!=' ')
{
for(k=0;k<num2;k++)
{
if(strcmp(word,a[k].w)==0)
{
a[k].i++;
a[k].n[a[k].i]=num2;
flag=1;
}
}
if(flag==0)
{
strcpy(a[num2].w,word);
a[num2].i=1;
a[num2].n[a[k].i]=num2;
num2++;
strcpy(word," ");
strcpy(a[num2].w," ");
a[num2].i=0;
}
j=0;
flag=0;
}
}
//printf("统计后的单次序列为:\n");
//for(i=1;i<num2;i++)
//printf("%s,出现次数为:%d\n",a[i].w,a[i].i);
keep();
}
}
void sort() //排序
{
int i,j;
struct word t;
if(fp==NULL)
printf("文件未打开\n");
else
{
for(i=1;i<num2;i++)
{
for(j=num2-1;j-1>=i;j--)
{
if(a[j].i>a[j-1].i)
{
t=a[j];
a[j]=a[j-1];
a[j-1]=t;
}
}
}
//printf("排序后的单次序列为:\n");
//for(i=1;i<num2;i++)
//printf("%s,出现次数为:%d\n",a[i].w,a[i].i);
keep();
}
}
void consult() //查询
{
int i,j,flag2=0; //flag2用于判断是否存在
char word[20];
if(fp==NULL)
{
printf("文件未打开\n");
}
else
{
printf("请输入要查询单词\n");
scanf("%s",&word);
for(i=1;i<num2;i++)
{
if(strcmp(word,a[i].w)==0)
{
printf("%s存在于该文章中,出现次数为%d\n",word,a[i].i);
printf("出现的位置为:\n");
for(j=1;j<=a[i].i;j++)
printf("第%d处:第%d个单词\n",j,a[i].n[j]);
flag2=1;
}
}
if(flag2==0)
printf("%s不存在于该文章中\n",word);
}
}
void menu() //菜单
{
printf("************************** 欢迎使用单词统计系统 **************************\n");
printf("************************** 1.打开文件 **************************\n");
printf("************************** 2.开始统计 **************************\n");
printf("************************** 3.开始排序 **************************\n");
printf("************************** 4.开始查询 **************************\n");
printf("************************** 5.退出 **************************\n");
}
void main()
{
int i;
while(1)
{
menu();
printf("请输入操作代码!\n");
scanf("%d",&i);
switch(i)
{
case 1:
openfile();break;
case 2:account();break;
case 3:sort();break;
case 4:consult();break;
case 5:
{
printf("谢谢使用!\n");
exit(0);
}
}
}
}