C++ 重写了一个学生管理程序(作业题)

前几天看到CFAN论坛某位同学的作业帖子,决定帮一下,发帖子也是原先的版主,不理人家多不好。

拿到题目一看,是C++的,那位同学给了个源码,是论坛上另外一个同学写的,结构比较混乱,功能也没完善。

他原本的意思是让我修改下,结果我看那个结构,只能重构了。。这个很惭愧的说,不会C++,但是又答应帮人家了,于是拿出勇气来,床头放本Cpp primer,google准备着,vim开开。今天一整天的时间终于搞定了。

第一次写用了对象的C++程序,很多地方没有设置检查,溢出漏洞多多,虽然使用了类,但看起来很是面向过程的。毕竟第一次留个纪念。

更新信息:
感谢徐老师的意见,于是决定把搜索那块重新写下,
新建了一个搜索模板函数searchframe(),想查找什么内容,怎么比较,查询后是否修改可以由参数指定,增强了代码的复用性。而且可以为以后添加
更多的查询/修改功能提供了条件。不过写的水平不怎么高,代码有点晦涩 。。

——————————————————————————————

题目要求:

设计一个类CStudent,类中包含一个学生的基本数据如下:

编号,姓名,性别,年龄,数学成绩,计算机成绩,外语成绩。 并假设编号为整数,且从1号往后连续编码;姓名为字符串,性别为字符。

如: 1 LiPing m 18 89 98 94

请采用binary文件形式,并使用随机读写处理方式,对自定义CStudent类的对象数据进行存储与读写处理(即是说,总按具有连续编码的编号
num为“序”来对文件中的各对象数据进行随机读写处理)。并设计该类的成员函数,而且对输出运算符“<<”进行重载,使该运算符能够完成将
一个学生的信息输出到屏幕上。

要求成员函数完成以下功能:

(1) 从键盘输入一个学生的有关信息,并将它们存入到数据文件中(按编号来确定写出位置)。

(2) 按编号对学生信息进行检索并将检索结果显示在屏幕上。

(3) 按姓名对学生信息进行检索并将检索结果显示在屏幕上。

(4) 计算某编号学生的总成绩与平均成绩。

(5) 列出所有总成绩超过n分的性别为s同学的有关信息(n,s由用户从键盘输入)。

 

/**************************************** 
*名称:    student.cpp         * 
*描述:    学生管理程序          * 
*功能:    添加,修改,按条件查询学生信息 * 
*环境:    Fedora Linux 11 & GCC & x86 * 
*备注:    davelv第一次Class于2010-01-10   * 
*更新:    新建了可复用的搜索模板searchframe  * 
****************************************/  
  
#include <iostream>  
#include <cstring>  
#include <vector>  
#include <fstream>  
#include <cstdlib>  
  
using namespace std;  
#define CIN_LEN     1024//缓冲区长度  
#define FILENAME    "data"//数据文件名  
/////////////////////////////////////  
//            结构和类            //  
///////////////////////////////////  
struct data//学生个人信息  
{  
    int id;//学号  
    char name[20];//名字  
    char major[20];//专业  
    char sex;//性别  
    double ch,en,ma;//成绩  
    int grade;//年级  
};  

class CStudent  
{  
    protected:  
        bool altered;//是否修改  
        data info;//学生信息  
    public:  
        static int nowid ;//新学生自增id  
        static void displayhead();//显示表头  
        static void displayshorthead();//显示短表头  
        CStudent();//构造  
        void displayinfo();//显示全部学生信息  
        void displayshortinfo();//显示学生短信息  
        double getsum();//取总成绩  
        double getave();//取得平均分  
        double getch();//取语文成绩  
        double geten();//取外语成绩  
        double getma();//取数学成绩  
        int set(bool isnew);//设置学生信息  
        int getgrade();//取年级  
        int getid();//取学号  
        bool isaltered();//取是否修改  
        char getsex();//取性别  
        char* getname();//取姓名  
        char* getmajor();//取专业  
        data* getinfo();//取学生全部信息  
        //定义友元函数以便重载运算符  
        friend ostream& operator<<(ostream&,const CStudent&);  
        friend istream& operator>>(istream&,CStudent&);  
      
};  

int CStudent::nowid = 1;//初始化类静态成员  

CStudent::CStudent()//基类构造  
{  
    info.id=CStudent::nowid++;//子增id  
    strcpy(info.name,"None");//名字  
    info.ch=0;//语文成绩  
    info.en=0;//外语成绩  
    info.ma=0;//数学成绩  
    info.grade=1;//年级  
    altered=false;//未被修改  
}  
  
 CStudent::getgrade()  
{  
    return info.grade;  
}  

double CStudent::getsum()  
{  
    return info.ch+info.en+info.ma;  
}  
double CStudent::getave()  
{  
    return (info.ch+info.en+info.ma)/3;  
}  
double CStudent::getch()  
{  
     return info.ch;  
}  
  
double CStudent::geten()  
{  
    return info.en;  
}  
  
double CStudent::getma()  
{  
    return info.ma;  
}  
  
int CStudent::getid()  
{  
    return info.id;  
}  
  
char CStudent::getsex()  
{  
    return info.sex;  
}  
  
char * CStudent::getname()  
{  
    return info.name;  
}  
bool CStudent::isaltered()  
{  
    return altered;  
}  
data *CStudent::getinfo()  
{  
    return &info;  
}  
void CStudent::displayinfo()  
{  
    cout<<*this<<"/t"<<getsum()<<"/t"<<getave()<<endl;//利用重载运算符输出  
}  
void CStudent::displayshortinfo()  
{  
    cout << *this<<endl;  
}  
void CStudent::displayhead()  
{  
    cout<<"/n/t学号/t姓名/t性别/t专业/t年级/t中文/t英文/t数学/t总分/t平均分/n";  
}  
void CStudent::displayshorthead()  
{  
    cout<<"/n/t学号/t姓名/t性别/t专业/t年级/t中文/t英文/t数学/n";  
}  
int CStudent::set(bool isalter)  
{  
    cout<<"输入学生信息:/n";  
    displayshorthead();  
    if (isalter)  
        displayshortinfo();  
    cout<<"/t"<<info.id<<"/t";  
    cin.clear();  
    cin>> *this;//从标准输入获取学生信息  
    altered=true;//已修改  
  
    if(cin.fail())  
    {  
        cout<<"录入失败/n";  
        cin.clear();  
        cin.ignore(CIN_LEN,'/n');//这两行是用来清空输入缓冲  
        return -1;  
    }  
    else  
    {  
        cout<<"录入成功/n";  
        return 1;  
    }  
}  
  
//重载输出符  
ostream &operator<<(ostream& out,const CStudent &right)  
{  
    //输出学生的全部信息  
    out <<"/t"<<right.info.id<<"/t"<<right.info.name<<"/t"<<right.info.sex<<"/t"  
        <<right.info.major<<"/t"<<right.info.grade<<"/t"<<right.info.ch<<"/t"  
        <<right.info.en<<"/t"<<right.info.ma;  
    return out;  
}  
//重载输入符  
istream& operator>>(istream& in,CStudent& right)  
{  
    //输入除ID外的其他信息  
    in  >>right.info.name>>right.info.sex>>right.info.major  
        >>right.info.grade>>right.info.ch>>right.info.en>>right.info.ma;  
    return in;  
}  
  
/////////////////////////////////  
//            初始化函数           //  
////////////////////////////////  
int initial(vector<CStudent*> &stu)  
{  
    fstream file;//输入文件  
    CStudent *p;  
  
    file.open(FILENAME, fstream::in|fstream::binary);//二进制输入打开  
  
    if (!file)//文件是否打开成功  
        return -1;  
    while( file.peek()!=EOF )//是否到文件末尾  
    {  
        p=new CStudent();//新建一个学生对象  
        file.read((char*) p->getinfo(),sizeof(data));//读入学生对象  
        if(file.fail())//检查读入是否失败  
            return -2;  
        stu.push_back(p);//对象加入vector  
    }  
    if(!stu.empty())//如果从文件读入了对象  
        CStudent::nowid = stu.back()->getid()+1;//则自增id设置为最后一个学生id+1  
    file.close();//关闭  
    return stu.size();//返回对象个数  
}  
////////////////////////////////  
//           信息增加函数         //  
///////////////////////////////  
void insert(vector<CStudent*> &stu)  
{  
    char c='y';//输入控制字符  
  
    int flag = 1;//标志位,1表示新增成功  
  
    CStudent *p=new CStudent();  
  
    while(c != 'n')//是否继续新增  
    {  
        flag = p->set(false);//设置学生信息  
        if( flag == 1 )//如果设置成功  
        {  
            stu.push_back(p);//对象加入vector  
            p = new CStudent();//新建下一个对象  
        }  
        cout << "是否继续添加学生(any/n)?";  
        cin.clear();  
        cin.ignore(CIN_LEN,'/n');  
        cin.get(c);  
    }  
    //删除最后一个新建的对象,因为没有使用它  
    delete p;  
    CStudent::nowid--;  
}  
  
///////////////////////////////  
//       查询全部信息函数        //  
/////////////////////////////  
int comparebynone(const void *a, const void *b )  
{  
    return 0;  
}  
////////////////////////////////  
//         按学号比较函数         //  
//////////////////////////////  
int comparebyid(const void *a, const void *b )  
{  
    return *(const int *)a - ((CStudent *)(b))->getid();  
}  
///////////////////////////////  
//         按姓名比较函数        //  
//////////////////////////////  
int comparebyname(const void *a, const void *b )  
{  
    return strcmp((const char *)a, (const char *)(((CStudent *)b)->getname()));  
}  
////////////////////////////////  
//         按年级比较函数         //  
//////////////////////////////  
int comparebygrade(const void *a, const void *b)  
{  
    return (*(const int *)a - ((CStudent *)b)->getgrade());  
}  
/////////////////////////////////////  
//        按总分和性别比较函数          //  
///////////////////////////////////  
int comparebymarkandsex(const void *a, const void *b)  
{  
    double mark;  
    char sex;  
    sscanf((const char*)a,"%lf%c",&mark,&sex);  
    return  !(  
           ( ((CStudent*)b)->getsum() >= mark )  
        && ( (sex =='n') || (sex == ((CStudent*)b)->getsex()) )  
        );  
  
  
}  
///////////////////////////////  
//         搜索模板              //  
/////////////////////////////  
template <typename T>  
void searchframe(const char *info, T &condition ,vector<CStudent *> &stu,
    int (*compare)(const void *a, const void *b) ,bool isalter)  
{  
    char c='y';  
    int flag;  
    while(c != 'n')  
    {  
        cin.clear();  
  
        if(info != NULL)  
        {  
            cout<< "输入"<<info<<":";  
            //cin.ignore(CIN_LEN,'/n');  
            cin>>condition;  
        }  
  
        if(cin.fail())  
        {  
            cout << "输入错误/n";  
        }  
        else  
        {  
            //遍历vector查找  
            for(vector<CStudent*>::size_type ix =flag=0; ix!=stu.size(); ++ix)  
            {   //判断是name是否相等  
                if(compare(&condition,stu[ix]) == 0)  
                {  
                    if( isalter )  
                        stu[ix]->set(isalter);  
                    else  
                    {  
                        if(flag == 0)  
                            CStudent::displayhead();  
                        stu[ix]->displayinfo();  
                    }  
                    flag = 1;  
                }  
            }  
            if (flag == 0)//没有查到  
            {  
                cout<<"没有";  
                if(info == NULL)  
                    cout<<"符合条件";  
                else  
                    cout<<info<<"为"<<condition;  
                cout<<"的学生/n";  
            }  
        }  
        cout << "是否继续(any/n)?";  
        cin.clear();  
        cin.ignore(CIN_LEN,'/n');  
        cin.get(c);  
    }  
}  
  
////////////////////////////////  
//         信息检索函数           //  
//////////////////////////////  
void fetch(vector<CStudent*> &stu)  
{  
    int choose,id,grade;  
    char name[20],markandsex[20];  
  
    while (true)  
    {  
        cout << "/n/t1.显示全部学生信息/n"  
            "/t2.按学号查学生信息/n"  
            "/t3.按姓名查学生信息/n"  
            "/t4.按年级查学生信息/n"  
            "/t5.按成绩和性别查询/n"  
            "/t6.返回上级菜单/n/n";  
    lchoose:  
        cout<<"输入您的选择:";  
        choose=0;  
        cin>>choose;  
        switch(choose)  
        {  
            case 1 :searchframe(NULL,choose,stu,comparebynone,false);
                    break;  
            case 2 :searchframe("学号",id,stu,comparebyid,false);
                    break;  
            case 3 :searchframe("姓名",name,stu,comparebyname,false);
                    break;  
            case 4 :searchframe("年级",grade,stu,comparebygrade,false);
                    break;  
            case 5 :searchframe("分数和性别",markandsex,stu,comparebymarkandsex,false);
                    break;  
            case 6 :return ;  
            default:cout<<"输入有误/n";cin.clear();cin.ignore(CIN_LEN,'/n');
                    goto lchoose;  
        }  
    }  
}  
////////////////////////////////  
//         信息保存函数           //  
//////////////////////////////  
int save(vector<CStudent*> &stu)  
{  
    fstream file;  
  
    file.open(FILENAME, fstream::out|fstream::binary);//二进制写打开文件  
    if (!file)//判断打开是否成功  
        return -1;  
    //遍历全部对象  
    for(vector<CStudent*>::size_type ix =0; ix!=stu.size(); ++ix)  
    {   //判断当前对象是否已修改  
        if(stu[ix]->isaltered())  
        {   //修改了则写入文件  
            file.seekp(ix*sizeof(data));  
            file.write((char*) stu[ix]->getinfo(),sizeof(data));  
            //写入是否成功  
            if(file.fail())  
                return -2;  
        }  
  
    }  
    file.close();  
    return 0;  
}  
  
///////////////////////////////  
//           主函数             //  
//////////////////////////////  
  
int main()  
{  
    vector<CStudent *> stu ;  
  
    system("clear");//清屏  
    //读入数据文件  
    if(initial(stu)<0)  
    {  
        cout<<"初始化失败,请检查数据文件/""<<FILENAME<<"/"是否完好/n";  
        return -1;  
    }  
  
    int choose;  
    //主菜单循环  
    while(true)  
    {  
        cout << "/n                  *----------学生信息管理系统----------*/n/n"  
            "                              1.录入信息/n"  
            "                              2.修改信息/n"  
            "                              3.检索学生/n"  
            "                              4.保存数据/n"  
            "                              5.保存退出/n"  
            "                              6.不保存退出/n/n"  
            "                  *---------modify by davelv-----------*/n";  
    lchoose:  
        cout<<"输入您的选择:";  
        choose=0;  
        cin>>choose;  
        switch(choose)  
        {  
            case 1 :insert(stu);break;  
            case 2 :searchframe("学号",choose,stu,comparebyid,true);break;  
            case 3 :fetch(stu);break;  
            case 4 :if(save(stu) <0 )  
                {  
                    cout<<"保存失败,请检查数据文件/""<<FILENAME<<"/"是否完好/n";  
                };break;  
            case 5 :if(save(stu) <0 )  
                {  
                    cout<<"保存失败,请检查数据文件/""<<FILENAME<<"/"是否完好/n";  
                }return 0;  
            case 6 :return 0;  
            default:cout<<"输入有误/n";cin.clear();cin.ignore(CIN_LEN,'/n');goto lchoose;  
        }  
    }  
    return 0;  
}  

This entry was posted in 程序设计 and tagged . Bookmark the permalink.

50 Responses to C++ 重写了一个学生管理程序(作业题)

  1. levery says:

    楼主实在谦虚,这也敢说不会C++,看完了发现,我是真的不会C++,居然还用MFC还写过程序,学习了.

    顺便提点建议,写后面查询函数的时候,把输入,输出,分离出来,只写查询函数,一来可以省掉不少重复代码,二来一旦换成图形界面,很多代码可以继续使用.

    写代码的第一原则,没有重复,重构代码的第一目标,去掉重复,是否?

  2. davelv says:

    <div class="quote"><span class="q"><b>徐名峰(数据库老师)<img src=/image/teacher.gif border=0></b>: 楼主实在谦虚,这也敢说不会C++,看完了发现,我是真的不会C++,居然还用MFC还写过程序,学习了.

    顺便提点建议,写后面查询函数的时候,把输入,输出,分离出来,只写查询</span></div>老师说的没错,我是没有做到完善的地步。

    查询和修改部分代码重复的比较多,可以自己写一个回调函数作为判定传进去。

    另外老师说的界面和逻辑分离,这个是应该要体现的。但是这个逻辑判断实在太小了,分离出来也就是十行代码。对于这么小的作业程序没有太大的价值了。

    C++真的是不太懂,您看写的都是函数,过程,除了重载运算符和用了一个类之外,没有面向对象的东西了。

    谢谢老师点评 ^^

  3. volkswageos says:

    楼主是用fedora 环境编程啊?里面还使用了vector,还有cin的一些其它方法,这样的程序是在刚学习c语言的时候做的题目,原来用c++做程序可以这么不同,在这之前一说到类似的管理系统就觉得烦心,原来可以做的更好,你的调试窗口怎么还有背景啊?

  4. cslxj says:

    这也敢说不会C++?

  5. davelv says:

    <div class="quote"><span class="q"><b>沈阳航空工业学院 summer(Net学生)</b>: 楼主是用fedora 环境编程啊?里面还使用了vector,还有cin的一些其它方法,这样的程序是在刚学习c语言的时候做的题目,原来用c++做程序可以这么不同,在这之前一说到类似的</span></div>Fedora 系统环境。 说是xx管理系统,其实就是个小程序,题目名字是这样,未免有点夸大的嫌疑。我也是一看到管理系统就烦了。背景是桌面,我把终端设置透明了

  6. davelv says:

    <div class="quote"><span class="q"><b>华南师范 陈茵(软件测试学生)</b>: 这也敢说不会C++?</span></div>那我还是什么都不说好了。。。[可爱]

  7. zydj_2006 says:

    感谢分享,你的文章已经推荐到学生大本营首页。

  8. davelv says:

    <div class="quote"><span class="q"><b>CSDN学生大本营辅导员 张媛(职业指导爱好者)<img src=image/group/admin.gif border=0></b>: 感谢分享,你的文章已经推荐到学生大本营首页。</span></div>辅导员美美最近很待见我,THX[色]

  9. 其实我看过 关于面向对象的东西一本书《自然道法:面向对象实践指南》。

    看了后实在是颇为感慨,里面用的设计模式真的很好,关键是联系了实际的一个

    项目FishGUI,如果想 深入了解面向对象的知识,这本书太棒了。反正看了一大半了吧。

    感觉 世界 没有什么不可以用面向对象的思想来解释,神奇~~

  10. davelv says:

    <div class="quote"><span class="q"><b>中国地质大学(武汉) 杨辉鱼(C/C++学生)</b>: 其实我看过 关于面向对象的东西一本书《自然道法:面向对象实践指南》。

    看了后实在是颇为感慨,里面用的设计模式真的很好,关键是联系了实际的一个

    项目FishGUI,如果想</span></div>因为面向对象的方法就是总结的人类和自然的行为而来的,正因为如此,它在处理与人交互,物物交互,也就是UI方面,比较拿手。同样抽象层次太高也造成了脱离计算机底层世界,致使处理简单的底层的计算机问题变得复杂和缓慢。而就算是抽象的比较高也不能完全很好的处理各种对象间的复杂关系,软件工程的历史,就是人同软件复杂性做斗争的经历,没有银弹阿~~从来都不会有银弹的。

  11. 匿名用户 says:

    有致命的内存泄漏问题,别忘了delete []allstudens; 啊!

  12. wade_2003 says:

    楼主实在是太厉害了!有机会好好请教下。

  13. howlet2 says:

    以前我学c的时候也写过类似的,我用C++实现,老师居然说不合要求 重写写 悲剧啊 哈哈

  14. yuhuitao says:

    我是看到照片很漂亮进来的。。。飘过。。。

  15. qiji214 says:

    这也叫不会C++???!!!

  16. hupoqiuxin says:

    看了你这个程序,才知道自己学了一个学期的C++白学了!佩服!

  17. davelv says:

    <div class="quote"><span class="q"><b>王辉(嵌入式学生)</b>: 楼主实在是太厉害了!有机会好好请教下。</span></div>谈不上请教,都是newbie~共同学习

  18. davelv says:

    <div class="quote"><span class="q"><b>西北大学 张浩(C/C++学生)</b>: 看了你这个程序,才知道自己学了一个学期的C++白学了!佩服!</span></div>我是以前有点C语言底子,然后看了下C++的语法写出来的,这位同学千万不能妄自菲薄。。只要努力,不会白学的

  19. awen_PC says:

    我受打击了   这么牛还说不会C++  那我这个学C++的怎么办啊[大哭]

  20. 博主真的很牛,在自称不会Cpp的情况下,
    Cpp primer+Google,一天就用Cpp写出来了。
    一般情况下,都是得学好长一段时间后才能写出来。

    博主的内功真是厉害呀

  21. 匿名用户 says:

    [e03]为什么我都这么大了还这么弱下,我真是个悲剧,你们怎么搞这么强的?我看都看不懂,没学过Cpp

  22. yuyasong says:

    [e06]为什么我都这么大了还这么弱下,我真是个悲剧,你们怎么搞这么强的?我看都看不懂,没学过Cpp
    我发现dn网站的用户老掉线.

  23. lzpgerrard says:

    1.LZ是好人

    2.LZ很强大

    3.向LZ学习

  24. magicflss says:

    原来我还差的好远好远!

  25. a14331990 says:

    我打算把学生的信息分组

    1.基本信息id_name

    编号,姓名

    2.性别信息sex

    性别

    3.年龄信息age

    年龄

    4.专业信息major

    专业

    5.年级信息grade

    年级

    6.成绩信息scores

    数学成绩,计算机成绩,外语成绩

    也就是一个学生由六部分组成。

    其实学生的选取条件也是对应的六种类型的条件。

    输入某种类型的条件后,返回一组满足此条件的学生,搜索函数考虑重载而不是在搜索函数里判断条件的类型。

    写入学生信息时要保证正确,格式要正确,名字和学号要一一对应,同一名字学号的学生的其他信息在第二次输入时经询问后覆盖原值。

    正在写…

  26. levery says:

    改的不错,很多技术的目的都是为了代码重用,在这里函数指针用的很好。不过凡是看见V和M在一起的代码,感到很别扭,总感觉是书本上的东西,而且中毒很深的样子.

    再强调一下,写代码的第一原则,没有重复,重构代码的第一目标,去掉重复,重复去掉了,你的水平就慢慢提高了。

  27. levery says:

    有些同学看到代码比较复杂,对代码会有点恐惧,c++确实是个较难学的东西,但也不是非学不可,把C吃透,再去学JAVA,C#一样能写复杂的程序。不是很有毅力和天赋的同学不推荐学C++,面向对象的语言不止这一种。编程需要一些逻辑的思维,但的确不是一件高难度的事情,不要让C++把你吓住了。

  28. a14331990 says:

    顺便问一下,如何检测destructor正确地释放了内存,在Linux下,我用valgrind

    –leak-check=full来做,在windows下该怎么做呢?

    关于C和C++,都是用封装技术组织代码来解决问题,但封装技术不同,C有函数、结构体,C++在此基础上增加了类、模板。完全

    可以先写原型程序代码,再决定如何封装。

    说到原型,我贴个解决八皇后问题的Haskell程序:

    boardSize = 8

    queens 0 = [[]]

    queens n = [ x:y | y <- queens (n-1), x <- [1..boardSize], safe x y 1]

    — safe x y returns whether an integer x can be added to

    — the list of integers y safely,n is an auxiliary variable

    — used to simplify the definition of this function.  

    safe x [] n = True

    safe x (c:y) n = and [x/=c+n, x/=c-n, x/=c, safe x y (n+1)]

    main = print (queens 8)

    楼主的题目似乎用Prolog写原型很合适,或者SQL(但SQL我不熟)。

  29. magicflss says:

    哪个老师帮我解答下,这段代码的前面为什么要定义一个结构体呢?

    我是个c++菜鸟,懂点皮毛

  30. davelv says:

    <div class="quote"><span class="q"><b>武汉工业学院 张书政(C/C++学生)</b>: 哪个老师帮我解答下,这段代码的前面为什么要定义一个结构体呢?

    我是个c++菜鸟,懂点皮毛</span></div>方便从二进制文件输入输出学生信息。具体代码见200行和388行

  31. davelv says:

    <div class="quote"><span class="q"><b>三峡大学 李博群(C/C++学生)</b>: 顺便问一下,如何检测destructor正确地释放了内存,在Linux下,我用valgrind

    –leak-check=full来做,在windows下该怎么做呢?

    关于C和C++,都是用封装技术组织代码来解决问</span></div>如何检测正确析构这个问题,我回答不了。

    至于你说的原型法,其实这个题目核心没有什么东西,主要代码都在UI上了,而且程序很小,不需要做原型。

    但是如果是要做更易于使用或者结构更清晰更易于扩展的,可能就有必要先构建核心功能,再搭建UI了。但是核心功能跟原型不是一回事。原型法主要是用快速的方法去开发一个demo,用来更准确的捕捉用户的需求。

    SQL的话就是增删查改,就是这个程序,二级菜单下面的那些处理的内容。

    Prolog主要用在人工智能和自然语言方面,跟这个程序貌似关系不大。

    haskell也学了一点语法,这个8皇后的haskell程序以前 逍遥剑 也让我看过,很简洁。

  32. davelv says:

    <div class="quote"><span class="q"><b>徐名峰(数据库老师)<img src=/image/teacher.gif border=0></b>: 改的不错,很多技术的目的都是为了代码重用,在这里函数指针用的很好。不过凡是看见V和M在一起的代码,感到很别扭,总感觉是书本上的东西,而且中毒很深的样子.

    再强调一下</span></div>老师这里的M和V是不是MVC模式的Model和View。。。不过我这里没有 把数据模型和视图做在一起,是把控制器和视图混杂了。那么这个M就理解成了Mechanism了。

    教科书上的确很少教我们如何正确拆分程序功能,这不但跟教材的篇幅和内容限制有关,还跟编者的能力有关。

  33. levery says:

    M是MODEL的意思,凡是数据的修改和查询都是属于模型的部分,视图和控制器和在一起很常见,如果改为图形界面的话,整个函数都废掉了.如果分开的话,M是不用动的

    我一直反对C语言开始的时候学scanf,printf,写算法的时候,直接给数值去验证,printf用的多,简单说一下,模仿着用就行了,这两个东西不是语言本身的东西,这么一学,干扰了初学者对于语言的理解,而且让很多学生产生了错误的习惯,不管什么代码都先来scanf,实在受不了,不是篇幅和内容的限制,指导思想有根本的问题

  34. way9934 says:

    代码写的很漂亮,羡慕

  35. fjxmyzwd says:

    [e01]现在试手都喜欢用学生管理系统啊
    上次恶搞了一个,会自动给带有我们班信息的学生加分的程序,演示给老师,被他恶搞了=。=
    支持D大~~~

  36. <div class="quote"><span class="q"><b>我家 davelv(C/C++学生)</b>: 因为面向对象的方法就是总结的人类和自然的行为而来的,正因为如此,它在处理与人交互,物物交互,也就是UI方面,比较拿手。同样抽象层次太高也造成了脱离计算机底层世界,致</span></div>貌似 你也看过啊~~

  37. crazyjixiang says:

    使用了类(对象),重载操作符,模板,STL,其它部分都是C的,属于山寨的C++程序吧

    提些建议吧:1.既然用了C++,就不要用C的函数,如strcpy等等,字符串类型可以直接定义为C++中的string(string比strcpy好用多了,不过我也是C的痴迷者,不善于用C++),这是有理由的,当你和别人参与大型C++程序开发时你会发现C和C++混在一起使用,bug率很高。

    2.  if( flag == 1 ) 这最好写成if (1 == flag)也是为了避免bug

    3. 类成员初始化最好在构造函数部分同时给成员变量初始化

    4. goto语句使用(虽然有时用goto也未免不可)建议还是用其它方法替代,比如标志位

    ………

    总体来说,代码还是挺规范的。有些地方我也学习了下。

  38. davelv says:

    <div class="quote"><span class="q"><b>专注于linux编程&分词领域 付吉祥(C/C++学生)</b>: 使用了类(对象),重载操作符,模板,STL,其它部分都是C的,属于山寨的C++程序吧

    提些建议吧:1.既然用了C++,就不要用C的函数,如strcpy等等,字符串类型可以直接定义为C++中的strin</span></div>1、的确应该用string类的函数,而不是是string.h的函数。不过我时间比较紧,没来得及找。下次一定注意

    2、这个我的编译器设置会提醒我的,有点依赖编译器。你这么写也很好,我是不习惯,我习惯了if里面写双等号,上次把if里面的赋值也写成双等了。

    3、成员变量初始化这个问题你说的是。我以前成员变量少,都初始化了,后来加了几个,忘记写到构造函数里了。

    4、用了一个goto,显得不够规范,别的地方都是while语句,这里用了老版本的代码,我没有改。如今一看的确不顺眼。

    谢谢付兄的意见。

  39. crazyjixiang says:

    <div class="quote"><span class="q"><b>我家 davelv(C/C++学生)</b>: 1、的确应该用string类的函数,而不是是string.h的函数。不过我时间比较紧,没来得及找。下次一定注意

    2、这个我的编译器设置会提醒我的,有点依赖编译器。你这么写也</span></div>2、这个我的编译器设置会提醒我的,有点依赖编译器。你这么写也很好,我是不习惯,我习惯了if里面写双等号,上次把if里面的赋值也写成双等了。

    ……..

    看来你的VI配置的不错,呵呵,一开始我的VI也有这个配置,后来用了emacs,配置有点繁琐,就放弃配置了,现有的配置能应付我编辑的需要。

  40. warriorpaw says:

    也是学过C/C++的人了   居然看不懂   惭愧惭愧

  41. KISS(Keep It Simple & Stupid)听说理想的境界不是让那些看到你代码的人

    惊呼“哇塞,好聪明”,而是“哈哈,原来这么简单!”,我觉得你的代码很

    清晰,这一点我很羡慕……

  42. davelv says:

    <div class="quote"><span class="q"><b>罗响(C/C++学生)</b>: KISS(Keep It Simple & Stupid)听说理想的境界不是让那些看到你代码的人

    惊呼“哇塞,好聪明”,而是“哈哈,原来这么简单!”,我觉得你的代码很

    清晰,这一点我很羡慕</span></div>过奖了,我也是沿着前辈的道路一步一步往前走。

    KISS法则我非常推崇。能简单搞定的事情不要搞复杂了。

    简单就是美

  43. davelv says:

    <div class="quote"><span class="q"><b>专注于linux编程&分词领域 付吉祥(C/C++学生)</b>: 2、这个我的编译器设置会提醒我的,有点依赖编译器。你这么写也很好,我是不习惯,我习惯了if里面写双等号,上次把if里面的赋值也写成双等了。

    ……..

    看来你的VI配置</span></div>今天刚问了公司里的人,他们一般都是用VI,当然也可以自己选别的编译器。

    所以最近也要在VI上多下点功夫了。呵呵~

  44. crazyjixiang says:

    <div class="quote"><span class="q"><b>我家 davelv(C/C++学生)</b>: 今天刚问了公司里的人,他们一般都是用VI,当然也可以自己选别的编译器。

    所以最近也要在VI上多下点功夫了。呵呵~</span></div>vi是个不错的编辑器

回复 davelv 取消回复

您的电子邮箱地址不会被公开。 必填项已用*标注