DX=文件日期
用途:将文件最后被修改过的日期和时间信息变成指定值。
调用寄存器:AX=5701H,BX=文件把柄,CX=新时间,DX=新日期
返回寄存器:CF复位—成功,
CF置位—出错,AX:错误代码
下面我们就来看这个程序:
#include
#include
#include
int count()
{
union REGS inregs,outregs;
struct SREGS segs;
unsigned handle;
unsigned times;
/*打开文件*/
inregs.h.ah =0x3d;
inregs.h.al =0;
segread(&segs);
inregs.x.dx="test.exe";
intdosx(&inregs, &outregs, &segs);
if(outregs.x.cflag) return(0);
else
{
/*读取文件日期时间*/
handle=outregs.x.ax;
inregs.x.ax=0x5700;
inregs.x.bx=handle;
intdosx(&inregs, &outregs, &segs);
times=(outregs.x.cx &0x7e0)>> 5;
if(times <40)/*试用次数可以通过改变此处的'40'来实现*/
{
inregs.x.ax=0x5701;
inregs.x.bx=handle;
inregs.x.cx=outregs.x.cx + 0x20; /*试用次数计数*/
inregs.x.dx=outregs.x.dx;
intdosx(& inregs, &outregs, &segs); /*重置日期时间*/
return(2);
}
else return(1);
/*关闭文件*/
inregs.h.ah = 0x3e;
inregs.x.bx = handle;
intdosx(& inregs, & outregs, & segs);
}
}
main()
{
int flag;
flag=count();
if(flag==0)printf("此软件为试用版,请勿任意修改!\n");
if(flag==1)printf("此软件为试用版,您的试用次数已满!\n");
if(flag==2)printf("此软件为试用版,欢迎试用!\n");
}
小结
这一讲我们简要介绍了C语言中加密的应用,在D版软件充斥市场的今天,我们有必要好好探讨一下加密算法。虽然本讲的内容比较简单,但是还是希望大家努力学好。
第十二讲C语言大作业设计思路
今天,我们来做C语言高级程序设计讲座的最后一讲,主要讲一下C语言大作业的设计思路。
当前,很多院校在C语言结课的时候都要求做一份大作业,作为考核的一部分,很多同学为此挠头,在这里我们将一些设计的思路,希望能给大家一点提示。所谓大作业,其实质目的就是让学生在制作过程中体验这种设计思路,一般来说,思路有了,其他的就不在话下了。毕竟我们不是要求来做这种Windows之类的
大型软件,Microsoft的精英开发了好几年,如果我们用C语言来做,恐怕也不是一朝一夕能完成的。我们要求学生能够设计出一个小型的游戏或者一个小型的数据库管理软件就很好了。
我们在设计之前,一般考虑以下几点:
1、问题定义
我们首先要知道应该做什么。
2、可行性分析
然后确定这个方案能否实施,不要做那种自己不可能完成的程序,“只有想不到,没有做不到”这句话以马克思主义哲学的观点来看是不成立的。
3、需求分析
如果这个方案可行,就要考虑这个程序需要实现什么功能。
4、系统设计
前面的都确定后,要设计出宏观的框架,例如主界面。
5、详细设计
详细的设计每一项功能。
6、编译并测试
一般来讲,我们提倡每完成一项内容都要编译测试。
7、运行维护
自己用自己的软件,用所有想到的错误操作来操作它,找出所有的内在BUG。
8、发布
如果你自己没有找到错误了,该软件就差不多可以交上去了,结合开发过程我们就可以写出论文来。
下面我们来介绍一个简单的人工智能程序。
初始化人机界面
/*exper_1.c*/
#include
#include
#include
#define N 11
char *pre[]={
"p1","p2","p3","p4","p5","p6","p7",
"p8","p9","p10","p11"
};
char *symptom[]={
"咳嗽","流鼻涕","怕冷","打喷嚏","痰多","体温高","血象偏高",
"泛酸","呕吐","上腹隐痛","食欲不振",
};
main()
{
int i,j;
FILE *fp;
char answer;
char midpre[N][5];
if((fp=fopen("c:\\bc\\bin\\pre.txt","wt"))==NULL)
{
printf("Can not open flie");
exit(0);
}
for(i=0;i { printf("\n你%s吗?\n",symptom); answer=strlwr(getch()); switch(answer) { case 'y': putchar(answer); fprintf(fp,"%s",pre); fprintf(fp," "); break; case 'n': putchar(answer); break; } } fclose(fp); printf("\n你的症状是:"); if((fp=fopen("c:\\bc\\bin\\pre.txt","rt"))==NULL) { printf("Can not open flie"); exit(0); } i=0; while(fscanf(fp,"%s",midpre)!=EOF) { for(j=0;j { if(!strcmp(midpre,pre[j])) printf("%s ",symptom[j]); } } fclose(fp); printf("\n按任意键返回\n"); getch(); } 具体的实例程序 #include #include #include #include #define N 10 #define M 11 struct RL{ int rnum; int rpsum; char pre[N][5]; char res[5]; }; struct RL zrul[N]; char *pre[]={ "p1","p2","p3","p4","p5","p6","p7", "p8","p9","p10","p11" }; char *symptom[]={ "咳嗽","流鼻涕","怕冷","打喷嚏","痰多","体温高","血象偏高", "泛酸","呕吐","上腹隐痛","食欲不振", }; char *result[]={ "r1","r2","r3" }; char *diagnose[]={ "上感","支气管炎","胃炎" }; int have() { FILE *fp; int i,ri=-1,rs=0; char mstr[5]; char dstr[N][5]; if((fp=fopen("c:\\bc\\bin\\jingyan.txt","rt"))==NULL) { printf("Can not open flie"); exit(0); } while(fscanf(fp,"%s",mstr)!=EOF) { if((!strstr(mstr,"p"))&&(!strstr(mstr,"r"))) { ri++; zrul[ri].rnum=atoi(mstr); if(ri>0) { zrul[ri-1].rpsum=rs-1; for(i=0;i strcpy(zrul[ri-1].pre,dstr); strcpy(zrul[ri-1].res,dstr[rs-1]); } rs=0; } else { strcpy(dstr[rs],mstr); rs++; } } zrul[ri].rpsum=rs-1; for(i=0;i strcpy(zrul[ri].pre,dstr); strcpy(zrul[ri].res,dstr[rs-1]); fclose(fp); return(ri+1); } query(int n) { FILE *fp,*fpi; char lstr[N][5]; char mstr[5]; int i=0,j=0,k=0; int psum=0; int agrees=0; int m; if((fp=fopen("c:\\bc\\bin\\pre.txt","rt"))==NULL) { printf("Can not open flie"); exit(0); } if((fpi=fopen("c:\\bc\\bin\\reason.txt","wt"))==NULL) { printf("Can not open flie"); exit(0); } while(fscanf(fp,"%s",mstr)!=EOF) { strcpy(lstr,mstr); i++; } fclose(fp); psum=i; for(i=0;i { if(zrul.rpsum==psum) { for(j=0;j { for(k=0;k { if(!strcmp(lstr[j],zrul.pre[k])) agrees++; } } if(agrees==zrul.rpsum) fprintf(fpi,"%s ",zrul.res); agrees=0; for(m=0;m<11;m++) { if(!strcmp(zrul.res,result[m])) printf("\n对你的症状做出的诊断为:%s\n",diagnose[m]); } } } fclose(fpi); } main() { int n; system("c:\\bc\\bin\\exper_1.exe"); n=have(); query(n); } 文本经验数据库 1 p1 p 2 p 3 p 4 p 5 p 6 p 7 r1 2 p1 p5 p6 r2 3 p8 p9 p10 p11 r3 大家可以通过对本例程的进一步完善使之成为一个专家系统,让自己的电脑成为家庭医生。 到这里,你是不是对C语言大作业的设计有了一定的思路了呢?我们这一讲就到这里了。 小结 这一讲首先对VGA卡的结构原理作了介绍,然后分析了BIOS中断调用来设置图形方式的方法,最后给出了一个完整的调整图像灰度的程序,这些知识在图像处理编程中是有很大作用的。 讲座到这里,我们对于程序外壳编写的讨论就要告一段落了,我们的后继课程将讨论一些编程技术,主要包括:中断调用、底层编程技术、鼠标的使用、程序的内存驻留与释放、软件加密算法等。 第七讲中断调用 鹏程C语言教学网站庆祝建站一周年特别企划 本文技术支持网站:202.112.86.129 从这一讲起我们将过渡到研究程序内部的一些编程方法,不同于前6讲,接下来的内容可能会比较枯燥,但是却是C语言高级程序设计必不可少的部分,我尽量用比较简短的语言来叙述,以避免大家一看页数就头晕。 对于中断调用,其实是很复杂的,这里讲得或许只是一个皮毛,更深入的研究还要大家自己努力。 学习目标 ?了解什么是中断 ?了解几个中断函数 ?了解中断服务程序的编写 什么是中断 所谓中断,是指CPU在正常运行程序时,由于程序的预先安排或内外部事件,引起CPU中断正在运行的程序,而转到为预先安排的事件或内外部事件服务的程序中,这些引起程序中断的事件称为中断源。预先安排的事件是指PC机的中断指令,执行到此,立即转相应的服务程序去执行。内部事件是指系统板上出现的一些事件信号,中断指令也可看作内部事件,外部事件是指某些接口设备所发出的请示中断程序执行的信号,这些信号称为中断请求信号。中断请求信号何时发生是不能预知的,然而,它们一旦请求中断,则会向CPU的接收中断信号的引脚发出电信号,因此这些信号CPU是马上可以知道的。这样CPU就无需花大量的时间去查询这些信号是否产生。因为中断请示信号一旦产生,便会马上通知CPU。如键盘,何时有键按下,是随机的。因而CPU可以对键盘不加理睬,而去执行其他程序,一旦有键按下,键盘马上产生中断请求信号,CPU得知这信号后,便立即去执行为键盘服务的中断程序,服务完后,CPU又恢复执行被中断了的程序。中断服务程序执行完,返回原来执行程序的中断处(称为断点)继续往下执行,称为中断返回。有时中断请求信号(即中断源)可能有好几个,因此CPU 响应这些中断就得有先后次序,这称为中断的优先级。CPU首先响应优先级高的中断,优先级低的中断,暂不响应,称为挂起。有些中断源产生的中断,可以用编程的办法使CPU 不予理睬,这叫中断的屏蔽。CPU响应中断,转去执行中断服务程序前,需将被中断程序的现场信息保存下来,以便执行完中断服务程序后,接着从被中断程序的断点处继续往下执行。现场信息是指程序计数器的内容、CPU的状态信息、执行指令后的结果特征和一些通用寄存器的内容,有些信息的保存和程序计数器的内容等由机器硬件预先安排完成,称为中断处理的隐操作。有些信息保存是在中断服务程序中预先安排的。CPU响应中断时,由中断源提供地址信息,引导程序转移到中断程序中去执行。这个地址信息称为中断向 量,它一般是和中断源相对应的,PC机采用类型号来标识中断源。 中断方式以其执行速度快,可实时处理,不占用CPU过多的时间等优点,在一些高级应用场合中较多地被采用。PC机中断系统不仅具备一般中断系统的特点,而且有所创新,比如,中断不仅可由外部事件引起,也可由预先安排的事件,或称为内部的事件引起,这些内部事件是指中断指令和执行一些指令引起的特殊事件等。
搜索“diyifanwen.net”或“第一范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,第一范文网,提供最新小学教育C语言课程设计(图形编程 全)(3)全文阅读和word下载服务。
相关推荐: