程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> 編程綜合問答 >> c語言-噴水裝置問題,執行了一組內循環為什麼n的值變成了1074370969,但是代碼中沒有修改過n的值。

c語言-噴水裝置問題,執行了一組內循環為什麼n的值變成了1074370969,但是代碼中沒有修改過n的值。

編輯:編程綜合問答
噴水裝置問題,執行了一組內循環為什麼n的值變成了1074370969,但是代碼中沒有修改過n的值。

現有一塊草坪,長為20米,寬為2米,要在橫中心線上放置半徑為Ri的噴水裝置,每個噴水裝置的效果都會讓以它為中心的半徑為實數Ri(0<Ri<15)的圓被濕潤,這有充足的噴水裝置i(1<i<600)個,並且一定能把草坪全部濕潤,你要做的是:選擇盡量少的噴水裝置,把整個草坪的全部濕潤。
輸入
第一行m表示有m組測試數據
每一組測試數據的第一行有一個整數數n,n表示共有n個噴水裝置,隨後的一行,有n個實數ri,ri表示該噴水裝置能覆蓋的圓的半徑。

 #include <stdio.h>
#include <math.h>
#include <iostream>
#include <string>
#include <stdlib.h>
using namespace std;
int sort(double arr[],int x)//定義一個插入排序,由大到小排。經測試該方法正確
{
    double tem;
    for(int i=1;i<x;i++)
    {
        for(int j=i;j>0;j--)
        {
            if(arr[j]>arr[j-1])
            {
                tem = arr[j];
                arr[j] = arr[j-1];
                arr[j-1] = tem;
            }
            else
            {
                break;
            }
        }
    }
    return 0;
}
int main(void)
{
   int m=0;

   scanf("%d",&m);
   int result[] = {0};//記錄每組所需要的裝置個數
   double pour[] = {0};//記錄初始輸入的裝置能覆蓋的半徑
   int n;//表示最初由n個噴水裝置
   int num = 0;//最終需要的裝置個數
   double len = 20;//草坪長度

   for(int i=0;i<m;i++)
   {

       scanf("%d",&n);
       len = 20;//重新判斷下一組所以要重新賦值
       num = 0;//重新賦值
       for(int h=0;h<n;h++)//依次輸入各個值,空格間隔開
       {
            scanf("%lf",&pour[h]);
       }

       sort(pour,n);//將輸入的半徑由大到小排序

       for(int j=0;j<n;j++)
       {
           len = len - 2*sqrt(pour[j]*pour[j]-1);
           num++;//需求的裝置曾一
           if(len<0)
           {
             result[i] = num;
               break;
           }
       }
   }
   for(int k=0;k<m;k++)
   {
       printf("%d\n",result[k]);
   }

}

為什麼n的值經歷了一次內循環後會變大呢?請各位老師指點,謝謝

最佳回答:


你的pour[]數組**長度只有1**啊,除了pour[0]是合法的,用其他下標訪問的pour[h]都**越界**了。
所以只要初始的n不是1,scanf("%lf",&pour[h])會把後面的n、num、len逐個覆蓋掉。

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