分享
 
 
 

献给初学编程的礼物⑶ C语言 及总结学习方法

王朝英语沙龙·作者佚名  2007-01-10
窄屏简体版  字體: |||超大  

献给初学编程的礼物⑶C语言

2000-4-6

这是C语言系列的最后一篇文章,下次我将讲解一些关于window下VB编程的一些技巧.

首先我们来分析一下计算机的组成部分,在输入输出部分的设备我们主要接触的有输出:显示

器、打印机,输入:键盘、鼠标

显示器方面就是我上几次讲的图形方式,对于打印机不作要求

键盘上次用keykey()这样一个函数就可以完成检测按键的功能呢

对于鼠标,鼠标是一个现在用得非常广的一个输入设备,在C语言中是如何对它进行控制呢?

事实上在计算机上有一种叫中断服务例程的代码,它提供中断号来进行计算机的控制。

而鼠标就是调用了其中的33号中断。

因为涉及比较深,所以有兴趣朋友可以仔细看下面的程序,对于初学者可以将下面的代码作

为一个库函数来调用。事实上以下代码是十分经典的,即使是自己要写一个C程序,依然可以

用这段代码。

首先要申请一个寄存器变量

union REGS r;

那么怎样去调用中断呢?

事实上是很简单的

在CPU寄存器组中分AX、BX、CX、DX,

在编程时只要先对这些变量附上相应的值,再调用中断号就行了

这些对应的值就代表对应的某些功能,这些值可以在许多书上找到参考表的。

下面以鼠标为例看看中断的调用

在运行之前要执行mouse.com,驱动鼠标。执行后鼠标并不显示出来。

现在要显示鼠标:

在参考表中是这样描述的

------------

入口参数 出口参数

AX=0001显示光标 无 无

AX=0003取光标位置与状态钮 BX(b=0;左键,b=2右键...)

------------

显示鼠标:

r.x.ax=1int86(0x33,&x,&x)

检测鼠标

r.x.ax=3int86(0x33,&x,&x)

if(r.x.bx=1) {当左键按下时完成的程序.....}

if(r.x.bx=2)

.....

事实上就这么简单!任何一个中断的调用者是这么简单。

下面的程序是比较规范的经典的鼠标函数。

就不一一界绍了。

#include<graphics.h>

#include "dos.h"

union REGS r;

typedef struct

{unsigned int shape[32];

char hotx;

char hoty;

}Shape;

Shape hand=

{{ 0xe7ff,0xc3ff,0xc3ff,0xc07f,0xc00f,0xc001,0xc001,0xc001,

0x8001,0x8001,0x8001,0xc003,0xc003,0xe007,0xe007,0xe007,

0x1800,0x2400,0x2400,0x2580,0x26b0,0x26d6,0x2232,0x2222,

0x4222,0x4002,0x4002,0x2004,0x2004,0x1ff8,0x1008,0x1ff8},0,0};

void mouseshape(Shape sp)

{_BX=sp.hotx;

_CX=sp.hoty;

_ES=FP_SEG(&sp.shape);

_DX=FP_OFF(&sp.shape);

_AX=0x09;

geninterrupt(0x33);

}

void mouse_IQR(int *num,int *bx,int *cx,int *dx) /*33H鼠标中断核心函数*/

{

r.x.ax=*num; /*寄存器初始化*/

r.x.bx=*bx;

r.x.cx=*cx;

r.x.dx=*dx;

int86(0x33,&r,&r); /*中断调用*/

*bx=r.x.bx;

*cx=r.x.cx;

*dx=r.x.dx;

*num=r.x.ax;

}

void init_mouse() /*鼠标初始化,检验是否安装鼠标驱动程序*/

{

int num=0;

mouse_IQR(&num,&num,&num,&num);

if(num!=-1)

{

printf("Mouse not installed!");

exit(1);

}

}

void show_mouse() /*鼠标显示函数*/

{

int num=1;

mouse_IQR(&num,&num,&num,&num);

}

void off_mouse() /*鼠标关闭函数*/

{

int num=2;

mouse_IQR(&num,&num,&num,&num);

}

void home(int *x,int *y) /*鼠标状态检验函数*/

{

int button=0,num;

num=3;

mouse_IQR(&num,&button,x,y);

}

int left_press() /*鼠标左键状态检验函数,按下则返回1*/

{

int bx=0,num=3;

mouse_IQR(&num,&bx,&num,&num);

return bx&1;

}

int right_press() /*鼠标左键状态检验函数,按下则返回1*/

{

int bx=0,num=3;

mouse_IQR(&num,&bx,&num,&num);

return bx&2;

}

/*main()

{

int gd=DETECT,gm;

initgraph(&gd,&gm,"");

init_mouse();

show_mouse();

mouseshape(hand_2);

for(;;)

{

if(left_press()==1) break;

}

mouseshape(hand);

getch();

off_mouse();

closegraph();

exit(1);

}*/

main()中你可以测试一下。

在程序中有这样的段代码

Shape hand=

{{ 0xe7ff,0xc3ff,0xc3ff,0xc07f,0xc00f,0xc001,0xc001,0xc001,

0x8001,0x8001,0x8001,0xc003,0xc003,0xe007,0xe007,0xe007,

0x1800,0x2400,0x2400,0x2580,0x26b0,0x26d6,0x2232,0x2222,

0x4222,0x4002,0x4002,0x2004,0x2004,0x1ff8,0x1008,0x1ff8},0,0};

这是什么呀?

这是鼠标的样式你可以自定义的鼠标的形状的。

这是一个手的形状。

0x表示这是十六进制,e7ff事实上就是1110011111111111

你可以用把上面的所有数字一行一行翻译成二进制,从第三排的是掩码。作用是什么自己试

一下。

最后这些组成的就是一个手的形状*^_^*

所以你可以把你要的16*16点阵的图形变成的鼠标形状的。

[总结]★★★★★★★★★★

总之,在C语言里要灵活运用自己的已有的函数,和“抄”别人的函数,这都是十分有效

的学习方法。

对于初学者不必太急于求成,上面提供的代码可能对你们来说是比较深了一点,但是当

你继续学,等你计算机基础及硬件基础到了一定的时候,你会突然发现“原来是这么的简单

”。

学会自学是一个很好的学习方法,计算机最主要的就是自学,从老师手里学的应该是学

习计算机的方法,而为是书本上已有的东西。

学会分析别人的源程序,也是一个更好的学习方法,我就曾仔细读了一个四千多行的C代

码,足足40页纸。即使看不懂,要学会看看得懂的地方,学会别人的程序结构、技巧。慢慢

地你也就会把不懂的也看懂了.

计算机语言都是一通百通的。不论是C、basic、fox还是什么。

还有一点是关于学编程有什么用?

我觉得即使一个初学计算机的人都应该学习一下编程。为什么?因为编程涉及到计算机

每一个领域。从操作到应用。不论你是否能编出什么像样的东西出来,你都可以学到一些更

有用的东西。当你编程有一定的基础,你就可以操作几乎所有的应用软件,有时我自己第一

次在用别人想的应用软件时,就会问自己这个软件是用什么写的?如果是我,我应该怎么编

?我应该在哪方面做得更好?

记得我当初学计算机的时候,用的是dos操作系统,第一次上机,进入的画面是一个黑色

的屏幕,键盘放在那,当时我们只是学了计算机有基本知识,知道计算机的组成、分类,操

作学都没学过。

我在寝室的时候听到过三个字的单词“dir”和一个“cd”,我摸着键盘找到了这三个键

d--i--r.计算机上刷地显示出来了一个英文的列表。许多人围了上来“你学过计算机吧?”

。其实我当然也不明白这个单词的意义。但是学习就是从这里开始的。不停地上机反复地验

证,这是一个学习的方法。dir/s 许多人都没用过即使是当时高年级的学生但是我试出来了

,是试出来的!计算机就是要有一种探索的精神在,对于未知的领域不一试又怎能学会呢。

事实,计算机上的东西只要试一试就会知道了,特别是现在的window操作就是这样,举个简

单的例子,在word中输入公式,我从未看过书,只是听过有人说过有一个叫公式输入法的东

东。当一次有人问我怎样输入公式,可怜呀一个单位的人都不知道。我试了半小时,可就是

没试出来,即使我现在知道怎么用了,我依然后悔,为什么这么多简单的东西,我竟然不会

用,其实就是一个简单的的插入对象的方法呀。

记住“试”是一个很有用的学问!

这里就讲这么多了,因为VB的范例涉及我正在写的一个软件,稍后写完了,我会将VB中

很多有特色的技术在这个范例中介绍出来的。

另,请需要讲下出的朋友请回复一下。为什么反反复复都要提到这个问题呢?因为对于

不同的初学者这篇系列可能讲得有点深。但是如果大家有这个要求的话。我会继续讲下去的

欢迎支持《编程技术》版,我是版主rosesnow。

同时感谢《新手上路》的三位版主谢谢,你们的支持!

-----永远的rosesnowOICQ:2546716

主页:rosesnow.heha.net

::∴★∵**☆.∴★∵**☆

.█████.☆.∵★∵∴☆

.█田█田█.*☆.∴★∵

.█田█田█.★∵∴☆.★∵∴

.█田█田█.同一个星空下★..**

.█田█田█.望著天空的星星雨**☆

.█████.你可会想起我是你的好朋友?

◢██□██◣.此刻我送予你這一句“愿我们友谊永固”~~~~~*^_^*

::∴★∵**☆.∴★∵**☆

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有