文中介绍了一种实现VB调用C语言程序的方法

时间:2019-05-12 21:03:40下载本文作者:会员上传
简介:写写帮文库小编为你整理了多篇相关的《文中介绍了一种实现VB调用C语言程序的方法》,但愿对你工作学习有帮助,当然你在写写帮文库还可以找到更多《文中介绍了一种实现VB调用C语言程序的方法》。

第一篇:文中介绍了一种实现VB调用C语言程序的方法

文中介绍了一种实现VB调用C语言程序的方法-动态连接库法,给出了动态链接库制作的一般框架,通过实例描述了动态连接库的实现及其制做方法、编程步骤,这种方法具有普遍的意义。

关键词 VB 动态连接库DLL C程序

一、引言 Visual Basic(以下简称VB)是一种可视化的面向对象的编程语言,以其编程简单、快捷等特点,深受广大WINDOWS程序员的青睐。利用VB开发界面友好、操作方便的软件只需很短的时间。但是VB运行速度较慢,对于庞大的科学计算问题,VB的这种慢速会使人难以忍受。C语言是国际上非常流行的一种中级编程语言,以其灵活、高效等优点而获得广泛应用,许多的应用程序都是用C语言在DOS环境下编写而成。那么如何发挥VB和C这两种语言的优势,用VB设计一种良好的for windows界面来调用C语言程序,即实现VB调用C语言程序呢?现有的文献只提到动态链接库(以下简称DLL)可以将这两种语言连接起来,但有讲动态链接库DLL的制做及其编程方法。本文详细介绍了Borland C环境下制作动态链接库以及VB调用for dos动态链接库的的方法、步骤,并通过实例描述VB调用C程序的全过程。

二、用Borland C编写DLL程序的方法 要想实现VB调用C程序,首先需要用Borland C编写动态连接库DLL程序(假设DLL程序取名为example)。动态链接库包含四个文件:C语言源程序(.C)、模块定义文件(.DEF)、原型函数文件(.H)和工程文件(.PRJ)。下面分别详细介绍一下这四种文件的具体结构。

1、编写C语言源程序的框架:C语言源程序(example.C),它包括三种函数:入口函数、输出函数和终止函数。其具体 结构如下:

/*************************************/ /* 文件名: example.C */ /*************************************/ #include /***********入口函数***********/ int FAR PASCAL LibMain(HANDLE hInstance, WORD wDataSeg, WORD cbHeapSize, LPSTR lpszCmdLine){ if(cbHeapSize!=0)UnlockData(0);return(1);} /***********输出函数***********/ int FAR PASCAL example(int param1,...,char param n){....../*C语言应用程序*/ } /***********终止函数***********/ int FAR PASCAL WEP(int /*SystemExit*/){ return(1);} 以上各组成部分参数的含义:Windows.h头文件,它包含有数据类型的定义、API入口点定义和其它有用的参数信息。PASCAL说明符定义该程序的传递参数和净化堆栈的协定(注意:DLL外部传送的指针必须是远指针FAR)。LibMain带四个参数:hInstance、wDataSeg、cbHeapSize和lpszCmdLine。第一个参数hInstance是DLL事例句柄,wDataSeg参数是数据段(DS)寄存器值,bHeapSize参数是在模块定义文件中定义的堆的大小,LibMain 使用该值使本地堆初始化。lpszCmdLine参数包括命令行信息,但很少被DLL使用。一般来说,这四个参数是制作DLL通用的参数。如果不想让DLL数据被封住,那么必须调用unlockdata恢复正常的非锁状态,如果DLL初始化已经成功,DLL则返回1,若不成功则返回0值,且 DLL退出系统。DLL的输出函数实现用户所要完成的任务,这部分是DLL的核心。它与一般C语言程序不同之处在于无scanf函数。所有的外部指针都是远指针FAR。画直线函数要用lineto函数。DLL包括一个终止函数,终止函数有时称为退出函数,它的名字必须是WEP。且它可以被包括在DLL模块定义文件的EXPORTS段中。

2、模块定义文件(.DEF)的结构和各段的意义 模块定义文件的结构如下:

/*************************************/ /* 文件名: example.DEF */ /*************************************/ LIBRARY example /* DLLname */ DESCRIPTION ' example.DLL' EXETYPE WINDOWS CODE PRELOAD MOVEABLE DISCARDABLE DATA PRELOAD MOVEABLE SINGLE HEAPSIZE 1024 EXPORTS example @1 WEP @2 关键字LIBRARY是把这个模块视为一个DLL,库的名字example跟在其后,且必须与该库的名字、DEF中的DLL的文件名相一致。DESCRIPTION语句采用一个字符串,其长度可达128 个字符,通常用它来保存模块描述的信息。EXETYPE windows语句每个windows应用程序和 DLL都需要。DATA语句定义该库数据段的内存属性,关键字MOVEABLE允许内存管理程序在 必要时移动内存段,关键字SINGLE是DLL必要,因为DLL总是有一个单一数据段,而不管访 问它的应用程序的数量。HEAPSIZE语句用来定义一个DLL局部堆的初始规模,执行局部内 存分配的DLL必须在库启动时使该堆初始化,堆的大小被传送给DLL的LiEntry的程序。然 后用该堆的大小调用Locallnit使DLL的局部堆初始化。EXEPORTS语句定义将被用作来自应用程序或来自其它DLL入口点的程序,windows利用这个信息建立一个序数入口值,序数入口值是一个优化的值,允许动态连接机制更快块操作且使用较少的内存。一般来说,模块定义文件(.DEF)的结构除取动态库的名字不同外,其它结构都是固定的。3.建立原形函数文件(.H)原形函数的功能是进一步声明调用函数的函数名和传递的参数,其形式为: /*************************************/ /* 文件名: example.H */ /*************************************/ extern “C” int _export FAR PASCAL example(int param1,...,char param n);4.建立工程文件(.PRJ)工程文件中包含有example.C、example.DEF两个文件后,然后编译连接生成动态链接库即可。

以上是制作动态连接库的框架,现在通过一个实例介绍制作动态链接库的方法。如要求程序完成功能为:打开一个数据文件读出前两个数据,将这两个数与所传递的两个参数相加,返回它们的和。设该DLL程序的名字为ADD。

第一步:在Borland C++环境下编辑.C文件、.DEF文件和.H文件,并建立.PRJ文件。如

(1)编写C语言源程序清单:

/*************************************/

/* 文件名: ADD.C */ /*************************************/ #include #include #include #include #include #include #include #include #include “c:ADD.h” /*入口函数*/ int FAR PASCAL LibMain(HANDLE hInstance , WORD wDataSeg , WORD cbHeapSize, LPSTR lpszCmdLine){ if(cbHeapSize!=0)UnlockData(0);return 1;} /*输出函数*/ int FAR PASCAL ADD(int x,int y,char *filein){ int a,b;

fp=fopen(filein,“r”);if(fp==NULL){ exit(0);} int temp1=0,temp2=0;fscanf(fp,“%d”,&a);fscanf(fp,“%d”,&b);temp1=x+a;temp2=y+b;temp1=temp1+temp2;fclose(fp);return(temp1);} /*退出函数*/ int FAR PASCAL WEP(int/*SystemExit*/){ return(1);} 2)ADD.DEF文件的程序清单:

/*************************************/ /* 文件名: ADD.H */ /*************************************/ LIBRARY ADD DESCRIPTION 'ADD.DLL' EXETYPE WINDOWS CODE PRELOAD MOVEABLE DISCARDABLE DATA PRELOAD MOVEABLE SINGLE HEAPSIZE 1024 EXPORTS ADD @1 WEP @2(3)ADD.H程序清单:

/*************************************/ /* 文件名: ADD.H */ /*************************************/ extern “C” int _export FAR PASCAL add(int x,int y,char *filein);(4)建立工程文件:

在Borland C++环境下的project项中打开open project file项并建立ADD.prj,在add item中加入ADD.C文件和ADD.DEF文件即可建立工程文件。第二步,在Borland C的options项的Applation中选择Windows DLL,再在Compile中选择Build all,这样就可生成动态链接库ADD.DLL供VB调用。

三、VB3.0调用动态链接库DLL方法 制作好DLL之后,就可以用VB调用它,实现VB调用C程序。VB程序要使用DLL中的函数,首先必须要有特殊的声明,用Declare声明语句在窗体级或模块级或全局模块的代码声明段进行声明,将动态链接库中的函数声明到VB中,供VB程序调用。语句格式为:Declare Sub 过程名Lib摽鈹黚_n[ Alias “ 别名]([ByVal 参数AS类型]),或为Declare Function函数名Lib摽鈹黚_衃 Alias ” 别名]([ByVal 参数AS类型])AS类型在声明中首先用Declare关键字表示声明DLL中的函数。在C语言中有的函数类型为VOID,它表示不具有返回值,则必须用关键字Sub将其声明成过程。有的函数具有返回值,则必须用关键字Function将其声明成函数,并且在声明语句的最后要用AS关键字指明函数返回值的类型。例如上面的ADD.DLL在VB中就可以声明为: Declare Function ADD Lib撫c:ADD.dll敚―ByVal X AS Integer, ByVal Y AS Integer ,ByVal filein as string)AS Integer通过此声明语句将函数ADD声明到VB中,便可直接调用。

四、结束语 以上详细介绍了Borland C环境下制作动态链接库以及VB调用for dos动态链接库的方法、步骤,并通过实例说明VB调用C语言程序的方法。举例程序ADD经VB3.0编译,在486微机上调试通过。本文介绍的方法具有广泛的意义,也完全适用于C++ 语言程序。

第二篇:c语言实现两个字符串连接的几种方法

#define _CRT_SECURE_NO_WARNINGS

#include #include #include void mystrcat(char *p,char *q){ char *pp = p;while(*pp!= ''){

pp++;} *pp = ' ';while(*q!= ''){

*(++pp)= *(q++);} *(++pp)= '';} void main(){ char str[30] = “tracert”;char web[50];char lin[80];scanf(“%s”, web);printf(“%s”, web);//第一种方法

/*sprintf(lin, “%s %s”, str, web);printf(“n%s”, lin);*/ //第二种方法

/*strcat(str, “ ”);strcat(str, web);printf(“n%s”, str);*/ //第三种方法

mystrcat(str, web);system(str);system(“pause”);}

第三篇:C语言课程设计 职工信息管理系统 单链表实现程序源代码

//C语言课程设计 职工信息管理系统—单链表实现 #include “stdio.h” #include “stdlib.h” #include “string.h”

int saveflag=0;/*是否需要存盘的标志变量*/

struct employee { char name[15];char num[10];/* 工号 */ char sex[4];char bm[15];char zc[20];int gz;

};

typedef struct node { struct employee data;struct node *next;}Node,*Link;

//Link l(注意是:字母l不是数字1)void add(Link l);void disp(Link l);//查看职工所有信息 void del(Link l);//删除功能

Node* Locate(Link l,char findmess[],char nameornum[]);

void Qur(Link l);//查询功能 void Tongji(Link l);//统计 void Sort(Link l);//排序 void Modify(Link l);//修改功能

void save(Link l);//将单链表l中的数据写入文件

void printe(Node *p);//本函数用于打印链表中某个节点的数据内容 */

//以下4个函数用于输出中文标题 void printstart();void Wrong();void Nofind();void printc();

void menu(){ printf(“t*****************************************************************n”);printf(“t* *n”);printf(“t*

职工信息管理系统_结构体数组实现 *n”);printf(“t* *n”);printf(“t* [1] 增加职工信息 [2] 删除职工信息 *n”);printf(“t* [3] 查询职工信息 [4] 修改职工信息 *n”);printf(“t* [5] 插入职工记录 [6] 统计职工记录 *n”);printf(“t* [7] 排序 [8] 保存职工信息 *n”);printf(“t* [9] 显示数据 [0] 退出系统 *n”);printf(“t* *n”);printf(“t*****************************************************************n”);} //void menu菜单结束

void Disp(Link l)//显示单链表l中存储的职工记录,内容为employee结构中定义的内容 { int count=0;Node *p;p=l->next;// l存储的是单链表中头结点的指针,该头结点没有存储职工信息,指针域指向的后继结点才有职工信息

if(!p)/*p==NULL,NUll在stdlib中定义为0*/ {

printf(“n=====>提示:没有职工记录可以显示!n”);

return;}

printf(“tttt显示结果n”);printstart();//打印横线

printc();//打印各学科标题

printf(“n”);

while(p)//逐条输出链表中存储的职工信息

{

printe(p);

p=p->next;} printstart();printf(“n”);} //void Disp结束

void printstart(){ printf(“---------n”);}

void Wrong(){ printf(“n=====>提示:输入错误!n”);}

void Nofind(){ printf(“n=====>提示:没有找到该职工!n”);}

void printc()/* 本函数用于输出中文 */ { printf(“ 工号t 姓名 性别 部门 职称 工资 总工资平均工资n”);}

void printe(Node *p)/* 本函数用于打印链表中某个节点的数据内容 */ { printf(“%-12s%st%st%dt%dt%dt %dt %dn”,p->data.num,p->data.name,p->data.sex,p->data.bm,p->data.zc,p->data.gz);}

//Locate(l,findmess,“num”);/* 该函数用于定位连表中符合要求的结点,并返回该指针 */ Node* Locate(Link l,char findmess[],char zcornum[]){ Node *r;if(strcmp(zcornum,“num”)==0)/* 按工号查询 */ {

r=l->next;

while(r!=NULL)

{

if(strcmp(r->data.num,findmess)==0)/*若找到findmess值的工号*/

return r;

r=r->next;

} } else if(strcmp(zcornum,“zc”)==0)/* 按职称查询 */ {

r=l->next;

while(r!=NULL)

{

if(strcmp(r->data.zc,findmess)==0)/*若找到findmess值的职工职称*/

return r;

r=r->next;

} } return 0;/*若未找到,返回一个空指针*/ }

//add()函数中,无节点时,r指向list头,有节点时,r指向末尾节点 void Add(Link l)/* 增加职工 */ { Node *p,*r,*s;/*实现添加操作的临时的结构体指针变量*/ char num[10];int flag=0;r=l;s=l->next;//链表没有节点时,s=null;/链表有节点时,指向第一个职工节点

while(r->next!=NULL)//如果存在后继结点时,r指针后移一个

r=r->next;/*将指针移至于链表最末尾,准备添加记录*/

while(1){

printf(“请你输入工号(以'0'返回上一级菜单:)”);

scanf(“%s”,num);

if(strcmp(num,“0”)==0)//输入'0',跳出while(1),即跳出add()函数

break;

s=l->next;//作用? 每次从第一个节点开始找,看num是否重复。

while(s)//工号重复时,返回主菜单

{

if(strcmp(s->data.num,num)==0)

{

printf(“=====>提示:工号为'%s'的职工已经存在,若要修改请你选择'4 修改'!n”,num);

flag=1;//break;

return;

}

s=s->next;

} //while(s)

p=(Node *)malloc(sizeof(Node));//生成没赋值的新节点 p

strcpy(p->data.num,num);

printf(“请你输入姓名:”);

scanf(“%s”,p->data.name);

getchar();

printf(“请你输入性别:”);

scanf(“%s”,p->data.sex);

getchar();

printf(“请你输入职工所在部门:”);

scanf(“%d”,&p->data.bm);

getchar();

printf(“请你输入职工职称:”);

scanf(“%d”,&p->data.zc);

getchar();

printf(“请你输入职工工资:”);

scanf(“%d”,&p->data.gz);

getchar();

/* 信息输入已经完成 */

p->next=NULL;/*表明这是链表的尾部结点*/

r->next=p;/*将新建的结点加入链表尾部中*/

r=p;

saveflag=1;} //while(1)} //void Add增加结束

void Del(Link l)/* 删除 */ { int sel;Node *p,*r;/*实现删除操作的临时的结构体指针变量*/ char findmess[20];

if(!l->next)//当list无后继结点时,提示和结束返回del(){

printf(“n=====>提示:没有记录可以删除!n”);

return;}

printf(“n=====>1按工号删除n=====>2按姓名删除n”);scanf(“%d”,&sel);if(sel==1)//按工号删除

{

printf(“请你输入要删除的工号:”);

scanf(“%s”,findmess);

p=Locate(l,findmess,“num”);

if(p)

{

r=l;

while(r->next!=p)

r=r->next;//从第一个结点找起,直到发现r->next=p, 删除结点,跳出循环

r->next=p->next;//r r->next(p)p->next

free(p);

printf(“n=====>提示:该职工已经成功删除!n”);

saveflag=1;

}

else

Nofind();//显示一句话

} //if(sel==1)else if(sel==2)//按姓名删除

{

是待

printf(“请你输入要删除的姓名:”);

scanf(“%s”,findmess);

p=Locate(l,findmess,“name”);

if(p)

{

r=l;

while(r->next!=p)

r=r->next;

r->next=p->next;//r r->next(p)p->next

free(p);

printf(“n=====>提示:该职工已经成功删除!n”);

saveflag=1;

}

else

Nofind();} //if(sel==2)else

Wrong();//显示输入错误的话 } //void Del删除结束

void Qur(Link l)//查询功能 { int sel;char findmess[20];Node *p;//实现查询操作的临时的结构体指针变量

if(!l->next){

printf(“n=====>提示:没有资料可以查询!n”);

return;}

printf(“n=====>1按工号查找n=====>2按职称查找n”);scanf(“%d”,&sel);

if(sel==1)/* 工号 */ {

printf(“请你输入要查找的工号:”);

scanf(“%s”,findmess);

p=Locate(l,findmess,“num”);

if(p)

{

printf(“tttt查找结果n”);

printstart();//打印横线

printc();//打印各学科标题

printe(p);//打印p结点各个数据成员的值

printstart();//打印横线

}

else

Nofind();} //if(sel==1)

else if(sel==2)/* 职称 */ {

printf(“请你输入要查找的职称:”);

scanf(“%s”,findmess);

p=Locate(l,findmess,“zc”);

if(p)

{

printf(“tttt查找结果n”);

printstart();

printc();

printe(p);

printstart();

}

else

Nofind();} else

Wrong();} //void Qur查询结束

void Modify(Link l)//修改功能 { Node *p;char findmess[20];if(!l->next){

printf(“n=====>提示:没有资料可以修改!n”);

return;}

printf(“请你输入要修改的职工工号:”);scanf(“%s”,findmess);p=Locate(l,findmess,“num”);

if(p){

printf(“请你输入新工号(原来是%s):”,p->data.num);

scanf(“%s”,p->data.num);

printf(“请你输入新姓名(原来是%s):”,p->data.name);

scanf(“%s”,p->data.name);

getchar();

printf(“请你输入新性别(原来是%s):”,p->data.sex);

scanf(“%s”,p->data.sex);

getchar();

printf(“请你输入新的部门(原来是%s):”,p->data.bm);

scanf(“%d”,&p->data.bm);

printf(“请你输入新的职称(原来是%s):”,p->data.zc);

scanf(“%d”,&p->data.zc);

getchar();

printf(“请你输入新的工资(原来是%d):”,p->data.gz);

scanf(“%d”,&p->data.gz);

printf(“n=====>提示:资料修改成功!n”);

//shoudsave=1;} else

Nofind();//if(p)结束

} //void Modify(Link l)//修改功能结束

//插入记录:按工号查询到要插入的节点的位置,然后在该工号之后插入一个新节点。

void Insert(Link l){ Node *s,*r,*p;/*p指向插入位置,p指新插入记录节点*/ char ch,new_num[10],old_num[10];//old_num[]保存插入点位置之前的工号,new_num[]保存输入的新记录的工号

int flag=0;s=l->next;system(“cls”);Disp(l);

while(1){

//stringinput(s,10,“please input insert location after the Number:”);

printf(“请你输入已存在的工号(以'0'返回上一级菜单:)”);

scanf(“%s”,old_num);

if(strcmp(old_num,“0”)==0)//输入'0',跳出while(1),即跳出Insert()函数

return;

s=l->next;//作用? 每次从第一个节点开始找

flag=0;

while(s)/*查询该工号是否存在,flag=1表示该工号存在*/

{

if(strcmp(s->data.num,old_num)==0)

{

flag=1;

break;

}

s=s->next;

}

if(flag==1)

break;/*若工号存在,则进行插入之前的新记录的输入操作*/

else

{

getchar();

printf(“n=====>The number %s is not existing,try again?(y/n):”,old_num);

scanf(“%c”,&ch);

if(ch=='y'||ch=='Y')

{continue;}

else

{return;} //回主菜单

}

}//while(1)/*以下新记录的插入新节点,工号不能跟已存在的工号相同,操作与Add()相同*/

printf(“请你输入待插入的工号(以'0'返回上一级菜单:)”);scanf(“%s”,new_num);if(strcmp(new_num,“0”)==0)//输入'0',跳出while(1),即跳出add()函数

return;s=l->next;//作用? 每次从第一个节点开始找,看num是否重复。

while(s)//工号重复时,返回主菜单

{

if(strcmp(s->data.num,new_num)==0)

{

printf(“=====>提示:工号为'%s'的职工已经存在'!n”,new_num);

flag=1;

return;

}

s=s->next;} //while(s)

p=(Node *)malloc(sizeof(Node));if(!p){

printf(“n allocate memory failure ”);/*如没有申请到,打印提示信息*/

return;/*返回主界面*/ }

strcpy(p->data.num,new_num);printf(“请你输入姓名:”);scanf(“%s”,p->data.name);getchar();printf(“请你输入性别:”);scanf(“%s”,p->data.sex);getchar();printf(“请你输入部门:”);scanf(“%d”,&p->data.bm);getchar();printf(“请你输入职称:”);scanf(“%d”,&p->data.zc);getchar();printf(“请你输入工资:”);scanf(“%d”,&p->data.gz);getchar();// 信息输入已经完成

p->next=NULL;/*表明这是链表的尾部结点*/

saveflag=1;/*在main()有对该全局变量的判断,若为1,则进行存盘操作*/ /*将指针赋值给r,因为l中的头节点的下一个节点才实际保存着学生的记录*/

r=l->next;while(1){

if(strcmp(r->data.num,old_num)==0)/*在链表中插入一个节点*/

{

p->next=r->next;

r->next=p;

break;

}

r=r->next;}// while(1),r作为查询指针,依次从第一个节点找起,找到后 跳出 while(1)循环

Disp(l);printf(“nn”);// getchar();

}

void Tongji(Link l)//统计 { Node *max,*min;/*用于指向工资最高的节点*/ Node *t=l->next;if(!t){

system(“cls”);

printf(“n=====>Not employee record!n”);

getchar();

return;} system(“cls”);Disp(l);max=min=t;while(t){

if(t->data.gz>=max->data.gz)max=t;

if(t->data.gz<=min->data.gz)min=t;

t=t->next;

printf(“最高工资为:%dn”,max);

printf(“t%st%st%st%st%st%dnn”,t->data.num,t->data.name,t->data.sex,t->data.bm,t->data.zc,t->data.gz);printf(“最低工资为:%dn”,min);

printf(“t%st%st%st%st%st%dnn”,t->data.num,t->data.name,t->data.sex,t->data.bm,t->data.zc,t->data.gz);} }

void Sort(Link l)//排序 { Link ll;Node *p,*rr,*s;int i=0;if(l->next==NULL){ system(“cls”);printf(“n=====>Not employee record!n”);getchar();return;} ll=(Node*)malloc(sizeof(Node));/*用于创建新的节点*/ if(!ll){

printf(“n allocate memory failure ”);/*如没有申请到,打印提示信息*/

return;/*返回主界面*/ } ll->next=NULL;system(“cls”);Disp(l);/*显示排序前的所有职工记录*/ p=l->next;while(p)/*p!=NULL*/ {

s=(Node*)malloc(sizeof(Node));/*新建节点用于保存从原链表中取出的节点信息*/

if(!s)/*s==NULL*/

{

printf(“n allocate memory failure ”);/*如没有申请到,打印提示信息*/

return;/*返回主界面*/

}

s->data=p->data;/*填数据域*/

s->next=NULL;/*指针域为空*/

rr=ll;

/*rr链表于存储插入单个节点后保持排序的链表,ll是这个链表的头指针,每次从头开始查找插入位置*/

while(rr->next!=NULL && rr->next->data.gz>=p->data.gz)

{rr=rr->next;} /*指针移至总分比p所指的节点的总分小的节点位置*/

if(rr->next==NULL)/*若新链表ll中的所有节点的总分值都比p->data.gz大时,就将p所指节点加入链表尾部*/

rr->next=s;

else /*否则将该节点插入至第一个总分字段比它小的节点的前面*/

{

s->next=rr->next;

rr->next=s;

}

p=p->next;/*原链表中的指针下移一个节点*/ }

l->next=ll->next;/*ll中存储是的已排序的链表的头指针*/

Disp(l);saveflag=1;printf(“n =====>sort complete!n”);}

void Save(Link l){ FILE* fp;Node *p;//实现保存操作的临时的结构体指针变量

int flag=1,count=0;

fp=fopen(“employee.txt”,“wb”);if(fp==NULL){

printf(“n=====>提示:重新打开文件时发生错误!n”);

return;}

p=l->next;//p指向第一个记录结点

while(p){

if(fwrite(p,sizeof(Node),1,fp)==1)//将第一个记录结点值写入文件

{

p=p->next;//依次写入第二个结点的值,count++;//文件的记录数+1

}

else

{

flag=0;

break;

} } //while(p)

if(count>0){

printf(“n=====>提示:文件保存成功.(有%d条记录已经保存.)n”,count);

saveflag=0;} else {

system(“cls”);

printf(“保存文件失败,'0'条记录被保存!n”);} fclose(fp);} // void Save结束

void main(){ Link list;/*定义链表*/ // struct node *list;FILE *fp;/* 文件指针 */ int choose;/*保存选择结果变量*/ char ch;/*保存(y,Y,n,N)*/

int count=0;/*保存文件中的记录条数(或结点个数)*/ struct node *p,*r;/*定义记录指针变量*/ printf(“tttt职工信息管理系统nttttn”);

list=(struct node*)malloc(sizeof(struct node));

if(!list){

printf(“n allocate memory failure ”);/*如没有申请到,打印提示信息*/

return;/*返回主界面*/ }

list->next=NULL;r=list;

fp=fopen(“employee.txt”,“rb”);if(fp==NULL){

printf(“n=====>提示:文件还不存在,是否创建?(y/n)n”);

scanf(“%c”,&ch);

if(ch=='y'||ch=='Y')

fp=fopen(“employee.txt”,“ab+”);

else

exit(0);} // if(fp==NULL)

printf(“n=====>提示:文件已经打开,正在导入记录......n”);

while(!feof(fp))//没有到文件尾时,循环

{

p=(struct node*)malloc(sizeof(struct node));

if(!p)

{

printf(“ memory malloc failure!n”);/*没有申请成功*/

exit(0);/*退出*/

}

if(fread(p,sizeof(struct node),1,fp))/* 读文件的已有内容放入结点中 */

{

p->next=NULL;

r->next=p;

r=p;/* 将该结点挂入链表中, r指向最后的节点 */

count++;

} } //while(!feof(fp))

fclose(fp);/* 关闭文件 */ printf(“n=====>提示:记录导入完毕,共导入%d条记录.n”,count);

while(1){

menu();

printf(“tt====>请选择:”);

scanf(“%d”,&choose);

if(choose==0)

{

if(saveflag==1)

{

getchar();

printf(“n=====>提示:资料已经改动,是否将改动保存到文件中(y/n)?n”);

scanf(“%c”,&ch);

if(ch=='y'||ch=='Y')

Save(list);

} //if

printf(“n=====>提示:你已经退出系统,再见!n”);

break;

}//if

switch(choose)

{

case 1:Add(list);

break;/* 增加职工记录 */

case 2:

Del(list);

break;/* 删除职工记录 */

case 3:

Qur(list);

break;/* 查询职工记录 */

case 4:

Modify(list);

break;/* 修改职工记录 */

case 5:

Insert(list);

break;/*插入职工记录*/

case 6:

Tongji(list);

break;/*统计职工记录*/

case 7:

Sort(list);

break;/*排序职工记录*/

case 8:

Save(list);

break;/* 保存职工记录 */

case 9:

system(“cls”);

Disp(list);

break;/*显示职工记录*/

default:

Wrong();

getchar();

break;

} //switch(choose)}//while(1)} //main()/* */

第四篇:C语言课程设计 职工信息管理系统 结构体数组实现程序源代码

//C语言课程设计 职工信息管理系统—结构体数组实现 #include #include #include

struct employee { char num[10];char name[15];char sex[5];char bm[20];char zc[20];int gz;};

int read_file(struct employee em[]);void menu();void write_file(struct employee em[]);void add();void select();//查看职工所有信息 void zc_query();//按职称查询 void num_del();//按工号删除 void tongji();//统计 void sort();//排序

void num_modify();//按工号修改职工信息 void save();//保存信息 void disp();//显示职工信息

void fh();//返回主菜单

struct employee em[300];//这个数组用来保存所有的职工信息 和文件里面的一致

int Number=0;//记录总的职工人数 也就是数组/文件里面的职工人数

void menu(){ printf(“t***********************************************************************n”);printf(“t* *n”);printf(“t*

职工信息管理系统_结构体数组实现 *n”);printf(“t* *n”);printf(“t* [1] 增加职工信息 [2] 查看职工信息 *n”);printf(“t* [3] 查找职工信息 [4] 删除职工信息 *n”);printf(“t* [5] 统计 [6] 职工工资排列 *n”);printf(“t* [7] 修改职工信息 [8] 保存职工信息 *n”);printf(“t* [9] 显示职工信息 [0] 退出系统 *n”);printf(“t* *n”);printf(“t***********************************************************************n”);} void main(){ int choose=0;FILE *fp=NULL;char yesorno;

if((fp=fopen(“employee1.txt”,“rb+”))==NULL){ printf(“n=========>提示:文件不存在,是否要创建一个?(y/n)n”);scanf(“%c”,&yesorno);if(yesorno=='y'||yesorno=='Y'){

//这里仅为了建立文件

fp=fopen(“employee1.txt”,“wb+”);

fclose(fp);//关闭fp所指的文件,释放文件缓冲区

} else

exit(0);} else {

Number=read_file(em);//要是文件已经有数据 将数据初始化到数组中 } system(“cls”);while(1){ menu();printf(“tt====>请选择:”);scanf(“%d”,&choose);system(“cls”);switch(choose){ case 0:

exit(0);//退出

break;

case 1:

add();

fh();//增加职工信息 break;

case 2:

select();

fh();//查看职工信息 break;

case 3:

zc_query();

fh();// 查找

break;

case 4:

num_del();

fh();//删除

break;

case 5:

tongji();

fh();//统计 break;case 6:

sort();

fh();//排序 break;case 7:

num_modify();

fh();//修改后返回 break;

case 8:

save();

fh();//保存

break;

case 9:

disp();

fh();

break;//显示

default:

break;

} fflush(stdin);getchar();system(“cls”);} } void save(){ printf(“t=====程序在运行时已自动保存.....n”);} void fh(){ printf(“t===>按Enter键返回主菜单n”);}

void num_modify()//修改职工信息 { FILE *fp=NULL;char gh[60];int i=0;int changeIndex=0;//changeIndex 改变标记

int index=0;printf(“请输入要修改的职工工号:”);scanf(“%s”,gh);for(i=0;i

if(strcmp(gh,em[i].num)==0)//比较输入工号和数组中已有工号

{

changeIndex=i;//保存要修改的人的下标

break;

}

} printf(“t工号t姓名t性别t部门t职称t工资n”);printf(“t%st%st%st%st%st%dnn”,em[changeIndex].num,em[changeIndex].name,em[changeIndex].sex,em[changeIndex].bm,em[changeIndex].zc,em[changeIndex].gz);printf(“请重新输入该职工信息”);printf(“工号:”);scanf(“%s”,em[changeIndex].num);printf(“姓名:”);scanf(“%s”,em[changeIndex].name);printf(“性别:”);scanf(“%s”,em[changeIndex].sex);printf(“部门:”);scanf(“%d”,em[changeIndex].bm);printf(“职称:”);scanf(“%s”,em[changeIndex].zc);printf(“工资:”);scanf(“%d”,&em[changeIndex].gz);

//信息修改后重新更新文件里面的数据 以保持数据一致性

fp=fopen(“employee1.txt”,“wb+”);for(i=0;i

fwrite(&em[i],sizeof(struct employee),1,fp);//把ptr所指向n*size个字节输入到fp所指向的文件中

} fclose(fp);printf(“t=======>修改成功n”);}

void disp()//输出所有职工信息 { int i=0;for(i=0;i

printf(“t%st%st%st%st%st%dnn”,em[i].num,em[i].name,em[i].sex,em[i].bm,em[i].zc,em[i].gz);} }

void sort()//排序 {

struct employee t;

int wantNUmber=0;int i=0;int j=0;int k=0;for(i=0;i

for(j=i+1;j

{

if(em[j].gz>em[k].gz)

k=j;

}

if(k!=i)

{

t=em[i];

em[i]=em[k];

em[k]=t;

}

}

printf(“你想输出前几名职工的信息:”);scanf(“%d”,&wantNUmber);if(wantNUmber>Number){

wantNUmber=Number;}

printf(“t工号t姓名t性别t部门t职称t工资n”);for(i=0;i

printf(“t%st%st%st%st%st%dnn”,em[i].num,em[i].name,em[i].sex,em[i].bm,em[i].zc,em[i].gz);}

}

void tongji()//统计 {

int i,m,k,max,min;double sum=0.0;for(i=0;i

if(em[i].gz>max)

m=i;

max=em[m].gz;} printf(“最高工资为:%dn”,max);printf(“t%st%st%st%st%st%dnn”,em[m].num,em[m].name,em[m].sex,em[m].bm,em[m].zc,em[m].gz);i=0;k=0;min=0;min=em[0].gz;for(i=1;i

if(em[i].gz

k=i;

min=em[k].gz;} printf(“最低工资:%dn”,min);printf(“t%st%st%st%st%st%dnn”,em[k].num,em[k].name,em[k].sex,em[k].bm,em[k].zc,em[k].gz);

}

void num_del()//按工号删除 { FILE *fp=NULL;char gh[60];int i=0;int j=0;printf(“请输入要删除的职工工号:”);scanf(“%d”,gh);for(i=0;i

if(strcmp(gh,em[i].num)==0)//如果查找到就删除

{

for(j=i;j

{

em[j]=em[j+1];

}

Number--;

} }

//将剩余数据写入文件 重新一写的方式打开文件 把以前的数据擦除了

fp=fopen(“employee1.dat”,“wb”);for(i=0;i

fwrite(&em[i],sizeof(struct employee),1,fp);} fclose(fp);printf(“删除成功;n”);}

void zc_query()//按职称查找 {

char zc[20];int i=0;printf(“请输入要查找职工职称:”);scanf(“%s”,zc);system(“cls”);printf(“t工号t姓名t性别t部门t职称t工资n”);for(i=0;i

if(strcmp(zc,em[i].zc)==0)

{

printf(“t%st%st%st%st%st%dnn”,em[i].num,em[i].name,em[i].sex,em[i].bm,em[i].zc,em[i].gz);

} } }

void select()//查看职工 { int i=0;printf(“以下是全部职工信息n”);printf(“t工号t姓名t性别t部门t职称t工资n”);for(i=0;i

printf(“t%st%st%st%st%st%dnn”,em[i].num,em[i].name,em[i].sex,em[i].bm,em[i].zc,em[i].gz);} }

void add()//增加职工 { int numberTemp=0;int i=0;struct employee temp;//临时保存信息

printf(“请输入要增加职工信息的个数:”);scanf(“%d”,&numberTemp);for(i=0;i

printf(“输入第%d个职工信息n”,i+1);

printf(“工号:”);

scanf(“%s”,temp.num);

printf(“姓名:”);

scanf(“%s”,temp.name);

printf(“性别:”);

scanf(“%s”,temp.sex);

printf(“部门:”);

scanf(“%s”,temp.bm);

printf(“职称:”);

scanf(“%s”,temp.zc);

printf(“工资:”);

scanf(“%d”,&temp.gz);

em[Number++]=temp;//将刚添加的写入到数组

write_file(&temp);//将刚添加的写入到文件

} printf(“添加成功n”);}

void write_file(struct employee *em){ FILE *fp=NULL;fp=fopen(“employee1.txt”,“rb+”);fwrite(em,sizeof(struct employee),1,fp);fclose(fp);}

int read_file(struct employee em[]){ FILE *fp=NULL;int i=0;fp=fopen(“employee1.txt”,“rb”);while(fread(&em[i],sizeof(struct employee),1,fp))

i++;fclose(fp);return i;}

下载文中介绍了一种实现VB调用C语言程序的方法word格式文档
下载文中介绍了一种实现VB调用C语言程序的方法.doc
将本文档下载到自己电脑,方便修改和收藏,请勿使用迅雷等下载。
点此处下载文档

文档为doc格式


声明:本文内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:645879355@qq.com 进行举报,并提供相关证据,工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。

相关范文推荐