《C程序設計》_(第二版)_譚浩強著_P121_6.15題目解答

 

 

完成一條題目,記下來保存,以後有個參照,如他人覺得有用,轉載請註明出處,謝謝!

 

 

 

/*────────────────────────────────*/

/*修改日期:2008-05-10-11:26

  修改主要變化:寫原程序

  狀態:完成調試

  環境:turboc2

  修改人:heshanxingzhe

  注:二維數組作爲形參用int (*ptr)[NUM+1],不是**ptr,否則會對數組

      元素沒什麼影響

*/

/*────────────────────────────────*/

 

 

 

 

/*────────────────────────────────*/

/*修改日期:2008-05-06-23:41

  修改主要變化:寫原程序

  狀態:未完成原程序

  環境:turboc2

  修改人:heshanxingzhe

  注:由於明天點半要起來上班,只能完成到現在,主要四個程序

      static init_table(**ptr);初始化對手錶

      static int search(**ptr,i);查找選手i有沒有對手,有返回TRUE,

                                  還沒有返回FALSE

      static note_man(**ptr,i,found_num);標記選手found_man有了對手i

*/

/*────────────────────────────────*/

 

 

 

 

/*--------------------------題目------------------------------*/

/*C程序設計》(第二版),譚浩強著,P121,6.15

   兩個乒乓球對進行比賽,各出3人。甲隊爲ABC3人,乙隊爲XY

   Z3人。已抽籤決定比賽名單。有人向隊員打聽比賽的名單,A說他不和

   X比,C說他不和XZ比,請找出對賽手的名單。

*/

/*------------------------------------------------------------*/

/*例如:A說他不和X比,C說他不和XZ比,初始化對陣表如下:

     ┌───────┐

       X   Y   Z   

     A NO  IM  IM 

     B IM  IM  IM 

     C NO  IM  NO 

     └───────┘

*/

/*算法步驟如下:

  1++i,如果i>賽手數NUM,則i=0;且已找到的場次race_number++

     如果race_num>NUM,跳5,否則下一步

  2.查找i的對手,i是否有唯一的對手,是下一步,否跳4

  3.標記i已找到了對手j,同時標記j也找到了對手,跳1

  4i有兩個以上的對手,表示對手還不確定,停止查找,跳1

  5.查找完畢,打印名單

*/

 

#include <stdio.h>

 

#define NUM 3

#define FALSE 0

#define TRUE 1

#define NO 2/*表示兩選手不會相對*/

#define IMPOSSIBLE 3/*表示兩選手可能會相對*/

#define HAVE_MAN 4/*表示選手i已經確定了對手*/

#define NO_HAVE_MAN 5/*表示選手i還沒有確定對手*/

int table[NUM][NUM+1];

init_table(int (*ptr)[]);

int search(int (*ptr)[],int i);

note_man(int (*ptr)[],int i,int found_num);

 

/****************************************************************/

/*************************int main()*****************************/

int main()

{  int i=0;

   int race_number=0;  /*標記已找到多少場比賽*/

   /*初始化對陣表*/

   init_table(table);

   /*讀入對陣表或條件,這裏只有三個條件*/

   table[0][0]=NO;

   table[2][0]=NO;

   table[2][2]=NO;

   printf("/n   ");

   /*爲甲隊查找對手,甲隊爲一維下標*/

   i=0;/*這條語句不能忘*/

   while(race_number<NUM)/*the number of the race have been found.*/

   {  if(search(table,i)==TRUE)race_number++;

      if((++i)>=NUM)i=0;/*注意是++i*/

   }/*while*/

   printf("/n");

   for(i=0;i<NUM;i++)

     printf("----%d----/n",table[i][NUM]);

   return 0;

}

 

/****************************************************************/

/******************init_table(int (*ptr)[NUM+1])*****************/

/*功能:初始化二維對陣表*/

/*輸入:指向數組的指針ptr,即爲二維表名

  輸出:已初始化的表

  修改日期:080510-heshanxingzhe

            080506-heshanxignzhe

  注:調試以前,形參是**ptr,這就造成了二維數組的引用錯誤,在傳遞實參

      後,沒有實際改到二維數組的值,雖然在爲ptr[i][j]賦值是沒出現錯,

      但結果卻沒影響到實參

*/

/*初始化對陣表*/

/*例如:

   X   Y   Z    FLAG

A IM  IM  IM   NO_HAVE_MAN

B IM  IM  IM   NO_HAVE_MAN

C IM  IM  IM   NO_HAVE_MAN

*/

static init_table(int (*ptr)[NUM+1])

{  int i,j;

   for(i=0;i<NUM;i++)

     for(j=0;j<NUM;j++)

       ptr[i][j]=IMPOSSIBLE;

   for(i=0;i<NUM;i++)

     ptr[i][NUM]=NO_HAVE_MAN;

}

 

 

/****************************************************************/

/**************int search(int (*ptr)[NUM+1],int i)***************/

/*功能:在二維數組對陣表中查找選手i有沒有對手*/

/*輸入:指向數組的指針ptr,即爲二維表名

  輸出:返回TRUE,找到對手,同時標記i已經有了對手,i的對手j也找到

                  了對手,並打印;

        返回FALSE,沒有找到對手

  修改日期:080510-heshanxingzhe

            080506-heshanxignzhe

  注:二維數組作爲形參用int (*ptr)[NUM+1]

*/

int search(int (*ptr)[NUM+1],int i)

{  int j;

   int found_num;

   int no_sure=0;/*no_surei的不確定對手數目*/

   /*no_sure>=2,表示當前i肯定找不到對手,停止查找對手*/

   for(j=0;j<NUM&&no_sure<2;j++)

   {  if(ptr[i][j]==IMPOSSIBLE)/*ji的不確定對手*/

      {  no_sure++;/*i不一定和j相對,就使no_sure*/

         found_num=j;/*標記i最新的不確定對手*/

      }/*if*/

   }/*for*/

   if(no_sure<2)/*因爲ino_sure爲,此時肯定找到了對手*/

   {  ptr[i][NUM]=HAVE_MAN;/*標記i已經有了對手*/

      note_man(ptr,i,found_num);/*標記選手found_num已經有了對手i*/

      printf("%d : %d/n   ",i,found_num);/*打印對陣表*/

      return TRUE;

   }/*if*/

   return FALSE;

}

 

/****************************************************************/

/******************note_man(**ptr,i,found_num)*******************/

/*功能:標記選手found_num已經有了對手i*/

/*輸入:ptr,二維對陣表

        i,行號(選手名)

        found_num,列號(選手i的對手名)

  輸出:整列found_num一列(ptr[i][found_num])全爲NO

  修改日期:080510-heshanxingzhe

            080506-heshanxignzhe

  注:二維數組作爲形參,用int (*ptr)[NUM+1]

*/

note_man(int (*ptr)[NUM+1],int i,int found_num)

{  int j;

   for(j=0;j<NUM;j++)

      if((ptr[j][found_num]==IMPOSSIBLE)&&(j!=i))

         ptr[j][found_num]=NO;

}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章