太原理工大学软件工程程序设计实验报告.docx_第1页
太原理工大学软件工程程序设计实验报告.docx_第2页
太原理工大学软件工程程序设计实验报告.docx_第3页
太原理工大学软件工程程序设计实验报告.docx_第4页
太原理工大学软件工程程序设计实验报告.docx_第5页
已阅读5页,还剩13页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

程序设计课程设计姓 名:学 号:班 级:软件工程1334班指导教师: 杨永强成 绩:2015年6月实验一:谁拿了最多奖学金1 【问题描述】(1)问题描述某校的惯例是在每学期的期末考试之后发放奖学金。发放的奖学金共有五种,获取的条件各自不同:1) 院士奖学金,每人8000元,期末平均成绩高于80分(80),并且在本学期内发表1篇或1篇以上论文的学生均可获得;2) 五四奖学金,每人4000元,期末平均成绩高于85分(85),并且班级评议成绩高于80分(80)的学生均可获得;3) 成绩优秀奖,每人2000元,期末平均成绩高于90分(90)的学生均可获得;4) 西部奖学金,每人1000元,期末平均成绩高于85分(85)的西部省份学生均可获得;5) 班级贡献奖,每人850元,班级评议成绩高于80分(80)的学生干部均可获得;只要符合条件就可以得奖,每项奖学金的获奖人数没有限制,每名学生也可以同时获得多项奖学金。例如姚林的期末平均成绩是87分,班级评议成绩82分,同时他还是一位学生干部,那么他可以同时获得五四奖学金和班级贡献奖,奖金总数是4850元。2 【设计需求及分析】(1)设计思路先定义了一个Student的结构体,它里面定义了关于学生的各个属性。比如期末平均成绩,班级评议成绩,班干部等等。然后设计了一个判断函数,判断他得到奖学金的多少。接下来就是主函数了,在主函数里,有着输出输入变量,和赋值函数,最重要的是比较函数,比较出哪一位学生的奖学金多及所有金额的总计。最后输出。下面是关键步骤:(2) 输出输入格式输入数据格式格式:输入的第一行是一个整数N(1 = N = 100),表示学生的总数。接下来的N行每行是一位学生的数据,从左向右依次是姓名,期末平均成绩,班级评议成绩,是否是学生干部,是否是西部省份学生,以及发表的论文数。姓名是由大小写英文字母组成的长度不超过20的字符串(不含空格);期末平均成绩和班级评议成绩都是0到100之间的整数(包括0和100);是否是学生干部和是否是西部省份学生分别用一个字符表示,Y表示是,N表示不是;发表的论文数是0到10的整数(包括0和10)。每两个相邻数据项之间用一个空格分隔。输出数据格式:输出包括三行,第一行是获得最多奖金的学生的姓名,第二行是这名学生获得的奖金总数。如果有两位或两位以上的学生获得的奖金最多,输出他们之中在输入文件中出现最早的学生的姓名。第三行是这N个学生获得的奖学金的总数。(3)名字为char类型,各类成绩及论文数量为int类型,判断类型为char类型。人数最多为100人。(4)测试数据:YaoLin 87 82 Y N 0ChenRuiyi 88 78 N Y 1LiXin 92 88 N N 0ZhangQin 83 87 Y N 1 3. 【设计功能的实现】#include#includeusingnamespace std;string stu_name100;int stu_num100;int main()int n;cinn; memset(stu_name,0,sizeof stu_name); memset(stu_num,0,sizeof stu_num);for (int i=0;istu_namei; cinsc1sc2fl1fl2c;if (sc180&c) stu_numi += 8000;if (sc185&sc280) stu_numi += 4000;if (sc190) stu_numi += 2000;if (sc185&fl2=Y) stu_numi += 1000;if (sc280&fl1=Y) stu_numi += 850; int max_index = 0;int max_num = 0;for (int i=0;istu_nummax_index) max_index = i; max_num += stu_numi; coutstu_namemax_indexendlstu_nummax_indexendlmax_num的区别。从以前的忘记到现在的熟悉。走过了一大段路。实验二:统计数字1.【问题描述】某次科研调查时得到了n个自然数,每个数均不超过1500000000(1.5*109)。已知不相同的数不超过10000个,现在需要统计这些自然数各自出现的次数,并按照自然数从小到大的顺序输出统计结果。2【设计需求及分析】(1) 设计要求原始数据保存在文件count.in中,文件包含n+1行。第1行是整数n(1=n=200000),表示自然数的个数;第2n+1行每行一个自然数。结果保存在文件count的尾部,其中结果包含m行(m为n个自然数中不相同数的个数),按照自然数从小到大的顺序输出。每行输出两个整数,分别是自然数和该数出现的次数,其间用一个空格隔开。(2) 设计思路首先必须有文件的打开和关闭语句,将文件的内容读取到数组a中,然后对数组进行排列和对比,计数。最终输出数据和次数。并写入文件的尾部。A为容纳数据的数组,fopen为文件打开函数,fscanf为文件读取函数,然后进行冒泡排序。排序之后的内容由while设置条件,用if进行判断。在不等于时,中间嵌套了一个while循环,进行往后的排查。最后输出数据和次数。下面是关键步骤:FILE* fp=fopen(count.txt,a+); /用只读/的方式打开文件 if(fp=NULL)printf(无文件); /若没有文件则返回1 return -1; for(i=0;i9;i+) fscanf(fp,%d,&ai); /读取文件 fscanf(fp,n);int j,t;for (i=1;i9;i+) for(j=0;jaj+1) /冒泡排序 t=aj;aj=aj+1;aj+1=t;、for(i=0;i9;i+) count=1; if(ai!=ai+1) printf(%dt%dn,ai,count); fprintf(fp,%dt%dn,ai,ai); i+; 对数字的循环查找和控制条件, if(ai = ai + 1) while(ai = ai + 1) count+; i+; (3) 输出输入格式输入时,为竖行依此输入文件,且为数字。且为9个以内的数字。输出时,分为两行,第一列为数据,第二列为次数。 3. 【设计功能的实现】#include int main()int a100; /创建容纳文件数据的数组 int i; FILE* fp=fopen(count.txt,a+); /用只读/的方式打开文件 if(fp=NULL)printf(无文件); /若没有文件则返回1 return -1; for(i=0;i9;i+) fscanf(fp,%d,&ai); /读取文件 fscanf(fp,n);int j,t;for (i=1;i9;i+) for(j=0;jaj+1) /冒泡排序 t=aj;aj=aj+1;aj+1=t; printf(结果为:n数据 结果n); int count;for(i=0;i9;i+) count=1; if(ai!=ai+1) printf(%dt%dn,ai,count); fprintf(fp,%dt%dn,ai,ai); i+; if(ai = ai + 1) while(ai = ai + 1) count+; i+; printf(%dt%dn, ai, count); fprintf(fp,%dt%dn, ai, count); fclose(fp); /关闭文件 return 0;4 【实例测试及运行结果】测试分析内容包括:(1) 我认为我的短板在于对语句的不熟悉程度,在编程过程中,经常需要询问他人,或者查询书籍;(2) 我认为可以由文档输入与输出,减少了输入与输出的错误,增加了数据的准确性;5 【使用说明】 有很大的限制,比如数字的个数,输入的格式,必须为9个以内的数字,必须为竖列输入,必须写到count.txt的文件中。6 【心得体会】 此次编程有问题没有解决,在客户输入值的个数上,必须少于等于9个。因为文件中有很多东西,看不到但是总是赋值到数组中。只能有9个数字了。对于文件的打开和关闭语句有了更深的理解。有打开必须有关闭。在查重复次数的程序上,有着两个循环的嵌套。由while控制总循环,由if进行选择。实验三:文本文件单词的计数1.【问题描述】假设有如下的英文文本文档:(此处为太原理工大学学校简介英文版)TAIYUAN UNIVERSITY OF TECHNOLOGYTaiyuan University of Technology (TUT) has its history traced all the way back to the Western Learning School of Shanxi Grand Academy (1902), which was one of the three earliest national universities in China. With the tradition and development of over 100 years, TUT is now a general university with engineering as the major, sciences and technology integrated and coordinate development of multiple disciplines. It is a university that is included in the “Project 211” - the national higher education promotion program for 100 top universities in China.Recollecting the centennial history, generations of TUT have created its mission and glory of a century with responsibility and confidence; expecting the promising tomorrow, over 30,000 TUT students and faculty are producing splendor and perspectives by their wisdom and diligence. In the new era, Taiyuan University of Technology, following the Conception of Scientific Development, is determined to further the reformation on education, to reinforce the teaching management so as to upgrade its teaching and researching levels. Taiyuan University of Technology will be turning itself into a research-based university.设计C或C+程序,统计在这样的英文文本文件中,出现了多少个单词,每个单词出现了几次。连续的英文字符都认为单词(不包括数字),单词之间用空格或标点符号分隔。 2【设计需求及分析】(1)设计要求要统计英文文本文件中出现了哪些单词,就要从文件中读取字符,读取出来的连续英文字符认为是一个单词,遇空格或标点符号单词结束。使用线性表记录单词以及每个单词出现的次数。线性表中的单词按字典顺序存储。线性表的顺序存储结构如下:#define LIST_INIT_SIZE 100 /线性表存储空间的初始分配量#define LISTINCREMENT 10 /线性表存储空间的分配增量typedef struct char word21 /存储单词,不超过20个字符 int count; /单词出现的次数 ElemType;typedef struct ElemType *elem; /存储空间基址 int length; /当前长度int listsize; /当前分配的存储容量 Seqlist;(2)设计思路顺序表的初始化:InitList(SqList &L)顺序表上查找指定的单词:LocateElem(SqList &L,char *s) 若找到,单词的出现次数增1,返回0,否则返回该单词的插入位置。在顺序表上插入新的单词:InsertList(SqList &L,int i,char *s) 要求按字典顺序有序。新单词的出现次数为1.输出顺序表上存储的单词统计信息:PrintList(SqList &L) 输出文件中每个单词出现的次数以及文件中总的单词数(可输出到文件中)。(5)程序实现的思路,定义了一个结构体名字为WAC,其中成员有char类型的str1的数组,int类型的strC,WAC的指针成员变量 *next和成员变量WordAndCnt,然后是dealtable 和 dealstr 函数,其中有着上一个函数的嵌套模式,和一个递归调用函数。以及一些复制和比较函数。关键程序块如下#include#include#includeint readData(char filename);void writeData(int n );int main(void) char name40 = e:abc2.txt; int word_num; word_num = readData(name); writeData(word_num); return 0;int readData(char filename) /此函数计算英文单词个数 FILE* fp; char ch; char flag = 0; int num=0; if(fp = fopen(filename,r) = NULL) printf(%s open failure,filename); exit(EXIT_FAILURE); printf(%s open sucessfully!n,filename); while(!feof(fp) ch = fgetc(fp); if(ch = A & ch = a & ch = 0 & ch = 9) flag = 0; else if(flag = 0 & (ch != - & ch != /& ch != ) num+; flag = 1; fclose(fp); return num;void writeData(int n) /此文件输出 FILE* fp; if(fp = fopen(D:result.txt,a) = NULL) printf(File open failure!); exit(EXIT_FAILURE); fprintf(fp,文件中的单词个数为%dn,n); printf(文件中的单词个数为%dn,n); printf(结果保存在D:result.txt当中n); fclose(fp);【实例测试及运行结果】7 【使用说明】 文本保存在哪里就把地址填成哪里8 【心得体会】 此次编程有问题没有解决,不擅长于设置关于文件的语句的设置,只要表现为,对于语句中将文件的单词赋值给字符串。没有把统计单词次数的功能做出来。实验四:构造可以使n个城市连接的最小生成树1.【问题描述】给定一个地区的n个城市间的距离网,用Prim算法或Kruskal算法建立最小生成树,并计算得到的最小生成树的代价。2.【基本要求】1、城市间的距离网采用邻接矩阵表示,邻接矩阵的存储结构定义采用课本中给出的定义,若两个城市之间不存在道路,则将相应边的权值设为自己定义的无穷大值。2、要求在屏幕上显示得到的最小生成树中包括了哪些城市间的道路,并显示得到的最小生成树的代价。3、表示城市间距离网的邻接矩阵(要求至少6个城市,10条边)。3.【测试数据】学生自主确定或参考下图。图4-1 一个带权图(网络)#include #include #include #define max 200#define MAX_LNT 100 typedef struct node /*构造一个结构体,两个城市可以看成起点和终点,之间的道路可以看成一个边*/ int str; /*起点*/ int end; /*终点*/ int dis;/*距离*/ node; node pmax,temp; /*p记录城市信息*/ int pre100,rank100;/*用于判断是否构成回路*/int n=0,arcsMAX_LNTMAX_LNT;/*n表示城市个数,arcs记录城市间权值*/ int menu( ) /*菜单函数*/ int m; printf(.2015年6月28日.nn); printf( 求最小生成树n); printf( _nn); printf( 1 输入城市之间的信息n); printf( 2 判断是否能构成一个最小生成树n); printf( 3 遍历所有城市生成最小生成树n); printf( 4 退出n); printf( _nn); printf( 请输入所选功能1-4n); system(color 8E);/*改变界面颜色的,对程序没什么影响*/scanf(%d,&m); return m; /*下面三个函数作用是检验当一条边添加进去,是否会产生回路*/ void set(int x)/*初始化*/ prex = x; rankx = 0; int find(int x)/*找到这个点的祖先*/ if(x != prex) prex = find(prex); return prex; void Union(int x,int y)/*将这两个添加到一个集合里去*/ x = find(x); y = find(y); if(rankx = ranky) prey = x; rankx +;else prey = x; void Kruskal( ) int ans = 0,i,j,k = 0; /*ans用来记录生成最小树的权总值*/ int index; int count = 0; /*记录打印边的条数*/ for(i = 1;i = n;i +) /*初始化数组prex,rankx*/ set(i); for(i = 1;i = n;i +) for(j = i + 1;j = n;j +) p+k.str = i; pk.end = j; pk.dis = arcsij; /*先把所有城市之间的路段看成一个边*/ for(i=1;i=k;i+) /*把所有的边按从小到大进行排序*/ index=i; for(j=i+1;j=k;j+) if(pj.dis pindex.dis) index=j; temp=pindex; pindex=pi; pi=temp; for(i = 1;i = k;i +) if(find(pi.str) != find(pi.end)/*如果这两点连接在一起不构成一个回路,则执行下面操作*/ printf(t第%d条路段为:%d-%d,权值为%dn,+ count,pi.str,pi.end,pi.dis);/*将这条边的起点、终点打印出来*/ ans += pi.dis; /*说明这条路段要用*/ Union(pi.str,pi.end); printf(t遍历所有城市得到最小生成树的代价为: %dnn,ans); void create( ) /*输入城市信息*/ int i,j; printf(请输入城市的个数:n); scanf(%d,&n); printf(输入%d个城市的邻接矩阵:n,n); for(i = 1;i = n;i +) for(j = 1;j = n;j +) scanf(%d,&arcsij); void display( ) /*显示生成的最小生成树*/ if(n = 0) printf(这里没有城市之间的信息n); return; printf(遍历所有城市得到最小生成树为:nnn); Kruskal( ); void judge( )/*判断是否能够生成最小生成树*/ int close100,low100,i,j,ans = 0;/*closej表示离j最近的顶点,lowj表示离j最短的距离*/ int use100; use1 = 1; for(i = 2;i = n;i +) lowi = arcs1i; /*初始化*/ closei = 1; usei = 0; for(i = 1;i n;i +) int min = 100000000,k = 0; for(j = 2;j lowj)/*找到最小的low值,并记录*/ min = lowj; k = j; for(j = 2;j arcskj) lowj = arcskj; /*修改low值和close值*/ closej = k; ans += arcsclosekk; if(ans = 100000000) printf(不能构成最小生成树n); else printf(能构成最小生成树n); int main( ) /*主函数*/ while(1) switch( menu( ) ) case 1:create( );break;/*输入城市信息*/ case 2:judge( );break;/*判断是否能够生

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论