• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >C语言 > C语言初学者代码中的常见错误与问题

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

作者: 字体:[增加 减小] 来源:互联网 时间:2017-05-28

通过本文主要向大家介绍了初学c语言用什么软件,初学c语言看什么书,c语言初学者看什么书,c语言初学,c语言初学者练习题等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

问题
开灯问题

  有n盏灯,编号为1~n,第1个人把所有灯打开,第2个人按下所有编号为2 的倍数的开关(这些灯将被关掉),第3 个人按下所有编号为3的倍数的开关(其中关掉的灯将被打开,开着的灯将被关闭),依此类推。一共有k个人,问最后有哪些灯开着?输入:n和k,输出开着的灯编号。k≤n≤1000

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;
}
</div>

测试:

“自己测了觉得没问题..在线系统结果是WrongAnswer ..未找出原因..”
 评:

  最明显的错误就是第26行

由于前面定义a数组为局部auto类别,在不进行初始化的情况下,a中的数据是垃圾值。换句话说,a中的数据是无意义的。因此a[i*j]+1这个表达式没有意义。

  此外,第22行

在逻辑上也是错误的,缺乏“第1个人把所有灯打开”的步骤。

  另外

这段写得很丑,属于典型的谭浩强风格,C语言应该这样写:

  代码中还有其他一些毛病,由于不是最主要的问题,这里就不再进一步指出了。

重构:

#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;
}
</div>

</div>
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

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

相关文章

  • 2017-05-28VC实现的病毒专杀工具完整实例
  • 2017-05-28c++中堆栈及创建对象示例代码
  • 2017-05-28C++中的按位与&、按位与或|、按位异或^运算符详解
  • 2017-05-28在C语言中调用C++做的动态链接库
  • 2017-05-28c语言打开文件函数使用方法
  • 2017-05-28C语言安全编码之数值中的sizeof操作符
  • 2017-05-28解析c++中的默认operator=操作的详解
  • 2017-05-28C++实现多线程查找文件实例
  • 2017-05-28纯C语言:递归二进制转十进制源码分享
  • 2017-05-28C++详解默认参数的构造函数及简单实例代码

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • 老生常谈C语言静态函数库的制作和使用
    • C++指针数组、数组指针、数组名及二维数组技巧汇总
    • C语言数组入门之数组的声明与二维数组的模拟
    • C++删除指定文件夹下N天及之前日志文件的方法
    • Mac OS上搭建Apache+PHP+MySQL开发环境的详细教程
    • 用C++实现strcpy(),返回一个char*类型的深入分析
    • Linux下C语言修改进程名称的方法
    • C++归并排序算法实例
    • 引用参数和传值参数的区别深入解析
    • C++输入输出注意事项总结

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有