C++实现学生选课系统

本文实例为大家分享了C++实现学生选课系统的具体代码,供大家参考,具体内容如下

#include <iostream>
#include <iomanip>
#include <fstream>
#include<Windows.h>
#include<cstring>
using namespace std;

struct SubList/*某个学生所学的课程中的某一个 */
{
 int num; /*课程代号 */
 SubList *next;  /*指向下一个课程的指针*/
 SubList() :num(-1), next(NULL){} /*构造函数*/
};
struct StuList /*课程中所选的学生*/
{
 int num;   /* 学生的学号*/
 float score;   /*学生所得的该课程分数*/
 StuList *next; /*下一个学生*/
 StuList() :num(-1), score(0), next(NULL){}
};
class Student
{
private:
 int Num;  /*学号*/
 char Name[20];    /*学生的姓名 */
 int MaxSubNum;   /*学生最多可以学五门课程 */
 int FactSubNum;   /* 学生实际所学的课程数目 */
 SubList *Root;   /*课程的指针*/
 float SumXueFen; /*总的选课学分*/
 float FactXueFen; /*实际获得学分*/
 float SumGrade; /*总成绩*/
 bool Update; /*是否需要更新信息*/
public:
 Student *next;/*让所有学生的信息连接起来*/
 SubList *GetSubPtr()const{ return Root; }/*获取所选的课程表*/
 Student() :Update(false), Root(new SubList()), FactXueFen(0), MaxSubNum(5), FactSubNum(0), SumXueFen(0), SumGrade(0),next(NULL){}
 void SetName(char N[]){ strcpy(Name, N); } /* 设置学生的姓名 */
 void SetNum(int num){ Num = num; } /*设置学号*/
 const char* GetName()const{ return Name; }/*得到学生的姓名 */
 int GetNum()const{ return Num; } /*得到学号*/
 int GetFactSubNum()const{ return FactSubNum; } /*得到实际选课数*/
 bool FindSub(int num)const;  /*查找是否已有此课程,如果有返回,如果没有返回 */
 void SetInfo(float sumXueFen, float factXueFen, float sumGrade)
 {
 SumXueFen = sumXueFen;/*这三条信息因为一起用 所以一起设置了*/
 FactXueFen = factXueFen;
 SumGrade = sumGrade;
 }
 void SetUpdate(bool t){ Update = t; }/*是否更新信息的标志*/
 float GetAveGrade(){ return SumGrade / FactSubNum; }  /*学生课程的平均成绩*/
 void AddSub(int num); /*增加课程*/
 bool IsFull()const{ return MaxSubNum == FactSubNum; }
 void ShowStuInfo(); /*输出学生信息*/
 void DelSub(int num); /*删除课程 Manage类使用*/
 ~Student()/*析构函数 不要也行影响不太大 一般程序,还不太会内存用完*/
 {
 SubList *p = Root;
 while (p)
 {
  SubList*t = p->next;
  delete p;
  p = t;
 }
 }
};
//课程类
class Subject
{
private:
 int MaxStuNum;  /*最多学生数*/
 int FactStuNum;  /*实际学生数*/
 float Credit;  /*该课程的学分 */
 char Name[20]; /* 该课程的名称 */
 int Num; /*课程的代号*/
 StuList *Root; /* 学生名单 */
 float AveGrade; /*该课程的平均成绩 */
 bool Update; /*是否更新信息*/
public:
 StuList *GetStuPtr()const{ return Root; }/*获取选此课程的学生表*/
 Subject*next;
 Subject() :Root(new StuList()), MaxStuNum(30), FactStuNum(0), Update(false),next(NULL){}
 float GetCredit()const{ return Credit; }  //得到课程的学分
 void SetCredit(float credit){ Credit = credit; } //设置学分
 const char* GetName()const{ return Name; } //读出课程的名称
 void SetName(char N[]){ strcpy(Name, N); } //设置课程的名称
 int GetNum()const{ return Num; } //读出课程的代号
 void SetNum(int num){ Num = num; } //设置课程的代号
 int GetFactStuNum()const{ return FactStuNum; } //返回实际学生数
 int GetMaxStuNum()const{ return MaxStuNum; }//最大学生数
 void SetUpdate(bool t){ Update = t; }
 void SetAveGrade(float num){ AveGrade = num/FactStuNum; } //设置平均分
 float GetAveGrade(){ return AveGrade; }  //得到学生的平均成绩
 float GetStuScore(int num); //查找某个学生的成绩
 bool IsFull()const{ return MaxStuNum == FactStuNum; }//是否人数已满
 void DelStu(int num);//删除学生
 void AddStu(int num);//增加学生
 ~Subject()
 {
 StuList *p = Root;
 while (p)
 {
  StuList*t = p->next;
  delete p;
  p = t;
 }
 }
};

float Subject::GetStuScore(int num)
{
 StuList*p = Root->next;
 while (p->num != num)
 p = p->next;
 return p->score;
}

void Student::ShowStuInfo()
{
 cout << Num << " " << Name << " " << "选课数:" << FactSubNum << endl;
 cout << "\t\t 总成绩" << SumGrade << " 平均分" << GetAveGrade() << endl;
 cout << "\t\t课程总学分" << SumXueFen << " 获得学分" << FactXueFen << endl;
 system("pause");
}

bool Student::FindSub(int num)const//查找是否已有此课程,如果有返回,如果没有返回
{
 bool t = false;
 SubList *p = Root->next;
 while (!t && p)
 {
 if (p->num == num)
  t = true;
 p = p->next;
 }
 return t;
}

void Student::AddSub(int num)//给学生增加一门课
{
 SubList *s = new SubList(), *p = Root;
 while (p->next)
 p = p->next;
 p->next = s;
 s->num = num;
 FactSubNum++;
 Update = true;
}

void Student::DelSub(int num)
{
 SubList*p = Root, *t;

 while (p->next->num != num)
 p = p->next;
 t = p->next;
 p->next = t->next;

 FactSubNum--;
 Update = true;
 delete t;
}
//////////////////////////Subject//////////////////////////////////
void Subject::AddStu(int num)//
{
 StuList *s = new StuList(), *p = Root;
 while (p->next)
 p = p->next;
 p->next = s;
 s->num = num;
 FactStuNum++;
 Update = true;
}

void Subject::DelStu(int num)
{
 StuList*p = Root, *t;

 while (p->next->num != num)
 p = p->next;
 t = p->next;
 p->next = t->next;

 FactStuNum--;
 Update = true;
 delete t;
}

//////////////////////////////////////////////////////////
class Manage
{
private:
 Student*StuRoot;
 Subject*SubRoot;
 bool Update;
public:
 Manage() :StuRoot(new Student()), SubRoot(new Subject()),Update(false){}
 Manage(const Manage&p){}
 void AddStu();
 void AddSub();

 Student*FindStu(int num);
 Subject*FindSub(int num);

 int ShowSub()const;//显示可选课程
 int ShowStu()const;
 void ShowStuSubInfo(Student*p);

 void DelStu(Student*p);
 void DelSub(Subject*p);

 void Start();
 int menu();
 int custom();
 int server();

 Student* password1();
 bool password2();

 void menu_1_1(Student*p);

 void menu_2_1();
 void menu_2_2();
 void menu_2_3();
 void menu_2_4();
 void menu_2_5();
 void menu_2_6();
 void menu_2_7();
 void menu_2_8();
 void menu_2_9();

 void IsUpdate()
 {
 if (Update == true)
 {
  Student*p = StuRoot->next;
  Subject*q = SubRoot->next;
  while (q)
  {
  float sum = 0;
  StuList *t =q->GetStuPtr()->next;
  while (t)
  {
   sum += t->score;
   t = t->next;
  }
  q->SetAveGrade(sum);
  q->SetUpdate(false);
  q = q->next;
  }
  while (p)
  {
  float sum = 0, xuefen = 0, xuefen1 = 0;
  SubList *t = p->GetSubPtr()->next;
  while (t)
  {
   Subject*tt = FindSub(t->num);
   xuefen += tt->GetCredit();

   float f = tt->GetStuScore(p->GetNum());
   sum += f;
   if (f>= 60)
   xuefen1 += tt->GetCredit();
   t = t->next;
  }
  p->SetInfo(xuefen, xuefen1, sum);
  p->SetUpdate(false);
  p= p->next;
  }
  Update = false;
 }
 }
};

void Manage::DelStu(Student*p)
{
 SubList *l = p->GetSubPtr()->next;
 while (l)
 {
 FindSub(l->num)->DelStu(p->GetNum());
 l = l->next;
 }

 Student*t = StuRoot;
 while (t->next != p)
 t = t->next;
 t->next = p->next;
 delete p;
 Update = true;
}

void Manage::DelSub(Subject*p)
{
 StuList *l = p->GetStuPtr()->next;
 while (l)
 {
 FindStu(l->num)->DelSub(p->GetNum());
 l = l->next;
 }

 Subject*t = SubRoot;
 while (t->next != p)
 t = t->next;
 t->next = p->next;
 delete p;
 Update = true;
}

int Manage::ShowSub()const
{
 Subject*p = SubRoot->next;
 int n = 0;
 while (p)
 {
 cout << p->GetNum() << " " << p->GetName() << " 学分:" << p->GetCredit() << endl;
 n++;
 p = p->next;
 }
 return n;
}

int Manage::ShowStu()const
{
 Student*p = StuRoot->next;
 int n = 0;
 while (p)
 {
 cout << p->GetNum() << " " << p->GetName() << endl;
 n++;
 p = p->next;
 }
 return n;
}

Student*Manage::FindStu(int num)
{
 Student*p = StuRoot->next;
 while (p)
 {
 if (p->GetNum() == num)
  break;
 p = p->next;
 }
 return p;
}

Subject*Manage::FindSub(int num)
{
 Subject*p = SubRoot->next;
 while (p)
 {
 if (p->GetNum() == num)
  break;
 p = p->next;
 }
 return p;
}

//总菜单
int Manage::menu()
{
 int k = 0, n;
 while (1)
 {
 system("cls");
 cout << endl << endl;
 cout << "*******************************************\n"
  << "*                     *\n"
  << "*       学生选修课系统       *\n"
  << "*                     *\n"
  << "*   操作方式:              *\n"
  << "*        1.选修课系统学生端    *\n"
  << "*                     *\n"
  << "*        2.选修课系统管理端    *\n"
  << "*        0. 退出          *\n"
  << "*******************************************\n"
  << endl;
 cout << "\n\t\t请选择登入方式: ";

 cin >> n;
 if (n > -1 && n < 3)
  return n;
 else
 {
  cerr << "\n\n\t\t\t\t输入有误!\n" << endl;
  k++;
 }
 if (k == 3)
 {
  cerr << "\n\n\n\t\t~~提示~~:错误输入次数超过三次,你将被强制退出!!\n\n" << endl;
  return 0;
 }
 system("pause");
 }
}

//选修课系统端操作
int Manage::custom()
{
 int n, k = 0;
 while (1)
 {
 system("cls");;
 cout << "\n\n\n" << "※※※※※※※※※※※※※※※※※※※※※※※※※※\n"
  << "※        选修课系统学生端        ※\n"
  << "※                        ※\n"
  << "※          操作方式:.         ※\n"
  << "※          1、 学生选课         ※\n"
  << "※          2、 学生情况         ※\n"
  << "※          3、 选课情况         ※\n"
  << "※          4、 退出系统         ※\n"
  << "※                        ※\n"
  << "※※※※※※※※※※※※※※※※※※※※※※※※※※\n" << endl;
 cout << "\t\t\t请选择操作方式: ";
 cin >> n;
 if (n > 0 && n < 5)
  return n;
 else
 {
  cerr << "\n\t\t\t\t输入有误!请重新输入\n" << endl;
  k++;
 }
 if (k == 3)
 {
  system("cls");
  cerr << "错误输入超过三次!你将被强制退出!!\n" << endl;
  return 4;
 }
 system("pause");
 }
}

int Manage::server()
{
 int n, k = 0;
 while (1)
 {
 system("cls");;
 cout << "\n\n\n" << "※※※※※※※※※※※※※※※※※※※※※※※※※\n"
  << "※                       ※\n"
  << "※         选修课系统管理端       ※\n"
  << "※                       ※\n"
  << "※  操作方式:                 ※\n"
  << "※      1.增加学生   2.增加课程     ※\n"
  << "※      3.删除学生   4.删除课程     ※\n"
  << "※      5.填写成绩   6.更改学分     ※\n"
  << "※      7.学生情况   8.选课情况     ※\n"
  << "※      9.保存数据   0.退出系统     ※\n"
  << "※                       ※\n"
  << "※※※※※※※※※※※※※※※※※※※※※※※※※\n" << endl;
 cout << "\t\t 请选择操作方式: " << endl;
 cin >> n;
 if (n > -1 && n < 10)
  return n;
 else
 {
  cerr << "\n\t\t\t\t输入有误!\n" << endl;
  k++;
 }
 if (k == 3)
 {
  cerr << "错误输入超过三次!\n";
  return 0;
 }
 system("pause");
 }
}

Student* Manage::password1()
{
 system("cls");
 int k = 0;
 int num;
 while (1)
 {
 cout << "请输入你的学号:" << endl;
 cin >> num;
 Student*p = FindStu(num);
 if (p == NULL)
 {
  cout << "无此学号!!请重新输入 " << endl;
  k++;
  system("pause");
 }
 else
 {
  cout << "你的名字为:" << p->GetName() << endl;
  cout << "请按任意键进入选课系统" << endl;
  return p;
 }
 if (k >= 3)
 {
  system("cls");
  cerr << "\n\n\t\t\t输入错误密码超过三次!请按任意键退出.." << endl;
  return NULL;
 }

 }
}
//密码检查
bool Manage::password2()
{
 int k = 0, i;
 const char A[] = "admin";
 char B[10];

 system("cls");
 for (i = 0; i < 8; i++)
 cout << endl;

 while (1)
 {
 printf("\t\t\t请输入管理员密码:");
 i = 0;
 cin >> B;
 if (strcmp(A, B) == 0)
  return true;
 else
 {
  k++;
  cerr << "\n\n\t\t\t密码输入错误!请重新输入!\n" << endl;
  system("pause");
 }
 if (k ==3)
 {
  system("cls");
  cerr << "\n\n\t\t\t输入错误密码超过三次!请按任意键退出.." << endl;
  return false;
 }
 }
}
void Manage::Start()
{
 int n = 1;
 while (n)
 {
 n = menu();
 if (n == 1)
 {
  Student*p = password1();
  while (p)
  {

  int c = custom();

  switch (c)
  {
  case 1: menu_1_1(p); break;//学生选课  

  case 2:p->ShowStuInfo(); break;//学生情况 

  case 3:ShowStuSubInfo(p);; break;//选课情况 

  }
  IsUpdate();
  if (c == 4) break;//退出系统
  }
  if (p == NULL)
  n = 0;
 }
 else if (n == 2)
 {
  bool t = password2();
  while (t)
  {
  int c = server();
  switch (c)
  {
  case 1:menu_2_1();  break;  //增加学生
  case 2:menu_2_2(); break;  //增加课程
  case 3: menu_2_3(); break;  //删除学生
  case 4:menu_2_4();  break;  //删除课程
  case 5: menu_2_5(); break;  //填写成绩
  case 6: menu_2_6(); break;  //更改学分
  case 7:menu_2_7();  break;  //学生情况
  case 8:menu_2_8();  break;  //选课情况
  case 9: menu_2_9(); break;  //保存数据
  }
  IsUpdate();
  if (c == 0)   break;  //退出系统
  }
  if (!t)
  n = 0;
 }
 }
}

//学生端功能函数
void Manage::menu_1_1(Student*p)  //学生选课
{
 if (p->IsFull())
 cout << "你的课程已经选满了" << endl;
 else
 {
 int num;
 if (ShowSub()==0)
  cout << "无课程可以选择" << endl;
 else
 {
  cout << "请输入你的选择" << endl;
  cin >> num;
  if (p->FindSub(num))
  cout << "此课程你已经选择" << endl;
  else if (FindSub(num)->IsFull())
  cout << "课程人数已满" << endl;
  else
  {
  p->AddSub(num);
  FindSub(num)->AddStu(p->GetNum());
  cout << "选课成功" << endl;
  }
 }
 }
 Update = true;
 system("pause");
}

void Manage::ShowStuSubInfo(Student*p)
{
 SubList*l = p->GetSubPtr()->next;
 cout << p->GetNum() << " " << p->GetName() << " 选课数" << p->GetFactSubNum() << endl;
 while (l)
 {
 Subject*s = FindSub(l->num);
 cout << "\t\t" << s->GetNum() << " " << s->GetName() << " " << s->GetCredit() << endl;
 float f = s->GetStuScore(p->GetNum());
 cout << "\t\t 成绩 " << f << endl;
 cout << "------------------------------" << endl;
 l = l->next;
 }
}

//管理端功能函数
void Manage::menu_2_1()  //增加学生
{
 system("cls");
 int num;
 char name[20];

 cout << "\n\n\t\t\t\t增加学生操作\n" << endl;

 cout << "\n\n\t\t请输入学生学号:";
 cin >> num;

 if (FindStu(num))
 cout << "学生已经存在" << endl;
 else
 {
 cout << "\n\n\t\t请输入学生姓名:";
 cin >> name;
 Student*p = new Student();
 p->SetNum(num);
 p->SetName(name);
 Student *root = StuRoot;
 while (root->next)
  root = root->next;
 root->next = p;
 cout << endl << "\t\t增加学生操作成功,按任意键继续" << endl;
 }
 system("pause");
}

void Manage::menu_2_2()  //增加课程
{
 system("cls");
 int num;
 float credit;
 char name[20];
 cout << "\n\n\t\t\t\t增加课程操作\n" << endl;
 cout << "\n\n\t\t 请输入课程代号:";
 cin >> num;
 if (FindSub(num))
 cout << "\n\t\t此课程已经存在,按任意键继续" << endl;
 else
 {
 cout << "\n\n\t\t请输入课程名:";
 cin >> name;
 cout << "请输入课程学分" << endl;
 cin >> credit;
 Subject*p = new Subject();
 p->SetNum(num);
 p->SetName(name);
 p->SetCredit(credit);
 Subject *root = SubRoot;
 while (root->next)
  root = root->next;
 root->next = p;
 cout << endl << "\t\t增加课程操作成功,按任意键继续" << endl;
 }
 system("pause");
}

void Manage::menu_2_3() //删除学生
{
 system("cls");
 cout << "\n\n\t\t\t\t删除学生操作" << endl;
 if (ShowStu()==0)
 cout << "无学生" << endl;
 else
 {
 int num;
 cout << "\n\t请输入要删除的学生代学号:";
 cin >> num;
 Student*p = FindStu(num);
 if (p == NULL)
  cout << "无此学生" << endl;
 else
 {
  DelStu(p);
  cout << "\n\t\t删除学生操作成功,按任意键继续.." << endl;
 }
 }
 system("pause");
}

void Manage::menu_2_4()  //删除课程
{
 system("cls");
 cout << "\n\n\t\t\t\t删除课程操作" << endl;
 if (ShowSub()==0)
 cout << "无课程" << endl;
 else
 {
 int num;
 cout << "\n\t请输入要删除的课程代号:";
 cin >> num;
 Subject*p = FindSub(num);
 if (p == NULL)
  cout << "无此课程" << endl;
 else
 {
  DelSub(p);
  cout << "\n\t\t删除课程操作成功,按任意键继续.." << endl;
 }
 }
 system("pause");
}

void Manage::menu_2_5()  //填写成绩
{
 system("cls");
 cout << "\n\n\t\t\t\t 填写成绩操作\n" << endl;

 if (ShowSub()==0)
 cout << "\n\n\n\t\t对不起,暂时没有任何选修课程。请按任意键继续.." << endl;
 else
 {
 int num;
 cout << "请选择课程代号" << endl;
 cin >> num;
 Subject*p = FindSub(num);
 if (p == NULL)
  cerr << "\n\t\t没有此课程!!请按任意键继续.." << endl;
 else
 {
  cout << p->GetNum() << " 课程名称" << p->GetName() << " 选课人数" << p->GetFactStuNum() << endl;
  int n;
  cout << "请输入1确认开始填写成绩,按其他键退出" << endl;
  cin >> n;
  if (n == 1)
  {
  StuList*q = p->GetStuPtr()->next;
  while (q)
  {
   Student*l = FindStu(q->num);
   cout << "\n\n\t\t请填写" << q->num << " " << l->GetName() << "的学生成绩\n" << endl;
   cin >> q->score;
   l->SetUpdate(true);
   q = q->next;
  }
  p->SetUpdate(true);
  }

 }
 }
 Update = true;
 system("pause");
}

void Manage::menu_2_6()  //更改学分
{
 system("cls");

 cout << "\n\n\n\t\t\t\t更改学分操作\n" << endl;
 if (ShowSub()==0)
 cout << "\n\n\n\t\t对不起,暂时没有任何课程。请按任意键继续.." << endl;
 else
 {
 int num;
 cout << "请选择课程代号" << endl;
 cin >> num;
 Subject*p = FindSub(num);
 if (p == NULL)
  cout << "无此课程" << endl;
 else
 {
  float n;
  cout << "\n\t\t\t原来学分为:" << p->GetCredit() << endl;
  cout << "\n\t\t\t现要更改为:";
  cin >> n;
  p->SetCredit(n);

  StuList*q = p->GetStuPtr()->next;
  while (q)
  {
  FindStu(q->num)->SetUpdate(true);
  q = q->next;
  }

  cout << "\n\t\t更改课程学分成功,按任意键继续" << endl;
 }
 }
 Update = true;
 system("pause");
}

void Manage::menu_2_7()
{
 Student *p = StuRoot->next;
 if (p == NULL)
 cout << "无记录" << endl;
 else
 while (p)
 {
  ShowStuSubInfo(p);
  p = p->next;
 }
 system("pause");
}

void Manage::menu_2_8()  //选课情况
{
 system("cls");
 cout << "\n\n\t\t\t\t选课情况操作" << endl;
 if (ShowSub()==0)
 cout << "\n\n\n\t\t对不起,暂时没有课程!!请按任意键继续.." << endl;
 else
 {
 int num;
 cout << "\n\t请输入要查看的课程代号:";
 cin >> num;

 Subject*p = FindSub(num);
 if (p == NULL)
  cout << "\n\t\t无此课程!!\t请按任意键继续.." << endl;
 else
 {
  cout << p->GetNum() << " " << p->GetName() << " " << p->GetCredit() << endl;
  cout << "\t\t最大人数:" << p->GetMaxStuNum() << " " << "实际人数" << p->GetFactStuNum() << endl;

  StuList*q = p->GetStuPtr()->next;
  while (q)
  {
  cout <<q->num << " " << FindStu(q->num)->GetName() << " " << q->score << endl;
  q = q->next;
  }
 }
 }
 system("pause");
}

 /*保存数据 不过没有读取函数 这个功能就没有 读取懒的写了... */
void Manage::menu_2_9()
{
 Student*p = StuRoot->next;
 ofstream o("Student.txt",32);
 ofstream oo("SubList.txt", 32);
 while (p)
 {
 SubList*t=p->GetSubPtr()->next;
 o.write(reinterpret_cast<char*>(p), sizeof(*p));
 while (t)
 {
  oo.write(reinterpret_cast<char*>(t), sizeof(*t));
  t = t->next;
 }
 p = p->next;
 }
 o.close();
 oo.close();

 Subject*q = SubRoot->next;
 o.open("Subject.txt", 32);
 oo.open("StuList.txt", 32);

 while (q)
 {
 StuList*t = q->GetStuPtr()->next;
 o.write(reinterpret_cast<char*>(q), sizeof(*q));
 while (t)
 {
  oo.write(reinterpret_cast<char*>(t), sizeof(*t));
  t = t->next;
 }
 q = q->next;
 }
 o.close();
 oo.close();
 cout << "\n\n\n\t\t\t保存数据成功!按任意键继续.." << endl;
 system("pause");
}

int main()
{
 Manage m;
 m.Start();
 return 0;
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • C++实践数组类运算的实现参考

    [项目-数组类运算的实现] 设计数组类Array,为了实现测试函数中要求的功能,请补足相关的函数(构造.析构函数)和运算符重载的函数. 实现策略提示:可以将测试函数中的语句加上注释,取消一句的注释,增加相应的函数,以渐增地实现所有的功能,避免全盘考虑带来的困难. class Array { private: int* list; //用于存放动态分配的数组内存首地址 int size; //数组大小(元素个数) public: //成员函数声明 }; //要求测试函数能够运行出正确.合理的结果:

  • C++面试基础之static关键字详解

    前言 static是 c++ 的关键字,顾名思义是表示静态的含义.它在 c++ 中既可以修饰变量也可以修饰函数.那当我们使用 static 时,编译器究竟做了哪些事情呢? 早先面试中被问到 static 关键字,感觉既熟悉又陌生.熟悉是都知道如何去使用它,陌生又来自不知道它究竟对我们程序做了什么.今天就来好好复习下这个关键字,本文的重点也在第三部分. 先看一下示例代码: test1.cpp #include <iostream> extern int a_int; extern void fu

  • C++稀疏矩阵的各种基本运算并实现加法乘法

    代码: #include <iostream> #include<malloc.h> #include<cstdio> using namespace std; #define M 4 #define N 4 #define MaxSize 100 typedef int ElemType; typedef struct { int r; int c; ElemType d;///元素值 } TupNode; ///三元组定义 typedef struct { int

  • 一张图总结C++中关于指针的那些事

    指向对象的指针,指向数据成员的指针,指向成员函数的指针: 数组即指针,数组的指针,指针数组: 指向函数的指针,指向类的成员函数的指针,指针作为函数参数,指针函数: 指针的指针,指向数组的指针:常指针,指向常对象的指针: -- 大哥,这些都是什么鬼?! 用下面一张图全概括.用例子对照图示,有感觉,就用术语将概念大声地念出来,动员所有的感官参与,搞清楚这些,不是事. 图如下: 总结 以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对我们的支持.如果你想

  • Dijkstra算法最短路径的C++实现与输出路径

    某个源点到其余各顶点的最短路径 这个算法最开始心里怕怕的,不知道为什么,花了好长时间弄懂了,也写了一遍,又遇到时还是出错了,今天再次写它,心里没那么怕了,耐心研究,懂了之后会好开心的,哈哈 Dijkstra算法: 图G 如图:若要求从顶点1到其余各顶点的最短路径,该咋求: 迪杰斯特拉提出"按最短路径长度递增的次序"产生最短路径. 首先,在所有的这些最短路径中,长度最短的这条路径必定只有一条弧,且它的权值是从源点出发的所有弧上权的最小值,例如:在图G中,从源点1出发有3条弧,其中以弧(1

  • C++实践数组作数据成员的参考

    [项目 - 数组作数据成员]下面是设计好的一个工资类(Salary): class Salary { public: void set_salarys( );//输入职工工资(输入-1标志着工资输入结束),工资保存到salary数组中,实际人数保存到number中: void add_salarys(int x); //给每个人涨x元工资 void sort_salarys(); //对工资由大到小排序 void show_salarys( ); //显示工资信息 private: double

  • 递归删除二叉树中以x为根的子树

    名称:删除二叉树中以x为根的子树 说明:此程序的大部分内容,注释都解释的较为详细了.在这里需要提及一点的是此处递归函数flag传递的不是上篇中讲的引用,而是普通的变量,因为在向下传递参数(当前结点是否是x的信息)的过程中只要传递给对应的子树,并不需要传递给整个树的结点.在下一篇会做个关于递归传递参数的总结. //递归删除二叉树中以x为根的子树,(flag为标志) int DelRoot_x(BiTree &T, int x,int flag) { if(T == NULL) return 0;

  • C++/JAVA/C#子类调用父类函数情况总结

    时间久了就容易记不清了,特留存备用查看 c++ 1.构造函数调用   常用初始化列表  或者显示调用 1.1同一个类中构造函数调用构造函数   尽量不要这样做,因为结果不确定!避免麻烦 可以把共用的代码封装成一个私有的成员函数,然后在构造函数内统一调用. 1.2子类构造函数调用基类构造函数 -----基类有默认构造函数时,可以在子类不写,则隐式调用 -----基类无/有默认构造函数时,在子类构造函数初始化列表处调用,则显示调用     基类类名(参数) class Base { public:

  • C++实践分数类中运算符重载的方法参考

    [项目-分数类中的运算符重载] (1)实现分数类中的运算符重载,在分数类中可以完成分数的加减乘除(运算后再化简).比较(6种关系)的运算. class CFraction { private: int nume; // 分子 int deno; // 分母 public: //构造函数及运算符重载的函数声明 }; //重载函数的实现及用于测试的main()函数 (2)在(1)的基础上,实现分数类中的对象和整型数的四则运算.分数类中的对象可以和整型数进行四则运算,且运算符合交换律.例如:CFrac

  • C++项目求Fibonacci数列的参考解答

    [项目:求Fibonacci数列] Fibonacci数列在计算科学.经济学等领域中广泛使用,其特点是:第一.二个数是1,从第3个数开始,每个数是其前两个数之和.据此,这个数列为:1 1 2 3 5 8 13 21 34 55 89 --,请设计程序,输出这个数列,直到这个数字超过10000. [提示]数列可以表示为: [参考解答] #include <iostream> using namespace std; int main( ) { int f1,f2,fn,n; f1=f2=1; n

随机推荐