2016-06-15 5 views
2

私の目標は、配列の最小値を見つけてゼロに設定するC関数を作成することです。これまでのところ、私の関数はそれを行いますが、すでにゼロであるインデックスを無視/スキップしたいと思います。私が見つからないか、めちゃくちゃにしています何cの値を含む配列インデックスをスキップ/無視する

void find_minimum(double a[], int n) { 

    int i, index; 
    double low; 

    index = 0; 
    low = a[0]; 

    for (i = 1; i < n; i++) { 

     if(a[i] == 0.0){ 
      continue; 
     } 
     if (a[i] < low) { 
      low = a[i]; 
      index = i; 
     } 
    } 
    a[index] = 0.0; 
} 

void find_minimum(double a[], int n) { 

    int i, index; 
    double low;  

    index = 0; 
    low = a[0]; 

    for (i = 1; i < n; i++) { 
     if (a[i] < low && a[i] != 0.0) { 
      low = a[i]; 
      index = i; 
     } 
    } 
    a[index] = 0.0;  
} 

は、私はまた、このようなcontinueステートメントを使用してみましたか?

+0

コードを適切にフォーマットし、浮動小数点の整理エラーに注意してください。 – MikeCAT

+0

[MCVE](http://stackoverflow.com/help/mcve)を表示してください。 –

+3

'a [0]'がすでに '0'であればどうなりますか? (あなたの番号がすべて正であると仮定しています) – SJuan76

答えて

1

あなたの問題は、a[0]がゼロの場合のコードでは無視されます。 DOUBLE_MAXのようないくつかの定数を代入して、代わりに配列全体を反復する(i = 1の代わりにfor初期化文にある)。

void find_minimum(double a[], int n) { 

    int i, index; 
    double low;  

    index = 0; 
    low = DOUBLE_MAX; 

    for (i = 0; i < n; i++) { 
     if (a[i] < low && a[i] != 0.0) { 
      low = a[i]; 
      index = i; 
     } 
    } 
    a[index] = 0.0;  
} 
+0

重要なものがゼロ以外の値を使用していると仮定すると(MCVEの場合ではなく、実際のコードのように)、 'index' '-1'に設定し、ループの後でそれをチェックしてから何かを' 0.0'に設定してください。 MCVEでは、インデックス0を何度も何度も再ゼロにしますが、インデックス0にゼロ以外の値が最も小さい場合と、すでにゼロになっている配列全体とを区別することはできません。実際のコードがゼロ以外の値が最も小さいインデックスを返すと、値が実際に非ゼロであるかどうかを知ることが重要でした。 – ShadowRanger

0

データを変更するコードから最小のファインダーを分離する必要があります。異なる目的のために他のどこかで最小値を見つける必要があるかもしれません。また、他の記事で示唆されているようにあなたは、DOUBLE_MAXを使用する場合は、入力配列に可能な最大値のいくつかの事前情報を持っている必要がありますがlowを見つけ、まだ、あなたは0

void find_minimum(double a[], int n) { 

    int i, index; 
    double low;  

    index; 
    low = DOUBLE_MAX; 

    for (i = 0; i < n; i++) { 
     if ((a[i]) && (a[i] < low)) { 
      low = a[i]; 
      index = i; 
     } 
    } 
    return low;  
} 

//... 
int main() { 
    //... 
    a[find_minimum(a, n)] = 0; 
    //... 
    return 0; 
} 
0

にインデックスにある要素を設定します。

しかし、以下のコードを使用すると、このような事前情報なしでこの問題を解決できます。
のインラインコメントを読む

#include<stdio.h> 

#define SIZE 5 // change the array size as per your requirement 

void find_minimum_set_zero(double a[]) { 

    int i, index; 
    double low; 

    index = 0; 
    low = a[index]; 

    while(low == 0.0 && index < SIZE){ // This will make sure "low" is non-zero 
     index++; 
     low = a[index]; 
    } 

    for (i = index+1; i < SIZE; i++) { // This loop starts with "index+1" 
     if ((a[i] < low) && a[i]) { 
      low = a[i]; 
      index = i; 
     } 
    } 
    a[index] = 0.0; 
} 


int main(){ 

    double a[SIZE]; 
    int i; 

    for(i=0;i < SIZE; i++){ 
     scanf("%lf", &a[i]); 
    } 

    find_minimum_set_zero(a); 

    for(i=0;i < SIZE; i++){ 
     printf("%lf ", a[i]); 
    } 

    return 0; 
} 

サンプル入力(最初の行)と出力(第2ライン):

99 98 95 96 97 
99.000000 98.000000 0.000000 96.000000 97.000000 

0 99 98 96 95 
0.000000 99.000000 98.000000 96.000000 0.000000 

99 0 98 0 97 
99.000000 0.000000 98.000000 0.000000 0.000000 

91 99 0 97 0 
0.000000 99.000000 0.000000 97.000000 0.000000 

PS:私はfind_minimumからあなたの関数の名前を変更読みやすさを向上させるためにfind_minimum_set_zeroに変更してください。

関連する問題