编制一个c语言成绩记录簿,每个学生信息包括:学号,姓名,c语言成绩. 具体功能:(1)创建信息链表并以磁盘文

编制一个c语言成绩记录簿,每个学生信息包括:学号,姓名,c语言成绩. 具体功能:(1)创建信息链表并以磁盘文件保存;
(2)读取磁盘文件并显示输出所有学生的成绩;
(3)按学号或姓名查询成绩;
(4)添加成绩记录;
(5)修改指定姓名或学号的学生的成绩并可存盘;
(6)显示输出60分以下、60~79、80~89、90分以上各分数段的学生信息
跪求答案,高手请发到我邮箱,[email protected]

以前也找过,做完后没有留底子,这个是以前用到的,应该可以。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX 1000

typedef struct Lesson //定义课程结构体
{
int Lesson_Num;
char Lesson_Name[50];
int Lesson_Mark;
int Lesson_Credit;
}Lesson;

typedef struct Student //定义学生的结构体
{
char Name[50];
int Num;
int Lesson_Count;
Lesson L[20];
}Student;

Student S[MAX];
static int Student_Count = 0; //记录学生数的变量

void PrintInterface(); //打印界面
int AddStudent(); //添加,带返回值,提示操作成功
int DelStudent(); //删除,带返回值,提示操作成功
void CheckStudent(); //查学生成绩
void CheckClass(); //查班成绩表
void WriteFile(); //写入文本文件
void ReadFile(); //读取文本文件

void main()
{
int Choice;
while (1)
{
PrintInterface();
scanf("%d%*c", &Choice); //"%*c"是吸收回车的,因为后面会输入字母类型
if (Choice >= 0 && Choice <= 6) //选择操作合法
{
switch (Choice)
{
case 0: exit(1);
case 1:
{
system("cls");
if (AddStudent()) printf("\n添加成功...回车继续\n");
else printf("\n添加失败...回车继续\n");
getchar();
getchar();
system("cls");
break;
}
case 2:
{
system("cls");
if (DelStudent()) printf("\n删除成功...回车继续\n");
else printf("\n删除失败...回车继续\n");
getchar();
getchar();
system("cls");
break;
}
case 3:
{
system("cls");
CheckStudent();
system("cls");
break;
}
case 4:
{
system("cls");
CheckClass();
system("cls");
break;
}
case 5: WriteFile();system("cls");break;
case 6: ReadFile();system("cls");break;
default:;
}
}
else
{
printf("无此功能..重新选择..回车确定\n"); //选择操作非法
getchar();
system("cls"); //清屏函数
}
}
}

void PrintInterface()
{
printf("\t -------------------------- \n");
printf("\t| 1、添加 |\n");
printf("\t| |\n");
printf("\t| 2、删除 |\n");
printf("\t| |\n");
printf("\t| 3、查学生成绩 |\n");
printf("\t| |\n");
printf("\t| 4、查班成绩表 |\n");
printf("\t| |\n");
printf("\t| 5、写入文本文件 |\n");
printf("\t| |\n");
printf("\t| 6、读取文本文件 |\n");
printf("\t| |\n");
printf("\t| 0、退出 |\n");
printf("\t -------------------------- \n");
printf("\t选择操作:");
}

int AddStudent()
{
int S_count, i, j;
printf("\n添加中......\n");
printf("\n添加学生人数(如1、2 ……999):");
scanf("%d", &S_count);
if (Student_Count + S_count >= MAX) return 0; //超过了数组上限
for (i = Student_Count; i < Student_Count + S_count; i++)
{
printf("\n\t第%d个学生:\n", i - Student_Count + 1);
printf("\n\t学生学号:"); scanf("%d%*c", &S[i].Num);
printf("\n\t学生姓名:"); gets(S[i].Name);
printf("\n\t该学生所修课程数:"); scanf("%d", &S[i].Lesson_Count);
for (j = 0; j < S[i].Lesson_Count; j++)
{
printf("\n\t第%d门课:\n", j + 1);
printf("\n\t\t课程编号:"); scanf("%d%*c", &S[i].L[j].Lesson_Num);
printf("\n\t\t课程名称:"); gets(S[i].L[j].Lesson_Name);
printf("\n\t\t课程成绩:"); scanf("%d", &S[i].L[j].Lesson_Mark);
printf("\n\t\t课程学分:"); scanf("%d", &S[i].L[j].Lesson_Credit);
if (S[i].L[j].Lesson_Mark < 60) S[i].L[j].Lesson_Credit = 0; //不及格的课程学分为0
}
}
Student_Count += S_count;
return 1;
}

int DelStudent()
{
char *D_Name;
int D_Num;
int i, j;
printf("\n填写待删除学生的信息:\n");
printf("\n学生姓名:"); gets(D_Name);
printf("\n学生学号:"); scanf("%d", &D_Num);
for (i = 0; i < Student_Count; i++)
{
if (!strcmp(S[i].Name, D_Name) && S[i].Num == D_Num)
{
printf("\n找到该学生,删除中......\n");
for (j = i + 1; j < Student_Count; j++)
{
S[j - 1] = S[j];
}
break;
}
}
if (i == Student_Count)
{
printf("\n未找到该学生...请核对所填信息\n\n");
return 0;
}
else
{
Student_Count--;
return 1;
}
}

void CheckStudent()
{
int C_Choice;
char C_Name[50];
int C_Num;
int i, j;
printf("\n输入所查学生信息(1.姓名 \\ 2.学号)选择:");
scanf("%d%*c", &C_Choice);
printf("\n查找中......\n");
if (C_Choice == 1 || C_Choice == 2) //选择合法
{
if (C_Choice == 1)
{
printf("\n姓名:"); gets(C_Name);
for (i = 0; i < Student_Count; i++) //全部穷举,防止同名同姓
{
if (!strcmp(S[i].Name, C_Name))
{
printf("\n学号:%d\t姓名:%s\n", S[i].Num, S[i].Name);
printf("\n课程编号\t课程名称\t课程成绩\t课程学分\n");
printf("-----------------------------------------------------\n");
for (j = 0; j < S[i].Lesson_Count; j++)
{
printf("%d\t\t%s\t\t%d\t\t%d\n", S[i].L[j].Lesson_Num,
S[i].L[j].Lesson_Name, S[i].L[j].Lesson_Mark,
S[i].L[j].Lesson_Credit);
printf("-----------------------------------------------------\n");
}
printf("\n\n");
}
}
}
else
{
printf("\n学号:"); scanf("%d%*c", &C_Num);
for (i = 0; i < Student_Count; i++) //不用全部穷举,学号唯一
{
if (S[i].Num == C_Num)
{
printf("\n学号:%d\t姓名:%s\n", S[i].Num, S[i].Name);
printf("\n课程编号\t课程名称\t课程成绩\t课程学分\n");
printf("-----------------------------------------------------\n");
for (j = 0; j < S[i].Lesson_Count; j++)
{
printf("%d\t\t%s\t\t%d\t\t%d\n", S[i].L[j].Lesson_Num,
S[i].L[j].Lesson_Name, S[i].L[j].Lesson_Mark,
S[i].L[j].Lesson_Credit);
printf("-----------------------------------------------------\n");
}
printf("\n\n");
break;
}
}
}
printf("查找完毕...回车继续\n");
getchar();
}
else //选择不合法
{
printf("选择错误...回车继续\n");
getchar();
return;
}
}

void CheckClass()
{
int C_LNum;
double SSNum = 0, PassSNum = 0, SMark = 0;
int i, j;
printf("\n请输入课程编号:");
scanf("%d%*c", &C_LNum);
printf("\n查找中......\n\n");
printf("学号\t姓名\t课程名称\t课程成绩\t课程学分\n");
printf("----------------------------------------------------\n");
for (i = 0; i < Student_Count; i++)
{
for (j = 0; j < S[i].Lesson_Count; j++)
{
if (S[i].L[j].Lesson_Num == C_LNum)
{
printf("%d\t%s\t%s\t\t%d\t\t%d\n", S[i].Num, S[i].Name, S[i].L[j].Lesson_Name,
S[i].L[j].Lesson_Mark, S[i].L[j].Lesson_Credit);
printf("----------------------------------------------------\n");
SMark += S[i].L[j].Lesson_Mark;
SSNum ++;
if (S[i].L[j].Lesson_Mark >= 60) PassSNum++;
break;
}
}
}
printf("\n平均分:%.2lf\t及格率:%.2lf%%\n\n", SMark / SSNum, PassSNum / SSNum * 100);
printf("\n查找完毕...回车继续\n");
getchar();
}

void WriteFile()
{
FILE *fp;
int i, j;
char Adr[100];
printf("\n请输入写入的文件地址:\n\n地址输入格式:例如d:\\\\Student.txt(\\\\为转义字符):");
scanf("%s%*c", Adr);
printf("\n写入中......\n");
if (fp = fopen(Adr,"w")) //写入文件
{
fprintf(fp,"%d\n",Student_Count);
for (i = 0; i < Student_Count; i++)
{
fprintf(fp,"%d\t%s\t%d\n",S[i].Num, S[i].Name,S[i].Lesson_Count);
for (j = 0; j < S[i].Lesson_Count; j++)
{
fprintf(fp,"%d\t%s\t%d\t%d\n", S[i].L[j].Lesson_Num,
S[i].L[j].Lesson_Name,S[i].L[j].Lesson_Mark,
S[i].L[j].Lesson_Credit);
}
}
printf("\n写入完成...回车继续\n");
fclose(fp);
}
else
{
printf("\n写入失败...回车继续\n");
}
getchar();
}
void ReadFile()
{
FILE *fp;
int i, j;
char Adr[100];
printf("\n请输入读取(为防止读入错误,希望与写入文件内容格式一致)的文件地址:\n\n地址输入格式:例如d:\\\\Student.txt(\\\\为转义字符):");
scanf("%s%*c", Adr);
printf("\n读取中......\n");
if (fp = fopen(Adr,"r"))
{
fscanf(fp,"%d",&Student_Count);
for (i = 0; i < Student_Count; i++)
{
fscanf(fp,"%d%s%d",&S[i].Num, &S[i].Name,&S[i].Lesson_Count);
for (j = 0; j < S[i].Lesson_Count; j++)
{
fscanf(fp,"%d%s%d%d",&S[i].L[j].Lesson_Num,
&S[i].L[j].Lesson_Name,&S[i].L[j].Lesson_Mark,
&S[i].L[j].Lesson_Credit);
}
}
printf("\n读取成功...回车继续\n");
fclose(fp);
}
else
{
printf("\n读取失败...回车继续\n");
}
getchar();
}来自:求助得到的回答
温馨提示:答案为网友推荐,仅供参考
第1个回答  2012-02-28
你看看能不能运行
#include<iostream>
#include<cstdlib>
#include<cstddef>
#include<string>
#include<iomanip>
#include<fstream>
using namespace std;

struct xueshengguanli
{ string name;
string xibie;
string banbie;
string sex;
int num;
float zongheCJ;
xueshengguanli *next;
};
typedef xueshengguanli* xueshengGL;

xueshengGL Input(xueshengGL head)
{ char SEL='y';
int m=0;
xueshengGL p1,p2,top;
ofstream out_stream;
out_stream.open("student.txt",ios::app); //以追加数据信息打开文件
if(out_stream.fail())
{ cout<<"打开文件失败.\n";
exit(1);
}
while(SEL=='y'||SEL=='Y')
{ p1=new xueshengguanli;
p1->next=NULL;
cout<<"\n请输入你的姓名:";
cin>>p1->name;
cout<<"\n请输入你的学号:";
cin>>p1->num;
cout<<"\n请输入你的性别(男/女):";
cin>>p1->sex;
cout<<"\n请输入你的系别:";
cin>>p1->xibie;
cout<<"\n请输入你的班别:";
cin>>p1->banbie;
cout<<"\n请输入你的综合成绩:";
cin>>p1->zongheCJ;
if(m==0)
{ head=p1;
p2=head;
m=1;
}
else
{ p2->next=p1;
p2=p1;
}
cout<<"\n是否继续输入?(y/n)\n"; //判断是否继续输入
cin>>SEL;
}
top=head;
//写入文件
while(head!=NULL)
{ out_stream<<head->name<<" "<<head->num<<"\t"<<head->sex<<"\t"<<head->xibie
<<"\t"<<head->banbie<<"\t"<<head->zongheCJ;
head=head->next;
}
out_stream.close(); //关闭文件
if(SEL=='n'||SEL=='N')
cout<<"输入完毕.\n";
return top; //返回链表头结点地址
}

//从文件里读取数据
xueshengGL WenJian(xueshengGL top)
{ int n=0;
xueshengGL p,h;
ifstream in_stream;
in_stream.open("student.txt");
if(in_stream.fail())
{ cout<<"打开文件失败.\n";
return 0;
}
while(1)
{ if(in_stream.eof())
break;
else
{p=new xueshengguanli;
p->next=NULL;
in_stream>>p->name>>p->num>>p->sex>>p->xibie>>p->banbie>>p->zongheCJ;
if(n==0)
{ top=p;
h=top;
n=1;
}
else
{ h->next=p;
h=p;
}
}
}
in_stream.close();
return top;
}

void xuanzhe(xueshengGL top)
{ int h;
while(h<1||h>3)
{ cout<<"\n请输入你要修改的项:";
cin>>h;
if(h==1)
{ cout<<"\n请输入新的系别:";
cin>>top->xibie;
break;
}
else if(h==2)
{ cout<<"\n请输入新的班别:";
cin>>top->banbie;
break;
}
else if(h==3)
{ cout<<"\n请输入新的综合成绩:";
cin>>top->zongheCJ;
break;
}
else
cout<<"\n输入错误!请重输!\n";
}
}
第2个回答  2012-02-25
太难了吧!!
第3个回答  2012-02-24
你做梦呢吧,你什么奖励都没有,这么费劲的程序谁愿意给做呀。