程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> C說話初學者代碼中的罕見毛病與成績

C說話初學者代碼中的罕見毛病與成績

編輯:關於C++

C說話初學者代碼中的罕見毛病與成績。本站提示廣大學習愛好者:(C說話初學者代碼中的罕見毛病與成績)文章只能為提供參考,不一定能成為您想要的結果。以下是C說話初學者代碼中的罕見毛病與成績正文


成績
開燈成績

  有n盞燈,編號為1~n,第1小我把一切燈翻開,第2小我按下一切編號為2 的倍數的開關(這些燈將被關失落),第3 小我按下一切編號為3的倍數的開關(個中關失落的燈將被翻開,開著的燈將被封閉),依此類推。一共有k小我,問最初有哪些燈開著?輸出:n和k,輸入開著的燈編號。k≤n≤1000


#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行


a[i*j]=a[i*j]+1;

因為後面界說a數組為部分auto種別,在不停止初始化的情形下,a中的數據是渣滓值。換句話說,a中的數據是有意義的。是以a[i*j]+1這個表達式沒成心義。

  另外,第22行


  for(i=2;i<=k;i++) //每操作一次序遞次i*j個開關,a[i*j]加1

在邏輯上也是毛病的,缺少“第1小我把一切燈翻開”的步調。

  別的


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說話應當如許寫:


printf("請分離輸出燈和人的數目\n");
while(scanf("%d%d",&n,&k) ,( k <1 || n<k || n>1000) )
{
   printf("數值不符,請從新輸出:\n");
}

  代碼中還有其他一些缺點,因為不是最重要的成績,這裡就不再進一步指出了。

重構:


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

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved