《程序设计课程设计》实验报告Word文档下载推荐.docx
《《程序设计课程设计》实验报告Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《《程序设计课程设计》实验报告Word文档下载推荐.docx(16页珍藏版)》请在冰豆网上搜索。
22333
棋盘中所有的1以及最后一行的3可以被同时消除,其他的方格中的棋子均保留
1.4【功能实现】
#inelude<
iostream>
windows.h>
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<
m;
i++)
for(j=0;
j<
n;
j++)
*(tmap+i*n+j);
for(i=0;
i++)
//横行
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<
m*n||tmap+n-map<
m*n)
if(*(tmap)==*(tmap+n)&
*(tmap+n)==*(tmap+2*n)){
*(tmark+dif+n)=0;
*(tmark+dif+2*n)=0;
tmap=map+(j+1)+i*n;
//输出
cout<
<
endl;
tmap=map;
j++)if(*(tmark+i*n+j)==0)
*(tmap+i*n+j)=0;
cout<
*(tmap+i*n+j)<
"
;
}system("
pause"
);
return0;
1.5【结果和截图】
1.6【心得体会】
通过这次试验,我对c语言编译器和对棋盘类游戏中的棋子行列删除有了更加深刻的认识和了解。
数字统计
2.1【问题描述】
某次科研调查时得到了n个自然数,每个数均不超过(1.5*109)。
已知不相同的数不超过10000
个,现在需要统计这些自然数各自岀现的次数,并按照自然数从小到大的顺序输岀统计结果。
2.2【基本要求】
现给你n个自然数,统计这些自然数中每个不相同数各自岀现的次数,并按照自然数从小到大的顺序输出统计结果。
输入数据有n+1行。
第1行是整数n(1<
nW200000),表示自然数的个数;
第2~n+1行每行一个自然数。
输岀有m行(m为n个自然数中不相同数的个数),按照自然数从小到大的顺序输岀。
每行输岀
两个整数,分别是自然数和该数岀现的次数,其间用一个空格隔开。
2.3【测试数据】
输入
输岀
8
23
2
42
4
51
1002
5
100
由于数据量可能很大,要注意程序的运行效率
2.4【实现提示】
定义顺序表,元素类型为:
Element,顺序表类型为:
SeqList,用顺序表的数组data记录自然数和
该数岀现的次数。
定义如下:
typedefstructdata{
longintnumber;
longintcount;
}Element;
typedefstructlist{
Elementdata[10000];
/*存储自然数和该数岀现的次数*/
intlength;
/*存储不同自然数的个数,即顺序表的长度*/
}SeqList;
对输入的每一个数据,在顺序表中查找,若存在,则该数出现次数增1,否则将该数插入顺序表中,出现次数为1,插入后使顺序表中的数据按自然数有序。
2.5【功能实现】
#include<
stdio.h>
voidmain()
typedefstructdata{
longintnumber;
longintcount;
}Element;
Elementdata[10000];
/*存储自然数和该数出现的次数*/
/*存储不同自然数的个数,即顺序表的长度*/
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;
{scanf("
a.data[i].number);
/*输入n个数*/
}data1[0].number=a.data[0].number;
data1[0].count++;
for(i=1;
for(j=0;
j<
s;
j++)if(a.data[i].number==data1[j].number)
data1[j].count++;
break;
if(j==s)
{data1[s].number=a.data[i].number;
data1[s].count++;
s++;
i++)for(j=0;
s-i;
j++)
if(data1[j].number>
data1[j+1].number)
data2=data1[j];
data1[j]=data1[j+1];
data1[j+1]=data2;
结果如下\n"
{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<
q<
100)
第2行至第q+1行,每行是以下两种形式之一:
0x1y1x2y2:
表示画线段的操作,(x1,yj和(X2,y?
)分别是线段的两端,满足要么x1=X2且
y1工y2,要么y1=y2且x1工X2。
(0wX1,x2<
m,0<
y,y2<
n)。
1xyc:
表示填充操作,(x,y)是起始位置,保证不会落在任何已有的线段上;
c为填充字
符,是大小写字母。
(0wx<
m,0wyvn)。
画布的左下角是坐标为(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
01291211
01211311
031131
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;
=n-1-y1;
if(a[i][x1]=='
-'
)
a[i][x1]='
+'
else
a[i][x1]=T;
for(inti=n-1-y1;
=n-1-y2;
if(x2!
=x1&
y2==y1)
if(x2>
=x1)
for(inti=x1;
=x2;
if(a[y2][i]=='
|'
)a[y2][i]='
a[y2][i]='
for(inti=x2;
=x1;
{if(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]!
=b){
a[n-1-y][x]=b;
right++;
left--;
top++;
low--;
if(right<
m)
fillchar(a,m,n,right,y,b);
if(left>
=0)
fillchar(a,m,n,left,y,b);
if(top<
n)
fillchar(a,m,n,x,top,b);
if(low>
{fillchar(a,m,n,x,low,b);
voidprintcanvas(chara[][100],intn,intm)
for(inti=0;
for(intj=0;
%c"
a[i][j]);
printf("
\n"
{charcanvas[100][100],b;
inti,k,x1,y1,x2,y2;
intn,m,q;
请输入n,m,q:
%d%d%d"
m,&
n,&
q);
for(intii=0;
ii<
ii++)
canvas[ii][j]='
.'
for(i=0;
q;
k);
if(k==0)
%d%d%d%d"
x1,&
y1,&
x2,&
y2);
drawline(canvas,m,n,x1,y1,x2,y2);
elseif(k==1)
%d%d%c"
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<
nw10,n-1<
me20),表示交叉路口的数量和街道的数量,
交叉路口从1到n标号。
接下来m行,每行两个整数a,b,表示和标号为a的交叉路口和标号为b的交叉路口之间有一条街道,街道是双向的,小明可以从任意一端走向另一端。
两个路口之间最多有一条街道。
输岀输岀格式
如果小明可以经过每条街道正好一次,则输岀一行包含m+1个整数P1,P2,P3,...,Pm+1,表示小
明经过的路口的顺序,相邻两个整数之间用一个空格分隔。
如果有多种方案满足条件,则输岀字典序最小的一种方案,即首先保证P1最小,P1最小的前提下再保证P2最小,依此类推。
如果不存在方案使得小明经过每条街道正好一次,则输出一个整数-1。
4.3【测试数据】
124134
12
13
14
24
34
输岀说明:
城市的地图和小明的路径如下图所示
46
-1
城市的地图如下图所示,不存在满足条件的路径。
4.4【功能实现】
#include<
typedefstructroute{
longintx;
longinty;
/*路线x代表开始,y代表结尾*/
voidmain()
请输入节点数和路线数:
inti,j=0,k,m,n;
scanf("
%d%d"
routea[50],b[50];
i<
n;
a[i].x,&
a[i].y);
/*放入n组数据*/
for(j=i,k=0;
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;
if(b[j].y==a[i].x&
a[i].y!
=b[j].x)
j++;
b[j]=a[i];
i=0;
if(j==n)
for(intf=0;
f<
j;
f++)
if(b[f].x==b[j].x&
b[f].y==b[j].y)break;
if(f!
=j)
continue;
%d\n"
b[i].x);
}printf("
b[j].x);
不对"
4.5【结果和截图】
4.6【心得体会】
通过本次实验,我对c语言编译器和实际生活中的一些简单问题程序化有了更加深刻的认识和了解。