读书人

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

发布时间: 2013-07-08 14:13:00 作者: rapoo

求高手帮忙写一下 这个程序,,,,,谢谢了
设计一个学生信息管理系统,能插入,删除和查询学生信息。程序运行后出现欢迎界面,提示输入要进行操作的学生信息表文件名,输入文件名后出现提示菜单,允许用户输入不同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;
}
}
}




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

读书人网 >C语言

热点推荐