Проверка слов на анаграммы - 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с четырьмя парами строк для проверки на анаграммы.