第一篇:C语言C 编程学习程序员大神!绘制神奇代码之星空动态
C语言C 编程学习程序员大神!绘制神奇代码之星空动态
C语言是面向过程的,而C++是面向对象的C和C++的区别:C是一个结构化语言,它的重点在于算法和数据结构。C程序的设计首要考虑的是如何通过一个过程,对输入(或环境条件)进行运算处理得到输出(或实现过程(事务)控制)。C++,首要考虑的是如何构造一个对象模型,让这个模型能够契合与之对应的问题域,这样就可以通过获取对象的状态信息得到输出或实现过程(事务)控制。所以C与C++的最大区别在于它们的用于解决问题的思想方法不一样。之所以说C++比C更先进,是因为“ 设计这个概念已经被融入到C++之中 ”。C与C++的最大区别:在于它们的用于解决问题的思想方法不一样。之所以说C++比C更先进,是因为“ 设计这个概念已经被融入到C++之中 ”,而就语言本身而言,在C中更多的是算法的概念。那么是不是C就不重要了,错!算法是程序设计的基础,好的设计如果没有好的算法,一样不行。而且,“C加上好的设计”也能写出非常好的东西。今天分享一个好玩的:星空要用C/C++绘制是动态的哦。在今天之前,你能想象用C/C++几十行代码就能做出上面这个轨范吗?代码实现在EasyX的文档中,就有这么一个Demo轨范。我们先来分析一下这段代码。看过之前C说话专题的同窗们必定可以独立看明白这段代码。代码构造大要如下:1.星星构造体经由过程构造体保留每克星星的位置信息、颜色信息和挪动信息。位置信息EasyX坐标系中的点坐标位置。颜色信息所有的星星都是白色,不合的是敞亮程度不合。近处的星星斗劲亮,远处的星星斗劲暗。挪动速度每一次轮回,所有的星星都市向右挪动,经由过程这个参数来记实每个星星每次向右挪动的间隔。近处的星星挪动得快,远处的星星挪动得慢。2.星星初始化用一个数组来保留所有的星星。每个星星都用InitStar()函数随机出一组特征值。把持这些特征值将每颗星星画在画布上。这里使用了EasyX的画点接口:void putpixel(int x, int y, COLORREF color);3.星星挪动每20毫秒轮回一次,每一次轮回中,每颗星星都向右挪动。挪动挪用MoveStar()函数。星星的挪动很好实现,将之前画在画布上的点用一颗黑色的点盖掉,之后计较这颗星的新位置,末了再用这颗星的颜色把点画在新的位置上。这里要注意,当星星挪动出画布的规模时,必要给它重新初始化一组新的特征值。相称于这颗星星消失了,同时产生了一颗新星。这里必要提一下,kbhit函数担任监听键盘输入信息。当按下键盘肆意键时,前往值不为0。此时轨范竣事。int kbhit(void);这个函数我们后面还会碰着,这里不多说了。注意:文章开首的动图由于是图片拼接生成的gif图,与真正的轨范界面临比了局差了良多。真正运转轨范,你会看到斗劲震撼的3D了局。没错,我说的是3D了局面向工具的思惟对应上面的构造,其实这个轨范并不太难。在实现过程中,它参加了C++的编程思惟,每个星星成为独立办理的数据构造。这其实就是面向工具的低级阶段。若是是传统的构造化编程,应该是分袂用四个数组保留所有星星的横坐标、纵坐标、颜色、步长。就像下面一样。虽然用这种编制也能实现这个功能,但细致想想,这么设计数据构造的后果是我们设计轨范时将会把每一次重绘看做一个独立的举措来实现。有乐趣的同窗可以本身写一下,只后你会创造,面向工具的思惟会使你的思绪加倍清楚。C++的面向工具下面真正进入今天的主题。上面的轨范虽然使用了面向工具的思惟,但代码情势上仍然仍是构造化的。我们要用C++的类重新实现这段代码。星星类首先,我们建树一个Star类,用来封装每颗星星的特征数据和举措。代码如下:私有成员变量中,四个变量就是之前构造体中的四个成员变量。别的,星星只需两种举措,一个是建树本身,另一个是挪动。这里设计了两个公有编制Init()和Move()。C++中,总有人争论public和private现实若何枚举。我小我倾向于把public内容写在前面,由于外部使用者在使用这个类的时辰,只关怀public的内容。类功能实现两个公有函数的实现如下:代码和之前差不多,只不外把持的都是成员变量。类的使用轨范启动后,先建树Star类的一组工具,保留在star数组中。之后轮回停止初始化。每30微妙,轮回一次,每颗星星按挨次挪用本身的move编制。可以理解为每颗星星按挨次挪动一下。直到捕捉按键消息,轨范退出。末了,在文件前面加上这局部:这里经由过程宏来办理画布巨细和星星的颗数。好了,下面实行一下我们的新代码吧。若是你还没感受到这两种编制的不合,那么请你删掉代码,本身从零起头用着两种编制实现一下这个轨范,信托你会有更多的体味。面向工具的特点面向工具的三大要素是:封装、担当和多态。我们今天只用了封装这个特征。在后面的项目中,我们还会用到后面两种特征,到时辰你会创造面向工具真正强大的地方。进修编程的捷径捷径就是——没有捷径。这些是C/C++能做的 服务器开发工程师、人工智能、云计算工程师、信息安全(黑客反黑客)、大数据、数据平台、嵌入式工程师、流媒体服务器、数据控解、图像处理、音频视频开发工程师、游戏服务器、分布式系统、游戏辅助等
第二篇:C语言C++程序员编程必备
Java,NET,PHP,Ruby,Perl 和 Python 等,但今天我们要讨论的是两个最古老和流行的语言的C和C++。它们都有其特殊的地方,更有效的功能和支持的工具,这两种语言仍然很活跃。
今天我们整理了一些令人印象深刻的IDE(集成开发环境)和编译器推荐给 C 和 C++ 程序员。集成开发环境,主要用于提供软件应用的各种组件而开发的,其中最流行的功能是它们都有吸引力的用户界面。1)Best IDE for C/C++ – kDevelop KDevelop 是基于 KDevPlatform 的可使用开源插件扩展的 IDE。KDevPlatform 是一种可以用来作为 IDE 的基础库的开源集。
2)Best IDE for C/C++-Anjuta Anjuta Devstudio 具有先进的编程工具,包括项目管理,应用程序向导,交互式调试器,源代码编辑器,版本控制,GUI设计器,分析器和许多工具,另一个伟大的开发工作室。此工具提供的 C/C++ 程序员有很大强大的用户界面开发接口。
3)Best IDE for C/C++Eclipse CDT Eclipse CD 是最强大和最流行的IDE之一,提供了更高效的功能,如:项目的创建和管理,构建支持不同的工具链,标准make编译,源代码导航,各种来源的知识工具,代码编辑器,语法高亮,折叠和超链接导航,源代码重构和代码生成,可视化调试工具,包括内存,寄存器等等。
7)Best IDE for C/C++ – Compilr Compilr 是在线集成开发工具,让您与令人印象深刻的功能和简单的用户界面编写代码。该工具支持的编程语言中广泛的C,C + + JAVA,HTML等等。
8)Best IDE for C/C++Netbeans C++ Netbeans 的工具包括许多适合 C 和 C++ 项目类型模板,可以 使用动态库和静态创建 C/C++ 应用程序库。它拥有迷人的功能:代码协助,编译器配置,单元测试,源检查,远程开发和文件导航等等。
10)Best IDE/Compiler for C/C++Ultimate++ Ultimate++是对于 C++ 程序员来说是很好框架。这个 IDE 引入了模块化概念,可以结合 GCC,MinGW 和 Visual C++。
12)Best Compiler for C/C++-Digital Mars DigitalMars 是一款高性能的 C/C++ 编译器。包括的功能,如速度最快的编译/链接时,强
HTML文档,反汇编,图书管理员,资源编译器,make等,命令行和GUI版本,教程,代码示例,在线更新,标准模板库等等。
13)Best IDE for C-C-Free
14)Best Compiler for C/C++ – MinGW MinGW 编译器提供访问微软的C运行库和一些特定语言运行库的功能。
15)Best Compiler for C – Tiny C Compiler iny C Compiler 是最好的编译器之一,让开发人员可以在任何地方编译代码,可以使用任何 C 动态库,编译并直接执行C++源程序,也包含完整的 C 预处理器和 GNU 汇编器。
@扣丁学堂 智悦分享
第三篇:C语言代码套用在Delphi编程中
C语言代码套用在Delphi编程中(C++Builder(VC++)与 Delphi)
Delphi适合用来开发应用程序,但是有时侯一些底层的东西可以直接使用C语言来开发.我在公司经常开发跟硬件相关的项目,而很多硬件的SDK包是用C来写的.这个时候我一般把它们转换成Delphi(PASCAL)语法的代码.一:将C语言的程序编译成DLL供Delphi调用.这种方法过于简单,而且需要额外带一个DLL文件,所以不在本文的讨论范围之内.二:直接转换C语言代码到DELPHI代码
C语言的函数格式与Delphi不同,它们是函数返回类型在前,函数声明在后.对于没有任何返回类型的函数则定义为VOID类型.例如:Delphi中函数function MyFunction:(intIN:integer):Bool;相应的C语言代码就变成Bool MyFunction(int intIN);又例如procedure MyProcedure;====>void MyProcedure;采用这种方法,一般要求对C语言比较熟悉.我一般是采用这种方法.下面是我收集整理的自己常用的Delphi与C之间的类型对应表.其中左边是C类型,右边是对应的Delphi类型: 以下是引用片段:
ABC-> TABC
ACCEL-> TAccel
ATOM-> TAtom
BITMAP-> TBitMap
BITMAPCOREHEADER-> TBitmapCoreHeader
BITMAPCOREINFO-> TBitmapCoreInfo
BITMAPFILEHEADER-> TBitmapFileHeader
BITMAPINFO-> TBitmapInfo
BITMAPINFOHEADER-> TBitmapInfoHeader
BOOL-> Bool
CBT_CREATEWND-> TCBT_CreateWnd
CBTACTIVATESTRUCT-> TCBTActivateStruct
CHAR-> Char
CHAR*-> PChar
CLIENTCREATESTRUCT-> TClientCreateStruct
COLORREF-> TColorRef
COMPAREITEMSTRUCT-> TCompareItemStruct
COMSTAT-> TComStat
CREATESTRUCT-> TCreateStruct
CTLINFO-> TCtlInfo
CTLSTYLE-> TCtlStyle
CTLtype-> TCtltype
DCB-> TDCB
DDEAACK-> TDDEAck
DDEADVISE-> TDDEAdvise
DDEDATA-> TDDEData
DDEPOKE-> TDDEPoke
DEBUGHOOKINFO-> TDebugHookInfo
DELETEITEMSTRUCT-> TDeleteItemStruct
DEVMODE-> TDevMode DOUBLE-> Double
DRAWITEMSTRUCT-> TDrawItemStruct DWORD-> LongInt
ENUMLOGFONT-> TEnumLogFont EVENTMSG-> TEventMsg FARPROC-> TFarProc FIXED-> TFixed FLOAT-> Single
GLYPHMETRICS-> TGlyphMetrics HANDLE-> THandle
HANDLETABLE-> THandleTable
HARDWAREHOOKSTRUCT-> THardwareHookStruct HELPWININFO-> THelpWinInfo INT-> Integer
KERNINGPAIR-> TKerningPair LOGBRUSH-> TLogBrush LOGFONT-> TLogFont
LOGPALETTE-> TLogPalette LOGPEN-> TLogPen LONG-> LongInt
LONG DOUBLE-> Extended LONG INT-> LongInt LPSTR-> PChar
LPWSTR-> PWideChar MAT2-> TMat2
MDICREATESTRUCT-> TMDICreateStruct
MEASUREITEMSTRUCT-> TMeasureItemStruct MENUITEMTEMPLATE-> TMenuItemTemplate
MENUITEMTEMPLATEHEADER-> TMenuItemTemplateHeader METAFILEPICT-> TMetaFilePict METAHEADER-> TMetaHeader METARECORD-> TMetaRecord MINMAXINFO-> TMinMaxInfo
MOUSEHOOKSTRUCT-> TMouseHookStruct MSG-> TMsg
MULTIKEYHELP-> TMultiKeyHelp
NCCALCSIZE_PARAMS-> TNCCalcSize_Params NEWTEXTMETRIC-> TNewTextMetric OFSTRUCT-> TOFStruct
OUTLINETEXTMETRIC-> TOutlineTextMetric PAINTSTRUCT-> TPaintStruct PALETTEENTRY-> TPaletteEntry PANOSE-> TPanose
PATTERN-> TPattern
POINTFX-> TPointFX
PSTR-> PChar
PWSTR-> PWideChar
RASTERIZER_STATUS-> TRasterizer_Status
RGBQUAD-> TRGBQuad
RGBTRIPLE-> TRGBTriple
SEGINFO-> TSegInfo
SHORT-> SmallInt
SHORT INT-> SmallInt
SIZE-> TSize
TEXTMETRIC-> TTextMetric
TPOINT-> TPoint
TRECT-> TRect
TTPOLYCURVE-> TTTPolyCurve
TTPOLYGONHEADER-> TPolygonHeader
UINT-> Word
UNSIGNED-> Word
UNSIGNED CHAR-> Byte
UNSIGNED INT-> Word
UNSIGNED LONG-> LongInt(DWORD)
UNSIGNED LONG INT-> LongInt
UNSIGNED SHORT-> Word
UNSIGNED SHORT INT-> Word
VOID*-> Pointer
WINDOWPLACEMENT-> TWindowPlacement
WINDOWPOS-> TWindowPos
WNDCLASS-> TWndClass
WORD-> Word 三:在Delphi中直接链接C语言的OBJ文件.这种方法的好处在于最终EXE不用带任何外部文件.也不用对C语言过于熟悉.我们都知道,代码在编译成可执行文件(或DLL,OCX文件,下同)之前,都必须得先生成OBJ文件(DELPHI一般是DCU文件,但也可以通过编辑编译选项生成OBJ文件),然后把OBJ文件和资源文件(*.RES)链接成最终的可执行文件.利用这个方法,我们可以直接把OBJ文件链接到我们的程序里面.不过需要注意的是,编译器不同,生成的OBJ文件也不一样.Microsoft的编译器生成的OBJ文件是COFF格式,而Borland的C++Builder生成的是OMF格式.因为我们需要在Delphi中链接,所以必须使用CBC,或者Borland官方站点带的免费编译工具.下面我们通过一个简单的例子来说明具体操作步骤:
这个例子是简单的提供一个函数,用来判断一个文件是否为Dat格式的VCD文件.头文件声明如下: 以下是引用片段:
/*
文件名称:DatFormat.h
*/
#ifndef DatFormat_H #define DatFormat_H #include
#pragma pack(push, 1)//这个与下面的配对,一般用到记录类型的时候需要定义,这里实际不用
#ifdef __cplusplus
extern “C” {
#endif
extern BOOL CheckIsDatFile(const char * FileName,BOOL *IsDatFile);
#ifdef __cplusplus
}
#endif
#pragma pack(pop)
#endif // DatFormat_H
具体实现代码DatFormat.c如下:
#include “DatFormat.h”
BOOL CheckIsDatFile(const char * FileName,BOOL *IsDatFile)
/*
函数说明:该函数用于判断一个文件是否为Dat文件(即VCD文件)格式.参数:
IN:
FileName:欲判断的文件名称
IN,OUT:
IsDatFile:是否为Dat格式文件
OUT:
读文件失败返回FALSE,否则返回TRUE.-----{
HANDLE hFile;
DWORD dwBytesRead;BOOL re;
char MyBuf[4];*IsDatFile=FALSE;//建立读文件句柄
hFile = CreateFile(FileName, GENERIC_READ, FILE_SHARE_READ, NULL,OPEN_EXISTING, 0, 0);
if(hFile == INVALID_HANDLE_VALUE)return FALSE;//读文件
re = ReadFile(hFile, &MyBuf, 4,&dwBytesRead, NULL);
if(dwBytesRead!=4){
CloseHandle(hFile);return FALSE;}
//读文件失败的时候
if(re!=TRUE){
CloseHandle(hFile);return FALSE;}
CloseHandle(hFile);
*IsDatFile=(MyBuf[0]=='R' && MyBuf[1]=='I' && MyBuf[2]=='F' && MyBuf[3]=='F');return(TRUE);} 运行CBC,新建一个工程,然后把DatFormat.c添加到工程里面,编译整个工程,将得到我们需要的OBJ文件:DatFormat.OBJ.然后我们关闭CBC即可,因为下面不再需要用到它了.运行Delphi,新建一个工程并保存.然后把DatFormat.OBJ拷贝到它的目录之下.在单元的implementation下面添加如下代码:
{$LINK 'DatFormat.obj'} //链接外部OBJ文件
function _CheckIsDatFile(const FileName:Pchar;IsDatFile:PBool):Bool;cdecl;external;//定义函数.其中cdecl进栈方式说明采用C语言格式传递参数.external说明是个外部声明函数.注意函数声明的原形与C定义的不一样.必须在前面添加一个下划线.原因是因为编译器的链接符号中.C与C++是不一样的.因为这个不是本文重点,所以这里不作讨论.请感兴趣的朋友自行参阅相关资料.然后我们写如下代码调用此函数: 以下是引用片段:
procedure TFrmMain.Button1Click(Sender: TObject);
var
IsDatFile:Bool;
begin
if OpenDialog1.Execute then
if _CheckIsDatFile(Pchar(OpenDialog1.FileName),@IsDatFile)then
if IsDatFile then ShowMessage('恭喜!该文件是一个Dat格式的视频文件!')
else ShowMessage('不好意思,该文件不是一个Dat格式的视频文件!')
else ShowMessage('读文件错误!');
end;编译这个程序,将得到一个干净的可执行EXE文件了.四:C++Builder中使用Delphi单元
这个实际是题外话了,不过这里还是提一提:假设我们有一个获取BIOS密码的Delphi单元
unit AwardBiosPas;
{=========
项目: 在Delphi编程中使用C语言代码-演示程序
模块: 获取BIOS密码单元 以下是引用片段:
interface
uses
windows, SysUtils;
function My_GetBiosPassword: string;
implementation
function CalcPossiblePassword(PasswordValue: WORD): string;
var
I: BYTE;
C: CHAR;
S: string[8];
begin
I := 0;
while PasswordValue <> 0 do
begin
Inc(I);
if $263 > PasswordValue then
begin
if $80 > PasswordValue then
S[I] := CHAR(PasswordValue)
else if $B0 > PasswordValue then
S[I] := CHAR(PasswordValue and $77)
else if $11D > PasswordValue then
S[I] := CHAR($30 or(PasswordValue and $0F))
else if $114 > PasswordValue then
begin
S[I] := CHAR($64 or(PasswordValue and $0F));
if '0' > S[I] then
S[I] := CHAR(BYTE(S[I])+ 8);
end
else if $1C2 > PasswordValue then
S[I] := CHAR($70 or(PasswordValue and $03))
else if $1E4 > PasswordValue then
S[I] := CHAR($30 or(PasswordValue and $03))
else
begin
S[I] := CHAR($70 or(PasswordValue and $0F));
if 'z' < S[I] then
S[I] := CHAR(BYTE(S[I])BYTE(S[I]))shr 2;end;
S[0] := CHAR(I);
PasswordValue := I shr 1;while PasswordValue < I do
begin {this is to do because award starts calculating with the last letter} C := S[BYTE(S[0])I + 1] := S[I];S[I] := C;Dec(I);end;
CalcPossiblePassword := S;end;
function readcmos(off: byte): byte;var
value: byte;begin asm
xor ax, ax mov al, off out 70h, al in al, 71h mov value, al end;
readcmos := value;end;
function My_GetBiosPassword: string;var
superpw, userpw: word;begin
if Win32Platform <> VER_PLATFORM_WIN32_NT then //不是NT
begin
pchar(@superpw)[0] := char(readcmos($1C));
pchar(@superpw)[1] := char(readcmos($1D));
pchar(@userpw)[0] := char(readcmos($64));
pchar(@userpw)[1] := char(readcmos($65));
Result:=('************BIOS密码**********************')+#13+'超级用户密码为:' + CalcPossiblePassword(superpw)+ #13 + '用户密码为:' + CalcPossiblePassword(userpw);
end
else
Result := '用户系统为NT,无法获取BIOS密码!';
end;
end.如何直接在CBC中使用它呢?新建一个CBC工程,然后把这个单元加到项目里面去.具体操作为:Add to Project--->文件类型:pascal unit(*.pas),然后Build Demo1.这个时候将在AwardBiosPas.pas的同目录下生成一个AwardBiosPas.hpp文件.把它引用到我们的需要调用的单元.然后直接调用即可: 以下是引用片段:
void __fastcall TFrmMain::Button1Click(TObject *Sender)
{
ShowMessage(My_GetBiosPassword());
} 五:其它方法.当然可以用RES将C语言生成的二进制文件,但这个方法与第一种方法差不多.优点是不怕文件丢失.缺点是很容易被别人直接用资源修改工具打开修改.这个时候可以使用笔者写的自制编程序工具PasAnywhere.不过这已经是另外一个话题了.
第四篇:29.如何学习C语言-----程序员之路
作者:t5k5 日期:2007-10-24
一周没有写东西了,今天上校内的时候有个好友分享了这篇帖子,深有感触,以后坚决不用TC了,去下个VC++来学习C,哈哈~~还说我们用的教材太LJ了,这个我倒不怎么清楚,因为没学懂啊。。
看文章结尾的链接就知道是CSDN上的了,以下是原文:
=================T5K5的学习分割线=================
学习C语言不是一朝一夕的事情,但也不需要花费十年时间才能精通。如何以最小的代价学习并精通C语言是本文的主题。请注意,即使是“最小的代价”,也绝不是什么捷径,而是以最短的时间取得最多的收获,同时也意味着你需要经历艰苦的过程。
一、要读就读好书,否则不如不读
所有初学者面临的第一个问题便是:如何选择教材。好的开始是成功的一半,选择一本优秀的教材是事半功倍的关键因素。不幸的是,学校通常会帮你指定一本很差劲的C语言课本;而幸运的是,你还可以再次选择。
大名鼎鼎的谭浩强教授出了一本《C语言程序设计》,据说发行量有超过400万,据我所知,很多学校都会推荐这本书作为C语言课本。虽然本人的名字(谭浩宇)跟教授仅仅一字之差,但我是无比坚定地黑他这本书的。这本书不是写给计算机专业的学生的,而是给那些需要考计算机等级考试的其它专业学生看的。这本书的主要缺点是:例子程序非常不专业,不能教给你程序设计应该掌握的思考方式;程序风格相当地不好,会让你养成乱写代码的恶习;错误太多,曾经有人指出过这本书的上百个错误,其中不乏关键的概念性错误。好了,这本书我也不想说太多了,有兴趣大家可以百度一下:)
Kernighan和Ritchie的《The C Programming Language》(中译名《C程序设计语言》)堪称经典中的经典,不过旧版的很多内容都已过时,和现在的标准C语言相去甚远,大家一定要看最新的版本,否则不如不看。另外,即使是最经典最权威的书,也没有办法面面俱到,所以手边常备一本《C语言参考手册》是十分必要的。《C语言参考手册》就是《C Reference Manual》,是C语言标准的详细描述,包括绝大多数C标准库函数的细节,算得上是最好的标准C语言的工具书。顺便提一句,最新的《C程序设计语言》是根据C89标准修订的,而《C语言参考手册》描述的是C99标准,二者可能会有些出入,建议按照C99标准学习。还有一本《C和指针》,写得也是相当地不错,英文名是《Pointers on C》,特别地强调指针的重要性,算是本书的一个特点吧。不过这本书并不十分适合初学者,如果你曾经学过C语言,有那么一些C语言的基础但又不是很扎实,那么你可以尝试一下这本书。我相信,只要你理解了指针,C语言便不再神秘。
如果你已经啃完了一本C语言教材,想要更进一步,那么有两本书你一定要看。首先是《C Traps and Pitfalls》(中译名《C陷井与缺陷》),很薄的一本小册子,内容非常非常地有趣。要注意一点,这本书是二十多年前写成的,里面提到的很多C语言的缺陷都已被改进,不过能够了解一些历史也不是什么坏事。然后你可以挑战一下《Expert C Programming》(中译名《C专家编程》),书如其名,这本书颇具难度,一旦你仔细读完并能透彻理解,你便可以放心大胆地在简历上写“精通C语言”了。
切记一个原则,不要读自己目前还看不懂的书,那是浪费生命。如果你看不懂,那你一定是缺失了某些必需基础知识。此时,你要仔细分析自己需要补充哪些内容,然后再去书店寻找讲述的这些内容的书籍。把基础知识补充完毕再回头来学习,才会真正的事半功倍。
二、Unix/Linux还是Windows,这是个很大的问题
不同的编程环境会造就出不同思维的程序员。Windows的程序员大多依赖集成开发环境,比如Visual Studio,而Unix程序员更加钟爱Makefile与控制台。显而易见,集成开发环境更容易上手,在Windows上学习C语言,只需要会按几个基本的Visutal C++工具栏按钮就可以开始写Hello, World!了,而在Unix下,你需要一些控制台操作的基本知识。有人也许认为Unix的环境更简洁,但习惯的力量是很大的,大家都很熟悉Windows的基本操作,而为了学习C语言去专门装一个Unix系统,似乎有点不划算。
对于一个只懂得Windows基本操作、连DOS是什么都不知道的新手而言,尽快做一些有趣而有意义的事情才是最重要的。用C语言写一个小程序远比学习ls、cat等命令有趣,况且我们要专注于C语言本身,就不得不暂时忽略一些东西,比如编译链接的过程、Makefile的写法等等等等。
所以我建议初学者应该以Visual C++ 6.0(不是VisualC++.NET)或者Dev C++作为主要的学习环境,而且千万不要在IDE的使用技巧上过多纠缠,因为今后你一定要转向Unix环境的。Visual C++ 6.0使用很方便,调试也很直观,但其默认的编译器对C标准的支持并不好,而Dev C++使用gcc编译器,对C99的标准都支持良好。使用顺带提一下,很多大学的C语言课程还在使用Turbo C 2.0作为实验环境,这是相当不可取的,原因其一是TC 2.0对C标准几乎没有支持,其二是TC 2.0编译得到的程序是16位的,这对今后理解32位的程序会造成极大的困扰(当然,用djgpp之类的东西可以使TC 2.0编译出32位程序,不过那过于复杂了)。
等你学完一本C语言的教材,你一定要转向Unix平台继续学习,几乎所有的C语言高级教程都是基于Unix平台的(比如《C专家编程》)。转变的过程是痛苦的,你需要面对的是各种纷繁复杂的命令,完全不同于Windows平台的思考方式,但是这种痛苦是值得的。Unix与C是共生的,Unix的思考方式和习惯更加符合C语言的思考方式和习惯。在Unix下,你可以找到无数优秀的源代码供你尽情阅读,你可以方便地查看某个库函数的联机手册,还可以看到最优秀的代码风格(说到代码风格,我会专门写一篇文章详细叙述)。
归结起来就是一句话:初学C语言,建议使用Windows系统和集成开发环境,在准备向“高手”方向努力时,请先转向Unix平台。
三、万事俱备,你就是东风
书已选定,环境配置完成,正所谓万事俱备,只欠你自己的努力了。请从书的前言开始,仔细地阅读手头的教材,很多人看书喜欢直接从第一章开始看,这是错误的做法。前言是作者对整本书的大体介绍,作者一般会告诉你需要什么基础才能够顺利阅读本书,这可以帮助你检验自己的基础知识是否已经具备。看完前言,还要浏览一下目录,了解一下书的整体结构,顺便给自己安排一下学习计划。
学习C语言,必需注意每一个细节,书上的例子代码一定要自己亲自敲一遍,编译执行输出都跟书上说的一致才能算是学完了一个例子,如果不一致,就要仔细找原因。出了书本上有的例子,自己还要“创造”一些例子,比如学习运算符优先级的时候,可以写几个相同的表达式,在不同的位置加上括号,看看有哪些不同的行为,比如*p++和(*p)++,又比如a = b == c、(a = b)== c和a =(b == c)等等。自己抄的书上的例子以及改造之后的例子,还有自己“创造”的例子,都应该仔细地归类保存,并且要在源代码中写上简短的注释,阐述这个例子的意图。
例子之后就是习题了,我建议初学者把所有的习题都独立做一遍,然后对照答案的代码,看看自己的代码有那些不足,再试着修改自己的代码。很多人不重视习题,这是极大的错误,因为作者通常会在习题中说明一些重要的道理,而不是单纯地检验前面的知识。
也许你认为这样学习太慢,其实不然。学得细致就不用走回头路,等你学到后面才发现自己前面没搞清楚,那才是真的得不偿失。一般说来,整本书读完,你应该完成数千行乃至上万行的代码,无论是原封不动照抄书上的,还是自己心血来潮写就的,都是今后继续学习的一笔财富。以我自己举例,阅读《Windows核心编程》时(我只阅读了3/4的内容),除了抄书上的代码,还自己写了很多例子,一共有5574行(用unix下的wc工具统计),时隔多日,我早已记不清Windows的系统编程了,但只要花几分钟翻出以前的代码看看,便会重新了然于胸。所谓好记性不如烂笔头,就是这个道理。
仔细读书、认真抄写源代码、独立完成习题外加更进一步的实验,最后将所有的代码留下,成为自己的经验和财富,绝对的辛苦,也绝对的事半功倍。当然,这种方式只适合学习需要精通的技术,如果不是学习C语言,你还要具体情况具体分析。
写到最后,还有非常非常重要的一点没有提及──代码风格,从最开始学习就必须强迫自己模仿最优秀的代码风格。因为代码风格太重要内容也太多,我会用专门的一篇文章来详细讨论,请大家关注《程序员之路──关于代码风格》。
第五篇:C语言面向对象编程学习笔记
C语言面向对象编程笔记
1、在底层驱动函数前加static标识符的作用:
a:加了static后表示该函数失去了全局可见性,只在该函数所在的文件作用域内可见 b:当函数声明为static以后,编译器在该目标编译单元内只含有该函数的入口地址,没有函数名,其它编译单元便不能通过该函数名来调用该函数,这也是对1的解析与说明
2、底层驱动的封装模板
通常将存储类,显示类,AD-DA类的外设驱动函数封装为以下几个函数: Void Open(void);
此函数用于开启外设,通常函数体中包涵IO和外设的初始化 Void Close(void)此函数用于关闭外设,特别是一些在休眠下功耗很大的外设,可用mos管控制其Vcc的通断,以此达到降低系统功耗的目的
Void Read(unsigned int address,unsigned char *data[],unsigned int count)
此函数用于读取数据,参数分别为:address,地址,*data[],存放数据的数组,count,要读取的字节数
Void Write(unsigned int address,unsigned char *data[],unsigned int count)此函数用于写数据,参数功能与读函数中相似。
Void control(unsigned char cmd,unsigned char data)此函数用于控制外设的工作状态,如休眠,低功耗等等
3、命名规则
A、宏定义全部用大写
如:#define OLED_CS PBout(12)B、驱动函数名称大小写,并且动词放置在末尾如
static long _OLED_Close(void)C、结构体的名称,结构体名大写,变量名小写,“驱动”的首字母大写
如:struct OLED_DEVICE oledDevice;
4、关于外设的数据手册
外设的数据手册应该去芯片的官网下载最新版本,特别注意芯片的是否有功耗控制方面的内容,