倾我所有求一道C语言的编程~~~

各位神仙哥哥姐姐帮帮忙吧~我实在要被C语言折磨疯了~一个程序熬了3个晚上还弄得乱七八糟的~后天就是最后期限了~~555~~
其实就是一个学生资料管理系统的简化版,对高手们来说肯定是小菜一碟啦~要求操作要求如下:
1.从一个指定文件"stud.txt"中读入所有学生的数据并原样输出到屏幕上。
2.计算文件中分数的平均数。
3.根据分数对学生进行降序排列,结果输出到屏幕,同时要存入一个叫stud2.txt的文件中。
4.根据用户在屏幕上输入的学生号输出该学生的资料。
5.允许用户指定学生号并修改该学生的年龄和成绩,并把修改结果保存到原文件stud.txt中。
(必须符合以下要求:1.用一个结构体数组从文件stud.txt中读信息,并用这个结构体数组进行各种操作;
2.做一个目录供用户选择,每一个子目录都要有能返回上一级目录的功能,对于后两项操作还要问“是否继续”。
3.用switch 和case构造目录
4.对于以上5种操作都要各建一个对应的函数。)
文件stud.txt是这样的:
001a John 18 90
002a Mary 19 95.5
003a Mike 19 92.5
004a Nancy 20 89
005a Eva 18 85.5
006a Joe 19 87
007a Bruce 19 66.5
008a Clinton 17 80.5
009a Xiaoming 24 59.5

能有程序注释就更好了~小弟先在此谢过啦!!
如果因为百度字数的限制,请直接发到我的邮箱:
[email protected]

嗯,现在的计算机作业似乎十有八九都是学生管理系统这类东西,而且还得用C做,真是...嗯。
这里有一个用C写的,百度的排版不太好,将就看吧。
稍微说一下思路。先是定义一个学生结构,接着是一个类似管理者的结构,管理者中存储学生数组,并记录学生数。之后则是一系列操作,包括排序、计算平均值、读写文件等等,这些操作基本上都以管理者作为操作对象。最后当然就是界面菜单的处理。
运行程序时必须有stud.txt文件,另外,保存文件的操作没有设为自动进行,而是通过菜单选择进行。默认保存的文件名有stud.txt和stud2.txt,如果要存为其他文件需要自己输入文件名。
每个函数都有说明,希望你能看明白。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define NAME_MAX_LENGTH 25
#define STUDENT_MAX_NUMBER 100

/* 定义学生信息结构 */
struct Student
{
int id;
char name[NAME_MAX_LENGTH];
int age;
float score;
};
/* 管理者结构 */
struct Manager
{
struct Student stus[STUDENT_MAX_NUMBER];
int size;
int stu_count;
};
/********************** 相关操作 ********************/
/*
交换两个学生信息
*/
void SwapStudents(struct Student *pStu1, struct Student *pStu2)
{
struct Student temp;

temp.id = pStu1->id;
temp.age = pStu1->age;
temp.score = pStu1->score;
strcpy(temp.name, pStu1->name);

pStu1->id = pStu2->id;
pStu1->age = pStu2->age;
pStu1->score = pStu2->score;
strcpy(pStu1->name, pStu2->name);

pStu2->id = temp.id;
pStu2->age = temp.age;
pStu2->score = temp.score;
strcpy(pStu2->name, temp.name);
}
/*
初始化管理者
*/
void InitializeManager(struct Manager *pm)
{
int i;
pm->size = NAME_MAX_LENGTH;
pm->stu_count = 0;
for (i=0; i<pm->size; ++i)
{
pm->stus[i].id = 0;
pm->stus[i].name[0] = 0;
pm->stus[i].age = 0;
pm->stus[i].score = 0.0f;
}
}
/*
查找一个学生
id: 学生id
return: 指定学生的索引,查找失败返回-1
*/
int SearchForOne(struct Manager *pm, int id)
{
int i;
for (i=0; i<pm->stu_count; ++i)
{
if (pm->stus[i].id != id) continue;
return i;
}
return -1;
}
/*
从文件中加载学生信息
szFileName: 文件名
return: 学生数。若读取失败,则返回0。
P.S. 如果文件中的学生数超过数组大小,则多余部分不会读入
*/
int LoadStudentsInfo(struct Manager *pm, char *szFileName)
{
char ch, str[10];
int i;
FILE *fp = fopen(szFileName, "r");
if (!fp) return 0;

for (i=0; i<pm->size; ++i)
{
if (fscanf(fp, "%d%c%s%d%s", &pm->stus[i].id, &ch, pm->stus[i].name,
&pm->stus[i].age, str) == EOF) break;
pm->stus[i].score = (float)atof(str);
}

fclose(fp);
return pm->stu_count = i;
}
/*
将学生信息保存到文件中
szFileName: 文件名
*/
int SaveStudentsInfo(struct Manager *pm, char *szFileName)
{
char ch = 'a';
int i;
FILE *fp = fopen(szFileName, "w");
if (!fp) return 0;

for (i=0; i<pm->stu_count; ++i)
{
fprintf(fp,"%03d%c %s %d %g\n", pm->stus[i].id, ch, pm->stus[i].name,
pm->stus[i].age, pm->stus[i].score);
}

fclose(fp);
return 1;
}
/*
根据ID排序
mode: 0 - 升序,非0 - 降序
*/
void SortByID(struct Manager *pm, int mode)
{
int i, j;
int flag = 1;

if (mode)
{
for (i=0; (i+1<pm->stu_count) && flag; ++i)
{
flag = 0;
for (j=0; j+i+1<pm->stu_count; ++j)
{
if (pm->stus[j].id < pm->stus[j+1].id)
{
SwapStudents(pm->stus+j, pm->stus+j+1);
flag = 1;
}
}
}
return;
}
for (i=0; (i+1<pm->stu_count) && flag; ++i)
{
flag = 0;
for (j=0; j+i+1<pm->stu_count; ++j)
{
if (pm->stus[j].id > pm->stus[j+1].id)
{
SwapStudents(pm->stus+j, pm->stus+j+1);
flag = 1;
}
}
}
}
/*
根据成绩排序
mode: 0 - 升序,非0 - 降序
*/
void SortByScore(struct Manager *pm, int mode)
{
int i, j;
int flag = 1;

if (mode)
{
for (i=0; (i+1<pm->stu_count) && flag; ++i)
{
flag = 0;
for (j=0; j+i+1<pm->stu_count; ++j)
{
if (pm->stus[j].score < pm->stus[j+1].score)
{
SwapStudents(pm->stus+j, pm->stus+j+1);
flag = 1;
}
}
}
return;
}
for (i=0; (i+1<pm->stu_count) && flag; ++i)
{
flag = 0;
for (j=0; j+i+1<pm->stu_count; ++j)
{
if (pm->stus[j].score > pm->stus[j+1].score)
{
SwapStudents(pm->stus+j, pm->stus+j+1);
flag = 1;
}
}
}
}
/*
平均成绩
*/
float AverageScore(struct Manager *pm)
{
float sum = 0.0f;
int i;

for (i=0; i<pm->stu_count; ++i) sum += pm->stus[i].score;
return sum / pm->stu_count;
}
/*
打印一个学生的信息
index: 学生索引
return: 非法索引值将返回0
*/
int PrintOne(struct Manager *pm, int index)
{
char ch = 'a';
if (index<0 || index>=pm->size) return 0;

printf("* * * * * * * * * * * * * *\n");
printf("ID:\t%03d%c\nName:\t%s\nAge:\t%d\nScore:\t%.1f\n", pm->stus[index].id, ch,
pm->stus[index].name, pm->stus[index].age, pm->stus[index].score);
printf("* * * * * * * * * * * * * *\n");
return 1;
}
/*
打印所有学生信息
*/
void PrintAll(struct Manager *pm)
{
char ch = 'a';
int i;
printf("* * * * * * * * * * * * * * * *\n");
printf("ID Name\tAge\tScore\n");
for (i=0; i<pm->stu_count; ++i)
{
printf("%03d%c: %s\t%d\t%.1f\n", pm->stus[i].id, ch,
pm->stus[i].name, pm->stus[i].age, pm->stus[i].score);
}
printf("* * * * * * * * * * * * * * * *\n");
}
/*
清除缓冲区中的剩余字符
*/
void clear()
{
for (; getchar()!=10; );
}
/*
界面处理
rank: 菜单级次。1: 显示所有学生信息;
2: 显示指定学生信息;
3: 修改指定学生信息;
4: 平均成绩;
5: 按ID升序排列;
6: 按成绩降序排列;
7: 重新从文件中读入学生数据;(文件可选)
8: 将当前学生信息保存到文件中;(文件可选)
9. 退出程序
return: 如果选择退出,返回0;否则返回非0值
*/
int InteraceProc(int rank, struct Manager *pm)
{
char sel = 0;
char szFile[30];
int id, index, res;
int age;
float score;
switch (rank)
{
case 0:
printf("\n");
printf("- - - - - - - - - - - - - - - - -\n");
printf("1. Information of all students\n");
printf("2. Information of one student\n");
printf("3. Modify data of one student\n");
printf("4. Average score\n");
printf("5. Sort by ID\n");
printf("6. Sort by score\n");
printf("7. Reload data from...\n");
printf("8. Save current data as...\n");
printf("9. Exit\n");
printf("- - - - - - - - - - - - - - - - -\n");
printf("Please choose one: ");
break;
case 1:
printf("\n");
PrintAll(pm);
clear();
break;
case 2:
id = -1;
printf("\nSpecify the student by ID: ");
scanf("%d", &id);
clear();
index = SearchForOne(pm, id);
if (index < 0) printf("Can't find the student.\n");
else PrintOne(pm, index);
clear();
break;
case 3:
printf("\nSpecify the student by ID: ");
scanf("%d", &id);
clear();
index = SearchForOne(pm, id);
if (index < 0)
{
printf("Can't find the student.\n");
break;
}
PrintOne(pm, index);
printf("Input the new age and new score: ");
res = scanf("%d %f", &age, &score);
clear();
if (!res) break;
printf("Are you sure? (y/n) ");
res = scanf("%c", &sel);
clear();
if (sel!='y' && sel!='Y') break;
pm->stus[index].age = age;
pm->stus[index].score = score;
PrintOne(pm, index);
clear();
break;
case 4:
score = AverageScore(pm);
printf("\nThe average score: %.2f", score);
clear();
break;
case 5:
printf("Are you sure? (y/n) ");
res = scanf("%c", &sel);
clear();
if (sel!='y' && sel!='Y') break;
printf("\n");
SortByID(pm, 0);
PrintAll(pm);
clear();
break;
case 6:
printf("Are you sure? (y/n) ");
res = scanf("%c", &sel);
clear();
if (sel!='y' && sel!='Y') break;
printf("\n");
SortByScore(pm, 1);
PrintAll(pm);
clear();
break;
case 7:
case 8:
printf("\n1. stud.txt");
printf("\n2. stud2.txt");
printf("\n3. other file");
printf("\n4. return");
printf("\nchoose one: ");
res = scanf("%d", &index);
clear();
if (!res || index<1 || index>3) break;
switch (index)
{
case 1: strcpy(szFile, "stud.txt"); break;
case 2: strcpy(szFile, "stud2.txt"); break;
case 3:
printf("Input the file name: ");
scanf("%s", szFile);
clear();
break;
}
printf("Are you sure? (y/n) ");
res = scanf("%c", &sel);
clear();
if (sel!='y' && sel!='Y') break;
if (rank == 7) res = LoadStudentsInfo(pm, szFile);
else res = SaveStudentsInfo(pm, szFile);
if (!res) printf("Can't open the file!\n");
break;
case 9:
printf("\nThe program end.");
getchar();
return 0;
}
return 1;
}
/******************* 主函数 *******************/
int main()
{
int sel, res;
struct Manager manager;
/* 程序的正常运行需要确保存在stud.txt文件 */
InitializeManager(&manager);
if (!LoadStudentsInfo(&manager, "stud.txt"))
{
printf("Can't load students data.\n");
printf("The program abort.");
getchar();
return -1;
}

for (; ; )
{
InteraceProc(0, &manager);
res = scanf("%d", &sel);
clear(); /* 如果没有这一句,在主菜单中输入非数字字符时,程序将陷入死循环 */
if (!res || !sel) continue;
if (!InteraceProc(sel, &manager)) break;
}
return 0;
}
温馨提示:答案为网友推荐,仅供参考
第1个回答  2007-03-24
大概相同你再用一天时间改下旧可以了!
#include<stdio.h>
struct grade /*声明定义学生成绩结构体*/
{
char name[20];
int termlyexam;
int midterm;
int endterm;
float finalgrade;
};
void main()
{

int count=0,i;/*count是纪录已输入成绩的学生的个数*/
char flag;/*条件标示变量,用于判断是否继续输入*/
struct grade cj[50],first;/*第一学生成绩数组*/
do/*选环录入学生成绩*/
{
printf("请输入第%d个学生成绩信息\n",count+1);
printf("学生姓名:");
scanf("%s",cj[count].name);
printf("平时成绩:");
scanf("%d",&cj[count].termlyexam);
printf("期中成绩:");
scanf("%d",&cj[count].midterm);
printf("期末成绩:");
scanf("%d",&cj[count].endterm);
cj[count].finalgrade=(float)(cj[count].termlyexam*0.1)+(float)(cj[count].midterm*0.2)+(float)(cj[count].endterm*0.7);/*计算最终成绩*/
count++;
printf("继续输入吗?(y/n):");
getchar();
flag=getchar();
}while(flag=='y'||flag=='Y');
printf("\n以下是成绩清单:\n");
printf("姓 名\t平时成绩\t期中成绩\t期末成绩\t最终成绩\n");
printf("======\t========\t========\t========\t========\n");
for(i=0;i<count;i++)/*输出学生成绩清单*/
{
printf("%s\t %d\t\t %d\t\t %d\t\t%f\n",cj[i].name,cj[i].termlyexam,cj[i].midterm,cj[i].endterm,cj[i].finalgrade);
}
first=cj[0];
for(i=1;i<count;i++)/*查找成绩最高的学生*/
{
if(cj[i].finalgrade>first.finalgrade)
first=cj[i];
}
printf("\n成绩最好的学生是 %s,最终成绩是 %1f\n",first.name,first.finalgrade);
}
第2个回答  2007-03-24
我用C++写了个,基本满足要求,你拿去参考下:

#include <fstream>
#include <iostream>
#include <string>
#include <cstddef>
#include <map>
#include <set>
#include <iomanip>
#include <memory>
using namespace std;

class StudDataManager
{
public:
StudDataManager();
StudDataManager(const string& str);
StudDataManager(const char* str);
void Print();
double AvgCal();
void SortOut(const char* outFile);
void SetData();

private:
struct student
{
string id;
string name;
size_t age;
double score;
};
typedef map<string, student> data_type;

template<class T>
class sortCriterion
{
public:
bool operator () (const student& lhs, const student& rhs)
{
return lhs.score > rhs.score;
}
};
typedef set<student, sortCriterion<student> > sorted_type;

void init();
data_type studData;
sorted_type sorted;
fstream fOp;
};

StudDataManager::StudDataManager()
{
}

void StudDataManager::init()
{
student temp;
while(!fOp.eof())
{
fOp >> temp.id;
string id = temp.id;
fOp >> temp.name >> temp.age >> temp.score;
studData.insert(data_type::value_type(id, temp));
sorted.insert(sorted_type::value_type(temp));
}
fOp.clear();
fOp.seekg(ios_base::beg);
}

StudDataManager::StudDataManager(const string& str) : fOp(str.c_str())
{
if(!fOp)
throw std::domain_error("文件不能打开!");
init();
}

StudDataManager::StudDataManager(const char* c_str) : fOp(c_str)
{
if(!fOp)
throw std::domain_error("文件不能打开!");
init();
}

void StudDataManager::Print()
{
cout << fOp.rdbuf() << endl;
fOp.clear();
fOp.seekg(ios_base::beg);
}

double StudDataManager::AvgCal()
{
double total = 0;
for(data_type::iterator it = studData.begin(); it != studData.end(); ++it)
{
total += it->second.score;
}

return total / studData.size();
}

void StudDataManager::SortOut(const char* out)
{
ofstream outFile(out);

for(sorted_type::iterator it = sorted.begin(); it != sorted.end(); ++it)
{
outFile << it->id << ' '
<< it->name << ' '
<< it->age << ' '
<< it->score << '\n';
}
outFile.close();
}

void StudDataManager::SetData()
{
cin.exceptions(ios_base::failbit | ios_base::badbit);
cout << "请输入你要设置的学生的ID: ";

string id;
cin >> id;

if(studData.find(id) == studData.end())
{
cout << "无此ID的学生!" << endl;
return;
}

cout << "请输入ID为 " << id << " 的学生的姓名: ";
cin >> studData[id].name;

cout << "请输入ID为 " << id << " 的学生的年龄: ";
cin >> studData[id].age;

cout << "请输入ID为 " << id << " 的学生的分数: ";
cin >> studData[id].score;

for(data_type::iterator it = studData.begin(); it != studData.end(); ++it)
{
fOp << it->second.id << ' '
<< it->second.name << ' '
<< it->second.age << ' '
<< it->second.score << '\n';
}
fOp.seekg(ios_base::beg);
fOp.clear();

cout << "设置完毕!" << endl;
}

void manipulate()
{
cout.fill('=');
cout << setw(23) << '=' << "学生信息管理系统" << setw(23) << '=' << endl;
cout << "1) 打开/重打开文件\t\t\t" << "2) 打印文件内容\n" << "3) 排序并保存到文件\t\t\t";
cout << "4) 计算平均分\n" << "5) 重设学生信息\t\t\t\t" << "6) 退出" << endl;

enum{reOpen = 1, print, sortOut, viewAvg, reset, exit};

int op;
StudDataManager* data(0);
string fileName;
do{
cout << "\n请选择: ";
cin >> op;

if(op == 1)
{
if(data != 0)
delete data;
cout << "请输入要读取的文件名称: ";

cin >> fileName;
data = new StudDataManager(fileName.c_str());

cout << "文件已成功打开.\n";
}
switch(op)
{
case print:
cout << "该文件内容为: \n";
data->Print();
break;

case sortOut:
cout << "输入按分数排序后要保存到的文件名: ";

cin >> fileName;
data->SortOut(fileName.c_str());

cout << "保存完毕!" << endl;
break;

case viewAvg:
cout << "经计算该文件中所有学生的平均分为: " << data->AvgCal() << endl;
break;
case reset:
data->SetData();
break;
}
}while(op != exit);
if(data != 0)
delete data;
cout << "程序结束." << endl;
}

int main()
{
manipulate();
}

=======================学生信息管理系统=======================
1) 打开/重打开文件 2) 打印文件内容
3) 排序并保存到文件 4) 计算平均分
5) 重设学生信息 6) 退出

请选择: 1
请输入要读取的文件名称: stud.txt
文件已成功打开.

请选择: 2
该文件内容为:
001a John 18 90
002a Mary 19 95.5
003a Mike 19 92.5
004a Nancy 20 89
005a Eva 18 85.5
006a Joe 19 87
007a Bruce 19 66.5
008a Clinton 17 80.5
009a Xiaoming 24 59.5

请选择: 4
经计算该文件中所有学生的平均分为: 82.8889

请选择: 3
输入按分数排序后要保存到的文件名: stud2.txt
保存完毕!

请选择: 5
请输入你要设置的学生的ID: 002a
请输入ID为 002a 的学生的姓名: Kitty
请输入ID为 002a 的学生的年龄: 18
请输入ID为 002a 的学生的分数: 100
设置完毕!

请选择: 2
该文件内容为:
001a John 18 90
002a Kitty 18 100
003a Mike 19 92.5
004a Nancy 20 89
005a Eva 18 85.5
006a Joe 19 87
007a Bruce 19 66.5
008a Clinton 17 80.5
009a Xiaoming 24 59.5

请选择: 1
请输入要读取的文件名称: stud2.txt
文件已成功打开.

请选择: 2
该文件内容为:
002a Mary 19 95.5
003a Mike 19 92.5
001a John 18 90
004a Nancy 20 89
006a Joe 19 87
005a Eva 18 85.5
008a Clinton 17 80.5
007a Bruce 19 66.5
009a Xiaoming 24 59.5

请选择: 6
程序结束.
第3个回答  2007-03-24
楼上的真答得……
相似回答