2014-12-30 12 views
0

Я довольно новичок в C, поэтому мне нужен совет.Есть ли более простой способ написать этот код?

Этот код ищет, если слова являются анаграммами или нет. Вложенные корневые коды содержат то же самое, что и в нижнем регистре, и игнорируют, если входной символ не является буквой. В конце он должен и он показывает, что это слова анаграммы или нет.

Мне было интересно, есть ли более простой способ написать этот код или это в значительной степени это?

int alphabet[26] = {0}, sum = 0; 
char first[20], second[20]; 
int i = 0; 

printf("Enter the first word: "); 
do 
{ 
    first[i] = getchar(); 
    if(isalpha(first[i])) 
    alphabet[toupper(first[i]) - 'A'] += 1 ; 
    i++; 

}while(first[i - 1] != '\n'); 

printf("Enter the second word: "); 
i = 0; 
do 
{ 
    second[i] = getchar(); 

    if(isalpha(second[i]) && alphabet[toupper(second[i]) - 'A'] > 0) 
    { 
     alphabet[toupper(second[i]) - 'A'] -= 1; 
    } 
    i++; 

}while(second[i - 1] != '\n'); 

for(i = 0; i <= 26 - 1; i++) 
{ 
    sum += alphabet[i]; 
} 
if (sum == 0) 
    printf("Anagrams\n"); 
if (sum != 0) 
    printf("Not anagrams\n"); 

Я правку, во втором входе я вынул один из, если условия, то теперь он выглядит так

do 
{ 
    second[i] = getchar(); 

    if(isalpha(second[i])) 
    { 
     alphabet[toupper(second[i]) - 'A'] -= 1; 
    } 
    i++; 
+1

Вы должны опубликовать, что [codereview.se]. Но, конечно, это может быть упрощено. – Quentin

+2

Первое слово 'abc', второе слово' abcabc', приведет к неправильному совпадению анаграмм. При обработке второго слова, если число букв на любой букве всегда равно 0, слова не являются анаграммами. – JS1

+5

Для nit-pick: C-программы обычно не [* scripts *] (http://en.wikipedia.org/wiki/Scripting_language). –

ответ

3

Ваш код не является правильным: он считает «а» и " ac ", чтобы быть анаграммами, из-за ошибочной логики счета. Я установил, что и удалили хранение всей first и second слов в пользу сохранения только самый последний введенный символ:

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

int main(void) 
{ 
    int alphabet[26] = {0}; 
    int ch; 
    int i; 

    printf("Enter the first word: "); 
    do 
    { 
    ch = getchar(); 
    if(isalpha(ch)) 
     alphabet[toupper(ch) - 'A']++; 
    }while(ch != '\n'); 

    printf("Enter the second word: "); 
    do 
    { 
    ch = getchar(); 
    if(isalpha(ch)) 
     alphabet[toupper(ch) - 'A']--; 
    }while(ch != '\n'); 

    for(i = 0; i < 26; i++) 
    { 
    if (alphabet[i]) 
    { 
     printf("Not anagrams\n"); 
     return 0; 
    } 
    } 

    printf("Anagrams\n"); 
    return 0; 
} 
+0

Спасибо, я исправил ошибку. У меня есть массивы для слов, если я должен их напечатать в какой-то момент. – TacoCat

+0

Кажется, что вход неабсолютного символа игнорируется. Я подозреваю, что это не правильное действие. Скорее выйдите из текущего цикла while, если введен несимметричный символ – user3629249

Смежные вопросы