C语言的三维数组的应用
摘要:利用程序语言【C语言】编写一个俄罗斯方块游戏,加深对程序入口、出口的理解和编制,掌握数组的运用,以及对知识的拓展。
关键字:C语言, 俄罗斯方块, 三维数组
Abstract: [C programming language - language prepared by a Russian box game, understand the procedures for import, export of understanding and preparation, master the use of the array, and the expansion of knowledge.
Keyword: C language, the Russian box,
three-dimensional array
前言:本设计是为了制作一个“俄罗斯方块”游戏。
俄罗斯方块是一款风靡全球的电视游戏机和掌上游戏机游戏,它曾经造成的轰动与造成的经济价值可以说是游戏史上的一件大事。这款游戏最初是由苏联的游戏制作人Alex Pajitnov制作的,它看似简单但却变化无穷,令人上瘾。相信大多数用户都还记得为它痴迷得茶不思饭不想的那个俄罗斯方块时代。
制作此软件是为了使用户既能感受到游戏中的乐趣,也给用户提供了一个展现自己高超技艺的场所。
在毕业论文选题上,我利用c语言制作俄罗斯方块游戏,在c语言中通过利用三维数组来存放最初的形状,利用四个方向键,来控制方块的移动和变形,利用ENTER,ESC,SPACE,HOME,来控制占停,退出,快速下落,和开始。方块的形状,颜色都是随机的。在游戏的旁边有积分,和下一个的形状,还设计了过关,加分等等。
系统进入游戏后,会出现俄罗斯方块的字样,和积分NUMBER,NEXTBOX。按ESC退出游戏,结束出现 GAMEOVER,和成员名,通过函数实现各个功能。
目录
一.概述
1.1俄罗斯方块的题目的描述
1.2俄罗斯方块的设计思想
1.2.1详细规则、胜负判定方法
1.2.2游戏操作方法
1.3 开发工具
1.4 软件运行环境
1.5 项目任务书
二、总体设计
2.1 开发与设计的总体思想
2.2 系统模块结构图
2.3 模块设计
2.3.1 主要模块
2.3.2 图形修饰模块
2.3.3 系统流程图
2.3.4 按键及功能对照表
2.3.5 主要函数名称以及功能表
2.4 模块设计小结
三、实验结果分析及程序代码
四、结果分析:
五、总结
六、参考文献:
一、概述:
1.1俄罗斯方块的题目的描述
1. 运行游戏时.界面随机的产生不同形状的方块,游戏者通过自己的操作使方块进行合理的堆积.如果每层达到饱和状态的时候会自动消除.然后游戏有规则的进行加分.分数达到一定的阶段.游戏的级别也会越来越高.然后方块下降的速度也会随之慢慢加快.以迎合游戏者的挑战,达到最加有趣的游戏!
1.2俄罗斯方块的设计思想
游戏是用来给大家娱乐的,所以要能在使用的过程中给大家带来快乐,消除大家的疲劳,所以我们在游戏中添加了漂亮的场景和动听的音乐,设置了过关升级的功能,激发大家的娱乐激情。
从游戏的基本玩法出发,主要就是俄罗斯方块的形状和旋转,利用三维数组每个方块含有各自的状态,变换只需改变到下一个状态就行了,完全可以用数组来实现(不用写旋转算法了:)
比如:
/* 方块类型为■■■■ */
char[2][4][4] B1={
{
{0,1,0,0},□■□□
{0,1,0,0},□■□□
{0,1,0,0},□■□□
{0,1,0,0} □■□□
},
{
{0,0,0,0},□□□□
{1,1,1,1},■■■■
{0,0,0,0},□□□□
{0,0,0,0} □□□□
}};
含两种状态,每个状态是一个4*4数组,为1表示实心,为0表示空心.因此我们总共设计了7种造型,每种造型又可以通过旋转而变化出2到4种形状,利用随机函数在一个预览窗体中提前展示形状供用户参考,然后将展示的形状复制到游戏窗体中进行摆放,在游戏窗体中用户就可以使用键盘的方向键来控制方块的运动,然后利用递归语句对每一行进行判断,
如果有某行的方块是满的,则消除这行的方块,并且使上面的方块自由下落,其中,方块向下的速度是有时钟控件控制的,在游戏中,用户也可以使用向下键加快下落速度,定义一个变量,对消除的函数进行记录,最后就可以得出用户的分数,用if 语句对分数判断,达到一定的积分就可以升级到下一个档次。
俄罗斯方块游戏设计的主要步骤为以下几个方面:
(1)游戏界面的设计。
(2)俄罗斯方块的造型。
(3)俄罗斯方块的旋转。
(4)俄罗斯方块的运动情况(包括向左,向右和向下)。
(5)俄罗斯方块的自动消行功能。
(6)游戏级别的自由选择。
(7)游戏速度的自由选择。
(8)游戏得分的计算。
(9)游戏菜单选项的设计及功能实现。
1.3 开发环境:
硬件环境:一台电脑386,486,586及兼容机以上,包括键盘、
鼠标,最小硬盘空间1G,内存32M以上。
软件环境:本系统的设计采用的是C语言开发,Windows操作
系统,win-tc v1.9.1以上
二、总体设计:
2.1 开发与设计的总体思想:
程序的设计方法是采用结构化程序设计方法,用c语言进行开发。
2.2 系统模块结构图:
2.3 模块设计:
2.3.1 主要模块:
先画出主要窗口界面,由外边框、盒状收缩,百页窗效果、主题字及功能函数组成。根据函数顺序来完成相应功能,进入游戏(先建立游戏界面,屏幕提示选择按任意键开始游戏,);游戏规则(满一行加一分);最后是工作人员(显示小组人员名单后返回主界面);最后按任意键结束整个游戏系统。
2.3.2 图形修饰模块:如下图示:
2.3.3系统流程图:如下图示:
2.3.4 按键及功能对照表:
2.4、模块设计小结
由上述模块分析和设计可知,本游戏的核心模块是主界面模块,图形修饰模块与函数模块均是为其而服务。
三、实验结果分析及程序代码
#include
#include
#include
#include
#include
#define MINBOXSIZE 20 /* 最小方块的尺寸*/
#define BGCOLOR 6 /* 背景着色*/
#define GX 200
#define GY 10
#define SJNUM 10000 /* 每当玩家打到一万分等级加一级*/
/* 按键码*/
#define VK_LEFT 0x4b00 /*左*/
#define VK_RIGHT 0x4d00 /*右*/
#define VK_DOWN 0x5000 /*下*/
#define VK_UP 0x4800 /*上*/
#define VK_SPACE 0x3920 /*空格*/
#define VK_ESC 0x011b /*退出*/
#define VK_ENTER 0x1c0d /*回车*/
/* 定义俄罗斯方块的方向(我定义他为4种)*/
#define F_DONG 0 /*东*/
#define F_NAN 1 /*南*/
#define F_XI 2 /*西*/
#define F_BEI 3 /*北*/
#define NEXTCOL 20 /* 要出的下一个方块的纵坐标*/
#define NEXTROW 12 /* 要出的下一个方块的横坐标*/
#define MAXROW 14 /* 游戏屏幕大小*/
#define MAXCOL 20
#define SCCOL 50 /*游戏屏幕在显示器上的相对位置*/
#define SCROW 30
#define X_Z 0 /* 定义方块的形状(共八种)*/
#define X_REZ 1
#define X_7 2
#define X_RE7 3
#define X_I 4
#define X_REI 5
#define X_TIAN 6
#define X_T 7
void *buf; /*定义无类型指针,用于将来指向内存空间*/
int gril[22][16]; /* 游戏屏幕坐标*/
int col=1,row=7; /* 当前方块的横纵坐标*/
int boxfx=0,boxgs=0; /* 当前方块的形状和方向*/
int nextboxfx,nextboxgs,maxcol=22;/*下一个方块的形状和方向*/
int minboxcolor,nextminboxcolor;/*小方块的颜色,下一个小方块的颜色*/ int num=0; /*游戏分*/
int dj=0,gamedj[10]={18,16,14,12,10,8,6,4,2,1};/* 游戏等级*/
Struct all
{
int x,y;
int fangxiang; /*方向*/
int gesu; /*第几个方块*/
};
/* 以下我用了一个3维数组来纪录方块的最初形状和方向*/
int boxstr[8][4][4]={{
{0,0,0,0},
{0,0,0,0},
{0,1,1,0},
{0,0,1,1}},
{
{0,0,0,0},
{0,0,0,0},
{0,0,1,1},
{0,1,1,0}},
{
{0,0,0,0},
{0,0,1,1},
{0,0,0,1},
{0,0,0,1}},
{
{0,0,0,0},
{0,0,1,1},
{0,0,1,0},
{0,0,1,0}},
{
{0,0,0,1},
{0,0,0,1},
{0,0,0,1},
{0,0,0,1}},
{
{0,0,0,0},
{0,0,0,0},
{0,0,0,0},
{1,1,1,1}},
{
{0,0,0,0},
{0,0,0,0},
{0,0,1,1},
{0,0,1,1}},
{
{0,0,0,0},
{0,0,0,0},
{0,1,1,1},
{0,0,1,0}}
};
/* 随机得到当前方块和下一个方块的形状和方向*/
void boxrad(){
minboxcolor=nextminboxcolor; /*下一个方块的颜色*/
boxfx=nextboxfx; /*下一个方块的方向*/
boxgs=nextboxgs; /*下一个方块是第几个方块*/
nextminboxcolor=random(16); /*随机产生下一个方块的颜色*/
if(nextminboxcolor==6||nextminboxcolor==7) /*如果颜色是棕色或淡灰色*/ nextminboxcolor=9; /*将其改为淡蓝色*/
nextboxfx=random(4); /*随机产生下一个方块的方向*/
nextboxgs=random(8); /*随机产生下一个方块是第几个方块*/}
/*初始化图形模式*/
void init(void)
{
int gh=DETECT,gm=0;
int errorcode;
registerbgidriver(EGAVGA_driver);
initgraph(&gh,&gm," ");}
/* 在图形模式下的清屏*/
void cls()
{
setfillstyle(SOLID_FILL,0);/*以背景颜色实填充*/
setcolor(0);
bar(0,0,640,480); /*基本图形函数*/}
/*在图形模式下的高级清屏*/
void clscr(int a,int b,int c,int d,int color)
{
setfillstyle(SOLID_FILL,color); /*以color颜色实填充*/
setcolor(color); /*设置当前前景色为color*/
bar(a,b,c,d); /*基本图形函数*/}
/*最小方块的绘制*/
void minbox(int asc,int bsc,int color)
{
int a=0,b=0;
a=SCCOL+asc; /*SCCOL 50,SCROW 30游戏屏幕在显示器上的相对位置*/
b=SCROW+bsc;
clscr(a+1,b+1,a-1+MINBOXSIZE,b-1+MINBOXSIZE,color); /* MINBOXSIZE 20最小方块的尺寸*/
if(color!=BGCOLOR)/*如果当前色是背景色,将其改为白色*/
{
setcolor(15);
line(a+1,b+1,a-1+MINBOXSIZE,b+1);
line(a+1,b+1,a+1,b-1+MINBOXSIZE);
setcolor(0);
line(a-1+MINBOXSIZE,b+1,a-1+MINBOXSIZE,b-1+MINBOXSIZE);
line(a+1,b-1+MINBOXSIZE,a-1+MINBOXSIZE,b-1+MINBOXSIZE);} }
/*最小方块的高级绘制*/
void box(int a,int b,int color)
{
clscr(a+1,b+1,a-1+MINBOXSIZE,b-1+MINBOXSIZE,color);
setcolor(15);
line(a+1,b+1,a-1+MINBOXSIZE,b+1);
line(a+1,b+1,a+1,b-1+MINBOXSIZE);
setcolor(0);
line(a-1+MINBOXSIZE,b+1,a-1+MINBOXSIZE,b-1+MINBOXSIZE);
line(a+1,b-1+MINBOXSIZE,a-1+MINBOXSIZE,b-1+MINBOXSIZE); }
/*游戏中出现的文字*/
void txt(int a,int b,char *txt,int font,int color)
{
setcolor(color);
settextstyle(0,0,font);
outtextxy(a,b,txt); }
/*windows 绘制*/
void win(int a,int b,int c,int d,int bgcolor,char *text,int font,int textcolor) {
clscr(a,b,c,d,7);
clscr(a+3,b+24,c-3,d-3,bgcolor);
clscr(a+3,b+3,c-3,b+20,9);
setcolor(15);
line(a,b,c,b);
line(a,b,a,d);
line(a+2,b+21,c-2,b+21);
line(c-2,b+2,c-2,b+21);
line(a+2,d-2,c-2,d-2);
line(c-2,b+23,c-2,d-2);
txt(a+5,b+8,text,font,textcolor);
setcolor(0);
line(a,d,c,d);
line(c,b,c,d);
line(a+3,b+2,c-3,b+2);
line(a+2,b+2,a+2,b+20);
line(a+2,b+24,a+2,d-2);
line(a+2,b+23,c-3,b+23); }
/*把方块的方向旋转fx个90度(fx最大等于3)*/
void re90(int boxxy[4][4],int fx)
{
int i,j,k,zero;
int a[4][4];
for(k=0;k { for(i=0;i<4;i++) for(j=0;j<4;j++) a[i][j]=boxxy[3-j][i]; for(i=0;i<4;i++) for(j=0;j<4;j++) boxxy[i][j]=a[i][j]; for(i=0;i<4;i++) { zero=1; for(j=0;j<4;j++) if(boxxy[j][3]!=0) zero=0; if(zero) for(j=0;j<4;j++) { boxxy[j][3]=boxxy[j][2]; boxxy[j][2]=boxxy[j][1]; boxxy[j][1]=boxxy[j][0]; boxxy[j][0]=0; } }} } /* 当前方块的绘制*/ void funbox(int a,int b,int color) { int i,j; int boxz[4][4]; for(i=0;i<4;i++) for(j=0;j<4;j++) boxz[i][j]=boxstr[boxgs][i][j]; re90(boxz,boxfx); for(i=0;i<4;i++) for(j=0;j<4;j++) if(boxz[i][j]==1) minbox((j+row+a)*MINBOXSIZE,(i+col+b)*MINBOXSIZE,color); } /*下一个方块的绘制*/ void nextfunbox(int a,int b,int color) { int i,j; int boxz[4][4]; for(i=0;i<4;i++) for(j=0;j<4;j++) boxz[i][j]=boxstr[nextboxgs][i][j]; re90(boxz,nextboxfx); for(i=0;i<4;i++) for(j=0;j<4;j++) if(boxz[i][j]==1) minbox((j+a)*MINBOXSIZE,(i+b)*MINBOXSIZE,color); } /*时间中断定义*/ #define TIMER 0x1c int TimerCounter=0; void interrupt ( *oldhandler)(__CPPARGS); void interrupt newhandler(__CPPARGS) { TimerCounter++; oldhandler(); } void SetTimer(void interrupt (*IntProc)(__CPPARGS)) { oldhandler=getvect(TIMER); disable(); setvect(TIMER,IntProc); enable(); } /*由于游戏的规则,消掉都有最小方块的一行*/ void delcol(int a) { int i,j; for(i=a;i>1;i--) for(j=1;j<15;j++){ minbox(j*MINBOXSIZE,i*MINBOXSIZE,BGCOLOR); gril[i][j]=gril[i-1][j]; if(gril[i][j]==1) minbox(j*MINBOXSIZE,i*MINBOXSIZE,minboxcolor); } } /*把数字转换为字符串*/ char *numgochar(int x) { char k,*a="000000"; int i,j=10; if(x==0) return("0"); for(i=0;x>=1;i++) { a[i]='0'+ (x % 10); x=x/10; } for(j=0;j<=i/2;j++) { k=a[j]; a[j]=a[i-j]; a[i-j]=k; } a[i+1]='\0'; return(a); } /*消掉所有都有最小方块的行*/ void delete() { int i,j,zero,delgx=0; char *nm; for(i=1;i<21;i++){ zero=0; for(j=1;j<15;j++) if(gril[i][j]==0) zero=1; if(zero==0){ delcol(i); delgx++; } } num=num+delgx*delgx*10; dj=num/10000; nm=numgochar(num); clscr(456,173,500,200,BGCOLOR); txt(456,173,"Number:",1,15); txt(456,193,nm,1,15); } /*时间中断结束*/ void KillTimer() { disable(); setvect(TIMER,oldhandler); enable(); } /* 测试当前方块是否可以向下落*/ int downok() { int i,j,k=1,a[4][4]; for(i=0;i<4;i++) for(j=0;j<4;j++) a[i][j]=boxstr[boxgs][i][j]; re90(a,boxfx); for(i=0;i<4;i++) for(j=0;j<4;j++) if(a[i][j] && gril[col+i+1][row+j]) k=0; return(k); } /* 测试当前方块是否可以向左行*/ int leftok() { int i,j,k=1,a[4][4]; for(i=0;i<4;i++) for(j=0;j<4;j++) a[i][j]=boxstr[boxgs][i][j]; re90(a,boxfx); for(i=0;i<4;i++) for(j=0;j<4;j++) if(a[i][j] && gril[col+i][row+j-1]) k=0; return(k); } /* 测试当前方块是否可以向右行*/ int rightok() { int i,j,k=1,a[4][4]; for(i=0;i<4;i++) for(j=0;j<4;j++) a[i][j]=boxstr[boxgs][i][j]; re90(a,boxfx); for(i=0;i<4;i++) for(j=0;j<4;j++) if(a[i][j] && gril[col+i][row+j+1]) k=0; return(k); } /* 测试当前方块是否可以变形*/ int upok() { int i,j,k=1,a[4][4]; for(i=0;i<4;i++) for(j=0;j<4;j++) a[i][j]=boxstr[boxgs][i][j]; re90(a,boxfx+1); for(i=3;i>=0;i--) for(j=3;j>=0;j--) if(a[i][j] && gril[col+i][row+j]) k=0; return(k); } /*当前方块落下之后,给屏幕坐标作标记*/ void setgril() { int i,j,a[4][4]; funbox(0,0,minboxcolor); for(i=0;i<4;i++) for(j=0;j<4;j++) a[i][j]=boxstr[boxgs][i][j]; re90(a,boxfx); for(i=0;i<4;i++) for(j=0;j<4;j++) if(a[i][j]) gril[col+i][row+j]=1; col=1;row=7; } /*游戏结束*/ void gameover() { int i,j; for(i=19;i>=0;i--) for(j=2;j<16;j++) box(j*MINBOXSIZE+SCROW,i*MINBOXSIZE+SCCOL,6); txt(103,203,"Game Over",3,10);} /*按键的设置*/ void call_key(int keyx) { switch(keyx){ case VK_DOWN: { /*下方向键,横坐标加一。*/ if(downok()){ col++; funbox(0,0,minboxcolor);} else{ funbox(0,0,minboxcolor); setgril(); nextfunbox(NEXTCOL,NEXTROW,BGCOLOR); boxrad(); nextfunbox(NEXTCOL,NEXTROW,nextminboxcolor); delete(); } break; } case VK_UP: { /*上方向键,方向形状旋转90度*/ if(upok()) boxfx++; if(boxfx>3) boxfx=0; funbox(0,0,minboxcolor); break; } case VK_LEFT:{ /*左方向键,纵坐标减一*/ if(leftok()) row--; funbox(0,0,minboxcolor); break; } case VK_RIGHT:{ /*右方向键,纵坐标加一*/ if(rightok()) row++; funbox(0,0,minboxcolor); break; } case VK_SPACE: /*空格键,直接落到最后可以落到的们置*/ while(downok()) col++; funbox(0,0,minboxcolor); setgril(); nextfunbox(NEXTCOL,NEXTROW,BGCOLOR); boxrad(); nextfunbox(NEXTCOL,NEXTROW,nextminboxcolor); delete(); break; default: { win(423,53,620,95,15,"Enter Key Error!",1,15); txt(428,80,"Plese Enter Anly Key AG!",1,4); getch(); clscr(420,50,622,97,BGCOLOR); } } } /*时间中断开始*/ void timezd(void){ int key; SetTimer(newhandler); boxrad(); nextfunbox(NEXTCOL,NEXTROW,nextminboxcolor); for(;;){ if(bioskey(1)){ key=bioskey(0); funbox(0,0,BGCOLOR); if(key==VK_ESC) break; call_key(key); } if(TimerCounter>gamedj[dj]){ TimerCounter=0; if(downok()){ funbox(0,0,BGCOLOR); col++; funbox(0,0,minboxcolor); } else { if(col==1){ gameover(); getch(); break; } setgril(); delete(); funbox(0,0,minboxcolor); col=1;row=7; funbox(0,0,BGCOLOR); nextfunbox(NEXTCOL,NEXTROW,BGCOLOR); boxrad(); nextfunbox(NEXTCOL,NEXTROW,nextminboxcolor); } } } } /*百叶窗函数*/ void byc(void) { int i,j; for(i=0;i<40;i++) for(j=0;j<640;j= j +40) /*每隔40像素画一条线*/ { setcolor(BLUE); /*设置前景色*/ line(j+i,0,j+i,479); delay(500); } } /*盒状收缩代码*/ void hzss(void) { int x1=0,y1=0,x2=639,y2=479; setcolor(1); for(;y1<=y2;x1++,y1++,x2--,y2--) { rectangle(x1,y1,x2,y2); delay(1000); } setcolor(6); x1=239;y1=239;x2=400;y2=239; for(;x1>=0&&y1>=0&&x2<=639&&y2<=479;x1--,y1--,x2++,y2++) { rectangle(x1,y1,x2,y2); delay(1000); }} void drawmat(char *mat,int matsize,int x,int y,int color) /*汉字点阵输出函数*/ { int i,j,k,m; m=(matsize-1)/8+1; for(j=0;j for(i=0;i for(k=0;k<8;k++) if(mat[j*m+i]&(0x80>>k)) putpixel(x+i*8+k,y+j,color); } char zu48H[]={ /* 以下是'组' 的48点阵黑体字模,288 byte */ }; char zhang_48H[]={ /* 以下是'长' 的48点阵黑体字模,288 byte */ }; char dian48H[]={ /* 以下是':' 的48点阵黑体字模,288 byte */ }; char yuan_48H[]={ /* 以下是'员' 的48点阵黑体字模,288 byte */ }; char zhang48K[]={ /* 以下是'张' 的48点阵楷体_GB2312 字模,288 byte */ }; char fang48K[]={ /* 以下是'方' 的48点阵楷体_GB2312 字模,288 byte */ }; char yuan48K[]={ /* 以下是'元' 的48点阵楷体_GB2312 字模,288 byte */ }; char jie48K[]={ /* 以下是'解' 的48点阵楷体_GB2312 字模,288 byte */ }; char ying48K[]={ /* 以下是'莹' 的48点阵楷体_GB2312 字模,288 byte */ }; char zhao48K[]={ /* 以下是'赵' 的48点阵楷体_GB2312 字模,288 byte */ }; char jing48K[]={ /* 以下是'静' 的48点阵楷体_GB2312 字模,288 byte */ }; char tao48K[]={ /* 以下是'陶' 的48点阵楷体_GB2312 字模,288 byte */ }; char yuan_48K[]={ /* 以下是'园' 的48点阵楷体_GB2312 字模,288 byte */ }; char huo48K[]={ /* 以下是'霍' 的48点阵楷体_GB2312 字模,288 byte */ }; char shuai48K[]={ /* 以下是'帅' 的48点阵楷体_GB2312 字模,288 byte */ }; char e64H[]={ /* 以下是'俄' 的64点阵黑体字模,512 byte */ }; char luo64H[]={ /* 以下是'罗' 的64点阵黑体字模,512 byte */ }; char si64H[]={ /* 以下是'斯' 的64点阵黑体字模,512 byte */ }; char fang64H[]={ /* 以下是'方' 的64点阵黑体字模,512 byte */ }; char kuai64H[]={ /* 以下是'块' 的64点阵黑体字模,512 byte */ }; void youximing(void) { int x=80,y=200,color=1,space=100; drawmat(e64H,64,x,y,color); drawmat(luo64H,64,x+=space,y,color); drawmat(si64H,64,x+=space,y,color); drawmat(fang64H,64,x+=space,y,color); drawmat(kuai64H,64,x+=space,y,color); } void show_word(void) /*调用点阵函数,在指定位置上输出汉字*/ { int x=0,y=0,color=15,space=50; drawmat(zu48H,48,x,y,color); drawmat(zhang_48H,48,x+=space,y,color); drawmat(dian48H,48,x+=space,y,color); drawmat(zhang48K,48,x+=space/2,y,color); drawmat(fang48K,48,x+=space,y,color); drawmat(yuan48K,48,x+=space,y,color); x=0;y=70; drawmat(zu48H,48,x,y,color); drawmat(yuan_48H,48,x+=space,y,color); drawmat(dian48H,48,x+=space,y,color); drawmat(jie48K,48,x+=space/2,y,color); drawmat(ying48K,48,x+=space,y,color); drawmat(ying48K,48,x+=space,y,color); x=0;y=140; drawmat(zhao48K,48,x,y,color); drawmat(jing48K,48,x+=space-10,y,color); drawmat(tao48K,48,x+=space,y,color); drawmat(yuan_48K,48,x+=space-10,y,color); drawmat(huo48K,48,x+=space,y,color); drawmat(shuai48K,48,x+=space-10,y,color); } void prep_word(void)/*开辟内存空间*/ { unsigned size; cleardevice(); show_word(); size=imagesize(0,0,270,260);/*计算局部图像大小,单位字节*/ while(1) { buf=malloc(size); /*在内存中开辟空间,并将返回空间地址*/ if(size!=-1&&buf) /*如果开辟成功则退出循环,确保空间的开辟成功*/ break; } getimage(0,0,270,260,buf);/*将图像存入buf所指向的内存空间*/ } void move_word(void) { int i; cleardevice();/*在图形模式下清屏*/ sleep(1); /*程序等待1秒*/ for(i=0;i<100;i++) { setcolor(random(15)+1); line(i,0,i,479); line(639-i,0,639-i,479); delay(1000); } sleep(1); for(i=480;i>=160;i--) { delay(10); putimage(180,i,buf,COPY_PUT); /*将buf所指向的空间内容显示在屏幕的指定位置上*/ } setcolor(15); settextstyle(0,0,1); outtextxy(230,360,"Any key to continue..."); getch();} /*主程序开始*/ void main(void) { int i,j,color=7; char *nm; init(); cls(); hzss();/*盒状收缩代码*/ /*屏幕坐标初始化*/ for(i=0;i<=MAXCOL+1;i++) for(j=0;j<=MAXROW+1;j++) gril[i][j]=0; for(i=0;i<=MAXCOL+1;i++) { gril[i][0]=1; gril[i][15]=1; } for(j=1;j<=MAXROW;j++) { gril[0][j]=1; gril[21][j]=1; } clscr(0,0,640,480,15); win(1,1,639,479,BGCOLOR,"",1,15); youximing(); getch(); win(1,1,639,479,BGCOLOR,"",1,15); setcolor(color); for(i=0;i<=21;i++) { for(j=0;j<=15;j++) { if(gril[i][j]==1) box(j*MINBOXSIZE+SCCOL,i*MINBOXSIZE+SCROW,color); } } nextboxgs=random(8); nextboxfx=random(4); nm=numgochar(num); txt(456,173,"Number:",1,15); txt(456,193,nm,1,15); txt(456,243,"Next Box:",1,15); timezd(); KillTimer(); byc();/*百叶窗*/ prep_word(); move_word(); closegraph(); } 思考题 不仅要会做这些题,更重要的是要掌握其相关知识点一、一般填空题 1-1、调用fopen函数打开一文本文件,在“打开模式”这一项中,为输出(写)而打开需填入【1】. 1-2、调用fopen函数打开一文本文件,在“打开模式”这一项中,为追加而打开需填入【1】. 1-3、fopen函数的原形在头文件【1】中. 1-4、getchar函数的原形在头文件【1】中. 1-5、sqrt函数的原形在头文件【1】中. 1-6、如果函数不要求带回值,可用【1】来定义函数返回值为空. 答案:w或w+;a或a+;stdio.h ; stdio.h ; math.h ;void . 2-1、字符串“\1011234\\at”的长度(字符数)是【1】. 2-2、字符串“abc\103\\bcd”的长度(字符数)是【1】. 2-3、字符串“1\\t\x43\abx44”的长度(字符数)是【1】. 2-4、“a“在内存中占【1】个字节. 2-5、‘a’在内存中占【1】个字节. 2-6、“\71“在内存中占【1】个字节. 2-7、一维数组下标的最小值是【1】;数组char a[]=“china” ;在内存应占【1】个字节。 答案:8; 8; 9; 2;1;2 ;0;6. 3-1、设x=(5>1)+2, x的植为【1】. 3-2、表达式‘B’+15+‘\x41’+011+0x10的值是【1】. 3-3、表达式‘b’+5+‘\x42’+011+0x10的值是【1】. 答案:3;171;194; 4-1、假设所有变量都为整型,表达式(a=2,b=5,a>b?a++:b++,a+b)的值是【1】. 4-2、if(!a)中的表达式!a等价于【1】. 4_3、已知a=1,b=2,c=3,执行if(a>b>c) b=a;else b=c;a=4;b=8;后,b的值是【1】. 答案:8;a==0;8; 5-1、若所用变量都已定义,下列程序段的执行结果是【1】. for(i=1;i<=5;i++);printf(“OK\n”); 5-2、执行语句char s[3]=”ab”,*p;p=s;后,*(p+2)的值是【1】. 5-3、若有以下定义和语句:int a[4]={0,1,2,3},*p; p=&a[2]; ,则*--p的值是【1】. 5-4、下列程序的输出结果是【1】,main(){int a=011;printf(“%d\n”,++a);} 答案:OK;’\0’;1;10 6-1、若宏定义为:#define y(x) 2+x, 则表达式a=3*y(3)的值为【1】. 6-2、若宏定义为:#define y(x) 2+x, 则表达式a=4*y(2)的值为【1】. 6-3、若宏定义为:#define y(x) 2/x, 则表达式a=4+3*y(3)的值为【1】. 答案:9;10;6 . 二、单项选择题 1-1、若以"a+"方式打开一个已存在的文件,则以下叙述正确的是()。 A:文件打开时,原有文件内容不被删除,位置指针移到文件末尾,可作添加和读操作 B:文件打开时,原有文件内容不被删除,位置指针移到文件开头,可作重写和读操作 C:文件打开时,原有文件内容被删除,只可作写操作 D:以上各种说法皆不正确 1-2、若执行fopen函数时发生错误,则函数的返回值是()。 C语言实验报告参考答案 实验一熟悉C语言程序开发环境及数据描述 四、程序清单 1.编写程序实现在屏幕上显示以下结果: The dress is long The shoes are big The trousers are black 答案: #include<> main() { printf("The dress is long\n"); printf("The shoes are big\n"); printf("The trousers are black\n"); } 2.编写程序: (1) a=150,b=20,c=45,编写求a/b、a/c(商)和a%b、a%c(余数)的程序。 (2)a=160,b=46,c=18,d=170, 编写求(a+b)/(b-c)*(c-d)的程序。 答案: (1) #include<> main() { int a,b,c,x,y; a=150; b=20; c=45; x=a/b; y=a/c; printf("a/b的商=%d\n",x); printf("a/c的商=%d\n",y); x=a%b; y=a%c; printf("a/b的余数=%d\n",x); printf("a/c的余数=%d\n",y); } (2) #include<> main() { int a,b,c,d; float x; a=160; b=46; c=18; d=170; x=(a+b)/(b-c)*(c-d); printf("(a+b)/(b-c)*(c-d)=%f\n",x); } 3. 设变量a的值为0,b的值为-10,编写程序:当a>b时,将b赋给c;当a<=b时,将0赋给c。(提示:用条件运算符) 答案: #include<> main() { int a,b,c; a=0; b=-10; c= (a>b) b:a; printf("c = %d\n",c); } 五、调试和测试结果 1.编译、连接无错,运行后屏幕上显示以下结果: The dress is long The shoes are big The trousers are black 2、(1) 编译、连接无错,运行后屏幕上显示以下结果: a/b的商=7 a/c的商=3 实验4 数组 一.实验目的: 1.掌握一维数组的定义、赋值和输入输出的方法; 2.掌握字符数组定义、初始化、赋值的方法; 3.了解常见的字符串函数功能及其使用方法; 4.掌握二维数组的定义与引用。 二.实验内容: 1.编写程序,输入10个整数存入一维数组,统计输出其中的正数、负数和零的个数。 2.编写程序,输入10个整数存入一维数组,再按逆序重新存放后再输出。 3.编写程序,输入10个整数存入一维数组,对其进行升序排序后输出。 4.编写程序,求二维数组中元素的最大值和最小值。 5.编写程序,求一个4×4矩阵中所有元素之和。 6.编写程序:从键盘上输入一字符串,统计输出该字符串中的字母字符、数字字符、空格以及其他字符的个数。 7.编写程序:从键盘上输入一字符串,并判断是否形成回文(即正序和逆序一样,如“abcd dcba”)。 8. 产生一个由10个元素组成的一维数组并输出,数组元素由随机数(0-99)构成。 9. 产生一个由10个元素组成的一维数组,数组元素由随机数(0-99)构成。按照升序排列并输出。再输入一个数,按原来的规律将其插入并输出。 页脚内容1 10. 产生一个由10个元素组成的一维数组,数组元素由随机数(0-99)构成。按照升序排列并输出。再输入一个数,要求找出该数是数组中的第几个元素,如果不在数组中,则输出找不到。 11. 找出一个二维数组中的鞍点,即该位置上的元素在该行最大,在该列最小。可能没有鞍点。 12. 编程输出杨辉三角。(要求输出10行)(杨辉三角:每行端点与结尾的数为1.每个数等于它上方两数之和。每行数字左右对称,由1开始逐渐变大) 13. 输入一行字符,统计大写字母、小写字母、数字、空格以及其它字符个数。 14. 编写程序,将两个字符串连接起来,不用strcat。 15. 编写程序实现strcpy函数功能。 16. 编程实现strlen函数功能。 17. 编程求2-4+6-8…-100+102的值。 18. 假设某人有100,000现金。每经过一次路口需要进行一次交费。交费规则为当他现金大于50,000时每次需要交5%如果现金小于等于50,000时每次交5,000。请写一程序计算此人可以经过多少次这个路口。 19. 输入若干个正整数,以0结束,将其中大于平均值且个位为5的数排序后输出。(按由大到小的顺序排序) 20. 输入一个字符串,将其中ASCII码值为基数的字符排序后输出。(按由小到大的顺序) 21. 输入一个以回车结束的字符串(少于80个字符),滤去所有的非16进制字符后,组成一个新字符串(16进制形式),然后将其转换为10进制数后输出。 22. 读入一个正整数n(1<=n<=6),再读入n阶矩阵,计算该矩阵除副对角线、最后一行、最后一列 页脚内容2 实验六数组程序设计 【实验目的】 1、掌握使用一维数组编程方法 2、掌握使用二维数组进行程序设计 【实验内容】 一、上机验证程序,并分析结果 要求:读懂程序,写出分析结果;上机运行程序,得到运行结果,比较之。1、#include { int a(10);/*定义数组*/ int count,i;/* i循环变量 count 正数个数*/ for(i=0;i<=10;i++) {/*循环输入*/ scanf("%d",a[i]); } count=1; for(i=0;i<=10;i++) {/*查找正数*/ if(a(i)>0) count++; } printf("数组中正数有:%d个\n",count); return 0; } 三编写程序 1.编写程序要求输入30个学生的单科成绩,输出高于平均分的成绩。#include C语言(数组) 一、选择题 1. 设有程序: main() { int i,a[11]; printf("给数组赋值:\n"); for (i=0;i<=10;i++) scanf("%d",( )); ... ... printf("输出数组:\n"); for(i=0;i<=10;i++) printf("%d,",( )); } 则在程序中的两个园括号中分别应填入:C A) &a[i]和&a[i] B) a[i]和&a[i] C) &a[i]和a[i] D) a[i]和a[i] 2. 设已定义:int a[15]; 则数组a占用的内存单元数是( C ). A) 15 B) 16 C) 30 D) 32 3. 阅读程序: main() { int a[2]={0},i,j,k=2; for(i=0;i return r; } main() { int x,a[]={2,3,4,5,6,7,8,9}; x=f(a,3); printf("%d\n",x); } 以上程序的输出结果是( D ). A) 720 B) 6 C)24 D) 120 5. 以下定义语句中,错误的是( B ). A) int a[ ] = {6,7,8}; B) int n=5, a[n]; C) char a[ ]= "string"; D) char a[5 ]={'0','1','2','3','4'}; 6. 以下描述中正确的是( D ). A) 数组名后面的常量表达式用一对圆括弧括起来 B) 数组下标从1开始 C) 数组下标的数据类型可以是整型或实型 D) 数组名的规定与变量名相同 7. 若定义数组并初始化char a[10]={'0','1 ','2','3','4','5','6','7','8','9'};指出以下错误语句( AB ). A) scanf("%c",a[0]); B) scanf("%s",&a); C) printf("%c",a[3]); D) printf("%s",a); 8.若定义数组int a[10] ,其最后一个数组元素为( C ). A) a[0] B) a[1] C) a[9] D) a[10] 9. 若定义数组并初始化int a[10]={ 1,2,3,4},以下语句哪一个不成立( B )? A) a[8] 的值为0 B) a[1] 的值为1 C) a[3] 的值为4 D) a[9] 的值为0 10. 指出以下错误语句( A ).c语言复习题(有答案)●
C语言实验报告参考答案(原)
C语言数组编程题
C语言 数组 实验题目及答案
C语言练习3(数组)=参考答案
C语言实验报告(五-数组2)