2016-06-14 13 views
1

Ich versuche eine C-Funktion zu erstellen, die ein Array nimmt, das kleinste Element findet und den Wert dieses Elements auf Null setzt.finde das kleinste Element eines Arrays und setze seinen Index auf 0

Das ist meine Funktion bisher.

Wenn ich es ausführe, ist jeder Index außer dem letzten Null, aber ich will nur das kleinste Element, um Null zu sein.

+0

move 'a [i] = 0;' innerhalb der 'if'-Anweisung, und Vergleich aus dem Index 1 starten, d. H.' I = 1' in for-Schleife –

+0

Und was ist, wenn es mehr als 1 kleinste Element gibt? –

+0

@ImranAli nein, dann wird es die kleinste-so-weit auf 0 jedes Mal, wenn es eine neue kleinste findet –

Antwort

0

Ich möchte den Fall ansprechen, wo es mehr als einen einzigen kleinsten Wert gibt.

In einem solchen Fall werden zwei Schleifen benötigt. Eine, um den kleinsten Wert über das gesamte Array herauszufinden, und die andere, um alle Elemente mit diesem Wert auf Null zu setzen.

Ich werde Spur des Minimums halten und maximalen Index, wo dieser Wert in dem Array erscheint den Bereich der zweiten Schleife zu minimieren:

void set_smallest_to_zero(double a[], size_t n) { 

    if (!a || !n) { 
     return; 
    } 

    double smallest = a[0]; 
    size_t min_index = 0,    
      max_index = 0, 
      i; 

    // find the smallest values 
    for (i = 1; i < n; ++i) { 
     if (a[i] > smallest) { 
      continue; 
     } else if (a[i] < smallest) { 
      smallest = a[i]; 
      min_index = i; 
      max_index = i; 
     } else {      // a[i] == smallest 
      max_index = i; 
     } 
    } 

    // set to zero all the the minimum values 
    for (i = min_index; i <= max_index; ++i) { 
     if (a[i] == smallest) { 
      a[i] = 0.0; 
     } 
    } 
} 

HERE ist ein anschauliches Beispiel.

+0

Vielen Dank. Das funktioniert und schätzt, dass Sie andere Fälle ansprechen –

2

Es gibt ein paar Probleme mit Ihrem Code, ich bin überrascht, dass Ihr Compiler nicht auf Sie explodiert ist.

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

    size_t i, index; 
    double smallest; 

    // sanity check to make sure we're not accessing outside allocated memory 
    if (n > 0) { 
    smallest = a[0]; 
    index = 0; 
    } else { 
    // nothing left to do here 
    return; 
    } 

    // start at 1 because 0 is initial default 
    for (i = 1; i < n; i++) { 
    if (a[i] < smallest) { 
     smallest = a[i]; 
     index = i; 
    } 
    } 

    // assign only the smallest index 
    a[index] = 0.0; 
} 

Fühlen Sie sich frei, Kommentare zu senden, wenn Sie Fragen haben.

+0

bedeutete, können Sie zweite Gesundheitsprüfung zu entfernen indem Sie eine "else return" auf der ersten – pm100

+0

@ pm100 guten Punkt, und eine mehr trockene Antwort. Ich werde das aktualisieren, danke. Es ist jetzt behoben. –

+0

Hey Patrick. Ich habe Ihren Code implementiert, aber nichts an dem Array geändert. Ich weiß deine Hilfe zu schätzen. Ich weiß, ich beginne jetzt bei 1 statt 0 und weiß auch über size_t –

1

Wenn wir nur einen kleinsten wie die OP und einige Antworten vorausgesetzt, können wir auch nur den Index der kleinsten Spur halten, anstelle des Wertes des kleinsten, Dinge einfach zu halten:

void find_minimum(double a[], size_t n) { 
    if (n <= 0) { 
     return; 
    } 

    size_t smallest = 0; 

    for (size_t i = 1; i < n; i++) { 
     if (a[i] < a[smallest]) { 
      smallest = i; 
     } 
    } 

    a[smallest] = 0.0; 
} 
+0

Danke, aber diese Funktion hat keine Werte des Arrays geändert. Ich denke, dass ich ein complier Problem haben kann, weil andere Lösung nicht funktionierte –

+0

Das funktioniert. Fehler beim Testen gemacht –

Verwandte Themen