结对编程

结对编程人员:031402140 李严 0314026617 林瑞斌

需求分析与原型设计


问题描述

  • 编码实现一个毕设导师的智能匹配的程序。提供输入包括:30个老师(包含带学生数的要求的上限,单个数值,在[0,8]内),100个学生(包含绩点信息),每个学生有5个导师志愿(志愿的导师可以重复但不能空缺)。实现一个智能自动分配算法,根据输入信息,输出导师和学生间的匹配信息(一个学生只能有一个确认导师,一个导师可以带少于等于其要求的学生数的学生)
    及 未被分配到学生的导师 和 未被导师选中的学生。

问题分析

编程前的问题

  • 要采用什么语言来写?
  • 数据输入要采用数据库还是txt?
  • 为智能匹配算法确立哪些分配或排序原则?
  • 5个志愿到底是平行志愿,还是有先后顺序?
  • 万一只填了1个老师怎么办?
  • 随机生成的数据,是不是不太符合我们现实的情况?
  • 算法的目标没中选的学生人数越少越好?

经过线上和线下的商讨后:

  • 编程语言:PHP
  • 数据输入输出:数据库与excel交互
  • 随机生成数据:对随机生成的数据进行了约束,尽量不偏离现实
  • 志愿顺序的关系:平行志愿,五个志愿平等
  • 算法目标:让更多的学生选到自己志愿里面的老师

最终实现

  • 编程语言:C/C++
  • 数据输入输出:文本TXT的形式
  • 随机生成数据:对随机生成的数据进行了约束,尽量不偏离现实
  • 志愿顺序的关系:平行志愿,五个志愿平等
  • 算法目标:让更多的学生选到自己志愿里面的老师

功能实现策略

数据的生成

对于随机数的生成,添加了一定的局限性,使其更加贴近生活

     char* path = "D:\\data.txt"; // 你要创建文件的路径
ofstream fout( path );
if ( fout ) { // 如果创建成功
    
      for(int y=0;y<100;y++)
     {
     	fout<<y<<" ";//学生编号 
     	//cout<<y<<" ";
     	for(int x=0;x<5;x++)
      {
     	// printf("%d  ",random(29));//老师编号 
     	 fout << random(29)<<"  ";
      }
      fout<<endl;
     }
      fout.close();  // 执行完操作后关闭文件句柄
}

基本数据结构

class Choose
{
public:
	int stu_id;
	int tea_id1;
	int tea_id2;
	int tea_id3;
	int tea_id4;
	int tea_id5;
};
class Student
{
public:
	int stu_id;
	string stu_name;
	float jidian;
	int judge;
};
class Teacher
{
public:
	int tea_id;
	
	int max;//限定所带的学生数 4-6
	int num;//选择老师的学生数目
	int ids[stu_num];//选择老师学生的编号 
	string tea_name;
	Teacher()
	{
		/*delete int*/ num = 0;
		/*delete int  ids[stu_num] = { 0 }*/
		for (int i = 0; i < stu_num; i++) ids[i] = 0;
	}

};

class Bingo
{

public:
	int tea_id;
	int stu_id[6];
};

数据的读取

	{ ifstream in("D:\\stu.txt");//学生资料 
	//读数据。。
	for (int i = 0; i < stu_num; ++i){
		in >> stu[i].stu_id;
		in >> stu[i].jidian;

	}
	in.close();//关闭文件
	}

	/* for(int i = 0; i < 100; ++i){
	cout<<i<<" "<<stu[i].stu_id<<"   "<<stu[i].jidian<<endl;

	// cout<<endl;
	}*/
	{
	}
  { ifstream in("D:\\tea.txt");//老师资料 
  //读数据。。
  for (int i = 0; i < tea_num; ++i){
	  in >> tea[i].tea_id;
	  in >> tea[i].max;
  }
  in.close();//关闭文件
  }
  /* for(int i = 0; i < 30; ++i){
  cout<<i<<" "<<tea[i].tea_id<<"   "<<tea[i].max<<endl;

  // cout<<endl;
  }*/

  ifstream in("D:\\data.txt");//选课资料 
 
  for (int i = 0; i < 100; ++i){//将数据传输到选择类中 
	  in >> choo[i].stu_id;
	  in >> choo[i].tea_id1;
	  in >> choo[i].tea_id2;
	  in >> choo[i].tea_id3;
	  in >> choo[i].tea_id4;
	  in >> choo[i].tea_id5;

  }

暴力循环

1.遍历学生选择导师的信息并记录下老师被选择数以及选择该老师的学生编码

 for (s = 0; s<tea_num; s++)//所选学生绩点排序 
  {
	  for (j = 0; j<tea[s].num; j++)
	  {
		  for (i = 0; i<tea[s].num - j; i++)
		  {
			  if (stu[tea[s].ids[i]].jidian<stu[tea[s].ids[i + 1]].jidian)
			  {
				  k = stu[tea[s].ids[i]].jidian;
				  stu[tea[s].ids[i]].jidian = stu[tea[s].ids[i + 1]].jidian;
				  stu[tea[s].ids[i + 1]].jidian = k;
			  }
		  }
	  }
  }

2.将老师的类数组按老师被选择数的升序排列

 Teacher tmp;
  int mini;
  for (int delta = tea_num / 2; delta>0; delta /= 2)  //利用shell  sorting将选择老师的学生数升序排列 
  {
	  for (int i = 0; i<delta; i++)
	  {
		  for (int j = i; j < tea_num - delta; j += delta)
		  {
			  mini = j;
			  for (int k = j+delta; k < tea_num; k += delta){
				  if (tea[mini].num > tea[k].num){
					  mini = k;
				  }
			  }
			  if (mini != j)
			  {
				  tmp = tea[mini];
				  tea[mini] = tea[j];
				  tea[j] = tmp;
			  }
		  }
	  }
  }

3.将选择同一老师的学生编号按照绩点降序排列


  int i, j, s;
  float k;
  for (s = 0; s<tea_num; s++)//所选学生绩点排序 
  {
	  for (j = 0; j<tea[s].num; j++)
	  {
		  for (i = 0; i<tea[s].num - j; i++)
		  {
			  if (stu[tea[s].ids[i]].jidian<stu[tea[s].ids[i + 1]].jidian)
			  {
				  k = stu[tea[s].ids[i]].jidian;
				  stu[tea[s].ids[i]].jidian = stu[tea[s].ids[i + 1]].jidian;
				  stu[tea[s].ids[i + 1]].jidian = k;
			  }
		  }
	  }
  }

4.取选择老师的学生数和老师所带学生最大数的最小值,用来决定老师所带的学生数并输出

 int test[stu_num]; 
 for(i=0;i<tea_num;i++)
 {
 	bin[i].tea_id=i;
 	int d=0,c;
 	 	for(j=0;j<min(tea[i].max,tea[i].num);j++)
 	 	{
 	 		c=tea[i].ids[j];
 	 		if(stu[c].judge==0)
 	 		{
 	 			bin[i].stu_id[d]=c;
 	 			stu[c].judge=1;
 	 			d++;
 	 		}
 	 	}
 }
  char* path = "D:\\bingo.txt"; // 生成分配完成的文件 
   ofstream fout( path );
  if ( fout ) { // 如果创建成功    
      for(int y=0;y<30;y++)
     {
     	fout<<bin[y].tea_id<<" ";//老师编号 ";
     	for(int x=0;x<6;x++)
      {//学生编号 
     	 fout << bin[y].stu_id[x]<<"  ";
      }
      fout<<endl;
     }
      fout.close();  // 执行完操作后关闭文件句柄
}


效能分析

内容 商讨解决方案 搜索各类算法+确定方案 git的使用 PHP的温习 用PHP编程 PHP编程修改 改为用c/c++c/c+编程 测试 markdown的使用+文档
时间(day) 0.2 0.5 0.5 1 2 1 1 0.5 0.3

编码感想 👍

  • 好久没有打那么多的代码了!!!综合了接近一个星期的结对编程= =只是感觉到,学计算机的,代码早晚都是要打的。又重温了C++,对于低分飘的我来说,应该是重新学习, 不是温习,类的构造函数也是改了好多遍= =,算法的循环也是动不动就懵逼,还有怪我不好好学数据结构、C、C++(手动再见),报应啊~~!
  • 看上面的效能分析,好多时间都做了无用功,所以说,以后写关于算法的问题,还是用自己较为熟悉的语言吧= =
  • 这次的编码比较失败,因为没有用到高效的算法,而是暴力循环求解,= =虽然说很简单,但是还是编了改,改了编,队友有时候也get不到错误的点,尤其是逻辑错误。
  • 两个编程渣渣,到底是什么勇气使2个渣渣组成一队的。不过还好我没有放弃(微笑脸)。
  • 走上路通宵打代码的不归路……(应该是改代码)

结对感受

031402140李严:

  • 旁边有一个人看着,可以克制住自己,不会动不动就拿起身边的零食吃起来,并且吃个没完。可以专心地打代码
  • 当自己的代码出现逻辑性错误时,队友可以在一旁提醒
  • 连续编程的时间更长
  • 纠正队友代码不规范的地方,为日后的查看提供便利
  • 与队友没有很好地沟通与交流,以至于到了中途换语言的地步,没有计划好

031402617林瑞斌

  • 首先,觉得自己很懒,感觉好多事情都是队友做的,自己也只是做了那么一点点,不知道队友有没有一种想把我打死的冲动=-=。感觉好多东西还是不会,都要上百度去查。讲道理还是自己以前基础没打好。还好有一个好队友,总是不厌其烦的教我怎么做怎么做。。。恩~~~ .下次要更加努力的做好自己的工作~~~

分享:


Coding.net上的代码

posted @ 2016-09-30 22:01  鱼~  阅读(198)  评论(1编辑  收藏  举报