第一篇:C语言10大经典实例
案例一 贪吃蛇游戏
#define N 200 #include
{ int gd=DETECT,gm;initgraph(&gd,&gm,“c: c”);cleardevice();} /*开始画面,左上角坐标为(50,40),右下角坐标为(610,460)的围墙*/ void DrawK(void){ /*setbkcolor(LIGHTGREEN);*/ setcolor(11);setlinestyle(SOLID_LINE,0,THICK_WIDTH);/*设置线型*/ for(i=50;i<=600;i+=10)/*画围墙*/ { rectangle(i,40,i+10,49);/*上边*/ rectangle(i,451,i+10,460);/*下边*/ } for(i=40;i<=450;i+=10){ rectangle(50,i,59,i+10);/*左边*/ rectangle(601,i,610,i+10);/*右边*/ } } /*玩游戏具体过程*/ void GamePlay(void){ randomize();/*随机数发生器*/ food.yes=1;/*1表示需要出现新食物,0表示已经存在食物*/ snake.life=0;/*活着*/ snake.direction=1;/*方向往右*/ snake.x[0]=100;snake.y[0]=100;/*蛇头*/ snake.x[1]=110;snake.y[1]=100;snake.node=2;/*节数*/ PrScore();/*输出得分*/ while(1)/*可以重复玩游戏,压ESC键结束*/ { while(!kbhit())/*在没有按键的情况下,蛇自己移动身体*/ { if(food.yes==1)/*需要出现新食物*/ { food.x=rand()%400+60;food.y=rand()%350+60;while(food.x%10!=0)/*食物随机出现后必须让食物能够在整格内,这样才可以让蛇吃到*/
food.x++;
while(food.y%10!=0)
food.y++;
food.yes=0;/*画面上有食物了*/ } if(food.yes==0)/*画面上有食物了就要显示*/ { setcolor(GREEN);rectangle(food.x,food.y,food.x+10,food.y-10);} for(i=snake.node-1;i>0;i--)/*蛇的每个环节往前移动,也就是贪吃蛇的关键算法*/ { snake.x[i]=snake.x[i-1];snake.y[i]=snake.y[i-1];} /*1,2,3,4表示右,左,上,下四个方向,通过这个判断来移动蛇头*/ switch(snake.direction){ case 1:snake.x[0]+=10;break;case 2: snake.x[0]-=10;break;case 3: snake.y[0]-=10;break;case 4: snake.y[0]+=10;break;} for(i=3;i
setcolor(0);/*把画面上的食物东西去掉*/ rectangle(food.x,food.y,food.x+10,food.y-10);snake.x[snake.node]=-20;snake.y[snake.node]=-20;/*新的一节先放在看不见的位置,下次循环就取前一节的位置*/ snake.node++;/*蛇的身体长一节*/ food.yes=1;/*画面上需要出现新的食物*/ score+=10;PrScore();/*输出新得分*/ } setcolor(4);/*画出蛇*/ for(i=0;i snake.direction=2;else if(key==DOWN&&snake.direction!=3) snake.direction=4;}/*endwhile(1)*/ } /*游戏结束*/ void GameOver(void){ cleardevice();PrScore();setcolor(RED); settextstyle(0,0,4);outtextxy(200,200,“GAME OVER”);getch();} /*输出成绩*/ void PrScore(void){ char str[10];setfillstyle(SOLID_FILL,YELLOW);bar(50,15,220,35);setcolor(6);settextstyle(0,0,2);sprintf(str,“score:%d”,score);outtextxy(55,20,str);} /*图形结束*/ void Close(void){ getch();closegraph();} 案例二 计算器 #include double AspectRatio;/* 屏幕的像素比*/ void drawboder(void);/*画边框函数*/ void initialize(void);/*初始化函数*/ void computer(void);/*计算器计算函数*/ void changetextstyle(int font, int direction, int charsize);/*改变文本样式函数*/ void mwindow(char *header);/*窗口函数*/ int specialkey(void);/*获取特殊键函数*/ int arrow();/*设置箭头光标函数*/ /*主函数*/ int main(){ initialize();/* 设置系统进入图形模式 */ computer();/*运行计算器 */ closegraph();/*系统关闭图形模式返回文本模式*/ return(0);/*结束程序*/ } /* 设置系统进入图形模式 */ void initialize(void){ int xasp, yasp;/* 用于读x和y方向纵横比*/ GraphDriver = DETECT;/* 自动检测显示器*/ initgraph(&GraphDriver, &GraphMode, “");/*初始化图形系统*/ ErrorCode = graphresult();/*读初始化结果*/ if(ErrorCode!= grOk)/*如果初始化时出现错误*/ { printf(”Graphics System Error: %sn“, grapherrormsg(ErrorCode));/*显示错误代码*/ exit(1);/*退出*/ } getpalette(&palette);/* 读面板信息*/ MaxColors = getmaxcolor()+ 1;/* 读取颜色的最大值*/ MaxX = getmaxx();/* 读屏幕尺寸 */ MaxY = getmaxy();/* 读屏幕尺寸 */ getaspectratio(&xasp, &yasp);/* 拷贝纵横比到变量中*/ AspectRatio =(double)xasp/(double)yasp;/* 计算纵横比值*/ } /*计算器函数*/ void computer(void){ struct viewporttype vp;/*定义视口类型变量*/ int color, height, width;int x, y,x0,y0, i, j,v,m,n,act,flag=1; float num1=0,num2=0,result;/*操作数和计算结果变量*/ char cnum[5],str2[20]={”“},c,temp[20]={”“};char str1[]=”1230.456+-789*/Qc=^%“;/* 定义字符串在按钮图形上显示的符号 */ mwindow(”Calculator“);/* 显示主窗口 */ color = 7;/*设置灰颜色值*/ getviewsettings(&vp);/* 读取当前窗口的大小*/ width=(vp.right+1)/10;/* 设置按钮宽度 */ height=(vp.bottom-10)/10;/*设置按钮高度 */ x = width /2;/*设置x的坐标值*/ y = height/2;/*设置y的坐标值*/ setfillstyle(SOLID_FILL, color+3);bar(x+width*2, y, x+7*width, y+height);/*画一个二维矩形条显示运算数和结果*/ setcolor(color+3);/*设置淡绿颜色边框线*/ rectangle(x+width*2, y, x+7*width, y+height);/*画一个矩形边框线*/ setcolor(RED);/*设置颜色为红色*/ outtextxy(x+3*width,y+height/2,”0.“);/*输出字符串”0.“*/ x =2*width-width/2;/*设置x的坐标值*/ y =2*height+height/2;/*设置y的坐标值*/ for(j=0;j<4;++j)/*画按钮*/ { for(i=0;i<5;++i){ setfillstyle(SOLID_FILL, color);setcolor(RED);bar(x, y, x+width, y+height);/*画一个矩形条*/ rectangle(x, y, x+width, y+height);sprintf(str2,”%c“,str1[j*5+i]);/*将字符保存到str2中*/ outtextxy(x+(width/2), y+height/2, str2);x =x+width+(width / 2);/*移动列坐标*/ } y +=(height/2)*3;/* 移动行坐标*/ x =2*width-width/2;/*复位列坐标*/ } x0=2*width;y0=3*height;x=x0;y=y0;gotoxy(x,y);/*移动光标到x,y位置*/ arrow();/*显示光标*/ putimage(x,y,rar,XOR_PUT); m=0;n=0;strcpy(str2,”“);/*设置str2为空串*/ while((v=specialkey())!=45)/*当压下Alt+x键结束程序,否则执行下面的循环*/ { while((v=specialkey())!=ENTER)/*当压下键不是回车时*/ { putimage(x,y,rar,XOR_PUT);/*显示光标图象*/ if(v==RIGHT)/*右移箭头时新位置计算*/ if(x>=x0+6*width)/*如果右移,移到尾,则移动到最左边字符位置*/ { x=x0; m=0;} else { x=x+width+width/2; m++;} /*否则,右移到下一个字符位置*/ if(v==LEFT)/*左移箭头时新位置计算*/ if(x<=x0){ x=x0+6*width; m=4;} /*如果移到头,再左移,则移动到最右边字符位置*/ else { x=x-width-width/2; m--;} /*否则,左移到前一个字符位置*/ if(v==UP)/*上移箭头时新位置计算*/ if(y<=y0){ y=y0+4*height+height/2; n=3;} /*如果移到头,再上移,则移动到最下边字符位置*/ else { y=y-height-height/2;n--;} /*否则,移到上边一个字符位置*/ if(v==DOWN)/*下移箭头时新位置计算*/ if(y>=7*height){ y=y0;n=0;} /*如果移到尾,再下移,则移动到最上边字符位置*/ else { y=y+height+height/2; n++;} /*否则,移到下边一个字符位置*/ putimage(x,y,rar,XOR_PUT);/*在新的位置显示光标箭头*/ } c=str1[n*5+m];/*将字符保存到变量c中*/ if(isdigit(c)||c=='.')/*判断是否是数字或小数点*/ { if(flag==-1)/*如果标志为-1,表明为负数*/ { strcpy(str2,”-“);/*将负号连接到字符串中*/ flag=1;} /*将标志值恢复为1*/ sprintf(temp,”%c“,c);/*将字符保存到字符串变量temp中*/ strcat(str2,temp);/*将temp中的字符串连接到str2中*/ setfillstyle(SOLID_FILL,color+3);bar(2*width+width/2,height/2,15*width/2,3*height/2);outtextxy(5*width,height,str2);/*显示字符串*/ } if(c=='+'){ num1=atof(str2);/*将第一个操作数转换为浮点数*/ strcpy(str2,”“);/*将str2清空*/ act=1;/*做计算加法标志值*/ setfillstyle(SOLID_FILL,color+3);bar(2*width+width/2,height/2,15*width/2,3*height/2);outtextxy(5*width,height,”0.“);/*显示字符串*/ } if(c=='-'){ if(strcmp(str2,”“)==0)/*如果str2为空,说明是负号,而不是减号*/ flag=-1;/*设置负数标志*/ else { num1=atof(str2);/*将第二个操作数转换为浮点数*/ strcpy(str2,”“);/*将str2清空*/ act=2;/*做计算减法标志值*/ setfillstyle(SOLID_FILL,color+3);bar(2*width+width/2,height/2,15*width/2,3*height/2);/*画矩形*/ outtextxy(5*width,height,”0.“);/*显示字符串*/ } } if(c=='*'){ num1=atof(str2);/*将第二个操作数转换为浮点数*/ strcpy(str2,”“);/*将str2清空*/ act=3;/*做计算乘法标志值*/ setfillstyle(SOLID_FILL,color+3);bar(2*width+width/2,height/2,15*width/2,3*height/2);outtextxy(5*width,height,”0.“);/*显示字符串*/ } if(c=='/'){ num1=atof(str2);/*将第二个操作数转换为浮点数*/ strcpy(str2,”“);/*将str2清空*/ act=4;/*做计算除法标志值*/ setfillstyle(SOLID_FILL,color+3);bar(2*width+width/2,height/2,15*width/2,3*height/2);outtextxy(5*width,height,”0.“);/*显示字符串*/ } if(c=='^'){ num1=atof(str2);/*将第二个操作数转换为浮点数*/ strcpy(str2,”“);/*将str2清空*/ act=5;/*做计算乘方标志值*/ setfillstyle(SOLID_FILL,color+3);/*设置用淡绿色实体填充*/ bar(2*width+width/2,height/2,15*width/2,3*height/2);/*画矩形*/ outtextxy(5*width,height,”0.“);/*显示字符串*/ } if(c=='%'){ num1=atof(str2);/*将第二个操作数转换为浮点数*/ strcpy(str2,”“);/*将str2清空*/ act=6;/*做计算模运算乘方标志值*/ setfillstyle(SOLID_FILL,color+3);/*设置用淡绿色实体填充*/ bar(2*width+width/2,height/2,15*width/2,3*height/2);/*画矩形*/ outtextxy(5*width,height,”0.“);/*显示字符串*/ } if(c=='='){ num2=atof(str2);/*将第二个操作数转换为浮点数*/ switch(act)/*根据运算符号计算*/ { case 1:result=num1+num2;break;/*做加法*/ case 2:result=num1-num2;break;/*做减法*/ case 3:result=num1*num2;break;/*做乘法*/ case 4:result=num1/num2;break;/*做除法*/ case 5:result=pow(num1,num2);break;/*做x的y次方*/ case 6:result=fmod(num1,num2);break;/*做模运算*/ } setfillstyle(SOLID_FILL,color+3);/*设置用淡绿色实体填充*/ bar(2*width+width/2,height/2,15*width/2,3*height/2);/*覆盖结果区*/ sprintf(temp,”%f“,result);/*将结果保存到temp中*/ outtextxy(5*width,height,temp);/*显示结果*/ } if(c=='c'){ num1=0;/*将两个操作数复位0,符号标志为1*/ num2=0;flag=1;strcpy(str2,”“);/*将str2清空*/ setfillstyle(SOLID_FILL,color+3);/*设置用淡绿色实体填充*/ bar(2*width+width/2,height/2,15*width/2,3*height/2);/*覆盖结果区*/ outtextxy(5*width,height,”0.“);/*显示字符串*/ } if(c=='Q')exit(0);/*如果选择了q回车,结束计算程序*/ } putimage(x,y,rar,XOR_PUT);/*在退出之前消去光标箭头*/ return;/*返回*/ } /*窗口函数*/ void mwindow(char *header){ int height;cleardevice(); /* 清除图形屏幕 */ setcolor(MaxColors1);/*设置当前颜色为白色 */ setlinestyle(SOLID_LINE, 0, NORM_WIDTH);/*设置画线方式*/ getviewsettings(&vp);/*将当前视口信息装入vp所指的结构中*/ rectangle(0, 0, vp.right-vp.left, vp.bottom-vp.top);/*画矩形边框*/ } /*设计鼠标图形函数*/ int arrow(){ int size;int raw[]={4,4,4,8,6,8,14,16,16,16,8,6,8,4,4,4};/*定义多边形坐标*/ setfillstyle(SOLID_FILL,2);/*设置填充模式*/ fillpoly(8,raw);/*画出一光标箭头*/ size=imagesize(4,4,16,16);/*测试图象大小*/ rar=malloc(size);/*分配内存区域*/ getimage(4,4,16,16,rar);/*存放光标箭头图象*/ putimage(4,4,rar,XOR_PUT);/*消去光标箭头图象*/ return 0;} /*按键函数*/ int specialkey(void){ int key;while(bioskey(1)==0);/*等待键盘输入*/ key=bioskey(0);/*键盘输入*/ key=key&0xff? key&0xff:key>>8;/*只取特殊键的扫描值,其余为0*/ return(key);/*返回键值*/ } 案例三 黑白棋游戏 /*3.3.4 源程序*/ #include ”graphics.h“ /*图形系统头文件*/ #define LEFT 0x4b00 /*光标左键值*/ #define RIGHT 0x4d00 /*光标右键值*/ #define DOWN 0x5000 /*光标下键值*/ #define UP 0x4800 /*光标上键值*/ #define ESC 0x011b /* ESC键值*/ #define ENTER 0x1c0d /* 回车键值*/ int a[8][8]={0},key,score1,score2;/*具体分数以及按键与存放棋子的变量*/ char playone[3],playtwo[3];/*两个人的得分转换成字符串输出*/ void playtoplay(void);/*人人对战函数*/ void DrawQp(void);/*画棋盘函数*/ void SetPlayColor(int x);/*设置棋子第一次的颜色*/ void MoveColor(int x,int y);/*恢复原来棋盘状态*/ int QpChange(int x,int y,int z);/*判断棋盘的变化*/ void DoScore(void);/*处理分数*/ void PrintScore(int n);/*输出成绩*/ void playWin(void);/*输出胜利者信息*/ /******主函数*********/ void main(void){ int gd=DETECT,gr;initgraph(&gd,&gr,”c: c“);/*初始化图形系统*/ DrawQp();/*画棋盘*/ playtoplay();/*人人对战*/ getch();closegraph();/*关闭图形系统*/ } void DrawQp()/*画棋盘*/ { int i,j;score1=score2=0;/*棋手一开始得分都为0*/ setbkcolor(BLUE);for(i=100;i<=420;i+=40){ line(100,i,420,i);/*画水平线*/ line(i,100,i,420);/*画垂直线*/ } setcolor(0);/*取消圆周围的一圈东西*/ setfillstyle(SOLID_FILL,15);/*白色实体填充模式*/ fillellipse(500,200,15,15);/*在显示得分的位置画棋*/ setfillstyle(SOLID_FILL,8);/*黑色实体填充模式*/ fillellipse(500,300,15,15);a[3][3]=a[4][4]=1;/*初始两个黑棋*/ a[3][4]=a[4][3]=2;/*初始两个白棋*/ setfillstyle(SOLID_FILL,WHITE);fillellipse(120+3*40,120+3*40,15,15);fillellipse(120+4*40,120+4*40,15,15);setfillstyle(SOLID_FILL,8);fillellipse(120+3*40,120+4*40,15,15); fillellipse(120+4*40,120+3*40,15,15);score1=score2=2;/*有棋后改变分数*/ DoScore();/*输出开始分数*/ } void playtoplay()/*人人对战*/ { int x,y,t=1,i,j,cc=0;while(1)/*换棋手走棋*/ { x=120,y=80;/*每次棋子一开始出来的坐标,x为行坐标,y为列坐标*/ while(1)/*具体一个棋手走棋的过程*/ { PrintScore(1);/*输出棋手1的成绩*/ PrintScore(2);/*输出棋手2的成绩*/ SetPlayColor(t);/*t变量是用来判断棋手所执棋子的颜色*/ fillellipse(x,y,15,15);key=bioskey(0);/*接收按键*/ if(key==ESC)/*跳出游戏*/ break;else if(key==ENTER)/*如果按键确定就可以跳出循环*/ { if(y!=80&&a[(x-120)/40][(y-120)/40]!=1 &&a[(x-120)/40][(y-120)/40]!=2)/*如果落子位置没有棋子*/ { if(t%2==1)/*如果是棋手1移动*/ a[(x-120)/40][(y-120)/40]=1;else/*否则棋手2移动*/ a[(x-120)/40][(y-120)/40]=2;if(!QpChange(x,y,t))/*落子后判断棋盘的变化*/ { a[(x-120)/40][(y-120)/40]=0;/*恢复空格状态*/ cc++;/*开始统计尝试次数*/ if(cc>=64-score1-score2)/*如果尝试超过空格数则停步*/ { MoveColor(x,y); fillellipse(x,y,15,15); break;} else continue;/*如果按键无效*/ } DoScore();/*分数的改变*/ break;/*棋盘变化了,则轮对方走棋*/ } else/*已经有棋子就继续按键*/ continue;} else /*四个方向按键的判断*/ if(key==LEFT&&x>120)/*左方向键*/ { MoveColor(x,y);fillellipse(x,y,15,15);SetPlayColor(t);x-=40;fillellipse(x,y,15,15);} else if(key==RIGHT&&x<400&&y>80)/*右方向键*/ { MoveColor(x,y);fillellipse(x,y,15,15);SetPlayColor(t);x+=40;fillellipse(x,y,15,15);} else if(key==UP&&y>120)/*上方向键*/ { MoveColor(x,y);fillellipse(x,y,15,15);SetPlayColor(t);y-=40;fillellipse(x,y,15,15);} else if(key==DOWN&&y<400)/*下方向键*/ { MoveColor(x,y);fillellipse(x,y,15,15);SetPlayColor(t);y+=40;fillellipse(x,y,15,15);} } if(key==ESC)/*结束游戏*/ break; if((score1+score2)==64||score1==0||score2==0)/*格子已经占满或一方棋子为0判断胜负*/ { playWin();/*输出最后结果*/ break;} t=t%2+1;/*一方走后,改变棋子颜色即轮对方走*/ cc=0;/*计数值恢复为0*/ } /*endwhile*/ } void SetPlayColor(int t)/*设置棋子颜色*/ { if(t%2==1)setfillstyle(SOLID_FILL,15);/*白色*/ else setfillstyle(SOLID_FILL,8);/*灰色*/ } void MoveColor(int x,int y)/*走了一步后恢复原来格子的状态*/ { if(y<100)/*如果是从起点出发就恢复蓝色*/ setfillstyle(SOLID_FILL,BLUE);else/*其他情况如果是1就恢复白色棋子,2恢复黑色棋子,或恢复蓝色棋盘*/ switch(a[(x-120)/40][(y-120)/40]){ case 1: setfillstyle(SOLID_FILL,15);break;/*白色*/ case 2: setfillstyle(SOLID_FILL,8);break;/*黑色*/ default: setfillstyle(SOLID_FILL,BLUE);/*蓝色*/ } } int QpChange(int x,int y,int t)/*判断棋盘的变化*/ { int i,j,k,kk,ii,jj,yes;yes=0;i=(x-120)/40;/*计算数组元素的行下标*/ j=(y-120)/40;/*计算数组元素的列下标*/ SetPlayColor(t);/*设置棋子变化的颜色*/ /*开始往8个方向判断变化*/ if(j<6)/*往右边*/ { for(k=j+1;k<8;k++) if(a[i][k]==a[i][j]||a[i][k]==0)/*遇到自己的棋子或空格结束*/ break;if(a[i][k]!=0&&k<8){ for(kk=j+1;kk } if(i>1)/*判断上边*/ { for(k=i-1;k>=0;k--)if(a[k][j]==a[i][j]||!a[k][j])break;if(a[k][j]!=0&&k>=0){ for(kk=i-1;kk>k&&k>=0;kk--){ a[kk][j]=a[i][j];fillellipse(120+kk*40,120+j*40,15,15);} if(kk!=i-1)yes=1;} } if(i>1&&j<6)/*右上*/ { for(k=i-1,kk=j+1;k>=0&&kk<8;k--,kk++)if(a[k][kk]==a[i][j]||!a[k][kk])break;if(a[k][kk]&&k>=0&&kk<8){ for(ii=i-1,jj=j+1;ii>k&&k>=0;ii--,jj++){ a[ii][jj]=a[i][j];fillellipse(120+ii*40,120+jj*40,15,15);} if(ii!=i-1)yes=1;} } if(i<6&&j>1)/*左下*/ { for(k=i+1,kk=j-1;k<8&&kk>=0;k++,kk--)if(a[k][kk]==a[i][j]||!a[k][kk])break;if(a[k][kk]!=0&&k<8&&kk>=0){ for(ii=i+1,jj=j-1;ii } if(ii!=i+1)yes=1;} } if(i>1&&j>1)/*左上*/ { for(k=i-1,kk=j-1;k>=0&&kk>=0;k--,kk--)if(a[k][kk]==a[i][j]||!a[k][kk])break;if(a[k][kk]!=0&&k>=0&&kk>=0){ for(ii=i-1,jj=j-1;ii>k&&k>=0;ii--,jj--){ a[ii][jj]=a[i][j];fillellipse(120+ii*40,120+jj*40,15,15);} if(ii!=i-1)yes=1;} } if(i<6&&j<6)/* 右下*/ { for(k=i+1,kk=j+1;kk<8&&kk<8;k++,kk++)if(a[k][kk]==a[i][j]||!a[k][kk])break;if(a[k][kk]!=0&&kk<8&&k<8){ for(ii=i+1,jj=j+1;ii for(j=0;j<8;j++)if(a[i][j]==1)/*分别统计两个人的分数*/ score1++;else if(a[i][j]==2)score2++;} void PrintScore(int playnum)/*输出成绩*/ { if(playnum==1)/*清除以前的成绩*/ { setfillstyle(SOLID_FILL,BLUE);bar(550,100,640,400);} setcolor(RED);settextstyle(0,0,4);/*设置文本输出样式*/ if(playnum==1)/*判断输出哪个棋手的分,在不同的位置输出*/ { sprintf(playone,”%d“,score1);outtextxy(550,200,playone);} else { sprintf(playtwo,”%d“,score2);outtextxy(550,300,playtwo);} setcolor(0);} void playWin()/*输出最后的胜利者结果*/ { settextstyle(0,0,4);setcolor(12);if(score2>score1)/*开始判断最后的结果*/ outtextxy(100,50,”black win!“);else if(score2 案例四 迷宫问题 /*4.3.3源程序*/ #include #include {/*如果将以下两句注释掉,则显示人工走过的路径,*/ setfillstyle(SOLID_FILL,WHITE);/*设置白色实体填充样式*/ bar(100+(*y)*15-6,50+(*x)*15-6,100+(*y)*15+6,50+(*x)*15+6);/*恢复原通路*/ switch(n)/*判断x,y的变化,8个方向的变化*/ { case 1:(*x)--;break;/*上*/ case 2:(*x)--;(*y)++;break;/*右上*/ case 3:(*y)++;break;/*右*/ case 4:(*x)++;(*y)++;break;/*右下*/ case 5:(*x)++;break;/*下*/ case 6:(*x)++;(*y)--;break;/*左下*/ case 7:(*y)--;break;/*左*/ case 8:(*x)--;(*y)--;break;/*左上*/ } setfillstyle(SOLID_FILL,RED);/*新位置显示探索物*/ bar(100+(*y)*15-6,50+(*x)*15-6,100+(*y)*15+6,50+(*x)*15+6);} void PeopleFind(int(*map)[N])/*人工手动查找*/ { int x,y;char c=0;/*接收按键的变量*/ x=y=1;/*人工查找的初始位置*/ setcolor(11);line(500,200,550,200);outtextxy(570,197,”d“);line(500,200,450,200);outtextxy(430,197,”a“);line(500,200,500,150);outtextxy(497,130,”w“);line(500,200,500,250);outtextxy(497,270,”x“);line(500,200,450,150);outtextxy(445,130,”q“);line(500,200,550,150);outtextxy(550,130,”e“);line(500,200,450,250);outtextxy(445,270,”z“);line(500,200,550,250);outtextxy(550,270,”c“);/*以上是画8个方向的控制介绍*/ setcolor(YELLOW);outtextxy(420,290,”Press 'Enter' to end“);/*压回车键结束*/ setfillstyle(SOLID_FILL,RED);bar(100+y*15-6,50+x*15-6,100+y*15+6,50+x*15+6);/*入口位置显示*/ while(c!=13)/*如果按下的不是回车键*/ { c=getch();/*接收字符后开始各个方向的探索*/ if(c=='w'&&map[x-1][y]!=1)DrawPeople(&x,&y,1);/*上*/ else if(c=='e'&&map[x-1][y+1]!=1)DrawPeople(&x,&y,2);/*右上*/ else if(c=='d'&&map[x][y+1]!=1)DrawPeople(&x,&y,3);/*右*/ else if(c=='c'&&map[x+1][y+1]!=1) DrawPeople(&x,&y,4);/*右下*/ else if(c=='x'&&map[x+1][y]!=1) DrawPeople(&x,&y,5);/*下*/ else if(c=='z'&&map[x+1][y-1]!=1) DrawPeople(&x,&y,6);/*左下*/ else if(c=='a'&&map[x][y-1]!=1) DrawPeople(&x,&y,7);/*左*/ else if(c=='q'&&map[x-1][y-1]!=1) DrawPeople(&x,&y,8);/*左上*/ } setfillstyle(SOLID_FILL,WHITE);/*消去红色探索物,恢复原迷宫图*/ bar(100+y*15-6,50+x*15-6,100+y*15+6,50+x*15+6);if(x==N-2&&y==N-2)/*人工控制找成功的话*/ yes=1;/*如果成功标志为1*/ } void WayCopy(int(*oldmap)[N],int(*map)[N])/*拷贝迷宫数组 */ { int i,j;for(i=0;i } map[i][j]=1;/*走过的地方变为1*/ WayCopy(oldmap,map);/*拷贝迷宫图*/ if(oldmap[i+1][j+1]==0&&!yes)/*判断右下方是否可走*/ { FindWay(oldmap,i+1,j+1);if(yes)/*如果到达出口了,再把值赋给显示路线的way数组,也正是这个原因,所以具体路线是从最后开始保存*/ { way[wayn][0]=i;way[wayn++][1]=j;return;} } WayCopy(oldmap,map);if(oldmap[i+1][j]==0&&!yes)/*判断下方是否可以走,如果标志yes已经是1也不用找下去了*/ { FindWay(oldmap,i+1,j);if(yes){ way[wayn][0]=i;way[wayn++][1]=j;return;} } WayCopy(oldmap,map);if(oldmap[i][j+1]==0&&!yes)/*判断右方是否可以走*/ { FindWay(oldmap,i,j+1);if(yes){ way[wayn][0]=i;way[wayn++][1]=j;return;} } WayCopy(oldmap,map);if(oldmap[i-1][j]==0&&!yes)/*判断上方是否可以走*/ { FindWay(oldmap,i-1,j);if(yes){ way[wayn][0]=i; way[wayn++][1]=j;return;} } WayCopy(oldmap,map);if(oldmap[i-1][j+1]==0&&!yes)/*判断右上方是否可以走*/ { FindWay(oldmap,i-1,j+1);if(yes){ way[wayn][0]=i;way[wayn++][1]=j;return;} } WayCopy(oldmap,map);if(oldmap[i+1][j-1]==0&&!yes)/*判断左下方是否可以走*/ { FindWay(oldmap,i+1,j-1);if(yes){ way[wayn][0]=i;way[wayn++][1]=j;return;} } WayCopy(oldmap,map);if(oldmap[i][j-1]==0&&!yes)/*判断左方是否可以走*/ { FindWay(oldmap,i,j-1);if(yes){ way[wayn][0]=i;way[wayn++][1]=j;return;} } WayCopy(oldmap,map);if(oldmap[i-1][j-1]==0&&!yes)/*判断左上方是否可以走*/ { FindWay(oldmap,i-1,j-1);if(yes){ way[wayn][0]=i; way[wayn++][1]=j;return;} } return;} void MapRand(int(*map)[N])/*开始的随机迷宫图*/ { int i,j;cleardevice();/*清屏*/ randomize();/*随机数发生器*/ for(i=0;i int i;setfillstyle(SOLID_FILL,RED);/*红色输出走的具体路线*/ wayn--;for(i=wayn;i>=0;i--){ bar(100+way[i][1]*15-6,50+way[i][0]*15-6,100+ way[i][1]*15+6,50+way[i][0]*15+6);sleep(1);/*控制显示时间*/ } bar(100+(N-2)*15-6,50+(N-2)*15-6,100+(N-2)*15+6,50+(N-2)*15+6);/*在目标点标红色*/ setcolor(GREEN);settextstyle(0,0,2);/*设置字体大小*/ outtextxy(130,400,”Find a way!“);} void NotFind(void)/*没找到通路*/ { setcolor(GREEN);settextstyle(0,0,2);/*设置字体大小*/ outtextxy(130,400,”Not find a way!“);} void Result(void)/*结果处理*/ { if(yes)/*如果找到*/ Find();else/*没找到路*/ NotFind();getch();} void Close(void)/*图形关闭*/ { closegraph();} 案例五 扫地雷游戏 /*5.3.4 源程序*/ #include { int num;/*格子当前处于什么状态,1有雷,0已经显示过数字或者空白格子*/ int roundnum;/*统计格子周围有多少雷*/ int flag;/*右键按下显示红旗的标志,0没有红旗标志,1有红旗标志*/ }Mine[10][10];int gameAGAIN=0;/*是否重来的变量*/ int gamePLAY=0;/*是否是第一次玩游戏的标志*/ int mineNUM;/*统计处理过的格子数*/ char randmineNUM[3];/*显示数字的字符串*/ int Keystate;int MouseExist;int MouseButton;int MouseX;int MouseY;void Init(void);/*图形驱动*/ void MouseOn(void);/*鼠标光标显示*/ void MouseOff(void);/*鼠标光标隐藏*/ void MouseSetXY(int,int);/*设置当前位置*/ int LeftPress(void);/*左键按下*/ int RightPress(void);/*鼠标右键按下*/ void MouseGetXY(void);/*得到当前位置*/ void Control(void);/*游戏开始,重新,关闭*/ void GameBegain(void);/*游戏开始画面*/ void DrawSmile(void);/*画笑脸*/ void DrawRedflag(int,int);/*显示红旗*/ void DrawEmpty(int,int,int,int);/*两种空格子的显示*/ void GameOver(void);/*游戏结束*/ void GameWin(void);/*显示胜利*/ int MineStatistics(int,int);/*统计每个格子周围的雷数*/ int ShowWhite(int,int);/*显示无雷区的空白部分*/ void GamePlay(void);/*游戏过程*/ void Close(void);/*图形关闭*/ void main(void){ Init();Control();Close();} void Init(void)/*图形开始*/ { int gd=DETECT,gm;initgraph(&gd,&gm,”c: c“);} void Close(void)/*图形关闭*/ { closegraph();} void MouseOn(void)/*鼠标光标显示*/ { _AX=0x01;geninterrupt(0x33);} void MouseOff(void)/*鼠标光标隐藏*/ { _AX=0x02;geninterrupt(0x33);} void MouseSetXY(int x,int y)/*设置当前位置*/ { _CX=x;_DX=y;_AX=0x04;geninterrupt(0x33);} int LeftPress(void)/*鼠标左键按下*/ { _AX=0x03;geninterrupt(0x33);return(_BX&1);} int RightPress(void)/*鼠标右键按下*/ { _AX=0x03;geninterrupt(0x33);return(_BX&2);} void MouseGetXY(void)/*得到当前位置*/ { _AX=0x03;geninterrupt(0x33);MouseX=_CX;MouseY=_DX;} void Control(void)/*游戏开始,重新,关闭*/ { int gameFLAG=1;/*游戏失败后判断是否重新开始的标志*/ while(1) { if(gameFLAG)/*游戏失败后没判断出重新开始或者退出游戏的话就继续判断*/ { GameBegain();/*游戏初始画面*/ GamePlay();/*具体游戏*/ if(gameAGAIN==1)/*游戏中重新开始*/ { gameAGAIN=0;continue;} } MouseOn();gameFLAG=0;if(LeftPress())/*判断是否重新开始*/ { MouseGetXY();if(MouseX>280&&MouseX<300&&MouseY>65&&MouseY<85){ gameFLAG=1;continue;} } if(kbhit())/*判断是否按键退出*/ break;} MouseOff();} void DrawSmile(void)/*画笑脸*/ { setfillstyle(SOLID_FILL,YELLOW);fillellipse(290,75,10,10);setcolor(YELLOW);setfillstyle(SOLID_FILL,BLACK);/*眼睛*/ fillellipse(285,75,2,2);fillellipse(295,75,2,2);setcolor(BLACK);/*嘴巴*/ bar(287,80,293,81);} void DrawRedflag(int i,int j)/*显示红旗*/ { setcolor(7);setfillstyle(SOLID_FILL,RED);bar(198+j*20,95+i*20,198+j*20+5,95+i*20+5); setcolor(BLACK);line(198+j*20,95+i*20,198+j*20,95+i*20+10);} void DrawEmpty(int i,int j,int mode,int color)/*两种空格子的显示*/ { setcolor(color);setfillstyle(SOLID_FILL,color);if(mode==0)/*没有单击过的大格子*/ bar(200+j*20-8,100+i*20-8,200+j*20+8,100+i*20+8);else if(mode==1)/*单击过后显示空白的小格子*/ bar(200+j*20-7,100+i*20-7,200+j*20+7,100+i*20+7);} void GameBegain(void)/*游戏开始画面*/ { int i,j;cleardevice();if(gamePLAY!=1){ MouseSetXY(290,70);/*鼠标一开始的位置,并作为它的初始坐标*/ MouseX=290;MouseY=70;} gamePLAY=1;/*下次按重新开始的话鼠标不重新初始化*/ mineNUM=0;setfillstyle(SOLID_FILL,7);bar(190,60,390,290);for(i=0;i<10;i++)/*画格子*/ for(j=0;j<10;j++)DrawEmpty(i,j,0,8);setcolor(7);DrawSmile();/*画脸*/ randomize();for(i=0;i<10;i++)/*100个格子随机赋值有没有地雷*/ for(j=0;j<10;j++){ Mine[i][j].num=random(8);/*如果随机数的结果是1表示这个格子有地雷*/ if(Mine[i][j].num==1)mineNUM++;/*现有雷数加1*/ else Mine[i][j].num=2;Mine[i][j].flag=0;/*表示没红旗标志*/ } sprintf(randmineNUM,”%d“,mineNUM);/*显示这次总共有多少雷数*/ setcolor(1);settextstyle(0,0,2);outtextxy(210,70,randmineNUM);mineNUM=100-mineNUM;/*变量取空白格数量*/ MouseOn();} void GameOver(void)/*游戏结束画面*/ { int i,j;setcolor(0);for(i=0;i<10;i++)for(j=0;j<10;j++)if(Mine[i][j].num==1)/*显示所有的地雷*/ { DrawEmpty(i,j,0,RED);setfillstyle(SOLID_FILL,BLACK);fillellipse(200+j*20,100+i*20,7,7);} } void GameWin(void)/*显示胜利*/ { setcolor(11);settextstyle(0,0,2);outtextxy(230,30,”YOU WIN!“);} int MineStatistics(int i,int j)/*统计每个格子周围的雷数*/ { int nNUM=0;if(i==0&&j==0)/*左上角格子的统计*/ { if(Mine[0][1].num==1)nNUM++;if(Mine[1][0].num==1)nNUM++;if(Mine[1][1].num==1)nNUM++;} else if(i==0&&j==9)/*右上角格子的统计*/ { if(Mine[0][8].num==1)nNUM++;if(Mine[1][9].num==1) nNUM++;if(Mine[1][8].num==1)nNUM++;} else if(i==9&&j==0)/*左下角格子的统计*/ { if(Mine[8][0].num==1)nNUM++;if(Mine[9][1].num==1)nNUM++;if(Mine[8][1].num==1)nNUM++;} else if(i==9&&j==9)/*右下角格子的统计*/ { if(Mine[9][8].num==1) nNUM++;if(Mine[8][9].num==1) nNUM++;if(Mine[8][8].num==1) nNUM++;} else if(j==0)/*左边第一列格子的统计*/ { if(Mine[i][j+1].num==1) nNUM++;if(Mine[i+1][j].num==1) nNUM++;if(Mine[i-1][j].num==1) nNUM++;if(Mine[i-1][j+1].num==1) nNUM++;if(Mine[i+1][j+1].num==1) nNUM++;} else if(j==9)/*右边第一列格子的统计*/ { if(Mine[i][j-1].num==1) nNUM++;if(Mine[i+1][j].num==1) nNUM++;if(Mine[i-1][j].num==1) nNUM++;if(Mine[i-1][j-1].num==1)nNUM++;if(Mine[i+1][j-1].num==1)nNUM++;} else if(i==0)/*第一行格子的统计*/ { if(Mine[i+1][j].num==1)nNUM++;if(Mine[i][j-1].num==1)nNUM++;if(Mine[i][j+1].num==1)nNUM++;if(Mine[i+1][j-1].num==1)nNUM++;if(Mine[i+1][j+1].num==1)nNUM++;} else if(i==9)/*最后一行格子的统计*/ { if(Mine[i-1][j].num==1)nNUM++;if(Mine[i][j-1].num==1)nNUM++;if(Mine[i][j+1].num==1)nNUM++;if(Mine[i-1][j-1].num==1)nNUM++;if(Mine[i-1][j+1].num==1)nNUM++;} else/*普通格子的统计*/ { if(Mine[i-1][j].num==1)nNUM++;if(Mine[i-1][j+1].num==1)nNUM++;if(Mine[i][j+1].num==1)nNUM++;if(Mine[i+1][j+1].num==1)nNUM++;if(Mine[i+1][j].num==1)nNUM++; if(Mine[i+1][j-1].num==1) nNUM++;if(Mine[i][j-1].num==1) nNUM++;if(Mine[i-1][j-1].num==1) nNUM++;} return(nNUM);/*把格子周围一共有多少雷数的统计结果返回*/ } int ShowWhite(int i,int j)/*显示无雷区的空白部分*/ { if(Mine[i][j].flag==1||Mine[i][j].num==0)/*如果有红旗或该格处理过就不对该格进行任何判断*/ return;mineNUM--;/*显示过数字或者空格的格子就表示多处理了一个格子,当所有格子都处理过了表示胜利*/ if(Mine[i][j].roundnum==0&&Mine[i][j].num!=1)/*显示空格*/ { DrawEmpty(i,j,1,7);Mine[i][j].num=0;} else if(Mine[i][j].roundnum!=0)/*输出雷数*/ { DrawEmpty(i,j,0,8);sprintf(randmineNUM,”%d“,Mine[i][j].roundnum);setcolor(RED);outtextxy(195+j*20,95+i*20,randmineNUM);Mine[i][j].num=0;/*已经输出雷数的格子用0表示已经用过这个格子*/ return;} /*8个方向递归显示所有的空白格子*/ if(i!=0&&Mine[i-1][j].num!=1)ShowWhite(i-1,j);if(i!=0&&j!=9&&Mine[i-1][j+1].num!=1)ShowWhite(i-1,j+1);if(j!=9&&Mine[i][j+1].num!=1)ShowWhite(i,j+1);if(j!=9&&i!=9&&Mine[i+1][j+1].num!=1)ShowWhite(i+1,j+1);if(i!=9&&Mine[i+1][j].num!=1)ShowWhite(i+1,j);if(i!=9&&j!=0&&Mine[i+1][j-1].num!=1) ShowWhite(i+1,j-1);if(j!=0&&Mine[i][j-1].num!=1)ShowWhite(i,j-1);if(i!=0&&j!=0&&Mine[i-1][j-1].num!=1)ShowWhite(i-1,j-1);} void GamePlay(void)/*游戏过程*/ { int i,j,Num;/*Num用来接收统计函数返回一个格子周围有多少地雷*/ for(i=0;i<10;i++)for(j=0;j<10;j++)Mine[i][j].roundnum=MineStatistics(i,j);/*统计每个格子周围有多少地雷*/ while(!kbhit()){ if(LeftPress())/*鼠标左键盘按下*/ { MouseGetXY();if(MouseX>280&&MouseX<300&&MouseY>65&&MouseY<85)/*重新来*/ { MouseOff();gameAGAIN=1;break;} if(MouseX>190&&MouseX<390&&MouseY>90&&MouseY<290)/*当前鼠标位置在格子范围内*/ { j=(MouseX-190)/20;/*x坐标*/ i=(MouseY-90)/20;/*y坐标*/ if(Mine[i][j].flag==1)/*如果格子有红旗则左键无效*/ continue;if(Mine[i][j].num!=0)/*如果格子没有处理过*/ { if(Mine[i][j].num==1)/*鼠标按下的格子是地雷*/ { MouseOff(); GameOver();/*游戏失败*/ break;} else/*鼠标按下的格子不是地雷*/ { MouseOff(); Num=MineStatistics(i,j); if(Num==0)/*周围没地雷就用递归算法来显示空白格子*/ ShowWhite(i,j); else/*按下格子周围有地雷*/ { sprintf(randmineNUM,”%d“,Num);/*输出当前格子周围的雷数*/ setcolor(RED); outtextxy(195+j*20,95+i*20,randmineNUM); mineNUM--; } MouseOn();Mine[i][j].num=0;/*点过的格子周围雷数的数字变为0表示这个格子已经用过*/ if(mineNUM<1)/*胜利了*/ { GameWin(); break;} } } } } if(RightPress())/*鼠标右键键盘按下*/ { MouseGetXY();if(MouseX>190&&MouseX<390&&MouseY>90&&MouseY<290)/*当前鼠标位置在格子范围内*/ { j=(MouseX-190)/20;/*x坐标*/ i=(MouseY-90)/20;/*y坐标*/ MouseOff();if(Mine[i][j].flag==0&&Mine[i][j].num!=0)/*本来没红旗现在显示红旗*/ { DrawRedflag(i,j);Mine[i][j].flag=1;} else if(Mine[i][j].flag==1)/*有红旗标志再按右键就红旗消失*/ { DrawEmpty(i,j,0,8);Mine[i][j].flag=0;} } MouseOn(); sleep(1);} } } 案例六 速算24 /*6.3.4 源程序*/ #define N 20 #define COL 100 #define ROW 40 #include ”stdio.h“ #include ”time.h“ /*系统时间函数*/ #include ”graphics.h“ /*图形函数*/ #include ”alloc.h“/*动态地址分配函数*/ #include ”stdlib.h“ /*库函数*/ #include ”string.h“ /*字符串函数*/ #include ”ctype.h“ /*字符操作函数*/ char p[4][13]={ {'A','2','3','4','5','6','7','8','9','0','J','Q','K'},/*扑克牌,10用0来表示*/ {'A','2','3','4','5','6','7','8','9','0','J','Q','K'}, {'A','2','3','4','5','6','7','8','9','0','J','Q','K'}, {'A','2','3','4','5','6','7','8','9','0','J','Q','K'}};typedef struct node { int data;struct node *link;}STACK1;/*栈1*/ typedef struct node2 { char data;struct node2 *link;}STACK2;/*栈2*/ void init(void);/*图形驱动*/ void close(void);/*图形关闭*/ void play(void);/*发牌的具体过程*/ void rand1(int j);/*随机发牌函数*/ void change(char *e,char *a);/*中缀变后缀函数*/ int computer(char *s);/*后缀表达式计算函数*/ STACK1 *initstack1(STACK1 *top);/*栈1初始化*/ STACK1 *push(STACK1 *top,int x);/*栈1入栈运算*/ STACK1 *pop(STACK1 *top);/*栈1删除栈顶元素*/ int topx(STACK1 *top);/*栈1读栈顶元素*/ STACK1 *ptop(STACK1 *top,int *x);/*栈1读出栈顶元素值并删除栈顶元素*/ int empty(STACK1 *top);/*判栈1是否为空函数*/ STACK2 *initstack2(STACK2 *top);/*栈2初始化*/ STACK2 *push2(STACK2 *top,char x);/*栈2入栈运算*/ STACK2 *pop2(STACK2 *top);/*栈2删除栈顶元素*/ char topx2(STACK2 *top);/*栈2读栈顶元素*/ STACK2 *ptop2(STACK2 *top,char *x);/*栈2读出栈顶元素值并删除栈顶元素*/ int empty2(STACK2 *top);/*判栈2是否为空函数* int text1(char *s);/*显示文本*/ main(){ char s[N],s1[N],ch;int i,result;int gdriver, gmode;clrscr();/*清屏*/ init();/*初始化函数*/ while(1){ setbkcolor(BLACK);/*设置背景颜色*/ cleardevice();/*清屏*/ play();/*发牌*/ gotoxy(1,15);/*移动光标*/ printf(”--------------------Note-------------------n“);printf(” Please enter express accroding to above four numbern“);/*提示信息*/ printf(” Format as follows:2.*(5.+7.)n“);/*提示输入字符串格式*/ printf(”---------------n“);scanf(”%s%c“,s1,&ch);/*输入字符串压回车键*/ change(s1,s);/*调用change函数将中缀表达式s1转换为后缀表达式s*/ result=computer(s);/*计算后缀表达式的值,返回结果result */ if(result==24)/*如果结果等于24*/ text1(”very good“);/*调用函数text1显示字符串”very good“*/ else text1(”wrong!!“);/*否则函数text1显示字符串”wrong!!“*/ printf(”Continue(y/n)?n“);/*提示信息,是否继续*/ scanf(”%c“,&ch);/*输入一字符*/ if(ch=='n'||ch=='N')/*如果该字符等于n或N*/ break;/*跳出循环,程序结束*/ } /*否则,开始下一轮循环*/ close();return;/*返回*/ } void rand1(int j)/*随机发牌函数*/ { int kind,num;char str[3],n;randomize();while(1)/*循环直到有牌发*/ { kind=random(4);/*花色随机数*/ num=random(13);/*大小随机数*/ if(p[kind][num]!=-1)/*该数未取过*/ { n=p[kind][num];/*取相应位置的扑克牌数*/ p[kind][num]=-1;/*牌发好以后相应位置的元素置-1*/ break;} } switch(kind)/*花式的判断*/ { case 0:setcolor(RED);sprintf(str,”%c“,3);break;/*红桃*/ case 1:setcolor(BLACK);sprintf(str,”%c“,3);break;/*黑桃*/ case 2:setcolor(RED);sprintf(str,”%c“,4);break;/*方片*/ case 3:setcolor(BLACK);sprintf(str,”%c“,5);break;/*草花*/ } settextstyle(0,0,2);outtextxy(COL+j*100-30,ROW+100-46,str);/*显示左上角花色*/ outtextxy(COL+j*100+16,ROW+100+32,str);/*显示右下角花色*/ if(n!='0')/*输出其他牌*/ { settextstyle(0,0,3);sprintf(str,”%c“,n);outtextxy(COL+j*100-5,ROW+100-5,str);/*显示牌的大小*/ } else/*输出10的时候*/ { sprintf(str,”%d“,10);outtextxy(COL+j*100-6,ROW+100-5,str);} } void play(void)/*发牌的具体过程*/ { int j;for(j=0;j<4;j++){ bar(COL+j*100-35,ROW+100-50,COL+j*100+35,ROW+1*100+50);/*画空牌*/ setcolor(BLUE);rectangle(COL+j*100-32,ROW+100-48,COL+j*100+32,ROW+100+48);/*画矩形框*/ rand1(j);/*随机取牌*/ delay(10000);/*延时显示*/ } } void init(void)/*图形驱动*/ { int gd=DETECT,gm;initgraph(&gd,&gm,”c: c“);cleardevice();} void close(void)/*图形关闭*/ { closegraph();} void change(char *e,char *a)/*中缀字符串e转后缀字符串a函数*/ { STACK2 *top=NULL;/* 定义栈顶指针*/ int i,j;char w;i=0;j=0;while(e[i]!=' ')/*当字符串没有结束时*/ { if(isdigit(e[i]))/*如果字符是数字*/ { do{ a[j]=e[i];/*将数字原样拷贝到数组a中*/ i++;/*e数组的下标加1*/ j++;/*a数组的下标加1*/ }while(e[i]!='.');/*直到字符为数字结束符“.”为止*/ a[j]='.';j++;/*将数字结束符“.”拷贝到a数组依然保持结束标记*/ } if(e[i]=='(')/*如果字符是“(”时*/ top=push2(top,e[i]);/*将其压入堆栈*/ if(e[i]==')')/*如果字符是“)”时*/ { top=ptop2(top,&w);/*取出栈顶元素,并从栈顶删除该元素*/ while(w!='(')/*如果字符不是“(”时反复循环*/ { a[j]=w;/*将栈顶元素存入a数组*/ j++;/*下标加1*/ top=ptop2(top,&w);/*取出栈顶元素,并从栈顶删除该元素*/ } } if(e[i]=='+'||e[i]=='-')/*如果字符是加或减号时*/ { if(!empty2(top))/*如栈不为空*/ { w=topx2(top);while(w!='(')/*当栈顶元素不是“(”时反复循环*/ { a[j]=w;j++;/*将栈顶元素存入表达式a中,a的下标加1*/ top=pop2(top);/*删除栈顶元素*/ if(empty2(top))/*如果栈为空*/ break;/*跳出循环*/ else w=topx2(top);/*否则读栈顶元素*/ } } top=push2(top,e[i]);/*将当前e的字符元素压入堆栈*/ } if(e[i]=='*'||e[i]=='/')/*如果字符是乘或除号时*/ { if(!empty2(top))/*如栈不为空*/ { w=topx2(top);/*读栈顶元素存入w*/ while(w=='*'||w=='/')/*当栈顶元素是乘或除时反复循环*/ { a[j]=w;j++;/*将栈顶元素存入字符串a中,a的下标加1*/ top=pop2(top);/*删除栈顶元素*/ if(empty2(top))/*如果栈为空*/ break;/*跳出循环*/ else w=topx2(top);/*否则读栈顶元素*/ } } top=push2(top,e[i]);/*将当前e字符元素压入堆栈*/ } i++;/*e的下标加1*/ } while(!empty2(top))/*当不为空时反复循环*/ top=ptop2(top,&a[j++]);/*将栈顶元素存入数组a中*/ a[j]=' ';/*将字符串结束标记写入最后一个数组元素中构成字符串*/ } int computer(char *s)/* 计算函数*/ { STACK1 *top=NULL;int i,k,num1,num2,result;i=0;while(s[i]!=' ')/*当字符串没有结束时作以下处理*/ { if(isdigit(s[i]))/*判字符是否为数字*/ { k=0;/*k初值为0*/ do{ k=10*k+s[i]-'0';/*将字符连接为十进制数字*/ i++;/*i加1*/ }while(s[i]!='.');/*当字符不为‘.’时重复循环*/ top=push(top,k);/*将生成的数字压入堆栈*/ } if(s[i]=='+')/*如果为'+'号*/ { top=ptop(top,&num2);/*将栈顶元素取出存入num2中*/ top=ptop(top,&num1);/*将栈顶元素取出存入num1中*/ result=num2+num1;/*将num1和num2相加存入result中*/ top=push(top,result);/*将result压入堆栈*/ } if(s[i]=='-')/*如果为'-'号*/ { top=ptop(top,&num2);/*将栈顶元素取出存入num2中*/ top=ptop(top,&num1);/*将栈顶元素取出存入num1中*/ result=num1-num2;/*将num1减去num2结果存入result中*/ top=push(top,result);/*将result压入堆栈*/ } if(s[i]=='*')/*如果为'*'号*/ { top=ptop(top,&num2);/*将栈顶元素取出存入num2中*/ top=ptop(top,&num1);/*将栈顶元素取出存入num1中*/ result=num1*num2;/*将num1与num2相乘结果存入result中*/ top=push(top,result);/*将result压入堆栈*/ } if(s[i]=='/')/*如果为'/'号*/ { top=ptop(top,&num2);/*将栈顶元素取出存入num2中*/ top=ptop(top,&num1);/*将栈顶元素取出存入num1中*/ result=num1/num2;/*将num1除num2结果存入result中* top=push(top,result);/*将result压入堆栈*/ } i++;/*i加1*/ } top=ptop(top,&result);/*最后栈顶元素的值为计算的结果*/ return result;/*返回结果*/ } STACK1 *initstack1(STACK1 *top)/*初始化*/ { top=NULL;/*栈顶指针置为空*/ return top;/*返回栈顶指针*/ } STACK1 *push(STACK1 *top,int x)/*入栈函数*/ { STACK1 *p;/*临时指针类型为STACK1*/ p=(STACK1 *)malloc(sizeof(STACK1));/*申请STACK1大小的空间*/ if(p==NULL)/*如果p为空*/ { printf(”memory is overflown!“);/*显示内存溢出*/ exit(0);/*退出*/ } p->data=x;/*保存值x到新空间*/ p->link=top;/*新结点的后继为当前栈顶指针*/ top=p;/*新的栈顶指针为新插入的结点*/ return top;/*返回栈顶指针*/ } STACK1 *pop(STACK1 *top)/*出栈*/ { STACK1 *q;/*定义临时变量*/ q=top;/*保存当前栈顶指针*/ top=top->link;/*栈顶指针后移*/ free(q);/*释放q*/ return top;/*返回栈顶指针*/ } int topx(STACK1 *top)/*读栈顶元素*/ { if(top==NULL)/*栈是否为空*/ { printf(”Stack is nulln“);/*显示栈为空信息*/ return 0;/*返回整数0*/ } return top->data;/*返回栈顶元素*/ } STACK1 *ptop(STACK1 *top,int *x)/*取栈顶元素,并删除栈顶元素*/ { *x=topx(top);/*读栈顶元素*/ top=pop(top);/*删除栈顶元素*/ return top;/*返回栈顶指针*/ } int empty(STACK1 *top)/*判栈是否为空*/ { if(top==NULL)/*如果为空*/ return 1;/*返回1*/ else return 0;/*否则返回0*/ } STACK2 *initstack2(STACK2 *top)/*初始化*/ { top=NULL;/*栈顶指针置为空*/ return top;/*返回栈顶指针*/ } STACK2 *push2(STACK2 *top,char x)/*入栈函数*/ { STACK2 *p;/*临时指针类型为STACK2*/ p=(STACK2 *)malloc(sizeof(STACK2));/*申请STACK2大小的空间*/ if(p==NULL)/*如果p为空*/ { printf(”memory is overflown!“);/*显示内存溢出*/ exit(0);/*退出*/ } p->data=x;/*保存值x到新空间*/ p->link=top;/*新结点的后继为当前栈顶指针*/ top=p;/*新的栈顶指针为新插入的结点*/ return top;/*返回栈顶指针*/ } STACK2 *pop2(STACK2 *top)/*出栈*/ { STACK2 *q;/*定义临时变量*/ q=top;/*保存当前栈顶指针*/ top=top->link;/*栈顶指针后移*/ free(q);/*释放q*/ return top;/*返回栈顶指针*/ } char topx2(STACK2 *top)/*读栈顶元素*/ { if(top==NULL)/*栈是否为空*/ { printf(”Stack is nulln“);/*显示栈为空信息*/ return '';/*返回空字符*/ } return top->data;/*返回栈顶元素*/ } STACK2 *ptop2(STACK2 *top,char *x)/*取栈顶元素,并删除栈顶元素*/ { *x=topx2(top);/*读栈顶元素*/ top=pop2(top);/*删除栈顶元素*/ return top;/*返回栈顶指针*/ } int empty2(STACK2 *top)/*判栈是否为空*/ { if(top==NULL)/*如果为空*/ return 1;/*返回1*/ else return 0;/*否则返回0*/ } int text1(char *s){ setbkcolor(BLUE);/*设置背景颜色为蓝色*/ cleardevice();/*清除屏幕*/ setcolor(12);/*设置文本颜色为淡红色*/ settextstyle(1, 0, 8);/*三重笔划字体, 放大8倍*/ outtextxy(120, 120, s);/*输出字符串s*/ setusercharsize(2, 1, 4, 1);/*水平放大2倍, 垂直放大4倍*/ setcolor(15);/*设置文本颜色为*白色/ settextstyle(3, 0, 5);/*无衬字笔划, 放大5倍*/ outtextxy(220, 220, s);/*输出字符串s*/ getch();/*键盘输入任一字符*/ return;/*返回*/ } 案例七 数据结构CAI系统 /*2.源程序*/ /***binary.c二分查找程序***/ #include void Mid(int x);/*画中间箭*/ void Clr(int x);/*擦除画面上的一些内容*/ void Sort(int x[],int n);/*对随机数组排序*/ void main(void){ int a[N],x;Init(a,&x);/*x为要查找的数*/ Put(a,N);find(a,x,N);Close();exit(0);} void Mid(int n)/*画中间键*/ { setcolor(WHITE);/*中间箭的颜色为白色,以下三条线画成了箭头,以下两个函数一样*/ line(25+n*40,120,25+n*40,80);line(25+n*40,120,20+n*40,110);line(25+n*40,120,30+n*40,110);} void Down(int n)/*画上箭*/ { setcolor(6);line(25+n*40,120,25+n*40,80);line(25+n*40,120,20+n*40,110);line(25+n*40,120,30+n*40,110);} void Up(int n)/*画下箭*/ { setcolor(6);line(25+n*40,180,25+n*40,220);line(25+n*40,180,20+n*40,190);line(25+n*40,180,30+n*40,190);} void Clr(int y)/*擦除画面上的一些内容*/ { setfillstyle(SOLID_FILL,0);/*每次演示的时候先将下面显示的文字给去处掉*/ bar(0,y+50,640,y-50);/*这里是用矩形的方式*/ } void Put(int a[],int n)/*输出数值*/ { int i;char num[5]; setcolor(GREEN);settextstyle(0,0,2);/*设置字体的大小*/ for(i=0;i high=mid-1;/*修改右边界*/ sprintf(str2,”%d“,a[mid]);outtextxy(250,250,str2);/*显示比较数据的情况*/ outtextxy(300,250,”>“);outtextxy(350,250,str1);} sleep(2);/*间隔一秒好执行下一次*/ } setcolor(11);if(low<=high)/*找到*/ outtextxy(250,350,”FIND“);else/*没找到*/ outtextxy(250,350,”NOT FIND“);} void Sort(int a[],int n)/*冒泡排序,自上而下*/ { int i,j,t;for(i=0;i getch();closegraph();/*关闭图形系统*/ } /*2.源程序*/ /***bubble.c***/ #include SQL DML 和 DDL AND 结构、属性和索引都是完整的: DELETE FROM table_name 或者: DELETE * FROM table_name C语言基础知识:实例讲解 这篇文章旨在让各位对 C 有个总体的认识,有看不懂的地方请不必太在意,只要记住就可以了,继续往下学下去就会明白的。 首先请看下面这个简单的 C 程序,猜猜它会做些什么。猜不出来也没关系,后面会有详细的解说。 #include int main(void) /* 一个简单的程序 */ { intnum; /* 声明一个名叫num的变量 */ num = 1; /* 将 1 赋值给num */ printf(“This is a simple C program.”);/* 调用printf函数 */ printf(“My favorite number is %d because it is first.”, num); return 0; } 在对这个程序进行详细说明之前,我想先请您用编译器把它编译成可执行文件,并且运行,看看运行结果和您的猜想是否一致。如果不懂如何进行编译,请参考以下文章: 下面,我将分两步对这个程序进行详细的讲解。第一步是概要说明,也就是对程序中每一行代码的含义作简单讲解,以帮助您对这个程序有一个大致的理解。第二步是详细说明,也就是程序中的每一行代码进行详细的讲解,以加深您的理解。 一、概要说明 #include 把另外一个文件包含进来 这行代码命令编译器把头文件(.h 文件)stdio.h中的内容包含到我们的 程序中。stdio.h是C语言的标准头文件之一,提供对键盘输入和显示输出等的 支持。要使用printf函数,就应该包含这个头文件。顺带一提,stdio代表 standard input/output,也就是标准输入输出的意思。 int main(void) <- 函数头 C 程序由一个或多个函数组成。我们的这个程序只有一个函数:main 函数。圆括号()表明 main 是一个函数;int表明 main 函数返回一个整数;void 表明 main 函数不接受任何参数。在此,请您紧记,int main(void)是 ISO/ANSI C 标准中定义的 main 函数定义方法之一。 /* a simple program */ <- 注释 /* 和 */ 用于对程序进行注释说明,帮助读者更快更好地理解程序。编译器 会忽略 /* 和 */ 之间的内容(包括 /* 和 */),不会对它们进行编译。 { <- 函数体的开端 这个开大括弧 { 标志着函数体开始。函数体以闭大括弧 } 结束。在 { 和 } 之间的语句都属于这个函数。 intnum; <- 声明变量num 这个语句表明我们声明了一个名叫num的变量。int表明这个变量为 整型变量。 num = 1; <- 赋值语句 这个语句将 1 赋值给变量num。执行这个语句后,num的值等于 1。 printf(“This is a simple C program.”); <- 函数调用语句 printf函数是 C 语言标准函数库里的函数。这个语句调用printf函数在 屏幕上显示“This is a simple C program.”,并且换行。是换行符,它提示 printf开始新的一行,也就是将光标移动到下一行的开端。如果上面的语句中没有,那就不会换行,而且光标会紧跟在“This is a simple program.”后面。 printf(“My favorite number is %d because it is first.”, num); %d 告诉printf用num的值替换掉 %d,并且以整数形式显示num的值。因为num的值为 1,所以这个语句在屏幕上显示“My favorite number is 1 because it is first.”,并且换行。 return 0; <- 返回语句 C 程序应该返回一个数值给它的调用者。0 代表程序无误退出;而其它数字的含义 则由系统决定。通常,非零(如-1)代表程序运行中遇到某种错误而退出。 } <- 函数体结束 函数体以闭大括弧 } 结束。 二、详细说明 现在,让我们进一步来了解每一行代码的含义。下面的内容很基础,也很重要,必须认真弄懂,牢牢掌握。 1.#include 预处理指令和头文件 在编译器对我们写的源程序进行编译之前,预处理器会对我们的写的源代码 进行必要的处理,称为预处理。#include 就是一个预处理指令,它命令预处理器 进行的预处理是:把特定的头文件包含到我们的源代码里。 #include #include stdio.h是 C 语言标准中定义了的头文件,它包含着输入输出函数的信息。 所有 C 编译器都应该有这个头文件,这是 ANSI/ISO C 标准中规定的。当然,ANSI/ISO C 规定的编译器必须提供的头文件可不止这么一个。标准还规定了许多 别的头文件,那些我们会在以后慢慢学到。 有些程序需要包含stdio.h,而有些不需要。如果上面这个例子中没有使用 printf函数,那就不需要包含stdio.h。 头文件中包含着编译器进行编译时所需的信息。头文件中可能指明了函数名和 函数调用方法,但是这些函数的实现代码并不在头文件中,而是在预先编译好了的 库文件里。 链接器负责在库文件中寻找我们的程序所需的代码,并且把那些代码和我们写的 程序进行链接,从而将我的写的程序链接成可执行文件。一句话,头文件用于指导 编译器正确地将我们写的源程序编译成可执行文件。 2.main 函数 在 C 语言中,main 函数是主函数。每个 C 程序都必须有且只能有一个 main 函数(主函数)!C 程序从 main 函数开始执行,并且在 main 函数中结束。int是 main 函数的返回值类型,它表明 main 函数应该返回一个整数给程序的 调用者(如操作系统)。 如果您想了解更多关于 main 函数的东西,请点击下面的链接: C/C++ 误区一:void main 3.注释 /* a simple program */ /* */ 之间的内容都是注释。对程序进行适当的注释可以帮助读者(包括您自己) 更快更好地理解您写的代码。注释可以在源程序中的任何地方书写。/* 和 */ 之间的 任何内容(包括 /* 和 */)都会被编译器忽略掉。注意:/ 和 * 必须紧挨在一起,它们之间不能有空格。 /* 我是注释 */ /*我是 跨行注释*/ /* 我也是注释 */ 以上的注释都是合法的;但下面的注释是非法的,因为没写注释结束标记 */。 /* 非法,没有注释结束标记 下面这个注释可能会出乎你的意料: /* 我是注释开始标记 /* 哦哦,我不是注释开始标记 我是注释结束标记,我和第一个 /* 匹配,而不是和第二个 /* 匹配。*/ 上面这个注释中,注释结束标记 */ 和第一个 /* 匹配,它们之间的内容 都被视为注释。 C99 中增加了另外一种注释方式,这种注释方式使用 // 作为注释符,和 // 处于同一行,并且在 // 右边的内容都被当作注释。/ 和 / 之间不能有空格。 // 我是注释 intrigue; //注释放在这里也是合法的 上面的注释在 C99 中是合法的,但是在 C89 中是非法的。也就是说,老旧的 编译器可能不支持 // 注释符。VC6 支持 //,TC2 不支持。 4.大括号与函数体 C 语言中,所有函数都以大括弧({ })作为界定符。函数体从开大括弧 { 开始,以闭大括弧 } 结束。在后续教程中,我会对函数进行更详细的讲解。 5.intnum; 这个语句声明了变量num。这一行末尾的分号(;)表明这一行 是一个语句。;是语句的一部分,单独一个;也是一个合法的 C 语句。 int是 C 语言中的一个关键字,它代表 C 语言里的一种基本数据类型:整型。 关键字是语言的保留字,不能用作其它用途。例如:我们不能关键字来做变量名或者 函数名。 标识符是指我们为变量或函数等取的名字。在这个语句中,num就是标识符。 C 语言中,所有变量在使用前都必须声明。C89 中,变量的声明必须位于 函数体或者程序块的开端。例如: int main(void)/* C89 */ { /* 函数体开始 */ int doors;int dogs;doors = 5;dogs = 3; { /* 程序块开始 */ int dig;int dug;dig = 6;dug = 8; } /* 程序块结束 */ return 0; } /* 函数体结束 */ 而在 C99 中,声明可以位于函数体或者程序块的任何地方。但是,变量仍然 需要在声明之后才可使用。例如: int main(void)/* C99 */ { /* 函数体开始 */ int doors;doors = 5; { /* 程序块开始 */ int dig;dig = 6;int dug;dug = 8; } /* 程序块结束 */ int dogs;dogs = 3; return 0; } /* 函数体结束 */ 上面的程序在 C99 中是合法的,但是在 C89 中却是非法的。当前支持C99 的 编译器不多,所以上面的代码您的编译器很有可能编译不了。故而,为了使我们的 代码具有良好的可移植性,我们应该尽可能少用,甚至不用 C99 中的新特性。 6.赋值 num = 1;赋值是 C 语言中的一种基本操作。上面的语句是一个赋值语句,它的含义 是:将 1 赋值给变量num。赋值操作完成后,num的值等于 1。 7.printf函数 printf(“This is a simple C program.”);printf(“My favorite number is %d because it is first.”, num); 这两行代码都调用了printf函数。printf是一个标准 C 函数,也就是说,它是 C 语言标准函数库里定义了的函数。圆括号()表明printf是一个函数,圆括号里的内容会被传递给printf函数。例如,上面第一行代码把“This is a simple C program.”(不包括双引号)传递给printf函数,然后由printf 函数把这些信息显示于显示器。是换行符,它提示printf开始新的一行。正因为是换行符,所以不会显示出来,而是进行了换行。如果上面的语句中 没有,那就不会换行。 上面代码第二行中的 %d 告诉printf用num的值替换掉 %d,并且以 整数形式显示num的值。 %d 被称为占位符,它告诉printf应该在什么地方显示num的值。% 用于 提醒printf在此处显示一个变量的值(本例中是num的值);d 告诉printf以 十进制整数的形式显示num的值。 8.return(返回)语句 return 0;这个 return 语句是我们程序中的最后一个语句。int main(void)中的int 表示 main 函数应该返回一个整数,所以我们要使用 return 语句来返回一个整数。如果您想了解更多关于返回值的东西,请点击下面链接,查看文章的第四点。 C/C++ 误区一:void main 上面所说的某些内容您暂时可能还不太理解,但是不用害怕,牢牢地把它们记住,然后继续往下学吧!随着学习的深入,就会逐渐搞明白。现阶段只要有这个概念就足够了。 C语言程序实例讲解(二)首先请看以下代码,并且和我们的第一个 C 程序比较比较,看看这个程序新增了什么知识点。 /* meter2centimeters.c--以厘米为单位来表示两米 */ #include int main(void){ int meters, centimeters;meters = 2; centimeters = 100 * meters;/* 100 乘以 meters */ printf(“%d-meter is equal to %d centimeters.”, meters, centimeters);printf(“Yes, I said %d centimeters!”, 100 * meters); return 0;} 下面我们来仔细分析这个小程序。 1.文档 这段代码头部的注释标明了文件名和程序的作用,我们把这些注释称为文档。写文档是一个很好的习惯,可以帮助我们了解程序的作用。在由多个源文件组成的程序中,文档显得更为重要。由于我们目前为止所写的都是很简单的程序,您也许还不觉得写文档有多大的作用,甚至还觉得浪费时间。但是我们应该养成写文档的习惯,这对我们以后写复杂的程序很有帮助。对于复杂程序,我们应该尽可能把文档写得更详尽。可以参考以下格式: /*************************************************** * 文件名: meter2centimeters.c * 作者:Antigloss at http://stdcpp.cn * 编写日期: 05-9-9 0:00 * 最后修改日期: 05-9-9 0:00 * 功能:以厘米为单位来表示两米 * 算法: 1 米 = 100 厘米 **************************************************/ 2.多重声明 int meters, centimeters;上面那句声明语句声明了两个变量。我们可以在一句声明语句中声明任意数目的变量,只要变量名之间用逗号(,)隔开就可以了。例如下面这个语句声明了 4 个变量。int a, b, c, d; 3.乘法运算 C 语言中,* 是乘法运算符,所以 centimeters = 100 * meters;的意思是:用 100 乘以变量 meters 的值(本例中为 2),然后把相乘的结果赋值给变量 centimeters。 4.printf函数 printf(“%d-meter is equal to %d centimeters.”, meters, centimeters);上面这个语句中占位符 %d 出现了两次。第一个 %d 由变量 meters 的值替换;而第二个 %d 则由 centimeters 的值替换。注意:每个变量由逗号(,)隔开;“%d-meter is equal to %d centimeters.” 中的双引号是必须的,而且必须是英文的双引号,不能是中文的双引号。printf(“Yes, I said %d centimeters!”, 100 * meters);上面这个语句表明,用于替换占位符的不仅仅可以是变量,也可以是表达式(100 * meters 是一个乘法表达式)。 本程序出自 谭浩强主编。崔武子 等编著的《C语言程序设计》一书的第159页。 #include main(){ int num=0; int cnum[20]={0},cmoney[20]={0},cbalance[20]={0},flag[20]={0}; char choose=' '; menu(); while(1) { printf(“nnnn”); printf(“ntt||--------||”); printf(“ntt||----------Please input(0-8)------------||”); printf(“ntt||--------||”); printf(“ntt| 1.Add new Card |”); printf(“ntt| 2.Logout Card |”); printf(“ntt| 3.Modify Card |”); printf(“ntt| 4.Read card |”); printf(“ntt| 5.Save money |”); printf(“ntt| 6.Stat.max money |”); printf(“ntt| 7.Display |”); printf(“ntt| 8.Delete Data File |”); printf(“ntt| 0.Exit |”); printf(“ntt|----------|”); printf(“ntt”); scanf(“%c”,&choose); switch(choose) { case'1':addnew(cnum,cmoney,cbalance,flag,&num); break; case'2':logout(cnum,cmoney,cbalance,flag,&num); break; case'3':modify(cnum,cmoney,cbalance,flag,num); break; case'4':readcard(cnum,cmoney,cbalance,flag,num); break; case'5':savemoney(cnum,cmoney,cbalance,flag,num); break; case'6':statmax(cnum,cmoney,cbalance,num); break; case'7':displayall(cnum,cmoney,cbalance,flag,num); break; case'8':printf(“ntYou select 8```”); getch(); break; case'0':exitout(); break; default:printf(“ntYou input error.Please input again.”); getch(); } } } void menu(){ clrscr(); printf(“ntt||=======================================||”); printf(“ntt||--------||”); printf(“ntt||-------------Welcome-------------------||”); printf(“ntt||----------use bus traffic--------------||”); printf(“ntt||--------------Card---------------------||”); printf(“ntt||--------||”); printf(“ntt||=======================================||”); getch();} void addnew(int *pnum,int *pmoney,int *pbalance,int *pflag,int *num){ int i=0,cardnumber=0,cardmoney=0; for(i=0;i<*num;i++) if(pflag[i]==1) break; cardnumber=i; printf(“ntHow much money you want to save in your card”); scanf(“%d”,&cardmoney); *(pnum+cardnumber)=cardnumber+1; *(pmoney+cardnumber)=cardmoney; *(pbalance+cardnumber)=cardmoney; *(pflag+cardnumber)=0; if(cardnumber==*num) (*num)++; printf(“nt|--%5d--|--%5d--|--%5d--|”,*(pmoney+i),*(pbalance+i)); getch();} void logout(int *pnum,int *pmoney,int *pbalance,int *pflag,int *num){ int f=0,cardnumber=0; char choose=' '; printf(“ntPlease input your card number:”); scanf(“%d”,&cardnumber); f=findcard(pnum,pflag,cardnumber,*num); if(f==-1) { printf(“ntNo find the card.”); getch(); } else { printf(“ntReturu you balance money:%d.”,*(pbalance+f)); do { printf(“nntAre you sure logout the card(y/n)?”); scanf(“%c”,&choose); } while(choose!='y' && choose!='y' && choose!='N' && choose!='n'); if(choose=='y' || choose=='y') { *(pmoney+f)=0; *(pbalance+f)=0; *(pflag+f)=1; } } } int findcard(int *pnum,int *pflag,int cardnumber,int num){ int i=0; for(i=0;i if(pnum[i]==cardnumber && pflag[i]!=1) return i; return-1; } void modify(int *pnum,int *pmoney,int *pbalance,int *pflag,int num){ int f=0,cardnumber=0,cardmoney=0,balance=0; char choose=' '; printf(“ntPlease input card number that you want to modify:”); scanf(“%d”,&cardnumber); f=findcard(pnum,pflag,cardnumber,num); if(f==-1) { printf(“ntNo find the card.”); getch(); } else { while(1); { clrscr(); printf(“ntt------------”); printf(“ntt please input modify Item ”); printf(“ntt------------”); printf(“ntt------------1.save money------------------”); printf(“ntt------------2.balance money---------------”); printf(“ntt------------3.Return----------------------”); printf(“ntt------------”); scanf(“%c”,&choose); switch(choose) { case'1': printf(“ntPlease input new save money:”); scanf(“%d%”,&cardmoney); *(pbalance+f)+=cardmoney-*(pmoney+f); *(pmoney+f)=cardmoney; break; case'2': printf(“ntPlease input new balance money:”); scanf(“%d%”,&balance); *(pbalance+f)=balance; break; case'3': break; default: printf(“ntInput error, Please input again!”); getch(); continue; } } } } void readcard(int *pnum,int *pmoney,int *pbalance,int *pflag,int num){ int f=0,ticket=0,symbol=0,stops=0,cardnumber=0; printf(“ntPlease input your card number:”); scanf(“%d”,&cardnumber); if(f==-1) { printf(“ntNo find the card.”); getch(); } else { while(symbol==0) { printf(“ntHow many you want to take bus stops:”); scanf(“%d”,&stops); if(stops<1||stops>30) { printf(“ntInput error.Please input again.”); getch(); } else if(stops<=10) { ticket=1; symbol=1; } else if(stops<=15) { ticket=2; symbol=1; } else if(stops<=20) { ticket=3; symbol=1; } else if(stops<=25) { ticket=4; symbol=1; } else if(stops<=30) { ticket=5; symbol=1; } } if(*(pbalance+f)>=ticket) { printf(“ntBefore:”); printf(“cnum:%5d cmoner:%5d cbalance:%5d”,*(pnum+f),*(pmoney+f),*(pbalance+f)); *(pbalance+f)-=ticket; printf(“ntAfter:”); printf(“cnum:%5d cmoner:%5d cbalance:%5d”,*(pnum+f),*(pmoney+f),*(pbalance+f)); getch(); } else { printf(“ntYour card balance money is not enough.Please use cash.”); getch(); } } } void savemoney(int *pnum,int *pmoney,int *pbalance,int *pflag,int num){ int f=0,cardnumber=0,cardmoney=0; printf(“ntPlease input your card number:”); scanf(“%d”,&cardnumber); f=findcard(pnum,pflag,cardnumber,num); if(f==-1) { printf(“ntNO find the card.”); getch(); } else { do { printf(“ntPlease input you want to save money in the card:”); scanf(“%d”,&cardmoney); if(cardmoney<=0) printf(“ntInput error.Please input again.”); }while(cardmoney<=0); *(pmoney+f)=cardmoney; *(pbalance+f)+=cardmoney; printf(“ntYour card have already saved money:%5d.”,cardmoney); printf(“ntcnum:%5d cmoney:%5d cbalance:%5d”,*(pnum+f),*(pmoney+f),*(pbalance+f)); getch(); } } void statmax(int *pnum,int *pmoney,int *pbalance,int num){ int i=0,maxindex=0; maxindex=0; for(i=1;i if(*(pmoney+maxindex)<*(pmoney+i)) maxindex=i; printf(“ntMax save money is:%d.”,*(pmoney+maxindex)); printf(“ntcnum:%5d cmoney:%5d cbalance:%5d”,*(pnum+maxindex),*(pmoney+maxindex),*(pbalance+maxindex)); getch();} void displayall(int *pnum,int *pmoney,int *pbalance,int *pflag,int num){ int i=0; clrscr(); printf(“nt|--------|”); printf(“nt|--Cardnum--|--Savvemoney--|--Balance--|”); for(i=0;i { if(*(pflag+i)==1) continue; else { printf(“nt|-----------------------------|”); printf(“nt|--%5d--|--%5d--|--%5d--------|”); *(pnum+i),*(pmoney+i),*(pbalance+i); if((i+1)%10==0) { getch(); printf(“Press any key to go on...”); } } } printf(“nt|--|”); getch();} void exitout(){ char choose=' '; do { printf(“ntAre you sure exit(y/n):”); scanf(“%c”,&choose); }while(choose!='Y' && choose!='y' && choose!='N'&&choose!='n'); if(choose=='Y'||choose=='y') exit(0);} C语言高级编程及实例分析 第一章:内存管理 c语言对程序精心编译时,将函数中命令、语句编译成相应序列的机器指令代码,放在代码段;将已初始化的数据,如已赋值的全局变量、静态局部变量等,放在数据段;将未初始化的数据放在BBS段内;将临时数据,如函数调用时传递的参数、局部变量、返回调用时的地址等放在栈段内;而对一些动态变化的数据,如在程序执行中建立的一些数据结构,如链表,动态数组等,则放在堆结构中。 内存管理系统是操作系统的重要部分。C语言中使用malloc()函数和free()函数来分配和释放内存。再次释放已经释放的内存和释放未被分配的内存都会造成系统的崩溃。 1.1.1 PC存储器结构 PC机存储器结构分为主存储器、外存储器和高速缓存几个部分。 1.1.4 内存编译模式 编译模式是指如何在内存中放置程序代码及数据,如何分配堆栈,并确认占用的内存大小及如何存取它们,当指定内存模式以后,语言编译程序将按事先选择好的内存模式编译组织程序。C语言提供了6种编译模式,分别是:微模式,小模式,紧凑模式,中模式,大模式和巨模式。 1.1.5 堆概念和结构 堆是一种动态的存储结构(存储链表,动态数组等),实际上就是数据段的自由存储区。 1.1.6 堆管理函数 1.malloc()函数 用来分配内存。函数原型为void *malloc(unsigned size) 如:int *p; P=(int*)malloc(sizeof(int)); 如果要分配100个int型的空间时,表示为:int*p=(int*)malloc(sizeof(int)); 2.free()函数 用来释放内存。函数原型为void *free(指针变量) 如:int *p=(int *)malloc(4); *p=100; free(p); 3.realloc()函数 用来重调空间的大小,函数声明为:void *realloc(void *block,int size); block是指向要扩张或缩小的内存空间的指针。Size指定新的大小。 4.calloc()函数 用来分配一个能容纳n个元素,每个元素长度为size的内存空间。函数声明为void *calloc(size_t nelem,size_t elsize)。该函数将分配一个容量为nelem *size大小的空间,并用0初始化该内存区域,即每个地址装入0.该函数将返回一个指向分配空间的指针。如果没有空间可用,则返回NULL指针。若在大数据模式下建立远堆,则可用farmalloc函数。 1.2.2 函数剖析函数init_Heap() 实现了初始化内存分配程序的功能 2函数My_Free() 完成函数释放内存的功能函数Allocate() 实现了分配按指定大小分配内存块的功能 第三章:文件高级操作 字符型(文本型)文件和二进制文件{有什么区别?} 标准库函数 ①文件打开(fopen) 函数原型FILE *fopen(char *filename,char *mode) ②文件关闭(fclose) 函数原型int *fclose(FILE *fp) 字节(字符)读写函数fgetc和fputc 字符串读写函数fgets和fputs 数据块读写函数 fread和fwrite 格式会读写函数 fscanf和fprint ①字符串读函数fgets Char *fgets(char *s,int n,FILE *filepointer); ②字符串写函数fputs Int fputs(char *s,FILE *filepointer) ③数据块读函数fread Unsigned fread(void *ptr,unsigned size,unsigned n,FILE *filepointer)④数据块写函数fwrite Unsigned fwrite(void *ptr,unsigned size,unsigned n,FILE filepointer) ①格式化读fscanf Int scanf(FILE *filepointer,const char *format,[&a,&b,...]) ②格式化写fprintf Int fprintf(FILE *filepointer,const char *format,[表达式列表,...]); 文件定位操作 ①rewind函数 函数原型:void rewind(FILE *filepointer); 功能:将filepointer所指向的文件的位置指针重新置回到文件的开头 ②fseek函数 函数原型:int fseek(FILE *fp,long offset,int whence) 功能:whence 基准点;offset从基准点开始移动的字节数; ③ftell函数 函数原型:long ftell(FILE *filepointer); 功能:返回文件的当前位置; ④feof函数 原型:int feof(FILE *fp); 功能:判断fp所代表的文件是否结束 Stdin 标准输入(键盘) Stdout 标准输出(显示器) Stdaux 标准辅助输入输出(异步串行口) Stdprn 标准打印(打印机) Stderr标准错误输出(显示器) 简单的来说,++i 和 i++,在单独使用时,就是 i=i+1。而 a = ++i,相当于 i=i+1;a = i; 而 a = i++,相当于 a = i;i=i+1;第二篇:SQL语言与实例
可以把 SQL 分为两个部分:数据操作语言(DML)和 数据定义语言(DDL)。SQL(结构化查询语言)是用于执行查询的语法。但是 SQL 语言也包含用于更新、插入和删除记录的语法。查询和更新指令构成了 SQL 的 DML 部分:
SELECT更新数据库表中的数据 DELETE向数据库表中插入数据
SQL 的数据定义语言(DDL)部分使我们有能力创建或删除表格。我们也可以定义索引(键),规定表之 间的链接,以及施加表间的约束。SQL 中最重要的 DDL 语句:
CREATE DATABASE修改数据库 CREATE TABLE变更(改变)数据库表 DROP TABLE创建索引(搜索键) DROP INDEX-删除索引
注释:SQL 语句对大小写不敏感。SELECT 等效于 select。
SQL SELECT 实例
如需获取名为 “LastName” 和 “FirstName” 的列的内容(从名为 “Persons” 的数据库表),请使用类似这样的 SELECT 语句: SELECT LastName,FirstName FROM Persons
SQL SELECT * 实例
现在我们希望从 “Persons” 表中选取所有的列。请使用符号 * 取代列的名称,就像这样: SELECT
*
FROM Persons
提示:星号(*)是选取所有列的快捷方式。
SQL SELECT DISTINCT 语句
在表中,可能会包含重复值。这并不成问题,不过,有时您也许希望仅仅列出不同(distinct)的 值。关键词 DISTINCT 用于返回唯一不同的值。语法: SELECT DISTINCT 列名称 FROM 表名称
SELECT DISTINCT Company FROM Orders 使用 WHERE 子句
如果只希望选取居住在城市 “Beijing” 中的人,我们需要向 SELECT 语句添加 WHERE 子句: SELECT * FROM Persons
WHERE City='Beijing'
引号的使用
请注意,我们在例子中的条件值周围使用的是单引号。SQL 使用单引号来环绕文本值(大部分数据库系统也接受双引号)。如果是数值,请不要使用引号。文本值: 这是正确的: SELECT * FROM Persons WHERE 这是错误的: SELECT * FROM Persons WHERE
FirstName='Bush' FirstName=Bush
数值: 这是正确的: SELECT * FROM Persons WHERE 这是错误的: SELECT * FROM Persons WHERE
Year>1965 Year>'1965'
AND 运算符实例
使用 AND 来显示所有姓为 “Carter” 并且名为 “Thomas” 的人: SELECT * FROM Persons WHERE FirstName='Thomas'
AND
LastName='Carter'
OR 运算符实例
使用 OR 来显示所有姓为 “Carter” 或者名为 “Thomas” 的人: SELECT * FROM Persons WHERE firstname='Thomas'
OR
lastname='Carter'
结合 AND 和 OR 运算符
我们也可以把 AND 和 OR 结合起来(使用圆括号来组成复杂的表达式): SELECT * FROM Persons WHERE
(FirstName='Thomas' OR
FirstName='William')
LastName='Carter'
ORDER BY 语句
ORDER BY 语句用于根据指定的列对结果集进行排序。ORDER BY 语句默认按照升序对记录进行排序。如果您希望按照降序对记录进行排序,可以使用 DESC 关键字
实例 1
以字母顺序显示公司名称:Orders 表 SELECT Company, OrderNumber FROM Orders
ORDER BY Company
实例 2
以字母顺序显示公司名称(Company),并以数字顺序显示顺序号(OrderNumber): SELECT Company, OrderNumber FROM Orders
ORDER BY Company, OrderNumber
实例 3
以逆字母顺序显示公司名称: SELECT Company, OrderNumber FROM Orders
ORDER BY Company DESC
实例 4
以逆字母顺序显示公司名称,并以数字顺序显示顺序号: SELECT Company, OrderNumber FROM Orders
ORDER BY Company DESC,
OrderNumber ASC
INSERT INTO 语句
INSERT INTO 语句用于向表格中插入新的行。语法 INSERT INTO 表名称 VALUES(值 1, 值 2,....)我们也可以指定所要插入数据的列: INSERT INTO table_name(列 1, 列 2,...)VALUES(值 1, 值 2,....)
插入新的行
“Persons” 表: LastName Carter SQL 语句: INSERT INTO Persons VALUES('Gates', 'Bill', 'Xuanwumen 10', 'Beijing')FirstName Thomas Address Changan Street City Beijing
结果: LastName Carter Gates FirstName Thomas Bill Address Changan Street Xuanwumen 10 City Beijing Beijing
在指定的列中插入数据
“Persons” 表: LastName Carter Gates SQL 语句: INSERT INTO Persons(LastName, Address)VALUES('Wilson', 'Champs-Elysees')FirstName Thomas Bill Address Changan Street Xuanwumen 10 City Beijing Beijing
结果: LastName Carter Gates Wilson FirstName Thomas Bill Address Changan Street Xuanwumen 10 Champs-Elysees City Beijing Beijing
Update 语句
Update 语句用于修改表中的数据。语法: UPDATE 表名称 SET 列名称 = 新值 WHERE 列名称 = 某值
Person:
LastName Gates Wilson FirstName Bill Address Xuanwumen 10 Champs-Elysees City Beijing
更新某一行中的一个列
我们为 lastname 是 “Wilson” 的人添加 firstname: UPDATE Person SET FirstName = 'Fred' WHERE LastName = 'Wilson'
结果: LastName Gates Wilson FirstName Bill Fred Address Xuanwumen 10 Champs-Elysees City Beijing
更新某一行中的若干列
我们会修改地址(address),并添加城市名称(city): UPDATE Person SET Address = 'Zhongshan 23', City = 'Nanjing' WHERE LastName = 'Wilson'
结果: LastName Gates Wilson FirstName Bill Fred Address Xuanwumen 10 Zhongshan 23 City Beijing Nanjing
DELETE 语句
DELETE 语句用于删除表中的行。
语法 DELETE FROM 表名称 WHERE 列名称 = 值
Person:
LastName Gates Wilson FirstName Bill Fred Address Xuanwumen 10 Zhongshan 23 City Beijing Nanjing
删除某行
“Fred Wilson” 会被删除: DELETE FROM Person WHERE LastName = 'Wilson'
结果: LastName Gates FirstName Bill Address Xuanwumen 10 City Beijing
删除所有行
可以在不删除表的情况下删除所有的行。这意味着表的第三篇:C语言基础知识实例讲解
第四篇:c语言《公交一卡通》实例
第五篇:C语言高级编程及实例剖析