精华内容
下载资源
问答
  • C++程序设计大作业

    2009-08-15 00:20:15
    C++程序设计大作业要求 一、作业目的 1、 掌握用C++实现面向对象程序设计的基本方法 。 2、 熟练掌握window控制台应用程序的编写,初步掌握window可视化界面应用程序的编写方法。 3、 初步完成一个应用程序的设计...
  • C++程序设计大作业 使用SFML制作 太空射击类游戏,画面精美;特效音效充足 ;可以在基础上继续制作改良
  • 西工大C语言/C++程序设计大作业,大神级作品。
  • 西北工业大学C/C++程序设计大作业(包含作业文档和代码)(全)欢迎大家下载使用!
  • C语言/C++程序设计大作业之模拟电信计费系统 选题:设计一个模拟电信计费程序 1.假设电信计费标准:固定电话长途话费0.02元 / 秒,固定电话本地话费0.06元 / 分, 无线电话长途话费1.00元 / 分,无线电话本地话费...

    C语言/C++程序设计大作业之模拟电信计费系统

    选题:设计一个模拟电信计费程序
    1.假设电信计费标准:固定电话长途话费0.02元 / 秒,固定电话本地话费0.06元 / 分,
    无线电话长途话费1.00元 / 分,无线电话本地话费0.60元 / 分 ,无线电话接听话费0.50元 / 分。
    2.源数据文件中存放:电话号码,电信服务类别,通话时间(秒)。
    3.生成固定长途电话文件:长途电话号码和通话时间。
    4.生成固定本地电话文件:本地电话号码和通话时间。
    5.生成无线长途电话文件:长途电话号码和通话时间。
    6.生成无线本地电话文件:本地电话号码和通话时间。
    7.生成无线接听电话文件:接听电话号码和通话时间。
    8.生成统计电信费用文件:电话号码、累计电信费用。

    技术路线:
    主要运用了C语言和C++的一些知识,侧重使用C语言
    #define User_NUM 6
    #define FDT 1 // 固定长途
    #define FLT 2 // 固定本地
    #define WDT 4 // 无线长途
    #define WLT 8 // 无限本地
    #define WAP 16 // 无线接听
    首先先用define定义一些变量,方便读者读懂程序
    char *userTel[User_NUM] ={“15271766778”,“13429806441”,“18062612126”};
    char *codeStr[User_NUM] ={“yv332a”,“rrh44c”,“0dh52m”};
    并且使用char类型指针变量存放电话号码和密码
    1)格式设计篇
    ui界面的设计以及load大标志的转场
    1.Ui界面的设计:使用const函数,与char类型的指针来判定账号的状态
    onst是一个C语言的关键字,它限定一个变量不允许被改变。使用const在一定程度上可以提高程序的健壮性,另外,在观看别人代码的时候,清晰理解const所起的作用,对理解对方的程序也有一些帮助。
    void welcome_ui(const char *logUser)//ui登录界面的设计,char *logUser是声明了一个指向char类型的指针变量,来判断账号是否登录
    {
    cout<<" “<<endl;
    printf(” \t\t\t= = = |电信查询系统| = = = \n");
    if(NULL == logUser)//如果logUser为空则,代表没有登录,所以账号显示为待登录
    {
    printf("\t\t\t= = = 状态:[ 待登录 ] = = = \n");
    }
    else
    {
    printf("\t\t= = = 手机号码: %s = = =\n",logUser);
    }
    printf(" ====================================================\n");
    printf("\t\t 1. 登陆 \n");
    printf("\t\t 2. 查询电话账单 \n");
    printf("\t\t 0. 退出系统 \n");
    cout<<"\t\t 使 用 事 项 “<<endl;
    cout<<”\t\t ①按1,然后输入您的手机号和密码 “<<endl;
    cout<<”\t\t ②登录后按2,查询您本月电话账单 "<<endl;

    }

    2.功能篇
    功能1:登录功能
    主要有输入相应的电话号码和其相应的密码后才能查看话费
    同样是以const函数保证代码的健壮性,并且把电话号码作为char类型的指针变量,方便做比较以验证密码与账号是否匹配
    int matchUserAndCode(const char *tel,const char *code)//匹配账号与密码
    {
    int ret = -1,i =0,id =-1;
    if(NULL == tel || NULL == code ) //如果账号与密码为空则返回-1
    return -1;
    for(i =0 ;i < User_NUM;i++) //这里的User_NUM前面已定义为6
    {
    if( 0 ==strncmp(tel,userTel[i],11) )//如果输入的号码匹配和是11位,
    则返回0值,
    {
    id = i ;
    ret =0 ;
    break;
    }

    }
    if(-1 == ret)
    {
         ret = 1;
         return ret ;
    }
    
    if( 0 != strncmp(code,codeStr[id],6) )//判断密码是否与上面的账号相匹配
    {
        ret = 2 ;
    }
    return ret ;
    

    }

    void log(char ss[])
    {
    char user[12] ="\0",code[7] ="\0";//电话号码是11位数,密码是6位数
    int matchState =0,count =1;//count的作用是计算输入错误的次数,以判断其是否会过试用次数
    while(count <= 3)//有三次输入的机会
    {
    if(count >1)
    printf("\n\t\t 输入有错误,请重新输入 \n");
    printf(“请输入的手机号:\n”);
    printf(“手机号:”);
    scanf("%s",user);
    printf(“密码:”);

        scanf("%s",code);
        if(11 == strlen(user) && 6 == strlen(code))//如果符合格式就跳出循环
            break;
        else
        {
            count++;//每错误一次count都会+1
        }
    }
    if(count >=4) //错误超过3次直接强制退出
    {
        clear_screen();
        printf("==========  错误次数过多  ========== \n\n");
        welcome_ui(NULL);
    }
    else
    {
        matchState = matchUserAndCode(user,code);
        switch(matchState)
        {
            case 0:
                clear_screen();
                load();
    			clear_screen();
                printf("\n===  已 登 陆  ===\n\n");
                strncpy(ss,user,11);
                ss[11] ='\0';
                login_flag =1 ;
                welcome_ui(user);
                break;
    
            case 1:
                clear_screen();
                printf("      \n查询失败\n\n");
                welcome_ui(NULL);
                break;
    
            case 2:
                clear_screen();
                printf("      \n密码错误\n\n");
                welcome_ui(NULL);
                break;
    
            default:
                break;
    
        }
    }
    

    }
    功能2:话费时间生成以及记录
    利用二维数组配合文件生成话费的时间,在配合for循环算出话费,其中要判断文件是否可以打开等等操作,用 if (NULL == fpRead)判断。
    再用二维数组给时间赋值,最后得出话费

    int queryBill(const char *logUser)
    {
    int i = 0,j =0,id =-1;
    int k[6][2] = {0};
    int tel_time[6][5] = {0};
    char *ss[] ={“C:/Users/DELL/Desktop/ccc/FDT.txt”,“C:/Users/DELL/Desktop/ccc/FLT.txt”,“C:/Users/DELL/Desktop/ccc/WDT.txt”,“C:/Users/DELL/Desktop/ccc/WLT.txt”,“C:/Users/DELL/Desktop/ccc/WAP.txt”};

    for(i =0 ;i < User_NUM;i++)
    {
        if( 0 == strncmp(logUser,userTel[i],6) )
        {
            id = i ;
            break;
        }
    }
    if(id <0 || id >5)
        return  -2;
    for(i =0;i < 5; i++)
    {
        FILE *fpRead = fopen(ss[i], "r");
        if (NULL == fpRead)
        {
            return -1;
        }
        j =0 ;
        while ( fscanf(fpRead, "%d|%d",\
                              &k[j][0], &k[j][1]) !=EOF )
        {
           
            if(j >5)
                break;
            else
                j++;
    
        }
        fclose(fpRead);
    
        for(j =0 ;j < 6;j++)
        {
            if(k[j][0] >=1 && k[j][0] <=6)
            {
                tel_time[k[j][0]-1][i] = k[j][1];
                j++;
            }
            else
            {
                printf("      信息被修改\n");
                welcome_ui(logUser);
                break;
            }
        }
    
    
     }
     printf("\n    您的本月话费账单如下:\n");
     printf(" 手机号码:%s\n",userTel[id]);
     printf("|||----      固定长途:%d分钟,产生费用%.2f元\n",tel_time[id][0],0.02*tel_time[id][0]);
     printf("|||----      固定本地:%d分钟,产生费用%.2f元\n",tel_time[id][1],0.06*tel_time[id][1]);
     printf("|||----      无线长途:%d分钟,产生费用%.2f元\n",tel_time[id][2],1.00*tel_time[id][2]);
     printf("|||----      无线本地:%d分钟,产生费用%.2f元\n",tel_time[id][3],0.60*tel_time[id][3]);
     printf("|||----      无线接听:%d分钟,产生费用%.2f元\n",tel_time[id][4],0.50*tel_time[id][4]);
     printf("|||----      总计费用%.2f元\n\n",0.02*tel_time[id][0]\
            +0.06*tel_time[id][1]+1.00*tel_time[id][2]\
            +0.60*tel_time[id][3]+0.50*tel_time[id][4]);
    

    }
    功能3:退出程序
    根据user的指令来操作是否退出系统
    void logOut(char *user)
    {
    if(NULL == user)
    return;

    login_flag =0 ;
    clear_screen();
    welcome_ui(NULL);
    

    }

    源代码:

    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    #include<iostream>
    #include<string>
    #include<time.h>
    using namespace std;
    
    #define User_NUM  4
    #define FDT   1    // 固定长途
    #define FLT   2    // 固定本地
    #define WDT   4    // 无线长途
    #define WLT   8    // 无限本地
    #define WAP   16   // 无线接听
    
    char *userTel[User_NUM] ={"15271766778","13429806441","18062612126"};
    char *codeStr[User_NUM] ={"yv332a","rrh44c","0dh52m"};
    static int login_flag =0 ;
    
    void clear_screen()
    {
        system("cls");
    }  
    
    void welcome_ui(const char *logUser)//ui登录界面的设计,char *logUser是声明了一个指向char类型的指针变量,来判断账号是否登录
    {
           cout<<" "<<endl;
        printf(" \t\t\t= = =      |电信查询系统|  = = =  \n");
        if(NULL == logUser)//如果logUser为空则,代表没有登录,所以账号显示为待登录
        {
            printf("\t\t\t= = =  状态:[ 待登录 ]  = = =   \n");
        }
        else
        {
            printf("\t\t= = =  手机号码: %s  = = =\n",logUser);
        }
        printf("               ====================================================\n");
        printf("\t\t                  1. 登陆                      \n");
        printf("\t\t                  2. 查询电话账单                  \n");
        printf("\t\t                  0. 退出系统                  \n");
    	cout<<"\t\t                  *使 用 事 项*                  "<<endl;
        cout<<"\t\t                  ①按1,然后输入您的手机号和密码                  "<<endl;
        cout<<"\t\t                  ②登录后按2,查询您本月电话账单                   "<<endl;
        
      
    }
    
    void load()                    
    {
    	int i, count = 0;
    	char str[50], str1[50];
    	time_t t1, *t = &t1;
    	/*t1=time(NULL)或t1=time(0)
    	将空指针传递给time()函数
    	并将time()返回值赋给变量t1*/
    	printf("\n\n\n\n\n\n");
    	printf("\t*                                                *\n");
    	printf("\t*                                                *\n");
    	printf("\t*                                                *\n");
    	printf("\t*                                                *\n");
    	printf("\t*           * * * * *     * * * * *              *\n");
    	printf("\t*           *       *     *       *              *\n");
    	printf("\t*           *       *     *       *        * * * *\n");
    	printf("\t*           *       *     *       *        *     *\n");
    	printf("\t*           *       *     *       *        *     *\n");
    	printf("\t*           *       *     *      * *       *     *\n");
    	printf("\t* * * * *   * * * * *     * * *  * * *     * * * *\n");
    	i = 6;
    	do {
    		t1 = time(NULL);   /*t是空指针(NULL),直接返回当前时间。*/
    		strcpy(str, ctime(t));
    		if (count == 6) break;
    		while (strcmp(str, str1) != 0)
    			/*strcmp函数是string compare(字符串比较)的缩写
    			当s1<s2时,返回为负数;
    			当s1=s2时,返回值 = 0;
    			当s1>s2时,返回正数。*/
    		{
    			strcpy(str1, str);//这里的目的是一秒输出一个>然后转换页面
    			printf(" >");
    			count++;
    			break;
    		}
    	} while (1);
    	system("cls");//清屏操作
        
    }
    
    int matchUserAndCode(const char *tel,const char *code)//判断是否匹配机制
    {
        int ret = -1,i =0,id =-1;
        if(NULL == tel || NULL == code )
            return -1;
        for(i =0 ;i < User_NUM;i++)
        {
            if( 0 ==strncmp(tel,userTel[i],11) )
            {
                id = i ;
                ret =0 ;
                break;
            }
    
        }
        if(-1 == ret)
        {
             ret = 1;
             return ret ;
        }
    
        if( 0 != strncmp(code,codeStr[id],6) )
        {
            ret = 2 ;
        }
        return ret ;
    }
    
    
    void log(char ss[])
    {
        char user[12] ="\0",code[7] ="\0";
        int  matchState =0,count =1; //count的作用是计算输入错误的次数,以判断其是否会过试用次数
    
        while(count <= 3)
        {
            if(count >1)
            printf("\n\t\t             输入有错误,请重新输入               \n");
            printf("请输入的手机号:\n");
            printf("手机号:");
            scanf("%s",user);
            printf("密码:");
            
            scanf("%s",code);
            if(11 == strlen(user) && 6 == strlen(code))
                break;
            else
            {
                count++;//每输入错误一次,都会增加计数
            }
        }
        if(count >=4)
        {
            clear_screen();
            printf("==========  错误次数过多  ========== \n\n");
            welcome_ui(NULL);
        }
        else
        {
            matchState = matchUserAndCode(user,code);//按照return的数字配合if来完成相应的功能
            switch(matchState)
            {
                case 0://返回0,登录成功,改变登录状态
                    clear_screen();
                    load();
    				clear_screen();
                    printf("\n===  已 登 陆  ===\n\n");
                    strncpy(ss,user,11);
                    ss[11] ='\0';
                    login_flag =1 ;
                    welcome_ui(user);
                    break;
    
                case 1://返回1,查询失败
                    clear_screen();
                    printf("      \n查询失败\n\n");
                    welcome_ui(NULL);
                    break;
    
                case 2:
                    clear_screen();//返回2,说明输入的密码错误,返回最开始的登录ui
                    printf("      \n密码错误\n\n");
                    welcome_ui(NULL);
                    break;
    
                default:
                    break;
    
            }
        }
    }
    
    int queryBill(const char *logUser)
    {
        int i = 0,j =0,id =-1;
        int k[6][2] = {0};
        int tel_time[6][5] = {0};
       char *ss[] ={"C:/Users/pc/Desktop/ccc/FDT.txt","C:/Users/pc/Desktop/ccc/FLT.txt","C:/Users/pc/Desktop/ccc/WDT.txt","C:/Users/pc/Desktop/ccc/WLT.txt","C:/Users/pc/Desktop/ccc/WAP.txt"};
    
        for(i =0 ;i < User_NUM;i++)
        {
            if( 0 == strncmp(logUser,userTel[i],11) )
            {
                id = i ;
                break;
            }
        }
        if(id <0 || id >5)
            return  -2;
        for(i =0;i < 5; i++)
        {
            FILE *fpRead = fopen(ss[i], "r");
            if (NULL == fpRead)//打开失败,返回-1
            {
                return -1;
            }
            j =0 ;
            while ( fscanf(fpRead, "%d|%d",\
                                  &k[j][0], &k[j][1]) !=EOF ) // fscanf为文件标准输入,EOF是文件结束的标志,它等于NULL,也就是0.
            {
               
                if(j >5)
                    break;
                else
                    j++;
    
            }
            fclose(fpRead);
    
            for(j =0 ;j < 6;j++)
            {
                if(k[j][0] >=1 && k[j][0] <=6)
                {
                    tel_time[k[j][0]-1][i] = k[j][1];
                    j++;
                }
                else
                {
                    printf("      信息被修改\n");
                    welcome_ui(logUser);
                    break;
                }
            }
    
    
         }
         printf("\n    您的本月话费账单如下:\n");
         printf(" 手机号码:%s\n",userTel[id]);
         printf("|||----      固定长途:%d分钟,产生费用%.2f元\n",tel_time[id][0],0.02*tel_time[id][0]);
         printf("|||----      固定本地:%d分钟,产生费用%.2f元\n",tel_time[id][1],0.06*tel_time[id][1]);
         printf("|||----      无线长途:%d分钟,产生费用%.2f元\n",tel_time[id][2],1.00*tel_time[id][2]);
         printf("|||----      无线本地:%d分钟,产生费用%.2f元\n",tel_time[id][3],0.60*tel_time[id][3]);
         printf("|||----      无线接听:%d分钟,产生费用%.2f元\n",tel_time[id][4],0.50*tel_time[id][4]);
         printf("|||----      总计费用%.2f元\n\n",0.02*tel_time[id][0]\
                +0.06*tel_time[id][1]+1.00*tel_time[id][2]\
                +0.60*tel_time[id][3]+0.50*tel_time[id][4]);
    
    }
    
    void logOut(char *user)
    {
        if(NULL == user)
            return;
        
        login_flag =0 ;
        clear_screen();
        welcome_ui(NULL);
    }
    
    int main(void)
    {
        char activeUser[12] = {"\0"};
        int user_choice =-1 ,flag =1;
    
        welcome_ui(NULL);
        while(flag)
        {
            printf("\t\t            请输入需要的服务:    ");
            scanf("%d",&user_choice);
            if( 1 == user_choice )
            {
                log(activeUser);
            }
            else if(2 == user_choice)
            {
                if( 0 == login_flag)
                {
                    printf("\n\t\t===========   系统需先登录   ===========\n\n");
                    welcome_ui(NULL);
                }
                else
                {
                    queryBill(activeUser);
                }
            }
            
            else if( 0 == user_choice)
            {
                printf("\n\t\t===========  服务已结束 ===========\n");
                flag =0 ;
            }
    
        }
        system("pause");
        return 0;
    }
    
    

    在这里插入图片描述

    在这里插入图片描述在这里插入图片描述在这里插入图片描述

    展开全文
  • 面 向 对 象 程 序 设 计 旅营一旅十四营 姓名石英豪 学号141402053 设计程序的目的 关于一些并不太复杂的集体来说一般需要管理集体中的每个人的基本信息的本程序 专门为一些在校学生的基本信息的管理而设计的主要...
  • 面 向 对 象 程 序 设 计 旅营一旅十四营 姓名石英豪 学号 141402053 设计程序的目的 关于一些并不太复杂的集体来说 一般需要管理集体中的每个人的基本信息的 本程序 专门为一些在校学生的基本信息的管理而设计的 ...
  • 面 向 对 象 程 序 设 计 作 业 姓名叶尔凯西 学院系计科系 班级计科系07-1班 学号08080605227 设计程序的目的 关于一些并不太复杂的集体来说 一般需要管理集体中的每个人的基本信息的 本程序 专门为一些在校...
  • 问题(1)类设计设计一个点类 Point,包含两个坐标数据成员 x,y 和一个构造函数;再设计一个友元函数area()用于求两点形成的矩形面积。...问题(2)调试下列程序,写出详细的操作步骤,并将运行结果界面插入文档中。
  • 第 4 次上机 通知考试系统练习已经放出请练习 考试题型与范围见网站通知 3 /tzgg/ 8047.htm 1. 编写程序 根据用户输入的宽和高的数目显示一个由 " 号组成的空心矩形 函数 void rectangle(int w,int h)用于打印该矩形...
  • C与C++程序设计语言-大作业及报告模板.
  • 南京邮电大学大一C ++程序设计作业 班级航班 数据成员D + FNumber字符串 +航空线 + startPoint字符串 +端点字符串 + PlanDepartureTime日期 + PlanArrivalTime日期 +价格int + RemainTickit整数 +后期布尔 +朋友班...
  • 面向对象程序设计大作业 目录 面向对象程序设计大作业 1.问题重述 2.编程思想 2.1数据结构 2.2功能确定 3.类的设计 3.1UML图标准 3.2本题类图 4.运行结果 1.输出所有信息 2.查询总人数 3.添加数据 ...

     

    面向对象程序设计大作业

     

    目录

     

    面向对象程序设计大作业

    1.问题重述

    2.编程思想

    2.1数据结构

    2.2功能确定

    3.类的设计

    3.1UML图标准

    3.2本题类图

    4.运行结果

    1.输出所有信息

    2.查询总人数

    3.添加数据

    4.更新数据

    5.查询数据

    6.删除数据

    7.重组数据

    5.问题及解决

    6.源代码


     

     

     

     

    1.问题重述

    销售公司员工管理

    设计一个虚基类Staff(员工),包含编号、姓名和年龄保护数据成员以及相关的成员函数;由Staff派生出销售员类Salesman,包含销售额保护数据成员以及相关的成员函数;再由Staff派生出经理类Manager;然后由Salesman和Manager类派生出销售经理类SalesManager。

    设计一个利用文件处理方式实现对公司人员(包括销售员、经理和销售经理)进行管理,具有增加数据、更新数据、查询数据、删除数据以及重组文件的功能。(删除数据在记录中做删除标志,重组文件指在物理上删除有删除标志的记录。)另外要求分别统计这三类员工的人数以及所有员工的总数。

     

    2.编程思想

    2.1数据结构

    一开始我想采用对象数组来实现,但是其中的问题在于插入删除的时候效率不高,需要对数据进行大量的移动修改。于是我采用了链表的数据结构,即所有的员工对象构成一个链表,通过头指针和尾指针进行相关操作,对于进行大量插入删除重组操作而言效率较高,且代码易于维护。

     

    2.2功能确定

    对于题中所述的四个类(员工类、销售员类、经理类、销售经理类)以及相应成员(编号、姓名、年龄、销售额),都进行了实现,并进行了成员扩充:经理类添加成员变量dept即部门,基类员工类添加了成员变量status表示在职状态,若在职状态为离职则在重组文件时删除对应记录。每个类添加了set函数以实现初始化、show函数实现输出、get函数输出成员变量的值、ReadFormFile从文件读入一条数据。

    上述四个类(员工类、销售员类、经理类、销售经理类)实现了对单条记录的操作,我为了实现文件管理,定义了对相应四个对象链表进行文件操作的类(Staff_file,Salesman_file,Manager_file,SalesManager_file),具体实现了7个功能:

     

       1.输出所有信息

      2.查询总人数

    3.添加数据

    4.更新数据

    5.查询数据

    6.删除数据

    7.重组数据

    来实现对文件的管理。

     

    3.类的设计

    3.1UML图标准

    UML图也即类图,UML(Unified Model Language) 即统一建模语言,画类图是有一定标准的,具体如下:

    虚线箭头指向依赖;

    实线箭头指向关联;

    虚线三角指向接口;

    实线三角指向基类;

    空心菱形能分离而独立存在,是聚合;

    实心菱形精密关联不可分,是组合;

    由于UML图能够清晰的表达出类的设计,画类图时应按上述标准作图。

    3.2本题类图

     

    我一共设计了八个类,其UML图如下:

    (由于作图工具画不出实线三角,只能使用实心箭头代替)下面两张类图画下面两个箭头的时候画反了。。。

     

     

     

     

    图1:员工类、销售员类、经理类、销售经理类的类图

     

    其中图成员变量num为编号,name为名字,age为年龄,status为在职状态,get方法为获得相应成员变量值的函数,show方法输出该条数据信息(一个对象代表文件中一条数据),remove方法即添加删除标记,将status置为离职,ReadFromFile方法从文件流中读入一条数据初始化当前对象。

     

     

    实现文件操作类的类图如下:

     

    图2:文件操作类的类图

     

    其中Head为指向对象链表的头指针,End是链表尾指针,in为文件输入流对象,out为文件输出流对象,构造函数从文件读入数据初始化对象链表,析构函数删除链表和头尾指针,findItem方法以员工编号查找相应对象,返回对象指针,save方法用out文件输出流对象将变动更新至相应文件,add方法实现添加信息功能,find方法实现查询功能,alter方法实现修改功能 ,del方法实现删除功能,rebuild方法实现文件重组功能,findsum方法实现查询人员总数功能,display方法实现输出所有信息功能。

     

    4.运行结果

    文本文件位于工作环境中

     

     

    以销售员为例

    查询之前销售员文件内容

     

     

     

     

    分别执行七个功能

    1.输出所有信息

     

    2.查询总人数

    3.添加数据

     

    文件内容为

     

    成功向文件添加信息

    4.更新数据

     

    文件内容为

     

    更新文件内容成功

     

     

     

    5.查询数据

     

    6.删除数据

     

    文件中的内容为

     

    7.重组数据

     

    文件内容为

     

     

    5.问题及解决

    程序第一次编译时报了不少语法错误,经过细心的修改之后算是可以正常运行了(语法错误就不细讲了,查看ppt以及网上查找资料就可以解决),但是在测试功能7即重组数据的时候出现了问题,无法重组文件。

    修改前相关代码如下:

     

    void rebuild() //5.重组文件,该含标记的销售员从文件中删除

    {

    char num[20];

    Salesman *p=NULL,*temp=NULL;

    cout<<"正在重组文件..."<<endl;

    for(p=Head->Next;p!=End;p=p->Next,q=q->Next)

    {

    //cout<<"正在重组文件"<<endl;

    //cout<<strcmp(p->get_status(),"离职")<<endl;

    if(strcmp(p->get_status(),"离职")==0)

    {

    temp=p->Next;

    p->Next=p->Next->Next;

    delete temp;

    }

    }

     

    save();

    cout<<"重组完毕!"<<endl;

    }

     

    经过调试后,我发现问题在于代码段

     

    if(strcmp(p->get_status(),"离职")==0)

    {

    temp=p->Next;

    p->Next=p->Next->Next;

    delete temp;

    }

     

    如果p指向的是最后一条数据,则p->Next->Next语句发生了越界,但是编译运行的时候并没有保错,于是解决方法为重组文件时对每条信息分类讨论,如果是最后一条数据,则采用其前一个指针q即可。

    修改后代码如下

     

    void rebuild() //5.重组文件,该含标记的销售员从文件中删除

    {

    char num[20];

    Salesman *p=NULL,*temp=NULL;

    Salesman *q=Head; //q是p的front 

    cout<<"正在重组文件..."<<endl;

    for(p=Head->Next;p!=End;p=p->Next,q=q->Next)

    {

    //cout<<"正在重组文件"<<endl;

    //cout<<strcmp(p->get_status(),"离职")<<endl;

    if(strcmp(p->get_status(),"离职")==0)

    {

    if(p->Next!=End) //若待删除的是最后一项数据,则使用q指针 

    {

    temp=p->Next;

    p->Next=p->Next->Next;

    delete temp;

    }

    else{

    temp=q->Next;

    q->Next=q->Next->Next;

    delete temp;

    }

    }

    }

     

    save();

    cout<<"重组完毕!"<<endl;

    }

    此时可以正常运行

     

    6.源代码

    
    #include<iostream>
    
    #include<fstream>
    
    #include<string.h>
    
    
    
    using namespace std;
    
    
    
    class Staff
    
    {
    
    protected:
    
    	char num[20];
    
    	char name[20];
    
    	int age;
    
    	char status[10]; //在职信息,若删除该信息,员工状态置为离职,重组文件时删除
    
    	//取值为:“在职”或“离职”
    
    
    
    public:
    
    	Staff *Next; //所有的员工构成一个链表
    
    	void set_Staff() //设置员工信息
    
    	{
    
    		cout << "请输入员工编号:" << endl;
    
    		cin >> num;
    
    		cout << "请输入员工名字:" << endl;
    
    		cin >> name;
    
    		cout << "请输入员工年龄:" << endl;
    
    		cin >> age;
    
    		cout << "请输入员工的在职状态:" << endl;
    
    		cin >> status;
    
    	}
    
    
    
    	void ReadFormFile(istream &in)
    
    	{
    
    		in >> num >> name >> age >> status; //从文件读入一个员工的信息
    
    
    
    	}
    
    
    
    	void show()
    
    	{
    
    		cout << "该员工的编号为:" << num << endl;
    
    		cout << "该员工的名字为:" << name << endl;
    
    		cout << "该员工的年龄为:" << age << endl;
    
    		cout << "该员工的在职状态为:" << status << endl;
    
    		//输出员工信息
    
    
    
    	}
    
    
    
    	void remove() //删除员工,添加标记
    
    	{
    
    		strcpy(status, "离职");
    
    
    
    	}
    
    
    
    	char *get_num()
    
    	{
    
    		return num;
    
    	}
    
    
    
    	char *get_name()
    
    	{
    
    
    
    		return name;
    
    	}
    
    
    
    	int get_age()
    
    	{
    
    		return age;
    
    	}
    
    
    
    	char *get_status()
    
    	{
    
    
    
    		return status;
    
    	}
    
    };
    
    
    
    
    
    class Salesman :virtual public Staff
    
    {
    
    protected:
    
    	int sales;
    
    
    
    public:
    
    	Salesman *Next;
    
    	void set_Salesman()
    
    	{
    
    		cout << "请输入销售员编号:" << endl;
    
    		cin >> num;
    
    		cout << "请输入销售员名字:" << endl;
    
    		cin >> name;
    
    		cout << "请输入销售员年龄:" << endl;
    
    		cin >> age;
    
    		cout << "请输入销售员的在职状态:" << endl;
    
    		cin >> status;
    
    		cout << "请输入销售员销售额:" << endl;
    
    		cin >> sales;
    
    	}
    
    
    
    	void ReadFormFile(istream &in)
    
    	{
    
    		in >> num >> name >> age >> status >> sales; //从文件读入一个员工的信息
    
    
    
    	}
    
    
    
    	void show()
    
    	{
    
    		cout << "该销售员的编号为:" << num << endl;
    
    		cout << "该销售员的名字为:" << name << endl;
    
    		cout << "该销售员的年龄为:" << age << endl;
    
    		cout << "该销售员的在职状态为:" << status << endl;
    
    		cout << "该销售员的销售额为:" << sales << endl;
    
    		//输出员工信息
    
    
    
    	}
    
    
    
    	int get_sales()
    
    	{
    
    
    
    		return sales;
    
    	}
    
    
    
    
    
    
    
    };
    
    
    
    class Manager :virtual public Staff
    
    {
    
    protected:
    
    	char dept[10];   //经理所属部门
    
    
    
    public:
    
    	Manager *Next;
    
    	void set_Manager()
    
    	{
    
    		cout << "请输入经理编号:" << endl;
    
    		cin >> num;
    
    		cout << "请输入经理名字:" << endl;
    
    		cin >> name;
    
    		cout << "请输入经理年龄:" << endl;
    
    		cin >> age;
    
    		cout << "请输入经理的在职状态:" << endl;
    
    		cin >> status;
    
    		cout << "请输入经理所在部门:" << endl;
    
    		cin >> dept;
    
    
    
    	}
    
    
    
    	void ReadFormFile(istream &in)
    
    	{
    
    		in >> num >> name >> age >> status >> dept; //从文件读入一个员工的信息
    
    
    
    	}
    
    
    
    	void show()
    
    	{
    
    		cout << "该经理的编号为:" << num << endl;
    
    		cout << "该经理的名字为:" << name << endl;
    
    		cout << "该经理的年龄为:" << age << endl;
    
    		cout << "该经理的在职状态为:" << status << endl;
    
    		cout << "该经理所在部门为:" << dept << endl;
    
    
    
    
    
    	}
    
    
    
    	char *get_dept()
    
    	{
    
    		return dept;
    
    	}
    
    
    
    
    
    };
    
    
    
    class SalesManager :public Salesman, public Manager
    
    {
    
    public:
    
    	SalesManager *Next;
    
    	void set_SalesManager()
    
    	{
    
    		cout << "请输入销售经理编号:" << endl;
    
    		cin >> num;
    
    		cout << "请输入销售经理名字:" << endl;
    
    		cin >> name;
    
    		cout << "请输入销售经理年龄:" << endl;
    
    		cin >> age;
    
    		cout << "请输入销售经理的在职状态:" << endl;
    
    		cin >> status;
    
    		cout << "请输入销售经理的销售额:" << endl;
    
    		cin >> sales;
    
    		cout << "请输入销售经理所在部门:" << endl;
    
    		cin >> dept;
    
    	}
    
    
    
    	void ReadFormFile(istream &in)
    
    	{
    
    		in >> num >> name >> age >> status >> sales >> dept; //从文件读入一个员工的信息
    
    
    
    	}
    
    
    
    
    
    	void show()
    
    	{
    
    		cout << "该销售经理的编号为:" << num << endl;
    
    		cout << "该销售经理的名字为:" << name << endl;
    
    		cout << "该销售经理的年龄为:" << age << endl;
    
    		cout << "该销售经理的在职状态为:" << status << endl;
    
    		cout << "该销售经理的销售额为:" << sales << endl;
    
    		cout << "该销售经理所在部门为:" << dept << endl;
    
    
    
    
    
    	}
    
    
    
    
    
    };
    
    
    
    class Staff_file
    
    {
    
    protected:
    
    	Staff *Head, *End;
    
    	ifstream in;
    
    	ofstream out;
    
    
    
    	Staff *findItem(char *num)
    
    	{
    
    		for (Staff *p = Head; p->Next != End; p = p->Next)
    
    		{
    
    			if (strcmp(p->Next->get_num(), num) == 0)
    
    				return p;
    
    
    
    		}
    
    
    
    		return NULL;
    
    	}
    
    
    
    
    
    
    
    public:
    
    	Staff_file()
    
    	{
    
    		Head = new Staff; //链表头指针,不存储数据
    
    		Head->Next = new Staff;
    
    		End = Head->Next; //链表尾指针
    
    		in.open("Staff.txt");
    
    
    
    		while (in.eof() != true) //从文件读入到员工对象链表中
    
    		{
    
    			End->ReadFormFile(in);
    
    			if (End->get_num()[0] == '\0')
    
    				break;
    
    			End->Next = new Staff;
    
    			End = End->Next;
    
    		}
    
    		in.close();
    
    	}
    
    
    
    	~Staff_file()
    
    	{
    
    		for (Staff *temp; Head->Next != End;)
    
    		{
    
    			temp = Head->Next;
    
    			Head->Next = Head->Next->Next;
    
    			delete temp;
    
    		}
    
    		delete Head, End;
    
    	}
    
    
    
    	void save() //将对象链表存入文件
    
    	{
    
    		out.open("Staff.txt"); //默认输出方式,若文件存在则删除文件
    
    		for (Staff *p = Head->Next; p != End; p = p->Next)
    
    		{
    
    			out << p->get_num() << " " << p->get_name() << " " << p->get_age()
    
    				<< " " << p->get_status() << endl;
    
    		}
    
    		out.close();
    
    	}
    
    
    
    	void add() //1.增加员工信息
    
    	{
    
    		End->set_Staff();
    
    		End->Next = new Staff;
    
    		End = End->Next;
    
    		save();
    
    	}
    
    
    
    	void find() //2.查询员工信息功能
    
    	{
    
    		char num[20];
    
    		Staff *p = NULL;
    
    		cout << "请输入需要查询的员工编号" << endl;
    
    		cin >> num;
    
    		if ((p = findItem(num)) != NULL) //查找该员工的前驱
    
    			p->Next->show(); //输出员工信息
    
    		else
    
    		{
    
    			cout << "Not Found!" << endl;
    
    		}
    
    		save();
    
    	}
    
    
    
    
    
    
    
    	void alter() //3.修改员工信息功能
    
    	{
    
    		char num[20];
    
    		Staff *p = NULL;
    
    		cout << "请输入要修改的员工编号" << endl;
    
    		cin >> num;
    
    		if ((p = findItem(num)) != NULL) //查找该员工的前驱
    
    		{
    
    			p->Next->show(); //输出员工信息
    
    			cout << "请输入新的信息" << endl;
    
    			p->Next->set_Staff();
    
    
    
    		}
    
    
    
    		else
    
    		{
    
    			cout << "Not Found!" << endl;
    
    		}
    
    		save();
    
    	}
    
    
    
    	void del() //4.删除员工,即添加标记
    
    	{
    
    		char num[20];
    
    		Staff *p = NULL;
    
    		cout << "请输入要删除的员工编号" << endl;
    
    		cin >> num;
    
    		if ((p = findItem(num)) != NULL) //查找该员工的前驱
    
    		{
    
    
    
    			cout << "已删除该员工,将其在职信息改为“离职”,若要删除该员工信息,请重组文件" << endl;
    
    			p->Next->remove();
    
    
    
    		}
    
    
    
    		else
    
    		{
    
    			cout << "Not Found!" << endl;
    
    		}
    
    		save();
    
    	}
    
    
    
    	void rebuild() //5.重组文件,该含标记的员工从文件中删除
    
    	{
    
    		char num[20];
    
    		Staff *p = NULL, *temp = NULL;
    
    		Staff *q = Head; //q是p的front
    
    		cout << "正在重组文件..." << endl;
    
    		for (p = Head->Next; p != End; p = p->Next, q = q->Next)
    
    		{
    
    			//cout<<"正在重组文件"<<endl;
    
    			//cout<<strcmp(p->get_status(),"离职")<<endl;
    
    			if (strcmp(p->get_status(), "离职") == 0)
    
    			{
    
    				if (p->Next != End) //若待删除的是最后一项数据,则使用q指针
    
    				{
    
    					temp = p->Next;
    
    					p->Next = p->Next->Next;
    
    					delete temp;
    
    				}
    
    				else {
    
    					temp = q->Next;
    
    					q->Next = q->Next->Next;
    
    					delete temp;
    
    				}
    
    			}
    
    		}
    
    
    
    		save();
    
    		cout << "重组完毕!" << endl;
    
    
    
    	}
    
    
    
    	int findsum() //6.查询总人数
    
    	{
    
    		int n = -1;
    
    		Staff *p = Head->Next;
    
    		while (p != NULL)
    
    		{
    
    			n++;
    
    			p = p->Next;
    
    		}
    
    		cout << "员工总数为:" << n - 1 << endl;
    
    		return n - 1;
    
    
    
    	}
    
    
    
    	void display() //7.输出所有员工信息
    
    	{
    
    		int n = findsum();
    
    		int i = 1;
    
    		Staff *p = Head->Next;
    
    
    
    		cout << "总共有" << n << "名员工,其信息如下:" << endl;
    
    		for (; p != End; p = p->Next)
    
    		{
    
    			cout << "第" << i << "名员工的信息为:" << endl;
    
    			p->show();
    
    			cout << endl;
    
    			i++;
    
    		}
    
    
    
    
    
    	}
    
    };
    
    
    
    
    
    class Salesman_file :virtual public Staff_file
    
    {
    
    protected:
    
    	Salesman *Head, *End;
    
    	//ifstream in;
    
    	//ofstream out;
    
    
    
    	Salesman *findItem(char *num)
    
    	{
    
    		for (Salesman *p = Head; p->Next != End; p = p->Next)
    
    		{
    
    			if (strcmp(p->Next->get_num(), num) == 0)
    
    				return p;
    
    
    
    		}
    
    
    
    		return NULL;
    
    	}
    
    
    
    
    
    
    
    public:
    
    	Salesman_file()
    
    	{
    
    		Head = new Salesman; //链表头指针,不存储数据
    
    		Head->Next = new Salesman;
    
    		End = Head->Next; //链表尾指针
    
    		in.open("Salesman.txt");
    
    
    
    		while (in.eof() != true) //从文件读入到销售员对象链表中
    
    		{
    
    			End->ReadFormFile(in);
    
    			if (End->get_num()[0] == '\0')
    
    				break;
    
    			End->Next = new Salesman;
    
    			End = End->Next;
    
    		}
    
    		in.close();
    
    	}
    
    
    
    	~Salesman_file()
    
    	{
    
    		for (Salesman *temp; Head->Next != End;)
    
    		{
    
    			temp = Head->Next;
    
    			Head->Next = Head->Next->Next;
    
    			delete temp;
    
    		}
    
    		delete Head, End;
    
    	}
    
    
    
    	void save() //将对象链表存入文件
    
    	{
    
    
    
    		out.open("Salesman.txt"); //默认输出方式,若文件存在则删除文件
    
    		for (Salesman *p = Head->Next; p != End; p = p->Next)
    
    		{
    
    			out << p->get_num() << " " << p->get_name() << " " << p->get_age()
    
    				<< " " << p->get_status() << " " << p->get_sales() << endl;
    
    		}
    
    		out.close();
    
    	}
    
    
    
    	void add() //1.增加销售员信息
    
    	{
    
    		End->set_Salesman();
    
    		End->Next = new Salesman;
    
    		End = End->Next;
    
    		save();
    
    	}
    
    
    
    	void find() //2.查询销售员信息功能
    
    	{
    
    		char num[20];
    
    		Salesman *p = NULL;
    
    		cout << "请输入需要查询的销售员编号" << endl;
    
    		cin >> num;
    
    		if ((p = findItem(num)) != NULL) //查找该销售员的前驱
    
    			p->Next->show(); //输出销售员信息
    
    		else
    
    		{
    
    			cout << "Not Found!" << endl;
    
    		}
    
    		save();
    
    	}
    
    
    
    
    
    
    
    	void alter() //3.修改销售员信息功能
    
    	{
    
    		char num[20];
    
    		Salesman *p = NULL;
    
    		cout << "请输入要修改的销售员编号" << endl;
    
    		cin >> num;
    
    		if ((p = findItem(num)) != NULL) //查找该销售员的前驱
    
    		{
    
    			p->Next->show(); //输出销售员信息
    
    			cout << "请输入新的信息" << endl;
    
    			p->Next->set_Salesman();
    
    
    
    		}
    
    
    
    		else
    
    		{
    
    			cout << "Not Found!" << endl;
    
    		}
    
    		save();
    
    	}
    
    
    
    	void del() //4.删除销售员,即添加标记
    
    	{
    
    		char num[20];
    
    		Salesman *p = NULL;
    
    		cout << "请输入要删除的销售员编号" << endl;
    
    		cin >> num;
    
    		if ((p = findItem(num)) != NULL) //查找该销售员的前驱
    
    		{
    
    
    
    			cout << "已删除该销售员,将其在职信息改为“离职”,若要删除该销售员信息,请重组文件" << endl;
    
    			p->Next->remove();
    
    
    
    		}
    
    
    
    		else
    
    		{
    
    			cout << "Not Found!" << endl;
    
    		}
    
    		save();
    
    	}
    
    
    
    	void rebuild() //5.重组文件,该含标记的销售员从文件中删除
    
    	{
    
    		char num[20];
    
    		Salesman *p = NULL, *temp = NULL;
    
    		Salesman *q = Head; //q是p的front
    
    		cout << "正在重组文件..." << endl;
    
    		for (p = Head->Next; p != End; p = p->Next, q = q->Next)
    
    		{
    
    			//cout<<"正在重组文件"<<endl;
    
    			//cout<<strcmp(p->get_status(),"离职")<<endl;
    
    			if (strcmp(p->get_status(), "离职") == 0)
    
    			{
    
    				if (p->Next != End) //若待删除的是最后一项数据,则使用q指针
    
    				{
    
    					temp = p->Next;
    
    					p->Next = p->Next->Next;
    
    					delete temp;
    
    				}
    
    				else {
    
    					temp = q->Next;
    
    					q->Next = q->Next->Next;
    
    					delete temp;
    
    				}
    
    			}
    
    		}
    
    
    
    		save();
    
    		cout << "重组完毕!" << endl;
    
    	}
    
    
    
    	int findsum() //6.查询总人数
    
    	{
    
    		int n = 0;
    
    		Salesman *p = Head->Next;
    
    		//cout<<"进入findsum"<<endl;
    
    		while (p != End)
    
    		{
    
    			n++;
    
    			p = p->Next;
    
    		}
    
    		//cout<<"进入findsum1"<<endl;
    
    
    
    		cout << "销售员总数为:" << n << endl;
    
    		return n;
    
    
    
    	}
    
    
    
    	void display() //7.输出所有销售员信息
    
    	{
    
    		//cout<<"进入display"<<endl;
    
    
    
    		int n = findsum();
    
    		//cout<<"进入display1"<<endl;
    
    
    
    		int i = 1;
    
    		Salesman *p = Head->Next;
    
    
    
    
    
    
    
    		cout << "总共有" << n << "名销售员,其信息如下:" << endl;
    
    		for (; p != End; p = p->Next)
    
    		{
    
    			cout << "第" << i << "名销售员的信息为:" << endl;
    
    			p->show();
    
    			cout << endl;
    
    			i++;
    
    		}
    
    
    
    
    
    	}
    
    };
    
    
    
    
    
    class Manager_file :virtual public Staff_file
    
    {
    
    protected:
    
    	Manager *Head, *End;
    
    	//ifstream in;
    
    	//ofstream out;
    
    
    
    	Manager *findItem(char *num)
    
    	{
    
    		for (Manager *p = Head; p->Next != End; p = p->Next)
    
    		{
    
    			if (strcmp(p->Next->get_num(), num) == 0)
    
    				return p;
    
    
    
    		}
    
    
    
    		return NULL;
    
    	}
    
    
    
    
    
    
    
    public:
    
    	Manager_file()
    
    	{
    
    		Head = new Manager; //链表头指针,不存储数据
    
    		Head->Next = new Manager;
    
    		End = Head->Next; //链表尾指针
    
    		in.open("Manager.txt");
    
    
    
    		while (in.eof() != true) //从文件读入到经理对象链表中
    
    		{
    
    			End->ReadFormFile(in);
    
    			if (End->get_num()[0] == '\0')
    
    				break;
    
    			End->Next = new Manager;
    
    			End = End->Next;
    
    		}
    
    		in.close();
    
    	}
    
    
    
    	~Manager_file()
    
    	{
    
    		for (Manager *temp; Head->Next != End;)
    
    		{
    
    			temp = Head->Next;
    
    			Head->Next = Head->Next->Next;
    
    			delete temp;
    
    		}
    
    		delete Head, End;
    
    	}
    
    
    
    	void save() //将对象链表存入文件
    
    	{
    
    		out.open("Manager.txt"); //默认输出方式,若文件存在则删除文件
    
    		for (Manager *p = Head->Next; p != End; p = p->Next)
    
    		{
    
    			out << p->get_num() << " " << p->get_name() << " " << p->get_age()
    
    				<< " " << p->get_status() << " " << p->get_dept() << endl;
    
    		}
    
    		out.close();
    
    	}
    
    
    
    	void add() //1.增加经理信息
    
    	{
    
    		End->set_Manager();
    
    		End->Next = new Manager;
    
    		End = End->Next;
    
    		save();
    
    	}
    
    
    
    	void find() //2.查询经理信息功能
    
    	{
    
    		char num[20];
    
    		Manager *p = NULL;
    
    		cout << "请输入需要查询的经理编号" << endl;
    
    		cin >> num;
    
    		if ((p = findItem(num)) != NULL) //查找该经理的前驱
    
    			p->Next->show(); //输出经理信息
    
    		else
    
    		{
    
    			cout << "Not Found!" << endl;
    
    		}
    
    		save();
    
    	}
    
    
    
    
    
    
    
    	void alter() //3.修改经理信息功能
    
    	{
    
    		char num[20];
    
    		Manager *p = NULL;
    
    		cout << "请输入要修改的经理编号" << endl;
    
    		cin >> num;
    
    		if ((p = findItem(num)) != NULL) //查找该经理的前驱
    
    		{
    
    			p->Next->show(); //输出经理信息
    
    			cout << "请输入新的信息" << endl;
    
    			p->Next->set_Manager();
    
    
    
    		}
    
    
    
    		else
    
    		{
    
    			cout << "Not Found!" << endl;
    
    		}
    
    		save();
    
    	}
    
    
    
    	void dele() //4.删除经理,即添加标记
    
    	{
    
    		char num[20];
    
    		Manager *p = NULL;
    
    		cout << "请输入要删除的经理编号" << endl;
    
    		cin >> num;
    
    		if ((p = findItem(num)) != NULL) //查找该经理的前驱
    
    		{
    
    
    
    			cout << "已删除该经理,将其在职信息改为“离职”,若要删除该经理信息,请重组文件" << endl;
    
    			p->Next->remove();
    
    
    
    		}
    
    
    
    		else
    
    		{
    
    			cout << "Not Found!" << endl;
    
    		}
    
    		save();
    
    	}
    
    
    
    	void rebuild() //5.重组文件,该含标记的经理从文件中删除
    
    	{
    
    		char num[20];
    
    		Manager *p = NULL, *temp = NULL;
    
    		Manager *q = Head; //q是p的front
    
    		cout << "正在重组文件..." << endl;
    
    		for (p = Head->Next; p != End; p = p->Next, q = q->Next)
    
    		{
    
    			//cout<<"正在重组文件"<<endl;
    
    			//cout<<strcmp(p->get_status(),"离职")<<endl;
    
    			if (strcmp(p->get_status(), "离职") == 0)
    
    			{
    
    				if (p->Next != End) //若待删除的是最后一项数据,则使用q指针
    
    				{
    
    					temp = p->Next;
    
    					p->Next = p->Next->Next;
    
    					delete temp;
    
    				}
    
    				else {
    
    					temp = q->Next;
    
    					q->Next = q->Next->Next;
    
    					delete temp;
    
    				}
    
    			}
    
    		}
    
    
    
    		save();
    
    		cout << "重组完毕!" << endl;
    
    
    
    	}
    
    
    
    	int findsum() //6.查询总人数
    
    	{
    
    		int n = -1;
    
    		Manager *p = Head->Next;
    
    		while (p != NULL)
    
    		{
    
    			n++;
    
    			p = p->Next;
    
    		}
    
    		cout << "经理总数为:" << n << endl;
    
    		return n;
    
    
    
    	}
    
    
    
    	void display() //7.输出所有经理信息
    
    	{
    
    		int n = findsum();
    
    		int i = 1;
    
    		Manager *p = Head->Next;
    
    
    
    		cout << "总共有" << n << "名经理,其信息如下:" << endl;
    
    		for (; p != End; p = p->Next)
    
    		{
    
    			cout << "第" << i << "名经理的信息为:" << endl;
    
    			p->show();
    
    			cout << endl;
    
    		}
    
    
    
    
    
    	}
    
    };
    
    
    
    class SalesManager_file :public Salesman_file, public Manager_file
    
    {
    
    protected:
    
    	SalesManager *Head, *End;
    
    	//ifstream in;
    
    	//ofstream out;
    
    
    
    	SalesManager *findItem(char *num)
    
    	{
    
    		for (SalesManager *p = Head; p->Next != End; p = p->Next)
    
    		{
    
    			if (strcmp(p->Next->get_num(), num) == 0)
    
    				return p;
    
    
    
    		}
    
    
    
    		return NULL;
    
    	}
    
    
    
    
    
    
    
    public:
    
    	SalesManager_file()
    
    	{
    
    		Head = new SalesManager; //链表头指针,不存储数据
    
    		Head->Next = new SalesManager;
    
    		End = Head->Next; //链表尾指针
    
    		in.open("SalesManager.txt");
    
    
    
    		while (in.eof() != true) //从文件读入到销售经理对象链表中
    
    		{
    
    			End->ReadFormFile(in);
    
    			if (End->get_num()[0] == '\0')
    
    				break;
    
    			End->Next = new SalesManager;
    
    			End = End->Next;
    
    		}
    
    		in.close();
    
    	}
    
    
    
    	~SalesManager_file()
    
    	{
    
    		for (SalesManager *temp; Head->Next != End;)
    
    		{
    
    			temp = Head->Next;
    
    			Head->Next = Head->Next->Next;
    
    			delete temp;
    
    		}
    
    		delete Head, End;
    
    	}
    
    
    
    	void save() //将对象链表存入文件
    
    	{
    
    		out.open("SalesManager.txt"); //默认输出方式,若文件存在则删除文件
    
    		for (SalesManager *p = Head->Next; p != End; p = p->Next)
    
    		{
    
    			out << p->get_num() << " " << p->get_name() << " " << p->get_age()
    
    				<< " " << p->get_status() << " " << p->get_sales() << " " << p->get_dept() << endl;
    
    		}
    
    		out.close();
    
    	}
    
    
    
    	void add() //1.增加销售经理信息
    
    	{
    
    		End->set_SalesManager();
    
    		End->Next = new SalesManager;
    
    		End = End->Next;
    
    		save();
    
    	}
    
    
    
    	void find() //2.查询销售经理信息功能
    
    	{
    
    		char num[20];
    
    		SalesManager *p = NULL;
    
    		cout << "请输入需要查询的销售经理编号" << endl;
    
    		cin >> num;
    
    		if ((p = findItem(num)) != NULL) //查找该销售经理的前驱
    
    			p->Next->show(); //输出销售经理信息
    
    		else
    
    		{
    
    			cout << "Not Found!" << endl;
    
    		}
    
    		save();
    
    	}
    
    
    
    
    
    
    
    	void alter() //3.修改销售经理信息功能
    
    	{
    
    		char num[20];
    
    		SalesManager *p = NULL;
    
    		cout << "请输入要修改的销售经理编号" << endl;
    
    		cin >> num;
    
    		if ((p = findItem(num)) != NULL) //查找该销售经理的前驱
    
    		{
    
    			p->Next->show(); //输出销售经理信息
    
    			cout << "请输入新的信息" << endl;
    
    			p->Next->set_SalesManager();
    
    
    
    		}
    
    
    
    		else
    
    		{
    
    			cout << "Not Found!" << endl;
    
    		}
    
    		save();
    
    	}
    
    
    
    	void del() //4.删除销售经理,即添加标记
    
    	{
    
    		char num[20];
    
    		SalesManager *p = NULL;
    
    		cout << "请输入要删除的销售经理编号" << endl;
    
    		cin >> num;
    
    		if ((p = findItem(num)) != NULL) //查找该销售经理的前驱
    
    		{
    
    
    
    			cout << "已删除该销售经理,将其在职信息改为“离职”,若要删除该销售经理信息,请重组文件" << endl;
    
    			p->Next->remove();
    
    
    
    		}
    
    
    
    		else
    
    		{
    
    			cout << "Not Found!" << endl;
    
    		}
    
    		save();
    
    	}
    
    
    
    	void rebuild() //5.重组文件,该含标记的销售经理从文件中删除
    
    	{
    
    		char num[20];
    
    		SalesManager *p = NULL, *temp = NULL;
    
    		SalesManager *q = Head; //q是p的front
    
    		cout << "正在重组文件..." << endl;
    
    		for (p = Head->Next; p != End; p = p->Next, q = q->Next)
    
    		{
    
    			//cout<<"正在重组文件"<<endl;
    
    			//cout<<strcmp(p->get_status(),"离职")<<endl;
    
    			if (strcmp(p->get_status(), "离职") == 0)
    
    			{
    
    				if (p->Next != End) //若待删除的是最后一项数据,则使用q指针
    
    				{
    
    					temp = p->Next;
    
    					p->Next = p->Next->Next;
    
    					delete temp;
    
    				}
    
    				else {
    
    					temp = q->Next;
    
    					q->Next = q->Next->Next;
    
    					delete temp;
    
    				}
    
    			}
    
    		}
    
    
    
    		save();
    
    		cout << "重组完毕!" << endl;
    
    
    
    	}
    
    
    
    	int findsum() //6.查询总人数
    
    	{
    
    		int n = -1;
    
    		SalesManager *p = Head->Next;
    
    		while (p != NULL)
    
    		{
    
    			n++;
    
    			p = p->Next;
    
    		}
    
    		cout << "销售经理总数为:" << n << endl;
    
    		return n;
    
    
    
    	}
    
    
    
    	void display() //7.输出所有销售经理信息
    
    	{
    
    		int n = findsum();
    
    		int i = 1;
    
    		SalesManager *p = Head->Next;
    
    
    
    		cout << "总共有" << n << "名销售经理,其信息如下:" << endl;
    
    		for (; p != End; p = p->Next)
    
    		{
    
    			cout << "第" << i << "名销售经理的信息为:" << endl;
    
    			p->show();
    
    			cout << endl;
    
    		}
    
    
    
    
    
    	}
    
    };
    
    
    
    int main() {
    
    
    
    	int m, n;
    
    	Staff_file staff;
    
    	Salesman_file salesman;
    
    	Manager_file manager;
    
    	SalesManager_file salesmanager;
    
    	int quit = 0;
    
    	while (quit == 0)
    
    	{
    
    		cout << "请输入你所需要的功能:" << endl;
    
    		cout << "1.输出所有信息" << endl
    
    			<< "2.查询总人数" << endl
    
    			<< "3.添加数据" << endl
    
    			<< "4.更新数据" << endl
    
    			<< "5.查询数据" << endl
    
    			<< "6.删除数据" << endl
    
    			<< "7.重组数据" << endl;
    
    		cin >> m;
    
    		cout << "请输入你的操作对象:" << endl;
    
    		cout << "1.员工" << endl
    
    			<< "2.销售员" << endl
    
    			<< "3.经理" << endl
    
    			<< "4.销售经理" << endl;
    
    		cin >> n;
    
    		switch (m)
    
    		{
    
    		case 1:
    
    		{
    
    			switch (n)
    
    			{
    
    			case 1: {
    
    				staff.display();
    
    				break;
    
    			}
    
    			case 2: {
    
    				salesman.display();
    
    				break;
    
    			}
    
    			case 3: {
    
    				manager.display();
    
    
    
    				break;
    
    			}
    
    			case 4: {
    
    				salesmanager.display();
    
    				break;
    
    			}
    
    			default: {
    
    				cout << "输入有误,请重新输入!" << endl;
    
    				break;
    
    			}
    
    			}
    
    
    
    			break;
    
    		}
    
    
    
    		case 2: {
    
    			switch (n)
    
    			{
    
    			case 1: {
    
    				staff.findsum();
    
    				break;
    
    			}
    
    			case 2: {
    
    				salesman.findsum();
    
    				break;
    
    			}
    
    			case 3: {
    
    				manager.findsum();
    
    
    
    				break;
    
    			}
    
    			case 4: {
    
    				salesmanager.findsum();
    
    				break;
    
    			}
    
    			default: {
    
    				cout << "输入有误,请重新输入!" << endl;
    
    				break;
    
    			}
    
    			}
    
    			break;
    
    		}
    
    
    
    		case 3: {
    
    			switch (n)
    
    			{
    
    			case 1: {
    
    				staff.add();
    
    				break;
    
    			}
    
    			case 2: {
    
    				salesman.add();
    
    				break;
    
    			}
    
    			case 3: {
    
    				manager.add();
    
    
    
    				break;
    
    			}
    
    			case 4: {
    
    				salesmanager.add();
    
    				break;
    
    			}
    
    			default: {
    
    				cout << "输入有误,请重新输入!" << endl;
    
    				break;
    
    			}
    
    			}
    
    			break;
    
    		}
    
    
    
    		case 4: {
    
    			switch (n)
    
    			{
    
    			case 1: {
    
    				staff.alter();
    
    				break;
    
    			}
    
    			case 2: {
    
    				salesman.alter();
    
    				break;
    
    			}
    
    			case 3: {
    
    				manager.alter();
    
    
    
    				break;
    
    			}
    
    			case 4: {
    
    				salesmanager.alter();
    
    				break;
    
    			}
    
    			default: {
    
    				cout << "输入有误,请重新输入!" << endl;
    
    				break;
    
    			}
    
    			}
    
    			break;
    
    		}
    
    
    
    		case 5: {
    
    			switch (n)
    
    			{
    
    			case 1: {
    
    				staff.find();
    
    				break;
    
    			}
    
    			case 2: {
    
    				salesman.find();
    
    				break;
    
    			}
    
    			case 3: {
    
    				manager.find();
    
    
    
    				break;
    
    			}
    
    			case 4: {
    
    				salesmanager.find();
    
    				break;
    
    			}
    
    			default: {
    
    				cout << "输入有误,请重新输入!" << endl;
    
    				break;
    
    			}
    
    			}
    
    			break;
    
    		}
    
    
    
    		case 6: {
    
    			switch (n)
    
    			{
    
    			case 1: {
    
    				staff.del();
    
    				break;
    
    			}
    
    			case 2: {
    
    				salesman.del();
    
    				break;
    
    			}
    
    			case 3: {
    
    				manager.del();
    
    
    
    				break;
    
    			}
    
    			case 4: {
    
    				salesmanager.del();
    
    				break;
    
    			}
    
    			default: {
    
    				cout << "输入有误,请重新输入!" << endl;
    
    				break;
    
    			}
    
    			}
    
    			break;
    
    		}
    
    
    
    		case 7: {
    
    			switch (n)
    
    			{
    
    			case 1: {
    
    				staff.rebuild();
    
    				break;
    
    			}
    
    			case 2: {
    
    				salesman.rebuild();
    
    				break;
    
    			}
    
    			case 3: {
    
    				manager.rebuild();
    
    
    
    				break;
    
    			}
    
    			case 4: {
    
    				salesmanager.rebuild();
    
    				break;
    
    			}
    
    			default: {
    
    				cout << "输入有误,请重新输入!" << endl;
    
    				break;
    
    			}
    
    			}
    
    			break;
    
    		}
    
    		default: {
    
    			cout << "输入有误,请重新输入!" << endl;
    
    			break;
    
    		}
    
    		}
    
    
    		cout << endl << "输入1退出,0继续查询" << endl;
    
    		cin >> quit;
    
    
    
    	}
    
    
    	return 0;
    
    }

     

    展开全文
  • 面向对象程序设计 C++大作业

    千次阅读 多人点赞 2018-09-16 19:04:34
    C++大作业 题目:C++通信录 专业:计算机科学与技术 班级:信息A1611 组号:第一小组 内容: (1)输入信息; (2)显示信息; (3)删除记录; (4)查询、修改记录; (5)界面优化等; ...

     

    面向对象程序设计

    C++大作业

     

    题目:C++通信录 

    专业:计算机科学与技术

    班级:信息A16xx

    组号:第一小组

     

    内容:

    (1)输入信息;    (2)显示信息;

    (3)删除记录;    (4)查询、修改记录;

    (5)界面优化等;

     

    五大主功能函数:

    /*显示全部。通过循环调用show()函数输出全部联系人*/

    void show_all();

    /*查询某人。输入名字,循环比较找出对应记录。若无则输出没有此人,若有则调用show()函数*/

    void search_name();

    /*增加记录。增加一条联系人记录,通过依次调用set_name(),set_sex(),set_phone(),set_email()等函数实现*/

    void add();

    /*修改记录。输入名字,循环比较找出对应记录。若无则输出没有此人,若有则调用四个set_xxxx()函数输入*/

    void modify();

    /*删除某人记录。输入名字,循环比较找出对应记录。若无则输出没有此人,若有循环覆盖删除此记录*/

    void del_one();

     

    二、主功能函数外的功能函数:

    /*打印出欢迎页面*/

    void welcome();

    /*打印出主菜单页面*/

    void first_menu();

    /*将用户选择转化为数字返回。调用first_menu()打印主菜单,通过用户的输入,返回数值作为调用功能的依据。若输入错误,再次循环*/

    int menu();

    /*根据用户选择的功能调用相应的功能函数。调用menu()函数,调用数字相对应的功能函数。不断循环,直至选择退出函数*/

    void work();

    /*函数的逻辑顺序操作与选择等*/

    void main();

     

    • 分工合作任务表:

    小组长 戴x超

    学号

    姓名

    主要任务

    占比

    等级

    1

    蒋x杰

    主功能函数3,增加函数void add();的编写

    8%

    B

    2

    万x

    主功能函数5,删除某人void del_one();的编写

    8%

    B

    3

    陈x

    与丰金诚共同参与主功能函数4,修改信息void modify();的编写

    9%

    A

    4

    施x婷

    主函数1,显示所有人 void show_all();的编写

    9%

    B

     

    5

     

    戴x超

    程序整理汇总,调试结果汇总,主函数与外部功能函数void welcome,thanks_for_use,menu();的编写等

     

    16%

     

    A

    6

    张x宇

    主功能函数2,搜查信息void search_name();的编写

    9%

    B

    7

    赵x梅

    程序功能说明的文档编写

    8%

    B

    8

    丰x诚

    与陈欣共同参与主功能函数4,修改信息void modify();的编写

    9%

    B

    9

    汪x东

    心得体会编写,调试结果汇总,主函数参与,帮助组员查找错误

    7%

    C

    10

    龚x

    界面设计,主功能函数main();编写

    10%

    A

    11

    肖x洋

    心得体会编写,主函数参与,帮助组员查找错误

    7%

    C

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

    • 功能展示:

    欢迎界面:

    主界面:

    增加联系人:(以2个为例)

     

     

    显示所有人:(也可以只显示某一个)

    修改某人信息:(按名字查找并修改,后显示)

     

    删除某人:(按名字删除并显示)

     

    五、源代码:

     

    #include<iostream>
    
    #include<cstring>
    
    #include<cstdlib>
    
    #include<conio.h>
    
    #include<cmath>
    
    using namespace std;
    
    int Num;          //联系人总数
    
    class Person{    //建立联系人的类
    
    //private成员如下
    
             private:   
    
                       char name[20];
    
                       char sex[10];
    
                       char phone[20];
    
                       char email[30];
    
             public:
    
                       char* get_name();
    
                       char* get_sex();
    
                       char* get_phone();
    
                       char* get_email();
    
                       void set_name();
    
                       void set_sex();
    
                       void set_phone();
    
                       void set_email();
    
                       void show();
    
                       ~Person(){};
    
    };
    
    Person people[300];   //定义对象数组
    
    //功能函数声明
    
    void show_all();
    
    void search_name();
    
    void add();
    
    void modify();
    
    void del_one();
    
    void welcome();
    
    void first_menu();
    
    int menu();
    
    //类内函数,返回name
    
    char* Person::get_name(){
    
             return name;
    
    }
    
    //类内函数,返回sex
    
    char* Person::get_sex(){
    
             return sex;
    
    }
    
    //类内函数,返回phone
    
    char* Person::get_phone(){
    
             return phone;
    
    }
    
    //类内函数,返回email
    
    char* Person::get_email(){
    
             return email;
    
    }
    
    //类内函数,设置name
    
    void Person::set_name(){
    
             memset(name,'\0',20);    //memset设置格式
    
             cin>>name;
    
    }
    
    //类内函数,设置sex
    
    void Person::set_sex(){
    
             memset(sex,'\0',10);
    
             cin>>sex;
    
    }
    
    //类内函数,,设置phone
    
    void Person::set_phone(){
    
             memset(phone,'\0',20);
    
             cin>>phone;
    
    }
    
    //类内函数,,设置email
    
    void Person::set_email(){
    
             memset(email,'\0',30);
    
             cin>>email;
    
    } 
    
    //类内函数,打印全部私有成员
    
    void Person::show(){
    
                       cout<<"name:"<<name<<endl;
    
                       cout<<"sex:"<<sex<<endl;
    
                       cout<<"phone:"<<phone<<endl;
    
                       cout<<"email:"<<email<<endl;
    
    }
    
    //增加一位联系人
    
    void add(){
    
             cout<<"name:"<<endl;
    
             people[Num].set_name();
    
             cout<<"sex:"<<endl;
    
             people[Num].set_sex();
    
             cout<<"phone:"<<endl;
    
             people[Num].set_phone();
    
             cout<<"email:"<<endl;
    
             people[Num].set_email();
    
             cout<<"输入成功!"<<endl<<endl;
    
             Num++;
    
             cout<<"按任意键继续..."<<endl;
    
             getch();
    
    }
    
    //修改联系人
    
    void modify(){
    
             char a[20],s;
    
             int flag_find=0,i;
    
             cout<<"请输入要修改的名字:"<<endl;
    
             cin>>a;
    
             for(i=0;i<Num;i++){    //从所有联系人中循环查找
    
                       if(!strcmp(people[i].get_name(),a)){      //采用strcmp函数比较查找出来的名字与输入的名字是否相同
    
                                cout<<"此联系人详细信息如下"<<endl;
    
                                people[i].show();   //调用show函数显示该联系人的所有信息
    
                                cout<<"是否要修改姓名?(y/n)"<<endl;  //使用if语句确认是否要修改姓名 性别 电话 电子邮件
    
                                cin>>s;
    
                                if(s=='y'||s=='Y'){
    
                                         cout<<"name:";
    
    //调用set函数,确认修改时使用memset函数按字节对内存块进行初始化,相当于清零操作
    
                                         people[i].set_name();
    
                                }
    
                                cout<<"是否要修改性别?(y/n)"<<endl;
    
                                cin>>s;
    
                                if(s=='y'||s=='Y'){
    
                                         cout<<"sex:";
    
                                         people[i].set_sex();
    
                                }
    
                                cout<<"是否要修改电话?(y/n)"<<endl;
    
                                cin>>s;
    
                                if(s=='y'||s=='Y'){
    
                                         cout<<"phone:";
    
                                         people[i].set_phone();
    
                                }
    
                                cout<<"是否要修改邮箱?(y/n)"<<endl;
    
                                cin>>s;
    
                                if(s=='y'||s=='Y'){
    
                                         cout<<"email:";
    
                                         people[i].set_email();
    
                                }
    
                                cout<<endl;
    
                                flag_find=1;  //修改好后将flag立为1做标志
    
                       }
    
             }
    
             if(flag_find==0){
    
                       cout<<"对不起,没有此人!"<<endl;
    
             }
    
             cout<<"按任意键继续..."<<endl;
    
             getch();  //将读取的字符返回
    
    }
    
    //删除一个联系人
    
    void del_one(){
    
             char a[20],c;
    
             int flag_find=0,i,j;
    
             cout<<"输入要删除的名字:"<<endl;
    
             cin>>a;
    
             for(i=0;i<Num;i++){
    
                       if(!strcmp(people[i].get_name(),a)){
    
                                cout<<"此联系人详细信息如下"<<endl;
    
                                people[i].show();
    
                                cout<<"是否要删除?(y/n)"<<endl;
    
                                cin>>c;
    
                                if(c=='Y'||c=='y'){
    
                                         for(j=i;j<Num-1;j++){
    
                                                   strcpy(people[j].get_name(),people[j+1].get_name());
    
                                                   strcpy(people[j].get_sex(),people[j+1].get_sex());
    
                                                   strcpy(people[j].get_phone(),people[j+1].get_phone());
    
                                                   strcpy(people[j].get_email(),people[j+1].get_email());
    
                                         }
    
                                         memset(people[Num-1].get_name(),'\0',20);
    
                                         memset(people[Num-1].get_sex(),'\0',10);
    
                                         memset(people[Num-1].get_phone(),'\0',20);
    
                                         memset(people[Num-1].get_email(),'\0',30);
    
                                         Num--;
    
                                }
    
                                flag_find=1;
    
                                cout<<endl;
    
                       }
    
             }
    
             if(flag_find==0){
    
                       cout<<"对不起,没有此人!"<<endl<<endl;
    
             }else{
    
                       cout<<endl;
    
             }
    
             cout<<"请按任意键继续..."<<endl;
    
             getch();
    
    }
    
    //打印所有联系人
    
    void show_all(){
    
             int i,flag_stop=0;
    
             char c;
    
             for(i=0;i<Num;i++){
    
                       cout<<"此联系人详细信息如下"<<endl;
    
                       people[i].show();
    
             }
    
             cout<<"此系统共有"<<Num<<"人信息。"<<endl;
    
             if(flag_stop==0)
    
                       cout<<"全部信息已输出!"<<endl;
    
             cout<<endl;
    
             cout<<"请按任意键继续..."<<endl;
    
             getch();   
    
    }
    
    //搜索联系人
    
    void search_name(){
    
             char a[20];
    
             int i,flag_find=0;
    
             cout<<"请输入您要查询的人名:"<<endl;
    
             cin>>a;
    
             for(i=0;i<Num;i++){
    
                       if(!strcmp(people[i].get_name(),a)){
    
                                cout<<"此联系人详细信息如下"<<endl;
    
                                people[i].show();
    
                                flag_find=1;
    
                       }
    
             }
    
             if(flag_find==0){
    
                       cout<<"对不起,没有此人!"<<endl<<endl;
    
             }else{
    
                       cout<<endl;
    
             }
    
             cout<<"请按任意键继续..."<<endl;
    
             getch();
    
    }
    
    void welcome(){
    
             printf("                                                  \n");
    
             printf("                        **************************\n");
    
             printf("                        **欢迎使用通讯录管理系统**\n");
    
             printf("                        **************************\n");
    
             printf("                                                  \n");
    
             printf("                        -------按任意键继续-------\n");
    
             printf("                                                  \n");
    
             printf("                                    ");
    
             getch();    //读取字符但不显示
    
             system("cls"); //system函数 清屏
    
    }
    
    void first_menu(){
    
             system("cls");
    
             cout<<"          主菜单                 "<<endl;
    
             cout<<"----------------------------"<<endl;
    
             cout<<"查询F  增加A  修改M  删除D  "<<endl;
    
             cout<<"----------------------------"<<endl;
    
    }
    
    int menu(){
    
             char s,t;
    
             int choice;
    
             while(true){
    
                       while(true){
    
                                first_menu();
    
                                cin>>s;
    
                                switch(s){
    
                                         case 'F':
    
                                                   cout<<"a 显示全部信息"<<endl<<"b 查询某人信息"<<endl;
    
                                                   cin>>t;
    
                                                   if(t=='a'||t=='A'){
    
                                                            choice=1;
    
                                                   }else if(t=='b'||t=='B'){
    
                                                            choice=2;
    
                                                   }else{
    
                                                            choice=0;
    
                                                   }
    
                                                   break;
    
                                         case 'f':
    
                                                   cout<<"a 显示全部信息"<<endl<<"b 查询某人信息"<<endl;
    
                                                   cin>>t;
    
                                                   if(t=='a'||t=='A'){
    
                                                            choice=1;
    
                                                   }else if(t=='b'||t=='B'){
    
                                                            choice=2;
    
                                                   }else{
    
                                                            choice=0;
    
                                                   }
    
                                                   break;
    
                                         case 'A':
    
                                                   choice=3;
    
                                                   break;
    
                                         case 'a':
    
                                                   choice=3;
    
                                                   break;
    
                                         case 'M':
    
                                                   choice=4;
    
                                                   break;
    
                                         case 'm':
    
                                                   choice=4;
    
                                                   break;
    
                                         case 'D':
    
                                                   cout<<"a 删除某人信息"<<endl;
    
                                                   cin>>t;
    
                                                   if(t=='a'||t=='A'){
    
                                                            choice=5;
    
                                                   }
    
                                                   else{
    
                                                            choice=0;
    
                                                   }
    
                                                   break;
    
                                         case 'd':
    
                                                   cout<<"a 删除某人信息"<<endl;
    
                                                   cin>>t;
    
                                                   if(t=='a'||t=='A'){
    
                                                            choice=5;
    
                                                   }
    
                                                   else{
    
                                                            choice=0;
    
                                                   }
    
                                                   break;
    
                                         default :{
    
                                                   cout<<"输入错误,请重新选择功能!"<<endl;
    
                                                   cout<<"按任意键继续..."<<endl;
    
                                                   getch();
    
                                         }
    
                                }
    
                                if(s=='F'||s=='f'||s=='A'||s=='a'||s=='M'||s=='m'||s=='D'||s=='d'){
    
                                                   break;
    
                                }
    
                       }
    
                       if(choice==0){
    
                                cout<<"输入错误,请重新选择功能!"<<endl;
    
                                cout<<"按任意键继续..."<<endl;
    
                                getch();
    
                       }else{
    
                                break;
    
                       }
    
             }
    
             return choice;
    
    }
    
    int main()
    
    {
    
             welcome();//调用欢迎界面
    
             int choice;
    
             while(true){
    
                       choice=menu();
    
                       switch(choice){
    
                                case 1: show_all();
    
                                         break;
    
                                case 2: search_name();
    
                                         break;
    
                                case 3: add();
    
                                         break;
    
                                case 4: modify();
    
                                         break;
    
                                case 5: del_one();
    
                                         break;
    
                       }
    
             }
    
             return 0;
    
    }

     

    六、总结:

     

    程序优点:

    1.较为完善的做出了通讯录的功能,达到了基本要求。

    2.流畅的交互界面,考虑到许多误操作并给予提示。

    3.灵巧运用节点跳转,写有许多flag,case等选择,条理清晰。

    4.所有信息均以char类型存储,十分的统一,且没有使用顺序表的那些算法操作去增删改查,而是另辟蹊径的运用字符型的特点,使用字符数组,总体思路便于理解。

    5.小组自学新知识点,尝试运用memset函数设置字符的初始格式,方便快捷。

    (memset()的深刻内涵:用来对一段内存空间全部设置为某个字符,一般用在对定义的字符串进行初始化为‘/0’;例:char a[100];memset(a, '/0', sizeof(a));)

     

    程序缺点:

    1.代码的可重用性不足,没有用到函数模板。

    2.功能不够有特色,是为简单的增删改查,没有涉及到文件的存储读写等操作,且目前只考虑到姓名、性别、电话、邮箱。个人认为此四项最为重要,其余项用处不大且占用代码空间。可以后期写生日、备注等项。

    展开全文
  • . . . . .下载可编辑. 学 院 班 级 学 号 姓 名 摘要 设计是基于opengl的windows地形显示系统从地形高度图中读取相应信息使用opengl...3 1.1 设计题目 3 1.2 设计内容 3 1.3 开发工具 3 1.4 应用平台 3 2 详细设计 3
  • C++面向对象课程设计_俄罗斯方块_源程序,用于 大作业
  • 西安交通大学实验报告 课程_计算机程序设计 _实验名称 _控制结构 _第 1 页 共 15 页 系 别_ _ 实 验 日 期 2014 年 3 月 10 日 专业班级 _ _ 组别 _ 实 验 报 告 日 期 2014 年 3 月 15 日 姓 名_ _ _ 学号 _ _ 报 ...
  • 西安交通大学实验报告 课程_计算机程序设计 _实验名称_控制结构 _第 1页共 15 页 系别_ _ 实 验 日 期 2014 年 3 月 10 日 专业班级_ _组别_ 实 验报告 日 期 2014 年 3 月 15 日 姓 名_ _ _ 学号 _ _报告 退发( ...
  • 面向对象分析 / 设计课程大作业 银行业务处理系统 13 级软件学院测试班 1367004029 曾丹 1. 需求分析 随着社会经济的发展信息化程度的不断深入银行的传统业务己愈来愈不 能满足银行客户的需要 现今人们的金融意识...
  • 大家好,我是19级的地大学生,符义同学,... 以后还会继续发表一些关于地大C++程序设计实习指导书上的代码。**能点赞的点赞鸭**。 #include<iostream> #include<iomanip> #include<string> #in..

    大家好,我是19级的地大学生符同学。这是我的代码,分享出来希望能帮助到那些家里条件不支持能够安心坐在电脑前敲代码,以及对这门课不感冒的同学,但希望你还是拿出点时间学习,敲代码还是挺有趣的,当然最最最重要的是相互交流学习。(虽然这个大作业算不上太难)
    以后还会继续发表一些关于地大C++程序设计实习指导书上的代码。能点赞的点赞鸭。ps.可能会有一些瑕疵,但目前为止调试中还没遇到,如果发现bug可以反馈给我。

    2020.6.6.23:42二次编辑,考虑不周,修改了下,能看到消息的就重新复制新的代码,没看到的,问题也不大,反正都是90多。

    ps.我会在暑假把程序再完善下,有些代码不是按照实习书上写的(代码不一样,但功能是一样的,有些人看不懂,说没写完……),有些地方用的C语言。实习指导书上的题目源代码我也会用老师教的语法来写,拓展题我也会写在博客上。

    #include<iostream>
    #include<iomanip>
    #include<string>
    #include<fstream>
    #include<string.h>//函数头里有些是多余的...看到网上的学生成绩管理系统有,我也复制了上去,怕差了点什么运行不了 
    using namespace std;
    const int MAX_STUDENT_NUM=5;
    
    class Student//类类类类类类,Giao~ 
    {
    public:
    void inputId();
    void inputName();
    void inputRegularGrade();
    void inputFinalExam();
    int getId();
    float get1();
    float get2();
    static void heading();//输出成绩标题
    void output(); //输出成绩信息
    float CalTotalMark(); //计算总评成绩=平时*50%+期末*50%
    private:
    int id; //学号
    char name[20]; //姓名
    float regularGrade; //平时成绩
    float finalExam; //期末考试成绩
    };
    
    //类的函数,阿西吧 
    
    void Student::inputId()
    {	cin>>id;	}
    void Student::inputName()
    {	cin>>name;	}
    void Student::inputRegularGrade()
    {	cin>>regularGrade;	}
    int Student::getId()
    {	return id;	}
    void Student::inputFinalExam()
    {	cin>>finalExam;		}
    float Student::get1()
    {	return regularGrade;}
    float Student::get2()
    {	return finalExam;	}
     void Student::heading()//常态?在声明时无需再添加 static 
    {
    	cout<<setw(12)<<"学号"<<setw(12)<<"姓名"<<setw(12)<<"平时"<<setw(12)<<"期末"<<endl;
    }
    void Student::output()
    {
    	double a=regularGrade,b=finalExam;
    	
    	cout<<setw(12)<<id<<setw(12)<<name;printf("%12.1lf%12.1lf\n",a,b);//这里弄了半天,还好学了C语言, setprecision不好用 ,一直失败,没能保存一位小数 
    }
    float Student::CalTotalMark()
    {
    	return regularGrade*0.5+finalExam*0.5;
    }
    
    void Input(Student stu[],int &num);//自定义输入函数 
    void Output(Student stu[],int num);//自定义输出函数 
    void Statis(Student stu[],int num);//自定义统计函数 
    void  Order(Student stu[],int num);//自定义排序函数 
    void Search(Student stu[],int num);//自定义查找函数 
    void Delete(Student stu[],int &num);//自定义删除函数 
    void c();//引入一个显示系统界面的函数 
    int Open_File(Student*stu);
    void Save_File(Student* stu,int n);
    
    
    //眼花缭乱 
    
    
    int main()
    {
    	int currentN;
    	int &num=currentN;
    	Student *stu;
    	stu=new Student[MAX_STUDENT_NUM];
    	num=Open_File(stu);//读取文件 
    	c();//按照要求显示第一次的系统界面 
    	for(int i=1;i!=0;i++)//引入主程序 
    	{
    		cout<<"请选择:";
    		int a;
    		cin>>a;
    		if(a==0)break;//如果选择0,退出了系统,后面的switch语句不再运行 ,也不再显示界面 
    		switch(a){
    			case 1:Input(stu,num);break;//实际上插入和录入啥区别。。。。 
    			case 2:Output(stu,currentN);break;//输出学号,名字,成绩 
    			case 3:Order(stu,currentN);break;//排序总评 
    			case 4:Search(stu,currentN);break;//查找 
    			case 5:Input(stu,num);break;//插入 
    			case 6:Delete(stu,num);break;//删除学生信息 
    			case 7:Statis(stu,currentN);break;//统计 
    			default:printf("输入非法,请重新输入!\n");break;	
    		}
    		c();//因为每次结束选择后,要显示界面,所以将函数放在这里 
    	}
    	Save_File(stu,num);//保存数据
    	delete[] stu;//堆数据删除
    	return 0;
    }
    void Input(Student stu[],int &num)//自定义输入函数 ,比较麻烦的地方就是这了,其他的自定义函数改动下就可以了,这里花了很多时间 
    {
    	
    	int i=num;char ch;int panduanchongfu;
    	for(i;i<MAX_STUDENT_NUM;i++)
    		{
    			printf("请输入学号(1-40之间): ");
    			stu[i].inputId();
    			for(int sq=1;;sq++)//判断学号是否超出范围 且是否重复 
    				{	
    					panduanchongfu=1;	//这里个人觉得比较好的地方,当然也可以另外写一个函数,判断是否重复 
    					if(stu[i].getId()>40||stu[i].getId()<0)
    						{
    							cout<<"输入错误,学号应该在0到40之间!\n";
    							cout<<"请输入学号(1-40之间): ";
    							stu[i].inputId();
    						}
    				for(int sw=0;sw<num;sw++)//判断学号是否重复 
    					{		
    						if(stu[i].getId()==stu[sw].getId())
    							{
    								panduanchongfu=0;
    							}
    				}
    					if(panduanchongfu==0)
    					{
    						cout<<"学号不允许重复,该学号已经存在!\n";
    						cout<<"请输入学号(1-40之间): ";
    						stu[i].inputId();
    					}
    
    					if(stu[i].getId()>=1&&stu[i].getId()<=40&&panduanchongfu) break;
    				}
    			cout<<"请输入姓名:";
    			stu[i].inputName();	
    			cout<<"请输入平时成绩:";
    			stu[i].inputRegularGrade();		
    			for(int cjg=1;;cjg++)
    				{		
    					if(stu[i].get1()>100||stu[i].get1()<0)
    						{
    							cout<<"输入错误,成绩应该在0到100之间!\n";
    							cout<<"请输入成绩(0~100): ";
    							stu[i].inputRegularGrade();
    						}
    					if(stu[i].get1()>=0&&stu[i].get1()<=100) break;
    				}
    			cout<<"请输入期末考试成绩:";
    			stu[i].inputFinalExam();
    			for(int fyzd=1;;fyzd++)
    				{		
    					if(stu[i].get2()>100||stu[i].get2()<0)
    						{
    							cout<<"输入错误,成绩应该在0到100之间!\n";
    							cout<<"请输入成绩(0~100): ";
    							stu[i].inputFinalExam();
    						}
    					if(stu[i].get2()>=0&&stu[i].get2()<=100) break;
    				}
    			num++;
    			cout<<"继续输入学生成绩请按y或Y: ";
    			cin>>ch;
    			if(ch!='y'&&ch!='Y') break; //刚开始写成了if(ch!='y'||ch!='Y') break;,不能正确判断…… 
    		}	
    	if(num==MAX_STUDENT_NUM)cout<<"人数已达到5人上限,无法再输入!\n";
    }
    
    
    void Output(Student stu[],int num)//自定义输出函数 
    {
    	
    	int i;
    	stu[0].heading();
    	for(i=0;i<num;i++)
    	{
    		stu[i].output();
        }
    }
    
    
    void Statis(Student stu[],int num)//自定义统计函数 ,没什么好解释的了,很简单~ 
    {
     int a,b,c,d,e;int i;
     a=b=c=d=e=0;
     for(i=0;i<num;i++) {
     	if(stu[i].CalTotalMark()>=90&&stu[i].CalTotalMark()<=100) a++;
     	else if(stu[i].CalTotalMark()>=80&&stu[i].CalTotalMark()<90) b++;
     	else if(stu[i].CalTotalMark()>=70&&stu[i].CalTotalMark()<80) c++;
     	else if(stu[i].CalTotalMark()>=60&&stu[i].CalTotalMark()<70) d++;
     	else if(stu[i].CalTotalMark()>=0&&stu[i].CalTotalMark()<60) e++;
     }
    printf("100~90  89~80  79~70  69~60  <60\n");
    printf("   %d      %d      %d      %d     %d\n",a,b,c,d,e);
     
    } 
    
    void Order(Student stu[],int num)//自定义排序函数 ,排序在前面的基础上改动的地方也很少,我选择的是选择排序法 
    {
    	int f,y,love;
    	for(f=0;f<num-1;f++)
    	{
    		love=f;
    		for(y=f;y<num;y++)
    		{
    			if(stu[love].CalTotalMark()<stu[y].CalTotalMark()) love=y;
    		}
    		if(love!=f){  Student hezi=stu[f];  stu[f]=stu[love];  stu[love]=hezi;	}
    	}
    	stu[0].heading();
    	for(int fy=0;fy<num;fy++)
    	{
    	stu[fy].output();
    	}
    }
    
    
    void Search(Student stu[],int num)//自定义查找函数 
    {
    		int i;char ch;int count;int  h;
    		float chazhaoshu; 
    	for(i=1;;i++)
    		{
    			count=0;
    			printf("请输入您要查找的学号: ");
    			cin>>chazhaoshu;
    			for(h=0;h<num;h++)
    			{
    				if(stu[h].getId()==chazhaoshu){
    					stu[h].heading();stu[h].output();
    					count++;
    				}
    			}
    			if(count==0) cout<<"没有该学生信息!\n";
    			cout<<"继续查找请按y或Y,停止查找请按其他字符: ";
    			cin>>ch;
    			if(ch=='y'||ch=='Y') continue; 
    			else break;
    		}	
    	
    } 
    
    
    void Delete(Student stu[],int &num)//自定义删除函数 ,这里也有点意思,覆盖了被删除的,虽然最后面的对象没删除,但num=num-count解决这个问题 
    {
    	int f,y,count;float fy; char ch; 
    	for(int i=1;;i++)
    	{
    		count=0;
    		cout<<"请输入要删除学生的学号:";
    		cin>>fy;
    		for(f=0;f<num;f++) //删除的主步骤 
    		{
    			if(stu[f].getId()==fy)
    			{
    				for(y=f;y<num-1;y++)
    				{
    					stu[y]=stu[y+1];
    				}
    				count++;
    				num--;	
    			}
    		}
    
    		if(count!=0) cout<<fy<<"号学生信息删除成功!\n";
    		else cout<<"没有该学生!\n"; 
    			cout<<"继续删除其他学生请按y或Y,停止删除其他学生请按其他字符: ";
    			cin>>ch;
    			if(ch=='y'||ch=='Y') continue; //看到这里知道了前面录入的时候跳出为什么失败了,忘记加 else break了 
    			else break;	
    	}
    }
    
    
    void c()//函数定义,主界面的函数 
    {
    	cout<<"             ==========================================\n";
    	cout<<"             =          欢迎使用成绩管理系统          =\n";
    	cout<<"             =       1=录入学生     2=显示信息        =\n";
    	cout<<"             =       3=排序总评     4=查找学生        =\n";
    	cout<<"             =       5=插入学生     6=删除学生        =\n";
    	cout<<"             =       7=统计人数     0=退出系统        =\n";
    	cout<<"             ==========================================\n";
    }
    
    
    
    
    
    
    //文件部分
    /*保存文件*/
     void Save_File(Student* stu,int n)//读写文件…… 
    {
    	ofstream fileout("students.dat",ios::binary);
    	if(!fileout)//文件打开失败 则直接返回
    	{
    		cout<<"文件不能被打开!"<<endl;
    		return ;
    	}
    	for(int i=0;i<n;i++)
    	{
    		fileout.write((char*)&stu[i],sizeof(Student));
    	}//打开成功则 循环写入数组信息
    	fileout.close();
    }
    /*打开文件*/
    int Open_File(Student *stu)
    {
    	int i=0;
    	ifstream filein("students.dat",ios::binary);
    	while(filein)//如果文件没有到结尾 循环读取到数组
    	{
    		filein.read((char*)&stu[i],sizeof(Student));
    		i++;
    	}
    	if(i>=1)
    	{
    		return i-1;//文件结尾会读取到一行乱码  减去这一行
    	}
    	return 0;
    }
    
    
    展开全文
  • C++面向对象程序设计大作业:魔兽世界(三):开战问题描述问题分析代码 问题描述 问题来自于北京大学郭炜老师的C++慕课的大作业 魔兽世界的西面是红魔军的司令部,东面是蓝魔军的司令部。两个司令部之间是依次排列...
  • 北京航空航天大学在线作业试卷 北京航空航天大学在线作业试卷 北航15年C++程序设计在线作业试卷三 一单选题共25道试题共100分 预处理命令在程序中都是以 号开头的 TOC \o "1-5" \h \z * # & @ 满分4分 通常拷贝构造...
  • 西安交通大学实验报告 课程_计算机程序设计 _实验名称 _多态性_第 1 页 共 44 页 系 别_ _ _ 实 验 日 期 2014 年 5 月 31 日 专业班级 _ _ _组别 _ 实 验 报 告 日 期 2014 年 5 月 31 日 姓 名_ _ 学号 _ _ 报 告 ...
  • 西安交通大学实验报告 课程_计算机程序设计 _实验名称 _课外实验题目 _第 1 页 共 19 页 系 别_ _ _ 实 验 日 期 2014 年 4 月 3 日 专业班级 _ _组别 _ 实 验 报 告 日 期 2014 年 4 月 5 日 姓 名_ _学号 _ _ 报 ...
  • 西安交通大学实验报告 课程_计算机程序设计 _实验名称_课外实验题目 _第 1 页 共 19 页 系 别_ _ _ 实 验 日 期 2014 年 4 月 3 日 专业班级 _ _组别 _ 实 验 报 告 日 期 2014 年 4 月 5 日 姓 名_ _学号_ _ 报 告 ...
  • 这个没时间写了. 但是为了完整性, 先把转载别人的代码. ...#include #include using namespace std; //整数的加减乘除 string add_int(string, string); string sub_int(string,
  • 我的c++程序设计作业

    2012-10-10 21:58:29
    * All rights reserved. * 作 者: 李蒙 * 完成日期:2012 年 10月10 日 * 版 本 号:v1.0 ...* 问题描述:给定两个正整数,求出两...* 程序输出:给定两数的正差值 * 问题分析:通过比较两数的大小,保证由
  • 自己写的c++作业,供对c++作业头痛的人参考
  • 程序设计作业,使用C++编写整数类。

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 475
精华内容 190
关键字:

c++程序设计大作业

c++ 订阅