首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

求高手帮忙写一下 这个程序,多谢了

2013-07-08 
求高手帮忙写一下 这个程序,,,,,谢谢了设计一个学生信息管理系统,能插入,删除和查询学生信息。程序运行后出

求高手帮忙写一下 这个程序,,,,,谢谢了
   设计一个学生信息管理系统,能插入,删除和查询学生信息。程序运行后出现欢迎界面,提示输入要进行操作的学生信息表文件名,输入文件名后出现提示菜单,允许用户输入不同ZBcs
A——往学生信息表文件尾插入学生信息;
B——删除学生信息表文件中某个序号的学生信息;
C——显示学生信息表文件中所有学生信息;
D——能按给定的序号查询并显示学生信息;
E——退出系统。
   算法分析
① 构造数据结构:
typedef struct student
{ int number;       /*学生的学号*/
  char name[20];   /*学生的姓名*/
  int highermathe, english,computers;  /*高等数学大学英语计算机文化基础*/
}STU;
②主函数调用的各个功能函数说明: 
(自己写函数声明,并做相应注释说明)
这程序不会写??帮忙写一下,,,谢谢了
[解决办法]
#include<stdio.h>
#include<stdlib.h> 
#include<string.h>
#include<windows.h>  

#define LEN sizeof(struct student) //宏定义

typedef struct student   //学生结构体
{
char num[10];   /*学号*/
char name[10];   /*姓名*/
char sex[1];      /*性别*/                
float Cscore;  /*C语言成绩*/  
    float Escore;  /*英语成绩*/ 
struct student *next;
}STU;        //自定命名


/*所有函数声明*/
struct student *read_rb(STU *);
struct student *Input(int); 
int Input_num(); 
void filename();
void write_wb(STU *);
void write_ab(STU *);
void Print();  
void Del(); 
void Ser_num();
void Ser_name();
void clear_up(); 
void score_account();
void main_menu();
void add_menu();
void ser_menu();
void amend_menu();

/*全局变量*/
STU *head,*p,*q;
char file[20];  //保存打开的文件名字
int i,j;   
char k;


void main()    //主函数
{
main_menu();
}

void Print()
{
printf("          ┏―――――――――――――――――――――――――――――――― ┓\n");
    printf("          ┇  学号(9位)  ┇  姓名  ┇  性别f/m or F/M  ┇  C语言  ┇  英语   ┇   \n");


printf("          ┗―――――――――――――――――――――――――――――――― ┛\n");
printf("\n\n");
}

void write_wb(STU *head)   //数据存储“只写”
{
FILE *fp;
if((fp=fopen(file,"wb"))==NULL)  //打开一个二进制文件
{
printf("Can't open the file!");   
return;
}
p=head;
while(p!=NULL)

if(fwrite(p,LEN,1,fp)!=1)
{printf("file write error!");   //把数据存入文件
   fclose(fp);
   return;
}
p=p->next;
}
fclose(fp);
putchar('\n');
}

STU *Input(int M)      //生成链表      
{
system("cls");        //清屏
Print();
printf("输入以上对应的信息:\n");
for(i=1;i<M+1;i++)
{
p=(STU *)malloc(LEN);
scanf("%s%s%s%f%f",&p->num,&p->name,&p->sex,&p->Cscore,&p->Escore);
p->next=NULL;      
if(i==1)
head=q=p;   //让head指针指向p结点
else
{
q->next=p;     //q,p后移,
p=q;
}
}
if(head!=NULL)
q->next=NULL;  //最后结点
return head;
}


int Input_num()      //输入数据数量
{
printf("@输入您要添加数据的个数:");
scanf("%d",&j);
return j;
}


void filename()    //选择打开的文件
{
printf("@输入将要打开的文件名: ");
scanf("%s",file);
getchar();

}

void write_ab(STU *head)   //数据追加
{
FILE *fp;
if((fp=fopen(file,"ab"))==NULL)   //打开二进制文件,在尾部添加数据
{
printf("can't open the file!");  
fclose(fp);
}
p=head;
while(p!=NULL)
{
if(fwrite(p,LEN,1,fp)!=1)   //把要添加数据写入文件
{
printf("写入数据错误!");
fclose(fp);
return;
}
p=p->next;
}
fclose(fp);
}


STU *read_rb()   //读取文件数据保存到链表中,返回链表头指针
{
FILE *fp;
head=NULL;
if((fp=fopen(file,"rb"))==NULL)
{
printf("打开文件失败!");
fclose(fp);
}
while(!feof(fp))
{
if((p=(STU *)malloc(LEN))==NULL)  //申请内存,创建链表
{
printf("申请内存错误!");
fclose(fp);
exit(0);
}
if(fread(p,LEN,1,fp)!=1)   //读出文件里的数据
{
free(p);
break;
}
if(head==NULL)
head=q=p;     
else
{
q->next=p;
p=q;


}
}
if(head!=NULL) q->next=NULL;  //最后结点
fclose(fp);
return (head);  //返回链表头指针
}

void Ser_num()   //数据查询----学号
{
char str[5];
STU *p_num;
printf("@输入要查询的学号:");
scanf("%s",str);
p_num=read_rb();  //使p_num指向读出的数据链表的头指针
Print();
do
{
if(strcmp(str,p_num->num)==0)   //学号比较,找出与输入相同的学号
{
printf("%15s%13s%8s%12.1f%10.1f",p_num->num,p_num->name,p_num->sex,
p_num->Cscore,p_num->Escore);
break;
}
p_num=p_num->next;
}while(p_num!=NULL);

if(p_num==NULL)
printf("呜呜~~没有你要找的数据。");
putchar('\n\n');
}

void Ser_name()    //数据查询-----姓名
{  
char str[10];
void Print();
STU *p_name;
printf("@输入要查询的姓名:");
scanf("%s",str);
p_name=read_rb();
Print();
do
{
if(strcmp(str,p_name->name)==0)
{
printf("%15s%13s%8s%13.1f%11.1f",p_name->num,p_name->name,p_name->sex,
p_name->Cscore,p_name->Escore);
break;
}
p_name=p_name->next;
}while(p_name!=NULL);

if(p_name==NULL)
     printf("呜呜~~没有你要找的数据。");
putchar('\n');
}

void Del()         //删除数据
{
char str[5];
printf("@输入你要删除的学号:");
scanf("%s",str);
p=read_rb();
q=p->next;
head=p;
while(q!=NULL)
{
if(strcmp(str,p->num)==0)
{   
free(p);           //若删除的结点是链表头
write_wb(q);
break;
}
else if(strcmp(str,q->num)==0)
{
p->next=q->next;    //若q结点是要删除的结点
free(q);
write_wb(head);
break;
}
p=q;              //p。q后移
q=q->next;
}
if(q!=NULL)
printf("呜呜~~没有你要删除的数据。");
putchar('\n');
}

void clear_up()               //整理数据
{
STU *first,*min,*p_min,*tail;
head=read_rb();
first=NULL;
while(head!=NULL)
{
for(p=head,min=head;p->next!=NULL;p=p->next)
{
if(strcmp(p->next->num,min->num)<0)   //循环找出最小的
{
p_min=p;
min=p->next;
}
}
if(first==NULL)
{
first=min;
tail=min;      
}                 


else
{
tail->next=min;  
tail=min;
}

if(min==head)   //如果链表头是最小,下个结点做链表头,进入下一次循环
head=head->next;
else
p_min->next=min->next;      
}
if(first!=NULL)
tail->next=NULL;
head=first;
write_wb(head);
}

void score_account()     //成绩统计
{
head=read_rb();    //函数调用,haed指向链表头
p=head;
int Ccount=1,Ecount=1;
float min_Escore,max_Escore,avg_Escore,all_Escores,max_all_scores;
float min_Cscore,max_Cscore,avg_Cscore,all_Cscores,min_all_scores;
min_Escore=p->Escore;
min_Cscore=p->Cscore;
max_Escore=p->Escore;
max_Cscore=p->Cscore;
all_Cscores=p->Cscore;          //赋值第一个节点
all_Escores=p->Escore;
max_all_scores=p->Cscore+p->Escore;
min_all_scores=p->Cscore+p->Escore;
p=p->next;
while(p!=NULL)
{
Ecount++;
Ccount++;
if(p->Cscore>max_Cscore)
max_Cscore=p->Cscore;
if(p->Cscore<min_Cscore)
min_Cscore=p->Cscore;
if(p->Escore>max_Escore)
max_Escore=p->Escore;       //各种比较。。。
if(p->Escore<min_Escore)
min_Escore=p->Escore;
if(p->Cscore+p->Escore>max_all_scores)       
max_all_scores=p->Cscore+p->Escore;
if(p->Cscore+p->Escore<min_all_scores)
min_all_scores=p->Cscore+p->Escore;
all_Cscores+=p->Cscore;
all_Escores+=p->Escore;
p=p->next;
}
avg_Cscore=all_Cscores/Ccount;
avg_Escore=all_Escores/Ecount;
putchar('\n');
printf("C语言最高分是:%-4.1f分\n\n",max_Cscore);
printf("C语言最低分是:%-4.1f分\n\n",min_Cscore);
printf("英语最高分是:%-4.1f分\n\n",max_Escore);
printf("英语最低分是:%-4.1f分\n\n",min_Escore);
printf("成绩总分最高分是:%-4.1f分\n\n",max_all_scores);
printf("成绩总分最低分是:%-4.1f分\n\n",min_all_scores);
printf("C语言平均分是:%-4.2f分\n\n",avg_Cscore);
printf("英语平均分是:%-4.2f分\n\n",avg_Escore);
putchar('\n');
putchar('\n');
printf("~_~谢谢使用本系统。。。欢迎再次使用!\n");
}

void main_menu()
{
//void add_menu();
//void amend_menu();
//void ser_menu();
printf("                       ┏──────────┓                 \n");
printf("                       │    学生管理系统    │                 \n");


printf("             ←←←←←│           │→→→→→               \n");
printf("            ↓         ┗─────┛         ↓       \n");
printf("            ↓                                          ↓       \n");
printf("            ↓      1.添加              2.修改        ↓       \n");
printf("            ↓       3.查询               4.退出        ↓       \n");
printf("            ┏―――――――――――――――――――――┓       \n");
printf("            ┡★★★★★★★★★★★★★★★★★★★★★┩       \n");
printf("            ┗―――――――――――――――――――――┛       \n\n");
printf("@输入对应的数字选择相应的功能:");

k=getchar();

while(k!='1'&&k!='2'&&k!='3'&&k!='4')
{
putchar('\a');
getchar();
printf("呜呜~~输入错误!请从新输入:");
    k=getchar();
}
printf("\n\n");
switch (k)
{
case '1':filename();add_menu();break;
case '2':filename();amend_menu();break;
case '3':filename();ser_menu();break;
case '4':exit(0);break;
}
getchar();
}

void add_menu()     //添加菜单
{
system("cls");
printf("                      ┏──────────┓                 \n");
printf("                      │    学生管理系统    │                 \n");


printf("            ←←←←←│           │→→→→→               \n");
printf("           ↓         ┗─────┛         ↓       \n");
printf("           ↓                                          ↓       \n");
printf("           ↓     1.新建文件           2.添加数据      ↓       \n");
printf("           ↓       3.返回               4.退出        ↓       \n");
printf("           ┏―――――――――――――――――――――┓       \n");
printf("           ┡★★★★★★★★★★★★★★★★★★★★★┩       \n");
printf("           ┗―――――――――――――――――――――┛       \n\n");
printf("@输入功能前对应的数字选择相应的功能: ");

k=getchar();

while(k!='1'&&k!='2'&&k!='3'&&k!='4')
{
putchar('\a');          //错误警告音
getchar();
printf("呜呜~~输入错误!请从新输入: ");
    k=getchar();
}
printf("\n\n");
switch (k)
{
case '1':write_wb(Input(Input_num()));      //调用函数
     printf("@新建文件且数据保存成功!\n\n");
 system("pause");
 getchar();add_menu();break;
case '2':write_ab(Input(Input_num()));      //调用函数
     printf("@数据添加成功!\n\n");
 system("pause");getchar();add_menu();break;
case '3':system("cls");getchar();main_menu();break;
case '4':exit(0);break;
}
}


void amend_menu()     //修改菜单
{
system("cls");
while(1)
{
system("cls");


printf("                      ┏──────────┓                 \n");
printf("                      │    学生管理系统    │                 \n");
printf("            ←←←←←│            │→→→→→               \n");
printf("           ↓         ┗─────┛         ↓       \n");
printf("           ↓                                          ↓       \n");
printf("           ↓     1.删除数据           2.整理数据      ↓       \n");
printf("           ↓       3.返回               4.退出        ↓       \n");
printf("           ┏―――――――――――――――――――――┓       \n");
printf("           ┡★★★★★★★★★★★★★★★★★★★★★┩       \n");
printf("           ┗―――――――――――――――――――――┛       \n\n");
printf("@输入功能前对应的数字选择相应的功能: ");

k=getchar();

while(k!='1'&&k!='2'&&k!='3'&&k!='4')
{
putchar('\a');
getchar();
printf("呜呜~~输入错误!请从新输入: ");
    k=getchar();
}
printf("\n\n");
switch (k)
{
case '1':Del();
     printf("@数据以删除成功!\n\n");
     system("pause");getchar();break;
case '2':clear_up();//system("pause");


     printf("@数据整理成功!\n\n");system("pause");
 getchar();break;
case '3':system("cls");getchar();main_menu();break;
case '4':exit(0);break;
}
}
}


[解决办法]
void ser_menu()          // 查询菜单
{
system("cls");
while(1)
{
system("cls");
printf("                      ┏──────────┓                 \n");
printf("                      │    学生管理系统    │                 \n");
printf("            ←←←←←│           │→→→→→               \n");
printf("           ↓         ┗─────┛         ↓       \n");
printf("           ↓                                          ↓       \n");
printf("           ↓     1.学号查询           2.姓名查询      ↓       \n");
printf("           ↓     3.成绩统计   4.返回      5.退出      ↓       \n");
printf("           ┏―――――――――――――――――――――┓       \n");
printf("           ┡★★★★★★★★★★★★★★★★★★★★★┩       \n");
printf("           ┗―――――――――――――――――――――┛       \n\n");
printf("@输入功能前对应的数字选择相应的功能: ");

k=getchar();

while(k!='1'&&k!='2'&&k!='3'&&k!='4'&&k!='5')


{
putchar('\a');
getchar();
printf("呜呜~~输入错误!请从新输入: ");
    k=getchar();
}
printf("\n\n");
switch (k)
{
case '1':Ser_num();
     system("pause");getchar();break;
case '2':Ser_name();
     system("pause");getchar();break;
case '3':score_account();
     system("pause");getchar();break;
case '4':system("cls");getchar();main_menu();break;
case '5':exit(0);break;
}
}
}




刚好我的课程设计可以帮到你。。。。。这份代码也是有参考其他前辈的求高手帮忙写一下 这个程序,多谢了

热点排行