2017-03-15 1 views
1

Kann jemand bitte erklären, was ich falsch mache. Ich muss ein Array verwenden, um den maximalen Wert des prozentualen Arrays zu finden und diesen Betrag und das Jahr im Array der entsprechenden Jahre anzuzeigen.mit Funktion, um den maximalen Wert in einem Array zu finden

#include <stdio.h> 
#include <stdlib.h> 
#include <ctype.h> 

int findHighNumber (double percentages[], int elements); 

int main (void) 
{ 

    int index; 
    int elements; 


    int years[] = {2000, 2002, 2004, 2006, 2008, 2010, 2012}; 
    double percentages[] = {6.7, 6.6, 8, 9, 11.3, 14.7, 14.6}; 
    int sampleSizes[] = {187761, 444050, 172335, 308038, 337093, 1000, 346978}; 


    int high = findHighNumber(percentages, elements); 
    printf ("%i had the highest percentage with autism at %.2lf%%.\n", years[high], percentages[high]); 


    return 0; 
} 

int findHighNumber (double percentages[], int elements) 
{ 
    int index, high; 
    high = percentages[0]; 

    for (index = 1; index < elements; index++) 
     if (high < percentages[index]) 
     { 
     high = percentages[index]; 
    } 
    return high; 
} 
+0

Sie müssen den Index des Maximalwerts entlang des Werts selbst speichern und zurückgeben. Ich würde die Funktion auch in 'findIndexOfMax' umbenennen, um deutlich zu machen, was es tun soll. – Lou

+0

Danke Jungs! Ich habe es zur Arbeit gebracht. –

Antwort

2

Zuerst müssen Sie die elements Variable in main() erklären:

int elements = 7; 

oder noch besser:

int elements = sizeof(percentages)/sizeof(*percentages); 

, die automatisch die Größe des Arrays berechnet.

Dann ändern Sie nicht die Variable elements in Ihrer Schleife. Wenn Sie dies tun, programmieren Sie jedes Mal, wenn das aktuelle Maximum geändert wird, Ihre Schleife so, dass sie nach dem nächsten Element stoppt, wobei möglicherweise das tatsächliche Maximum fehlt, das sich am Ende des Arrays befinden kann.

Dann, wie Bob sagte, sollten Sie den Index des Maximums zurückgeben, auf diese Weise können Sie die entsprechende sampleSize oder Jahr abrufen.
Wenn Sie years[high] tun, verwenden Sie einen Prozentsatz als Array-Index, der keinen realen Wert in [0,100] annehmen kann, anstelle eines Index, der in {0, 1, 2, 3, 4, 5 bleiben muss , 6}.

Darüber hinaus speichern Sie high in einer Ganzzahl Variable, was zu einer Kürzung des Werts führt. Möglicherweise möchten Sie es als doppelte Variable speichern.werden

findHighNumber() kann also:

int findHighNumber(double percentages[], int elements) 
    { 
      int index; 
      double high; 
      int high_index; 

      high_index = 0; 
      high = percentages[high_index]; 

      for (index = 1; index < elements; index++) 
        if (high < percentages[index]) { 
          high = percentages[index]; 
          high_index = index; 
        } 

      return high_index; 
    } 

Die main() Funktion kann nun werden so etwas wie:

int main (void) 
    { 
      int years[] = {2000, 2002, 2004, 2006, 2008, 2010, 2012}; 
      double percentages[] = {6.7, 6.6, 8, 9, 11.3, 14.7, 14.6}; 
      int sampleSizes[] = {187761, 444050, 172335, 308038, 337093, 1000, 
        46978}; 
      int elements = sizeof(percentages)/sizeof(*percentages); 
      int high_index = findHighNumber(percentages, elements); 

      printf ("%i had the highest percentage with autism at %.2lf%% (sample" 
        "size was %d).\n", years[high_index], percentages[high_index], 
        sampleSizes[high_index]); 

      return 0; 
    } 

Dann einige kleine Hinweise:

  1. ein Prototyp findHighNumber() setzen ist nicht benötigt, definiere einfach die Funktion über den Stellen wo es ne ist erreicht. Auf diese Weise, wenn Sie wirklich einen Prototyp für eine Funktion setzen müssen, gibt es einen Hinweis, dass Sie dazu gezwungen wurden, (zum Beispiel für gegenseitig rekursive Funktionen), und es verkürzt den Code.
  2. Sie sollten ein definieren, beispielsweise struct autism_sample wie folgt aus:

    struct autism_sample { 
         int year; 
         int sample_size; 
         double percentage; 
    }; 
    

    Auf diese Weise haben Sie nur ein Array zu definieren:

    struct autism_sample autism_samples[] = { 
        { 
         .year = 2000, 
         .sample_size = 187761, 
         .percentage = 6.7, 
        }, 
        { 
         .year = 2002, 
         .sample_size = 444050, 
         .percentage = 6.6, 
        }, 
        ... 
    }; 
    

    Auf diese Weise Ihre Daten in einer organisierten Logischer Weg, weniger fehleranfällig zu pflegen und Sie erhalten die Wahl, in der Implementierung von findHighNumber(), entweder den Index des Maximums oder direkt, ein Zeiger auf das Element mit dem Maximum, der Index wird dann nutzlos.
    Was mehr ist, ist es einfacher, (un) serialisiert ...

+0

Vielen Dank! –

+0

Gern geschehen ^^ – ncarrier

2

Ich bin mir nicht sicher, ob dies ein Tippfehler ist hier, aber es scheint, während

Aufruf
int high = findHighNumber(percentages, elements); 

Sie nicht eine Variable elements dort definiert haben. Das heißt, Sie eine andere Syntaxfehler haben in der Nähe von

if (high < percentages[index]) 
     { 
     high = percentages[index]; ///after this. 

schließlich (das Schließen } fehlt), innen findHighNumber() ist elements lokal für die Funktion, so die nur Nutzung als elements = index+1; ist nutzlos.

+0

Danke! Ich habe das behoben, was Sie erwähnt haben, und ich bekomme immer noch nicht die richtigen Zahlen. –

1

Angesichts der Art, wie Sie Daten speichern und verwenden, sollten Sie den Index zurückgeben, wo das höhere Element ist, nicht seinen Wert. Sie müssen auch die richtige Größe des Arrays übergeben (und nicht innerhalb der Funktion ändern), während Sie einen nicht initialisierten Wert übergeben.

+0

Ich bin etwa 4 Wochen in Programmierung, also ertragen Sie mit mir, aber ich bin nicht genau sicher, was bedeutet, indem Sie den Index zurück, wo das höhere Element ist. Kalt zeigst du ein Beispiel? Ich entfernte die "Elemente = Index +1" –

+0

@JessicaBlake Es sieht aus wie Ncarrier bereits Ihre Zweifel gelöst;) –

1

Sie sollten den Index anstelle des Werts senden.

int findIndexOfMax (double percentages[], int elements) { 

    int index = 0; 
    int highIndex = 0; 
    double high = 0.0; 
    high = percentages[highIndex]; 

    for (index = 1; index < elements; index++) 
    { 
     if (high < percentages[index]) 
     { 
      high = percentages[index]; 
      highIndex = index; 
     }  
    } 

    return highIndex; 
} 
+0

@Lou Sie haben Recht. Die Änderungen wurden bereits übernommen. – jyap

0

Sie den falschen Wert zurückgeben .. Sie sollten nicht zurück, was der höchste Wert ist, aber Sie sollten den Index zurückgeben.

oder Sie können einfach das gewünschte Ergebnis in der Funktion drucken, die Sie anrufen.

Auch sehe ich nicht, dass Sie die variablen Elemente initialisiert haben.

Verwandte Themen