【C++语言程序设计上机实践报告4】 程序设计c语言答案

 创建者:沉默信使

 《C++语言程序设计Ⅱ》上机实践报告

 项目名称

 结构体类型的应用

 上机时间

 2019.4.4

 任课老师

 xxx

 学院

 计算机科学与技术学院

 专业班级

 姓名

 学号

  上机内容

 问题描述

 使用菜单形式进行学生成绩管理(三门以上),使用动态链表完成结构化程序设计并完成以下功能。

 a.设计学生结构体

 b.成绩信息的输入

 c.成绩的计算

 d.成绩的排序

 e.成绩信息的输出

 f更新学生管理系统(根据用户输入学号更新记录,若更新成功,则给出提示,否则将新纪录插入到末尾,并修改数组长度)

 g.查找(可以使用结构体指针的方式,找到后输出查找结果,否则提示未找到)

  eq \o\ac(○,1)系统函数设计及函数流程

  eq \o\ac(○,2)详细代码和说明

 #include <iostream>

 #include <string>

 #include<iomanip>

 using namespace std;

 struct Student

 {

  float number;

  string name;

  int score[5];

  struct Student *next;

 };

 int n; //定义n为全局变量,本文件中各个函数均可使用

 Student *head;

 Student* creat()

 {

  Student *p1, *p2;

  p1 = p2 = new Student;

  head = NULL;

  cout << "当输入的学号为0时表示学生信息输入结束" << endl;

  cout << "输入学生的学号,名字和两门成绩" << endl;

  cin >> p1->number >> p1->name >> p1->score[0] >> p1->score[1];

  p1->score[2] = (p1->score[0] + p1->score[1]) / 2;

  n = 0;

  while (p1->number != 0)

  {

  n = n + 1;

  if (n == 1)

  head = p1;

  else

  p2->next = p1;

  p2 = p1;

  p1 = new Student;

  //cout << "继续输入" << endl;

  cin >> p1->number >> p1->name >> p1->score[0] >> p1->score[1];

  p1->score[2] = (p1->score[0] + p1->score[1]) / 2;

  }

  p2->next = NULL;

  return head;

 }

 int main()

 {

  Student* creat();

  void output(Student*);

  void menu();

  void update(Student*head);

  void find(Student*head);

  int x;

  head = NULL;

  do

  {

  menu();

  cout << "enter your choice" << endl;

  cin >> x;

  switch (x)

  {

  case 1:head = creat(); break;

  case 2: output(head); break;

  case 3:update(head); break;

  case 4: find(head); break;

  }

  cout << endl;

  continue;

  } while (x != 0);

  return 0;

 }

 void menu()

 {

  cout << "Welcome to the Student achievement management system with the dynamic linked list" << endl;

  cout << "输入1进行输入 输入2进行输出" << endl;

  cout << "输入3进行成绩更新 输入4进行查找" << endl;

  cout << "系统将自动进行计算平均分和排名,结果将用输出功能显示"<<endl;

  cout << "当输入和更新时输入的学号有误时自动退出函数返回主菜单" << endl;

  cout << "——操作结束自动返回本菜单——" << endl;

 }

 void output(Student*head)

 {

  int x1,x2 = 0;

  Student studenty;

  Student*p = head;

  do

  {

  x2++;

  p = head;

  while (p != NULL)

  {

  for (x1 = 0; x1 < n + 1; x1++)

  {

  if (p->next != NULL)

  {

  if (p->score[2] < p->next->score[2])

  {

  studenty.name = p->name;

  studenty.number = p->number;

  studenty.score[0] = p->score[0];

  studenty.score[1] = p->score[1];

  studenty.score[2] = p->score[2];

  studenty.next = p->next->next;

  p->name = p->next->name;

  p->number = p->next->number;

  p->score[0] = p->next->score[0];

  p->score[1] = p->next->score[1];

  p->score[2] = p->next->score[2];

  p->next = new Student;

  p->next->name = studenty.name;

  p->next->number = studenty.number;

  p->next->score[0] = studenty.score[0];

  p->next->score[1] = studenty.score[1];

  p->next->score[2] = studenty.score[2];

  p->next->next = studenty.next;

  }

  }

  }

  p = p->next;

  }

  } while (x2 < n);

  p = head;

  cout << "number name Ascore Bscore average" << endl;

  while (p != NULL)

  {

  cout << p->number << " " << p->name << " " << p->score[0] << " " << p->score[1] << " " << p->score[2] << endl;

  p = p->next;

  }

 }

 void find(Student*head)

 {

  cout << "进入查找函数" << endl;

  cout << "请输入您所查找的学生学号" << endl;

  float numberx;

  cin >> numberx;

  Student*p = head;

  while (p != NULL)

  {

  if (p->number == numberx)

  {

  cout << "已找到您所查询的学生信息:" << endl;

  cout << "number name Ascore Bscore average" << endl;

  cout << p->number << " " << p->name << " " << p->score[0] << " " << p->score[1] << " " << p->score[2] << endl;

  }

  p = p->next;

  }

 }

 void update(Student*head)

 {

  cout << "进入更新函数" << endl;

  cout << "请输入您所更新的学生学号" << endl;

  float numberx;

  cin >> numberx;

  Student*p = head;

  while (p != NULL)

  {

  if (p->number == numberx)

  {

  cout << "请输入新的学生信息" << endl;

  cin >> p->number >> p->name >> p->score[0] >> p->score[1];

  p->score[2] = (p->score[0] + p->score[1]) / 2;

  cout << "以下为更新后的学生信息" << endl;

  cout << p->number << " " << p->name << " " << p->score[0] << " " << p->score[1] << " " << p->score[2] << endl;

  }

  p = p->next;

  }

 }

  eq \o\ac(○,3)测试数据

  eq \o\ac(○,4)运行结果

 

 上机实践总结

 血的教训,智障WPS把我上次做的心得体会不知道保存哪里了

 以后每次做完报告,一定要在桌面保存一个版本

 还有

 这次动态链表的程序

 大概是做的最认真的一次

 因为实在是一点也不会就非常认真的尝试

 1学号定义成浮点后如果输入的太长会自动转换成一个奇怪的表示方法

 2名字不再定义成字符数组而是定义成字符串,感觉方便

 3成绩定义一维数组节省空间

 4动态链表的创建函数得多观摩,理解

 5更加理解指针,并且会用了

 6在动态链表的排序里

 最微妙最艰难的就是循环的控制,我用了三个循环两个判断,

 一开始我把两个for挨着写,然后在执行的时候就发现退不出去循环

 (我用一个输出的测试代码发现一直在循环输出)

 多次修改无果就把外层的for写在while外面

 结果神奇的成功了。。。

 Q1在一个cpp里是只能有一个头指针吗

 我想尝试着定义head1,head2结果发现不能

推荐访问:上机 实践 语言程序设计 报告