Проверка слов на анаграммы - C (СИ)
Формулировка задачи:
Помогите пожалуйста с вот такой проблемой.
Нужно написать программу в ней два слова должны проверяться на аннаграммы. Я вот написал программу ,но сказали ,что нужно её переделать сделать более компактной и понятной для чтения. И реализовать проверка на длину слов без strlen.
Может кто подскажет как надо более цивильно всё реализовать.
#include <stdio.h> #include <string.h> #include <ctype.h> int main () { char s[100]; char k[100]; puts ("Первое слово\n"); scanf ("%s", s); puts("Второе слово\n"); scanf ("%s", k); int w1l = strlen(s); int w2l = strlen(k); char w1[100]=" ", w2[100]=""; int c1[100], c2[100]; int i, j, l1=0; if (w1l!=w2l) { printf ("Слова по длинне должны быть одинаковыми\n"); return 0; } for (i=0; i<w1l; i++){ int rep = 0; char letter = s[i]; for (j=0; j<l1; j++){ if (letter == w1[j]) rep=1; } if (rep != 1){ int c=0; for (j=0; j<w1l; j++) if (letter == s[j]) c++; w1[l1]=letter; c1[l1]=c; l1++; } } int l2=0; for (i=0; i<w2l; i++){ int rep = 0; char letter = k[i]; for (j=0; j<l2; j++){ if (letter == w2[j]){ rep=1; } } if (rep != 1){ int c=0; for (j=0; j<w2l; j++) if (letter == k[j]) c++; w2[l2]=letter; c2[l2]=c; l2++; } } if (l1 != l2) { puts ("Не аннаграмма"); return 0; } for (i=0; i<l1; i++) { char f = w1[i]; int dob = 0; for (j=0; j<l1; j++){ if ((f == w2[j])&&(c1[i]==c2[j])) dob = 1; } if (dob != 1) { puts ("Не аннаграмма"); return 0; } } for (i=0; i<l1; i++) { char f = w2[i]; int dob = 0; for (j=0; j<l1; j++){ if ((f == w1[j])&&(c2[i]==c1[j])) dob = 1; } if (dob != 1) { puts ("Не аннаграмма"); return 0; } } puts ("аннаграмма"); return 0; }
Решение задачи: «Проверка слов на анаграммы»
textual
Листинг программы
#include <stdio.h> #include <string.h> void check_anagramma(unsigned char *str1, unsigned char *str2) { int c[256], i; memset(c, 0, 256*sizeof(c[0])); i=0; while(str1[i]) c[str1[i++]]++; i=0; while(str2[i]) c[str2[i++]]--; i=0; while(!c[i] && i<256) i++; if (i==256) printf("\n\"%s\" eto anagramma \"%s\"\n", str1, str2); } void main(void) { check_anagramma("abra","rbaa"); check_anagramma("abrak","rbaas"); check_anagramma("aebra","rbaea"); check_anagramma("",""); }
Объяснение кода листинга программы
- В функции
check_anagramma
используются два указателя на строки типаunsigned char *
:str1
иstr2
, которые представляют собой исходные строки для проверки на анаграммы. - Создается массив
c
типаint
размером 256, который будет использоваться для подсчета количества каждого символа в строках. - С помощью функции
memset
все элементы массиваc
инициализируются нулем. - Переменная
i
инициализируется нулем и используется для индексации символов в строках. - В цикле, пока первый символ в
str1
не будет равен нулю, увеличивается счетчик символа в массивеc
. - Затем, во втором цикле, пока второй символ в
str2
не будет равен нулю, уменьшается счетчик символа в массивеc
. - В третьем цикле, пока значение в массиве
c
не станет равным нулю, значениеi
увеличивается. - Если цикл завершается без условия остановки, то это означает, что строки являются анаграммами, и функция выводит сообщение об этом.
- В функции
main
вызывается функцияcheck_anagramma
с четырьмя парами строк для проверки на анаграммы.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д