當前位置:編程學習大全網 - 源碼下載 - 用C++編壹個簡單的學生成績系統

用C++編壹個簡單的學生成績系統

//class CNode.h

#ifndef __CNODE_H__

#define __CNODE_H__

#include <iostream>

using namespace std;

struct stData //出生年月結構

{

int m_nYear;

int m_nMonth;

int m_nDay;

};

struct stResult //五門課成績結構

{

double m_dSubject_1; //自己改成績的名稱

double m_dSubject_2;

double m_dSubject_3;

double m_dSubject_4;

double m_dSubject_5;

};

struct stStudent //聲明學生信息的結構

{

string m_strNumber; //學生學號

string m_strName; //姓名

char m_chSex; //性別

struct stData m_stData; //出生年月

string m_strAppearance; //政治面貌

struct stResult m_stResult; //五門課成績

};

typedef class CNode

{

private:

struct stStudent m_stStudent;

CNode* m_Next;

public:

CNode(); //構造函數

~CNode(); //析構函數

void SetNodeData(); //設置結點內容的函數成員

stStudent GetNodeData(); //獲取結點內容的函數成員

void SetNodeNext(CNode* _Next); //設置結點Next指針的函數成員

void ShowNodeData(); //輸出結點內容的函數成員

CNode* GetNodeNext(); //獲取結點Next指針的函數成員

}LinkNode;

#endif

//class CLinkList

#ifndef __CLINKLIST_H__

#define __CLINKLIST_H__

#include "CNode.h"

typedef class CLinkList

{

private:

LinkNode* m_Head; //鏈表的頭指針

LinkNode m_Node; //鏈表的頭結點

public:

CLinkList(); //構造函數

~CLinkList(); //析構函數

void CreateList(); //初始化鏈表的函數成員

LinkNode* GetListNode(int _nIndex); //按位置查找指定位結點的成員函數

void InsertList(int _nIndex); //插入結點的成員函數

void DeleteList(int _nIndex); //刪除某壹結點的成員函數

LinkNode* GetHeadList(); //獲取頭指針的成員函數

void SetListData(int _nIndex); //設置鏈表中某壹結點的值的成員函數

void ShowListData(int _nIndex); //這個是現實鏈表中某壹結點值的函數成員

void DestroyList(int _nIndex); //銷毀某壹位置以後鏈表的成員函數

void ShowList(); //顯示鏈表的成員函數

}LinkList;

#endif

//class CLinkList

#include "CLinkList.h"

#include "CNode.h"

CLinkList::CLinkList()

{

cout << "這個是構造函數"<< endl;

m_Head = &m_Node; //鏈表的頭指針指向頭結點

m_Node.SetNodeNext(NULL); //將頭結點的Next指針設置為NULL;

}

CLinkList::~CLinkList()

{

cout << "這個是析構函數" << endl;

}

void CLinkList::CreateList() //以向後追加的方式創建壹個鏈表,輸入0退出

{

int nTemp = 0; //定義壹個臨時變量用於標誌程序結束

cout << "歡迎來創建鏈表 !" << endl;

CNode * pTemp = NULL; //定義壹個臨時結點指針,用來增加新結點用

CNode * pNode = m_Head; //定義壹個標記指針,首先叫其指向頭結點

while(1)

{

pTemp = new LinkNode;

cout << "請輸入下壹個結點的內容!" << endl;

pTemp->SetNodeData(); //設置鏈表中結點的內容

cout << "如果想繼續輸入下壹個學生的信息請輸入 1,否則輸入 0" << endl;

cin >> nTemp;

if ('0' == nTemp)

{

break;

}

pNode->SetNodeNext(pTemp); //讓鏈尾的Next指向新建的結點

pNode = pTemp; //將結尾元素向後移

}

cout << "創建鏈表結束" << endl;

}

LinkNode* CLinkList::GetListNode(int _nIndex)

{

cout << "這個是按位置查找指定位結點的成員函數" << endl;

LinkNode* pNode = m_Head->GetNodeNext(); //定義壹個臨時的結點指針,初始化指向頭結點

int Temp = 0; //定義壹個臨時的變量,用來標記已檢查結點的個數的

if(-1 == _nIndex) //返回頭結點(即頭指針)

{

return m_Head;

}

if(_nIndex < -1) //_nIndex控制條件

{

cout << "您輸入的是錯誤的位置!" << endl;

return 0;

}

while(pNode != NULL)

{

if(_nIndex == Temp)

{

return pNode;

}

pNode = pNode->GetNodeNext(); //臨時結點向後移動

++Temp;

}

return pNode; //沒找到結點就返回NULL

}

void CLinkList::ShowListData(int _nIndex);

void CLinkList::InsertList(int _nIndex) //插入結點的函數成員

{

cout << "這個是插入結點的成員函數" << endl;

LinkNode* pNode = GetListNode(_nIndex - 1); //定義壹個結點類的指針,指向的是要插入位置的前壹指針

LinkNode* pTemp = new CNode; //定義壹個臨時結點指針,用來增加新結點用

pTemp->SetNodeData(); //設置插入結點的內容

pTemp->SetNodeNext(pNode->GetNodeNext());

pNode->SetNodeNext(pTemp);

}

void CLinkList::DeleteList(int _nIndex)

{

cout << "這個是刪除某壹結點的成員函數" << endl;

LinkNode* pNode = GetListNode(_nIndex - 1); //定義壹個結點類的指針,指向的是要刪除位置的前壹指針

LinkNode* pTemp = NULL; //定義壹個臨時結點指針,用來指向要刪除的結點

pTemp =pNode->GetNodeNext(); //把pTemp指向要刪除的結點

pNode->SetNodeNext(pTemp->GetNodeNext()); //把pNode指向要刪除的結點的後壹個結點

delete pTemp; //刪除結點

pTemp = NULL;

}

LinkNode* CLinkList::GetHeadList()

{

cout << "這個是獲取頭指針的成員函數" << endl;

return m_Head;

}

void CLinkList::SetListData(int _nIndex)

{

cout << "這個是設置鏈表中某壹結點的值的成員函數" << endl;

CNode *pNode = GetListNode(_nIndex); //定義壹個結點類的指針,指向的是要修改內容位置的結點

pNode->SetNodeData(); //修改內容

}

void CLinkList::ShowListData(int _nIndex)

{

cout << "這個是顯示鏈表中某壹結點值的成員函數" << endl;

CNode *pNode = GetListNode(_nIndex); //定義壹個結點類的指針,指向的是要獲取內容位置的結點

pNode->ShowNodeData(); //返回想要得到位置的結點內容

}

void CLinkList::DestroyList(int _nIndex)

{

cout << "這個是銷毀某壹位置以後鏈表的成員函數" << endl;

LinkNode* pTemp = GetListNode(_nIndex - 1); //定義壹個結點指針,指向要銷毀位置的前壹結點

LinkNode* pNode = pTemp->GetNodeNext(); //定義壹個結點指針,指向要銷毀位置的結點

while(pTemp->GetNodeNext() != NULL) //銷毀動作的結束條件或初始條件

{

pTemp->SetNodeNext(pNode->GetNodeNext()); //把需要銷毀的位置的前結點的Next指向銷毀位置的下壹個結點

delete pNode; //銷毀結點

pNode = pTemp->GetNodeNext(); //把pNode重新指向要銷毀位置的結點

}

}

void CLinkList::ShowList()

{

cout << "這個是顯示鏈表的成員函數" << endl;

int nTemp = 0; //定義壹個臨時的整形變量用來控制輸入的個數

LinkNode* pTemp = m_Head->GetNodeNext(); //定義壹個結點類指針,指向第0位的結點

if(NULL == pTemp)

{

cout << "這是個空鏈" << endl;

}

while(pTemp != NULL)

{

pTemp->ShowNodeData();

++nTemp;

if(0 == nTemp % 5 && nTemp != 0) //控制每行只能輸出5個結點的內容

{

cout << endl;

}

pTemp = pTemp->GetNodeNext();

}

}

//class CNode

#include "CNode.h"

CNode::CNode() //構造函數

{

//m_stStudent = {0};

m_Next = NULL;

}

CNode::~CNode() //析構函數

{

}

void CNode::SetNodeData()

{

char* pNumber = new char[30]; //用來接收字符串的臨時變量

char* pName = new char[30];

char* pAppearance = new char[30];

cout << "學生學號: " << endl;

cin >> pNumber;

m_stStudent.m_strNumber = pNumber;

cout << "姓名: " << endl;

cin >> pName;

m_stStudent.m_strName = pName;

cout << "性別: " << endl;

cin >> m_stStudent.m_chSex;

cout << "出生年月: " << endl;

cout << "m_stData.m_nYear" << endl;

cin >> m_stStudent.m_stData.m_nYear;

cout << "m_stData.m_nMonth" << endl;

cin >> m_stStudent.m_stData.m_nMonth;

cout << "m_stData.m_nDay" << endl;

cin >> m_stStudent.m_stData.m_nDay;

cout << "政治面貌: " << endl;

cin >> pAppearance;

m_stStudent.m_strAppearance = pAppearance;

cout << "五門課成績: " << endl;

cout << "m_dSubject_1: " << endl;

cin >> m_stStudent.m_stResult.m_dSubject_1;

cout << "m_dSubject_2: " << endl;

cin >> m_stStudent.m_stResult.m_dSubject_2;

cout << "m_dSubject_3: " << endl;

cin >> m_stStudent.m_stResult.m_dSubject_3;

cout << "m_dSubject_4: " << endl;

cin >> m_stStudent.m_stResult.m_dSubject_4;

cout << "m_dSubject_5: " << endl;

cin >> m_stStudent.m_stResult.m_dSubject_5;

delete []pNumber; //釋放內存

pNumber = NULL; //指針置空

delete []pName; //釋放內存

pName = NULL;

delete []pAppearance; //釋放內存

pAppearance = NULL;

}

stStudent CNode::GetNodeData() //返回結點內容(即學生信息)

{

return m_stStudent;

}

void CNode::SetNodeNext(CNode* _Next)

{

m_Next = _Next;

}

void CNode::ShowNodeData()

{

const char* pNumber = m_stStudent.m_strNumber.c_str(); //用來接收字符串的臨時變量

const char* pName = m_stStudent.m_strNumber.c_str();

const char* pAppearance = m_stStudent.m_strAppearance.c_str();

cout << "學生學號: " << pNumber << '\t' << "姓名: " << pName << '\t' << "性別: " << m_stStudent.m_chSex;

cout << "出生年月: " << m_stStudent.m_stData.m_nYear << ',' << m_stStudent.m_stData.m_nMonth << ',' << m_stStudent.m_stData.m_nDay;

cout << "政治面貌: " << pAppearance << "五門課成績: " << endl;

cout << "m_dSubject_1: "<< m_stStudent.m_stResult.m_dSubject_1<< endl;

cout << "m_dSubject_2: "<< m_stStudent.m_stResult.m_dSubject_2<< endl;

cout << "m_dSubject_3: "<< m_stStudent.m_stResult.m_dSubject_3<< endl;

cout << "m_dSubject_4: "<< m_stStudent.m_stResult.m_dSubject_4<< endl;

cout << "m_dSubject_5: "<< m_stStudent.m_stResult.m_dSubject_5<< endl;

}

CNode* CNode::GetNodeNext()

{

return m_Next;

}

#include "CLinkList.h"

#include "CNode.h"

void Text(); //測試函數聲明

int main()

{

cout << "這是mian函數" << endl;

Text();

return 0;

}

void Text()

{

cout << "這個是測試函數" << endl;

LinkList* pList = new LinkList; //創建壹個內存鏈表對象

cout << "------------------CreateList-----------------------------" << endl;

pList->CreateList(); //初始化鏈表的函數成員

pList->ShowList();

cout << endl;

cout << "------------------GetListNode-----------------------------" << endl;

LinkNode* pNode = NULL; //定義壹個臨時的結點類指針用於檢測查找函數成員

pNode = pList->GetListNode(3); //按位置查找指定位結點的成員函數的測試

if(pNode)

{

cout << "用按位置查找的方法找到了指定位結點" << endl;

}

else

{

cout << "對不起,用按位置查找的方沒有找到指定位結點" << endl;

}

cout << endl;

cout << "------------------InsertList-----------------------------" << endl;

pList->InsertList(0); //插入結點的成員函數的測試

pList->ShowList();

cout << endl;

cout << "------------------DeleteList-----------------------------" << endl;

pList->DeleteList(0); //刪除某壹結點的成員函數的測試

pList->ShowList();

cout << endl;

cout << "------------------GetHeadList-----------------------------" << endl;

pNode = NULL;

pNode = pList->GetHeadList(); //獲取頭指針的成員函數的測試

if(pNode)

{

cout << "已經返回了頭指針" << endl;

}

else

{

cout << "對不起,頭指針為空" << endl;

}

cout << endl;

cout << "------------------GetHeadList-----------------------------" << endl;

pList->SetListData(3); //設置鏈表中某壹結點的值的成員函數的測試

pList->ShowList();

cout << endl;

cout << "------------------GetListData-----------------------------" << endl;

cout << "pList->ShowListData(3) =";

pList->ShowListData(3); //獲取鏈中某壹結點值的成員函數的測試

cout << endl;

cout << "------------------DestroyList(3)-----------------------------" << endl;

pList->DestroyList(3); //銷毀第3位置以後鏈表的成員函數的測試

pList->ShowList();

cout << endl;

cout << "------------------DestroyList(0)-----------------------------" << endl;

pList->DestroyList(0); //銷毀第0位置以後鏈表的成員函數的測試

pList->ShowList();

cout << endl;

delete pList; //釋放內存

pList = NULL; //指針置空

}

  • 上一篇:網頁跳轉頁面源代碼
  • 下一篇:周口wap源代碼
  • copyright 2024編程學習大全網