博文

C语言程序设计入门学习六部曲(2006-12-06 18:12:00)

摘要:说明:在使用本方法之前要先阅读C语言的相关内容,要初步掌握相关知识的要点,然后按下述方法学习,可以达到理解、巩固、提高C语言知识和提高程序调式能力的目的。    在程序开发的过程中,上机调试程序是一个不可缺少的重要环节。“三分编程七分调试”,说明程序调试的工作量要比编程大得多。这里以如何上机调试C程序来说明C语言的学习方法.第一步、验证性练习     在这一步要求按照教材上的程序实例进行原样输入,运行一下程序是否正确。在这一步基本掌握C语言编程软件的使用方法(包括新建、打开、保存、关闭C程序,熟练地输入、编辑C程序;初步记忆新学章节的知识点、养成良好的C语言编程风格)。         使用《Turbo C/C++ for Windows 集成实验与学习环境》软件可以很方便地看着软件集成的《C语言入门教程》输入练习其中的程序例题。具体使用方法参见软件帮助部分。      初学者最容易犯的错误是:    1、没有区分开教材上的数字1和字母l,字母o和数字0的区别,造成变量未定义的错误。另一个易错点是将英文状态下的逗号,分号;括号()双引号""输入出入成中文状态下的逗号,分号;括号(),双引号“”造成非法字符错误。     2、C语言初学者易犯语法错误:使用未定义的变量、标示符(变量、常量、数组、函数等)不区分大小写、漏掉“;”、“{”与“}”、“(”与“)”不匹、控制语句(选择、分支、循环)的格式不正确、调用库函数却没有包含相应的头文件、调用未C声明的自定义函数、调用函数时实参与形参不匹配、数组的边界超界等。    3、修改C语言语法错误时要注意以下两点:    (1)、由于C语言语法比较自由、灵活,因此错误信息定位不是特别精确。例如,当提示第10行发生错误时,如果在第10行没有发现错误,从第10行开始往前查找错误并修改之。    (2)、一条语句错误可能会产生若干条错误信息只要修改了这条错误,其他错误会随之消失。特别提示:一般情况下,第一条错误信息最能反映错误的位置和类型,所以调试程序时务必根据第一条错误信息进行修改,修改后,立即运行程序,如果还有很......

阅读全文(4165) | 评论:0

用C实现的爱情宣言(2006-11-25 22:30:00)

摘要:#include "stdio.h"#include "graphics.h"#include "time.h"#include "math.h"#define N 2#define TIME 0.8/*微粒的的运动时间,TIME/步,每一步长为25个单位*/void *buf[N];struct{int x,y;} lizi[]={{0,0},{75,75}};void alter_place_lizi(int *x,int *y,int key)/*根据随机方向改变粒子的方位*/{switch(key){case 0:case 1:case 2:*x-=25;break;case 4:case 5:case 6:*x+=25;break;}switch(key){ case 0:case 7:case 6:*y-=25;break;case 2:case 3:case 4:*y+=25;break;}if(*x<0) *x=0;if(*x>250) *x=250;if(*y<0) *y=0;if(*y>250) *y=250;}void make_graphics()/*画方框*/{int i,j,driver=VGA,mode=VGAHI;initgraph(&driver,&mode,"");setbkcolor(YELLOW);cleardevice();setcolor(LIGHTRED);setlinestyle(0,0,1);for(i=0;i<=10;i++)line(0,25*i,250,25*i);for(i=0;i<=10;i++)line(25*i,0,25*i,250);} void make_circle(int x,int y,int n)/*根据提供的离子所在方位画圆*/{int size;setcolor(LIGHTRED);setlinestyle(0,0,1);setfillstyle(1,10);circle(x+25/2,y+25/2,25/2);floodfill(x+25/2,y+25/2,12);size=imagesize(x,y,x+25,y+25);buf[n]=(void *)malloc(size);/*保存每一个圆*/}void sport(int *......

阅读全文(3669) | 评论:0

C/C++编程新手错误语录(2)(2006-11-13 13:30:00)

摘要:(9)“函数add编译生成的符号就是add”int add(int x,int y){return x + y;}float add(float x,float y){return x + y;} 即便是在C语言中,add函数被多数C编译器编译后在符号库中的名字也不是add,而是_add。而在C++编译器中,int add(int x,int y)会编译成类似_add_int_int这样的名字(称为“mangled name”),float add(float x,float y)则被编译成_add_float _float,mangled name包含了函数名、函数参数数量及类型信息,C++依靠这种机制来实现函数重载。  所以,在C++中,本质上int add( int x, int y )与float add( float x, float y )是两个完全不同的函数,只是在用户看来其同名而已。  这就要求初学者们能透过语法现象看问题本质。本质上,语言的创造者们就是在玩各种各样的花样,以使语言具备某种能力,譬如mangled name花样的目的在于使C++支持重载。而C语言没有玩这样的花样,所以int add( int x, int y )与float add( float x, float y )不能在C程序中同时存在。(10)“没见过在C语言中调用C++的函数”、“C/C++不能调用Basic、Pascal语言的函数”  这又是一个奇天下之大怪的问题,“打死我都不相信C、C++、basic、pascal的函数能瞎调来调去”,可是有句话这么说:  没有你见不到的,只有你想不到的!  既然芙蓉姐姐也有其闻名天下的道理,那么C、C++、Basic、Pascal的函数为什么就不能互相调用呢?  能!  你可以用Visual C++写一个DLL在Visual Basic、Delphi(Pascal的孙子,Object Pascal的儿子)中调用,也可以在Visual Basic、Delphi中写一个DLL在Visual C++中调用不是?  让我们来透过现象看本质。首先看看函数的调用约定(以Visual C++来说明):  (1) _stdcall调用  _stdcall是Pascal程序的缺省调用方式,参数采用从右到左的压栈方式,被调函数自身在返回前清空堆栈。  ......

阅读全文(3004) | 评论:0

C/C++编程新手错误语录(1)(2006-11-13 13:26:00)

摘要:1.引言  还记得当年学数学、英语都有个窍门,那就是搞个错题集。经常复习一下这个错题集,就可以避免下次犯同样的错误。而几乎所有的程序员都是从犯错误开始的,我们也很有必要总结一下编程新手的常见错误,本文的目的在于此。文中所列出的都是笔者在项目开发中接触到的新手真实的言谈,笔者学学文革腔调,姑且称之为“错误语录”。2.语录(1)“我的程序都是对的,可结果不对”  想想你的周围,是不是也有人说这样的话?如果你也曾经说过,那就此打住,不要再说这句话,因为这句话只会显示说话者的无知。既然程序都是对的,那为什么结果不对?(2)“程序=算法+数据结构”  如果刚刚学完C语言,我们说这样的话,完全可以理解,而且可以说是正确的。但是如果你是一位即将从事C/C++编程的程序员,那么很遗憾,这个说法只能判错,殊不知,世界上还有另一种说法:  程序 = 对象 + 消息 “程序=算法+数据结构”只对面向过程的语言(C)成立,而对面向对象的语言(C++),则只能表述为“程序=对象+消息”。传统的过程式编程语言以过程为中心以算法为驱动,面向对象的编程语言则以对象为中心以消息为驱动。这里的消息是广义的,对象A调用了对象B的成员函数,可看作对象A给B发消息。(3)“程序编出来,运行正确就行了”  运行正确的程序并不一定是好程序,程序员时刻要牢记的一条就是自己写的程序不仅是给自己看的,要让别人也能轻易地看懂。很遗憾,许多的编程新手不能清晰地驾驭软件的结构,对头文件和实现文件的概念含糊不清,写出来的程序可读性很差。  C程序采用模块化的编程思想,需合理地将一个很大的软件划分为一系列功能独立的部分合作完成系统的需求,在模块的划分上主要依据功能。模块由头文件和实现文件组成,对头文件和实现文件的正确使用方法是:  规则1 头文件(.h)中是对于该模块接口的声明,接口包括该模块提供给其它模块调用的外部函数及外部全局变量,对这些变量和函数都需在.h中文件中冠以extern关键字声明;  规则2 模块内的函数和全局变量需在.c文件开头冠以static关键字声明;  规则3 永远不要在.h文件中定义变量;  许多程序员对定义变量和声明变量混淆不清,定义变量和声明变量的区别在于定义会产生内存分配的操作,是汇编阶段的概念;而声明则只是告诉包含该声明的模块在连接阶段从其它模块寻找外部函数和变量。如: /*模块1头文件:m......

阅读全文(2610) | 评论:0

安全第一”的C语言编程规范(2006-10-29 17:54:00)

摘要:编者按: C语言是开发嵌入式应用的主要工具,然而C语言并非是专门为嵌入式系统设计,相当多的嵌入式系统较一般计算机系统对软件安全性有更苛刻的要求。1998年,MISRA指出,一些在C看来可以接受,却存在安全隐患的地方有127处之多。2004年,MISRA对C的限制增加到141条。  嵌入式系统应用工程师借用计算机专家创建的C语言,使嵌入式系统应用得以飞速发展,而MISRAC是嵌入式系统应用工程师对C语言嵌入式应用做出的贡献。如今MISRA C已经被越来越多的企业接受,成为用于嵌入式系统的C语言标准,特别是对安全性要求极高的嵌入式系统,软件应符合MISRA标准。  从本期开始,本刊将分6期,与读者共同学习MISRAC。  第一讲:“‘安全第一’的C语言编程规范”,简述MISRAC的概况。  第二讲:“跨越数据类型的重重陷阱”,介绍规范的数据定义和操作方式,重点在隐式数据类型转换中的问题。  第三讲:“指针、结构体、联合体的安全规范”,解析如何安全而高效地应用指针、结构体和联合体。  第四讲:“防范表达式的失控”,剖析MISRAC中关于表达式、函数声明和定义等的不良使用习惯,最大限度地减小各类潜在错误。  第五讲:“准确的程序流控制”,表述C语言中控制表达式和程序流控制的规范做法。  第六讲:“构建安全的编译环境”,讲解与编译器相关的规范编写方式,避免来自编译器的隐患。   C/C++语言无疑是当今嵌入式开发中最为常见的语言。早期的嵌入式程序大都是用汇编语言开发的,但人们很快就意识到汇编语言所带来的问题——难移植、难复用、难维护和可读性极差。很多程序会因为当初开发人员的离开而必须重新编写,许多程序员甚至连他们自己几个月前写成的代码都看不懂。C/C++语言恰恰可以解决这些问题。作为一种相对“低级”的高级语言,C/C++语言能够让嵌入式程序员更自由地控制底层硬件,同时享受高级语言带来的便利。对于C语言和C++语言,很多的程序员会选择C语言,而避开庞大复杂的C++语言。这是很容易理解的——C语言写成的代码量比C++语言的更小些,执行效率也更高。  对于程序员来说,能工作的代码并不等于“好”的代码。“好”代码的指标很多,包括易读、易维护、易移植和可靠等。其中,可靠性对嵌入式系统非常重要,尤其是在那些对安全性要求很高的系统中,如飞行器、汽车和工业控制中。这些系统的特点是:只要工作稍......

阅读全文(2929) | 评论:0

最新面向对象查询语言:NQL(2006-09-10 22:43:00)

摘要:net.newxy.dbm.NQL 是 newxy(新坐标)的面向对象的查询类。他以标准的sql语言为基础,开发者不需要学习新的语法规则。不需要在查询语句中镶入值对象类名。通过add()方法加入新的查询条件,通过and()、addAnd()方法及or()、addOr()方法设置逻辑关系。利用多态特性,控制查询范围。比hibernate的HQL语言容易学。     面 向 对 象 查 询 语 言:NQLnewxy(新坐标)技术运用之七 作者:胡立新       net.newxy.dbm.NQL 是 newxy(新坐标)的面向对象的查询类。他以标准的sql语言为基础,开发者不需要学习新的语法规则。不需要在查询语句中镶入值对象类名。通过add()方法加入新的查询条件,通过and()、addAnd()方法及or()、addOr()方法设置逻辑关系。利用多态特性,控制查询范围。 newxy(新坐标)处理多项查询时采用了NQL技术。 以下是 NQL 类的几个构造方法 public NQL(IFacade ifacade,String _sql)throws Exception{ this.ifacade=ifacade; this._sql=_sql; initial(); } ifacade是net.newxy.dbm.DBM及其子类的接口。_sql是最初sql语句。 public NQL(String dao,String _sql)throws Exception{ this.dao=dao; this._sql=_sql; initial(); } dao 是src/下newxy.properties文件中设置的DAO类别名。例如dao.test=common.TestDao参数dao就可以是"dao.test"。_sql是最初sql语句。 public NQL(String _sql)throws Exception{ this._sql=_sql; initial(); } 这个构造函数调用的initial()方法会用默认DAO类的实例赋给NQL类变量ifacade。_sql是最初sql语句。 应用举例下面举几个例子。类NQL1、NQL2、NQL3、NQL......

阅读全文(3263) | 评论:0

"hello,world!"win32汇编小程序(2006-09-10 22:41:00)

摘要:"hello,world!"win32汇编小程序   "hello,world!"win32汇编小程序szText    db "Hello, world!",0szCaption db "Win32Asm",0        .code start:         push MB_OK        lea eax,szCaption        push eax        lea eax,szText        push eax        push NULL        call messageboxa        xor eax,eax        push eax        call exitprocess        end start--------------------------------------------------编译链接:    分下面两步进行:        ml   /c ......

阅读全文(2585) | 评论:0