天天看點

第二次結對程式設計作業——畢業導師智能比對

結對程式設計人員: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 1 2 0.3

編碼感想 👍

  • 好久沒有打那麼多的代碼了!!!綜合了接近一個星期的結對程式設計= =隻是感覺到,學計算機的,代碼早晚都是要打的。又重溫了C++,對于低分飄的我來說,應該是重新學習, 不是溫習,類的構造函數也是改了好多遍= =,算法的循環也是動不動就懵逼,還有怪我不好好學資料結構、C、C++(手動再見),報應啊~~!
  • 看上面的效能分析,好多時間都做了無用功,是以說,以後寫關于算法的問題,還是用自己較為熟悉的語言吧= =
  • 這次的編碼比較失敗,因為沒有用到高效的算法,而是暴力循環求解,= =雖然說很簡單,但是還是編了改,改了編,隊友有時候也get不到錯誤的點,尤其是邏輯錯誤。
  • 兩個程式設計渣渣,到底是什麼勇氣使2個渣渣組成一隊的。不過還好我沒有放棄(微笑臉)。
  • 走上路通宵打代碼的不歸路……(應該是改代碼)

結對感受

031402140李嚴:

  • 旁邊有一個人看着,可以克制住自己,不會動不動就拿起身邊的零食吃起來,并且吃個沒完。可以專心地打代碼
  • 當自己的代碼出現邏輯性錯誤時,隊友可以在一旁提醒
  • 連續程式設計的時間更長
  • 糾正隊友代碼不規範的地方,為日後的檢視提供便利
  • 與隊友沒有很好地溝通與交流,以至于到了中途換語言的地步,沒有計劃好

031402617林瑞斌

  • 首先,覺得自己很懶,感覺好多事情都是隊友做的,自己也隻是做了那麼一點點,不知道隊友有沒有一種想把我打死的沖動=-=。感覺好多東西還是不會,都要上百度去查。講道理還是自己以前基礎沒打好。還好有一個好隊友,總是不厭其煩的教我怎麼做怎麼做。。。恩~~~ .下次要更加努力的做好自己的工作~~~

分享:

  • 手把手教你用git

Coding.net上的代碼

  • 我是代碼,還有不足,請多指教!