星期二 发表于 2017-6-12 12:21:01

求0大神的帮忙,程序改错和完善,刚刚学不大动

C++成绩管理
        成绩记录薄,每个学生信息包括:学号、姓名、成绩
        实现的功能:
                输入学生成绩
                按学号或姓名查询成绩
                添加成绩记录
                修改指定姓名的学生成绩
                显示输出60分以下,60~79,80~89,90分以上各分数段的学生信息。
                找出最低成绩和最高成绩
                计算平均分
#include <iomanip>
#include <iostream>
#include <fstream>
#include <vector>
#include <conio.h>
#include <stdlib.h>
#include <string>
#include <process.h>
#include <algorithm>
#include <stdio.h>
using namespace std;

struct student //相当于类的公有类型
{
char name;         ///   姓名
charxuehao;         ///   学号
floatscore;         ///   分数
student *next;
};
///////////-------定义类-----------------------////////////

class studentmassage
{
    student *p1,*p2,*end,*head;
public:

~studentmassage() /////----析构函数------------------------
{

while(head)
{
p1=head->next;
delete head;
head=p1;
}
}
//成员函数
void ShowMenu();//菜单
void Input(student *p);//输入学生信息
student *find(student *head,char *p);//按照学号或姓名查询学生成绩记录(可查找多个同名数据)
void findgd();            //找出最低成绩和最高成绩
student *input(student *head);         //增加学生成绩记录
student *showfs(student *head);   //显示输出学生分数段信息
void average();                      //计算平均分
friend void total(student*head);
//student *getNext(){return next;}
student *insert(student *head);   //修改成绩
student*Inputs(); //用于添加数据的子函数
void output (student *head);
void delay()
    {
      int n = 1000000000;
      while (n--)
            ;
    }
student *FindItem(char * name)//查找姓名
    {
      for (student * p = head; p->next != end; p = p->next)//匹配成功则返回上一个指针,不成功就返回空   
      if (!strcmp(p->next->name, name))return p;
      return NULL;
    }
    student *FindID(char * xuehao)//查找学号
    {
      for (student * p = head; p->next != end; p = p->next)//匹配成功则返回上一个指针,不成功就返回空   
      if (!strcmp(p->next->xuehao, xuehao))return p;
      return NULL;
    }
};//----------------------------------------------------
void studentmassage::ShowMenu()//菜单
{
    cout << "********************************************************************************" << endl;
    cout << "〓〓〓〓〓〓〓〓〓〓☆   学 生 成 绩 管 理 系统   ☆〓〓〓〓〓〓〓〓〓〓" << endl;
    cout << "〓〓〓〓〓〓〓★★★★★         ★★★★★★★         ★★★★★〓〓〓〓〓〓〓" << endl;
    cout << "〓〓〓〓〓〓〓〓〓★☆          1.输入学生成绩      ☆★〓〓〓〓〓〓〓〓〓" << endl;
    cout << "〓〓〓〓〓〓〓〓〓★☆          2.按照学号或姓名查询成绩☆★〓〓〓〓〓〓〓〓〓" << endl;
    cout << "〓〓〓〓〓〓〓〓〓★☆          3.添加成绩记录      ☆★〓〓〓〓〓〓〓〓〓" << endl;
    cout << "〓〓〓〓〓〓〓〓〓★☆          4.修改指定姓名的学生成绩☆★〓〓〓〓〓〓〓〓〓" << endl;
    cout << "〓〓〓〓〓〓〓〓〓★☆          5.显示输出60分以下,60-79,80-89,90分以上各分数段的学生信息☆★〓〓〓〓〓〓〓〓〓" << endl;
    cout << "〓〓〓〓〓〓〓〓〓★☆          6.找出最低成绩和最高成绩☆★〓〓〓〓〓〓〓〓〓" << endl;
    cout << "〓〓〓〓〓〓〓〓〓★☆          7.计算平均分          ☆★〓〓〓〓〓〓〓〓〓" << endl;
    cout << "〓〓〓〓〓〓〓〓〓★☆          0.安全退出系统      ☆★〓〓〓〓〓〓〓〓〓" << endl;
    cout << "\n\t\t\n\t\t请选择:";
}
////----------------///////
void studentmassage::Input(student *p)//输入学生成绩
{
   cout<<setw(6)<<"姓名"<<setw(8)<<" 学号"<<setw(8)<<"c++"<<endl;
   cin>>p->name >>p->xuehao;
   cin >>p->score;
}
void studentmassage::output (student *head)//用于输出
{ p1=head;
while(p1!=NULL)
{
   cout<<setw(6)<<p1->name<<setw(8)
   <<p1->xuehao<<setw(8)<<p1->score<<endl;
   p1=p1->next ;
}
}
student*studentmassage::find(student *head,char *p) //按照学号或姓名查询学生成绩记录
{
        char name, xuehao;
    int x;
    student * p = NULL;
    cout << "\n\t\t*********************************\n";
    cout << "\t\t※ 1.按学生的姓名查找\n\t\t※ 2.按学生学号查找";
    cout << "\n\t\t*********************************\n请选择:";
    cin >> x;
    switch (x)
    {
    case 1:{cout << "\t\t请输入要查找的学生的姓名:"; cin >> name;
      if (p = FindItem(name))
      {
            p->Next->output();
            delay();
            cout << "输入任意字符!继续……";
            getchar();
      }
      else
      {
            cout << "\t\t没有找到该姓名的学生!" << '\n' << endl;
            delay();
            cout << "输入任意字符!继续……";
            getchar();
      }
    }break;
    case 2:
    {
            cout << "\t\t请输入要查找的学生的学号:"; cin >> xuehao;
            if (p = FindID(xuehao))
            {
                  p->Next->output();
                  delay();
                  cout << "输入任意字符!继续……";
                  getchar();
            }
            else
            {
                  cout << "\t\t没有找到该学好的学生!" << '\n' << endl;
                  delay();
                  cout << "输入任意字符!继续……";
                  getchar();
            }
    }break;
    }

}
student *studentmassage::input(student *head)   //增加学生成绩记录
{p1=new student; //动态分配内存
   p2=head;
   Input(p1); //调用函数 增加数据
if(head ==NULL)
{
   head=p1;
   p1->next =NULL;
    return head;
}
while(p2->next !=NULL)
            p2=p2->next;
       p2->next=p1;
      p1->next=NULL;
                cout << "添加成功!" << endl;
      cout << "输入任意字符(按任意键)!继续……";
      getchar();
   return head;
}
student* studentmassage::insert(student *head)//修改指定姓名的学生成绩
{
    char name1;
    student*p = NULL;
    cout << "\t\t请输入要修改的人的姓名:"; cin >> name1;
        if (p=FindItem(name1)) //调用查找函数
        {
      cout << "\t\t已找到学生的信息,请输入新的成绩!" << endl;
                Input(p);//调用输入函数
      cout << "修改成功!" << endl;
      cout << "输入任意字符!继续……";
      getchar();
    }
    else
    {
      cout << "\t\t没有找到!" << endl;   
      cout << "输入任意字符!继续……";
      getchar();
    }
        return head;
}
student* studentmassage::insert(student *head)//修改指定姓名的学生成绩
{
    char name1;
    student * p = NULL;
    cout << "\t\t请输入要修改的人的姓名:"; cin >> name1;
        if (p=FindItem(name1)) //调用查找函数
        {
      cout << "\t\t已找到学生的信息,请输入新的成绩!" << endl;
                p->next->Input(p);//调用输入函数
      cout << "修改成功!" << endl;
      cout << "输入任意字符!继续……";
      getchar();
    }
    else
    {
      cout << "\t\t没有找到!" << endl;   
      cout << "输入任意字符!继续……";
      getchar();
    }
        return head;
}
student *studentmassage::showfs(student *head)      //显示输出学生分数段信息
{
        int n=0;
        char ch;
        cout<<"A->60分以下;B->60~70分之间;C->70~80分之间;D->80~90分之间;E->90~100分之间:"<<endl; cin>>ch;
        switch(ch)
        {
    case 'A':while(head)
                       {
                     if(head->score<=60){head->Input();n++;} head=head->next();break;
                       }
        case 'B':while(head)
                       {
                               if(head->score>60&&head->score<=70){head->Input();n++;} head=head->next;break;
                       }
        case 'C': while(head)
                          {
                                  if(head->score>70&&head->score<=80){head->Input();n++;} head=head->next;break;
                          }
        case 'D': while(head)
                          {
                                  if(head->score>80&&head->score<=90){head->Input();n++;} head=head->next;break;
                          }
        case 'E': while(head)
                          {
                                  if(head->score>90&&head->score<=100){head->Input();n++;} head=head->next;break;
                          }
                          default:
                        cout<<"该分段内没有您要找的学生信息!"<<endl;
        }
        cout << "输入任意字符!继续……";
      getchar();
        return head;       
}
void studentmassage::average()//计算平均分
{
        student *p1=next;//student链表头指针赋给p1
        double count=0;
        double sum;
        if(p1==NULL)
                cout<<"无学生信息!"<<endl;
        else
        {
                while(p1)
                {
                        count++;
                        sum=sum+p1->score;
                        p1=p1->next;
                }
      cout<<"\n\t\t平均分:"<<(sum/count)<<endl;
        }
        getchar();
}
void studentmassage::findgd()//显示最高分和最低分
{
        student *p1=next;//student链表头指针赋给p1
        double count=0;
        double max=0,min=0;
        if(p1==NULL)
                cout<<"无学生信息!"<<endl;
        else
        {
                while(p1)
                {
                        count++;
                        if(p1->score>max)max=p1->score;
                        else min=p1->score;
                        p1=p1->next;
                }
                cout<<"\n\t\t最高分: "<<max<<endl;
      cout<<"\n\t\t最低分: "<<min<<endl;
        }
        getchar();
}
void error()
{
cout<<"错误,这还是一个空系统,请输入数据"<<endl;
getchar();

}
///////////////////------------main函数--------//////////////////-----------
int main(void)
{
        studentmassage stus;
    student *head=NULL;
    student *pd; //临时指针, 用于查找函数
    char choice; //用于存放用户的选择项
char name; //查找,删除记录的 key
   stus.ShowMenu();
int n=0;
cin>>choice;
if(choice=='0')//安全退出
{   cout<<"谢谢使用,再见"<<endl;
   exit(0);
}
switch(choice)
{
case '1':
   head=stus.Input(head); break;
case '5':
if(head==NULL)
{
      error();
          break;
}
   cout<<head->xuehao<<"学号"<<head->name<<" 姓名"
   <<head->score<<"c++分数"<<endl;
   stus.showfs(head);
   getchar();break;
case '7':
if(head==NULL)
{
error();
break;
}
   //stus.average(head);
stus.average();
   getchar();break;
case '2':
if(head ==NULL)
{
error(); //调用函数输出错误信息
break;
}
   cout<<"请输入想要查找的学生姓名"<<endl;
      cin>>name;
   pd=head;
   cout<<head->xuehao<<"学号"<<head->name<<" 姓名"
   <<head->score<<"c++分数"<<endl;
while(pd)   // 循环调用函数, 用于输出多个的同名学生成绩
{
pd=stus.find (pd,name);
   if(pd==NULL)
break;
pd=pd->next ; //指针指向当前以找到的下一个节点,用于查找多个学生
}
getchar();
   break;
case '4':
if(head==NULL)
{
error();
break;
}
   cout<<"请输入想要删除学生姓名"<<endl;
   cin>>name;
   head=stus.insert(head);
   getchar();
   break;
   case '3':
   if(head==NULL)
{
error();
break;
}
       stus.findgd();
      head=stus.input(head);
         break;
case '6':
if(head==NULL)
{
error();
break;
}
      stus.findgd();
      cout<<"最高分和最低分"<<endl;
       getchar();break;
      default :
    cout<<" 对不起,您的输入有误,请重新输入。\n";
    getchar(); break;
}
getchar();
return 0;
}

wuyuan2011woain 发表于 2017-6-17 22:48:02

{:5_103:}
页: [1]
查看完整版本: 求0大神的帮忙,程序改错和完善,刚刚学不大动