大一初学指针第一天,做一下课后习题。(《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.
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/c-cdevelopment/599658.html