c语言相关的小游戏

2022-08-19

第一篇:c语言相关的小游戏

基于C语言五子棋小游戏

五子棋小游戏

一.需求分析

现在有越来越多的人使用电脑,而且五子棋的受众广泛但实体棋操作较为繁琐且平时较难实现,所以电脑版的五子棋游戏应运而生。大家对于这个小游戏的需求如下:首先,设计这个游戏最基本的就是实现玩家之间对战,玩家可以通过某些操作来实现对战功能;有时候可能由于时间等原因,玩家可能需要保存游戏,此时需要一个“保存”功能;有时候可能玩家由于失误会走错棋,此时就需要“悔棋”功能;有时候玩家可能觉得这局游戏玩的非常不好,这时候就需要“重新开始游戏”功能;玩家在玩过游戏之后有可能想保存游戏记录便于以后分析此时就需要“排行榜”功能;有些玩家在玩游戏时喜欢听音乐,这时候就需要在下棋时可以播放背景音乐的功能;最基本的通过输入坐标来实现落子的操作方式很繁琐而且很不方便,这时候就可以将落子机制改为更直观的光标移动模式。

二.设计思路

1.玩家对战功能:在玩家对战功能中,玩家可以通过按方向键来移动光标、按空格来实现落子,最终在横或竖或斜方向上达成五个相同颜色的棋子来获得胜利。 基本思路:

(1)使用二维数组保存棋局。

(2)由于要使用光标,所以使用输出缓冲器。

(3)打印棋盘。

主要使用Print()函数来算出棋盘并将缓冲器内容输出。

其余为其中调用的辅助函数。chessPrint()是打印交点坐标的字符的函数;getCurse()是打印光标的函数;write()函数是用来向缓冲器里面写入字符串的函数;ln()函数是负责将缓冲器写入位置提行的函数;Display()函数是将缓冲器中内容输出到屏幕的函数。

(4)下子,在后文有详细介绍。 (5)胜负平判断

调用Check()函数进行四个方向的检查,检查是否有五子连珠。

判断完毕后输出结果(如果存在结果)

2.保存游戏和装载游戏功能:在游戏过程中,只要按“1”键就可以保存游戏到指定名称的文档中;在游戏开始界面,只要按“2”选择“load board”就可以装载指定名称的游戏。 基本思路:

调用saveGame()函数将当前棋局的相关信息全部保存到结构体变量saveChess中,并将其中的内容全部保存到文件里。

加载时将结构体变量里的数据全部读出,赋给当前棋局相关信息变量,之后正常运行游戏即可。

3.悔棋功能:在游戏过程中,只要按“2”键就可以返回到上一步的局面。 基本思路:

玩家对战时,每个玩家每次成功落子之后,棋盘的相关信息就会被记录到一个结构体数组里。

每次悔棋时,就调用一个函数把储存在结构体数组里的上一回合的信息全部赋给当前棋局信息变量。

4.重新开始游戏功能:在游戏过程中,只要按“3”键就可以初始化棋局,重新开始游戏。 基本思路:

玩家对战时每一次重新开始游戏就调用runGame()函数,并返回当前玩家信息。

人机对战时每一重新开始游戏就调用自身,并返回当前玩家信息。

5.排行榜功能:在一局游戏结束时,按照提示输入“1”则可以将自己的名字及成绩保存到排行榜文件中。在游戏开始界面,只要按“3”就可以查看排行榜。(排行榜按照步数由小到大,棋色又白到黑排序) 基本思路:

一局游戏结束时调用inList()函数,inList()函数又调用addList()函数,将关于棋局的部分信息保存到文件。

关于排序设置了单独的函数sortList()函数,其在addList()里面被调用。此处使用了结构体数组,按照其中的“步数”成员将结构体数组中的元素进行“冒泡排序”。

这里比较特别的是,每次都是先将要加入的内容写到文件末尾,再将文件中所有内容读出后进行排序,最后再将排好序的内容全部写入文件。

6.背景音乐功能:在游戏过程中会一直循环播放音乐,带给玩家不一样的享受。 基本思路:

使用Windows.h头文件,并加上相关指令

再调用PlaySoundA()函数就可以实现循环播放背景音乐。

7.使用光标定位棋子:使用方向键控制光标移动方向,使用空格键来实现落子,带给玩家比坐标落子更高级的体验,更加方便快捷。(此处使用了以前没用到的

,调用getch()函数,为了不需要键入回车。) 基本思路:

光标实现:使用缓冲器将棋盘交点的间隔都填充内容,光标用制表符表示,其余为空格。 方向键移动光标:

防止越界:

空格落子:

8.简单的人机对战:主要防御型的AI,主要针对对手的棋型来安排战术,有时会选择进攻。 基本思路:

判断对手是否有2,3,4子连珠,如果有,电脑会在两头下子;如果没有,若己方在一侧存在3子或4子连珠,电脑会在后面补子;如果以上情况均未出现,电脑会随机在对手单子周边落子。其余基本功能同人人对战,但是不支持保存和读取棋局功能。

按照奇偶数来判断是该电脑走子还是玩家走子。电脑执黑则会有不同的初始化方法。

三.用户手册

1.如何运行程序

2.如何开始游戏(包括玩家对战和人机对战) 3.如何退出游戏 4.如何进行游戏

5.如何保存当前游戏(仅支持玩家对战) 6.如何读取已保存的游戏(仅支持玩家对战) 7.如何重新开始游戏(支持人机和玩家对战)

8.如何保存记录(支持人机和玩家对战,不加区分)

9.如何调取记录进行查看(支持人机和玩家对战,不加区分) 10.如何查看游戏规则

11.如何了解设计师相关信息

12.如何悔棋(支持人机和玩家对战)

1.如何运行程序 第一步,打开VS2012,点击“打开项目”。

第二步,选择“高级五子棋”项目,点击“打开”

第三步,使用快捷键“Ctrl+F5”,开始运行程序,进入游戏开始界面。

2.如何开始游戏

按照开始界面中的提示操作即可,从键盘输入“1”即可开始玩家对战或人机对战(输入“1”为玩家对战,输入“2”为人机对战,人机对战时可以选择电脑的颜色)。 输入“1”之后的效果:

再输入“2”之后的效果:

再输入“1”之后的效果:

再输入“2”之后的效果:

3如何退出游戏

此处分两种情况:第一种是在开始界面,可以通过键盘输入“0”来实现退出游戏(此时会有退出界面);第二种是在游戏过程中,可以通过按“Esc”键来直接退出游戏(此时没有退出界面)。 第一种:

输入“0”之后的结果:

第二种:

按“Esc”之后的效果:

4.如何进行游戏

玩家可以通过按“↑”“↓”“←”“→”来实现光标的移动,通过按空格键来在没有棋子的位置实现落子。 初始:

按空格之后的效果:

按“→”之后的效果:

5.如何保存当前游戏

在游戏过程中,玩家可以通过按“1”来实现游戏的保存。 按“1”之后的效果:

6.如何读取已保存的游戏

在游戏开始界面,可以通过从键盘输入“2”来装载曾经保存过的游戏。 输入“2”之后的效果:

7.如何重新开始游戏

在游戏过程中,按“3”可以实现游戏的重新开始。 初始:

按“3”之后的效果:

8.如何保存记录

在一局游戏结束后,会有如下文字提示:

输入“1”后的效果:

9.如何调取记录进行查看

在游戏开始界面,可以通过键盘输入“3”来查看排行榜内容。

10.如何查看游戏规则

在游戏开始界面可以通过键盘输入“4”来查看游戏规则。

11.如何了解设计师相关信息

在游戏开始界面输入“5”即可了解设计师相关信息。

12.如何悔棋

在游戏过程中,可以按“2”来实现悔棋,即恢复到上一步的状态。 初始:

按“2”之后的效果:

四.总结

通过本次五子棋大作业,我初步掌握了运用之前学过的知识去开拓未知领域的能力、借鉴与发展能力、自学能力等多项技能。总的来说我感觉这次大作业的难度是比较大的,这其中会面临很多选择,这恰恰是考验我们能力的地方。例如,“排行榜”功能就可以选择是使用链表来做还是使用结构体数组来做。我一开始的思路是使用链表来做,但是由于我链表的相关知识掌握的不是很熟练所以屡屡受挫,最终我决定改变思路,使用结构体数组来做,果然要容易一些,我也成功的实现了排行榜功能。再比如,好多同学都是选用EasyX来实现鼠标控制,我本来一开始也想尝试,但是后来经过努力发现这种模式的难度对我来说偏高,所以我借鉴了一下网上的一些五子棋源代码,最终决定使用光标这种比坐标略强、比鼠标略弱的操作模式。这样的例子在开发过程中还有很多,在这里我就不一一列举了。总而言之,我从这次大作业中收获了很多专业知识,更重要的是我掌握很多以前没有的能力。

第二篇:24点游戏 高质量C语言程序

设计题目: 24点游戏

2012年 9 月 1 日

目录

一题目及要求 二项目概述 三项目分析 四程序思路分析

五总结 六答辩记录 七教师意见

一 题目及要求 计算24点游戏

输入四个数,通过加减乘除计算出24,显示计算过程,并提示成功信息。 二 项目概述

我设计的是24点游戏,它功能是输出给定4个数运算得出24的算式。大概思路很简单,就是穷举4个数字排列组合后的所算式,选择其中结果为24的,并筛选符合数学法则的输出,难点在于穷举 三项目分析

通过题目这是大家很熟悉的游戏,大家也都知道直接计算很难,想不出具体的算法,但考虑到计算机的特点——运算速度快,不知疲倦,我们可以另辟蹊径,让计算机算出所有与这4个数字相关的算式,选择其中得24的算输出即可。所以确定思路,穷举。大概分几个模块,主函数,转化四则运算的fun函数,for循环,if选择,scanf,printf。 四 程序思路分析

程序要求给出4个数字,输出算出等于24的结果的所有算式,所以大体上首先scanf4个数字储存在数组中,然后试用定义的fun函数,fun函数为将4则运算

转化为数字的函数,然后用多个for语句实现数字的排列组合,关于括号的问题,分两种情况,一种是“三一”的,一种是“二二”的。然后写一个报错的语句,关于结果用printf输出,如果结果为-24,-1/24,1/24的,可以改变输出结果的顺序。

下面附上源程序: #include double fun(double a1,double a2,int b) { switch(b) {

case 0:return (a1+a2);

case 1:return (a1-a2);

case 2:return (a1*a2);

case 3:return (a1/a2); } } void main() { int g; for(g=0;g<100;) {

int i,j,k,l,n,m,r,save[4];

double num[4]={1,1,1,1},tem1,tem2,tem3,abc=1111;

char sign[5]="+-*/";

printf("请输入4个数,数字与数字之间用空格隔开:");

for(i=0;i<4;i++)

{

scanf("%lf",num+i);

save[i]=num[i];

} for(i=0;i<4;i++)

for(j=0;j<4;j++)

if(j!=i)

{

for(k=0;k<4;k++)

if(k!=i&&k!=j)

{

for(l=0;l<4;l++)

if(l!=i&&l!=j&&l!=k)

{

for(n=0;n<4;n++)

for(m=0;m<4;m++)

for(r=0;r<4;r++)

{

tem1=fun(num[i],num[j],n);

tem2=fun(tem1,num[k],m);

tem3=fun(tem2,num[l],r);

if(tem3==24.0)printf("{(%d%c%d)%c%d}%c%d=24 ",save[i],sign[n],save[j],sign[m],save[k],sign[r],save[l]);

else if(tem3==-24.0)printf("{%d%c(%d%c%d)}%c%d=24 ",save[k],sign[m],save[i],sign[n],save[j],sign[r],save[l]);

else if(tem3==1.0/24.0)printf("%d%c{(%d%c%d)%c%d}=24 ",save[l],sign[r],save[i],sign[n],save[j],sign[m],save[k]);

else if(tem3==-1.0/24.0)printf("%d%c{%d%c(%d%c%d)}=24 ",save[l],sign[r],save[k],sign[n],save[i],sign[m],save[j]);

else

{

tem1=fun(num[i],num[j],n);

tem2=fun(num[k],num[l],r);

if(tem2 == 2 && m == 3)

printf("此处省略出现的一个非法运算 ");

else

{

tem3=fun(tem1,tem2,m);

if(tem3==24.0)

printf("(%d%c%d)%c(%d%c%d)=24 ",save[i],sign[n],save[j],sign[m],save[k],sign[r],save[l]);

}

}

}

}

}

} g++; } } 下面详细说明:

double fun(double a1,double a2,int b) //定义fun函数 { switch(b)

{

case 0:return (a1+a2);

case 1:return (a1-a2);

case 2:return (a1*a2);

case 3:return (a1/a2); } }用switch语句将四则运算转化。 void main() 定义主函数

int i,j,k,l,n,m,r,save[4];

double num[4]={1,1,1,1},tem1,tem2,tem3,abc=1111;

char sign[5]="+-*/";

printf("请输入4个数,数字与数字之间用空格隔开:");

for(i=0;i<4;i++)

{

scanf("%lf",num+i); //输入语句

save[i]=num[i];}

定义参数,有fun函数转化四则运算,但需要将四则运算的符号存入字符数组中以便输出时使用。用for语句循环实现输入。

用两段语句分两种情况计算for(n=0;n<4;n++)

for(m=0;m<4;m++)

for(r=0;r<4;r++)

{

tem1=fun(num[i],num[j],n);

tem2=fun(tem1,num[k],m);

tem3=fun(tem2,num[l],r); for循环实现运算的排列组合,上面是一种情况(不带有括号的),下面是另一种

else

{

tem1=fun(num[i],num[j],n);

tem2=fun(num[k],num[l],r); else 下面是两两组合的情况

{tem3=fun(tem1,tem2,m);

if(tem3==24.0) printf("(%d%c%d)%c(%d%c%d)=24 ",save[i],sign[n],save[j],sign[m],save[k],sign[r],save[l]);

用for和if语句实现数字的排列组合, for(i=0;i<4;i++) for(j=0;j<4;j++) if(j!=i) {

for(k=0;k<4;k++) if(k!=i&&k!=j)

{

for(l=0;l<4;l++)

if(l!=i&&l!=j&&l!=k)

{ 输出语句如下 if(tem3==24.0)printf("{(%d%c%d)%c%d}%c%d=24 ",save[i],sign[n],save[j],sign[m],save[k],sign[r],save[l]);

else if(tem3==-24.0)printf("{%d%c(%d%c%d)}%c%d=24 ",save[k],sign[m],save[i],sign[n],save[j],sign[r],save[l]);

else if(tem3==1.0/24.0)printf("%d%c{(%d%c%d)%c%d}=24 ",save[l],sign[r],save[i],sign[n],save[j],sign[m],save[k]);

else if(tem3==-1.0/24.0)printf("%d%c{%d%c(%d%c%d)}=24 ",save[l],sign[r],save[k],sign[n],save[i],sign[m],save[j]); 对于其他几种结果通过改变输出时变量的顺序即可。 五 总结

通过这次学习,我学到了很多,这个程序的难度级别是B,不是很难,但是算法比较繁琐,考虑要细心才行。通过此次程序设计,也让我们把平时学的理论知识用在了实际问题上,有助于我们的理解和运用,而且这个程序设计本身也比较有趣,能激发我们自己去深入研究。

以上就是我对这次程序设计的心得体会,也希望在以后的专业课学习中能够充分利用计算机本身速度快的优势,利用编写程序完成一些用手工计算很难完成的问题。

张博禹 05111112 六 答辩记录

七 教师意见

第三篇:C语言的优点

C语言能够存在并发展至今,其中有着某些不可替代的优点,C语言的优点具体如下:

(1)程序结构简洁、紧凑、规整,表达式简练、使用灵活。

(2)编写的程序可读性强,编译效率高。

(3)具有丰富的运算符,多达34种。丰富的数据类型与丰富的运算符相结合,使C语言具有表达灵活和效率高等特点。

(4)数据类型种类繁多。C语言具有5种基本的数据类型和多种构造数据类型以及复合的导出类型,同时还提供了与地址密切相关的指针机器运算符。指针可以指向各种类型的简单变量、数组、结构和联合,乃至函数等。此外,C语言还允许用户自己定义数据类型。

(5)是一种结构化程序设计语言,特别适合大型程序的模块化设计。C语言具有编写结构化程序所必需的基本流程控制语句,C语言程序是由函数集合构成的,函数各自独立,并且作为模块化设计的基本单位。

C语言的源文件,可以分割成多个源程序,分别进行编译,然后连接起来构成可知性的目标文件,为开发大型软件提供了极大的方便。C语言还提供了多种存储属性,使数据可以按其需要在相应的作用域起作用,从而提高了程序的可靠性。

(6)语法限制不太严格,程序设计自由度大。例如,对数组下标越界不作检查,由程序编写者自己保证程序的正确。一般的高级语言语法检查比较严,能检测出几乎所有的语法错误,而C语言允许程序编写者有较大的自由度,因此放宽了语法的检查。程序员应当仔细检查程序,保证其正确,而不要过分依赖C语言编译程序去查错。

(7)允许直接访问物理地址,能进行位(bit)操作,能实现汇编语言的大部分功能,可以直接对硬件进行操作。因此,C语言既具有高级语言的功能,又兼容低级语言的许多功能,可用来编写系统软件。

(8)生成的目标代码质量高,程序执行效率高。它一般只比汇编程序生成的目标代码率低10%~20%。

(9)具有较高的可移植性。它的语句基本上无须修改就能用于各种型号的计算机和各种操作系统。

(10)任何里面有微处理器的设备都支持C语言。从微波炉到手机,都是由C语言技术来推动的。

第四篇:最好的c语言视频教程

最好的c语言视频教程----曾怡副教授讲解30课,csf格式 2009-11-02 13:53 C程序设计视频教程(曾怡):本套视频教程由曾怡副教授讲解,使用教材为:《C语言程序设计》 谭浩强 清华大学出版社出版。是难得的C语言学习视频教程。全程共30讲,每讲45分钟左右,CSF视频格式。 讲课内容如下:

第一讲 第一章 C语言概述

第二讲 第二章 程序的灵魂—算法

第三讲 第三章 数据类型、运算符与表达式 第四讲 第三章 数据类型、运算符与表达式 第五讲 第三章 数据类型、运算符与表达式 第六讲 第三章 数据类型、运算符与表达式 第四章 最简单的C程序设计—顺序程序设计

第七讲 第四章 最简单的C程序设计—顺序程序设计 第八讲 第四章 最简单的C程序设计—顺序程序设计 第九讲 第五章 选择结构的程序设计 第十讲 第五章 选择结构的程序设计 第十一讲 第五章 选择结构的程序设计 第十二讲 第六章 循环结构程序设计 第十三讲 第六章 循环结构程序设计 第十四讲 第六章 循环结构程序设计 第十五讲 第六章 循环结构程序设计 第七章 数组

第十六讲 第七章 数组 第十七讲 第七章 数组 第十八讲 第七章 数组 第十九讲 第七章 数组 第二十讲 第七章 数组 第八章 函数

第二十一讲 第八章 函数 第二十二讲 第八章 函数 第二十三讲 第八章 函数 第二十四讲 第十章 指针 第二十五讲 第十章 指针 第二十六讲 第十章 指针 第二十七讲 第十章 指针 第十一章 结构体

第二十八讲 第十一章 结构体 复习总结第一讲 复习总结第二讲

下载:请使用迅雷下载

ed2k://|file|%5BC%E8%AF%AD%E8%A8%80%E7%A8%8B%E5%BA%8F%E8%AE%BE%E8%AE%A1%E8%A7%86%E9%A2%91%E6%95%99%E7%A8%8B%28%E6%9B%BE%E6%80%A1%29%5D.01.csf|133259072|121e29f458b54e3f04af1df97fa346d2|h=RPEKFNVP2PAAAZHBWHIY5Q6FB6CBTJIT|/

ed2k://|file|%5BC%E8%AF%AD%E8%A8%80%E7%A8%8B%E5%BA%8F%E8%AE%BE%E8%AE%A1%E8%A7%86%E9%A2%91%E6%95%99%E7%A8%8B%28%E6%9B%BE%E6%80%A1%29%5D.02.csf|129622016|63bee15722f8e25fb062ae11ee4b42d0|h=LX4LEF6S3NC36IYVWG7DZI3NDG6PF4PW|/

ed2k://|file|%5BC%E8%AF%AD%E8%A8%80%E7%A8%8B%E5%BA%8F%E8%AE%BE%E8%AE%A1%E8%A7%86%E9%A2%91%E6%95%99%E7%A8%8B%28%E6%9B%BE%E6%80%A1%29%5D.03.csf|76730144|a8f8209260a19c2f7b84cd2e4ad0a63a|h=7RWI6D4FX74QT4RMNIELGVWMSHWJKKEG|/

ed2k://|file|%5BC%E8%AF%AD%E8%A8%80%E7%A8%8B%E5%BA%8F%E8%AE%BE%E8%AE%A1%E8%A7%86%E9%A2%91%E6%95%99%E7%A8%8B%28%E6%9B%BE%E6%80%A1%29%5D.04.csf|19172304|9910973a8c559bcaf4030685c6dc8f56|h=RYWFD46HI5U4GRNM2JHGYJHRDJNAQ4W4|/

ed2k://|file|%5BC%E8%AF%AD%E8%A8%80%E7%A8%8B%E5%BA%8F%E8%AE%BE%E8%AE%A1%E8%A7%86%E9%A2%91%E6%95%99%E7%A8%8B%28%E6%9B%BE%E6%80%A1%29%5D.05.csf|98583328|5356603aa47419d2f4fec6f0b0e4d974|h=KPEUIJFKEVVLSUCDIAYSGXYLS2QZ3RGB|/

ed2k://|file|%5BC%E8%AF%AD%E8%A8%80%E7%A8%8B%E5%BA%8F%E8%AE%BE%E8%AE%A1%E8%A7%86%E9%A2%91%E6%95%99%E7%A8%8B%28%E6%9B%BE%E6%80%A1%29%5D.06.csf|86465456|947e7652889b4839c632802a722d518f|h=V2CCDMSYJYH2JH2ZATWW2LY4ZJKPS3LJ|/

ed2k://|file|%5BC%E8%AF%AD%E8%A8%80%E7%A8%8B%E5%BA%8F%E8%AE%BE%E8%AE%A1%E8%A7%86%E9%A2%91%E6%95%99%E7%A8%8B%28%E6%9B%BE%E6%80%A1%29%5D.07.csf|88554448|f3daafd9b9c712af88c12605fc10fbda|h=L6DZ4ESHX3DQPTK52GSN34FRHJDPCL7A|/

ed2k://|file|%5BC%E8%AF%AD%E8%A8%80%E7%A8%8B%E5%BA%8F%E8%AE%BE%E8%AE%A1%E8%A7%86%E9%A2%91%E6%95%99%E7%A8%8B%28%E6%9B%BE%E6%80%A1%29%5D.08.csf|75778464|b57d7c922c487f6f2ce0d845aceccb2d|h=UA6AEVLC2SQEUS4WIA4EM6Z2BY345SXL|/

ed2k://|file|%5BC%E8%AF%AD%E8%A8%80%E7%A8%8B%E5%BA%8F%E8%AE%BE%E8%AE%A1%E8%A7%86%E9%A2%91%E6%95%99%E7%A8%8B%28%E6%9B%BE%E6%80%A1%29%5D.09.csf|97479408|a02d675f53d04436a76d87449aa0e85e|h=A42HIY3P5CEWV4CPPYGDQF6F7OE3ZEOH|/

ed2k://|file|%5BC%E8%AF%AD%E8%A8%80%E7%A8%8B%E5%BA%8F%E8%AE%BE%E8%AE%A1%E8%A7%86%E9%A2%91%E6%95%99%E7%A8%8B%28%E6%9B%BE%E6%80%A1%29%5D.10.csf|90913616|0d262329fad807bdf02058611e111bc5|h=26CX7DTOV54LSUYG46QOZDIX4YYK5LWZ|/

ed2k://|file|%5BC%E8%AF%AD%E8%A8%80%E7%A8%8B%E5%BA%8F%E8%AE%BE%E8%AE%A1%E8%A7%86%E9%A2%91%E6%95%99%E7%A8%8B%28%E6%9B%BE%E6%80%A1%29%5D.11.csf|91717968|4294ac1aedf2e6d560b4aec194c20613|h=AEHAWTI4APD26Y4S4MWYVKOUCRQRACJU|/

ed2k://|file|%5BC%E8%AF%AD%E8%A8%80%E7%A8%8B%E5%BA%8F%E8%AE%BE%E8%AE%A1%E8%A7%86%E9%A2%91%E6%95%99%E7%A8%8B%28%E6%9B%BE%E6%80%A1%29%5D.12.csf|91263232|a39a001a45e82465cbcc74c808695f9e|h=USW6NEJZY7ZWAL2272URSWIZE3C3R45U|/

ed2k://|file|%5BC%E8%AF%AD%E8%A8%80%E7%A8%8B%E5%BA%8F%E8%AE%BE%E8%AE%A1%E8%A7%86%E9%A2%91%E6%95%99%E7%A8%8B%28%E6%9B%BE%E6%80%A1%29%5D.13.csf|92035424|8dad31b7b6f20b9b812c66c570cd4de6|h=CWSCNSMMIIO6ZV2FF2B6INZLWUVQGUTS|/

ed2k://|file|%5BC%E8%AF%AD%E8%A8%80%E7%A8%8B%E5%BA%8F%E8%AE%BE%E8%AE%A1%E8%A7%86%E9%A2%91%E6%95%99%E7%A8%8B%28%E6%9B%BE%E6%80%A1%29%5D.14.csf|87611440|7be881bd980a707e3d79e837f5073ca6|h=JJEICECID2ZCM53ENNFD2XJAIMORHUOF|/

ed2k://|file|%5BC%E8%AF%AD%E8%A8%80%E7%A8%8B%E5%BA%8F%E8%AE%BE%E8%AE%A1%E8%A7%86%E9%A2%91%E6%95%99%E7%A8%8B%28%E6%9B%BE%E6%80%A1%29%5D.15.csf|126502112|b641aeb5ea31d006851e039b5a47a3ec|h=IJY4GWUEN6IXFZRSCLSTA5RAI3GFZH6U|/

ed2k://|file|%5BC%E8%AF%AD%E8%A8%80%E7%A8%8B%E5%BA%8F%E8%AE%BE%E8%AE%A1%E8%A7%86%E9%A2%91%E6%95%99%E7%A8%8B%28%E6%9B%BE%E6%80%A1%29%5D.16.csf|112697072|4f93606bbdac31bc7fce23b29ff5e614|h=5MNBOCJOITT7PBUAFRTS7NKW3TXM4CO2|/

ed2k://|file|%5BC%E8%AF%AD%E8%A8%80%E7%A8%8B%E5%BA%8F%E8%AE%BE%E8%AE%A1%E8%A7%86%E9%A2%91%E6%95%99%E7%A8%8B%28%E6%9B%BE%E6%80%A1%29%5D.17.csf|112079280|89f3eb422cf9eff3476edc70280a5841|h=RQA2GBCOYMG5POP5LO2PZBIW6VZCTAVY|/

ed2k://|file|%5BC%E8%AF%AD%E8%A8%80%E7%A8%8B%E5%BA%8F%E8%AE%BE%E8%AE%A1%E8%A7%86%E9%A2%91%E6%95%99%E7%A8%8B%28%E6%9B%BE%E6%80%A1%29%5D.18.csf|104010960|c626717b2e2fb5a5280db31f68c8f787|h=6JBUD4RISIMVRBTMMHQBSBCID64TZHSO|/

ed2k://|file|%5BC%E8%AF%AD%E8%A8%80%E7%A8%8B%E5%BA%8F%E8%AE%BE%E8%AE%A1%E8%A7%86%E9%A2%91%E6%95%99%E7%A8%8B%28%E6%9B%BE%E6%80%A1%29%5D.19.csf|93634736|7e2250e2f28d9d82c78170e3fb1f8ad9|h=NSSEWBRUQJPOSVETWI6DG44INBQDE6OI|/

ed2k://|file|%5BC%E8%AF%AD%E8%A8%80%E7%A8%8B%E5%BA%8F%E8%AE%BE%E8%AE%A1%E8%A7%86%E9%A2%91%E6%95%99%E7%A8%8B%28%E6%9B%BE%E6%80%A1%29%5D.20.csf|125862560|1587eb64ae4f0bc546128fcdbc763c29|h=J65Q2YADVW62SV6AMMHY6245HF5KQGOX|/

ed2k://|file|%5BC%E8%AF%AD%E8%A8%80%E7%A8%8B%E5%BA%8F%E8%AE%BE%E8%AE%A1%E8%A7%86%E9%A2%91%E6%95%99%E7%A8%8B%28%E6%9B%BE%E6%80%A1%29%5D.21.csf|121989312|31999aa3617552d6c58c661a4eff16ae|h=MEOJAUTDJWTX52TAKVZTMTDY74AXRBBX|/

ed2k://|file|%5BC%E8%AF%AD%E8%A8%80%E7%A8%8B%E5%BA%8F%E8%AE%BE%E8%AE%A1%E8%A7%86%E9%A2%91%E6%95%99%E7%A8%8B%28%E6%9B%BE%E6%80%A1%29%5D.22.csf|93032112|595fd6b7ca476168b5ccfddaf1d27416|h=UOG7KFGDKB27U3CJ6FZ5LVZHTXGIBEF3|/

ed2k://|file|%5BC%E8%AF%AD%E8%A8%80%E7%A8%8B%E5%BA%8F%E8%AE%BE%E8%AE%A1%E8%A7%86%E9%A2%91%E6%95%99%E7%A8%8B%28%E6%9B%BE%E6%80%A1%29%5D.23.csf|96633744|ab71ac93cc662e79ecf1b64710b09e56|h=E42IXUYO5XAYQD3VTXG546HCRVDGXQVC|/

ed2k://|file|%5BC%E8%AF%AD%E8%A8%80%E7%A8%8B%E5%BA%8F%E8%AE%BE%E8%AE%A1%E8%A7%86%E9%A2%91%E6%95%99%E7%A8%8B%28%E6%9B%BE%E6%80%A1%29%5D.24.csf|90092192|19d0c190f06d3f6a71a064fa781c29c2|h=DGG2GIKDX5AFLDS35EU2BQ45QT343M7J|/

ed2k://|file|%5BC%E8%AF%AD%E8%A8%80%E7%A8%8B%E5%BA%8F%E8%AE%BE%E8%AE%A1%E8%A7%86%E9%A2%91%E6%95%99%E7%A8%8B%28%E6%9B%BE%E6%80%A1%29%5D.25.csf|96328784|fa12e75842dff16666ea010e7239719a|h=MH62NITTDXNWB4SPY7Q76ECBEXZ76U2A|/

ed2k://|file|%5BC%E8%AF%AD%E8%A8%80%E7%A8%8B%E5%BA%8F%E8%AE%BE%E8%AE%A1%E8%A7%86%E9%A2%91%E6%95%99%E7%A8%8B%28%E6%9B%BE%E6%80%A1%29%5D.26.csf|98173888|7116d6ad6a66000d0fb4dc7382af869f|h=F5ML7E6Q4RIYMUKZG47QT42JIUDWUINU|/

ed2k://|file|%5BC%E8%AF%AD%E8%A8%80%E7%A8%8B%E5%BA%8F%E8%AE%BE%E8%AE%A1%E8%A7%86%E9%A2%91%E6%95%99%E7%A8%8B%28%E6%9B%BE%E6%80%A1%29%5D.27.csf|97851456|6bf70b00e25afcbf131d041ee19577d7|h=BOBBJ4UFHILERJDU7SYZ2AG7VPQHB7O4|/

ed2k://|file|%5BC%E8%AF%AD%E8%A8%80%E7%A8%8B%E5%BA%8F%E8%AE%BE%E8%AE%A1%E8%A7%86%E9%A2%91%E6%95%99%E7%A8%8B%28%E6%9B%BE%E6%80%A1%29%5D.28.csf|47111744|4dd8039d6b351f4ec75eb12a82819579|h=XZWFGXKWWROV7B3JA7QQEMONKBOSGS3I|/

ed2k://|file|%5BC%E8%AF%AD%E8%A8%80%E7%A8%8B%E5%BA%8F%E8%AE%BE%E8%AE%A1%E8%A7%86%E9%A2%91%E6%95%99%E7%A8%8B%28%E6%9B%BE%E6%80%A1%29%5D.29.csf|121031328|3cb5f1e59923c92a3d9c4d81e5421e2e|h=ENZCMXOOPMWL5ZLEKIUXF4VLUDYLV3IL|/

ed2k://|file|%5BC%E8%AF%AD%E8%A8%80%E7%A8%8B%E5%BA%8F%E8%AE%BE%E8%AE%A1%E8%A7%86%E9%A2%91%E6%95%99%E7%A8%8B%28%E6%9B%BE%E6%80%A1%29%5D.30.csf|90193184|a96f3a8b60f50eab9ebb261227bbd3e1|h=OGHWAZSBQMUW3QIPLCHTQLO6Q5DF5HJT|/

第五篇:黑马程序员C语言教程: CC++培训专家-编写高效C语言的四大绝招

传智播客C/C++培训专家:编写高效C语言的四大绝招

C语言是很多程序猿的入门语言,而且C语言也是一门用不过时的语言。编写高效简洁的C语言代码,是许多软件工程师追求的目标。今天传智播客C/C++培训专家针对编程工作中的一些体会和经验给大家做相关的阐述。

第一招:以空间换时间

计算机程序中最大的矛盾是空间和时间的矛盾,那么,从这个角度出发逆向思维来考虑程序的效率问题,我们就有了解决问题的第1招--以空间换时间。比如说字符串的赋值: 方法A:通常的办法 #define LEN 32 char string1 [LEN]; memset (string1, 0, LEN); strcpy (string1, "This is a example!!"); 方法B:

const char string2[LEN] ="This is a example!"; char * cp; cp = string2 ;

从上面的例子可以看出,A和B的效率是不能比的。在同样的存储空间下,B直接使用指针就可以操作了,而A需要调用两个字符函数才能完成。B的缺点在于灵活性没有A好。在需要频繁更改一个字符串内容的时候,A具有更好的灵活性;如果采用方法B,则需要预存许多字符串,虽然占用了大量的内存,但是获得了程序执行的高效率。

第二招:数学方法解决问题

现在我们演绎高效C语言编写的第二招--采用数学方法来解决问题。数学是计算机之母,没有数学的依据和基础,就没有计算机的发展,所以在编写程序的时候,采用一些数学方法会对程序的执行效率有数量级的提高。举例如下,求 1~100的和。 方法C: int I , j; for (I = 1 ;I<=100; I ++) { j += I; } 方法D int I; I = (100 * (1+100)) / 2;

这个例子是我印象最深的一个数学用例,是我的计算机启蒙老师考我的。当时我只有小学三年级,可惜我当时不知道用公式 N×(N+1)

/ 2 来解决这个问题。方法E循环了100次才解决问题,也就是说最少用了100个赋值,100个判断,200个加法(I和j);而方法F仅仅用了1个加法,1 次乘法,1次除法。效果自然不言而喻。所以,现在我在编程序的时候,更多的是动脑筋找规律,最大限度地发挥数学的威力来提高程序运行的效率。

第三招:使用位操作

实现高效的C语言编写的第三招——使用位操作。减少除法和取模的运算。在计算机程序中数据的位是可以操作的最小数据单位,理论上可以用"位运算"来完成所有的运算和操作。一般的位操作是用来控制硬件的,或者做数据变换使用,但是,灵活的位操作可以有效地提高程序运行的效率。举例如下: 方法E int I,J; I = 257 /8; J = 456 % 32; 方法F int I,J; I = 257 >>3; J = 456 - (456 >> 4 << 4); 在字面上好像F比E麻烦了好多,但是,仔细查看产生的汇编代码就会明白,方法E调用了基本的取模函数和除法函数,既有函数调用,

还有很多汇编代码和寄存器参与运算;而方法F则仅仅是几句相关的汇编,代码更简洁,效率更高。当然,由于编译器的不同,可能效率的差距不大,但是,以我目前遇到的MS C ,ARM C 来看,效率的差距还是不小。相关汇编代码就不在这里列举了。

运用这招需要注意的是,因为CPU的不同而产生的问题。比如说,在PC上用这招编写的程序,并在PC上调试通过,在移植到一个16位机平台上的时候,可能会产生代码隐患。所以只有在一定技术进阶的基础下才可以使用这招。 用移位实现乘除法运算

a=a*4;

b=b/4;

可以改为:

a=a<<2;

b=b>>2;

说明:

除2 = 右移1位 乘2 = 左移1位

除4 = 右移2位 乘4 = 左移2位

除8 = 右移3位 乘8 = 左移3位

... ...

通常如果需要乘以或除以2的n次方,都可以用移位的方法代替。大部分的C编译器,用移位的方法得到代码比调用乘除法子程序生成的

代码效率高。

第四招:汇编嵌入

高效C语言编程的必杀技,第四招——嵌入汇编。"在熟悉汇编语言的人眼里,C语言编写的程序都是垃圾"。这种说法虽然偏激了一些,但是却有它的道理。汇编语言是效率最高的计算机语言,但是,不可能靠着它来写一个操作系统吧?所以,为了获得程序的高效率,我们只好采用变通的方法--嵌入汇编,混合编程。举例如下,将数组一赋值给数组二,要求每一字节都相符。 char string1[1024],string2[1024]; 方法G int i; for (i =0 ;i<1024;i++) *(string2 + i) = *(string1 + i) 方法H #ifdef _PC_ int I; for (I =0 ;I<1024;I++) *(string2 + I) = *(string1 + I); #else #ifdef _ARM_ __asm

{ MOV R0,string1 MOV R1,string2 MOV R2,#0 loop: LDMIA R0!, [R3-R11] STMIA R1!, [R3-R11] ADD R2,R2,#8 CMP R2, #400 BNE loop } #endif 方法G是最常见的方法,使用了1024次循环;方法H则根据平台不同做了区分,在ARM平台下,用嵌入汇编仅用128次循环就完成了同样的操作。这里有朋友会说,为什么不用标准的内存拷贝函数呢?这是因为在源数据里可能含有数据为0的字节,这样的话,标准库函数会提前结束而不会完成我们要求的操作。这个例程典型应用于LCD数据的拷贝过程。根据不同的CPU,熟练使用相应的嵌入汇编,可以大大提高程序执行的效率。

虽然是必杀技,但是如果轻易使用会付出惨重的代价。这是因为,使用了嵌入汇编,便限制了程序的可移植性,使程序在不同平台移植的

过程中,卧虎藏龙,险象环生!同时该招数也与现代软件工程的思想相违背,只有在迫不得已的情况下才可以采用。

今天分享到这里,大家有遇到什么问题可以向“传智播客C/C++培训专家”留言哦!

本文来自 99学术网(www.99xueshu.com),转载请保留网址和出处

上一篇:毕业班工作方案下一篇:编辑部工作计划