C++课程设计

??code???? 2015-07-16 10:08:02
头文件
#ifndef LIST_H_
#define LIST_H_
#include <fstream>
using namespace std;
class Node //节点类
{
private:
char* name;//姓名
int id;//学号
float score;//分数
Node* next;//指向下一个节点
public:
Node(char*,int,float);
~Node();
void setScore(float);//重新设置分数
char* getName();//获取分数
int getId();//获取学号
float getScore();//获取分数
Node* getNext();//获取下一个节点地址
void setNext(Node*);//添加下一个节点地址至前一个节点next

};
class LinkList//链表类
{
private:
Node* head;
public:
LinkList();
LinkList(char*,int,float);
void addDate(char*,int,float);//增加节点
~LinkList();
void display();//输出链表值
Node* getHead(); //获取头指针
void serch(int);//通过学号查找
void serch(char*);//通过姓名查找
void changScore();//修改分数
void passAndGood();//判断及格和优秀人数
void redData();//从文件读取数据
};
#endif


#include "List.h"
#include <iostream>
using namespace std;
Node::Node(char* _name,int _id,float _score)
{
name = _name;
id = _id;
score = _score;
next = NULL;
}
Node::~Node()
{
cout << "使用~Node析构函数" << endl;
}
void Node::setScore(float _score)
{
score = _score;
}
char* Node::getName()
{
return name;
}
int Node::getId()
{
return id;
}
float Node::getScore()
{
return score;
}
Node* Node::getNext()
{
return next;
}
void Node::setNext(Node *_node)
{
next = _node; //将一个新的节点插入到链表尾,配合LinkList::addData()使用
}
LinkList::LinkList()
{
head = NULL;
}
LinkList::LinkList(char* _name,int _id,float _score)
{
head =new Node(_name,_id,_score); //设置新节点的值,并且将头指针head指向新添加的节点
}
void LinkList::addDate(char* _name,int _id,float _score)
{
Node* p = head;//初始化一个Node型指针指向头指针head
if(head==NULL)//判断head是否为空,即链表是否为空链表
{
head = new Node(_name,_id,_score);//若链表为空,创建新节点,并将头指针head指向新的节点
}
else//链表不为空
{
while(p->getNext()!=NULL) //遍历链表直至尾节点
{
p = p->getNext();
}
p->setNext(new Node(_name,_id,_score));//在尾节点后添加新的节点
}
}
LinkList::~LinkList()
{
cout << "使用~LinkList析构函数" << endl;
}
void LinkList::display()//显示函数
{
ofstream out;
out.open("Student.txt");
if(!out)
{
cout << "文件打开失败" << endl;
}
else
{
Node* p = head;
if(p==NULL)//链表为空的情况(我发现的一个大大的BUG,嘻嘻!)
{
out << "空链表!" << endl;
}
else
{
{ //输出头节点
out << "学号 姓名 成绩" << endl;
out << p->getId() << p->getName() << p->getScore() << endl;
}
if(p->getNext()!=NULL)//判断下一节点是否为空,并依次输出
{
p = p->getNext();//节点后移
out << p->getId() << p->getName() << p->getScore() << endl;

}
}
}

}
void LinkList::serch(int n)//查找函数,通过学号查找
{
Node* p =head;//head;获取头指针就会内存报错
if(p == NULL)
{
cout << "数据为空,查询失败!" << endl;
}
else
{
if(p->getId()==n)
{
cout << p->getId() << p->getName() <<p->getScore() << endl;
}
else
{
if(p->getNext()==NULL)
{
cout << "查询失败,不存在该学生!" << endl;
}
else
{
if(p->getId()==n)
{
cout << p->getId() << p->getName() <<p->getScore() << endl;
}
p = p->getNext();

}
}
}
}
void LinkList::serch(char* n)//查找函数,通过姓名查找
{
Node* p = head;//获取头指针就会内存报错
if(p == NULL)
{
cout << "数据为空,查询失败!" << endl;
}
else
{
if(p->getName()==n)
{
cout << p->getId() << p->getName() <<p->getScore() << endl;
}
else
{
if(p->getNext()==NULL)
{
cout << "查询失败,不存在该学生!" << endl;
}
else
{
if(p->getName()==n)
{
cout << p->getId() << p->getName() <<p->getScore() << endl;
}
p = p->getNext();

}
}
}
}
void LinkList::changScore()//分数修改函数
{
Node* p = head;//获取头指针就会内存报错
char admin[6] ="admin";
int password = 123456;
char admin1[6] = {0};
int password1 = 0;
cout << "温馨提示,你正在修改数据,请谨慎操作!" << endl;
cout << "本系统具有超强防护功能,需要验明真身,以供下步操作!" << endl;
cout << "请按程序提示操作!";
cout << "请输入用户名" << endl;
cin >> admin1;
if(admin==admin1)
{
cout << "请输入密码" << endl;
cin >> password1;
if(password == password1)
{
cout << "欢迎使用成绩修改系统" << endl;
cout << "请输入需要修改的学生学号" << endl;
cin >> password1;
if(p == NULL)
{
cout << "非常抱歉,当前数据为空,无法提供更改,请确保数据正常!" << endl;
}
else
{
if(p->getId()==password1)
{
p->setScore(password1);
}
else
{
while(p->getNext()!=NULL)
{
p = p->getNext();
if(p->getId()==password1)
{
p->setScore(password1);
}


}
}
}

}
}
else
{
cout << "用户名输入错误" << endl;
cout << "本系统具有超强防护功能,为防止暴力破解!请重启后重试!" << endl;
}

}
void LinkList::passAndGood()
{
Node* q = head;//获取头指针就会内存报错
if(head==NULL)
{
cout << "数据为空,无法提供统计功能!" << endl;
}
else
cout << "及格人数如下:" << endl;
{
if(q->getScore()>=60)
{

cout << q->getId() << q->getName() << q->getScore();
if(q->getScore()>=90)
{
cout << "优秀" << endl;
}
}
while(q->getNext()!=NULL)
{
q = q->getNext();
if(q->getScore()>=60)
{
cout << q->getId() << q->getName() << q->getScore() << endl;
if(q->getScore()>=90)
{
cout << "优秀" << endl;
}
}
}
}

}
void LinkList::redData()
{
char name[10];
float score;
ifstream in;
in.open("Data.txt");
if(!in)
{
cout << "文件打开失败" << endl;
}
else
{
for (int i = 0;i < 5;i++)
{
in >> name >> score;
head = new Node(name,i+1,score);
}
}
in.close();
}

#include "List.h"
#include <fstream>
#include <string>
#include <iomanip>
#include <iostream>
using namespace std;
int main()
{ char name[10];
LinkList *linklist;
char opinion;
while(1)
{

cout << setw(30) << setfill('*') << '*'<< endl;
cout << "学生成绩管理系统" << endl;
cout << setw(30) << setfill('*') << '*' << endl;
cout << setw(30) << setfill('*') << '*' << endl;
cout << std::left << setw(30) << "**1--输入数据" << setfill('*') << endl;
cout << std::left << setw(30) << "**2--查询成绩" << setfill('*') << endl;
cout << std::left << setw(30) << "**3--修改成绩" << setfill('*') << endl;
cout << std::left << setw(30) << "**4--输出所有学生成绩" << setfill('*') << endl;
cout << std::left << setw(30) << "**5--统计及格和优秀人数" << setfill('*') << endl;
cout << std::left << setw(30) << "**6--退出系统" << setfill('*') << endl;
cout << setw(30) << setfill('*') << '*'<< endl;
cin >> opinion ;
switch(opinion)
{
case '1':
linklist->redData();
break;
case '2':
cout << "请输入查询方式 \n1-通过学号查询\n2-通过姓名查询" << endl;
cin >> opinion;
switch(opinion)
{
case '1':
cout << "请输入学号!" << endl;
cin >> opinion;
linklist->serch(opinion);
break;
case '2':
cout << "请输入姓名!" << endl;
cin >> name;
linklist->serch(name);
break;
}
break;
case '3':
linklist->changScore();
break;
case '4':
linklist->display();
break;
case '5':
linklist->passAndGood();
break;
case '6' :
break;
}
if(opinion=='6')
break;
}
return 0;
}

各个函数内的这句话都会引起内存错误!什么鬼? Node* q = head;//获取头指针就会内存报错
新手求帮助!
...全文
269 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2015-07-16
  • 打赏
  • 举报
回复
崩溃的时候在弹出的对话框按相应按钮进入调试,按Alt+7键查看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处,看不懂时双击下一行,直到能看懂为止。

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧