软件设计方法实习报告.docx
《软件设计方法实习报告.docx》由会员分享,可在线阅读,更多相关《软件设计方法实习报告.docx(13页珍藏版)》请在冰豆网上搜索。
![软件设计方法实习报告.docx](https://file1.bdocx.com/fileroot1/2023-1/6/dbd17b5a-22dc-425c-9036-883963765464/dbd17b5a-22dc-425c-9036-8839637654641.gif)
软件设计方法实习报告
浦江学院
实习报告
(2010—2011学年第2学期)
课程名称:
软件设计方法
班级:
学号:
__
姓名:
___
指导教师:
__
2011年06月
一、内容和要求
(一)、基本要求
1.学习并掌握GCC编译程序过程和方法;
2.学习并掌握GDB调试程序的方法;
3.学习并掌握Make工程管理器的基本使用方法;
4.学习并掌握工程中,文件和路径的安排;
5.使用上述知识和技能,编写程序,完成实数的四则运算功能。
/std/calculate/cal.cmakefile
/add/add.cadd.hmakefile
/sub/sub.csub.hmakefile
/mul/mul.cmul.hmakefile
/div/div.cdiv.hmakefile
(二)、提高要求
1.安装Eclipse开发环境;
2.学习Eclipse开发环境的使用;
3.在Eclipse下,编写程序,完成实数的四则运算功能;
(三)、发挥部分
根据自己的程序开发水平,完成其他可展示功能程序。
二.过程(如实际程序开发、电子制作,详细说明有关原理、开发过程、调试过程、结果)
(一)、在LINUX下Shell命令行内执行四则运算
1、在Linux根目录root下创建自己的工作目录:
[root@localhost~]#mkdirstd
[root@localhoststd]#cdstd
[root@localhoststd]#mkdircalculate
[root@localhostcalculate]#cdcalculate
[root@localhostcalculate]#mkdiraddsubmuldiv
[root@localhostcalculate]#ls
adddivmulsub
2.在上述的工作目录下编写四则运算的代码。
(1)add目录下
[root@localhostadd]#viadd.c
floatadd(floata,floatb)
{
{returna+b;
}
[root@localhostadd]#viadd.h
#ifndefADD_H_
#defineADD_H_
floatadd(floata,floatb);
#endif
[root@localhostadd]#vimakefile
add.o:
add.c
cc-c-oadd.oadd.c
(2)sub目录下
[root@localhostsub]#visub.c
floatsub(floata,floatb)
{
returna-b;
}
[root@localhostsub]#visub.h
#ifndefSUB_H_
#defineSUB_H_
floatsub(floata,floatb);
#endif
[root@localhostsub]#vimakefile
sub.o:
sub.c
cc-c-osub.osub.c
(3)mul目录下
[root@localhostmul]#vimul.c
floatmul(floata,floatb)
{
returna*b;
}
[root@localhostmul]#vimul.h
#ifndefMUL_H_
#defineMUL_H_
floatmul(floata,floatb);
#endif
[root@localhostmul]#vimakefile
mul.o:
mul.c
cc-c-omul.omul.c
[root@localhostmul]#vimakefile
(4)div目录下
[root@localhostdiv]#vidiv.c
floatdiv(floata,floatb)
{
returna/b;
}
[root@localhostdiv]#vidiv.h
#ifndefDIV_H_
#defineDIV_H_
floatdiv(floatx,floaty);
#endif
[root@localhostdiv]#vimakefile
div.o:
div.c
cc-c-odiv.odiv.c
(5)calculate目录下
[root@localhostcalculate]#vical.c
#include
#include"add.h"
#include"sub.h"
#include"div.h"
#include"mul.h"
intmain(void)
{
intm=1;
floata=0;
floatb=0;
floatsum=0;
floatminus=0;
floatmulti=0;
floatdivide=0;
charc=0;
constfloatEPSILON=1e-10;
while(m==1)
{
printf("请输入两个实数:
\n");
scanf("%f%f",&a,&b);
printf("运算符号是:
\n");
scanf("%s",&c);
switch(c)
{
case'+':
sum=add(a,b);
printf("%f+%f=%f\n",a,b,sum);break;
case'-':
minus=sub(a,b);
printf("%f-%f=%f\n",a,b,minus);break;
case'*':
multi=mul(a,b);
printf("%f*%f=%f\n",a,b,multi);break;
case'/':
if((b>=-EPSILON)&&(b<=EPSILON))
{
printf("错误,除数不能为0!
\n");
break;
}
else
{
divide=div(a,b);
printf("%f/%f=%f\n",a,b,divide);
divide=div(a,b);
printf("%f/%f=%f\n",a,b,divide);
}
break;
default:
printf("未知运算符!
\n");
}
printf("输入1继续,输入其他退出程序!
\n");
scanf("%d",&m);
}
return0;
}
[root@localhostcalculate]#vimakefile
vpath%add.cadd
vpath%add.hadd
vpath%sub.csub
vpath%sub.hsub
vpath%mul.cmul
vpath%mul.hmul
vpath%div.cdiv
vpath%div.hdiv
obj=cal.oadd.osub.omul.odiv.o
test:
$(obj)
cc-otest$(obj)
cal.o:
cal.cadd.hsub.hmul.hdiv.h
cc-ccal.c-Iadd-Isub-Imul-Idiv
clean:
rm-rf*.o
上述程序中使用了gcc与makefile:
①在LINUX的终端命令中有gcc指令
◆预处理(Pre-Processing)
使用-E参数可以让GCC在预处理结束后停止编译过程:
#gcc-Ehello.c-ohello.i
◆编译(Compiling)
下一步是将hello.i编译为目标代码,这可以通过使用-c参数来完成:
#gcc-xcpp-output–chello.i-ohello.o
或者
#gcc-chello.i-ohello.o
◆汇编(Assembling)
◆链接(Linking)
#gcchello.o-ohello
②Makefile就是“自动化编译”,一旦写好,只需要一个make命令,整个工程完全自动编译。
make命令执行时,需要一个 Makefile 文件,以告诉make命令需要怎么样的去编译和链接程序。
Makefile的规则:
target ... :
prerequisites ...
command
...
target也就是一个目标文件,可以是Object File,也可以是执行文件。
还可以是一个标签(Label)。
prerequisites就是,要生成那个target所需要的文件或是目标。
command也就是make需要执行的命令。
这是一个文件的依赖关系,target这一个或多个的目标文件依赖于prerequisites中的文件,其生成规则定义在command中。
prerequisites中如果有一个以上的文件比target文件要新的话,command所定义的命令就会被执行。
make是如何工作的:
输入make命令。
那么,
1、make会在当前目录下找名字叫“Makefile”或“makefile”的文件。
2、如果找到,它会找文件中的第一个目标文件(target),并把这个文件作为最终的目标文件。
3、如果edit文件不存在,或是edit所依赖的后面的 .o 文件的文件修改时间要比edit这个文件新,那么,他就会执行后面所定义的命令来生成edit这个文件。
4、如果edit所依赖的.o文件也存在,那么make会在当前文件中找目标为.o文件的依赖性,如果找到则再根据那一个规则生成.o文件。
5、C文件和H文件存在时make会生成 .o 文件,然后再用 .o 文件生命make的终极任务,也就是执行文件edit了。
这就是整个make的依赖性,make会一层又一层地去找文件的依赖关系,直到最终编译出第一个目标文件。
在找寻的过程中,如果出现错误,比如最后被依赖的文件找不到,那么make就会直接退出,并报错,而对于所定义的命令的错误,或是编译不成功,make根本不理。
make只管文件的依赖性。
Vpath
Makefile中如果没有指明vpath这个变量,make只会在当前的目录中去找寻依赖文件和目标文件。
如果定义了这个变量,那么,make就会在当当前目录找不到的情况下,到所指定的目录中去找寻文件了。
Vpath的使用方法:
vpath
为符合模式的文件指定搜索目录。
vapth使用方法中的需要包含“%”字符。
“%”的意思是匹配零或若干字符,(需引用“%”,使用“\%")例如,“%.h”表示所有以“.h”结尾的文件。
指定了要搜索的文件集,而则指定了的文件集的搜索的目录。
(如果某文件在当前目录没有找到的话)我们可以连续地使用vpath语句,以指定不同搜索策略。
如果连续的vpath语句中出现了相同的,或是被重复了的,那么,make会按照vpath语句的先后顺序来执行搜索。
3.在calculate目录下使用make指令
[root@localhostcalculate]#make
cc-ccal.c-Iadd-Isub-Imul-Idiv
cc-c-oadd.oadd/add.c
cc-c-osub.osub/sub.c
cc-c-omul.omul/mul.c
cc-c-odiv.odiv/div.c
cc-otestcal.oadd.osub.omul.odiv.o
4.运行四则运算程序
[root@localhostcalculate]#./test
请输入两个实数:
54
运算符号是:
+
5.000000+4.000000=9.000000
输入1继续,输入其他退出程序!
1
请输入两个实数:
54
运算符号是:
-
5.000000-4.000000=1.000000
输入1继续,输入其他退出程序!
1
请输入两个实数:
54
运算符号是:
*
5.000000*4.000000=20.000000
输入1继续,输入其他退出程序!
1
请输入两个实数:
50
运算符号是:
/
错误,除数不能为0!
输入1继续,输入其他退出程序!
2
(二)、Eclipse的学习使用
在Eclipse下,编写程序,完成实数的四则运算功能
(1)、点击file下的新建(new)一个C工程(cproject);
(2)、在出现的对话框中,输入projectname,点Finsh,完成project的创建;
(3)、新建C源程序:
file->new->Csource;
(4)、新建头文件:
file->new->Cheadfile;
(5)、在sourcefile中输入filename,输入文件名要加上后缀.c或.h;
(6)、在Eclipse窗口中输入需要的C程序和各个头文件,复制上述代码即可;
(7)、单击“Build'Debug'forproject'test'”,然后再单击“Runtest”运行。
(三)、其他可展示功能程序
十进制正整数转换为二进制或八进制
#include
#include
intten_two(intnum)
{
inti=0;
intarr[20]={};
for(i=0;1;i++)
{
arr[i]=num%2;
num=num/2;
if(num==0)
break;
}
for(;i>=0;i--)
printf("%d",arr[i]);
printf("\n");
returnarr[20];
}
intten_eight(intnum)
{
inti=0;
intarr[20]={};
for(i=0;1;i++)
{
arr[i]=num%8;
num=num/8;
if(num==0)
break;
}
for(;i>=0;i--)
printf("%d",arr[i]);
printf("\n");
returnarr[20];
}
intmain(void)
{
intselect=0;
intnum=0;
intselect=0;
intnum=0;
inta[20]={};
inti=0;
printf("请输入一个十进制整数\n");
scanf("%d",&num);
printf("1-十进制转二进制,2-十进制转八进制\n");
scanf("%d",&select);
switch(select)
{
case1:
printf("转换为二进制:
\n");
ten_two(num);
break;
case2:
printf("转换为八进制:
\n");
ten_eight(num);
break;
default:
printf("您的输入有误,请重新输入!
\n");break;
}
return0;
}
运行结果如下:
请输入一个十进制数
8
1-十进制转二进制,2-十进制转八进制
1
转换为二进制:
1000
请输入一个十进制数
10
1-十进制转二进制,2-十进制转八进制
2
转换为八进制:
12
三、小结
这一周的课程设计是本学期所有课程设计里最令我纠结的一个,归根结底还是个大问题:
一个是基础知识掌握不牢;二是就是设计时粗心大意,小错误不断;三是检错能力差,不能根据报错结果找出错误原因。
以下是我设计时遇到的问题及解决方法:
1.编辑头文件时,分号容易漏掉,导致语法性错误
2.Makefile时gcc前面的空格一定要用TAB键,否则检测会报“缺少分隔符”
3.GCC的调试中出现了一些语法错误,gcc有很多种写法规则,因为类别太多导致容易混
淆。
4.编写Makefile不规范,错误很多,多目录下的makefile与同目录下的makefile虽然不同,但也有相同之处,不能做到举一反三。
5.关于如何在主程序下的makefile中引用add、sub等的makefile,通过查资料在陈浩编写的“跟我一起写Makefile”找到了答案。
问题看上去虽然不多,但每一个问题都曾使我焦头烂额很长时间,一直到星期四下午才把一切都弄好。
这次课程设计虽然给我带来了很多麻烦,但也同时激发了我对软件设计的挑战和兴趣,这次设计是结束了,但我会在课余时间继续专研,扩展自己该领域的知识面,不断的前进与挑战自我。
成绩
日期
批阅人