源码网商城,靠谱的源码在线交易网站 我的订单 购物车 帮助

源码网商城

C语言初学者代码中的常见错误与问题

  • 时间:2022-04-17 06:18 编辑: 来源: 阅读:
  • 扫一扫,手机访问
摘要:C语言初学者代码中的常见错误与问题
问题 开灯问题   有n盏灯,编号为1~n,第1个人把所有灯打开,第2个人按下所有编号为2 的倍数的开关(这些灯将被关掉),第3 个人按下所有编号为3的倍数的开关(其中关掉的灯将被打开,开着的灯将被关闭),依此类推。一共有k个人,问最后有哪些灯开着?输入:n和k,输出开着的灯编号。k≤n≤1000
[u]复制代码[/u] 代码如下:
#include <stdio.h> #include <math.h> int main() {    int a[1001],n,k,i,j;    printf("请分别输入灯和人的数量\n");    scanf("%d%d",&n,&k);    while(1) //检验是否超出    {       if(k>=1 && k<=1000 && n>=k && n<=1000)          break;       else       {          printf("数值不符,请重新输入:\n");          scanf("%d%d",&n,&k);       }    }    for(i=2;i<=k;i++) //每操作一次第i*j个开关,a[i*j]加1    {       for(j=1;i*j<=n;j++)       {          a[i*j]=a[i*j]+1;       }    }    for(i=1;i<=n;i++) //若操作次数为偶数,表示该位置的灯亮着    {       if(a[i]%2==0 && a[i]!=0)       printf("%d\t",i);    }    printf("\n");    return 0; }
测试: “自己测了觉得没问题..在线系统结果是WrongAnswer ..未找出原因..”  评:   最明显的错误就是第26行
[u]复制代码[/u] 代码如下:
a[i*j]=a[i*j]+1;
由于前面定义a数组为局部auto类别,在不进行初始化的情况下,a中的数据是垃圾值。换句话说,a中的数据是无意义的。因此a[i*j]+1这个表达式没有意义。   此外,第22行
[u]复制代码[/u] 代码如下:
  for(i=2;i<=k;i++) //每操作一次第i*j个开关,a[i*j]加1
在逻辑上也是错误的,缺乏“第1个人把所有灯打开”的步骤。   另外
[u]复制代码[/u] 代码如下:
printf("请分别输入灯和人的数量\n");    scanf("%d%d",&n,&k);    while(1) //检验是否超出    {       if(k>=1 && k<=1000 && n>=k && n<=1000)          break;       else       {          printf("数值不符,请重新输入:\n");          scanf("%d%d",&n,&k);       }    }
这段写得很丑,属于典型的谭浩强风格,C语言应该这样写:
[u]复制代码[/u] 代码如下:
printf("请分别输入灯和人的数量\n"); while(scanf("%d%d",&n,&k) ,( k <1 || n<k || n>1000) ) {    printf("数值不符,请重新输入:\n"); }
  代码中还有其他一些毛病,由于不是最主要的问题,这里就不再进一步指出了。 重构:
[u]复制代码[/u] 代码如下:
#include <stdio.h> #define MAXNUM 1000 #define ON 0 #define OFF 1 int main( void ) {    int light[MAXNUM] = { ON } ; //把所有灯打开    int n , k ;    int i ;    printf( "请分别输入灯和人的数量\n" );    while ( scanf("%d%d", & n ,& k ) ,( k < 1 || n < k || n > MAXNUM ) )       printf("数值不符,请重新输入:\n");    for ( i = 2 - 1 ; i < k ; i ++ ) //第2个人按下所有编号为2 的倍数的开关……    {       int j ;       for ( j = i ; j < n ; j += i + 1)          light[j] = ! light[j];        }    for ( i = 0 ; i < n ; i ++ )       if( light[i]==ON )          printf( "%d " , i + 1 );    putchar('\n');    return 0; }
  • 全部评论(0)
联系客服
客服电话:
400-000-3129
微信版

扫一扫进微信版
返回顶部