|
<FONT size=3>写的不好,当时竟忘了用结构体,BEN!
好象现在大二的同学也正在做这道题,程序中有少量注释,感兴趣的同学我们可以再讨论
//*************************************************************************************
//
// 功能: 根据输入的学生、课程和选课信息,建立简易网状数据库系统
// 作者: 吴志坚
// 时间: 02年3月17日
//
//
// **对三个数据表各字段的说明:**
//
// **学生表(学号,姓名,班级<系>,指向的表,对应表中的位置)**
// **成绩表(成绩<等级>,指向下一成绩的指针,该指针的尾,指向课程的指针)**
// **课程表(课号,课名,学分,指向学生的指针,指针的尾)**
//
//
//**************************************************************************************
#include <iostream>
#include <string>
#include <fstream>
#include <iomanip>
#include <cctype>
using namespace std;
//参数修改
const int STU_MAX = 20; //学生文件中最大学生数
const int COR_MAX = 20; //课程文件中最大课程数
const int MAX_PER = 3 ; //每个人最多报课数
const string STU_FILE = "stuFile.txt"; //学生信息文件
const string COR_FILE = "corFile.txt"; //课程信息文件
const string SCORE_FILE = "score.txt"; //成绩信息文件
//勿修改
const string README = "readme.txt";
//学生信息
string stuNo[ STU_MAX ];
string stuName[ STU_MAX ];
string stuClass[ STU_MAX ];
string stuPt[ STU_MAX ];
int stuPtRear[ STU_MAX ];//完整的指针为stuPt+ptRear
//成绩信息
string score[ STU_MAX * MAX_PER ];
string ptNextScore[ STU_MAX * MAX_PER ];
int ptNextScoreRear[ STU_MAX * MAX_PER ];
int ptCourse[ STU_MAX * MAX_PER ];
//int ptNextSame[ STU_MAX * MAX_PER ];
//课程信息
string corNo[ COR_MAX ];
string corName[ COR_MAX ];
string credit[ COR_MAX ];
string corPt[ COR_MAX ];
int corPtRear[ COR_MAX ];
char Menu( )
//显示菜单函数
{
const string BLANK_LENGTH=" ";
char choice;
cout << endl
<< BLANK_LENGTH
<< "S)创建初始学生文件" << endl
<< BLANK_LENGTH
<< "C)创建初始课程文件" << endl
<< BLANK_LENGTH
<< "I)输入选课情况" << endl
<< BLANK_LENGTH
<< ")学生查询" << endl
<< BLANK_LENGTH
<< "T)教师查询" << endl
<< BLANK_LENGTH
<< "H)使用手册" << endl
<< BLANK_LENGTH
<< "X)退出" << endl;
cin >> choice;
return choice;
}
bool IsInputRight( )
//询问输入是否正确函数
{
while( 1 )
{
cout << "以上输入是否正确?( Y/N )";
char isRight = ' ';
cin >> isRight;
if( toupper(isRight) == 'Y' || toupper(isRight) == 'N' )
{
if( toupper(isRight) == 'Y') return true ;
else { cout << "请重新输入以上信息" << endl ; return false ; }
}
}
}
bool Output2File( const string FILE_NAME, int mesNum, string mes1[ STU_MAX ], string mes2[ STU_MAX ], string mes3[ STU_MAX ] )
//将信息写入文件
{
ofstream outFile;
outFile.open(FILE_NAME.c_str() );
if( !outFile ) return false ;
string ptFile = "scoreFile.txt 0" ; //初始化的指针域
for( int j = 0; j < mesNum; j++ )
{
outFile << mes1[j] << " " << mes2[j] << " " << mes3[j] << " " << ptFile << endl;
}
return true;
}
bool InitFile( const int MAX_VALUE, const string FILE_NAME )
//初始化学生、课程信息文件
{
int messageNum;//当前信息数目
string message1Temp[STU_MAX];//除了指针域外的三条信息
string message2Temp[STU_MAX];
string message3Temp[STU_MAX];
string format = " \"学号 姓名 系别\" ";
if( FILE_NAME == COR_FILE ) format = " \"课号 课名 学分\" ";
while( 1 )
{
cout << "请按照" + format + "的格式输入信息(最多" << MAX_VALUE << "条), 输入完毕请按\"X\" "
<< endl;
messageNum = 0;
string temp;
int isEndCin = false;
while( 1 )
{
cin >> temp;
if( temp != "X" && temp != "x" )
{
message1Temp[ messageNum ] = temp; //C++允许这种赋值方式
cin >> message2Temp[ messageNum ] >> message3Temp[ messageNum ];
}
else break; //提前退出
messageNum++;
if ( messageNum >= MAX_VALUE ) { cout << MAX_VALUE << "条信息已输入完毕~" << endl; break; }//超过最大记录数而退出
}
if( isEndCin = IsInputRight( ) ) break; //输入完毕且确认无误后退出输入
}
//将正确信息写入相应文件
if( !Output2File( FILE_NAME, messageNum, message1Temp, message2Temp, message3Temp ) ) return false;
return true;
}
bool SletCor( )
//先将所有数据放在若干临时数组中,待全部录入完毕后再用指针一一连接,读入文件中
{
string stuNoTemp[ STU_MAX * MAX_PER ] ;//临时记录学号
string corNoTemp[ STU_MAX * MAX_PER ] ;//临时记录课号
//string score[ STU_MAX * MAX_PER ] ;//临时记录成绩
int scoreSize;//成绩信息条数
while( 1 )
{
cout << "请按照\" 学号 课号 成绩 \"的格式输入选课信息(每人不得超过" << MAX_PER << "门), 输入完毕请按\"X\" "
<< endl;
scoreSize = 0;
string temp;
int isEndCin = false;
while( 1 )
{
cin >> temp;
if( temp != "X" && temp != "x" )
{
stuNoTemp[ scoreSize ] = temp;
cin >> corNoTemp[ scoreSize ] >> score[ scoreSize ];
}
else break; //提前退出
scoreSize++;
if ( scoreSize >= STU_MAX * MAX_PER ) { cout << STU_MAX * MAX_PER << "条信息已输入完毕~" << endl; break; }//超过最大记录数而退出
}
if( isEndCin = IsInputRight() ) break; //输入完毕且确认无误后退出输入
}
//将文件中的数据读入内存
ifstream inStuFile;
inStuFile.open( STU_FILE.c_str() );
int j = 0;
while( inStuFile >> stuNo[ j ] )
{
inStuFile >> stuName[ j ];
inStuFile >> stuClass[ j ];
inStuFile >> stuPt[ j ] ;
inStuFile >> stuPtRear[ j ];
j++;
}
int studentSize = j ;//学生实际人数
ifstream inCorFile;
inCorFile.open( COR_FILE.c_str() );
j = 0;
string unused;
while( inCorFile >> corNo[ j ] ) {
inCorFile >> unused >> unused >> corPt[ j++ ] >> unused ;
}
int courseSize = j ;//课程实际数目
//数据处理,连结指针
for( j = 0; j < scoreSize; j++ )
{
static string lastStuNo = "";
//学生与成绩的连结
if( stuNoTemp[ j ] != lastStuNo )
{//不相等说明这是第一次出现
for( int k = 0 ; k < studentSize; k++ )
{ if( stuNo[ k ] == stuNoTemp[ j ] ) break; }
stuPtRear[ k ] = j;
}
else
{
ptNextScore[ j-1 ] = SCORE_FILE;
ptNextScoreRear[ j-1 ] = j;
//ptNextScore[ j ] = "TAIL";//指针末端
//ptNextScoreRear[ j ] = NULL;
}
ptNextScore[ j ] = "TAIL";//指针末端
ptNextScoreRear[ j ] = NULL;
lastStuNo = stuNoTemp[ j ];
//成绩与课程指针的连结
for( int index = 0 ; index < courseSize ; index++ )
{
if( corNoTemp[ j ] == corNo[ index ] )
{ ptCourse[ j ] = index; break; }
}
}</FONT>
|
|