2015-05-20 16 views
7

Gentilmente scusa il mio inglese.Dov'è la logica sbagliata nel mio codice?

Sto seguendo un corso introduttivo a C e ho alcuni problemi con la logica del mio programma. A volte produrrà solo l'output richiesto.

L'attività è scrivere una funzione che prende gli elementi dell'array, restituisce la cifra pari più grande dell'elemento.

int ary1[] = {123, 456, -7890, 12}; Restituisce -7890 come il valore più grande con 8 come la più grande cifra pari e le sue occorrenze.
int ary2[5] = {-123, 654, 78, 15, 189}; Restituisce 189 come il valore più grande con 8 come la più grande cifra pari e le sue occorrenze.
int ary3[2] = {9, 9}; Non restituire nulla.
int ary4[] = {123, 123, 0, 12}; Restituisce 123 come il valore più grande con 2 come la cifra pari più grande e le sue occorrenze.
int ary5[] = {24, 45, -789, 24, 1}; Restituisce -789 come il valore più grande con 8 come la più grande cifra pari e le sue occorrenze.
int ary6[] = {-749, -241, 1, 45}; Restituisce 45 come il valore più grande con 4 come la cifra pari più grande e le sue occorrenze.

Ecco il mio codice:

#include <stdio.h> 

void digitExtract(int[], int); 

int main() { 

    int ary1[] = { 123, 456, -7890, 12 }; 
    int ary2[5] = { -123, 654, 78, 15, 189 }; 
    int ary3[2] = { 9, 9 }; 
    int ary4[] = { 123, 123, 0, 12 }; 
    int ary5[] = { 24, 45, -789, 24, 1 }; 
    int ary6[] = { -749, -241, 1, 45 }; 
    int ary7[] = { 1, 3, 5 }; 

    printf("\nCalling function in ary1[]:\n"); 
    digitExtract(ary1, 4); 
    printf("\nCalling function in ary2[]:\n"); 
    digitExtract(ary2, 5); 
    printf("\nCalling function in ary3[]:\n"); 
    digitExtract(ary3, 2); 
    printf("\nCalling function in ary4[]:\n"); 
    digitExtract(ary4, 4); 
    printf("\nCalling function in ary5[]:\n"); 
    digitExtract(ary5, 5); 
    printf("\nCalling function in ary6[]:\n"); 
    digitExtract(ary6, 4); 
    printf("\nCalling function in ary7[]:\n"); 
    digitExtract(ary7, 3); 
} 

void digitExtract(int Array[], int array_size) { 

    int tempValue; 
    int x; 
    int myArr[10] = { 0 }; 
    int evenCount = 0; 

    int max = Array[0]; 

    for (int i = 1; i < array_size; i++) 
    { 
     if (Array[i] < 0) { 
      Array[i] = -Array[i]; 
      if (Array[i] > max) { 
       max = Array[i]; 
      } 
     } 

    } 

    tempValue = (max < 0) ? -max : max; 

    do { 
     myArr[tempValue % 10]++; 
     tempValue /= 10; 
    } while (tempValue != 0); 



    for (x = 8; x > 0; x -= 2) { 
     if (myArr[x]>0) { 
      printf("Displaying from inside of function():\n"); 
      printf("\nThe largest even digit: %d\n", x); 
      printf("\nThe digit %d occurs %d times.\n", x, myArr[x]); 

      evenCount++; 
      break; 
     } 

    } if (evenCount == 0) 
     printf("\nNo even digits found!\n\n"); 

} 

So che c'è un errore nella mia logica, come per ary2[] produrrà l'ancor cifra del 6 ed è occorrenze quando dovrebbe essere 8, ma non lo faccio so dove.

La funzione funzionerà per un array che ha valori dispari come se fosse un elemento.

Dove o cosa sto facendo male?

Grazie.

+0

Puoi spiegare la domanda un po 'di più; In 'int ary6 [] = {-749, -241, 1, 45};', '-241' è maggiore di' -749', quindi la risposta dovrebbe essere '-241'? –

+0

@ MattMcNabb-È necessario considerare il valore assoluto, parlando in termini di grandezza dei termini. –

+0

Il codice implementa l'algoritmo: trova il numero "più grande", quindi trova la cifra pari più grande in quel numero. Tuttavia gli esempi corrispondono a: trova la cifra pari più grande, quindi trova il "più grande" dei numeri che contenevano quella cifra. Per favore chiarisci quale di questi approcci è ciò che stai cercando di fare! –

risposta

8

Il tuo compito è quello di trovare la cifra pari più grande, quindi trovare il valore più grande che ha quella cifra ... non trovare il valore più grande, quindi trovare la più grande cifra pari al suo interno.

Vorrei iniziare scrivendo una funzione denominata max_even_digit per operare su un singolo int, quindi verificarlo e lavorare da lì.

int max_even_digit(int x) { 
    int max = 0; 
    while (x) { 
     int digit = x % 10; 
     digit = digit < 0 ? -digit : digit; 
     if (x % 2 == 0 && digit > max) { 
      max = digit; 
     } 
     x /= 10; 
    } 
    return max; 
} 

Una volta fatto questo, un ciclo su l'array come se si sarebbe trovare il valore massimo, ma lasciare che il valore di ritorno di max_even_digit hanno la precedenza rispetto al valore reale.

int max_even_digit_value(int *array, size_t array_size) { 
    if (array_size == 0) { 
     return 0; 
    } 

    int max = array[0]; 
    for (size_t x = 0; x < array_size; x++) { 
     int a = max_even_digit(array[x]), b = max_even_digit(max); 
     if (a > b || (a == b && array[x] > max)) { 
      max = array[x]; 
     } 
    } 

    return max; 
} 
+2

Mi sono reso conto che ho fatto il contrario. Ho trovato prima il valore assoluto più grande, quindi ho trovato il numero pari più grande per quel valore. Ero, come altri hanno detto, supposto di trovare il più grande numero pari, e quindi associarlo con il più grande int dell'array. – Dumbfoundead

+0

@Dumbfoundead Il valore assoluto non ha rilevanza qui, come l'ultimo esempio che hai mostrato mostra: '45' viene restituito piuttosto che' -749' – Sebivor

+0

non dovrebbe 'int max_even_digit (int x)' return 'max' invece di' x '? 'x' dovrebbe essere 0 dopo il ciclo. – mch

Problemi correlati