求一个C语言程序。小型数据库。一个管理系统。功能包括:查询,修改等等。。带解释的 谢谢~!

求一个C语言程序。小型数据库。一个管理系统。功能包括:查询,修改等等。。带解释的 谢谢~!,第1张

#include "stdio.h"

#include "stdlib.h"

#include "conio.h"

#include "math.h"

#include "ctype.h"

#include "string.h"

#define MAX 4

#define TERM 6

struct STUD{

unsigned number

char name[20]

unsigned score[MAX]

float average

struct STUD *next

}

struct CLASS{

unsigned no

unsigned students

float score[MAX]

float average

struct STUD *first

}

//输出所有学生的成绩及名次

void output(struct CLASS *pclass)

{

struct STUD *p

int n=0

printf("Class:%u\t number of students:%u\n",pclass->no ,pclass->students )

printf("number name math physics politics "

"english average place\n")

for(n=1,p=pclass->first p!=NULLp=p->next ,++n)

printf("%-8u%-12s%-8u%-8u%-8u%-8u%-10.2f%-d\n",

p->number ,p->name ,p->score[0] ,p->score [1],

p->score [2],p->score [3],p->average ,n)

}

//按平均成绩排序

void sort(struct CLASS *pclass)

{

struct STUD *p, *next, *last

int m,n

for(m=0m<pclass->students -1m++)

for(last=p=pclass->first ,n=0n<pclass->students-1-m

n++,last=p,p=p->next)

if(p->average<p->next->average){

next=p->next

if(p!=pclass->first)

last->next=next

else

pclass->first=next

next->next=p

p=next

}

}

char *cou[MAX]={"math","phusics","politics","english"}

//将链表所有接点写入文件

void write_file(struct CLASS *pclass,FILE *myfile)

{

struct STUD *p

for(p=pclass->firstp!=NULLp=p->next)

fwrite(p,sizeof(struct STUD),1,myfile)

}

//从文件中读数据重建链表

void read_file(struct CLASS *pclass,FILE *myfile)

{

struct STUD buf,*p,*tail

int n

for(tail=pclass->first ,n=0n<pclass->students tail=p,++n){

if(fread(&buf,sizeof(struct STUD),1,myfile)!=1){

pclass->students =n

break

}

p=(struct STUD *) malloc(sizeof(struct STUD))

*p=buf

//连接成先进先出链表

if(pclass->first==NULL)

pclass->first =p

else

tail->next =p

p->next =NULL

}

}

//增加信息

void insert(struct CLASS *pclass)

{

struct STUD *p,*current,*last

int k,ch,flag

do{

p=(struct STUD *) malloc(sizeof(struct STUD))

printf("\ninput number and name of student:")

scanf("%u%s",&p->number ,p->name )

while(1){

for(flag=1,k=0k<MAX++k){

printf("\niput %s:",cou[k])

scanf("%u",&p->score[k])

if(p->score[k]>100)

flag=0

}

if(flag) break

printf("score error\n")

}

p->average =(float)(p->score[0]+p->score[1]+p->score[2]+p->score[3])/4

//找插入点

for(last=current=pclass->firstcurrent->next&¤t->average>p->average

last=current,current=current->next )

if(current->next ==NULL&¤t->average>p->average){

p->next =NULL

current->next =p

}

else{

p->next =current

if(current==pclass->first)

pclass->first =p

else

last->next =p

}

pclass->students ++

printf("continue?(y/n)")

while(isspace(ch=getchar()))

}while (ch=='y'||ch=='Y')

}

//删除学生

void delete_stu(struct CLASS *pclass)

{

unsigned ch

struct STUD *current,*last,*p

do{

printf("\ninput number of student:")

scanf("%u",&p->number,&ch)

for(last=current=pclass->firstcurrent!=NULL&¤t->number!=ch

last=current,current=current->next)

if(current!=NULL){

if(current!=pclass->first)

last->next=current->next

else

pclass->first=current->next

free(current)

pclass->students--

}

else

fprintf(stderr,"error:number of student!\n")

printf("continue?(y/n)")

while(isspace(ch=getchar()))

}while (ch=='y'||ch=='Y')

}

void create(struct CLASS *pclass)

{

struct STUD *p,*tmp=NULL

int n=0,k,ch,flag

do{

p=(struct STUD *) malloc(sizeof(struct STUD))

printf("\ninput number and name of student:")

scanf("%u%s",&p->number ,p->name )

while(1){

for(flag=1,k=0k<MAX++k){

printf("\niput %s:",cou[k])

scanf("%u",&p->score[k])

if(p->score[k]>100)

flag=0

}

if(flag) break

printf("score error\n")

}

p->average =(float)(p->score[0]+p->score[1]+p->score[2]+p->score[3])/4

p->next =pclass->first

pclass->first =p

++n

printf("continue?(y/n)")

while(isspace(ch=getchar()))

}while (ch=='y'||ch=='Y')

pclass->students =n

}

//计算平均分

void average(struct CLASS *pclass)

{

static double general[MAX],g

struct STUD *p

int i

for(p=pclass->firstp!=NULLp=p->next)

for(i=0i<MAX++i)

general[i]+=p->score[i]

printf("\n math physics politics english\n")

for(i=0i<MAX++i){

pclass->score[i]=general[i]/pclass->students

printf("%10.2f",pclass->score[i])

g+=general[i]

}

pclass->average =g/(MAX*pclass->students )

printf("\ngeneral average:%10.2f\n",pclass->average )

}

void main()

{

struct CLASS cla

FILE *fp

int flag=1,k

char c,*menu[]={

"\n1:insert a student\n",

"2:delete a student\n",

"3:save into file\n",

"4:print class score list\n",

"5:stat average\n",

"0:exit\n",

"\nselect[0-6]:"

}

if((fp=fopen("students.dat","rb"))==NULL){

printf("input number of class:")

scanf("%u",&cla.no)

cla.students=0

cla.first=0

create(&cla)

sort(&cla)

}

else{

fread(&cla,sizeof(struct CLASS),1,fp)

cla.first=NULL

read_file(&cla,fp)

fclose(fp)

}

while(flag){

for(k=0k<=TERMk++)

printf("%s",menu[k])

scanf("%d",&k)

switch (k){

case 1:

insert(&cla)

break

case 2:

delete_stu(&cla)

break

case 3:

if((fp=fopen("students.dat","wb"))==NULL){

fprintf(stderr,"error:can't create file students!\n")

return

}

fwrite(&cla,sizeof(struct CLASS),1,fp)

write_file(&cla,fp)

fclose(fp)

break

case 4:

output(&cla)

break

case 5:

average(&cla)

break

case 0:

printf("save yout change?(y/n)")

scanf("%c%*c",&c)

c=='y'||c=='Y'?(c=1):(c==0)

if(c){

if((fp=fopen("students.dat","wb"))==NULL){

fprintf(stderr,"error:can't create file students!\n")

return

}

rewind(fp)

fwrite(&cla,sizeof(struct CLASS),1,fp)

write_file (&cla,fp)

fclose(fp)

}

flag=0

break

default:

fprintf(stderr,"select error!\n")

}

}

}

Access,MSDE 2000,Embedded Firebird,SQLite等都是可以免费再分发(free redistributable)的数据库

相比而言,MSDE 2000 显著缺点是需要安装,最大优点是和服务器端的 SQL Server 编程模型一致,开发便利。

Access的显著缺点是功能较少,不支持事务等常用功能,最大优点是简单、多数开发者都很熟悉,部署也很方便。

SQLite支持事务,也是一款单文件数据库,比较不足的是 .NET Data Provider 还不是很成熟。

Firebird则同时具有:单文件、部署简单不需安装(只需 XCOPY 两个文件)、支持事务、存储过程、触发器,.NET Data Provider比较稳定成熟等优点。

这个星球上的数据库实在不胜枚举,这里只列一些我接触过的常见的。

可以稍微夸张点说,有交互的应用,起码得用一下数据保存,即便是自定义结构的数据保存,还是最常见的INI、XML等,都可以算是“数据库”,真正点的,如DBase系列、FoxBase、FoxPro、MSAccess、InterBase、MS SQL Server、Oracle、DB2等,这些是商业化的数据库,前面几个只能算是数据库,后面几个是RMDBS(关系型数据库管理系统)。

对应商业化的,有开源的:SQLite、SimpleSQL、Berkely DB、Minosse、Firebird( 前身是是Borland公司的InterBase)、PostgreSQL、MySQL等。

□SQLite:大家可以看我的SQLite系列随笔,C编写的,可以跨 *** 作平台,支持大部分ANSI SQL 92,它是嵌入式的轻量级关系形数据库引擎,只需要一个DLL,体积为250k,数据库也只是一个文件,零配置,便可工作。既然开源,你甚至可以把它嵌入你的程序中。核心开发人员只有一个,最近加入了另外一个,也就是2个人而已,实在佩服,目前发展到3.1.0,相当高效稳定,有开源驱动在sourceforge.net上有其ADO.NET Data Provider for SQLite :https://sourceforge.net/projects/adodotnetsqlite/ 。

□SimpleSQL:相对SQLite要大几倍,但也是轻量级的,功能稍微强大一点,C++编写,有OLE、Java等版本。

□Berkely DB:C++编写的大型关系型数据库系统,还额外地支持XML(把XML当成数据库),号称2百万的安装量,MySQL也只不过号称5百万安装量而已,跨平台。

□Minosse:纯C#编写的大型关系型数据库系统,理想是超越MS SQL Server!最新版本:0.2.0,真难得,纯Java写的看得多了,纯C#的,不是移植别人的,还是第一个,佩服作者:包含C/S和嵌入式版本,并可跨越大部分平台,因为它不用Windows的东西,可以在Mono下编译。

□Firebird:这个东西太牛了,目前有1.5稳定版本已经拥有大量特性,完全支持ANSI SQL92、98等,一些超酷的特性让人疯狂(1.0特性、1.5特性,从这里开始研究),主要开发人员是一个俄罗斯人,目前开发队伍已经扩大到近100人,有3种模式,单机独立,典型C/S,超级服务器。2.0版本和3.0版本将在近期推出,看完其路线图(2.0、3.0)你就会疯掉。有.NET驱动,目前是1.7beta版。主要特性:

◆A.C.I.D;

◆MGA(任何版本的引擎都可以处理同一数据库记录);

◆PSQL(存储过程)超级强大,ms sql相对的太次,它啥都能在服务器端实现并推送到客户端成为强大的报表,存储过程;

◆触发器都可以在客户端获取监控追踪;

◆自动只读模式;

◆创新的事务保证绝对不会出错;

◆24*7运行中仍然可以随时备份数据库;

◆统一触发器:任何 *** 作都可以让某表唯一的触发器来总控;

◆大部分语言都可以写plug-in,并直接在存储过程中调用函数;

◆c->c++,更加少的代码但更加快的速度;

◆3种运行模式,甚至可以嵌入式;

◆主流语言都可以调用它;

◆动态sql执行;

◆事务保存点;

□PostgreSQL:POSTGRES数据库的后开源版本,号称拥有任何其他数据库没有的大量新特性,似乎目标是要做超大型的OO关系型数据库系统,目前已经发展到8.0,有.NET驱动,中文官方网站有详细介绍。

□MySQL:这个,不用说了吧?号称全球最受欢迎的开源数据库,但让我奇怪的是,PostgreSQL都有简体中文的支持:包括内核、管理工具、QA等等,在最新版本MySQL中,我却没有发现... ,有.NET驱动,其中MySQL Connector/Net就是原来在sf.net上的ByteFX.Data项目,作者已经加入了MySQL团队,参看《感慨 20 之开源的前途/钱图?(1数据库)》。

======================================================

最近在学习 Firebird Embeded Database。作为一款单文件型小型数据库,Firebird 具有很多吸引人的特征,比如支持事务、支持存储过程、触发器等,而且 Embeded 版本的 Firebird 在 .NET 开发中只需要拷贝两个文件:一个 fbembed.dll (非托管但不需要注册的动态链接库)和一个 ADO.NET Data Provider 的 FirebirdSql.Data.Firebird.dll。这些特征都非常适合那些需要在客户端存储一些数据,但又不想安装数据库(比如MSDE)软件的情形。

据称,在国外,需要使用客户端数据库的情况中,有30%左右的开发者选择Access,有30%的开发者选择MSDE 2000,有30%的开发者选择Embedded Firebird,剩余10%选择其他小型数据库,如SQLite,MySQL 等。

上面所说的Access,MSDE 2000,Embedded Firebird,SQLite等都是可以免费再分发(free redistributable)的数据库。相比而言,MSDE 2000 显著缺点是需要安装,最大优点是和服务器端的 SQL Server 编程模型一致,开发便利。Access的显著缺点是功能较少,不支持事务等常用功能,最大优点是简单、多数开发者都很熟悉,部署也很方便。SQLite支持事务,也是一款单文件数据库,比较不足的是 .NET Data Provider 还不是很成熟。Firebird则同时具有:单文件、部署简单不需安装(只需 XCOPY 两个文件)、支持事务、存储过程、触发器,.NET Data Provider比较稳定成熟等优点。

Firebird 本身有SuperServer和Embedded版本之分,后者只能本机访问,不接受TCP连接。对于开发者而言,从Embedded数据库切换到SuperServer,只需更改数据库连接串中的ServerType值就行。

但是,在你正式决定使用?Firebird 之前,请你注意下面这个 known issue(已知问题): Firebird 数据库文件不能放置在含有中文等字符的路径中。Firebird 的文件名不可以用中文字符,所在路径的任何部分如果含有中文字符,都将无法访问到数据库。举个例子,中文Windows桌面所在的目录一般是“C:\Documents and Settings\用户名\桌面”,如果数据库文件放置在桌面上,就无法访问到。当然,Firebird 内部是可以存储中文字符的,因为它支持 GB2312 和 UNICODE 等字符集。

需要注意一点,连接串中的 Database 地址如果使用相对路径,请一定注意这个相对路径是相对于 fbembed.dll 所在目录的。

1、常用的数据库:oracle、sqlserver、mysql、access、sybase

2、特点。

-oracle:

1.数据库安全性很高,很适合做大型数据库。

支持多种系统平台(hpux、sunos、osf/1、vms、

windows、windows/nt、os/2)。

2.支持客户机/服务器体系结构及混合的体系结构(集中式、分布式、

客户机/服务器)。

-sqlserver:

1.真正的客户机/服务器体系结构。

2.图形化用户界面,使系统管理和数据库管理更加直观、简单。

3.具有很好的伸缩性,可跨越从运行windows

95/98的膝上型电脑到运行windows

2000的大型多处理器等多种平台使用。

-mysql:

mysql是一个开放源码的小型关系型数据库管理系统,开发者为瑞典mysql

ab公司,92hezu网免费赠送mysql。目前mysql被广泛地应用在internet上的中小型网站中。提供由于其体积小、速度快、总体拥有成本低,尤其是开放源码这一特点,许多中小型网站为了降低网站总体拥有成本而选择了mysql作为网站数据库。

-access

access是一种桌面数据库,只适合数据量少的应用,在处理少量数据和单机访问的数据库时是很好的,效率也很高。

但是它的同时访问客户端不能多于4个。access数据库有一定的极限,如果数据达到100m左右,很容易造成服务器iis假死,或者消耗掉服务器的内存导致服务器崩溃。

-sybase

http://hi.baidu.com/%dd%af%c3%e6%ce%f7%ca%a9/blog/item/3bb0f151f1e34a5b1138c26d.html

---

以上,希望对你有所帮助。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/9954075.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-03
下一篇 2023-05-03

发表评论

登录后才能评论

评论列表(0条)

保存