大一初學指針第一天,做一下課後習題。(《C程式設計 第五版》 譚浩強 第八章第5題) 具體題目如標題所示,我首先想到用數組表示n個人,首先將前n位初始化為1,迴圈報數退出第3位,退出的用0表示,只剩最後一個人時輸出他的位數。 在迴圈中,有這幾點需要考慮: 1. 數到第三位時,將0賦給指針指向的數組元 ...
大一初學指針第一天,做一下課後習題。(《C程式設計 第五版》 譚浩強 第八章第5題)
具體題目如標題所示,我首先想到用數組表示n個人,首先將前n位初始化為1,迴圈報數退出第3位,退出的用0表示,只剩最後一個人時輸出他的位數。
在迴圈中,有這幾點需要考慮:
1. 數到第三位時,將0賦給指針指向的數組元素。
2. 指針應跳過0。
3. 指針指向最後一位後應重置到首位前。
於是有代碼如下:
1 #include <stdio.h> 2 #include <stdlib.h> 3 #define SIZE 1024 //最大判斷人數 4 int main(){ 5 int numberLast,peopleNum,peopleExist[SIZE]={0},i; 6 int * firstPtr, * movePtr; //firstPtr指向判斷數組PeopleExist的首位 7 8 puts("Enter the number of people."); 9 scanf("%d",&peopleNum); 10 11 movePtr=firstPtr=peopleExist; 12 numberLast=peopleNum; 13 //人員存在判斷初始化 14 for(i=0;i<peopleNum;i++,movePtr++){ 15 *movePtr=1; 16 } 17 18 movePtr=firstPtr; 19 20 while(1){ 21 for(i=1;i<=3;i++,movePtr++){ 22 if(!(*movePtr)){ 23 i--; //跳過0 24 if(movePtr==firstPtr+peopleNum-1) movePtr=firstPtr-1; //movePtr指向數組最後一位時重置movePtr,下同 25 continue; 26 } 27 if(i==3&&*movePtr){//第三位離開 28 *movePtr=0; 29 numberLast--; 30 } 31 if(movePtr==firstPtr+peopleNum-1) movePtr=firstPtr-1; 32 } 33 if(numberLast==1) break;//只剩最後一人時跳出迴圈 34 } 35 36 //迴圈找出最後一人 37 movePtr=firstPtr; 38 while(1){ 39 if(*movePtr){ 40 printf("The last people is No.%d.\n",movePtr-firstPtr+1); 41 break; 42 } 43 movePtr++; 44 } 45 46 system("pause"); 47 return 0; 48 }
編譯運行,結果如下:
Enter the number of people.
5
The last people is No.4.