《程序设计课程设计》实验报告材料

上传人:仙*** 文档编号:84189626 上传时间:2022-05-03 格式:DOC 页数:15 大小:503.50KB
收藏 版权申诉 举报 下载
《程序设计课程设计》实验报告材料_第1页
第1页 / 共15页
《程序设计课程设计》实验报告材料_第2页
第2页 / 共15页
《程序设计课程设计》实验报告材料_第3页
第3页 / 共15页
资源描述:

《《程序设计课程设计》实验报告材料》由会员分享,可在线阅读,更多相关《《程序设计课程设计》实验报告材料(15页珍藏版)》请在装配图网上搜索。

1、word 《程序设计》课程设计 姓 名: 学 号: 班 级:软件工程14班 指导教师: 成 绩: 14 / 15 1. 消除类游戏 1.1【问题描述】 消除类游戏是深受大众欢迎的一种游戏,游戏在一个包含有n行m列的游戏棋盘上进展,棋盘的每一行每一列的方格上放着一个有颜色的棋子,当一行或一列上有连续三个或更多的一

2、样颜色的棋子时,这些棋子都被消除。当有多处可以被消除时,这些地方的棋子将同时被消除。 1.2【根本要求】 现在给你一个n行m列的棋盘(1≤n,m≤30),棋盘中的每一个方格上有一个棋子,请给出经过一次消除后的棋盘。 请注意:一个棋子可能在某一行和某一列同时被消除。 输入数据格式: 输入的第一行包含两个整数n, m,用空格分隔,分别表示棋盘的行数和列数。接下来n行,每行m个整数,用空格分隔,分别表示每一个方格中的棋子的颜色。颜色使用1至9编号。 输出数据格式: 输出n行,每行m个整数,相邻的整数之间使用一个空格分隔,表示经过一次消除后的棋盘。如果一个方格中的棋子被消除,如此对应的方

3、格输出0,否如此输出棋子的颜色编号。 1.3【测试数据】 为方便调试程序,可将输入数据先写入一个文本文件,然后从文件读取数据处理,这样可防止每次运行程序时都要从键盘输入数据。 测试数据一 输入: 输出: 4 5 2 2 3 1 2 3 4 5 1 4 2 3 2 1 3 2 2 2 4 4 2 2 3 0 2 3 4 5 0 4 2 3 2 0 3 0 0 0 4 4 输出说明: 棋盘中第4列的1和第4行的2可以被消除,其他的方格中的棋子均保存。 测试数据二 输入: 输出: 4 5 2 2 3 1 2 3 1 1 1 1 2 3 2 1 3 2

4、2 3 3 3 2 2 3 0 2 3 0 0 0 0 2 3 2 0 3 2 2 0 0 0 输出说明: 棋盘中所有的1以与最后一行的3可以被同时消除,其他的方格中的棋子均保存。 1.4【功能实现】 #include #include using namespace std; int main() { int m, n, i ,j; int temp; cin >> n >> m; temp = m; m = n; n = temp; int * map

5、 = new int[m * n]; int * mark = new int[m * n]; int * tmap = map; int * tmark = mark; int dif = 0; //输入 for ( i = 0 ; i < m ; i++ ) for (j = 0; j < n; j++) cin >> *(tmap + i * n + j); for (i = 0; i < m; i++) for (j = 0; j < n; j++)

6、 { //横行 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) =

7、 0; *(tmark + dif + 2) = 0; } //竖列 if (tmap + 2 * n - map < m * n || tmap + n - map < m * n) if (*(tmap) == *(tmap + n) && * (tmap + n) == *(tmap + 2 * n)) { dif = tmap - map;

8、 *(tmark + dif) = 0; *(tmark + dif + n) = 0; *(tmark + dif + 2 * n) = 0; } tmap = map + (j+1) + i * n; } //输出 cout << endl; tmap = map; for (i = 0; i < m; i++) for (j = 0; j < n; j++)

9、 if (* (tmark + i * n + j) == 0) *(tmap + i * n + j) = 0; for (i = 0; i < m; i++) { for (j = 0; j < n; j++) cout<< *(tmap + i * n + j)<<" "; cout << endl; } system("pause"); return 0; } 1.5【结果和截图】 1.6【心得体会】 通过这次试验,

10、我对c语言编译器和对棋盘类游戏中的棋子行列删除有了更加深刻的认识和了解。 2数字统计 2.1【问题描述】 某次科研调查时得到了n个自然数,每个数均不超过1500000000〔*109〕。不一样的数不超过10000个,现在需要统计这些自然数各自出现的次数,并按照自然数从小到大的顺序输出统计结果。 2.2【根本要求】 现给你n个自然数,统计这些自然数中每个不一样数各自出现的次数,并按照自然数从小到大的顺序输出统计结果。 输入数据有n+1行。第1行是整数n(1≤n≤200000),表示自然数的个数;第2~n+1行每行一个自然数。 输出有m行〔m为n个自

11、然数中不一样数的个数〕,按照自然数从小到大的顺序输出。每行输出两个整数,分别是自然数和该数出现的次数,其间用一个空格隔开。 2.3【测试数据】 为方便调试程序,可将输入数据先写入一个文本文件,然后从文件读取数据处理,这样可防止每次运行程序时都要从键盘输入数据。 输入 输出 8 2 4 2 4 5 100 2 100 2 3 4 2 5 1 100 2 由于数据量可能很大,要注意程序的运行效率。 2.4【实现提示】 定义顺序表,元素类型为:Element,顺序表类型为:SeqList,用顺序表的数组data记录自然数和该数出现的次数。定义如下: t

12、ypedef struct data{ long int number; long int count; } Element; typedef struct list{ Element data[10000]; /*存储自然数和该数出现的次数*/ int length; /*存储不同自然数的个数,即顺序表的长度*/ } SeqList; 对输入的每一个数据,在顺序表中查找,假如存在,如此该数出现次数增1,否如此将该数插入顺序表中,出现次数为1,插入后使顺序表中的数据按自然数有序。 2.5【功能实现】 #include

13、dio.h> void main() { typedef struct data{ long int number; long int count; } Element; typedef struct list{ Element data[10000]; /*存储自然数和该数出现的次数*/ int length; /*存储不同自然数的个数,即顺序表的长度*/ } SeqList; SeqList a; Element data1[10000],data2; int n=0,s=1,i

14、,j;/*n代表输入数的个数,s等同于a.length,代表不同数的个数*/ for(i=0;i<10000;i++) { data1[i].count=0; } printf("请输入要输入数的个数\n"); scanf("%d",&n); /*输入要输入数的个数*/ for(i=0;i

15、for(j=0;jdata1[j+1].number) { data2=data1[j]; data

16、1[j]=data1[j+1]; data1[j+1]=data2; } printf("结果如下\n"); for(i=0;i

17、画出来的 CSPRO 字样。 ..____.____..____..____...___.. ./.___/.___||.._.\|.._.\./._.\. |.|...\___.\|.|_).|.|_).|.|.|.| |.|___.___).|..__/|.._.<|.|_|.| .\____|____/|_|...|_|.\_\\___/. 3.2【根本要求】 实现一个用 ASCII 字符来画图的程序,支持以下两种操作: 画线:给出两个端点的坐标,画一条连接这两个端点的线段。简便起见题目保证要画的每条线段都是水平或者竖直的。水平线段用字符 - 来画,竖直线段用字符 | 来

18、画。如果一条水平线段和一条竖直线段在某个位置相交,如此相交位置用字符 + 代替。 填充:给出填充的起始位置坐标和需要填充的字符,从起始位置开始,用该字符填充相邻位置,直到遇到画布边缘或已经画好的线段。注意这里的相邻位置只需要考虑上下左右 4 个方向,如如下图所示,字符 只和 4 个字符 * 相邻。 .*. ** .*. 输入数据格式如下: 第1行有三个整数m, n和q。m和n分别表示画布的宽度和高度,以字符为单位。q表示画图操作的个数。(2 ≤ m, n ≤ 100,0 ≤ q ≤ 100) 第2行至第q + 1行,每行是以下两种形式之一: 0 x1 y1 x2 y2

19、:表示画线段的操作,(x1, y1)和(x2, y2)分别是线段的两端,满足要么 x1= x2 且 y1≠y2,要么 y1=y2 且 x1≠x2。(0≤x1 ,x2

20、到的画图结果。3.3【测试数据】 测试数据一 输入: 输出: 4 2 3 1 0 0 B 0 1 0 2 0 1 0 0 A AAAA A--A 测试数据二 输入: 输出: 16 13 9 0 3 1 12 1 0 12 1 12 3 0 12 3 6 3 0 6 3 6 9 0 6 9 12 9 0 12 9 12 11 0 12 11 3 11 0 3 11 3 1 1 4 2 C ................ ...+--------+... ...|CCCCCCCC|... ...|CC+-----+... ...|CC|.

21、........ ...|CC|......... ...|CC|......... ...|CC|......... ...|CC|......... ...|CC+-----+... ...|CCCCCCCC|... ...+--------+... ................ 3.4【功能实现】 #include void drawline(char a[][100],int m,int n, int x1,int y1,int x2,int y2) { if(x2==x1&&y2!=y1) { if(y1<=y2) { for(

22、int i=n-1-y2;i<=n-1-y1;i++) { if(a[i][x1]=='-') a[i][x1]='+'; else a[i][x1]='|'; } } else { for(int i=n-1-y1;i<=n-1-y2;i++) { if(a[i][x1]=='-') a[i][x1]='+'; else a[i][x1]='|'; } } } if(x2!=x1&&y2==y1) { if(x2>=x1) { for(int i=x1;i<=x2;

23、i++) { if(a[y2][i]=='|') a[y2][i]='+'; else a[y2][i]='-'; } } else { for(int i=x2;i<=x1;i++) { if(a[y2][i]=='|') a[y2][i]='+'; else a[y2][i]='-'; } } } } void fillchar(char a[][100],int m,int n, int x,int y,char b) { int right=x,left=x,top

24、=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=0) { fillchar(a,m,n,left,y,b); } if(top

25、 fillchar(a,m,n,x,top,b); } if(low>=0) { fillchar(a,m,n,x,low,b); } } } void printcanvas(char a[][100],int n,int m) { for(int i=0;i

26、 int i,k,x1,y1,x2,y2; int n,m,q; printf("请输入n,m,q:\n"); scanf("%d %d %d",&m,&n,&q); for(int ii=0;ii

27、,x1,y1,x2,y2); } else if(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.送 货 【问题描述】 为了增加公司收入,F公司新开设了物流业务。由于F公司在业界的良好口碑,物流业务一

28、开通即受到了消费者的欢迎,物流业务马上遍与了城市的每条街道。然而,F公司现在只安排了小明一个人负责所有街道的服务。 任务虽然繁重,但是小明有足够的信心,他拿到了城市的地图,准备研究最好的方案。城市中有n个交叉路口,m条街道连接在这些交叉路口之间,每条街道的首尾都正好连接着一个交叉路口。除开街道的首尾端点,街道不会在其他位置与其他街道相交。每个交叉路口都至少连接着一条街道,有的交叉路口可能只连接着一条或两条街道。 【根本需求】 小明希望设计一个方案,从编号为1的交叉路口出发,每次必须沿街道去往街道另一端的路口,再从新的路口出发去往下一个路口,直到所有的街道都经过了正好一次。 输入数据格式

29、 输入的第一行包含两个整数n, m(1≤n≤10, n-1≤m≤20),表示交叉路口的数量和街道的数量,交叉路口从1到n标号。 接下来m行,每行两个整数a, b,表示和标号为a的交叉路口和标号为b的交叉路口之间有一条街道,街道是双向的,小明可以从任意一端走向另一端。两个路口之间最多有一条街道。 输出输出格式 如果小明可以经过每条街道正好一次,如此输出一行包含m+1个整数p1, p2, p3, ..., pm+1,表示小明经过的路口的顺序,相邻两个整数之间用一个空格分隔。如果有多种方案满足条件,如此输出字典序最小的一种方案,即首先保证p1最小,p1最小的前提下再保证p2最小,依此类推。

30、 如果不存在方案使得小明经过每条街道正好一次,如此输出一个整数-1。 【测试数据】 测试数据一 输入: 输出: 4 5 1 2 1 3 1 4 2 4 3 4 1 2 4 1 3 4 输出说明:城市的地图和小明的路径如如下图所示。 测试数据二 输入: 输出: 4 6 1 2 1 3 1 4 2 4 3 4 2 3 -1 输出说明:城市的地图如如下图所示,不存在满足条件的路径。 4.4【功能实现】 #include typedef struct route{ long int x;

31、 long int y; } Element;/*路线x代表开始,y代表结尾*/ void main() { printf("请输入节点数和路线数:\n"); int i,j=0,k,m,n; scanf("%d%d",&m,&n); route a[50],b[50]; for(i=0;i

32、[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(int f=0;f

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

相关资源

更多
正为您匹配相似的精品文档
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!