《程序设计课程设计》实验报告.docx
- 文档编号:6093283
- 上传时间:2023-01-03
- 格式:DOCX
- 页数:16
- 大小:21.95KB
《程序设计课程设计》实验报告.docx
《《程序设计课程设计》实验报告.docx》由会员分享,可在线阅读,更多相关《《程序设计课程设计》实验报告.docx(16页珍藏版)》请在冰豆网上搜索。
《程序设计课程设计》实验报告
程序设计》课程设计
姓名:
学号:
班级:
软件工程14班
指导教师:
成绩:
1.消除类游戏
1.1【问题描述】
消除类游戏是深受大众欢迎的一种游戏,游戏在一个包含有n行m列的游戏棋盘上进行,棋盘的每
一行每一列的方格上放着一个有颜色的棋子,当一行或一列上有连续三个或更多的相同颜色的棋子时,这些棋子都被消除。
当有多处可以被消除时,这些地方的棋子将同时被消除。
1.2【基本要求】
现在给你一个n行m列的棋盘(1 请注意: 一个棋子可能在某一行和某一列同时被消除。 输入数据格式: 输入的第一行包含两个整数n,m用空格分隔,分别表示棋盘的行数和列数。 接下来n行,每行 个整数,用空格分隔,分别表示每一个方格中的棋子的颜色。 颜色使用1至9编号。 输出数据格式: 输岀n行,每行m个整数,相邻的整数之间使用一个空格分隔,表示经过一次消除后的棋盘。 如果一个方格中的棋子被消除,则对应的方格输岀0,否则输岀棋子的颜色编号。 1.3【测试数据】 为方便调试程序,可将输入数据先写入一个文本文件,然后从文件读取数据处理,这样可避免每次运行程序时都要从键盘输入数据。 测试数据 输入: 输出: 45 22302 22312 34504 34514 23203 23213 00044 22244 输出说明: 棋盘中第4列的1和第4行的2可以被消除,其他的方格中的棋子均保留 测试数据二 输入: 输出: 45 22302 22312 30000 31111 23203 23213 22000 22333 输出说明: 棋盘中所有的1以及最后一行的3可以被同时消除,其他的方格中的棋子均保留 1.4【功能实现】 #inelude #inelude usingnamespaeestd; intmain() { intm,n,i,j; inttemp; cin>>n>>m; temp=m; m=n; n=temp; int*map=newint[m*n]; int*mark=newint[m*n]; int*tmap=map; int*tmark=mark; intdif=0; //输入 for(i=0;i for(j=0;j cin>>*(tmap+i*n+j); for(i=0;i for(j=0;j { //横行 if((tmap+2-map)%n! =0||(tmap+1-map)%n! =0)if(*(tmap)==*(tmap+1)&&*(tmap+1)==*(tmap+2)){ dif=tmap-map; *(tmark+dif)=0; *(tmark+dif+1)=0; *(tmark+dif+2)=0; } //竖列 if(tmap+2*n-map if(*(tmap)==*(tmap+n)&&*(tmap+n)==*(tmap+2*n)){ dif=tmap-map; *(tmark+dif)=0; *(tmark+dif+n)=0; *(tmark+dif+2*n)=0; } tmap=map+(j+1)+i*n; } //输出 cout< tmap=map; for(i=0;i for(j=0;j *(tmap+i*n+j)=0; for(i=0;i { for(j=0;j cout<<*(tmap+i*n+j)<<""; cout< }system("pause");return0; } 1.5【结果和截图】 1.6【心得体会】 通过这次试验,我对c语言编译器和对棋盘类游戏中的棋子行列删除有了更加深刻的认识和了解。 数字统计 2.1【问题描述】 某次科研调查时得到了n个自然数,每个数均不超过(1.5*109)。 已知不相同的数不超过10000 个,现在需要统计这些自然数各自岀现的次数,并按照自然数从小到大的顺序输岀统计结果。 2.2【基本要求】 现给你n个自然数,统计这些自然数中每个不相同数各自岀现的次数,并按照自然数从小到大的顺序输出统计结果。 输入数据有n+1行。 第1行是整数n(1 输岀有m行(m为n个自然数中不相同数的个数),按照自然数从小到大的顺序输岀。 每行输岀 两个整数,分别是自然数和该数岀现的次数,其间用一个空格隔开。 2.3【测试数据】 为方便调试程序,可将输入数据先写入一个文本文件,然后从文件读取数据处理,这样可避免每次运行程序时都要从键盘输入数据。 输入 输岀 8 23 2 42 4 51 2 1002 4 5 100 2 100 由于数据量可能很大,要注意程序的运行效率 2.4【实现提示】 定义顺序表,元素类型为: Element,顺序表类型为: SeqList,用顺序表的数组data记录自然数和 该数岀现的次数。 定义如下: typedefstructdata{ longintnumber; longintcount; }Element; typedefstructlist{ Elementdata[10000];/*存储自然数和该数岀现的次数*/ intlength;/*存储不同自然数的个数,即顺序表的长度*/ }SeqList; 对输入的每一个数据,在顺序表中查找,若存在,则该数出现次数增1,否则将该数插入顺序表中,出现次数为1,插入后使顺序表中的数据按自然数有序。 2.5【功能实现】 #include voidmain() { typedefstructdata{ longintnumber; longintcount; }Element; typedefstructlist{ Elementdata[10000];/*存储自然数和该数出现的次数*/ intlength;/*存储不同自然数的个数,即顺序表的长度*/ }SeqList; SeqLista; Elementdata1[10000],data2; intn=0,s=1,i,j;/*n代表输入数的个数,s等同于a.length,代表不同数的个数*/for(i=0;i<10000;i++) { data1[i].count=0; } printf("请输入要输入数的个数\n"); scanf("%d",&n);/*输入要输入数的个数*/ for(i=0;i {scanf("%d",&a.data[i].number);/*输入n个数*/ }data1[0].number=a.data[0].number; data1[0].count++; for(i=1;i { for(j=0;j { data1[j].count++; break; } if(j==s) {data1[s].number=a.data[i].number;data1[s].count++; s++; } } for(i=1;i if(data1[j].number>data1[j+1].number) { data2=data1[j]; data1[j]=data1[j+1];data1[j+1]=data2; } printf("结果如下\n"); for(i=0;i {printf("%d,%d\n",data1[i].number,data1[i].count); } } 2.6【结果和截图】 2.7【心得体会】 通过本次实验,我对c语言编译器和n个数的排序和统计有了更加深刻的认识和了解。 3.画图 3.1【问题描述】 用ASCII字符来画图是一件有趣的事情,并形成了一门被称为ASCIIArt的艺术。 例如,下图 是用ASCII字符画岀来的CSPRO字样。 ./.—/.—1|.._.\|.._.\/_.\. |.|...\—.\|.|_).|.|_).|.|.|.| |.|—.—).|..—/|.._.<|.|」.| .\____I—心…1」\_\\___/. 3.2【基本要求】 实现一个用ASCII字符来画图的程序,支持以下两种操作: 画线: 给出两个端点的坐标,画一条连接这两个端点的线段。 简便起见题目保证要画的每条线段都是水平或者竖直的。 水平线段用字符-来画,竖直线段用字符|来画。 如果一条水平线段和一条 竖直线段在某个位置相交,则相交位置用字符+代替。 填充: 给出填充的起始位置坐标和需要填充的字符,从起始位置开始,用该字符填充相邻位置,直到遇到画布边缘或已经画好的线段。 注意这里的相邻位置只需要考虑上下左右4个方向,如下图所 示,字符@只和4个字符*相邻。 * *@* * 输入数据格式如下: 第1行有三个整数m,n和q。 m和n分别表示画布的宽度和高度,以字符为单位。 q表示画图操作 的个数。 (2wm,n<100,0 第2行至第q+1行,每行是以下两种形式之一: 0x1y1x2y2: 表示画线段的操作,(x1,yj和(X2,y? )分别是线段的两端,满足要么x1=X2且 y1工y2,要么y1=y2且x1工X2。 (0wX1,x2 1xyc: 表示填充操作,(x,y)是起始位置,保证不会落在任何已有的线段上;c为填充字 符,是大小写字母。 (0wx 画布的左下角是坐标为(0,0)的位置,向右为x坐标增大的方向,向上为y坐标增大的方向。 这 q个操作按照数据给岀的顺序依次执行。 画布最初时所有位置都是字符.(小数点)。 输出数据格式如下: 输岀有n行,每行m个字符,表示依次执行这q个操作后得到的画图结果。 3.3 【测试数据】 测试数据 输入: 输出: 423 AAAA 100B A--A 01020 100A 测试数据二 输入: 输出: 16139 031121 ...++... 0121123 …|CCCCCCCC|... 012363 |CC++... 06369 ...|CC|……… 069129 ...|CC|……… 01291211 ...|CC|……… 01211311 ...|CC|……… 031131 ...|CC|……… 142C ...|CC++... ...|CCCCCCCC|... ...++... 3.4【功能实现】 #include voiddrawline(chara[][100],intm,intn,intx1,inty1,intx2,inty2){ if(x2==x1&&y2! =y1) { if(y1<=y2) { for(inti=n-1-y2;i<=n-1-y1;i++) { if(a[i][x1]=='-') a[i][x1]='+'; else a[i][x1]=T; } } else { for(inti=n-1-y1;i<=n-1-y2;i++) { if(a[i][x1]=='-') a[i][x1]='+'; else a[i][x1]=T; } } } if(x2! =x1&&y2==y1) { if(x2>=x1) for(inti=x1;i<=x2;i++) { if(a[y2][i]=='|')a[y2][i]='+'; else a[y2][i]='-'; } } else { for(inti=x2;i<=x1;i++) {if(a[y2][i]=='|')a[y2][i]='+'; else a[y2][i]='-'; } } } } voidfillchar(chara[][100],intm,intn,intx,inty,charb) { intright=x,left=x,top=y,low=y; if(a[n-1-y][x]! ='|'&&a[n-1-y][x]! ='-'&&a[n-1-y][x]! ='+'&&a[n-1-y][x]! =b){ a[n-1-y][x]=b;right++;left--;top++;low--; if(right { fillchar(a,m,n,right,y,b); } if(left>=0) { fillchar(a,m,n,left,y,b); } if(top { fillchar(a,m,n,x,top,b); if(low>=0) {fillchar(a,m,n,x,low,b); } } } voidprintcanvas(chara[][100],intn,intm) { for(inti=0;i { for(intj=0;j printf("%c",a[i][j]);printf("\n"); } } voidmain() {charcanvas[100][100],b; inti,k,x1,y1,x2,y2; intn,m,q; printf("请输入n,m,q: \n"); scanf("%d%d%d",&m,&n,&q); for(intii=0;ii for(intj=0;j canvas[ii][j]='.'; for(i=0;i {scanf("%d",&k); if(k==0) {scanf("%d%d%d%d",&x1,&y1,&x2,&y2);drawline(canvas,m,n,x1,y1,x2,y2); } elseif(k==1) { scanf("%d%d%c",&x1,&y1,&b);fillchar(canvas,m,n,x1,y1,b); } } printcanvas(canvas,n,m); } 3.5【结果和截图】 3.6【心得体会】 通过本次实验,我对c语言编译器和图形坐标和关系上的处理有了更加深刻的认识和了解。 4•送货 4.1【问题描述】 为了增加公司收入,F公司新开设了物流业务。 由于F公司在业界的良好口碑,物流业务一开通即 受到了消费者的欢迎,物流业务马上遍及了城市的每条街道。 然而,F公司现在只安排了小明一个人 负责所有街道的服务。 任务虽然繁重,但是小明有足够的信心,他拿到了城市的地图,准备研究最好的方案。 城市中有n个交叉路口,m条街道连接在这些交叉路口之间,每条街道的首尾都正好连接着一个交叉路口。 除开街道的首尾端点,街道不会在其他位置与其他街道相交。 每个交叉路口都至少连接着一条街道,有的交叉路口可能只连接着一条或两条街道。 4.2【基本需求】 小明希望设计一个方案,从编号为1的交叉路口出发,每次必须沿街道去往街道另一端的路口, 再从新的路口出发去往下一个路口,直到所有的街道都经过了正好一次。 输入数据格式 输入的第一行包含两个整数n,m(1 交叉路口从1到n标号。 接下来m行,每行两个整数a,b,表示和标号为a的交叉路口和标号为b的交叉路口之间有一条街道,街道是双向的,小明可以从任意一端走向另一端。 两个路口之间最多有一条街道。 输岀输岀格式 如果小明可以经过每条街道正好一次,则输岀一行包含m+1个整数P1,P2,P3,...,Pm+1,表示小 明经过的路口的顺序,相邻两个整数之间用一个空格分隔。 如果有多种方案满足条件,则输岀字典序最小的一种方案,即首先保证P1最小,P1最小的前提下再保证P2最小,依此类推。 如果不存在方案使得小明经过每条街道正好一次,则输出一个整数-1。 4.3【测试数据】 测试数据 输入: 输出: 45 124134 12 13 14 24 34 输岀说明: 城市的地图和小明的路径如下图所示 测试数据二 输入: 输出: 46 -1 12 13 14 24 34 23 输岀说明: 城市的地图如下图所示,不存在满足条件的路径。 4.4【功能实现】 #include typedefstructroute{ longintx; longinty; }Element;/*路线x代表开始,y代表结尾*/ voidmain() { printf("请输入节点数和路线数: \n"); inti,j=0,k,m,n; scanf("%d%d",&m,&n); routea[50],b[50]; for(i=0;i scanf("%d%d",&a[i].x,&a[i].y);/*放入n组数据*/ for(j=i,k=0;j<2*n;j++,k++) { a[j].x=a[k].y; a[j].y=a[k].x; } b[0]=a[0]; for(i=0,j=0;i<2*n;i++) { if(b[j].y==a[i].x&&a[i].y! =b[j].x) { j++; b[j]=a[i]; i=0; } if(j==n) break; for(intf=0;f { if(b[f].x==b[j].x&&b[f].y==b[j].y)break; } if(f! =j) break; else continue; } if(j==n) { for(i=0;i {printf("%d\n",b[i].x); }printf("%d\n",b[j].x); } else printf("不对"); } 4.5【结果和截图】 4.6【心得体会】 通过本次实验,我对c语言编译器和实际生活中的一些简单问题程序化有了更加深刻的认识和了解。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 程序设计课程设计 程序设计 课程设计 实验 报告