C语言编写小程序

合集下载

vscode配置--编写C语言

vscode配置--编写C语言

vscode配置--编写C语⾔⼀、前⾔:使⽤vscode编写单页⾯的⼩程序还是很⽅便的,但是,它不是集成开发环境,编写相应的程序,⽐如C语⾔,需要安装对应的插件和扩展,配置起来相对⽐较⿇烦⼀些,但是⽤熟练了就⾮常好⽤,⽆论是调试还是编码,vscode都相当强⼤,毕竟是微软的玩意,下边总结⼀下:如何使⽤vscode来编写C语⾔。

1:2:然后对vscode进⾏汉化(看个⼈习惯,我这⾥汉化了⼀下),在vscode的左⽅功能列表中,可以找到 Extensions,点选后输⼊ “Chinese”即可搜寻到中⽂的相关语系,选择中⽂(繁体)后页⾯的右⽅即会出现相关介绍,此时按下 “Install” 就会安装中⽂语系套件。

3:安装后系统会⾃动跳出是否切换成该语系,让你重新启动,按下 ResStart now后就会套⽤成中⽂版啰~如下:不过⼈⽣中最怕的就是那个 “But”,如果没有⾃动跳出右下⽅的提⽰该如何切换呢?另外 VSCode 如果更新时,可能也会再次切换为英⽂版,这时候就需要⼿动切换语系。

⼿动切换流程也并不复杂,可使⽤以下三个步骤⼿动切换1:按下 ctrl + shift + P(Mac 版请按下 cmd + shift + P)2:输⼊ display language 就会跳出 “Configure Display Language”3:选择安装的语系 “zh-tw” 即可安装然后开始进⼊主题,在桌⾯新建⼀个⽂件夹,取名为:ZZULIOJ,然后进⼊该⽂件夹,对着资源管理器⾥的路径进⾏cmd,输⼊:code . (后边的点别忘了)如下:这个时候,vscode就默认打开该⽂件夹,进⼊到环境当中了,如下:在左边可以再新建⽂件夹,或者⼀些⽂件等等...接下来安装编写C语⾔需要的插件和配置环境变量,如下1:⾸先在vscode⾥安装两个扩展,分别是C/C++和code runnne2:然后接着下载MinGW,解压到相应盘中(我这⾥解压到了D盘)然后配置环境变量,环境变量的配置我这⾥配置了两个,⼀个就是在系统环境变量中原有的path后边加上解压后的MinGW的路径,即到bin的路径(我的是:D:\MinGW\bin),还有⼀个是INCLUDE环境变量,⾸先检查⾃⼰的系统环境变量⾥有没有INCLUDE,如果没有就新建⼀个,然后把mingw的include路径加进去,(我的是:D:\MinGW\include),然后打开cmd,在窗⼝⾥输⼊gcc -v,如下:即成功了3:然后创建配置⽂件,我们需要创建三个json⽂件,分别是:launch.json,task.json,setting.json⾸先创建task.json。

飞行棋游戏程序C语言代码

飞行棋游戏程序C语言代码

#include "stdio.h"#include "windows.h"#include "conio.h"#include "stdlib.h"#include "time.h"void restart(int map[100]){intm[100]={100,0,0,0,0,2,1,0,0,3,0,0,0,2,0,0,0,2,0,0,4,0,0,1,0,4,0,3,0,0,0,0,0,2,0,0,0,0,2,0,1,0,0,0,0,4, 0,0,0,0,2,0,0,0,0,1,0,0,0,0,3,0,0,4,2,0,0,0,0,1,0,0,4,0,0,0,0,0,0,0,2,0,0,1,0,0,0,0,4,0,4,0,0,3,2,0,0,0, 0,0 };/*这里是地图代码*/int i;FILE * fp = fopen("map.txt","r");if(fp != 0){printf("找到地图。

尝试加载地图……");for(i=0;i<100;i++){fscanf(fp,"%d",&map[i]);if(map[i] != 0 && map[i] != 1 && map[i] != 2 && map[i] != 3 && map[i] != 4 && map[i] != 10 && map[i] != 20 && map[i] != 100){map[i]=m[i];}}fclose(fp);}else{printf("未找到地图。

加载默认地图中……");for(i=0;i<100;i++)map[i]=m[i];}printf("地图加载完成");Sleep(500);}/*用来给map数组赋值*/ /*用来输出游戏规则*//*用来输出地图*/void printmap(int map[]){int i=0,j=1;printf("'∷'是平地,'¤'是幸运罗盘,'★'是地雷,'■'是暂停,'〓'是时空隧道\n");printf("\n");for(i=0;i<31;i++){switch(map[i]){case 0:printf("∷");break;case 1:printf("¤");break;case 2:printf("★");break;case 3:printf("■");break;case 4:printf("〓");break;case 10:printf("A");break;case 20:printf("B");break;case 100:printf("@@");break;}}printf("\n");for(;i<35;i++){switch(map[i]){case 0:printf("∷\n");break; case 1:printf("¤\n");break; case 2:printf("★\n");break; case 3:printf("■\n");break; case 4:printf("〓\n");break; case 10:printf("A\n");break; case 20:printf("B\n");break; }}for(;i<66;i++){switch(map[66-(j++)]){case 0:printf("∷");break;case 1:printf("¤");break;case 2:printf("★");break;case 3:printf("■");break;case 4:printf("〓");break;case 10:printf("A");break;case 20:printf("B");break;}} printf("\n");for(;i<69;i++){switch(map[i]){case 0:printf("∷\n");break;case 1:printf("¤\n");break;case 2:printf("★\n");break;case 3:printf("■\n");break;case 4:printf("〓\n");break;case 10:printf("A\n");break;case 20:printf("B\n");break;}}for(;i<100;i++){switch(map[i]){case 0:printf("∷");break;case 1:printf("¤");break;case 2:printf("★");break;case 3:printf("■");break;case 4:printf("〓");break;case 10:printf("A");break;case 20:printf("B");break;case 100:printf("@@");break;}}printf("\n");printf("\n");}/*用来输出地图*//* 拟定双人游戏规则及产生走路动画*/int _flash(int map[],int ss,int *pl,int *pl2,int whatplayer) {int i, t;time_t now,d;char c;printf("%d!",ss);Sleep(100);if(whatplayer==1){for(i=0;i<100;i++){if(map[i]==10){map[i]=0;break;}}for(i=1;i<=ss;i++){system("cls");printmap(map);if(*pl+ss>=99 || *pl2+ss>=99){if(*pl+ss>=99){*pl=99;return 0;}else if(*pl2+ss>=99){*pl2=99;return 0;}}t=map[*pl+i]; map[*pl+i]=10; Sleep(100);system("cls");printmap(map);Sleep(100);map[*pl+i]= t;}Sleep(50);system("cls");*pl=*pl+ss;if(map[*pl]==1){printf("恭喜来到幸运罗盘!\n");printf("请做出选择:\n");printf("按1.和对方骑兵交换位置按2.轰炸对方骑兵(炸退六步) 按其他键: 还是算了\n"); c=getch();switch(c){case '1':printf("嗖嗖嗖............\n");Sleep(500);printf("B: \" 怎么回事??\" \n");Sleep(300); t=*pl;*pl=*pl2;*pl2= t;system("cls");Sleep(50);break;case '2':printf("A: \" 炸弹归来...... \" \n");Sleep(500);printf("B: \" 哎呦喂!\" \n");Sleep(300);map[*pl2]=0;*pl2=*pl2-6;if(map[*pl]==map[*pl2]){Sleep(300);printf("B: \" :-D 哈哈哈哈...踩到了! \" \n");Sleep(800);map[0]=20;map[*pl]=0;*pl=0;system("cls");}if(*pl2<0)*pl2=0;system("cls");Sleep(50);break;}}else if(map[*pl]==2){Sleep(300);printf("A: \" ~~:-( 踩到地雷,气死了......\" \n"); Sleep(50);Sleep(300);map[*pl]=0;*pl=*pl-6;if(map[*pl]==map[*pl2]){Sleep(300);printf("A: \" :-D 哈哈哈哈...踩到了! \" \n"); Sleep(800);map[0]=20;map[*pl2]=0;*pl2=0;system("cls");}if(*pl<0)*pl=0;system("cls");}else if(map[*pl]==3){printf("~~>_<~~ 要停战一局了。

六个简单实用的c++小程序

六个简单实用的c++小程序

阶乘#include<stdio.h>#include<stdlib.h>main(){long int a,b,c;printf("请输入一个正整数:\n");scanf("%d",&a);if (a<=0){printf("Error.\n");system("pause");}b=0;c=1;do{b++;c=b*c;}while(b!=a);printf("%d\n",c);system("pause");}判断质数合数#include<stdio.h>#include<stdlib.h>main(void){int a,b,c;printf("请输入一个大于一的整数:\n");scanf("%d",&a);if (a<=1){printf("Error.\n");system("pause");}b=1;do{b++;c=a%b;}while(c!=0);if (a==b){printf("质数\n");}else{printf("合数\n");}system("pause");}质数表#include<stdio.h> #include<stdlib.h> main(void){int a,b,c;a=1;do{a++;b=1;do{b++;c=a%b;}while(c!=0);if (a==b){printf("%d\n",a);}}while(a!=0); system("pause");}求约数的个数与约数和#include<stdio.h>#include<stdlib.h>main(){int a,b,c,d,e;printf("请输入一个正整数:\n");scanf("%d",&a);if (a<1){printf("Error.\n");system("pause");}else{b=0;d=0;e=0;do{b++;c=a%b;if (c==0){d++;e+=b;}}while(a!=b);printf("约数的个数:%d\n约数和:%d\n",d,e);system("pause");}}表示a~b中含有c的数的个数和c出现的次数#include<stdio.h>#include<stdlib.h>main(void){long int a,b,c,d,e,f,g,h,i,j,k,l,m;printf("请输入三个自然数,表示a~b中含有c的数的个数和c出现的次数:\n");printf("(a<b,c为一位自然数,最多为五位数)\n");scanf("%d,%d,%d",&a,&b,&c);if (a>=b||a<0){printf("Error.\n");system("pause");}if (c>=10||c<0){printf("Error.\n");system("pause");}else{d=0;e=0;do{f=a%10000;g=(a-f)/10000;h=f%1000;i=(f-h)/1000;j=h%100;k=(h-j)/100;l=j%10;m=(j-l)/10;if (g==c){e++;}if (i==c){e++;}if (k==c){e++;}if (m==c){e++;}if (l==c){e++;}if (g==c||i==c||k==c||m==c||l==c){d++;}a++;}while(a!=b+1);printf("a~b中含有c的数的个数:%d\nc出现的次数:%d\n",d,e);system("pause");}}排列组合#include<stdio.h>#include<stdlib.h>int stair(int n){if(n<0){printf("Error\n");return-1;}else if(n<=1)return 1;elsereturn(n*stair(n-1));}main(){int m,n,a,b;printf("请输入两个正整数:\n");printf("第一个数必须大于等于第二个数:\n"); printf("这两个数之间应该用逗号连接:\n"); printf("这两个数表示P a,b= C a,b=\n");scanf("%d,%d",&m,&n);if(m*n<1){printf("Error\n");system("pause");}if(n>m){printf("Error\n");system("pause");}else{a=stair(m)/stair(m-n);b=stair(m)/stair(m-n)/stair(n);printf("P a,b=%d\nC a,b=%d\n",a,b);system("pause");}}。

C语言程序设计-第四章简单计算器小程序-分支程序设计

C语言程序设计-第四章简单计算器小程序-分支程序设计

P1 逻辑运算符 P2

逻辑运算符 P2
课堂练习: 求下面逻辑表达式的值: 2>1 && 4 && 7<3+!0
值为0
等价于((2>1)&&4)&&(7<(3+(!
1 条件运算符和条件表达式 1.2 逻辑运算—逻辑运算的重要规则
a&&b:当a为0时,不管b为何值,结果为0
课堂练习:有下面定义的语句和逻辑表达式: int a=0,b=10,c=0,d=0 a && b && (c=a+10,d=100) 逻辑表达式执行后,a,b,c,d的值各为多少?
任务实现效果演示 例题源代码:switchcalculator.c
相关知识 1. switch语句 2. break语句
1 switch多分支选择结构
❖ 尽管用if…else if结构可以实现多分支,注但意当:分常支量较表多达时式,必程须序是结整构型较、复字杂符。型或枚举类型,不能是 实型表达式,每个case关键字后的常量表达式应互不相同
值为0 等价于i==(k>j),值为1
1 条件运算符和条件表达式 1.2 逻辑运算—逻辑运算符与逻辑表达式
&&(逻辑与)、||(逻辑或)、!(逻辑非)(单目)
逻辑表达式的一般形式:
优先级: 1.由低到高: ||→ && → !; 2.多种运算符一起: = →|| →&& →关系运算符 →算术运算符→ !。
【】 简单计算器小程序:由用户输入运算数和四则运算符(+、-、*、/),输出计算结果。
【】

数值计算C语言常用小程序

数值计算C语言常用小程序

数值计算C语言常用小程序C语言是一种流行的编程语言,广泛应用于计算机科学和软件开发领域。

在数值计算方面,C语言提供了一些常用的函数和技巧,可以帮助我们进行各种数值计算任务。

本文将介绍一些C语言常用的数值计算小程序。

1.求平均数```c#include <stdio.h>int maiint num;int sum = 0;int count = 0;float average;printf("请输入数字: ");while(num != -1)scanf("%d", &num);if(num != -1)sum += num;count += 1;}}average = (float)sum / count;printf("平均值为: %.2f\n", average);return 0;```这个程序会要求用户输入一系列数字,直到输入-1为止。

然后计算这些数字的平均值并输出。

2.求阶乘```c#include <stdio.h>int factorial(int n)if(n == 0)return 1;} elsereturn n * factorial(n-1);}int maiint n;int result;printf("请输入一个正整数: ");scanf("%d", &n);result = factorial(n);printf("%d的阶乘为: %d\n", n, result);return 0;```这个程序会要求用户输入一个正整数,然后使用递归的方式计算该整数的阶乘,并输出结果。

3.求平方根```c#include <stdio.h>#include <math.h>int maidouble num;printf("请输入一个数字: ");scanf("%lf", &num);if(num < 0)printf("无法计算负数的平方根\n");} elsedouble result = sqrt(num);printf("该数字的平方根为: %.2lf\n", result);}return 0;```这个程序会要求用户输入一个数字,然后计算该数字的平方根并输出。

单片机C语言小程序

单片机C语言小程序

单片机C语言小程序#include <at89x51.h>#include <absacc.h>#define V AR XBYTE[0x00] /*V AR为外部位址0000*/#define read 0 /*93c46读取的识别码READ=0*/#define write 2 /*93c46写入的识别码WRITE=2*/#define ewen 4 /*93C46写致能的识别码EWEN=4*/#define ewds 6 /*93C46写除能的识别码EWDS=6*/#define cs INT0 /*93C46 CS接脚=8051 RD P3.2*/#define clk INT1 /*93C46 CLK接脚=8051 WR P3.3*/#define di T0 /*93C46 DI接脚=8051 T1 P3.4*/#define d0 T1 /*93C46 DO接脚=8051 T0 P3.5*/#define LOW 0x49 /*存放测试温度的下限值*/#define HIGH 0x51 /*存放测试温度的上限值*/bit FLAG0=0; /*宣告TIMER0响应旗号*///外接工业专用温度传感器时,目前设置测量温度为0-99度:static const char tab[13]={0x3a,0x53,0x6f,0x8a,0xa3, /*0度,10度,20度,30度,40度*/0xB8,0xC8,0xD5,0xDE,0xE5, /*50度,60度,70度,80度,90度*/0xEA,0xEE}; /*100度,110度*///使用板上AD590温度传感器时,目前设置测量温度为0-99度://static const char tab[13]={0x88,0x8d,0x92,0x97,0x9c, /*0度,10度,20度,30度,40度,*/// 0xa1,0xa6,0xab,0xb0,0xb5, /*50度,60度,70度,80度,90度*/// 0xba,0xc0}; /*100度,110度*/char data1[2];char C,S,k=0;char MEP[7]; /*显示器值存放阵列*///MEP[0]=数码管最低位显示值,温度指示小数点后位//MEP[1]=数码管次低位显示值,温度指示个位数//MEP[2]=数码管高位显示值,温度指示十位数//MEP[3]=数码管最低位显示值,功能显示目前定为1,2,3,4,5//MEP[4]=//MEP[5]=暂放置温度显示值,高4位为温度指示十位数值,低4位为温度指示个位数值//MEP[6]=在温度显示与电压调整副程式中,将测量值C暂存MEP[6]中unsigned char combuf[10];unsigned char ADR46,CH,CL,m,C1,C2; /*ADR46,93C46位址,CH高位元组,CL低*/ int sec,sec1;char ptr=0,ptr1=0x10,psr=0; /*ptr显示器值存放阵MEP[]指标,ptr1显示器扫描指标*/ char count=100,sb=0;void delay (unsigned int value) /*延时副程式*/{while (value!=0) value--; /*10us延时*/}void COMP(); /*宣告比较现在温度与设定温度副程式*/void SET();void disp(); /*宣告设定温度副程式*/void to9346(char c); /*宣告TO93C46副程式*/void SDT46(char c); /*宣告串入副程式*/RDT46(); /*宣告串出副程式*/void clear(void); /*宣告清除按键存放/显示器阵列MEP[]副副程式*/void xch(void); /*宣告按键存放/显示器阵列MEP[]右键滚入副程式*/void sjust(void); /*温度显示慢跳调整副程式*/void temper(); /*宣告温度显示与电压调整副程式*/void UP(); /*宣告温度上升键防抖动副程式*/void UPA(); /*宣告温度设置上升副程式*/void DOWN(); /*宣告温度下降键防抖动副程式*/void DOWNA(); /*宣告温度设置下降副程式*/void FONTION(); /*宣告模式键判断模式副程式*/void buf(); /*宣告从93C46取设定值副程式*/void SA VE(); /*宣告设置存储副程式*///********************************************************main() /*主程式*/{TMOD=0x11; /*TIMER0,TIMER1工作在MODE1*/TH0=(65535-50000)/256; /*设定TIMER0初值,50ms*/TL0=(65536-50000)%256;TH1=(65535-4000)/256; /*设定TIMER1初值,4ms*/TL1=(65536-4000)%256;IE=0x8a; /*TIMER0,TIMER1中断致能*/TR1=1; /*启动TIMER1*/P2_7=1; /*测试用,温度下限指示*/P2_6=1; /*测试用,温度在正常上下限间指示*/P2_5=1; /*测试用,温度上限指示*/buf(); /*从93C46取设定值副程式*/while(1) /*无条件循环*/{P3_1=0;MEP[3]=0xff; /*将模式位置零*/V AR=0x00; /*产生写入信号WR=0,令ADC0804开始转换*/while (P2_0==1); /*侦测ADC0804的接脚INTR=0否?是则转换完成*/S=V AR; /*读取ADC0804资料,存入C*/sjust(); /*温度显示慢跳调整副程式*/temper(); /*呼叫温度显示调整副程式*/MEP[5]=(MEP[2] < <4)|MEP[1];if(P2_4==0) SET(); /*如果模式键P2.4按下,则呼叫SET副程式,否则跳过副程式*/if(MEP[5] <combuf[5]) { P2_7=0; /*如果测试温度小于设定温度下限,等式成立时,则将低温指示打开P2_7=0*/P2_6=P2_5=1; /*关闭指示灯*/}if(MEP[5]> combuf[6]) { P2_5=0; /*如果测试温度大于设定温度上限,等式成立时,则将高温指示打开P2_5=0*/P2_7=P2_6=1; /*关闭指示灯*/}if(combuf[5] <MEP[5])if(MEP[5] <combuf[6]) { P2_6=0; /*如果测试温度介于设定温度上下限之间,则将正常指示打开P2_6=0*/ P2_7=P2_5=1;}} /*跳至while(1),无条件循环*/单片机的C语言轻松入门随着单片机开发技术的不断发展,目前已有越来越多的人从普遍使用汇编语言到逐渐使用高级语言开发,其中主要是以C语言为主,市场上几种常见的单片机均有其C语言开发环境.这里以最为流行的80C51单片机为例来学习单片机的C语言编程技术.本书共分六章,每章一个专题,以一些待完成的任务为中心,围绕该任务介绍C语言的一些知识,每一个任务都是可以独立完成的,每完成一个任务,都能掌握一定的知识,等到所有的任务都完成后,即可以完成C语言的入门工作.第1章C语言概述及其开发环境的建立学习一种编程语言,最重要的是建立一个练习环境,边学边练才能学好.Keil软件是目前最流行开发80C51系列单片机的软件,Keil提供了包括C编译器,宏汇编,连接器,库管理和一个功能强大的仿真调试器等在内的完整开发方案,通过一个集成开发环境( Vision)将这些部份组合在一起.在学会使用汇编语言后,学习C语言编程是一件比较容易的事,我们将通过一系列的实例介绍C语言编程的方法.图1-1所示电路图使用89S52单片机作为主芯片,这种单片机性属于80C51系列,其内部有8K的FLASH ROM,可以反复擦写,并有ISP功能,支持在线下载,非常适于做实验.89S52的P1引脚上接8个发光二极管,P3.2~P3.4引脚上接4个按钮开关,我们的任务是让接在P1引脚上的发光二极管按要求发光.1.1 简单的C程序介绍例1-1: 让接在P1.0引脚上的LED发光./*************************************************平凡单片机工作室Copyright 2003 pingfan's mcustudioAll rights Reserved作者:周坚dddl.c单灯点亮程序*************************************************/图1-1 接有LED的单片机基本电路P1.0EA/VPPVCCXTAL2XTAL1GNDRST+5V+5V+R1E110K10UCY27P27P1KPZ1D8D189×××#include "reg51.h"sbit P1_0=P1^0;void main(){ P1_1=0;}这个程序的作用是让接在P1.0引脚上的LED点亮.下面来分析一下这个C语言程序包含了哪些信息.1)"文件包含"处理.程序的第一行是一个"文件包含"处理.所谓"文件包含"是指一个文件将另外一个文件的内容全部包含进来,所以这里的程序虽然只有4行,但C编译器在处理的时候却要处理几十或几百行.这里程序中包含REG51.h 文件的目的是为了要使用P1这个符号,即通知C编译器,程序中所写的P1是指80C51单片机的P1端口而不是其它变量.这是如何做到的呢打开reg51.h可以看到这样的一些内容:/*-------------------------------------------------------------------------REG51.HHeader file for generic 80C51 and 80C31 microcontroller.Copyright (c) 1988-2001 Keil Elektronik GmbH and Keil Software, Inc.All rights reserved.--------------------------------------------------------------------------*//* BYTE Register */sfr P0 = 0x80;sfr P1 = 0x90;sfr P2 = 0xA0;sfr P3 = 0xB0;sfr PSW = 0xD0;sfr ACC = 0xE0;sfr B = 0xF0;sfr SP = 0x81;sfr DPL = 0x82;sfr DPH = 0x83;sfr PCON = 0x87;sfr TCON = 0x88;sfr TMOD = 0x89; sfr TL0 = 0x8A; sfr TL1 = 0x8B; sfr TH0 = 0x8C; sfr TH1 = 0x8D; sfr IE = 0xA8;sfr IP = 0xB8;sfr SCON = 0x98; sfr SBUF = 0x99; /* BIT Register */ /* PSW */sbit CY = 0xD7; sbit AC = 0xD6; sbit F0 = 0xD5; sbit RS1 = 0xD4; sbit RS0 = 0xD3; sbit OV = 0xD2; sbit P = 0xD0;/* TCON */sbit TF1 = 0x8F; sbit TR1 = 0x8E; sbit TF0 = 0x8D; sbit TR0 = 0x8C; sbit IE1 = 0x8B; sbit IT1 = 0x8A; sbit IE0 = 0x89; sbit IT0 = 0x88;/* IE */sbit EA = 0xAF; sbit ES = 0xAC; sbit ET1 = 0xAB; sbit EX1 = 0xAA; sbit ET0 = 0xA9; sbit EX0 = 0xA8; /* IP */sbit PS = 0xBC; sbit PT1 = 0xBB; sbit PX1 = 0xBA; sbit PT0 = 0xB9; sbit PX0 = 0xB8; /* P3 */sbit RD = 0xB7; sbit WR = 0xB6; sbit T1 = 0xB5;sbit T0 = 0xB4;sbit INT1 = 0xB3;sbit INT0 = 0xB2;sbit TXD = 0xB1;sbit RXD = 0xB0;/* SCON */sbit SM0 = 0x9F;sbit SM1 = 0x9E;sbit SM2 = 0x9D;sbit REN = 0x9C;sbit TB8 = 0x9B;sbit RB8 = 0x9A;sbit TI = 0x99;sbit RI = 0x98;熟悉80C51内部结构的读者不难看出,这里都是一些符号的定义,即规定符号名与地址的对应关系.注意其中有sfr P1 = 0x90;这样的一行(上文中用黑体表示),即定义P1与地址0x90对应,P1口的地址就是0x90 (0x90是C语言中十六进制数的写法,相当于汇编语言中写90H).从这里还可以看到一个频繁出现的词:sfrsfr并标准C语言的关键字,而是Keil为能直接访问80C51中的SFR而提供了一个新的关键词,其用法是:sfrt 变量名=地址值.2)符号P1_0来表示P1.0引脚.在C语言里,如果直接写P1.0,C编译器并不能识别,而且P1.0也不是一个合法的C语言变量名,所以得给它另起一个名字,这里起的名为P1_0,可是P1_0是不是就是P1.0 呢你这么认为,C编译器可不这么认为,所以必须给它们建立联系,这里使用了Keil C 的关键字sbit来定义,sbit的用法有三种:第一种方法:sbit 位变量名=地址值第二种方法:sbit 位变量名=SFR名称^变量位地址值第三种方法:sbit 位变量名=SFR地址值^变量位地址值如定义PSW中的OV可以用以下三种方法:sbit OV=0xd2 (1)说明:0xd2是OV的位地址值sbit OV=PSW^2 (2)说明:其中PSW必须先用sfr定义好sbit OV=0xD0^2 (3)说明:0xD0就是PSW的地址值因此这里用sfr P1_0=P1^0;就是定义用符号P1_0来表示P1.0引脚,如果你愿意也可以起P10一类的名字,只要下面程序中也随之更改就行了.3)main称为"主函数".每一个C语言程序有且只有一个主函数,函数后面一定有一对大括号"{}",在大括号里面书写其它程序.从上面的分析我们了解了部分C语言的特性,下面再看一个稍复杂一点的例子.例1-2 让接在P1.0引脚上的LED闪烁发光/*************************************************平凡单片机工作室Copyright 2003 pingfan's mcustudioAll rights Reserved作者:周坚ddss.c单灯闪烁程序*************************************************/#include "reg51.h"#define uchar unsigned char#define uint unsigned intsbit P10=P1^0;/*延时程序由Delay参数确定延迟时间*/void mDelay(unsigned int Delay){ unsigned int i;for(;Delay>0;Delay--){ for(i=0;iNew Project…"菜单,出现对话框,要求给将要建立的工程起一个名字,这里起名为exam2,不需要输入扩展名.点击"保存"按钮,出现第二个对话框,如图1-2所示,这个对话框要求选择目标CPU(即你所用芯片的型号),Keil支持的CPU很多,这里选择Atmel公司的89S52芯片.点击AT M E L前面的"+"号,展开该层,点击其中的89S52, 然后再点击"确定"按钮,回到主窗口,此时,在工程窗口的文件页中,出现了"Target 1",前面有"+"号,点击"+"号展开,可以看到下一层的"Source Group1",这时的工程还是一个空的工程,里面什么文件也没有,需要手动把刚才编写好的源程序加入,点击"Source Group1"使其反白显示,然后,点击鼠标右键,出现一个下拉菜单,如图1-3所示,选中其中的"Add file to Group"Source Group1",出现一个对话框,要求寻找源文件.双击exam2.c文件,将文件加入项目,注意,在文件加入项目后,该对话框并不消失,等待继续加入其它文件,但初学时常会误认为操作没有成功而再次双击同一文件,这时会出现如图1-4所示的对话框,提示你所选文件已在列表中,此时应点击"确定",返回前一对话框,然后点击"Close"即可返回主接口,返回后,点击"Source Group 1"前的加号,exam3.c文件已在其中.双击文件名,即打开该源程序.1.3 工程的详细设置工程建立好以后,还要对工程进行进一步的设置,以满足要求.首先点击左边Project窗口的Target 1,然后使用菜单"Project->Option for target 'target1'"即出现对工程设置的对话框,这个对话框共有8个页面,大部份设置项取默认值就行了. Target页图1-2 选择单片机型号图1-3 加入文件如图1-5所示,Xtal后面的数值是晶振频率值,默认值是所选目标CPU的最高可用频率值,该值与最终产生的目标代码无关,仅用于软件模拟调试时显示程序执行时间.正确设置该数值可使显示时间与实际所用时间一致,一般将其设置成与你的硬件所用晶振频率相同,如果没必要了解程序执行的时间,也可以不设.Memory Model用于设置RAM使用情况,有三个选择项:Small: 所有变量都在单片机的内部RAM中;Compact:可以使用一页(256字节)外部扩展RAM;Larget: 可以使用全部外部的扩展RAM.Code Model用于设置ROM空间的使用,同样也有三个选择项:Small:只用低于2K的程序空间;Compact:单个函数的代码量不能超过2K,整个程序可以使用64K程序空间;Larget:可用全部64K空间;这些选择项必须根据所用硬件来决定,由于本例是单片应用,所以均不重新选择,按默认值设置.Operating:选择是否使用操作系统,可以选择Keil提供了两种操作系统:Rtx tiny和Rtx full,也可以不用操作系统(None),这里使用默认项None,即不用操作系统.图1-5 设置目标图1-4 重复加入源程序得到的提示OutPut页如图1-6所示,这里面也有多个选择项,其中Creat Hex file用于生成可执行代码文件,该文件可以用编程器写入单片机芯片,其格式为intelHEX格式,文件的扩展名为.HEX,默认情况下该项未被选中,如果要写片做硬件实验,就必须选中该项.工程设置对话框中的其它各页面与C51编译选项,A51的汇编选项,BL51连接器的连接选项等用法有关,这里均取默认值,不作任何修改.以下仅对一些有关页面中常用的选项作一个简单介绍.Listing页该页用于调整生成的列表文件选项.在汇编或编译完成后将产生(*.lst)的列表文件,在连接完成后也将产生(*.m51)的列表文件,该页用于对列表文件的内容和形式进行细致的调节,其中比较常用的选项是"C Compile Listing"下的"Assamble Code"项,选中该项可以在列表文件中生成C语言源程序所对应的汇编代码,建议会使用汇编语言的C初学者选中该项,在编译完成后多观察相应的List文件,查看C源代码与对应汇编代码,对于提高C语言编程能力大有好处.C51页该页用于对Keil的C51编译器的编译过程进行控制,其中比较常用的是"Code Optimization"组,如图1.7所示,该组中Level是优化等级,C51在对源程序进行编译时,可以对代码多至9级优化,默认使用第8级,一般不必修改,如果在编译中出现一些问题,可以降低优化级别试一试.Emphasis是选择编译优先方式,第一项是代码量优化(最终生成的代码量小);第二项是速度优先(最终生成的代码速度快);第三项是缺省.默认采用速度优先,可根据需要更改.图1-6 设置输出文件Debug页该页用于设置调试器,Keil提供了仿真器和一些硬件调试方法,如果没有相应的硬件调试器,应选择Use Simulator,其余设置一般不必更改,有关该页的详细情况将在程序调试部分再详细介绍.至此,设置完成,下面介绍如何编译,连接程序以获得目标代码,以及如何进行程序的调试工作.1.4 编译,连接下面我们通过一个例子来介绍C程序编译,连接的过程.这个例子使P1口所接LED以流水灯状态显示.将下面的源程序输入,命名为exam3.c,并建立名为exam3的工程文件,将exam3.c文件加入该工程中,设置工程,在Target页将Xtal后的值由24.0改为12.0,以便后面调试时观察延时时间是否正确,本项目中还要用到我们所提供的实验仿真板,为此需在Debug页对Dialog DLL对话框作一个设置,在进行项目设置时点击Debug,打开Debug页,可以看到Dialog DLL对话框后的Parmeter:输入框中已有默认值-pAT52,在其后键入空格后再输入-dledkey,如图1-8所示.例1-3 使P1口所接LED以流水灯状态显示/**************************************************; 平凡单片机工作室; ; Copyright 2003 pingfan's McuStudio; All rights Reserved图1-7C51编译器选项;作者:周坚;lsd.c;流水灯程序**************************************************/#include "reg51.h"#include "intrins.h"#define uchar unsigned char#define uint unsigned int/*延时程序由Delay参数确定延迟时间*/void mDelay(unsigned int Delay){ unsigned int i;for(;Delay>0;Delay--){ for(i=0;iBuild target,对当前工程进行连接,如果当前文件已修改,将先对该文件进行编译,然后再连接以产生目标代码;如果选择Rebuild All target files将会对当前工程中的所有文件重新进行编译然后再连接,确保最终生产的目标代码是最新的,而Translate ….项则仅对当前文件进行编译,不进行连接.以上操作也可以通过工具栏按钮直接进行.图1-9是有关编译,设置的工具栏按钮,从左到右分别是:编译,编译连接,全部重建,停止编译和对工程进行设置.编译过程中的信息将出现在输出窗口中的Build页中,如果源程序中有语法错误,会有错误报告出现,双击该行,可以定位到出错的位置,对源程序修改之后再次编译,最终要得到如图1-10所示的结果,提示获得了名为exam3.hex的文件,该文件即可被编程器读入并写到芯片中,同时还可看到,该程序的代码量(code=63),内部RAM的使用量(data=9),外部RAM的使用量(xdata=0)等一些信息.除此之外,编译,连接还产生了一些其它相关的文件,可被用于Keil的仿真与调试,到了这一步后即进行调试.1.5 程序的调试在对工程成功地进行汇编,连接以后,按Ctrl+F5或者使用菜单Debug->Start/Stop Debug Session即可进入调试状态,Keil内建了一个仿真CPU用来模拟执行程序,该仿真CPU功能强大,可以在没有硬件和仿真机的情况下进行程序的调试.进入调试状态后,Debug菜单项中原来不能用的命令现在已可以使用了,多出一个用于运行和调试的工具条,如图1-11所示,Debug菜单上的大部份命令可以在此找到对应的快捷按钮,从左到右依次是复位,运行,暂停,单步,过程单步,执行完当前子程序,运行到当前行,下一状态,打开跟踪,观察跟踪,反汇编窗口,观察窗口,代码作用范围分析,1#串行窗口,内存窗口,性能分析,工具按钮等命令.点击菜单Peripherals,即会多出一项"键盘LED仿真板(K)",选中该项,即会出现如图1-9 有关编译,连接,项目设置的工具条图1-11 调试工具条图1-10 编译,连接后得到目标代码图1-12所示界面.使用菜单STEP或相应的命令按钮或使用快捷键F11可以单步执行程序,使用菜单STEP OVER或功能键F10可以以过程单步形式执行命令,所谓过程单步,是指把C语言中的一个函数作为一条语句来全速执行.按下F11键,可以看到源程序窗口的左边出现了一个黄色调试箭头,指向源程序的第一行.每按一次F11,即执行该箭头所指程序行,然后箭头指向下一行,当箭头指向"mDelay(1000);"行时,再次按下F11,会发现,箭头指向了延时子程序mDelay的第一行.不断按F11键,即可逐步执行延时子程序.如果mDelay程序有错误,可以通过单步执行来查找错误,但是如果mDelay程序已正确,每次进行程序调试都要反复执行这些程序行,会使得调试效率很低,为此可以在调试时使用F10来替代F11,在main函数中执行到mDelay(1000)时将该行作为一条语句快速执行完毕.Keil软件还提供了一些窗口,用以观察一些系统中重要的寄存器或变量的值,这也是很重要的调试方法.以下通过一个对延时程序的延迟时间的调整来对这些调试方法作一个简单的介绍.这个程序中用到了延时程序mDelay,如果使用汇编语言编程,每段程序的延迟时间可以非常精确地计算出来,而使用C语言编程,就没有办法事先计算了.为此,可以使用观察程序执行时间的方法了来解.进入调试状态后,窗口左侧是寄存器和一些重要的系统变量的窗口,其中有一项是sec,即统计从开始执行到目前为止用去的时间.按F10,以过程单步的形式执行程序,在执行到mDelay(1000)这一行之前停下,查看sec的值(把鼠标停在sec 后的数值上即可看到完整的数值),记下该数值,然后按下F10,执行完mDelay(1000)后再次观察sec值,如图1-13所示,这里前后两次观察到的值分别是:0.00040400和1.01442600, 其差值为1.014022s,如果将该值改为124可获得更接近于1s的数值,而当该值取123时所获得的延时值将小于1s,因此,最佳的取值应该是124.图1-12 51单片机实验仿真板1.6 C语言的一些特点通过上述的几个例子,可以得出一些结论:1,C程序是由函数构成的,一个C源程序至少包括一个函数,一个C源程序有且只有一个名为main()的函数,也可能包含其它函数,因此,函数是C程序的基本单位.主程序通过直接书写语句和调用其它函数来实现有关功能,这些其它函数可以是由C语言本身提供给我们的(如例3中的_crol_(…)函数),这样的函数称之为库函数,也可以是用户自己编写的(如例2,3中用的mDelay(…)函数),这样的函数称之为用户自定义函数.那么库函数和用户自定义函数有什么区别呢简单地说,任何使用Keil C语言的人,都可以直接调用C的库函数而不需要为这个函数写任何代码,只需要包含具有该函数说明的相应的头文件即可;而自定义函数则是完全个性化的,是用户根据自己需要而编写的.Keil C提供了100多个库函数供我们直接使用.2,一个函数由两部份组成:(1)函数的首部,即函数的第一行.包括函数名,函数类型,函数属性,函数参数(形参)名,参数类型.例如:void mDelay (unsigned int DelayTime)一个函数名后面必须跟一对圆括号,即便没有任何参数也是如此.(2)函数体,即函数首部下面的大括号"{}"内的部份.如果一个函数内有多个大括号,则最外层的一对"{}"为函数体的范围.函数体一般包括:声明部份:在这部份中定义所用到的变量,例1.2中unsigned char j.执行部份:由若干个语句组成.在某此情况下也可以没有声明部份,甚至即没有声明部份,也没有执行部份,如:void mDelay(){}这是一个空函数,什么也不干,但它是合法的.在编写程序时,可以利用空函数,比如主程序需要调用一个延时函数,可具体延时多少,怎么个延时法,暂时还不清楚,我们可以主程序的框架结构弄清,先编译通过,把架子搭起来再说,至于里面的细节,可以在以后慢慢地填,这时利用空函数,先写这么一个函数,这样在主程序中就可以调用它了.3,一个C语言程序,总是从main函数开始执行的,而不管物理位置上这个main()放在什么地方.例1.2中就是放在了最后,事实上这往往是最常用的一种方式.图1-13 观察sec确定延时时间4,主程序中的mDelay如果写成mdelay就会编译出错,即C语言区分大小写,这一点往往让初学者非常困惑,尤其是学过一门其它语言的人,有人喜欢,有人不喜欢,但不管怎样,你得遵守这一规定.5,C语言书写的格式自由,可以在一行写多个语句,也可以把一个语句写在多行.没有行号(但可以有标号),书写的缩进没有要求.但是建议读者自己按一定的规范来写,可以给自己带来方便.6,每个语句和资料定义的最后必须有一个分号,分号是C语句的必要组成部份.7,可以用/*…..*/的形式为C程序的任何一部份作注释,在"/*"开始后,一直到"*/"为止的中间的任何内容都被认为是注释,所以在书写特别是修改源程序时特别要注意,有时无意之中删掉一个"*/",结果,从这里开始一直要遇到下一个"*/"中的全部内容都被认为是注释了.原本好好的一个程序,编译已过通过了,稍作修改,一下出现了几十甚至上百个错误,初学C的人往往对此深感头痛,这时就要检查一下,是不是有这样的情况,如果有的话,赶紧把这个"*/"补上.特别地,Keil C也支持C++风格的注释,就是用"//"引导的后面的语句是注释,例:P1_0=!P1_0; //取反P1.0这种风格的注释,只对本行有效,所以不会出现上面的问题,而且书写比较方便,所以在只需要一行注释的时候,我们往往采用这种格式.但要注意,只有Keil C支持这种格式,早期的Franklin C以及PC机上用的TC都不支持这种格式的注释,用上这种注释,编译时通不过,会报告编译错误.第2章分支程序设计第一部分课程学习了如何建立Keil C的编程环境,并了解了一些C语言的基础知识,这一部分将通过一个键控流水灯程序的分析来学习分支程序设计.2.1 程序功能与实现硬件电路描述如下:89S52单片机的P1口接有8个LED,当某一端口输出为"0"时,相应的LED点亮,P3.2,P3.3,P3.4,P3.5分别接有四个按钮K1~K4,按下按钮时,相应引脚被接地.现要求编写可键控的流水灯程序,当K1按下时,开始流动,K2按下时停止流动,全部灯灭,K3使灯由上往下流动,K4使灯由下往上流动.下面首先给出程序,然后再进行分析.例2-1:键控流水灯的程序#include "reg51.h"#include "intrins.h"#define uchar unsigned charvoid mDelay(unsigned int DelayTime){ unsigned int j=0;for(;DelayTime>0;DelayTime--){ for(j=0;j2的结果为真,而3<2的结果为假.C语言一共提供了6种关系运算符:"<"(小于),""(大于),">=(大于等于)","=="(等于)和"!="(不等于).用关系运算符将两个表达式连接起来的式子,称为关系表达式.例:a>b,a+b>b+c,(a=3)>=(b=5)等都是合法的关系表达式.关系表达式的值只有两种可能,即"真"和"假".在C语言中,没有专门的逻辑型变量,如果运算的结果是"真",用数值"1"表示,而运算的结果是"假"则用数值"0"表示.如式子:x1=3>2的结果是x1等于1,原因是3>2的结果是"真",即其结果为1,该结果被"="号赋给了x1,这里须注意,"="不是等于之意(C语言中等于用"=="表示),而是赋值号,即将该号后面的值赋给该号前面的变量,所以最终结果是x1等于1.式子:x2=30;DelayTime--)单片机的C语言轻松入门25{ for(j=0;j<125;j++){;}}}在main函数中用mDelay(1000)的形式调用该函数时,延时时间约为1s.如果将该函数中的unsigned int j改为unsigned char j,其他任何地方都不作更改,重新编译,连接后,可以发现延迟时间变为约0.38s.int和char是C语言中的两种不同的数据类型,可见程序中仅改变数据类型就会得到不同的结果.那么int和char型的数据究竟有什么区别呢3.3.1 整型数据1.整型数据在内存中的存放形式如果定义了一个int型变量i:int i=10; /*定义i为整型变量,并将10赋给该变量*/在Keil C中规定使用二个字节表示int型数据,因此,变量i在内存中的实际占用情况如下:0000,0000,0000,1010也就是整型数据总是用2个字节存放,不足部分用0补齐.事实上,数据是以补码的形式存在的.一个正数的补码和其原码的形式是相同的.如果数值是负的,补码的形式就不一样了.求负数的补码的方法是:将该数的绝对值的二进制形式取反加1.例如,-10,第一步取-10的绝对值10,其二进制编码是1010,由于是整型数占。

Linux下简单C语言小程序的反汇编分析

Linux下简单C语言小程序的反汇编分析

Linux下简单C语⾔⼩程序的反汇编分析韩洋原创作品转载请注明出处《Linux内核分析》MOOC课程写在开始,本⽂为因为参加MOOC相关课程⽽写的作业,如有疏漏,还请指出。

选了⼀门Linux内核分析课程,因为阅读内核代码中或多或少要涉及到At&T汇编代码的阅读,所以这⾥写下⼀个对⼀个简单C命令⾏程序的反汇编分析过程,⼀⽅⾯完成作业,另⼀⽅⾯当作练⼿。

下⾯开始:1、编写我们的C语⾔⼩程序这⾥我们使⽤简单的例⼦,代码如下:1 #include <stdio.h>23int exG(int x)4 {5return x + 5;6 }78int exF(int x)9 {10return exG(x);11 }1213int main(void)14 {15return exF(10) + 2;16 }使⽤vim等编辑器写⼊上述代码,保存到main.c,然后使⽤下⾯命令⽣成汇编源⽂件:x86系统:$gcc -S -o main.s main.cx64系统:$gcc -m32 -S -o main.s main.c因为我们这⾥以32位平台为例⼦,所以在x64机器上要加上-m32来使GCC⽣成32位的汇编源⽂件。

2、处理源⽂件执⾏完上述命令后,当前⽬录下就会有⼀个main.s的⽂件,使⽤vim打开,不需要的链接信息[以"."开头的⾏],得到如下汇编代码:1 exG:2 pushl %ebp3 movl %esp, %ebp4 movl 8(%ebp), %eax5 addl $5, %eax6 popl %ebp7 ret8 exF:9 pushl %ebp10 movl %esp, %ebp11 pushl 8(%ebp)12 call exG13 addl $4, %esp14 leave15 ret16 main:17 pushl %ebp18 movl %esp, %ebp19 pushl $1020 call exF21 addl $4, %esp22 addl $2, %eax23 leave24 ret可以看到这个⽂件⾥是GCC帮我们⽣成的汇编代码,这⾥需要说明下AT&T格式和intel格式,这两种格式GCC是都可以⽣成的,如果要⽣成intel格式的汇编代码,只需要加上 -masm=intel选项即可,但是Linux下默认是使⽤AT&T格式来书写汇编代码,Linux Kernel代码中也是AT&T格式,我们要慢慢习惯使⽤AT&T格式书写汇编代码。

C语言程序代码

C语言程序代码

1.编写一个C程序,输入a、b、c三个数,输出其中最大者。

#include "stdio.h"void main(){int paixu(int a,int b,int c);int a1,a2,a3,m;scanf("%d %d %d",&a1,&a2,&a3);m=paixu(a1,a2,a3);printf("%d",m);}int paixu(int a,int b,int c){int max(int x,int y);int m;m=max(a,b);m=max(m,c);}int max(int x,int y){if(x>y) return x;else return y;}依次将10个数输入,要求将其中最大的数打印出来。

#include "stdio.h"void main(){int a[10],i,m;for(i=0;i<10;i++)scanf("%d",&a[i]);m=a[0];for(i=1;i<10;i++)if(a[i]>m){m=a[i];}printf("最大数是:");printf("%d\n",m);}有3个数a、b、c,要求按从大到小的顺序把它们打印出来。

#include "stdio.h"void main(){int a[3];int m,i,j;for(i=0;i<3;i++)scanf("%d",&a[i]);for(i=1;i<3;i++)for(j=0;j<i;j++)if(a[i]>a[j]){m=a[j];a[j]=a[i];a[i]=m;}printf("按由大到小排列:");for(i=0;i<3;i++)printf("%d ",a[i]);}求1+2+3+ (100)#include "stdio.h"void main(){int i,sum=0;for(i=1;i<=100;i++){sum=sum+i;}printf("1+2+3+……+100=%d\n" ,sum);}判断一个数n能否同时被3和5除。

经典C语言程序设计100例C-90-100

经典C语言程序设计100例C-90-100
#include "stdio.h"
main()
{ time_t start,end;
int i;
start=time(NULL);
for(i=0;i<3000;i++)
{ printf("\1\1\1\1\1\1\1\1\1\1\n");}
end=time(NULL);
printf("\1: The different is %6.3f\n",difftime(end,start));
pp: clrscr();
sum=0.0;
gotoxy(1,1);printf("|---------------------------------------------------------------------------|");
gotoxy(1,2);printf("| money management system(C1.0) 2000.03 |");
gotoxy(1,23);printf("|---------------------------------------------------------------------------|");
gotoxy(1,24);printf("| |");
gotoxy(1,25);printf("|---------------------------------------------------------------------------|");
gotoxy(1,12);printf("| cost: ---------- | |");

C语言程序设计 100个小程序代码

C语言程序设计 100个小程序代码

for(i=2;i<=k;i++)
if(x%i==0)break;
3
if(i>k) return(1); else return(0); } main() {int a,s=0,max=0; clrscr(); for(a=200;a<=998;a++) if(prime(a)&&prime(a+2)&&(a+2)>max)max=a+2; s=max+max-2; printf("%d",s); }
int prime(int x)
{ int i,k;
k=sqrt(x);
for(i=2;i<=k;i++)
if (x%i==0) break;
if (i>k) return(1);
else return(0); }
main()
{ int i,s=0;
int prime(int x);
for(i=200;i<=999;i++)
761#include<math.h> int prime(int x) {int i,k; k=sqrt(x); for(i=2;i<=k;i++)
1
if(x%i==0) break; if(i>k) return(1); else return(0); } main() {int a,b,c,i,n=0; clrscr(); for(i=800;i>=300;i--) { a=i/100; b=i%100/10; c=i%10; if((b+c)%10==a&&prime(i)) n++; if(n==1) break;

C#40个小程序

C#40个小程序

1.编一个程序,定义常量Pi=3.,从键盘上输入半径r,求出圆的面积。

const double Pi = 3.;double r,s;("请输入圆的半径");r = ());s = Pi * r * r;("圆的面积是{0}",s);2.编一个程序,定义三个double类型的变量,分别从键盘上输入值给它们,然后用方法把它们输出成一列,小数点对齐,保留3位小数。

double x, y, z;("请输入一个数:");x = ());("请输入一个数:");y = ());("请输入一个数:");z = ());("{0,10:f3}", x);("{0,10:f3}", y);("{0,10:f3}", z);一个程序,从键盘上输入三个数,用三元运算符(? :)把最大数找出来。

float x, y, z, temp;("请输入一个实数:");x = ());("请输入一个实数:");y = ());("请输入一个实数:");z = ());temp = x >= y ? x : y;temp = temp >= z ? temp : z;("最大数为:{0}", temp);4.编一个程序,从键盘上输入三个数,用三元运算符(? :)把最小数找出来。

float x, y, z, temp;("请输入一个实数:");x = ());("请输入一个实数:");y = ());("请输入一个实数:");z = ());temp = x <= y ? x : y;temp = temp <= z ? temp : z;("最大数为:{0}", temp);5.编一个程序,输入一个字符,如果是大写字母,就转换成小写字母,否则不转换。

经典C语言编程30例

经典C语言编程30例

经典C语言源代码30例题目:海滩上有一堆桃子,五只猴子来分。

第一只猴子把这堆桃子凭据分为五份,多了一个,这只猴子把多的一个扔入海中,拿走了一份。

第二只猴子把剩下的桃子又平均分成五份,又多了一个,它同样把多的一个扔入海中,拿走了一份,第三、第四、第五只猴子都是这样做的,问海滩上原来最少有多少个桃子?1.程序分析:2.程序源代码:main(){int i,m,j,k,count;for(i=4;i<10000;i+=4){ count=0;m=i;for(k=0;k<5;k++){j=i/4*5+1;i=j;if(j%4==0)count++;elsebreak;}i=m;if(count==4){printf("%d\n",count);break;}}}【程序81】题目:809*??=800*??+9*??+1 其中??代表的两位数,8*??的结果为两位数,9*??的结果为3位数。

求??代表的两位数,及809*??后的结果。

1.程序分析:2.程序源代码:output(long b,long i){ printf("\n%ld/%ld=809*%ld+%ld",b,i,i,b%i);}main(){long int a,b,i;a=809;for(i=10;i<100;i++){b=i*a+1;if(b>=1000&&b<=10000&&8*i<100&&9*i>=100)output(b,i); }}【程序82】题目:八进制转换为十进制1.程序分析:2.程序源代码:main(){ char *p,s[6];int n;p=s;gets(p);n=0;while(*(p)!='\0'){n=n*8+*p-'0';p++;}printf("%d",n);}【程序83】题目:求0—7所能组成的奇数个数。

c语言实现整蛊朋友小程序(附源码)

c语言实现整蛊朋友小程序(附源码)

c语⾔实现整蛊朋友⼩程序(附源码)前⾔感觉学了c语⾔后仍然⼀⽆是处想要整蛊⼀下朋友仍然不会别慌,看完这篇⽂章,你就会了。

下⾯给⼤家分享两个基础的整蛊⼩程序1.我是猪关机程序2.⽆限弹窗程序⼀、我是猪关机程序效果:运⾏程序后电脑在60s后关机,如果输⼊“我是猪”则取消关机;如果输⼊“你是猪”则⽴即关机;输⼊其他⽂字会提⽰重新输⼊;若强⾏关闭程序电脑仍会关机。

本程序基于控制台,其功能是通过dos命令来实现。

那么就先讲⼀下所⽤到的dos命令(shutdown -s -t 60)1.dos命令(强制关机)shutdown -s -t 60 -c -f各参数的意思:-s 动作为关机-r 为重启-a 为取消关机-t 60 延迟60秒关机-c “想要显⽰的注释”-f 关机时强制关闭所有程序⽽不显⽰任何警告。

标准格式:(shutdown -s -t xx)t xx是关机延时时间 /秒;xx可以是00,直接关机。

注意:可能输⼊命令后,windows提⽰n分钟后关机,但关机时间仍然是设定的时间。

2.源码注意的是,想使⽤cmd命令,需要调⽤库函数<stdlib.h>话不多说,直接源码#include<stdio.h>#include<stdlib.h>#include<string.h>int main(void){char b[10]="我是猪",c[10]="你是猪",a[10];system("shutdown -s -t 60"); //命令关机do{ //判断输⼊的是否为指定的语句printf("如果不想关机,请(只能输⼊这两句话)输⼊我是猪 or 你是猪只给你⼀分钟时间哦\n");scanf("%s",&a);if(strcmp(a,b)==0){ //判断输⼊的语句system("shutdown -a"); //取消关机命令system("cls"); //清屏函数printf("哈哈哈,okok\n");system("pause"); //暂停函数}if(strcmp(a,c)==0){system("pause");printf("我怀疑你在骂我,那我只好给你关机了\n");system("shutdown -s -t 5"); //5s后关机printf("哈哈哈,拜拜\n");system("pause");}}while(strcmp(a,b)!=0&&strcmp(a,c)!=0);return 0;}整蛊朋友前⼀定提醒他保存当前⽂件哦。

C语言经典小程序和C语言编写的小游戏,带注释 (自动保存的)

C语言经典小程序和C语言编写的小游戏,带注释 (自动保存的)

C语言经典小程序和C语言编写的小游戏,带注释1、写一个定时关机的小程序,可以立即关闭计算机,也可以一段时间后关闭计算机。

#include<stdio.h>#include<windows.h>#include<string.h>#include<stdlib.h>int main(){char cmd[20] = "shutdown -s -t ";//远程关机,系统在一定时间之后关机char t[5] = "0";//将输入的时间初始化为0int c;system("title C语言关机程序"); //设置cmd窗口标题system("mode con cols=48 lines=25"); //窗口宽度高度system("color f0"); //可以写成 red 调出颜色组,这里f0是调亮白色system("date /T");//输出系统当前日期system("TIME /T");//输出系统当前时间printf("----------- C语言关机程序 -----------\n");printf("1.实现10分钟内的定时关闭计算机\n");printf("2.立即关闭计算机\n");printf("3.注销计算机\n");printf("0.退出系统\n");printf("-------------------------------------\n");scanf("%d", &c);//对输入的数值进行判断循环switch (c){case 1:printf("您想在多少秒后自动关闭计算机?(0~600)\n");scanf("%s", t);system(strcat(cmd, t)); //将输入的时间连接上已经调用的命令break;case 2:system("shutdown -p");//立即关闭计算机break;case 3:system("shutdown -l");//注销计算机break;case 0:system("pause");break;default:printf("Error!\n");}system("pause");return 0;}2、这是一个简单的猜拳游戏(剪刀、石头、步),让你与电脑对决。

纯C语言编写贪吃蛇(附源码,无EasyX、MFC)

纯C语言编写贪吃蛇(附源码,无EasyX、MFC)

纯C语⾔编写贪吃蛇(附源码,⽆EasyX、MFC)⼤⼀下学期,我所选的C语⾔⼯程实践是写⼀个贪吃蛇游戏。

那⼏天真的挺肝的,完成本专业的答辩之后就没怎么动过这程序了。

那时候写的贪吃蛇,还有⼀个栈溢出的问题没有解决,是因为当时所学知识有限,还没想到较好的解决⽅法。

现在⼤⼆上学期,在上了好⼏节数据结构之后,对栈有了⼀定的了解,随着对栈的学习,我想出了解决我写的贪吃蛇栈溢出的办法。

其实是前两天刚刚有这个想法,刚刚才测试并实现了,办法可⾏。

现在我加⼊了计算机学院的创新开放实验室,打算做的⼀个项⽬是微信⼩程序。

以后想记录⼀下我的开发过程和⼀些经历,⼜刚刚完善好贪吃蛇的代码,就简单记录⼀下吧。

因为代码⽐较长,先把参考资料写⼀下,想⾃⼰⼿写⼀遍的建议先看参考资料,再看这⾥的代码参考资料源代码/*预处理*/#include <windows.h>#include <stdio.h>#include <conio.h>#include <string.h>#include <time.h>/*宏定义*/#define YES 1#define NO 0//蛇的移动⽅向#define U 1 //上#define D 2 //下#define L 3 //左#define R 4 //右#define RESPEED 250 //蛇的移动速度/*定义节点*/typedef struct SNAKE{int x;int y;struct SNAKE* next;}snake;/*全局变量*/snake* head, * food; //蛇头指针,⾷物指针snake* q; //遍历蛇的时候⽤到的指针/*【以下为所有函数的声明】*/void HideCursor(void); //隐藏光标void color(short int num); //颜⾊函数void StartWindow(void); //开始界⾯int gotoxy(int x, int y); //定位光标位置void creatMap(void); //创建地图void notice(int* score, int* highscore, int* Time, int* LongTime); //提⽰void initsnake(void); //初始化蛇⾝int biteself(unsigned long* sleeptime); //判断是否咬到了⾃⼰int createfood(void); //随机出现⾷物void endgame(int* score, int* highscore, int* endgamestatus, int* Time, int* LongTime); //结束游戏void pause(int* PauseBegin, int* PauseEnd); //暂停游戏void gamecontrol(unsigned long* sleeptime, int* count, int* score, int* highscore, int* status, int* endgamestatus,int* Time, int* LongTime, int* TimeBegin, int* TimeEnd, int* TimePause, int* PauseBegin, int* PauseEnd); //控制游戏(包含蛇不能穿墙)void snakemove(unsigned long* sleeptime, int* count, int* score, int* status, int* endgamestatus); //蛇移动void gamestart(int* score, int* highscore, int* endgamestatus, int* Time, int* LongTime, int* TimeBegin); //游戏初始化void gamecontinue(unsigned long* sleeptime, int* count, int* score, int* highscore, int* status, int* endgamestatus,int* Time, int* LongTime, int* TimeBegin, int* TimeEnd, int* TimePause, int* PauseBegin, int* PauseEnd); //再来⼀局void stop(unsigned long* sleeptime); //蛇停⽌移动void start(unsigned long* sleeptime); //蛇恢复移动void reset(int* count, int* score, int* Time, int* TimeBegin, int* TimeEnd, int* TimePause, int* PauseBegin, int* PauseEnd); //重置多项数据void updatescore(int* score, int* highscore, int* Time, int* LongTime); //更新多项数据int main(void){unsigned long sleeptime = RESPEED;int score = 0, highscore = 0, count = 0; //count是记录吃到⾷物的次数int status, endgamestatus = 0; //游戏结束情况,0未开始游戏前退出,1撞到墙,2咬到⾃⼰,3主动退出游戏,4通关HideCursor();gamestart(&score, &highscore, &endgamestatus, &Time, &LongTime, &TimeBegin);gamecontrol(&sleeptime, &count, &score, &highscore, &status, &endgamestatus, &Time, &LongTime, &TimeBegin, &TimeEnd, &TimePause, &Pa useBegin, &PauseEnd);endgame(&score, &highscore, &endgamestatus, &Time, &LongTime);gamecontinue(&sleeptime, &count, &score, &highscore, &status, &endgamestatus, &Time, &LongTime, &TimeBegin, &TimeEnd, &TimePause, &P auseBegin, &PauseEnd);return 0;}void HideCursor(void) //隐藏光标{CONSOLE_CURSOR_INFO cursor_info = { 1, 0 };SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cursor_info);}void color(short int num){HANDLE hConsole = GetStdHandle((STD_OUTPUT_HANDLE));SetConsoleTextAttribute(hConsole, num);}void StartWindow(void){short int i;system("mode con cols=120 lines=30"); //设置窗⼝⼤⼩printf("温馨提⽰:请使⽤键盘操作(⿏标点击可能会导致程序出错)\n");printf("╔═══════════════════════════════════════════════════╗ \n");for (i = 0; i < 26; i++){printf("║ ║ \n");}printf("╚═══════════════════════════════════════════════════╝ \n");gotoxy(23, 2);color(3);printf("贪吃蛇");for (i = 15; ; i--){gotoxy(18, 4);color(i);printf("按任意键加载程序");Sleep(600);if (i == 1){i = 15;}if (kbhit()) //判断是否按键,等待输⼊按键为0,按键为1{break;}}gotoxy(10, 4);printf("1.开始游戏 2.退出游戏");getch();}int gotoxy(int x, int y){HANDLE handle; //定义句柄变量handle,创建⼀个句柄COORD pos; //定义结构体coord (坐标系coord)pos.X = x; //横坐标xpos.Y = y; //纵坐标yhandle = GetStdHandle(STD_OUTPUT_HANDLE); //获取控制台输出句柄(值为-11)SetConsoleCursorPosition(handle, pos); //移动光标return YES;}void creatMap(void){int i;//地图⼤⼩:长24×宽20printf("■");gotoxy(i, 27);printf("■");}for (i = 7; i < 28; i++) //打印左右边框{gotoxy(2, i);printf("■");gotoxy(50, i);printf("■");}}void notice(int* score, int* highscore, int* Time, int* LongTime){system("title 2018051170 Project:贪吃蛇");gotoxy(4, 4);color(15);printf("得分:%3d 最⾼分:%3d ⽣存:%4ds 最久⽣存:%4ds", *score, *highscore, *Time, *LongTime); gotoxy(60, 7);printf("Author: 2018051170 Project: 贪吃蛇");gotoxy(60, 9);printf("游戏说明:");gotoxy(60, 10);printf("不能穿墙,不能咬到⾃⼰");gotoxy(60, 11);printf("↑↓←→控制蛇的移动");gotoxy(60, 12);printf("ESC:退出游戏空格:暂停游戏");}void initsnake(void){int i;snake* tail;tail = (snake*)malloc(sizeof(snake)); //从蛇尾开始,插头法,以x,y设定开始的位置tail->x = 26;tail->y = 14;tail->next = NULL;for (i = 1; i < 3; i++){head = (snake*)malloc(sizeof(snake));head->next = tail;head->x = 26 - 2 * i;head->y = 14;tail = head;}while (tail != NULL) //从头到为,输出蛇⾝{gotoxy(tail->x, tail->y);if (i == 3){color(2);printf("●");i++;}else if (tail != NULL){color(2);printf("■");}tail = tail->next;}}int biteself(unsigned long* sleeptime){snake* self;self = head->next;while (self != NULL){if (self->x == head->x && self->y == head->y)self = self->next;}return NO;}int createfood(void){snake* food_1;food_1 = (snake*)malloc(sizeof(snake));srand((unsigned)time(NULL)); //产⽣⼀个随机数while ((food_1->x % 2) != 0) //保证其为偶数,使得⾷物能与蛇头对其{food_1->x = rand() % 50; //保证其在墙壁⾥X1 < X < X2if (food_1->x <= 4){food_1->x = food_1->x + 4;}}food_1->y = rand() % 27; //保证其在墙壁⾥Y1 < Y < Y2if (food_1->y < 7){food_1->y = food_1->y + 7;}q = head;while (q != NULL) //判断蛇⾝是否与⾷物重合{if (q->x == food_1->x && q->y == food_1->y){free(food_1);return 1;}if (q->next == NULL){break;}q = q->next;}gotoxy(food_1->x, food_1->y);food = food_1;color(3);printf("★");return 0;}void endgame(int* score, int* highscore, int* endgamestatus, int* Time, int* LongTime) {color(15);gotoxy(60, 14);if (*endgamestatus == 0){printf("您退出了游戏。

C语言实用程序设计100例流程图

C语言实用程序设计100例流程图

盛年不重来,一日难再晨。

及时宜自勉,岁月不待人。

C语言实用程序100例第一篇基础与提高实例1利用库函数编写基本显示程序实例2变量属性实例3运算符与类型实例4关于程序结构实例5显示函数曲线图实例6二分法选代的应用实例7多变的立方体实例8 一维整型数组应用(1)实例9 一维整型数组应用(2)实例10 一维整型数组应用(3)实例11 一维整型数组应用(4)实例12二维数组应用(1)――显示杨辉三角实例13二维数组应用(2)――魔方阵实例14字符数组应用(1)――逻辑判断实例15字符数组应用(2)――数据模拟实例16二维数组应用——字符比较实例17利用指针进行数据处理实例18指针与字符串实例19利用指针处理二维数组实例20 一级指针实例21利用指针传递参数值实例22结构体的应用实例23链表的应用(1)实例24链表的应用(2)实例25链表的应用(3)实例26共用体的应用实例27枚举类型应用实例28位运算买例29义件加密实例30文件的按记录随机读写第二篇图形与多媒体实例31改变文字背景色实例32及本颜色设置实例33制作表格实例34制作多样的椭圆实例35美丽的透视图形实例36错位窗口实例37能移动的矩形实例38多变的填充矩形实例39黄黑相间的矩形与圆实例40 六叶图案实例41 特殊图案实例42 国际象棋棋盘实例43 制作楼梯实例44 使用线类型函数设置多个汉字实例45 彩色群点实例46 饼图买例47 产品折线图实例48 直方图实例49 变大变色的拒形与国实例50 多变的填充多边形实例51 流星球实例52 小球动态碰撞买倒53 多,曲线实例54 多变的圆与环实例55 优美的球体实例56 运动的小车实例57 统计动画消失次数实例58 运行的时钟实例59 直升飞机实例60演绎“生命游戏”实例61 猜猜看买例62 艺术清屏买倒63 制作火焰实例64动态绘制256 条不同颜色的直线实例65 红绿蓝三原色渐变第三篇综合小程序实例66 两个矩阵相乘实例67 艺术钟实例68 家庭财务管理小程序实例69 用系统时间实现随机数实例70 闪动的多彩圆实例71 检查系统有无鼠标实例72 圆形光盘与矩形实例73 动态渐变图案实例74 往返两地间的小车实例75 飘扬的红旗实例76 显示蓝天白云图形实例77 百叶窗第四篇计算机等级考试上机试题(二级)第五篇计算机等级考试上机试题(三级)部分流程图实例1实例2实例3s oA II •x A 当toupper(yes)=='Y'时=>count产生随机数:number输入guess值当1<guess<1时«««9fwu寸匡u共享知识分享快乐实例6实例7共享知识分享快乐实例8递归函数hanoi递归调用hanoi(n-1,a,c,b)显示移盘信息move递归调用hanoi(n-1,c,b,a)i=O,j=O当i<N时实例9实例10共享知识分享快乐实例112=>i当i<=n时---------------1=>j当j<i时---------------AAAAAAAAa[i-1][j-1]+a[i-1][j]=>a[i][j]j++实例120=>j 实例131=>a『0]『i]实例14共享知识分享快乐实例150=>i当i<4时0=>i共享知识分享快乐图15-2 流程图实例16共享知识分享快乐当*p!='\0'&&(*p>='0')&&(*p<=9) 时k=*(p++)-48;nu mber=10* nu mber+k;retur n nu mber;实例17实例18实例19共享知识分享快乐0=>i实例20实例22共享知识分享快乐共享知识分享快乐实例23仁>flaghead=>*p当p!=NULL&&flag==1 时p->key==k是否0=>flag p_>n ext=>pflag==0 _ _ 一一^^一否p->co un t++; head=>phead=(struct number *)malloc(LENGTH);head->key=k; head->co un t=1; head->n ext=p;实例24函数newhead=>p1,head=>p2开辟空间:p=(struct stude nt *)malloc(LENGTH);共享知识分享快乐图25-2 流程图实例260=>i当i<N时gets(i nfo[i]. name);sea nf("%d",&in fo[i].age); getchar();in fo[i].sex=getchar();getchar();in fo[i].job=getchar();getchar();根据职业不冋选择单位类型输入数据实例27i=RED当j=RED当j<=BLACK 时另外三种赋值共享知识 分享快乐k =0x 8000;p r i n t f (" %04x (16) \t ",n u m b e r );9 T — Vp r i n t f ("%d ",b i t );\ Knii //p r i n t f ("-");b =n u m b e r > >nf 1 1>牠氐聘«««6CXI匡邸8CXI 匡邸实例30写新记录实例78 k=n *sizeof(struct stude nt);实例79打印x实例81 AAAAAA AA实例82 AAAAAAAA共享知识分享快乐实例83共享知识分享快乐表达式1 x=1实例84实例85定义数组a[11],变量l,h,m及指针变量p输入数据给a[1]到a[10],输入要找的数xl=1 ; h=10 ; p=a实例86实例87共享知识分享快乐实例88 实例89共享知识分享快乐共享知识分享快乐共享知识分享快乐实例93共享知识分享快乐实例94定义整型数组变量a[N1][N2],max,min,i,j,row1,row2,column 1,column2, (*ap)[4]ap=a row1=row2=colu mn 1=colu mn 2=0for( i=0; i<N1;i++)for( j=0; j<N1;j++)任意输入字符串放到二维数组中max=mi n=a[0][0] for( i=0; i<N1;i++)for( j=0; j<N1;j++)打印最大值和最小值及它们所在的行与列共享知识分享快乐实例95实例96for ( n=1; n<=10 ;n++)p=p* ne=e+1.0/p打印输出e的值共享知识分享快乐实例97(1)实例97 ( 2)实例99。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

教你如何使用C语言编写简单小游戏
编辑:匿名发布时间:2011年9月6日留言(0)
纯真童趣的《泡泡堂》,还有武林情仇,笑傲江湖的《剑侠情缘on line》.它是e时代常谈的话题,是交互式娱乐的主力军,是一种高层次的综合艺术,更是一个民族的文化,世界观的全新传播方式.作为游戏玩家的我们,是不是想设计一个属于自己的游戏呢?
爱玩是人的天性,而C语言是我们计算机专业都要学习的一门基础学科.一般来说,是比较枯燥的.那么,我们能不能通过编一些小游戏来提高它的趣味性呢?这样学习程序设计,就不会是一件艰苦,枯燥的事,它变得象电脑游戏一样充满好奇,富有乐趣.
1,总是从Hello,world开始学习编程的第一个程序,一般就是打印一个亲切的词语——"Hell o,world!".让我们来看看这个最简单的C程序:
#incolude<stdio.h>/*把输入输出函数的头文件包含进来*/
int main()
{
printf("Hello,
world!");/*在屏幕上输出字符串"Hello,world!"*/
return0;/*退出main函数,并返回0*/
}
下面我们发现几个值得改进的地方,1,程序的运行结果一闪而过.2,每执行这个程序一次都能看见上次运行留下的字符.3,我们还希望屏幕输出一个笑脸来欢迎我们.让我们来改进一下这个程序吧!
1,在return语句的前面加一句:getch();,表示按任意键结束.2,在printf语句前用clrscr函数清屏,要使用这个函数和getch函数,需要在程序开头再包含头文件conio.h.3,ASCII码也有许多非常好玩的字符,比如ASCII码值为2的就是一个笑脸,我们可以用printf("%c",2)来输出一个笑脸.现在我们把Hello,world程序改成一个更好看的Hello,world了.下面让我们开始做游戏吧!
2,心动的开始,一个运动中的笑脸大家小时侯喜欢看动画片吗?哈哈,我猜你们都喜欢吧!下面就让我们来做一个小动画吧.在屏幕上显示一个运动的小笑脸,而且当它到达屏幕的边缘时会自动弹回来.先在程序定义一个在屏幕中运动的点的结构:
struct move_point
{
int x,y;/*该点的位置,包括x坐标和y坐标*/
int xv,yv;/*该点在x轴,y轴的速度*/
};
运动的原理是,先擦去物体先前的轨迹,让物体按其速度移动一段距离,再画出该物体.让我们看到以下代码:
gotoxy(man.x,man.y);/*把光标移到指定的坐标*/
printf("");/*输出一个空格,把先前的字符擦去*/
然后我们让物体按其速度运动:
man.x+=man.xv;/*水平方向按x轴的速度运动*/
man.y+=man.yv;/*垂直方向按y轴的速度运动*/
运动后还要判断物体是否出界,如果出了界,就令物体反弹,即让它下一刻的速度等于现在的速度的相反数.最后打印出这个笑脸:
gotoxy(man.x,man.y);
printf("%c\b",2);/*输出ASCII码值为2的"笑脸"字符*/
怎么样?是不是很有趣呢?不过这个笑脸一直是自己运动,能不能让我们来控制它运动呢?答案是肯定的,让我们继续往下学吧!
3,交互的实现——让我们来控制笑脸运动
这个程序的主要功能是接受按键,如果接收的是方向键,就让笑脸顺着方向移动,如果接收的是ESC键就退出程序,其他按键则忽略处理.接受按键我们用以下两条语句:
while(bioskey(1)==0);/*等待按键*/
key=bioskey(0);/*把接收的按键的键盘码赋给变量key*/
然后用switch语句来判断按键以及执行相关操作,如下:
switch(key)/*对变量key的值进行判断*/
{
case UP:/*如果按的是向上键*/
…break;/*让物体向上运动,并退出switch*/
case DOWN:/*如果按的是向下键*/
…break;/*让物体向下运动,并退出switch*/
case LEFT:/*向左键*/
…break;;/*向左运动*/
case RIGHT:/*向右键*/
…break;/*向右运动*/
default:
break;/*其他按键则忽略处理*/
}
怎么样,是不是有了玩游戏的感觉了?不过这个程序没有什么目的,也没有什么判断胜负的条件.下面我们就利用这个能控制它移动的笑脸来做一个更有趣的游戏吧!
4,在迷宫中探索
小时侯,我常在一些小人书和杂志上看见一些迷宫的游戏,非常喜欢玩,还常到一些书上找迷宫玩呢.好的,现在我们用C语言来编个迷宫的游戏,重温一下童年的乐趣.
首先,我们定义一个二维数组map,用它来保存迷宫的地图,其中map[x][y]=='#'表示在(x,y)坐标上的点是墙壁.DrawMap函数在屏幕上输出迷宫的地图和一些欢迎信息.在main函数里,我们定义了"小人"man的坐标和"目的地"des的坐标.在游戏循环中,我们增加了一些用来判断胜负的语句:
if(man.x==des.x&&man.y==des.y)/*如果人的坐标等于目
的地的坐标*/
{
gotoxy(35,3);
printf("Ok!You win!");/*输出胜利信息*/
….
}
在判断按键时,如果玩家按的是方向键,我们还要先判断前面是不是有"墙壁",如果有的话,就不能往前移动了.好的,我们在判断按键的switch语句的各个分支加上了判断语句,如下:
if(map[…][…]=='#')break;/*如果前面是墙壁,就不执行下去*/
哇噻!真棒,我们做出了一个完整的游戏了.当然你还可以通过修改二维数组map来修改迷宫的地图,让它更有挑战性.不过,我们要设计一个更好玩的游戏——
5,聪明的搬运工
大家一定玩过"搬运工"的游戏吧!这是在电脑和电子字典上较流行的益智游戏,让我们动手做一个属于自己的"搬运工"吧!程序依然用数组map来保存地图,数组元素如果为空格则表示什么也没有,'b'表示箱子,'#'表示墙壁,'*'表示目的地,'i'表示箱子在目的地.我们以后每推一下箱子,不但要改变屏幕的显示,也要改变map相应元素的值.游戏的主循环依然是接受按键.当接收一个方向键,需要判断小人前面一格的状态,如果是空地或目的地,则人物可以直接移动;如果是墙壁,则不可移动;如果是箱子或目的地上的箱子,则需要继续判断箱子前面一格的状态:如果前一格是空地或目的地,则人推箱子前进,否则不可移动.好的,我们在switch中增加了这些判断语句.程序还有一个重要的功能就是判断胜利.数组Des用来记录全部目的地的坐标,我们每执行一步操作后,程序就要通过Des数组判断这些目的地上是否都有箱子了.真棒啊!我们可以做游戏了.而且是一个老少皆宜,趣味十足的游戏呢!当然,我们可以通过修改map数组来制作不同的游戏地图,我们还可以相互分享好的游戏地图呢.
尾声:
在C++等高级语言还没出来的时候,很多应用程序也是C语言开发的.C语言在与硬件联系紧密的编程中,也占有重要地位.其实我觉得学习编程,可以通过一些小游戏,实用的例子来学习.象学习音乐的人,不是要等到把全部乐理学完后才演奏一个完整的曲子.而是刚开始学时就有一些简单的曲子让你演奏,让你立刻就有成就感,让你很快就能卖弄出来在别人面前表现自己了.通过编游戏来学习编程,把学习变成游戏,不失为学习计算机的一种好方法.
好了,编游戏就这么简单,希望大家也尝试用C语言或其他的语言来做几个自己喜欢的小游戏.。

相关文档
最新文档