太原理工大学软件工程程序设计实验报告.docx
- 文档编号:30475387
- 上传时间:2023-08-15
- 格式:DOCX
- 页数:25
- 大小:406.12KB
太原理工大学软件工程程序设计实验报告.docx
《太原理工大学软件工程程序设计实验报告.docx》由会员分享,可在线阅读,更多相关《太原理工大学软件工程程序设计实验报告.docx(25页珍藏版)》请在冰豆网上搜索。
太原理工大学软件工程程序设计实验报告
《程序设计》课程设计
姓名:
学号:
班级:
软件工程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)测试数据:
YaoLin8782YN0
ChenRuiyi8878NY1
LiXin9288NN0
ZhangQin8387YN1
3.【设计功能的实现】
#include
#include
usingnamespacestd;
stringstu_name[100];
intstu_num[100];
intmain()
{
intn;cin>>n;
memset(stu_name,0,sizeofstu_name);
memset(stu_num,0,sizeofstu_num);
for(inti=0;i { intsc1,sc2; charfl1,fl2; intc; cin>>stu_name[i]; cin>>sc1>>sc2>>fl1>>fl2>>c; if(sc1>80&&c) stu_num[i]+=8000; if(sc1>85&&sc2>80) stu_num[i]+=4000; if(sc1>90) stu_num[i]+=2000; if(sc1>85&&fl2=='Y') stu_num[i]+=1000; if(sc2>80&&fl1=='Y') stu_num[i]+=850; } intmax_index=0; intmax_num=0; for(inti=0;i { if(stu_num[i]>stu_num[max_index]) max_index=i; max_num+=stu_num[i]; } cout< return0; } 4.【实验结果】 5.【使用说明】 第一步是输入人数,第二步是输入你所要的数据,最后一步按换行键,得出结论。 6.【心得体会】 我最大的收获是对于结构体的理解和运用,比如创建,引用,赋值等等,还有.和->的区别。 从以前的忘记到现在的熟悉。 走过了一大段路。 实验二: 统计数字 1.【问题描述】 某次科研调查时得到了n个自然数,每个数均不超过1500000000(1.5*109)。 已知不相同的数不超过10000个,现在需要统计这些自然数各自出现的次数,并按照自然数从小到大的顺序输出统计结果。 2【设计需求及分析】 (1)设计要求 原始数据保存在文件count.in中,文件包含n+1行。 第1行是整数n(1<=n<=200000),表示自然数的个数;第2~n+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;i<9;i++) { fscanf(fp,"%d",&a[i]);//读取文件 fscanf(fp,"\n"); } intj,t; for(i=1;i<9;i++) for(j=0;j<9-i;j++) if(a[j]>a[j+1]) {//冒泡排序 t=a[j]; a[j]=a[j+1]; a[j+1]=t; } 、for(i=0;i<9;i++) { count=1; if(a[i]! =a[i+1]) { printf("%d\t%d\n",a[i],count); fprintf(fp,"%d\t%d\n",a[i],a[i]); i++; }对数字的循环查找和控制条件, if(a[i]==a[i+1]) { while(a[i]==a[i+1]) { count++; i++; } } } (3)输出输入格式 输入时,为竖行依此输入文件,且为数字。 且为9个以内的数字。 输出时,分为两行,第一列为数据,第二列为次数。 3.【设计功能的实现】 #include intmain() { inta[100];//创建容纳文件数据的数组 inti; FILE*fp=fopen("count.txt","a+");//用只读/的方式打开文件 if(fp==NULL) { printf("无文件");//若没有文件则返回—1 return-1; } for(i=0;i<9;i++) { fscanf(fp,"%d",&a[i]);//读取文件 fscanf(fp,"\n"); } intj,t; for(i=1;i<9;i++) for(j=0;j<9-i;j++) if(a[j]>a[j+1]) {//冒泡排序 t=a[j]; a[j]=a[j+1]; a[j+1]=t; } printf("结果为: \n数据结果\n"); intcount; for(i=0;i<9;i++) { count=1; if(a[i]! =a[i+1]) { printf("%d\t%d\n",a[i],count); fprintf(fp,"%d\t%d\n",a[i],a[i]); i++; } if(a[i]==a[i+1]) { while(a[i]==a[i+1]) { count++; i++; } printf("%d\t%d\n",a[i],count); fprintf(fp,"%d\t%d\n",a[i],count); } } fclose(fp);//关闭文件 return0; } 4.【实例测试及运行结果】 测试分析内容包括: (1)我认为我的短板在于对语句的不熟悉程度,在编程过程中,经常需要询问他人,或者查询书籍; (2)我认为可以由文档输入与输出,减少了输入与输出的错误,增加了数据的准确性; 5.【使用说明】 有很大的限制,比如数字的个数,输入的格式, 必须为9个以内的数字,必须为竖列输入,必须写到count.txt的文件中。 6.【心得体会】 此次编程有问题没有解决,在客户输入值的个数上,必须少于等于9个。 因为文件中有很多东西,看不到但是总是赋值到数组中。 只能有9个数字了。 对于文件的打开和关闭语句有了更深的理解。 有打开必须有关闭。 在查重复次数的程序上,有着两个循环的嵌套。 由while控制总循环,由if进行选择。 实验三: 文本文件单词的计数 1.【问题描述】 假设有如下的英文文本文档: (此处为太原理工大学学校简介英文版) TAIYUANUNIVERSITYOFTECHNOLOGY TaiyuanUniversityofTechnology(TUT)hasitshistorytracedallthewaybacktotheWesternLearningSchoolofShanxiGrandAcademy(1902),whichwasoneofthethreeearliestnationaluniversitiesinChina.Withthetraditionanddevelopmentofover100years,TUTisnowageneraluniversitywithengineeringasthemajor,sciencesandtechnologyintegratedandcoordinatedevelopmentofmultipledisciplines.Itisauniversitythatisincludedinthe“Project211”---thenationalhighereducationpromotionprogramfor100topuniversitiesinChina. …… Recollectingthecentennialhistory,generationsofTUThavecreateditsmissionandgloryofacenturywithresponsibilityandconfidence;expectingthepromisingtomorrow,over30,000TUTstudentsandfacultyareproducingsplendorandperspectivesbytheirwisdomanddiligence.Inthenewera,TaiyuanUniversityofTechnology,followingtheConceptionofScientificDevelopment,isdeterminedtofurtherthereformationoneducation,toreinforcetheteachingmanagementsoastoupgradeitsteachingandresearchinglevels.TaiyuanUniversityofTechnologywillbeturningitselfintoaresearch-baseduniversity. 设计C或C++程序,统计在这样的英文文本文件中,出现了多少个单词,每个单词出现了几次。 连续的英文字符都认为单词(不包括数字),单词之间用空格或标点符号分隔。 2【设计需求及分析】 (1)设计要求 要统计英文文本文件中出现了哪些单词,就要从文件中读取字符,读取出来的连续英文字符认为是一个单词,遇空格或标点符号单词结束。 使用线性表记录单词以及每个单词出现的次数。 线性表中的单词按字典顺序存储。 线性表的顺序存储结构如下: #defineLIST_INIT_SIZE100//线性表存储空间的初始分配量 #defineLISTINCREMENT10//线性表存储空间的分配增量 typedefstruct{ charword[21]//存储单词,不超过20个字符 intcount;//单词出现的次数 }ElemType; typedefstruct{ ElemType*elem;//存储空间基址 intlength;//当前长度 intlistsize;//当前分配的存储容量 }Seqlist; (2)设计思路 ⑴顺序表的初始化: InitList(SqList&L) ⑵顺序表上查找指定的单词: LocateElem(SqList&L,char*s) 若找到,单词的出现次数增1,返回0,否则返回该单词的插入位置。 ⑶在顺序表上插入新的单词: InsertList(SqList&L,inti,char*s) 要求按字典顺序有序。 新单词的出现次数为1. ⑷输出顺序表上存储的单词统计信息: PrintList(SqList&L) 输出文件中每个单词出现的次数以及文件中总的单词数(可输出到文件中)。 (5)程序实现的思路,定义了一个结构体名字为WAC,其中成员有char类型的str1的数组,int类型的strC,WAC的指针成员变量*next和成员变量WordAndCnt,然后是dealtable和dealstr函数,其中有着上一个函数的嵌套模式,和一个递归调用函数。 以及一些复制和比较函数。 关键程序块如下 #include #include #include intreadData(charfilename[]); voidwriteData(intn); intmain(void) { charname[40]="e: \\abc2.txt"; intword_num; word_num=readData(name); writeData(word_num); return0; } intreadData(charfilename[])//此函数计算英文单词个数 { FILE*fp; charch; charflag=0; intnum=0; if((fp=fopen(filename,"r"))==NULL) { printf("%sopenfailure",filename); exit(EXIT_FAILURE); } printf("%sopensucessfully! ~\n",filename); while(! feof(fp)) { ch=fgetc(fp); if((ch>='A'&&ch<='Z')||(ch>='a'&&ch<='z')||(ch>='0'&&ch<='9')) flag=0; elseif(flag==0&&(ch! ='-'&&ch! ='/'&&ch! ='\'')) { num++; flag=1; } } fclose(fp); returnnum; } voidwriteData(intn)//此文件输出 { FILE*fp; if((fp=fopen("D: \\result.txt","a"))==NULL) { printf("Fileopenfailure! ! ! "); exit(EXIT_FAILURE); } fprintf(fp,"文件中的单词个数为%d\n",n); printf("文件中的单词个数为%d\n",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 #definemax200 #defineMAX_LNT100 typedefstructnode/*构造一个结构体,两个城市可以看成起点和终点,之间的道路可以看成一个边*/ { intstr;/*起点*/ intend;/*终点*/ intdis;/*距离*/ }node; nodep[max],temp;/*p记录城市信息*/ intpre[100],rank[100];/*用于判断是否构成回路*/ intn=0,arcs[MAX_LNT][MAX_LNT];/*n表示城市个数,arcs[][]记录城市间权值*/ intmenu()/*菜单函数*/ { intm; printf("..........................2015年6月28日......................\n\n"); printf("求最小生成树\n"); printf("________________________________\n\n"); printf("1输入城市之间的信息\n"); printf("2判断是否能构成一个最小生成树\n"); printf("3遍历所有城市生成最小生成树\n"); printf("4退出\n"); printf("________________________________\n\n"); printf("请输入所选功能1-4\n"); system("color8E");/*改变界面颜色的,对程序没什么影响*/ scanf("%d",&m); returnm; } /*下面三个函数作用是检验当一条边添加进去,是否会产生回路*/ voidset(intx)/*初始化*/ { pre[x]=x; rank[x]=0; } intfind(intx)/*找到这个点的祖先*/ {if(x! =pre[x]) pre[x]=find(pre[x]); returnpre[x]; } voidUnion(intx,inty)/*将这两个添加到一个集合里去*/ { x=find(x); y=find(y); if(rank[x]>=rank[y]) { pre[y]=x; rank[x]++; } elsepre[y]=x; } voidKruskal() { intans=0,i,j,k=0;/*ans用来记录生成最小树的权总值*/ intindex; intcount=0;/*记录打印边的条数*/ for(i=1;i<=n;i++)/*初始化数组pre[x],rank[x]*/ set(i); for(i=1;i<=n;i++) { for(j=i+1;j<=n;j++) { p[++k].str=i; p[k].end=j; p[k].dis=arcs[i][j];/*先把所有城市之间的路段看成一个边*/ } } for(i=1;i<=k;i++)/*把所有的边按从小到大进行排序*/ { index=i; for(j=i+1;j<=k;j++) if(p[j].dis index=j; temp=p[index]; p[index]=p[i]; p[i]=temp; } for(i=1;i<=k;i++) { if(find(p[i].str)! =find(p[i].end))/*如果这两点连接在一起不构成一个回路,则执行下面操作*/
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 太原 理工大学 软件工程 程序设计 实验 报告
![提示](https://static.bdocx.com/images/bang_tan.gif)