2015-05-20 16 views
7

Uprzejmie proszę mój angielski.Gdzie jest logika błędna w moim kodzie?

Podejmuję kurs wprowadzający do C i mam pewne problemy z logiką mojego programu. To tylko czasami da wymaganą wydajność.

Zadanie polega na napisaniu funkcji pobierającej elementy tablicy, zwracającej największą parzystą cyfrę w elemencie.

int ary1[] = {123, 456, -7890, 12}; Zwróci -7890 jako największą wartość z 8 jako największą parzystą cyfrę i jej wystąpieniami.
int ary2[5] = {-123, 654, 78, 15, 189}; Zwróci 189 jako największą wartość z 8 jako największą parzystą cyfrą i jej wystąpieniami.
int ary3[2] = {9, 9}; Nie zwróci niczego.
int ary4[] = {123, 123, 0, 12}; Zwróciłby 123 jako największą wartość z 2 jako największą parzystą cyfrę i jej wystąpieniami.
int ary5[] = {24, 45, -789, 24, 1}; Zwróci -789 jako największą wartość z 8 jako największą parzystą cyfrą i jej wystąpieniami.
Zwróci 45 jako największą wartość z 4 jako największą parzystą cyfrą i jej wystąpieniami.

Oto mój kod:

#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"); 

} 

wiem, że jest błąd w moim logiki jak ary2[] będzie produkować nawet cyfrę 6 i jego wystąpienia, gdy powinna być 8, ale nie wiem wiedzieć gdzie.

Funkcja działa dla tablicy, która ma wartości nieparzyste jako jej element.

Gdzie lub co robię źle?

Dziękuję.

+0

Czy możesz wyjaśnić to pytanie nieco bardziej; W 'int ary6 [] = {-749, -241, 1, 45};', '-241' jest większy niż' -749', więc odpowiedź powinna wynosić '-241'? –

+0

@ MattMcNabb - Musisz wziąć pod uwagę wartość bezwzględną, mówiąc o wielkości warunków. –

+0

Kod implementuje algorytm: znajdź "największy" numer, a następnie znajdź największą parzystą cyfrę w tym numerze. Jednak przykłady odpowiadają: znajdź największą parzystą cyfrę, a następnie znajdź "największą" liczbę zawierającą tę cyfrę. Proszę wyjaśnić, które z tych podejść jest tym, co próbujesz zrobić! –

Odpowiedz

8

Twoim zadaniem jest znaleźć największą parzystą cyfrę, a następnie znaleźć największą wartość, która ma tę cyfrę ... nie znajdź największą wartość, a następnie znajdź największą parzystą cyfrę w jej obrębie.

Zacznę od napisania funkcji o nazwie max_even_digit, która będzie działać na pojedynczym int, a następnie sprawdź to i zacznij pracę.

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; 
} 

Po wykonaniu tej pętli nad tablicy tak, jakby można znaleźć maksymalną wartość, ale niech wartość zwracana max_even_digit mają pierwszeństwo przed wartością rzeczywistą.

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

Zrozumiałem, że zrobiłem odwrotność. Najpierw znalazłem największą bezwzględną wartość, a następnie znalazłem największą parzystą liczbę dla tej wartości. Byłem, jak powiedzieli inni, że powinni znaleźć największą liczbę parzystą, a następnie powiązać to z największą liczbą w tablicy. – Dumbfoundead

+0

@ Wartość bezwzględna bezwartościowego nie ma tutaj znaczenia, ponieważ ostatni przykład podałeś pokazuje: '45' jest zwracany zamiast' -749' – Sebivor

+0

nie powinien 'int max_even_digit (int x)' zwracać 'max' zamiast' x '? 'x' powinno być 0 po pętli. – mch

Powiązane problemy