|
#include
#include
#include
#include
#define K 5
#define ERROR 0
#define OK 1
char km[K][20]; //科 目
int KM=0 ; //科目数
int n=0 ; //人 数
/*单链表结构*/
typedef struct LNode
{
long ID ; //ID号
char name[10]; //姓名
char ***[3]; //性别
int age ; //年龄
double cj[K]; //成绩
struct LNode*next ;
}
*LinkList ;
LinkList Insert(LinkList head);
LinkList sort(LinkList head,int x);
void m(int x);
/*创建一个带头结点的空链表*/
LinkList create(void)
{
LinkList L ;
L=(LinkList)malloc(sizeof(struct LNode));
if(L!=NULL)L->next=NULL ;
return L ;
}
/*设置科目:返回科目数*/
int setKM()
{
int i=0,x=0 ;
if(KM>0)
{
printf("当前设置:");
for(i=0;i printf("%s ",km[ i]);
printf("\n");
}
printf("设置科目数[0-退出]<最大值:%d>:",K);
scanf("%d",&x);
if(x==0)return KM ;
while(x<1||x>K)
{
system("cls");
m(1);
printf("输入不合法!\n");
printf("设置科目数[0-退出]<最大值:%d>:",K);
scanf("%d",&x);
if(x==0)return KM ;
}
for(i=0;i {
printf("输入第%d门科目名称:",i+1);
scanf("%s",km[ i]);
}
return x ;
}
/*读入数据*/
int loadkm()
{
int i ;
FILE*fp ;
if((fp=fopen("km.txt","rb+"))==NULL)
fp=fopen("km.txt","wb+");
for(i=0;!feof(fp);i++)
{
fscanf(fp,"%s\n",km[ i]);
if(strlen(km[ i])!=0)KM++;
}
fclose(fp);
return OK ;
}
LinkList load(LinkList head)
{
int i=0,j ;
LinkList s,t,p ;
FILE*fp ;
loadkm();
if((fp=fopen("data.txt","a+"))==NULL)return head ;
if(fgetc(fp)==EOF)
{
system("cls");
m(1);
while(KM==0)
{
system("cls");
m(1);
printf("没有科目,请设置科目!\n");
KM=setKM();
printf("\n");
}
printf("添加数据:\n");
Insert(head);
return head ;
}
//fseek(fp,0L,0);
rewind(fp);
p=(LinkList)malloc(sizeof(struct LNode));
fscanf(fp,"%ld %s %s %d ",&p->ID,p->name,p->***,&p->age);
for(i=0;i for(i=KM;icj[ i]=0.0 ;
p->next=NULL ;
head->next=p ;
while(!feof(fp))
{
p=p->next ;
p=(LinkList)malloc(sizeof(struct LNode));
fscanf(fp,"%ld %s %s %d ",&p->ID,p->name,p->***,&p->age);
for(i=0;i for(i=KM;icj[ i]=0.0 ;
p->next=NULL ;
i=j=0 ;
s=head->next ;
while(s->ID<=p->ID&&p->next)
{
s=s->next ;
i++;
}
s=head->next ;
while(s->next&&j {
s=s->next ;
j++;
}
t=s->next ;
s->next=p ;
p->next=t ;
}
s=head ;
i=0 ;
while(s->next)
{
s=s->next ;
i++;
n=i ;
}
fclose(fp);
return head ;
}
/*保存文件*/
int save(LinkList head)
{
int i ;
LinkList p=head->next ;
FILE*fp,*fpp ;
if((fp=fopen("data.txt","w+"))==NULL)return ERROR ;
if((fpp=fopen("km.txt","wb+"))==NULL)return ERROR ;
for(i=0;i fprintf(fpp,"%s\n",km[ i]);
while(p)
{
fprintf(fp,"%ld %s %s %d ",p->ID,p->name,p->***,p->age);
for(i=0;i p=p->next ;
}
fclose(fp);
fclose(fpp);
return OK ;
}
/*平均成绩*/
double pj(LinkList p)
{
int i ;
double pj=0 ;
for(i=0;i pj+=p->cj[ i];
pj/=KM ;
return pj ;
}
/*排头*/
bt()
{
int i ;
printf("ID号\t姓名\t性别\t年龄\t");
for(i=0;i<KM;I++)PRINTF("%S\T",KM[I]);
printf("平均\n\n");
}
/*输出当前指针信息*/
void put(LinkList p)
{
int i ;
printf("%ld\t",p->ID);
printf("%s\t",p->name);
printf("[%s]\t",p->***);
printf("%d\t",p->age);
for(i=0;i<KM;I++)PRINTF("%G\T",P->cj[ i]);
printf("%3.2f\n",pj(p));
}
/*输出信息*/
void all(LinkList head,int x)
{
LinkList p=head->next ;
int i,j=0 ;
int k,a1,a2 ;
long d ;
double c1,c2,z[K]={0},zpj=0.0 ;
char n[10],s[3];
if(x==0)
{
system("cls");
bt();
while(p)
{
put(p);
for(i=0;icj[ i];
j++;
if(j%20==0)
{
printf("\n按任意键继续");
getch();
system("cls");
bt();
}
p=p->next ;
}
}
if(x==1)
{
printf("ID号:");
scanf("%ld",&d);
system("cls");
bt();
while(p)
{
if(d==p->ID)
{
put(p);
for(i=0;icj[ i];
j++;
if(j%20==0)
{
printf("\n按任意键继续");
getch();
system("cls");
bt();
}
}
p=p->next;
}
}
if(x==2)
{
printf("姓名:");
scanf("%s",n);
system("cls");
bt();
while(p!=NULL)
{
if(strcmp(n,p->name)==0)
{
put(p);
for(i=0;icj[ i];
j++;
if(j%20==0)
{
printf("\n按任意键继续");
getch();
system("cls");
bt();
}
}
p=p->next;
}
}
if(x==3)
{
printf("年龄范围:");
scanf("%d",&a1);
scanf("%d",&a2);
system("cls");
bt();
while(p)
{
if(p->age>=a1)
{
if(p->age<=a2)
{
put(p);
for(i=0;icj[ i];
j++;
if(j%20==0)
{
printf("\n按任意键继续");
getch();
system("cls");
bt();
}
}
}
p=p->next ;
}
}
if(x==4)
{
printf("1.男 2.女\n");
printf("性别:");
scanf("%d",&x);
if(x==1)strcpy(s,"男");
else if(x==2)strcpy(s,"女");
else strcpy(s,"男");
system("cls");
bt();
while(p)
{
if(strcmp(s,p->***)==0)
{
put(p);
for(i=0;icj[ i];
j++;
if(j%20==0)
{
printf("\n按任意键继续");
getch();
system("cls");
bt();
}
}
p=p->next ;
}
}
if(x==5)
{
printf("当前设置:");
for(i=0;i {
printf("%d.",i+1);
printf("%s ",km[ i]);
}
printf("\n选择科目:");
scanf("%d",&k);
while(k>KM||k<=0)
{
system("cls");
m(2);
printf("超出范围!\n");
printf("当前设置:");
for(i=0;i {
printf("%d.",i+1);
printf("%s ",km[ i]);
}
printf("\n选择科目:");
scanf("%d",&k);
}
printf("成绩范围:");
scanf("%lf",&c1);
scanf("%lf",&c2);
if(c2>100.0)c2=100.0 ;
system("cls");
bt();
while(p)
{
if(p->cj[k-1]>=c1)
{
if(p->cj[k-1]<=c2)
{
put(p);
for(i=0;icj[ i];
j++;
if(j%20==0)
{
printf("\n按任意键继续");
getch();
system("cls");
bt();
}
}
}
p=p->next ;
}
}
printf("\n共有 %d 人\t",j);
if(j>0)printf("各科平均成绩:\t");
for(i=0;i {
z[ i]/=j ;
if(z[ i]>=0&&z[ i]<=100)printf("%.2f\t",z[ i]);
zpj+=z[ i];
}
zpj/=KM ;
if(zpj>=0&&zpj<=100)printf("%3.2f\n",zpj);
getch();
}
/*逆序表*/
void L_convert(LinkList head)
{
LinkList s=head ;
LinkList p1=(LinkList)malloc(sizeof(struct LNode));
LinkList p2=(LinkList)malloc(sizeof(struct LNode));
LinkList p3=(LinkList)malloc(sizeof(struct LNode));
p1=s->next ;
p2=p1->next ;
p3=p2->next ;
p1->next=NULL ;
while(p3->next)
{
p2->next=p1 ;
p1=p2 ;
p2=p3 ;
p3=p3->next ;
}
p2->next=p1 ;
p3->next=p2 ;
s->next=p3 ;
head=s ;
} |
|