您的位置:首页 > 其它

自己写的 利用指针写的有关学生成绩系统!欢迎赐教,给些建议2012-2-12---2012-2-14

2012-02-18 14:01 399 查看
<pre>

#include<stdio.h>

#include<string.h>

#define M 3

struct student

{

int class1;

int num;

char name[10];

float score[3];

float average;

}; //学生结构体的定义

main() //主函数

{

int i;

int m;

int flag=0;

struct student students[M];

struct student *p1[M],*p2[M],*p3[M],*p4[M],*p5[M],*p6[M],*p61[M],*p7[M];

//函数的声明

void input(struct student *p1[M]);

void average1(struct student *p2[M]);

void average2(struct student *p3[M]);

void output(struct student *p4[M]);

void output1(struct student *p5[M]);

void checknum(struct student *p6[M]);

void checkname(struct student *p61[M]);

void change(struct student *p7);

con: //使用goto语句的标记,使可以多次查询

printf("\n\n\n");

printf(" --------------------------\n");

printf(" 1.成绩的输入 \n");

printf(" 2.班级各科平均分的查询 \n");

printf(" 3.年级排名查询 \n");

printf(" 4.班级排名查询 \n");

printf(" 5.个人学生成绩情况查询 \n");

printf(" 6.学生信息修改 \n");

printf(" 7.退出 \n");

printf(" --------------------------\n");

for(i=0;i<M;i++) //利用指针数组,以下函数不必要传入结构体

{p1[i]=&students[i];

p2[i]=&students[i];

p3[i]=&students[i];

p4[i]=&students[i];

p5[i]=&students[i];

p6[i]=&students[i];

p61[i]=&students[i];

p7[i]=&students[i];

};

scanf("%d",&i);

average2(p3); //每个同学的个人平均分,需先计算

switch(i)

{

case 1: {

input(p1);

flag=1;

goto con;

break; //成绩的输入

};

case 2: {

if(flag==0)

{printf("未输入成绩,无法查询!请重新输入\n");

goto con;

break;

};

average1(p2);

goto con;

break; //班级各科平均分的查询

};

case 3: {

if(flag==0)

{printf("未输入成绩,无法查询!请重新输入\n");

goto con;

break;

}

output(p4);

goto con;

break; // 班级排名查询

};

case 4:{

if(flag==0)

{printf("未输入成绩,无法查询!请重新输入\n");

goto con;

break;

}

output1(p5);

goto con;

break; // 年级排名查询

};

case 5: {

if(flag==0)

{ printf("未输入成绩,无法查询!请重新输入\n");

goto con;

break;

}

printf("按学号查询请按1,按名字查询请按2\n"); //查询个人学生成绩情况

getchar();

scanf("%d",&m);

if(m==1) {checknum(p6);goto con;}

if(m==2) {checkname(p61);goto con;}

};

case 6: {

if(flag==0)

{ printf("未输入成绩,无法查询!请重新输入\n");

goto con;

break;

};

change(p7);

goto con;

break;

};

case 7: {

break;

};

default: {printf("输入有误,请重新输入\n");goto con;}

};

}

// 1)成绩的输入

void input(struct student *p1[M])

{

int i;

for(i=0;i<M;i++)

{printf("班级:\n");

scanf("%d",&p1[i]->class1);

printf("学号:\n");

scanf("%d",&p1[i]->num);

printf("名字:\n");

scanf("%s",p1[i]->name);

printf("成绩分别为:\n");

scanf("%f%f%f",&p1[i]->score[0],&p1[i]->score[1],&p1[i]->score[2]);

}; //数据的输入

printf("-------------------------\n");

printf("您刚输入的数据为:\n");

printf("班级 ");

printf("学号");

printf(" 名字");

printf(" 成绩\n");

for(i=0;i<M;i++) //检测

{

printf("%-5d",p1[i]->class1);

printf("%7d",p1[i]->num);

printf("%10s",p1[i]->name);

printf(" %f,%f,%f",p1[i]->score[0],p1[i]->score[1],p1[i]->score[2]);

printf("\n");

};

printf("------------------------\n");

}

//2)班级各科平均分查询

void average1(struct student *p2[M])

{

int i,j;

float y=0;

int k,h=0;

float average[M];

printf("请输入该班班级:\n");

scanf("%d",&k);

for(i=0;i<M;i++)

{if(p2[i]->class1==k) h++; //选出这个班的人数

};

for(i=0;i<3;i++)

{for(j=0;j<M;j++)

{if(p2[j]->class1==k) //符合该班的人数的分数

{

y+=p2[j]->score[i];

};

};

average[i]=y/h;

y=0;

};

for(i=0;i<3;i++) //检测

{printf(" 该班第%d科平均分为%f分\n",i+1,average[i]);

};

printf("--------------------------\n");

}

// 3)计算每位同学的平均分(float数据类型)

void average2(struct student *p3[M])

{

int i,j;

float y;

for(i=0;i<M;i++)

{for(j=0;j<3;j++)

{y+=p3[i]->score[j];

};

p3[i]->average=y/3;

y=0;

};

}

//4)年级排名的查询

void output(struct student *p4[M])

{

int i,j,y=1;

int k;

float fscore[M];

float temp;

float max;

int flag,n;

int num[M]={0};

int num1[M]={0};

for(i=0;i<M;i++) //把学生平均分复制到另一个数组

{fscore[i]=p4[i]->average;

};

for(i=0;i<M;i++)

printf("\nfscore[%d]=%f\n",i,fscore[i]);

//对这个数组的大小进行排序

for(i=0;i<M-1;i++)

{k=i;

for(j=i+1;j<M;j++)

{if(fscore[k]<fscore[j]) k=j;

};

if(k!=i)

{temp=fscore[k];

fscore[k]=fscore[i];

fscore[i]=temp;

};

};

for(i=0;i<M;i++)

printf("\nfscore[%d]=%f\n",i,fscore[i]);

printf("班级 ");

printf("学号");

printf(" 名字");

printf(" 成绩\n");

for(i=0;i<M;i++) //把这个数组和结构体的平均分一一对应

{for(j=0;j<M;j++)

{

flag=0;

y=1; //为了解决平均分相同的输出问题

for(n=0;n<M;n++)

{if(p4[j]->num==num
&&p4[j]->class1==num1
) y=0;

};

if(y!=0)

{if(fscore[i]==p4[j]->average)

{

printf("%-5d",p4[j]->class1);

printf("%7d",p4[j]->num);

printf("%10s",p4[j]->name);

printf(" %f,%f,%f",p4[j]->score[0],p4[j]->score[1],p4[j]->score[2]);

printf(" average:%f\n",p4[j]->average);

num[i]=p4[j]->num;

num1[i]=p4[j]->class1;

flag=1;

};

};

if(flag==1)break;

};

};

printf("--------------------------\n");

}

//按学号查询

void checknum(struct student *p6[M])

{

int i,j;

int m;

char n;

do

{

printf("查找学生的学号是 :\n");

scanf("%d",&m);

printf("\n------");

printf("\n");

for(i=0;i<M;i++)

{if(m==p6[i]->num)

{ printf("该学生信息为:\n");

printf("班级 ");

printf("学号");

printf(" 名字");

printf(" 成绩\n");

printf("%-5d",p6[i]->class1);

printf("%7d",p6[i]->num);

printf("%10s",p6[i]->name);

printf(" %f,%f,%f",p6[i]->score[0],p6[i]->score[1],p6[i]->score[2]);

printf("\n");

break;

};

};

printf("---------------------------\n");

printf("DO you want to continue:y/n\n");

getchar();

scanf("%c",&n);

}while(n=='y');

}

//按名字查询

void checkname(struct student *p61[M])

{

int i,j;

int k=0;

char m;

char name[10];

do

{

printf("查找学生的姓名是 :\n");

scanf("%s",name);

printf("\n------");

for(i=0;i<M;i++)

{if(strcmp(name,p61[i]->name)==0)

{

k=i;

break;

};

};

printf("该学生信息为:\n");

printf("班级 ");

printf("学号");

printf(" 名字");

printf(" 成绩\n");

printf("%-5d",p61[i]->class1);

printf("%7d",p61[i]->num);

printf("%10s",p61[i]->name);

printf(" %f,%f,%f",p61[i]->score[0],p61[i]->score[1],p61[i]->score[2]);

printf("\n");

printf("-----------------------\n");

printf("DO you want to continue? (y/n)\n");

getchar();

scanf("%c",&m);

}while(m=='y');

}

//学生信息的修改

void change(struct student *p7[M])

{

int i,j;

int k,m;

float n1,n2,n3; //修改成绩需要

char name[10]; //修改名字需要

printf("需要修改的名字为:\n");

scanf("%s",name);

for(i=0;i<M;i++)

{if(strcmp(name,p7[i]->name)==0)

{printf("good1\n");

k=i;

break;

};

printf("good2\n");

};

printf("k=%d\n",k);

printf("----------------------\n");

printf("1.修改学号\n");

printf("2.修改名字\n");

printf("3.修改成绩\n");

scanf("%d",&j);

printf("---------------------\n");

if(j==1)

{printf("该学生学号为%d\n",p7[k]->num);

printf("修改为:\n");

scanf("%d",&m);

p7[k]->num=m;

printf("修改成功!\n");

printf("-----------------------\n");

};

if(j==2)

{printf("该学生名字为%s\n",p7[k]->name);

printf("修改为:\n");

scanf("%s",name);

strcpy(p7[k]->name,name);

printf("修改成功!\n");

printf("-----------------------\n");

};

if(j==3)

{printf("该学生成绩为%f %f %f\n",p7[k]->score[0],p7[k]->score[1],p7[k]->score[2]);

printf("修改为!\n");

scanf("%f%f%f",&n1,&n2,&n3);

p7[k]->score[0]=n1;

p7[k]->score[1]=n2;

p7[k]->score[2]=n3;

printf("修改成功!\n");

printf("-----------------------\n");

};

}

//5)班级排名查询

void output1(struct student *p5[M])

{

int i,j=0,y=1;

float fscore[M]={0};

float temp;

float max;

int k;

int m;

int flag,n;

int num[M];

printf("请输入班级\n");

scanf("%d",&k);

for(i=0;i<M;i++) //把学生平均分复制到另一个数组

{if((p5[i]->class1)==k)

{fscore[j]=(p5[i]->average);

j++;

};

};

for(i=0;i<M-1;i++)

{m=i;

for(j=i+1;j<M;j++)

{if(fscore[m]<fscore[j]) m=j;

};

if(m!=i)

{temp=fscore[m];

fscore[m]=fscore[i];

fscore[i]=temp;

};

};

printf("班级 ");

printf("学号");

printf(" 名字");

printf(" 成绩\n");

for(i=0;i<M;i++) //把这个数组和结构体的平均分一一对应

{for(j=0;j<M;j++)

{flag=0;

y=1;

for(n=0;n<M;n++)

{

if((p5[j]->num)==num
) y=0;

};

if(y!=0)

{if(fscore[i]==(p5[j]->average)&&(p5[j]->class1)==k)

{

printf("%-5d",p5[j]->class1);

printf("%7d",p5[j]->num);

printf("%10s",p5[j]->name);

printf(" %f,%f,%f",p5[j]->score[0],p5[j]->score[1],p5[j]->score[2]);

printf("\n");

num[i]=(p5[j]->num);

flag=1;

};

};

if(flag==1)break;

};

};

printf("--------------------------\n");

}

<pre>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: