| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 489 人关注过本帖
标题:指针的用法!各位大侠,帮帮忙!
只看楼主 加入收藏
sydyh43
Rank: 1
等 级:新手上路
帖 子:10
专家分:9
注 册:2009-6-17
结帖率:80%
收藏
已结贴  问题点数:10 回复次数:4 
指针的用法!各位大侠,帮帮忙!
有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那个人。


帮忙看一下下面程序哪错了?

#include <stdio.h>

#define N 100

int main()
{
    int i = 0;
    int k = 0;
    int n, t;
    int *p;
    int a[N];
    int flag = 1;
   
    printf("please input a number:");
    scanf("%d", &n);
   
    p = a;
    for (i = 0; i < n; i++)
    {
          *(p + i) = i + 1;
    }
    p = a;
    for (i = 0; i < n; i++)
    {
           printf("%3d", *p++);
    }
   
    putchar('\n');
    p = a;
    t = n;
    while (i < n && flag)
    {
          if (*p++ !=0)
          {
                   k++;
          }
          if (k == 3)
          {
                   k = 0;
                   *(p + i) = 0;
                   t--;
          }
          if (t == 1)
          {
                   flag = 0;
          }
          i++;
          if (i == n)
          {
                i = 0;
          }
    }
   
    if (* p == 0)
    {
            p++;
    }
    printf("%d", *p);
    system("pause");
}
搜索更多相关主题的帖子: 指针 
2009-08-18 19:54
mfkblue
Rank: 5Rank: 5
等 级:职业侠客
帖 子:472
专家分:343
注 册:2008-12-21
收藏
得分:3 
改了下,我也不知道对错
#include <stdio.h>
#include <iostream.h>
#define N 100
 
int main()
{
    int i = 0;
    int k = 1;
    int n, t;
    int *p;
    int a[N];
    int flag = 1;
     
    printf("please input a number:");
   scanf("%d", &n);
     
    p = a;
    for (i = 0; i < n; i++)
    {
          *(p + i) = i + 1;
    }
    p = a;
    for (i = 0; i < n; i++)
    {
           printf("%3d", *p++);
    }
     
    putchar('\n');
    p = a;
    t = n;
    i=0;
    while (flag)
    {
           p++;
        if (*p!=0)
          {
                   k++;
                    
          }
         
          if (k == 3)
          {
                   k = 1;
                   *p= 0;
                   t--;
          }
          if (t == 1)
          {
                   flag = 0;
          }
          i++;
          if (i == n)
          {
                i = 0;
                p=a;
          }
           
    }
    for(i=0;i<n;i++)
        cout<<a[i]<<" ";
     
}
2009-08-18 23:25
ly861014
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:66
专家分:177
注 册:2008-10-28
收藏
得分:3 
回复 楼主 sydyh43
希望楼主的代码以后能加个注释
我修改的如下:
#include <stdio.h>
 
#define N 100           //定义一个数组的维度,但必须保证能容纳得了所要求的人数
 
int main()
{
    int i = 0;          //循环变量
    int k = 0;          //1,2,3不断循环
    int n;              //人数
    int t;              //去除一个人t就减1,直到t为1时结束
    int *p;              
    int a[N];           //定义一个足够大的数组,以存放1, ..., n这n个数
    int flag = 1;
     
    printf("please input a number: ");
    scanf("%d", &n);
     
    p = a;
    for (i = 0; i < n; i++)
    {
          *(p + i) = i + 1;
    }
    p = a;
    for (i = 0; i < n; i++)
    {
           printf("%3d", *p++);
    }
     
    putchar('\n');
    p = a;
    t = n;
    i = 0;                       //修改1,必须有此句,因为上面第二个for循环出来后,i为n
    while (i < n && flag)
    {
          if (*p++ != 0)
          {
                   k++;
          }
          if (k == 3)
          {
                   k = 0;
                   *(p - 1) = 0; //修改2,上面的if (*p++ != 0)使得p不等于a了
                   t--;
          }
          if (t == 1)
          {
                   flag = 0;
          }
          i++;
          if (i == n || t == 1)  //修改3,以防止t为1时退出循环而不能使p = a;
          {
                i = 0;
                p = a;           //修改4,p = a;能使得下面的while正确进行
          }
    }
     
    while(* p == 0)              //修改5,查找不为0的那个数
    {
            p++;
    }
     
    printf("The remaining number is: ");  //修改6
    printf("%d", *p);
 
    putchar('\n');                        //修改7
     
    return 0;                            //修改8
 
}

[ 本帖最后由 ly861014 于 2009-8-19 00:37 编辑 ]
2009-08-19 00:33
ly861014
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:66
专家分:177
注 册:2008-10-28
收藏
得分:0 
回复 楼主 sydyh43

在3楼的基础上还可以做些修改,可以把flag这个变量去掉,以增加代码清晰度:
(1)把int flag = 1;去掉
(2)while (i < n && flag)改为 while (i < n && t != 1)
(3)把if (t == 1)
       {
             flag = 0;
        }
     去掉
2009-08-19 15:22
Kiss逰
Rank: 1
来 自:四川
等 级:新手上路
帖 子:5
专家分:3
注 册:2008-10-9
收藏
得分:3 
建议去C版块
2009-08-21 16:08
快速回复:指针的用法!各位大侠,帮帮忙!
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.039366 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved