资源描述
沈阳航空航天大学
课 程 设 计 报 告
课程设计名称:C语言课程设计
课程设计题目:邮件地址提取程序
院(系):计算机学院
专 业:计算机科学与技术
班 级:34010104
学 号:2013040101178
姓 名:万延正
指导教师:刘启文
完成日期:2015年07月3日
说明:结论(优秀、良好、中等、及格、不及格)作为相关教环节考核必要依据;格式不符合要求;数据不实,不予通过。报告和电子数据必须作为实验现象重复的关键依据。
1
沈阳航空航天大学课程设计报告
学术诚信声明
本人声明:所呈交的报告(含电子版及数据文件)是我个人在导师指导下独立进行设计工作及取得的研究结果。尽我所知,除了文中特别加以标注或致谢中所罗列的内容以外,报告中不包含其他人己经发表或撰写过的研究结果,也不包含其它教育机构使用过的材料。与我一同工作的同学对本研究所做的任何贡献均己在报告中做了明确的说明并表示了谢意。报告资料及实验数据若有不实之处,本人愿意接受本教学环节“不及格”和“重修或重做”的评分结论并承担相关一切后果。
本人签名: 万延正 日期:2015 年 7 月 3 日
沈阳航空航天大学
课程设计任务书
课程设计名称 C语言课程设计 专业 计算机科学与技术
学生姓名 万延正 班级 34010104 学号 2013040101178
题目名称 邮件地址提取
起止日期 2015年 6月22日起至 2015 年 7月 3日止
课设内容:
设计一个简单的程序,可以把指定HTML文件中的电子邮件地址提取出来,并保存到文件中。
要求:
1) 读入一个HTML文件,分析文件格式,把文件中的电子邮件地址提取出来,保存到指定文件中。
2) 符合user@格式的字符串就是电子邮件地址,其中@和.是必不可少的,并注意二者的位置。
3) 保存邮件地址的文件格式,首行为HTML文件名,随后每一行开始为邮件地址在HTML文件中的行号,然后是邮件地址。
4) 学生独立完成系统的设计,编码和调试工作并通过指导老师的检查。
5) 用C语言实现课题任务内容。
6) 按课程设计规范撰写课程设计报告。
参考资料:
【1】张长海.C语言程序设计[M].北京:高等教育出版社,2006
【2】冼镜光.C语言名题精选百则技巧篇M].北京:机械工程出版社,2005
【3】谭浩强.C语言程序设计[M].北京:清华大学出版社,2005
教研室审核意见: 教研室主任签字:
指导老师(签字): 年 月 日
学 生(签字):万延正 2015 年 7月 3日
课程设计总结:
通过此次C语言课程设计,使我对C语言这门课程有了新的认识和掌握,让我在实践中发现了很多问题和不足,但是经过一遍又一遍的思考和检查,最终都能找到问题所在并解决.我认为,在这次的C语言课程设计中,不仅培养了我的独立思考、动手操作的能力,而在各种其它能力上也都有了提高。在课程设计过程中,不断发现错误,并不断改正,更重要的是,我学会了很多学习的方法。而这是日后最实用的,真的是受益匪浅。要面对社会的挑战,只有不断的学习、实践,再学习、再实践。这对于我们的将来也有很大的帮助。以后,不管有多苦,我想我们都能变苦为乐,找寻有趣的事情,发现其中珍贵的事情。
目 录
第1章 概要设计 2
1.1题目的内容与要求 2
1.2总体结构 2
第2章 详细设计 3
2.1主模块 3
2.2分析模块 4
2.3提取保存模块 4
第3章 调试分析 7
第4章 使用说明 8
参考文献 10
附 录(程序清单) 11
17
沈阳航空航天大学课程设计报告 第1章 概要设计
第1章 概要设计
1.1题目的内容与要求
内容:设计一个简单的程序,把指定HTML文件中的电子邮件地址提取出来,并保存到文件中。
要求:
1) 读入一个HTML文件,分析文件格式,把文件中的电子邮件地址提取出来,并保存到指定文件中;
2)符合user@格式的字符串为电子邮件地址,@和.是必不可少的,要注意二者的位置;
3)保存时首行为HTML文件名,随后为原电子邮件地址在HTML文件中的行号,然后是邮件地址;
4)采用VC环境进行调试运行。
1.2总体结构
本程序主要分为三个模块:分析模块、提取保存模块、主模块。分析模块是进行判断文件是否存在、文件格式以及文件是否为空,提取保存模块是将文件中的电子邮件地址进行提取并保存到指定文件中,主模块为使用系统菜单调用前两个模块来运行程序。功能模块图如图1.1所示主模块
:
邮件地址提取
分析模块
提取保存模块
主模块
图1.1 功能模块图
沈阳航空航天大学课程设计报告 第2章 详细设计
第2章 详细设计
2.1主模块
控制整个程序的运行,将菜单操作用于一个循环中,用户需根据提示选择要进行的操作,用户输入1后进行调用分析模块和提取保存模块,输入2后推出循环并结束程序运行,若输入其他字符将提示用户输入有误并请用户重新输入。流程如图2.1所示。
图2.1 主模块流程图
2.2分析模块
需要用户输入要打开的文本文件名,系统将会判断文件是否存在并判断文件中是否为空,如果文件存在并不为空将继续运行程序,否则系统将提示“输入有误,请重新输入”。流程图如2.2所示:
图2.2 显示模块流程图
2.3提取保存模块
系统将提示用户再次输入要打开的文本文件名,然后提示用户输入要保存电子邮件地址的文件名,然后系统将会把每一行中的字符串输入到字符串数组中,系统将先判断这个字符串数组中是否有@,如果有@将继续判断整个字符串数组是否由数字、小写字母、@和.组成。如果是由这些组成将继续判断@前是否是数字、小写字母并且判断.是在@后面且二者不相邻。以上都满足时系统将会把用户打开的文件名、邮件地址在原文件中的行号以及这个满足条件的字符串数组保存到用户输入的指定的文件中。若以上的判断条件不能都满足时系统将自动进行对下一行的字符串进行判断,直到文件为空时将会停止判断并关闭用户所打开的文件且此模块的功能也结束了。流程图如2.3所示:
图2.3 提取保存模块流程图
9
沈阳航空航天大学课程设计报告 第3章 调试分析
第3章 调试分析
(1)问题1
问题描述:字符串无法输入到数组中
问题分析:由于未将数组定义为字符串数组,导致类型不同无法输入。
解决方法:将数组定义为字符串数组后,使用fgetc循环读入每一行的字母输到字符串数组中。
(2)问题2
问题描述:无法将提取出的电子邮件地址保存到另一个文件中
问题分析:由于使用了goto语句,没有执行关闭文件这一语句就返回继续判断下一行是否为电子邮件地址,没有及时保存。
解决方法:先执行关闭语句,然后再执行goto语句继续判断下一行是否为电子邮件地址。
(3)问题3
问题描述:第二次保存时的行号无法正确写入文件中,在第一次基础上累加了。
问题分析:定义的行号计数的整型变量为全局变量,导致程序第二次运行继续累加。
解决方法:将全局变量改变为局域变量,并且在判断每一行结束时都进行加加。
(4)问题4
问题描述:分析文件的函数结束不能继续进行提取函数中对文件中字符串的提取
问题分析:不能重复使用分析函数中的文件指针去进行提取函数的操作,导致程序无法执行。
解决方法:在提取函数中再次进行“输入你要打开的文件名”,然后进行提取。
沈阳航空航天大学课程设计报告 第4章 使用说明
第4章 使用说明
运行操作及结果:
1. 开始运行程序时,在屏幕上将出现如图4.1所示:
图4.1菜单图
2. 若选择1,在屏幕上将出现如图4.2所示
图4.2执行1操作图
3. 若继续,在屏幕上将出现如图4.3所示:
图4.3 提取出的邮件地址图
4. 若继续,在屏幕上将出现如图4.4所示页面:
图4.6 菜单图
5. 若选择2,在屏幕上将出现如图4.5所示页面:
图4.5 执行2操作图
沈阳航空航天大学课程设计报告 参考文献
参考文献
[1] 张长海.C语言程设计[M].北京:高等教育出版社,2006
[2] 谭浩强.C语言程序设计[M].北京:清华大学出版社,2005
[3] 冼镜光.C语言名题精选百则技巧篇[M].北京:机械工业出版社,2005
沈阳航空航天大学课程设计报告
附 录(程序清单)
# include <stdio.h>
# include <stdlib.h>
void fenxi()
{
FILE *fa;
char a[50];
jx: printf("\n\t\t请输入您要打开的文件: ");
scanf("%s",a);
fa=fopen(a,"r");
if(fa==NULL)
{
printf("\t\t\t此文件不存在");
goto jx;
}
getchar();
}
void tiqu()
{
FILE *fa,*fb;
char ch;int i=0,j,k=0,l=1;
char str[200]="",c[200]="", a[50],b[50];
printf("\t\t请再次输入您要打开的文件: ");
scanf("%s",a);
fa=fopen(a,"r");
printf("\n\t\t您要保存邮件地址的文件: ");
scanf("%s",b);
fb=fopen(b,"w");
if(fb==NULL)
{
printf("The file can not open");
exit(0);
}
printf("HTML文件名 行号 电子邮件地址\n");
fprintf(fb,"HTML文件名 行号 电子邮件地址\n");
while(!feof(fa))
{
fh: ch=fgetc(fa);
if(!feof(fa))
{
str[i]=ch;
if(str[i]!='\n')
i++;
else
break;
}
}
str[i]='\0';
for(j=i-1;j>0;j--)
{
for(;k<i;)
if(str[k]!='@')
k++;
else break;
if(str[k]!='@')
{
i=k=0;
l++;
goto fh;
}
else
{ for(j=0;j<i;j++)
{
if(str[j]>='a'&&str[j]<='z'||str[j]>='0'&&str[j]<='9'||str[j]=='@'||str[j]=='.')
c[j]=str[j];
else
{ i=k=0;
l++;
goto fh;
}
}
c[j]='\0';
if(c[0]!='@'&&c[i-4]=='.'&&c[i-1]=='m'&&c[i-2]=='o'&&c[i-3]=='c'&&c[i-5]!='@'||c[i-1]=='n'&&c[i-2]=='c'&&c[i-3]=='.'&&c[i-4]=='m'&&c[i-5]=='o'&&c[i-6]=='c'&&c[i-7]=='.'&&c[i-8]!='@'&&c[0]!='@')
{
fputs(a ,fb);
fprintf(fb," ");
printf("%s ",a);
fprintf(fb,"%d ",l);
printf("%d ",l);
fputs(c,fb);
printf("%s\n",c);
fprintf(fb,"\n");
l++;
if(feof(fa))
{
goto end;
}
else
i=k=0;
goto fh;
}
else
{
i=k=0;
l++;
goto fh;
}
}
}
end:fclose(fb);
fclose(fa);
getchar();
}
void main()
{
char c;
while(1)
{
to: printf("\n\n\n\n\n\t\t\t\t电子邮件地址提取主菜单\t\t\t\t\n");
printf("\t\t****************************************************\n");
printf("\t\t\t------------输入1运行程序------\n");
printf("\t\t\t------------输入2退出程序------\n");
printf("\t\t****************************************************\n");
printf("\t\t请输入您要执行的操作: ");
go: scanf("%c",&c);
switch(c)
{
case '1':fenxi();tiqu();
getchar();
system("cls");
goto to;
case '2': exit(0);
default :
printf("\t\t您输入有误,请重新输入: ");
scanf("%c",&c);
goto go;
}
}
}
展开阅读全文