1、资料内容仅供您学习参考,如有不当或者侵权,请联系改正或者删除。程序设计综合训练设计报告专 业: 数字媒体技术班 级: 11媒体Z学 号: 11145107姓名: 朱毅指导教师: 陈湘军 陈明霞成绩: 计算机工程学院 10月第一部分题目: 1.编写函数 int hamming(int x,int y,char a,char b)实现以下功能: 先将形参x和y分别转换为2个合法代码并按从低位到高位的顺序为别保存2个合法代码的码距, 函数返回该码距。2.编写函数main( ) 函数实现以下功能: 声明字符数组a、 b和变量m、 n输入两个整数冰保存到m和n中, 若m、 n的值在032767范围内则用
2、m、 n和数组a、 b做实参调用haming函数, 计算由m和n生成的两个合法代码的码距输出的到屏幕及文件myf2.out中。最后将考生本人的准考证号输出到文件myf2.out中。来自: ( 秋) 上机试卷( 03) 的编程题。解题的基本思路: 子函数就是将形参X,Y分别转换为2个合法的代码并按从低位到高位的顺序分别保存2个合法代码到a和b指向的数组中, 在计算a数组和b数组中的两个合法代码的码距, 函数返回码距。主函数就是调用子函数, 并输出结果。设计方案: 主函数main()(1) 功能模块框图: 调用子函数: hamming()子函数调用函数:bin()主函数(2)程序流程图: 入 口
3、读文件创立文件, 输入m,n调用函数hamming( ) 返回count;出 口用hamming()调用函数bin( ) Hamming函数循环体Bin函数循环体循环体算法设计: ( 1) 算法描述: 由于hamming函数需要分别将两个整数转换为合法代码, 因此编写函数”void bin(int n,char str)”。Bin函数的功能是将形参n转换为合法代码并保存到b指向的一维数组中。Hamming函数先两次调用bin函数, 分别将形参X和Y转换为合法代码并分别保存到a和b指向的一维数组中, 在用循环语句从前向后遍历a和b指向的数组各元素, 函数最后返回统计结果。( 2) 实现方法: 用
4、VC6.0软件进行调试, 分析, 输入m,n两个值, 进行分析, 调用函数hanmming( ) , 在从hanmming( ) 函数中调用函数bin( ) , 返回count的值, 输出, a,b数组中的值和返回值count的值。源代码: #includevoid bin(int n,char str)int i=15,j;while(n!=0)stri-=n%2+0;n/=2;for(j=0;j=i;j+)strj=0;str16=0;int hamming(int x,int y,char a,char b)int count=0,i;bin(x,a);bin(y,b);for(i=0;
5、i32767&m32767&n0);x=hamming(m,n,a,b);printf(n%sn%sndistance of %d and %d is %d n,a,b,m,n,x);fprintf(fp,n%sn%sndistance of %d and %d is %d n,a,b,m,n,x);fprintf(fp,11145107);fclose(fp);程序调试: 就是输入的时候, n和m的值范围问题, 当输入范围不正确时候跳不出来解决方法: 用一个dowhile;循环条件为大于32767和小于0的时候退出。测试: 第二部分职工信息管理系统( 1) 题目名称: 职工信息管理系统内容:
6、 职工信息包括职工号、 姓名、 性别、 出生年月、 学历、 职务、 工资、 住址、 电话等( 职工号不重复) 。试设计一职工信息管理系统, 使之能提供以下功能: 1、 职工信息录入功能(职工信息用文件保存, 也可不用) 2、 职工信息浏览功能 3、 排序: 按工资排序4、 查询或排序功能: (至少一种查询方式: 顺序、 折半查找) 按工资范围查询5、 职工信息删除、 修改功能(任选一项)( 2) 解题的基本思路程序采用模块化, 每一个模块对应一种功能, 调用函数予以实现, 分别为7个模块, 分别是创立与添加模块、 显示模块、 查找模块、 修改模块、 删除模块、 存档模块、 文件统计模块、 退出
7、模块, 把复杂的问题分成每一个独立功能的小问题来解决。( 3) 设计方案1、 功能模块图菜单开始根据菜单输入序号值选择程序结束是否继续进行 NY2修改职工信息3浏览职工信息4分类查找职工信息5删除职工信息6从文件读取信息0退出1录入职工信息按职工号查找按姓名查找(4) 算法设计该程序主要分为7个模块, 分别是创立与添加模块、 显示模块、 查找模块、 修改模块、 删除模块、 存档模块、 文件统计模块、 退出模块创立与添加模块: 该模块的功能是输入职工信息。函数为void Add(Node *woker)原理: 采用尾插法, 先建立链表与头结点, 新增一个结点, 键盘输入职工号、 职工姓名、 职工
8、性别、 职工出生年月、 职工学历、 职工职位、 职工工资, 将这些信息存储到新增结点中, 将新增加的节点连到链表的尾端, 如此以往, 将尾结点的指针域置空, 这样就得到了一条存储职工信息的链表, 这样就完成了职工信息的创立与增加。显示模块: 该模块功能是显示职工信息。函数为void Disp(Node *woker)原理: 先新建一个指针P指向头结点, 判断它的指针域是否为空, 若为空, 则输出”没有记录能够显示”; 若不为空, 则输出它的指针域所指向节点所储存的职工信息, 并将该指针向后移一个结点, 直到P指向空, 即输出了所有职工的信息, 这样就完成了所有职工信息的显示。查找模块: 该模块
9、功能是查找职工信息。函数为void Tongji(Node *woker)原理: 该模块分为两种查找方法, 分别是按职工号查找和按职工姓名查找, 因为这两种查找方法雷同, 因此这里将只解释按职工号查找的原理。先键盘输入一个要查找的职工号并新建一个指针P指向头结点, 判断它的指针域是否为空, 若为空, 则输出”没有资料能够统计分类”, 若不为空, 则判断它的指针域所指向节点所储存的职工信息中的职工号, 若相等, 则输出这个职工的其它所有信息, 并将P指向下一个结点, 再次进行判断, 直到P指向空, 即输出了所有查找到的信息。若不相等, 则P指向下一个结点, 再次进行判断, 直到P指向空, 即输出
10、了所有查找到的信息, 这样就完成了职工信息的查找。修改模块 : 该模块功能是修改职工信息。函数为void change(Node *woker)原理: 根据查找原理, 查找到要修改信息的职工, 删除这一节点, 并新建一个节点, 键盘输入想要修改的内容, 并储存到新的结点中, 将新的节点连接到链表中原先删除结点的位子, 这样就完成了职工信息的修改。删除模块: 该模块功能是删除管理职工信息。函数为void dismiss(Node *woker)根据查找的原理, 查找到要修改信息的职工, 删除这一节点, 并将其前驱结点的指针域指向其后继结点, 这样就完成了职工信息的删除。存档模块: 将内存中的信息
11、存储到文件中。函数为void save(Node *woker)原理: 打开文件, 新建一个指针P指向头结点, 判断它的指针域是否为空, 若为空, 则输出”无记录”, 若不为空, 则将这个职工的所有信息输入到文件中, 并将P指向下一个结点, 直到P指向空, 即输入了的信息, 文件统计模块: 打开文件, 统计职工数目, 并输出。函数为void load(Node *woker)退出模块: 该模块功能是退出管理档案。( 5) 程序调试与测试: 欢迎界面: 主界面: 创立与增加模块: 输入职工信息为: 职工号职工姓名职工性别职工出生年月职工学历职工职位职工工资1Af11bena10002Bm22be
12、nb 3Cf33benc30004Dm44bend4000输入第一次时: 输入第二次时: 输入第三次时: 输入第四次时: 显示模块: 输入四次后显示的结果为: 查找模块: 输入查找职工号为3的职工信息: 输入查找职工姓名为c的职工信息: 修改模块: 修改职工号为3的职工信息为: 职工号职工姓名职工性别职工出生年月职工学历职工职位职工工资5Ef55eee5000职工信息变成: 删除模块: 删除职工号为5的职工信息: 删除后的结果为: 退出模块: ( 6) 总结此次实践课编写的是一个应用程序, 相对于以前我们见到的程序, 它要大得多, 运行的结果也没有预想中的好, 数据的输出格式不太规范, 而且各
13、模块也出现了一些小问题, 我很有耐心的一次又一次的进行修改, 最后运行的结果基本上达到了预期的目的。本次C 语言的实习课让我对C 语言的学习又有了更深入的了解, 也让我更深刻地领悟到了”实践出真理”这个道理, 在上机实践过程中学到的知识远远超过了在课堂上学到的, 这次程序设计课让我增添了许多程序设计经验, 为我们将来走上工作岗位其了不小的铺垫作用。本次实习中遇到了很多以前没有遇到过的问题, 也曾想过要放弃, 但看到那些同学都在那认真的写程序, 给了我继续的信心。在同学和老师的帮助下, 我顺利的结束了本次实习, 让我知道原来凭借自己努力取得的成功会让自己这么欣慰。( 7) 附录: 源代码#inc
14、lude #include stdlib.h#include struct wokers/定义一个woker的结构体char num10;/职工号char name15;/职工姓名char sex15;/职工性别char birthday15; /职工出生年月char degree10; /职工学历char position10; /职工职位char salary10; /职工工资;typedef struct nodestruct wokers data;struct node *next;/建立一个链表。Node;void Add(Node *woker)/添加记录Node *p,*r,*
15、s; char n10; /先用于输入职工号,也用于判断是否跳出循环r=woker;s=woker-next; /使s为第一个有用的结点while(r-next!=NULL) /这个循环的作用是使r为最后一个有用的结点r=r-next; /将指针置于最末尾while(1) printf(提示:输入0则返回主菜单!n); printf(n请你输入职工号:); scanf(%s,n); if(strcmp(n,0)=0) break; p=(Node *)malloc(sizeof(Node); /申请空间 strcpy(p-data.num,n); printf(n请输入姓名:); scanf(
16、%s,p-data.name); printf(n请输入性别:); scanf(%s,p-data.sex); printf(n请输入出生年月:); scanf(%s,&p-data.birthday); printf(n请输入学历:); scanf(%s,&p-data.degree); printf(n请输入职位:); scanf(%s,&p-data.position); printf(n请输入工资:); scanf(%s,&p-data.salary); printf(提示:已经完成一条记录的添加。n); p-next=NULL; r-next=p; /这一步是必须的,将p与先前的链表
17、连起来构成一条新链表 r=p; /也是必须的.将r 又重设为新链的最后一个有用结点 void change(Node *woker)/修改职工信息函数Node *p;char find20;if(!woker-next) printf(n提示:没有资料能够修改!n); return;printf(请输入要修改的职工号:); scanf(%s,find); p=woker-next; while(p!=NULL) if(strcmp(p-data.num,find)=0) /如果找到的话返回的是符合要求 break; p=p-next; if(p) int x; while(1) printf(
18、完成修改请输入0否则输入任意数再进行修改:); scanf(%d,&x); if(x=0) break; printf(请输入新职工号(原来是 %s ):,p-data.num); scanf(%s,p-data.num); printf(请输入新职工姓名(原来是 %s ):,p-data.name); scanf(%s,p-data.name); printf(请输入新职工性别(原来是 %s ):,p-data.sex); scanf(%s,p-data.sex); printf(请输入新出生年月(原来是 %s ):,p-data.birthday); scanf(%s,p-data.bir
19、thday); printf(请输入新职工学历(原来是 %s ):,p-data.degree); scanf(%s,p-data.degree); printf(请输入新职工职位(原来是 %s ):,p-data.position); scanf(%s,p-data.position); printf(请输入新职工工资(原来是 %s ):,p-data.salary); scanf(%s,p-data.salary); printf(n提示:该项记录资料已经成功修改!n); else printf(n提示:你要修改的信息不存在!n); void Disp(Node *woker)/输出职工信
20、息Node *p;p=woker-next;if(!p) printf(n提示:没有记录能够显示!n); return; printf(tttt显示结果n); printf(职工号 职工姓名 职工性别 职工生日 职工学历 职工职位 职工工资n); while(p) printf(n%-13s%-11s%-7s%-10s%-13s%-10s%-5sn,p-data.num,p-data.name,p-data.sex,p-data.birthday,p-data.degree,p-data.position,p-data.salary); p=p-next;void Tongji(Node *w
21、oker)/查找统计函数Node *p;int sel;int flag2=0,ha=0;char find20; p=woker-next; if(!woker-next)/若链表为空 printf(n提示:没有资料能够统计分类!n); return;printf(提示:n=0退出n=1按职工号统计n=2按职工姓名名称统计n);scanf(%d,&sel);if(sel=1) printf(n输入你要统计分类的职工号:);scanf(%s,find); while(p) if(strcmp(p-data.num,find)=0) flag2+; if(flag2=1&ha!=flag2) p
22、rintf(职工号 职工姓名 职工性别 职工生日 职工学历 职工职位 职工工资n); printf(n%-13s%-11s%-7s%-10s%-13s%-10s%-5sn,p-data.num,p-data.name,p-data.sex,p-data.birthday,p-data.degree,p-data.position,p-data.salary); ha=flag2; else if(flag2ha)printf(n%-13s%-11s%-7s%-10s%-13s%-10s%-5sn,p-data.num,p-data.name,p-data.sex,p-data.birthday
23、,p-data.degree,p-data.position,p-data.salary);ha=flag2; p=p-next; if(flag2) printf(n*按设备号%s统计分类的有%d条记录:*nn,find,flag2); else printf(n按职工号%s统计的结果为0个nn,find);else if(sel=2) printf(n输入你要统计分类的职工姓名:); scanf(%s,find); while(p) if(strcmp(p-data.name,find)=0) flag2+; if(flag2=1&ha!=flag2) printf(职工号 职工姓名 职工
24、性别 职工生日 职工学历 职工职位 职工工资n); printf(n%-13s%-11s%-7s%-10s%-13s%-10s%-5sn,p-data.num,p-data.name,p-data.sex,p-data.birthday,p-data.degree,p-data.position,p-data.salary); ha=flag2; else if(flag2ha)printf(n%-13s%-11s%-7s%-10s%-13s%-10s%-5sn,p-data.num,p-data.name,p-data.sex,p-data.birthday,p-data.degree,p-
25、data.position,p-data.salary);ha=flag2; p=p-next; if(flag2) printf(nnn共查找到%d条记录:nn,flag2); else printf(n按职工姓名%s统计分类的结果为0个nn,find);else if(sel=0) return;void load(Node *woker)Node *p,*q;FILE *fp;/指向文件的指针int recordNum;/ 统计记录数if(fp = fopen(职工管理系统.txt, rb) = NULL)/打开文件printf(can not open filen);/不能打开p=wo
26、ker;recordNum = 0;while(!feof(fp)q=(Node*)malloc(sizeof(Node); fscanf(fp, %s %s %s %s %s %s %s,p-data.num,p-data.name,p-data.sex,p-data.birthday,p-data.degree,p-data.position,p-data.salary);/*从文件读入记录*/p-next=q;q-next=NULL;p=q;recordNum+;fclose(fp);printf(文件里共有%d条记录:n,recordNum);void save(Node *woker
27、)/将职工信息保存到文件int n;Node *p;FILE *fp; /指向文件的指针printf(需要保存到文件吗?( 1保存, 0不保存) );scanf(%d,&n);if(n=1)if(woker-next=NULL)printf(无记录);else p=woker-next;if(fp = fopen(职工管理系统.txt, wb) = NULL) /打开文件, 并判断打开是否正常printf(can not open filen);/ 打开文件出错while(p!=NULL)fprintf(fp,%s %s %s %s %s %s %s,&p-data.num,&p-data.n
28、ame,&p-data.sex,&p-data.birthday,&p-data.degree,&p-data.position,&p-data.salary);p=p-next;fclose(fp);/关闭文件void dismiss(Node *woker)/删除职工信息函数Node *p,*r,*s;char find10;if(!woker-next) printf(n提示:没有资料能够显示!n); return; printf(n提示:请输入您要删除的职工号!n);scanf(%s,find);p=woker-next;while(p!=NULL) if(strcmp(p-data.
29、num,find)=0)/如果找到的话返回的是符合要求 break; p=p-next; if(!p)printf(n提示:找不到您想删除的职工号!n);elser=woker;while(r-next!=p)r=r-next;s=r-next;r-next=r-next-next;void main()Node *woker;FILE *fp;int flag;Node *p,*q;system(color 0F); woker=(Node*)malloc(sizeof(Node); woker-next=NULL; p=woker; while(1) printf(tttt职工信息管理系统n); printf(nn =选单=n); printf(nt1、 添加记录n); printf(nt2、 修改记录n); printf(nt3、 浏览记录n); printf(nt4、 分类查找记录n); printf(nt5、 删除记录n); printf(nt6、 从文件读取记录n); printf(nt0、 退出n); printf(nn输入序号:); scanf(%d,&flag); switch(flag) case 0: printf(n提示:已经退出系统,ByeBye!提示:输入错误!n); break; system(cls);
©2010-2024 宁波自信网络信息技术有限公司 版权所有
客服电话:4008-655-100 投诉/维权电话:4009-655-100