Расшифровка анаграмм - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Пишу программу, расшифрующую анаграммы для примера взял несколько слов, но программа выводит лишние слова, которые по идее не должны подходить. Например при вводе мной слова "abaci" она так же выводит слова "abaka" и "abada", которые по идее должны отличатся колличеством своих совпадений. Код программы :
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <iostream>
char ar[][15] = {
    "robo",
    "kert",
    "abaci",
    "abaka",
    "abada",
    "svinopas",
};
int main()
{
    int pr = 0;
    int ko = 0;
    char a[15];
    scanf("%s", a);
    int n = strlen(a);
    //printf("%d", n);
    for (long int i = 0; i < 20; i++) { // Vrybaem perebor vseh elementov massiva c dannimi 4islami
        if(strlen(ar[i]) == n) {
            for(int k = 0; k < n;k++){// Perebiraem vse simvoli massiva
                for(int j = 0; j< n;j++){ // Opyat' perebiraem
                    if(ar[i][j] == a[k]) { //Proverayem simvoli oboih slov na sovpadenie
                        pr++; // Plysyem 1  v sly4ae sovpadenia
                    }
                }
                
            }
            //printf("%d\n", pr);
            for(int c = 0 ; c < strlen(a); c++) {
                for(int b = 0; b < strlen(a) ;b++) {
                    if(a[c] == a[b]) ko++; // S4itivaem sovpadenia v dannom slove
                }
                //printf("%d\n", ko);
            }
            //printf("%d\n", ko);
            ko -=strlen(a); // Vi4itaem dliny slova, tk v lubom sly4ae eto sovpadet
            pr-=ko; // vi4itaem ostaok i poly4aem dliny slova.
            ko = 0; // obnylaem, dabi prodoljit' cikl
            if(pr == n) { // proveryaem sovpadaet li dlina slova s dannim 4islom
                printf("%s\n",ar[i]);  // Vivodim poly4enoe 4islo
            }
            pr = 0; // obnylaem, dabi prodoljit' cikl
        }
    }
    
}
Проверял колличество совпадений, и прочее с помощью этой программы:
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
int main()
{
    char a[15];
    scanf("%s", a);
    int pr = 0;int lo = 0;
    for(int i = 0; i < strlen(a); i++) {
        for(int k = 0; k < strlen(a); k++) {
            if(a[k] == a[i]) pr++;
        }
    }
    lo = pr;
    printf("%d\n", pr);
    lo-= strlen(a);
    printf("%d\n", pr-lo);
}
Все числа отличались, в чём может быть проблема?
^ |

Решение задачи: «Расшифровка анаграмм»

textual
Листинг программы
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define N 6
char ar[N][15] = {
    "robo",
    "kert",
    "abaci",
    "abaka",
    "abada",
    "svinopas",
};
int main()
{
    int pr, ko, n, i, j, k, flag;
    char a[15];
    puts("Input word:");
    scanf("%s", a);
    n = strlen(a);
    for(k = 0; k < N; ++k){
        if(strlen(ar[k]) == n){
            pr = ko = flag = 0;
            for(i = 0; i < n; ++i){
                for(j = 0; j < n; ++j){
                    if(a[i] == a[j])
                        ++pr;
                    if(a[i] == ar[k][j])
                        ++ko;
                    if(a[i] != ar[k][i])
                        flag = 1;
                }
                if(pr != ko){
                    printf("Words '%s' and '%s' are not an anagram.\n", a, ar[k]);
                    break;
                }
            }
            if(i == n){
                if(flag)
                    printf("Yes!Words '%s' and '%s' are an anagram.\n", a, ar[k]);
                else
                    printf("Words '%s' and '%s' are same.\n", a, ar[k]);
            }
        }
        else
            printf("Words '%s' and '%s' are not an anagram.\n", a, ar[k]);
    }
    return 0;
}

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

  1. Включаем необходимые заголовочные файлы для работы с памятью, вводом/выводом и строками
  2. Определяем массив слов-анаграмм
  3. Вводим слово для проверки на анаграмму
  4. Вычисляем длину введенного слова
  5. Проверяем каждое слово из массива на соответствие введенному слову
  6. Если длина слова из массива не равна длине введенного слова, выводим сообщение об этом и прерываем цикл
  7. Если введенное слово и слово из массива имеют одинаковую длину, проверяем, являются ли они анаграммами
  8. Если буквы введенного слова идут в том же порядке, что и в слове из массива, выводим сообщение о том, что слова являются одним и тем же словом
  9. Если буквы введенного слова идут в другом порядке, выводим сообщение о том, что слова являются анаграммами
  10. Если слово из массива не соответствует критериям (не является анаграммой или является тем же словом), выводим сообщение об этом
  11. Возвращаем 0, чтобы указать, что программа успешно завершилась

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


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

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

9   голосов , оценка 3.889 из 5