Проверка слов на анаграммы - 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("","");
}

Объяснение кода листинга программы

  1. В функции check_anagramma используются два указателя на строки типа unsigned char *: str1 и str2, которые представляют собой исходные строки для проверки на анаграммы.
  2. Создается массив c типа int размером 256, который будет использоваться для подсчета количества каждого символа в строках.
  3. С помощью функции memset все элементы массива c инициализируются нулем.
  4. Переменная i инициализируется нулем и используется для индексации символов в строках.
  5. В цикле, пока первый символ в str1 не будет равен нулю, увеличивается счетчик символа в массиве c.
  6. Затем, во втором цикле, пока второй символ в str2 не будет равен нулю, уменьшается счетчик символа в массиве c.
  7. В третьем цикле, пока значение в массиве c не станет равным нулю, значение i увеличивается.
  8. Если цикл завершается без условия остановки, то это означает, что строки являются анаграммами, и функция выводит сообщение об этом.
  9. В функции main вызывается функция check_anagramma с четырьмя парами строк для проверки на анаграммы.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

13   голосов , оценка 3.846 из 5
Похожие ответы