当前位置:文档之家› 软件工程 编码

软件工程 编码

实验三
一、实验目的
掌握结构化编程,对程序源代码进行工程文档化处理
二、主要仪器设备
微型计算机系统,MS Visio 2003软件,IDE软件
三、实验原理与方法
根据提供的非结构化伪码或源代码,编写出结构化的程序。

结构化程序设计的原则(使用顺序、选择、重复基本控制结构表示程序逻辑,控制结构的单入口与出口等)为指导,使用约束型流程图、NS或PAD图进行结构化的设计;采用自顶向下和逐步细化的原则,导出程序的结构化编码。

四、实验内容与步骤
1、主要内容
根据给定的非结构化案例和实验大纲的要求,建立模块结构化模型(主模块、子模块),并编写每个模块的结构化文档化代码。

案例:复制命令
接口:<程序名> [参数1] [参数2]
功能:是将命令行参数中的参数1标识的文件,复制到参数2标识的文件中,如命令行中只有一个文件名则把该文件写到标准输出文件(显示器)中。

【源码】
#include<stdio.h>
main(int argc,char *argv[])
{ FILE *fp1, *fp2; char ch; int Sel;
Sel = argc;
if(Sel==1) goto Sel_No ;
if((fp1=fopen(argv[1],"rt"))==NULL) goto Sel_Sr ;
if(Sel==2) fp2=stdout;
else if((fp2=fopen(argv[2],"wt+"))==NULL) goto Sel_Dt ;
while((ch=fgetc(fp1))!=EOF) fputc(ch,fp2);
fclose(fp1);
fclose(fp2);
goto Sel_End
Sel_No: { printf("have not enter file name strike any key exit");
getch();
exit(0); }
Sel_Sr: { printf("Cannot open %s\n",argv[1]);
getch();
exit(1); }
Sel_Dt: { printf("Cannot open %s\n",argv[1]);
getch();
exit(1); }
Sel_End:
}
要求:(1)增加设计命令使用方法的提示,若参数仅是/?则显示命令的使用说明;
(2)增加设计命令执行后结果提示。

(3)源代码结构化处理。

(4)文档化处理:前置的功能说明、变量作用说明、数据结构说明、控制逻辑说明、关键语句说明。

2、实验主要步骤
1)系统的启动过程
启动windows,打开visio2003软件,在“文件”新建中选择所要绘制图形的类型,然后选择“文件”中要建立的形状类型,即可绘图。

打开visual c++6.0,即可进行程序编译。

2)文档的建立过程
根据给定的一段编码进行修改、注释并绘图。

绘图时先选择好模板,建立好文档,点击插入,插入新页,保存,命名。

3)程序结构模型的建立过程
在本次实验中,根据老师给定的一段源程序,对源程序进行结构化处理以及注释,并在c++软件中编译运行,在CMD窗口中调试程序,看是否完成两个文件间的内容复制,并用格式<程序文件名> \?查看帮助信息。

然后根据修改后的源程序代码,在visio软件里画出相对应的程序结构化模型图(包括约束性流程图、NS图、PAD图)。

五、完整的实验结果
1、提交结构模型与代码工程文档:班级_学号_MSD.vsd、班级_学号_MPC.doc
2、程序结构化模型图
图 1:程序流程图
开始打开文件输入文件
请求帮助信息
输出帮助信息
文件是否存在
复制是否结束输出完成信

输出错误信

F
T
T F 关闭文件结束
图 2:N-S 图
图 3:PAD 图
3、调试成功的结构化、文档化源编码:(附详细的编码打印)1)接口设计:
2)代码
#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
#include<string.h>
#define N 200 //预定义没N的值为常数200
int main(int argc, char *argv[])
{
char totalLine[N]; //定义可存放N个字符的数组来临时存放每行的数据
FILE *fp1, *fp2; //定义两个文件指针fp1,fp2
if (argc==1)
{
printf("没有文件名,按任意键退出!");
getchar();
exit(-1);
}
if ( strcmp(argv[1],"\\?") == 0) //输入的是否是" \? ",显示参数帮助信息{
printf("cp 帮助信息:\n");
printf("1.cp的功能是完成两个文件间内容的复制\n");
printf("2.cp格式:<程序名> [参数1] [参数2]\n");
printf("3.参数1:源文件名及其路径\n");
printf("4.参数2:目标文件名及其路径\n");
printf("5.参数为/?表示在屏幕上显示帮助信息\n");
exit(0);
}
fp1 = fopen(argv[1], "r"); //直接用只读方式打开源文件
if(fp1==NULL){
printf( "fp1 file open failure!");
return 0;
}
fp2 = fopen(argv[2], "w"); //用可读可写方式打开目标文件
if(fp2==NULL){
printf("fp2 file open failure!");
return 0;
}
while(fgets(totalLine, N-1, fp1)) //将每行依次读取到数组中
{
fputs(totalLine, fp2); //依次写入每行的数据,包括换行
printf("复制成功!"); //在屏幕上显示文件内容复制成功的信息
}
fclose(fp1); //关闭fp1指针指向的文件
fclose(fp2); //关闭fp2指针指向的文件
return 0;
}
六、实验结果讨论
1、经过本次实验,我意识到自己的C语言学的还不够好,尤其是指针和文件方面,还有待提高。

2、int main(int argc, char *argv[])中,argc是个参数,是int型的;而char *argv[]是一个字符数组,其大小是int argc,主要用于命令行参数。

argv数组里每个元素代表一个参数。

3、本次实验是实现两个文件内容间的复制,是将源文件的内容复制到目标文件中。

该程序是在CMD窗口中运行的。

4、实现复制的格式为:<程序文件名> [源文件名] [目标文件名]。

相关主题