返回
C实习报告

C实习报告

时间:2013-6-26 17:59:58  [下载该文章]  [会员注册]
 王莉娜19220002166;c语言课程设计实习报告;姓名:王莉娜学号:20002166专业:班;年月日;王莉娜19220002166;目录;1.1问题描述;1.2算法设计;1.3程序设计及代码分析;1.4实验数据及运行效果截图王莉娜19220002166c语言课程设计实习报告姓名:王莉娜学号:20002166专业:班学号:院(系):指导教师:年月日1王莉娜19220002166目录1.1问题描述31.2算法设计3设计思路3算法流程图41.3程序设计及代码分析7代码分析71.4实验数据及运行效果截图12测试数据一12运行结果截图13测试数据二17运行结果截图171.5设计中出现的错误及解决方法211.6实验总结211.7参考文献212王莉娜192200021661.1问题描述给出一个格式为user::item::rating::time的数据文件:1)请使数据按user和item有序排列,并将排列好的数据写入datasorted.tt中;2)统计一共有多少个不同的用户和多少个不同的项目;3)统计评分最多和评分最少的用户;4)统计获得评分最多和最少的项目数量;5)求出两组坐标,每一个坐标分别表示有多少个用户对多少个项目进行了评分和有多少个项目被多少个用户进行了评分,再在ecle中画出对应的曲线图。6)求出是个与该用户距离最大的用户并将距离一起按一定格式写入文件distance.tt中。1.2算法设计设计思路:1)由于文件中主要要处理三个数据user/item/rating,而且在第一问中需要对user和item进行排序,所以我选择用muimap类型数据结构,并定义一个这种类型的变量data;但由于是三个数据,所以我先构造一个结构体pair,pair是一个包含两个int类型的结构体,用p表示pair这种变量类型,想定义一个p类型的变量integer,将item和rating存入integer中,再将integer存入muimap的第二个数据中,将user存入muimap的第一个数据项中。然后定义一个muimap数组datalast[10000]来导入data中第二项中的item项到相应的datalast[i]中使item排好序,再导入相应的data中,这样就实现了文件数据按user和item排序存储的目的,最后将data中的数据写入datasorted.tt文本中。2)由于在1)中已经得到了排好序的data,(注:当然所有这些需要共享的运行结果都是在我定义的类test中的构造函数test::test中实现共享),在data中利用简单的算法就可求出共有多少个不同的用户数usernum,并将item带入myset中统计有多少不同的项目数itemnum,这两个结果将在界面上显示出来。3)穿插在前面步骤中使得mymap中存放(itemcounter,user),表示用户user一共评了itemcounter个项目,这样就按itemcounter从小到大的顺序排列的了,只要适当控制输出就可求出评分最多和最少的用户了;4)同理,mymap1中存放(usercounter,item),表示项目item被usercounter个用户进行了评分,而且这也是按照usercounter从小到大排序的,只要适当控制输出就可得到被用户评分最多和最少的项目。结果会输出到界面。5)对mymap和mymap1分别统计用户评分项目个数相同的用户有多少个,和项目获得评分数相同的项目有多少个,分别以(iter3first,usercounter)的形式存入mymap中和以(iter3first,itemcounter)的形式存入mymap1中,mymap中的数据表示有usercounter个用户对iter3first个项目进行了评分,mymap1中的数据表示有itercounter个项目受到iter3first个用户评分,当然,这两个iter3first为两个不同时刻的赋值,最后将这两组数据3王莉娜19220002166分别写入“图2坐标.tt”和“图3坐标.tt”文本中;6)求不同用户的距离最大值,老实说这题的思路我很清晰,而且我想了好几种改进方法,但是用老师给出的24kb的数据测试时等了十分钟都没有出结果,但用较小的数据测试结果都正确,第一次的方案是直接在data中用循环求,测试小组数没错,因为大量数据测试时无法出结果,而且maimap型又不支持随机访问,所以效率很低,所以换成数组,但没有那么多连续空间,总是出错,最后放弃这种方法,所以又将data中的所有数据导入vector中,根据分析效率应该提高了很多,但是数据导入的过程也要耗费时间。总的来说这道题的算法并不困难,但是由于数据量大,中间循环非常复杂,所以效率很低,但我敢确定算法是正确的。算法流程图:图1:主函数调用流程图4王莉娜19220002166图2:构造函数内部执行顺序流程图注:所有的数据都在构造函数中处理完成存储在相应的数据结构中,等到函数调用时将只需完成一些简单的工作即可。5 王莉娜19220002166;c语言课程设计实习报告;姓名:王莉娜学号:20002166专业:班;年月日;王莉娜19220002166;目录;1.1问题描述;1.2算法设计;1.3程序设计及代码分析;1.4实验数据及运行效果截图王莉娜19220002166c语言课程设计实习报告姓名:王莉娜学号:20002166专业:班学号:院(系):指导教师:年月日1王莉娜19220002166目录1.1问题描述31.2算法设计3设计思路3算法流程图41.3程序设计及代码分析7代码分析71.4实验数据及运行效果截图12测试数据一12运行结果截图13测试数据二17运行结果截图171.5设计中出现的错误及解决方法211.6实验总结211.7参考文献212王莉娜192200021661.1问题描述给出一个格式为user::item::rating::time的数据文件:1)请使数据按user和item有序排列,并将排列好的数据写入datasorted.tt中;2)统计一共有多少个不同的用户和多少个不同的项目;3)统计评分最多和评分最少的用户;4)统计获得评分最多和最少的项目数量;5)求出两组坐标,每一个坐标分别表示有多少个用户对多少个项目进行了评分和有多少个项目被多少个用户进行了评分,再在ecle中画出对应的曲线图。6)求出是个与该用户距离最大的用户并将距离一起按一定格式写入文件distance.tt中。1.2算法设计设计思路:1)由于文件中主要要处理三个数据user/item/rating,而且在第一问中需要对user和item进行排序,所以我选择用muimap类型数据结构,并定义一个这种类型的变量data;但由于是三个数据,所以我先构造一个结构体pair,pair是一个包含两个int类型的结构体,用p表示pair这种变量类型,想定义一个p类型的变量integer,将item和rating存入integer中,再将integer存入muimap的第二个数据中,将user存入muimap的第一个数据项中。然后定义一个muimap数组datalast[10000]来导入data中第二项中的item项到相应的datalast[i]中使item排好序,再导入相应的data中,这样就实现了文件数据按user和item排序存储的目的,最后将data中的数据写入datasorted.tt文本中。2)由于在1)中已经得到了排好序的data,(注:当然所有这些需要共享的运行结果都是在我定义的类test中的构造函数test::test中实现共享),在data中利用简单的算法就可求出共有多少个不同的用户数usernum,并将item带入myset中统计有多少不同的项目数itemnum,这两个结果将在界面上显示出来。3)穿插在前面步骤中使得mymap中存放(itemcounter,user),表示用户user一共评了itemcounter个项目,这样就按itemcounter从小到大的顺序排列的了,只要适当控制输出就可求出评分最多和最少的用户了;4)同理,mymap1中存放(usercounter,item),表示项目item被usercounter个用户进行了评分,而且这也是按照usercounter从小到大排序的,只要适当控制输出就可得到被用户评分最多和最少的项目。结果会输出到界面。5)对mymap和mymap1分别统计用户评分项目个数相同的用户有多少个,和项目获得评分数相同的项目有多少个,分别以(iter3first,usercounter)的形式存入mymap中和以(iter3first,itemcounter)的形式存入mymap1中,mymap中的数据表示有usercounter个用户对iter3first个项目进行了评分,mymap1中的数据表示有itercounter个项目受到iter3first个用户评分,当然,这两个iter3first为两个不同时刻的赋值,最后将这两组数据3王莉娜19220002166分别写入“图2坐标.tt”和“图3坐标.tt”文本中;6)求不同用户的距离最大值,老实说这题的思路我很清晰,而且我想了好几种改进方法,但是用老师给出的24kb的数据测试时等了十分钟都没有出结果,但用较小的数据测试结果都正确,第一次的方案是直接在data中用循环求,测试小组数没错,因为大量数据测试时无法出结果,而且maimap型又不支持随机访问,所以效率很低,所以换成数组,但没有那么多连续空间,总是出错,最后放弃这种方法,所以又将data中的所有数据导入vector中,根据分析效率应该提高了很多,但是数据导入的过程也要耗费时间。总的来说这道题的算法并不困难,但是由于数据量大,中间循环非常复杂,所以效率很低,但我敢确定算法是正确的。算法流程图:图1:主函数调用流程图4王莉娜19220002166图2:构造函数内部执行顺序流程图注:所有的数据都在构造函数中处理完成存储在相应的数据结构中,等到函数调用时将只需完成一些简单的工作即可。5 王莉娜19220002166;图3;:rank1函数的功能;图4:accumulate21函数的功能;图5:accumulate22函数的功能;图6:accumulate23函数的功能;王莉娜19220002166;图7:accumulate24函数的功能;图8:distance3函数的功能;注:由王莉娜19220002166图3:rank1函数的功能图4:accumulate21函数的功能图5:accumulate22函数的功能图6:accumulate23函数的功能6王莉娜19220002166图7:accumulate24函数的功能图8:distance3函数的功能注:由于所有的数据都在构造函数test中处理好,所以这些函数本身的结构较简单,在调用这些函数时速度非常快,但在构造函数处理数据时很慢,所以程序运行后需要等待数据处理完成需要一段时间,之后会很快。1.3程序设计及代码分析代码分析(主要分析构造函数):1)itreamindata1file(data1.tt,ios::in)if(!indata1file)cerr文件无法打开!endleit(1)while(indata1fileuserchchitemchchratingchchstr)integer.a=iteminteger.b=ratingdata.insert(mmid::valuetype(user,integer))7王莉娜19220002166for(iter1=data.beginiter1!=data.enditer1++)coutiter1first:(iter1second).a:(iter1second).bmmiddatalast[10000]iter1=data.beginiter2=data.beginintflag=0,i=0for(iter1!=data.end)for(iter2!=data.enditer2++)if(iter1firstiter2first)datalast[i].insert(mmid::valuetype((iter2second).a,(iter2second).b))elsebreakiter3=datalast[i].beginfor(iter1!=iter2iter1++,iter3++)(iter1second).a=iter3first(iter1second).b=iter3secondi++分析:先将数据从data1中读出到经改造后的muimap类型data中,再利用用一个两个参数都为整型的muimap的数组datalast[10000]导出data后两个数据对item进行排序,再将排好序的item送入对应的data中的user中,即得到按user和item排好序的data。2)usernum=0,itemnum=0for(iter1!=data.enditer1=iter2)for(iter2!=data.enditer2++)if(iter1first!=iter2first)usernum++breakmyset.insert((iter2second).a)usernum++mysetiter=myset.begin8王莉娜19220002166item=(mysetiter)for(mysetiter!=myset.endmysetiter++)if(item!=(mysetiter))item=(mysetiter)itemnum++itemnum++分析:如果用户代号不同usernum就加一,最后得到不同的用户数并存在私有数据成员usernum中,同时将item导入myset中,如果项目代号不同itemnum就加一,最后得到不同的项目数并存在私有数据成员nitemnum中。3)iter1=data.beginuser=iter1firstintitemcounter=0intwcount[18000]i=0for(iter1!=data.end)if(useriter1first)itemcounter++iter1++elsemymap.insert(mmid::valuetype(itemcounter,user))wcount[i]=itemcounteri++itemcounter=0user=iter1firstmymap.insert(mmid::valuetype(itemcounter,user))mymap中存有该用户评分的项目总数和用户代号wcount[i]=itemcounterwcount[i+1]=1mysetiter=myset.beginintusercounter=0item=(mysetiter)for(mysetiter!=myset.end)if(item(mysetiter))usercounter++mysetiter++9王莉娜19220002166elsemymap1.insert(mmid::valuetype(usercounter,item))mymap1中存有评分该项目的总客户数和该项目代号usercounter=0item=(mysetiter)mymap1.insert(mmid::valuetype(usercounter,item))分析:对data中每一个用户评分的个数进行统计,由于data相同的user都在相邻的位子,所以如果user相同就使itemcounter加1,并与相应的user一起存如mymap中,然后对myset中每一个项目被评分的次数进行统计,由于myset中相同的item也相邻,所以如果item相同就使usercounter加1,并与相应的item一起存入mymap1中。4)for(iter3!=mymap.enditer3=iter4)for(iter4!=mymap.enditer4++)if(iter3firstiter4first)usercounter++elsemymap.insert(mmid::valuetype(iter3first,usercounter))usercounter=0breakif(iter4mymap.end)breakmymap.insert(mmid::valuetype(iter3first,usercounter))iter3=iter4=mymap1.beginfor(iter3!=mymap1.enditer3=iter4)for(iter4!=mymap1.enditer4++)if(iter3firstiter4first)itemcounter++elsemymap1.insert(mmid::valuetype(iter3first,itemcounter))itemcounter=010 王莉娜19220002166;break;iter4=iter4;if(iter4mymap1.end);mymap1.insert(mmid::val;分析:对mymap统计,如果itemcounte;for(iter1=data.begini;11;王莉娜19220002166;intcha1=ite王莉娜19220002166breakiter4=iter4if(iter4mymap1.end)iter3=iter4breakmymap1.insert(mmid::valuetype(iter3first,itemcounter))分析:对mymap统计,如果itemcounter相同就使usercounter加一,表示有usercounter个用户对itemcounter个项目进行了评分,同理,对mymap1统计,如果usercounter相同就使itemcounter加一,表示有itemcounter个项目受到了usercounter个用户评分。5)vectorintdata1,data2,data3for(iter1=data.beginiter1!=data.enditer1++)data1.pushback(iter1first)data2.pushback((iter1second).a)data3.pushback((iter1second).b)intr1=0,r2=0p1intfloatfloatdistanceintsum=0vectorint::iteratoriter1,iter2,iter3,iter4,iter5=data2.begin,iter6=data2.begin,iter7=data3.begin,iter8=data3.beginiter1=data1.beginfor(iter1=data1.beginiter1!=data1.endr1++)r2=0for(iter2=data1.beginiter2!=data1.end)if(iter1iter2)iter2=iter2+wcount[r2]r2++continueelseiter4=iter2for(iter3=iter1iter3!=iter1+wcount[r1])for(iter4!=iter2+wcount[r2])11王莉娜19220002166intcha1=iter3data1.beginintcha2=iter4data1.beginif((iter5+cha1)(iter6+cha2))sum=sum+((iter7+cha1)(iter8+cha2))((iter7+cha1)(iter8+cha2))iter3++iter4++breakelseif((iter5+cha1)(iter6+cha2))iter3++breakelseiter4++if(iter4iter2+wcount[r2])breakdistance=sqrt(sum)intfloat.a=(iter2)intfloat.b=distancedata.insert(mmid1::valuetype((iter1),intfloat))sum=0iter2=iter2+wcount[r2]r2++iter1=iter1+wcount[r1]分析:依次对不同的用户进行比较,如果他们对相同的项目进行了评分就使他们的评分相减再平方,最后开根号。其中wcount[i]中存有每个不同用户评分项目的个数,在循环中控制vector类型的迭代器的跳转,提高效率。将两用户名和他们之间的距离作为一组数据存入data类型结构中,其中data属于一种经改造后的muimap,它的第二个参数存放一个结构体变量,这个结构体它含有一个int型变量和一个float型变量,因为距离为浮点型。1.4实验数据及运行效果截图测试数据1:10::2::1::83898504643::18::2::8389845961::2::4::83898406810::8::2::8682462621::1::4::8682461911::5::2::86824460310::1::5::86824456523::1::1::868244603运行结果截图:12王莉娜1922000216613王莉娜1922000216614王莉娜1922000216615 王莉娜19220002166;图2(,y)表示有y个用户对个项目评分;图3(,y)表示有y个项目被个用户评分;16;王莉娜19220002166;注:一些文本文件见本程序的工程文件夹;测试数据2:data1.tt测试结果:;17;王莉娜19220002166;18;王莉娜19220002166;19;王莉娜19220002166图2(,y)表示有y个用户对个项目评分图3(,y)表示有y个项目被个用户评分16王莉娜19220002166注:一些文本文件见本程序的工程文件夹测试数据2:data1.tt测试结果:17王莉娜1922000216618王莉娜1922000216619王莉娜19220002166图2(,y)表示有y个用户对个项目评分图3(,y)表示有y个项目被个用户评分20 王莉娜19220002166;注:很遗憾,本程序在进行24kb的data1数据;1.5设计中出现的错误及解决方法;程序的思路并不是很难,所以代码敲起来很快,但调试;1.6实验总结;自从这个学期学习c++并在课余交了几次编程作业后;1.7参考文献;c++大学教程第七版(c++howtoprogr;21;王莉娜19220002166注:很遗憾,本程序在进行24kb的data1数据测试时未能求出各不同用户之间的距离,我感觉算法没有错误,而且经过多次改进效率已经很高了,但还是无法在较短时间内求出大数据的各不同用户之间的距离。界面一直保持以上状态。另外测试时这六道小题的求解次序是任意的,本人为了便于老师检查,全都是按题号的顺序进行演示,一些结果在界面上已显示,另外一些写入文件结果在相应的工程文件中。1.5设计中出现的错误及解决方法程序的思路并不是很难,所以代码敲起来很快,但调试有点麻烦,在求不同用户距离的时候,由于开始直接在muimap类型的data中循环,无法随机访问,用了四个循环,复杂度非常大,用大数据测试一直无法出结果,后来为了提高效率,我把数据输入到三个数组中,结果运行时由于数组定义的太大,没有那么多连续的内存,所以经常运行出错,但由于数据很大,数组的大小又不能减小,很是苦恼,于是想把它改成动态数组,但自己还不是很熟悉c++中动态数组的用法,书上仅有一小段的介绍,不敢贸然使用,所以最后还是删掉这段代码,改用vector,这是又出现了一个问题,那就是小数据测试这一题都没有结果了,我仔细跟踪程序还是无法发现错误,最后静下心来单步跟踪终于发现是因为少了一个约束条件使程序进入了一个死循环,最终改了过来。但是很遗憾,改后的代码还是无法求出24kb数据的用户距离,所以,这也是我这次试验中唯一一个没有完成的问题。其他的并不是很难,写出来之后很快就调出来了。1.6实验总结自从这个学期学习c++并在课余交了几次编程作业后,我对编程的信心增强了许多,所以拿到题目时并没有像其他同学那样害怕,而事实我也很快将代码写出来了,而此时大家还不知道怎么动手写,这让我很有成就感。我是写一部分就调试一部分,是前面的都正确再往后面写,大概花了两天左右将前面的全都写完调好了,只剩最后一道求距离的题了,也是我花时间最多的一道题了,也是我现在还感觉很失败的一道题。这道题我将近花了两天半的时间,换了很多种结构,绞尽脑汁希望想出在先前基础上再提高一点效率,事实算法的效率也确实一次次提高了,但很遗憾在运行data1.tt时还是无法输出不同用户之间的距离,但是我尽力了,从早上6点到晚上12点,整整两天都在改这道题,虽然最后还是只能求小组数据,但是我并不后悔在这上面花这么多时间,因为我认为做任何事情只要尽力去做就好,最后即使没有成功也不必自责,因为只要尽力去做总会有收获的,在这其中我就积累了很多编程经验。最后,非常感谢张锋老师这一学期的授课,老师非常的幽默,让我们课堂上的气氛非常的活跃,最重要的是老师给我们提供了很多编程的机会,让我们提高了自己的动手能力,并且让我们觉得编程是一件非常有趣的事。1.7参考文献c++大学教程第七版(c++howtoprogramseventhedition)p.j.deitel、h.m.deitel著,张引等译电子工业出版社21

>

相关推荐