2015-05-20 16 views
7

Lütfen ingilizcemi affedin.Kodumdaki mantık yanlış nerede?

C'ye giriş dersi alıyorum ve programımın mantığı ile ilgili bazı problemlerim var. Sadece bazen gerekli çıktıyı üretecektir.

Görev, dizinin öğelerini alan, öğedeki en büyük çift basamağı döndüren bir işlev yazmaktır.

int ary1[] = {123, 456, -7890, 12};-78908 ile en büyük değeri ve en büyük değeri olarak döndürür.
int ary2[5] = {-123, 654, 78, 15, 189};1898 ile en büyük değeri ve en büyük değeri olarak döndürür.
int ary3[2] = {9, 9}; Hiçbir şey döndürmez.
123, en büyük çift rakam ve oluşumları olan en büyük değer olarak 2 döndürür.
int ary5[] = {24, 45, -789, 24, 1};-7898 ile en büyük değeri ve en büyük değeri olarak döndürür.
int ary6[] = {-749, -241, 1, 45};45, en büyük çift rakam ve oluşumları olan en büyük değer olarak döndürür. İşte

benim kodudur: Ben 6 hatta rakamı üretecek ve onu 8 olmalıdır zaman olaylar var ary2[] gelince bir hata benim mantık olduğunu biliyorum

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

} 

, ama yok nerede olduğunu bil.

Bu işlev, öğe olarak tek değerleri olan bir dizi için çalışacaktır.

Nerede veya ne yapıyorum?

Teşekkür ederiz.

+0

Soruyu biraz daha açıklayabilir misiniz; Int ary6 [] = {-749, -241, 1, 45}; ', -241'' -749'dan daha büyüktür, bu yüzden cevap -241' olmalıdır? –

+0

@ MattMcNabb-Şartların büyüklüğü açısından konuşarak mutlak değeri dikkate almanız gerekir. –

+0

Kod, algoritmayı uygular: "en büyük" sayıyı bulun ve sonra bu sayıdaki en büyük çift haneyi bulun. Ancak örnekler şu şekildedir: en büyük çift basamağı bulun ve daha sonra bu rakamı içeren sayıların "en büyük" değerini bulun. Lütfen bu yaklaşımlardan hangisinin yapmaya çalıştığınız olduğunu açıklığa kavuşturun! –

cevap

8

Göreviniz en büyük çift basamağı bulmak ve daha sonra en büyük değeri bulmak için bu rakamın en büyük değerini bulmaktır ... En büyük değeri bulun, sonra içindeki en büyük sayıyı bulun.

Tek bir int üzerinde çalışmak üzere max_even_digit adlı bir işlev yazarak başlayacağım, ardından bunu doğrulayın ve buradan çalışın.

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

maksimum değeri bulma olabilir, ama max_even_digit dönüş değeri gerçek değerinin önceliklidir izin verirdi sanki size dizinin üzerinden bu, döngü yaptıktan sonra.

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

Geriye doğru yaptığımı fark ettim. Önce en büyük mutlak değeri buldum, sonra bu değer için en büyük çift sayıyı buldum. Diğerlerinin söyledikleri gibi, en büyük çift sayıyı bulması ve sonra dizideki en büyük int ile ilişkilendirmesi gerekiyordu. – Dumbfoundead

+0

@Dumbfoundead Burada gösterdiğiniz son örnek olarak mutlak değer hiçbir alakası yoktur: '-749' yerine "45" döndürülür – Sebivor

+0

"int max_even_digit (int x)' 'yerine' max 'döndürmemelidir '? Döngüden sonra 'x' 0 olmalıdır. – mch