2016-04-07 19 views
0

Girilen iki sözcüğün anagram olup olmadığını belirleme konusunda sorun yaşıyorum.Dizideki tüm öğelerin sıfır olup olmadığını kontrol etme

#include <stdio.h> 
#include <string.h> 

int main() { 
    char ch; 
    int letter_count[26] = {0}; 
    int i; 
    int sum = 0; 

    printf("Enter first word: "); 
    do 
    { 
     scanf("%c", &ch); 
     letter_count[ch - 'a']++; 
    } while (ch != '\n'); 
    for(i = 0; i < 26; i++) 
     printf("%d ", letter_count[i]); 
    printf("\n"); 

    printf("Enter second word: "); 
    do 
    { 
     scanf("%c", &ch); 
     letter_count[ch - 'a']--; 
    } while (ch != '\n'); 
    for(i = 0; i < 26; i++) 
     printf("%d ", letter_count[i]); 
    for(i = 0; i < 26; i++) 
     if(letter_count[ch] != 0) 
      sum++; 

    if (sum == 0) 
     printf("anagrams"); 
    else 
     printf("not anagrams"); 
} 

Kodun bir kısmını yaparken kullanmam gerekir. İki kelimeyi girebilir ve dizideki öğeleri basar, böylece "Yatak" ve "En Akıllı" birlikte tüm elemanların sıfır olmasını sağlar. Bununla birlikte, son kısımda sorun yaşıyorum, bu da tüm elemanların sıfır olup olmadığını kontrol etmek için üçüncü bir döngü kullanmaktır.

Elden önce bir öğe bildirebileceğimi ve bir elemanın sıfır olmadığı her durumda artış gösterebileceğimi düşündüm ve sıfırdan büyük herhangi bir toplamın bir anagram olamamasını sağladım. Ancak, her zaman benim için anagramı yazdırır.

+0

Sınır dışı erişim nedeniyle tanımsız davranış. – EOF

+0

'sum ++ 'öğesini' bad = true' ile değiştirin. Büyük harfleri küçük harfe dönüştürdüğünüzden emin olun. – user3386109

+0

@ user3386109: 'letter_count [ch -' a '] 'öğesine * erişildiğinden * önce, döngü-kontrol' ch! =' \ N '',' ch' küçük harfe dönüştürmek pek yardımcı olmaz. – EOF

cevap

1

Üçüncü döngünüzde, letter_count[ch] kullanmak dizinin tamamını denetlemez. i döngü değişkenini kullanarak dizi boyunca yinelemeniz gerekir. kod O parçası olmalıdır:

for (i=0; i<26; i++) 
    if (letter_count[i] != 0) 
     sum++; 
0

, büyük harf ve küçük harfler hem idare dışı bağlı erişimini engellemek için <ctype.h> yılında topper() veya to lower() kullanın.

#include <stdio.h> 
#include <string.h> 
#include <ctype.h> // <--- 

int main() { 
    char ch; 
    int letter_count[26] = {0}; 
    int i; 
    _Bool bad = 0; 

    printf("Enter first word: "); 
    do 
    { 
     scanf("%c", &ch); 
     if(!isalpha(ch)) // <--- 
     { 
      puts("Not a letter"); 
      continue; 
     } 
     letter_count[tolower(ch) - 'a']++; // <--- 
    } while (ch != '\n'); 
    for(i = 0; i < 26; i++) 
     printf("%d ", letter_count[i]); 
    printf("\n"); 

    printf("Enter second word: "); 
    do 
    { 
     scanf("%c", &ch); 
     if(!isalpha(ch)) // <--- 
     { 
      puts("Not a letter"); 
      continue; 
     } 
     letter_count[tolower(ch) - 'a']--; // <--- 
    } while (ch != '\n'); 
    for(i = 0; i < 26; i++) 
     printf("%d ", letter_count[i]); 
    printf("\n"); // <--- 

    for(i = 0; i < 26; i++) 
     if(letter_count[i] != 0) 
     { 
      bad = 1; 
      break; // <--- 
     } 
    if (bad == 0) 
     printf("anagrams"); 
    else 
     printf("not anagrams"); 
} 

tüm yerlerde bir göz atın

// <--- işaretlenmiş.

+0

@ user3386109 Düzenlendi –

İlgili konular