软件项目实训报告.doc

上传人:jian****018 文档编号:8901403 上传时间:2020-04-01 格式:DOC 页数:32 大小:85.50KB
返回 下载 相关 举报
软件项目实训报告.doc_第1页
第1页 / 共32页
软件项目实训报告.doc_第2页
第2页 / 共32页
软件项目实训报告.doc_第3页
第3页 / 共32页
点击查看更多>>
资源描述
辽宁工程技术大学大型软件项目实训报告教学单位 软件学院 专 业 软件工程 班 级 08 - 3 学生姓名 张兴堂 学 号 0820010329 指导教师 陈 虹 一、实训目的通过外出实训提高自己的实战能力,对软件编程项目有更深刻的理解。根据企业对人才的具体需求,针对软件学院应届毕业生,开展以大型软件工程项目为目的的实战训练,有效提升学生的项目实战能力和适应市场的能力,最终实现学生比较理想的就业率和就业质量。二、实训时间和地点1实训时间:2011年11月1月2012年1月6日2实训地点:北京达内三、实训单位简介达内IT培训集团是中国高端IT培训机构,致力于培养面向电信和金融领域的Java、C+、C#/.Net、测试、嵌入式、PHP等方面中高端软件人才,由美国国际数据集团IDG、集富亚洲JAFCOASIA和高盛集团投资,是国内首家获得国际风险投资的IT培训机构。经过8年运营,达内IT培训集团实现了95%的专业就业率,78%的口碑入学率,学员平均毕业薪资3800元/首月平均薪资。目前,达内IT培训团已经发展成为集培训、咨询、开发、人才服务于一体的高新技术集团公司,公司下设达内高端IT培训、达内软件人才服务中心、达内软件研发中心。达内IT培训集团以中关村科技园区为依托,在中国软件业发达城市北京、上海、广州、深圳、大连、南京、武汉、杭州、西安、苏州、成都、太原20大城市,建立了近40家培训中心,占地2万平米,年培训1万多名软件人才。已累计为IBM、微软、摩托罗拉、华为、中软、用友、Yahoo、阿里巴巴、TOM、新浪、搜狐、百度、联想、神州数码、大唐电信、亚信等知名IT企业培养输送了5万多名中高级软件人才,目前达内全国拥500多名员工,年产值近2亿元,是中国最大的中高端软件人才培训机构。由于达内IT培训集团优秀的教学效果和行业领先的经营模式赢得了社会各界的广泛赞誉和好评,近年来达内荣获了各界权威机构的颁奖:达内成为业界唯一的一家2006、2007、2008、2009连续4年入选德勤评选的“中国高科技高成长50强公司”、“亚太地区高科技高成长500强公司”,中关村管理委员会指定的“软件人才培养示范基地”、被计算机世界评选的“就业服务杰出贡献奖”、被中国计算机报评选的“最具影响力培训机构奖”、被搜狐评为“中国十大教育集团”、被腾讯评为“中国大学生心目中最具影响力的IT品牌”等等。 四、实训内容1实训期间完成的学习任务一Linux系统操作命令首先,我们学习了最基础的系统操作指令。因为在学习过程中c和c+代码的编程和修改在linux系统下,所以我们集中精力花费了3天时间学习指令操作。命令:文档统计: wc日期: date cal关机 poweroff windows:shutdownReboot exit find grep find 目录列表 匹配标准 -name size -type -atime 通配符操作目录下有需要通配的内容的时候采使用通配符。* (1) 列举(2) 范围?!; | 将上一个命令的输出作为下一个命令的输入 cat /etc/passwd | grep -n roottee ls -l | tee a.txt ln 硬连接 软连接 ln file02 file ln -s file02 sfile users:who:who am i:whoami: 系统进程信息 psps u:详细方式显示当前终端下的进程的信息ps -e:当前正在运行的所有进程sleep 10&kill PID jobs: 查看任务kill %n fg %n bg %n stop %n ctrl+c / z man 帮助手册(1) 系统命令(2) 系统调用 open (3) 库函数 fopen(4) (5) (6) (7) (8) 管理员的命令 ifconfig service ifconfigip地址:netmask: 默认网关:域名解析 netstat ping ip export HOME: PWD: PATH: LANG: CC: CCC: PS1: PS2 export PS1= /.bashrc source /.bashrc xxx.sh#!/bin/bash cal date ls vi命令模式: i a h j k l ctrl+b f shift+9 0 w e b $ 0 x 5x X 5X dd 5dd yw yy p r R u : undo #G 底行命令模式:set nuset cindent:按照C语言的风格进行自动缩进。set tabstop=4:设置tab按键的长度 行号+回车 字符串n N /n个空格 %s/string/replace/g w filename#1,#2 w filename q q! wqgedit kateC程序的开发执行次序: 1 写源文件,后缀名 .c 2 对代码中的指令进行预处理,以#开头的 3 代码编译,生成 xx.o/xx.obj 4 代码的连接生成可执行文件 a.out/xx.exe 5 加载文件,把文件从硬盘读入内存 6 执行 gcc 的选项: -c 只编译不连接 -E 只作预处理 -S 汇编代码 -std=c89/c99 -o 改变最后的可执行文件的名字 二.linu下c程序开发 库函数 sqrt 开平方 #include 连接的时候需要连接 数学库gcc xxx.c -lm 举例: 打印1-30 之间不能被4整除的整数。 while循环while(表达式) 语句; int i = 1;while(i11) printf(%d ,i+);举例 : 猜数游戏。 随机数: #include rand() 伪随机数 srand() 设置随机数种子 #include time() 获取系统的时间 time(0):返回一个时间 1970年1月1号0:0:0 到现在 所经过的秒数 随机数: srand(time(0); rand()产生一个随机数。无限循环:死循环 while(1) for(;) do-while循环: do 语句; while(表达式);缓冲区:输入: scanf(数据类型); scanf(%*n);* : 将读取到的内容忽略掉n : 非n的字符scanf(%*c); if(scanf()=0) 输出缓冲区: n 程序结束 满 4kb 人工刷新 fflush(stdout);/stdin stderr一维数组: 数据类型相同的一组数据。(结构体) 数组的定义: 数据类型 数组名数组的长度; char int float 结构体 int a5; 下标: 数组的初始化: int a5 = 1,2,3,4; int a5 = 0;指定初始化: int a5 = 3 = 4; 二维数组: 数据类型 数组名行列 行下标 列下标 for() for() aij = 0; 一维: for() ai = 0; 二维数组初始化: int a23 = ,;函数的返回值: 函数返回值的类型必须和return返回值的类型一致。 如果函数没有返回值 指定 void C语言中 返回值类型可以省略 默认 int 参数:形式参数 多个形式参数之间使用逗号分割 每个形式参数必须有类型的说明float x,y,z;float aver(float x,y)/错误 C语言中没有bool类型 #include bool true false 本质就是一个整数 #include double sqrt(double); gcc xxx.c -lm 函数调用 函数名(实际参数); 形式参数和实际参数: 参数名可以不一样 函数声明: C语言规定:函数在使用之前必须声明。 声明: 函数头; bool prime(int); 可以不写形式参数的名字。 隐式声明: 如果函数在使用之前并没有进行声明,编译器会自动创建 一个隐式声明,返回值类型为 int 实际参数-形式参数 值传递: 拷贝一份数组赋值给形式参数。 float aver(float x,float y); t = aver(i,j); i-x j-y aver返回值-t注意: 实际参数和形式参数名字一样,存储空间不一样。 高内聚 低耦合 数组可以作为函数的参数: 函数调用传递的是数组的名字 (数组第一个元素的地址) 数组的长度 = sizeof(数组名)/sizeof(元素) 不能实现: 数组传递的是地址。 sizeof(地址) = 4 形式参数为数组的时候,我们应该设计两个参数:一个数组 另外一个 数字的长度 int function(int a,int length,.) const: 使用const修饰的变量,只读变量。 如果形式参数传递的是地址,不希望在被调函数中修改地址上的 内容 可以使用const来修饰形参 void f(const int a,int length);return : main函数中使用 整个程序结束。递归: 如果一个函数调用了它本身,递归函数。指针的初级: 指针 就是内存的地址,指针变量就是存储地址的变量。定义一个指针变量:数据类型 *变量名;指针变量所保存的地址-内存上的数据类型。* : 告诉编译器后面的变量是一个指针变量 指针初始化: int *q = NULL;/NULL 0 0.0 空指针:不指向任何地方 指针的赋值: q = &i;运算符: * 取对应地址上的内容。const与指针: (1) const int *q : q指向的数据数值不能改变 q本身可以改变。 (2) int * const q : q本身不可以改变,q指向的数值是可以改变的。 数组名 (3) const int * const q字符串: string类型三种表现形式:(1)字面值常量“abcde”,不能作为变量,可以赋值给变量。程序段(代码段)后面0结束数值相同的字面值常量在代码段只有一份。(2)char arr20表示字符串类型的变量(数组)后面一定加上0printf(%s,arr);-arr是数组的名字一直打印直到遇到0(3)int a10;int* q=&a0; char str20;char *q=&str0; 指针方式存储字符串常量的地址。考虑缓冲区的大小,可能会导致缓冲区溢出。fgets(char *s,size_t size,FILE* stream);s:指向缓冲区的指针size:缓冲区的大小stream:文件指针-stdin注意:fgets会在整个字符串后面增加n操作字符串的库函数:#include strcpy char* strcpy(char* dest,char* src); 作用:将src指向的字符串拷贝呆dest指向的缓冲区中。 返回值:dest数值(地址)。 使用:char str120;char str220;strcpy(str1,str2);strcpy(str1,hello); 注意:strcpy不考虑第一个参数指向缓冲区大小。char* strncpy(char* dest,const char* src,size_t size);strcat: char* strcat(char *dest,char* src); 作用:将src指向的字符串链接到dest指向的字符串结尾的地方注意:不会考虑dest指向的缓冲区的大小。char* strncat(char* dest,char* src,size_t size);strlen:-sizeof char name20 = hello; sizeof(name)-20:数组所占用的内存 int strlen(char* s); strlen(name) = 5; 测量字符串的长度,不包含结尾的nstrcmp:对比两个字符串 int strcmp(char* s1,char* s2) abc acb 返回值有三种可能: 1 0 相等 2 正数 s1s2 3 负数 s1printf(i/j = %d,i/j);PRINT(x/y)-printf(x/y = %d,x/y); #define PRINT(n) printf(.,n) #运算符: 可以将宏中的参数转换为字面值常量。限定: #运算符只能出现在带参数的宏替换列表中 字符串: abcde = abcde#define PRINT(n) printf(#n = %dn,n) - i/j = %dn-i/j = %dn #运算符 作用:将两个标识符粘合在一起组成一个新的标识符 需求: int float int max_int()-整数float max_float()-浮点数.#define MAX(type) type max_#type() .MAX(int)- int max_int()MAX(float)- float max_float() 需要很多标识符名字。#define MK_ID(n) i_#nMK_ID(1) - i_1MK_ID(32) - i_32条件编译: 就是根据预处理的结果来包含或者排除某一段代码。#if #endif 预处理器判断#if后面的宏目前的数值 0-#if 和 #endif之间的代码排除 非零 保留defined #if defined DEBUG - DEBUG是不是已经定义为一个宏#ifdef = #if defined debug:调试 n多条调试语句(printf)release:发布 /#define DEBUG#ifdef DEBUG 调试语句#endif#ifndef-#if not defined #include test.h #include test.hmakefile:由很多条规则组成的:目标文件: 依赖文件生成目标文件所执行的指令选择一条规则来执行make 目标文件如果想要使用定义在其他文件中的全局变量请使用 extern 声明extern int user_id; 自定义头文件: 系统提供的头文件: stdio.h stdlib.h stdbool.h string.h unistd.h math.htime.h stdarg.h等等 多文件程序中,共享全局变量 宏定义共享 函数声明共享类型定义共享需要使用头文件。可以使用条件编译防止重复引用。/*/#ifndef SYSTEM_H#define SYSTEM_H #include #include #include s1.h#include s2.h#define PI 3.14#define MAX 2000extern int i;extern int j;/函数的生命int max_min(int,int);void show();/类型定义struct s;#endifstatic :静态局部变量静态全局变量 static int user_id = 15; 即使使用 extern int user_id;static修饰函数 这个函数只能在本文件中使用。结构体:数 组: 相同数据类型的数据的集合。结构体: 不同数据类型的数据的集合。结构体:定义或者使用一个结构体变量之前,先进行类型定义。结构体变量的定义:struct employee em;初始化:struct employee em = 101,guo,M,20,5000;2 实训期间完成的实践项目我在达内老师的带领下,学习了c和c+基础之后,做了一个贪吃蛇的小游戏,虽然游戏比较简略,但是基本功能已经实现。(1).功能介绍:产生一个固定大小没有辩解的游戏区域,蛇从区域的中心开始,由玩家通过键盘控制蛇的运动方向,用蛇头去吃随机分布在游戏区域内的食物;蛇的运动限制在游戏区域内,游戏区域没有辩解,所以蛇在区域内做循环运动:蛇的运动方向为直线运动,只走横和竖的方向,不走斜线;蛇的运动速度由游戏的难度来控制,难度越高速度越快,游戏难度分为9个等级;蛇的身体长度从1开始每吃掉一份食物就增加一个长度;食物的出现按照随机分布原则,蛇吃掉一份后随机在游戏区域内放一份新的食物;游戏的结束条件为:在控制蛇的过程中蛇头碰到蛇的身体的任何部位;设计者应该首先考虑实现一个可以游动的蛇。通过寻找规律,对实际对象进行抽象概括建立对象模型,首先从物理的角度来分析蛇得运动规律。它是蠕动的,像水一样流动。他有个特性就是身体的每一个点都经过他头部所在的点,他每一个时刻骨节所要运动的目的地是他前一个骨节所在的位置。所以我们事先必须了解并掌握一些基本的画图函数,并学会调用和运行。(2).用流程图示出程序的主要控制流程和处理流程 游戏载入内存并初始化界面判断游戏是否开始单击按钮开始游戏没有开始游戏,就返回初始界面贪吃蛇开始移动(初始方向向左)根据键盘消息判断蛇头的运动方向根据蛇头的坐标和食物的坐标判断蛇是否已经得到食物如果已经得到食物,则蛇的身体加长,积分器加一如果没有得到食物,则蛇的身体不变,积分器不变根据蛇头的坐标、蛇身体的坐标和墙壁的坐标判断蛇是否已经撞墙或者自己咬到自己如果没有撞墙并且没有自己咬到自己则程序继续进行如果已经撞墙或者自己咬到自己则程序终止贪吃蛇程序结束积分器开始计分下面是项目代码:#include #include #include #include #include #define NUM 60struct direct /用来表示方向的 int cx; int cy;typedef struct node /链表的结点 int cx; int cy; struct node *back; struct node *next;node;void initGame(); /初始化游戏int setTicker(int); /设置计时器void show(); /显示整个画面void showInformation(); /显示游戏信息(前两行)void showSnake(); /显示蛇的身体void getOrder(); /从键盘中获取命令void over(int i); /完成游戏结束后的提示信息void creatLink(); /(带头尾结点)双向链表以及它的操作void insertNode(int x, int y); void deleteNode();void deleteLink();int ch; /输入的命令int hour, minute, second; /时分秒int length, tTime, level; /(蛇的)长度,计时器,(游戏)等级struct direct dir, food; /蛇的前进方向,食物的位置node *head, *tail; /链表的头尾结点int main() initscr(); initGame(); signal(SIGALRM, show); getOrder(); endwin(); return 0;void initGame()cbreak(); /把终端的CBREAK模式打开noecho(); /关闭回curs_set(0); /把光标置为不可见keypad(stdscr, true); /使用用户终端的键盘上的小键盘srand(time(0); /设置随机数种子 /初始化各项数据hour = minute = second = tTime = 0;length = 1;dir.cx = 1; dir.cy = 0;ch = A;food.cx = rand() % COLS;food.cy = rand() % (LINES-2) + 2;creatLink();setTicker(20);/设置计时器(这个函数是书本上的例子,有改动)int setTicker(int n_msecs)struct itimerval new_timeset;long n_sec, n_usecs;n_sec = n_msecs / 1000 ;n_usecs = ( n_msecs % 1000 ) * 1000L ;new_timeset.it_interval.tv_sec = n_sec; new_timeset.it_interval.tv_usec = n_usecs; n_msecs = 1;n_sec = n_msecs / 1000 ;n_usecs = ( n_msecs % 1000 ) * 1000L ;new_timeset.it_value.tv_sec = n_sec ; new_timeset.it_value.tv_usec = n_usecs ; return setitimer(ITIMER_REAL, &new_timeset, NULL);void showInformation() tTime+;if(tTime = 1000000) /tTime = 0;if(1 != tTime % 50)return;move(0, 3); /显示时间printw(time: %d:%d:%d %c, hour, minute, second)second+;if(second NUM)second = 0;minute+;sf(minute NUM)minute = 0;hour+;/显示长度,等级move(1, 0);int i;for(i=0;inext-cx & 1=dir.cx)| (0=head-next-cx & -1=dir.cx)| (LINES-1=head-next-cy & 1=dir.cy)| (2=head-next-cy & -1=dir.cy)over(1); return;/如果蛇头砬到自己的身体,则游戏结if(* = mvinch(head-next-cy+dir.cy, head-next-cx+dir.cx) )over(2);return;insertNode(head-next-cx+dir.cx, head-next-cy+dir.cy);/蛇吃了一个“食物”if(head-next-cx=food.cx & head-next-cy=food.cy)lenChange = true;length+;/恭喜你,通关if(length = 50)over(3);return;/重新设置食物的位置food.cx = rand() % COLS; food.cy = rand() % (LINES-2) + 2; if(!lenChange) move(tail-back-cy, tail-back-cx); printw( );deleteNode(); move(head-next-cy, head-next-cx); printw(*);void show()signal(SIGALRM, show); /设置中断信号showInformation();showSnake();refresh(); /刷新真实屏幕void getOrder() /建立一个死循环,来读取来自键盘的命令 while(1) ch = getch(); if(KEY_LEFT = ch) dir.cx = -1; dir.cy = 0; else if(KEY_UP = ch) dir.cx = 0; dir.cy = -1; else if(KEY_RIGHT = ch) dir.cx = 1; dir.cy = 0;else if(KEY_DOWN = ch)dir.cx = 0;dir.cy = 1;setTicker(20);void over(int i) /显示结束原因 move(0, 0); int j; for(j=0;jcx = 5; temp-cy = 10; head-back = tail-next = NULL; head-next = temp; temp-next = tail; tail-back = temp; temp-back = head;/在链表的头部(非头结点)插入一个结点void insertNode(int x, int y)node *temp = (node *)malloc( sizeof(node) );temp-cx = x;temp-cy = y;temp-next = head-next;head-next = temp;temp-back = head;temp-next-back = temp;/删除链表的(非尾结点的)最后一个结点void deleteNode()node *temp = tail-back;node *bTemp = temp-back;bTemp-next = tail;tail-back = bTemp;temp-next = temp-back = NULL;free(temp);temp = NULL;/删除整个链表void deleteLink()while(head-next != tail)deleteNode();head-next = tail-back = NULL;free(head);free(tail);下面是程序流程图:五、实训收获与体会 通过这次课程设计的实训,增加了我学习软件技术的兴趣,虽然还不明确软件技术包含的具体内容,但从C+语言这门课程开始,已发现程序设计的乐趣,在学习C+语言的过程中也学到了许多计算机应用基础知识,对计算机的机体也有了一个大体的了解。 在实际操作过程中犯的一些错误还会有意外的收获,感觉实训很有意思。在具体操作中对这学期所学的C+语言的理论知识得到巩固,达到实训的基本目的,也发现自己的不足之出,在以后的上机中应更加注意,同时体会到C+语言具有的语句简洁,使用灵活,执行效率高等特点。发现上机实训的重要作用,特别是对数组和循环有了深刻的理解。 通过实际操作,学会 C+语言程序编程的基本步骤、基本方法,开发了自己的逻辑思维能力,培养了分析问题、解决问题的能力。深刻体会到“没有做不到的,只有想不到的”,“团结就是力量”,“实践是检验真理的标准”,“不耻下问”的寓意。 在此希望以后应多进行这样的实训,加长设间,培养学生独立思考问题的能力,提高实际操作水平。 六、致谢通过本次项目实训我要感谢学校领导给我们提供了这次机会,让我们自己有出去体会生活,自己做项目的深刻体会。这次实训让我明白我自己之前的学习还是差很多,只有不断的努力,才能学好。还要感谢达内公司对我的指导,我自己的努力固然重要,但是达内的优秀教师给我做的培训,讲的理论都让我受益匪浅,让我对软件有了一个新的概念新的理解。指导教师意见指导教师签字: 年 月 日 成绩备注
展开阅读全文
相关资源
相关搜索

当前位置:首页 > 管理文书 > 工作总结


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!