完成一條題目,記下來保存,以後有個參照,如他人覺得有用,轉載請註明出處,謝謝!
/*────────────────────────────────*/
/*修改日期: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人。甲隊爲A、B、C3人,乙隊爲X、Y、
Z3人。已抽籤決定比賽名單。有人向隊員打聽比賽的名單,A說他不和
X比,C說他不和X、Z比,請找出對賽手的名單。
*/
/*------------------------------------------------------------*/
/*例如:A說他不和X比,C說他不和X、Z比,初始化對陣表如下:
┌───────┐
│ 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
4.i有兩個以上的對手,表示對手還不確定,停止查找,跳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_sure是i的不確定對手數目*/
/*no_sure>=2,表示當前i肯定找不到對手,停止查找對手*/
for(j=0;j<NUM&&no_sure<2;j++)
{ if(ptr[i][j]==IMPOSSIBLE)/*j是i的不確定對手*/
{ no_sure++;/*i不一定和j相對,就使no_sure加*/
found_num=j;/*標記i最新的不確定對手*/
}/*if*/
}/*for*/
if(no_sure<2)/*因爲i的no_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;
}