Форум программистов, компьютерный форум, киберфорум
C для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.88/8: Рейтинг темы: голосов - 8, средняя оценка - 4.88
 Аватар для Jelay
1 / 1 / 0
Регистрация: 06.01.2014
Сообщений: 8

Вывести на экран слова, отличающиеся лишь порядком следования букв

08.01.2014, 19:58. Показов 1549. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем здрасте! Заранее спасибо, если Вы даже просто подумали над моей проблемкой. В общем, к делу. Задача была таковой:
Дана строка (неизвестной длины) - вывести на экран слова (из данной строки), которые отличаются лишь порядком следования букв (мама - амма - амам и т.д.).
Я долго бился над решением и решил, что это можно сделать следующим образом: разделить строку на слова, в каждом слове буквы свести к одному регистру и отсортировать в алфавитном порядке(написал для этого функцию). Затем каждое слово сравнить таким образом с остальными и, как только найдется "пара" - вывести на экран. Вот мое скудное (наверняка некрасивое), но творение:
Кликните здесь для просмотра всего текста
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
#include <locale>
#include <stdio.h>
#include <stddef.h>
#include <cstdio>
#include <conio.h>
#include <iostream>
#include <string.h>
 
#define maxn 10000
 
char S[maxn], *NewWord, **Words;
int i,f,N, WBeg,WEnd,WLeng, Numb, col, row, z;
 
 
char *expansion (char *Word) {char *FuncAr; char C; int j;
                                j=0;
                                while (Word[j]!='\0') j++;
                                FuncAr=(char*)calloc(j, sizeof (char));
 
                                for (int k = 0;k<=j;k++) FuncAr[k]=Word[k];
                                FuncAr=strlwr(FuncAr);
                                j=1;
                                while (j=1) {
                                    j=0;
                                for (int k=1; k<=i;k++) { if (FuncAr[k]<FuncAr[k-1]) {j=1;
                                                        C=FuncAr[k];
                                                        FuncAr[k]=FuncAr[k-1];
                                                        FuncAr[k-1]= C;}}}
                                puts (FuncAr);
                                return FuncAr;
                        }
 
void main ()
{
    setlocale (0,"russian");
    do{
       printf ("Введите вашу строку!\n");
       gets_s (S);
       i=0;
       N=1;
    
       while (S[i]!='\0' && N==1) 
       {if ((S[i]!=' ') && ! ((S[i]>='A' && S[i]<='Z') || (S[i]>='a' && S[i]<='z'))) /*|| ((unsigned char)S[i]>=(unsigned char)'А' && (unsigned char)S[i]<=(unsigned char)'я')*/
           N=0;
        i++;
       }
        
       if (N==0) printf ("Ввод некорректен. Попробуйте заново\n");
        
      }while (N==0);
    N=i;
    i=0;
    
     Words = (char**)calloc(N, sizeof(*Words));
     Numb=1;
 
    while (i<=N) 
    { 
     while (S[i]==' ') i++;
     WBeg=i;
     while (S[i]!=' ') i++;
     WEnd=i;
 
     WLeng=WEnd-WBeg;
    
     Words[Numb]=(char*)calloc(WLeng, sizeof(char));
 
     for (int k = 0, i=WBeg;i<=WEnd; i++, k++) {
         Words[Numb][k]=S[i];}
     Numb++;
 
     printf ("Слово № %d :\n", Numb);
     puts (Words[Numb]);
     printf ("\n\n");
    }
    printf ("Результат:\n");
 
    row=1;
    while (row<=Numb) {
        for (i=0;i<=Numb;i++) {if (strcmp(expansion(Words[row]),expansion(Words[i]))) puts(Words[row]);}
        row++;}
free (Words);
system ("pause");
}

Прошу прощения за такое большое количество переменных, не обессудьте.
У меня здесь две проблемы (ну.. пока те, на которые я наткнулся) - 1)Не распознает слова = не выводит их на экран по отдельности (Выдает ошибку, вида "бла-бла-бла, адрес программы. Строка 49. Выражение (string !=NULL). бла-бла-бла")
2) Какая-то глупая ошибка в функции сортировки слова (или не глупая... я ее, в общем, найти не могу)..
Прошу помощи, если вам не трудно)

Я писал пока только для латинских букв.. и в строке не может быть ничего, окромя латинских букв и пробелов.. Потом, как с вашей божьей помощью разберусь с тем, что здесь неверно, пойду разбираться с русскими буквами и знаками препинания. Еще раз спасибо за внимание!
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
08.01.2014, 19:58
Ответы с готовыми решениями:

Найти все слова, отличающиеся только порядком букв в заданном файле
Есть 2 задачи: 1) найти все слова, отличающиеся только порядком букв в заданном файле. Результатом работы приложения должен быть...

Найти все анаграммы (слова, отличающиеся только порядком букв) в заданном файле
Здравствуйте! Я закончил вуз и хочу устроиться стажером C#. В университете мы выполняли простые задания и в короткие строки, поэтому не...

Строка: Напечатать те слова, которые отличаются только порядком следования букв.
Задание: Дана строка. Напечатать те слова, которые отличаются только порядком следования букв. Помогите, пожалуйста...

5
 Аватар для IrineK
2023 / 1641 / 425
Регистрация: 23.02.2011
Сообщений: 6,002
Записей в блоге: 25
09.01.2014, 06:05
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
//создаем массив из слов введенной строки
char **CreateArray (char line[], int len, int &count)
{   int i = -1;
    char *buf = (char*) malloc (strlen(line)+1);            //копия исходной строки, уничтожается в процессе подсчета слов
    strcpy(buf,line);
 
    char *delims = " ,.-\n";
    char *word = strtok (buf, delims);
    while (word != NULL)
    {   ++count;                                            //считаем фактическое кво слов
        word = strtok (NULL, delims);
    }
    free (buf);
    
    char **words = (char**) malloc (count * sizeof(char*)); //выделяем память под count слов длиной len
    while (++i < count)
        words[i] = (char*) malloc (len);
 
    word = strtok (line, delims);                           //заполняем массив словами из строки
    i = -1;
    while (word != NULL)
    {   strcpy(words[++i], word);
        word = strtok (NULL, delims);
    }
    return words;
}
 
//печать массива слов
void ShowArray (char **words, int count)
{   int i = -1;
    while (++i < count)
        printf("%s\n", words[i]);
}
 
//копия массива слов
char **CopyArray (char **words, int count)
{   int i = -1;
    char **copy = (char**) malloc (count * sizeof(char*));
    while (++i < count)
    {   copy[i] = (char*) malloc (strlen(words[i]) + 1);
        strcpy(copy[i], words[i]);
    }
    return copy;
}
 
//очистка памяти 
void DestroyArray (char **words, int count)
{   while (--count > -1)
        free (words[count]);
    free (words);
}
 
//своп двух букв для сортировки по алфавиту
void Swap (char &a, char &b)
{   char t = a;
    a = b;
    b = t;
}
 
//сортировка слова по алфавиту
void SortLetters (char *word)
{   int i, j, len = strlen(word);
    for (i = 0; i<len-1;i++)
        for (j = i+1; j<len; j++)
            if (word[j] < word [i])
                Swap (word[i], word[j]);
}
 
//собственно, решение задачи
void FindBros (char **words, int count)
{   int i, j;
    
    char **copy = CopyArray (words, count);             //создаем копию массива слов
    for (i = 0; i<count;i++)
        SortLetters (copy[i]);                          //в каждом слове переставляем все буквы по алфавиту
    
    int *mask = (int*) malloc (count * sizeof(int));    //маска: слово уже было найдено как "двойник по буквам" или нет
    for (i = 0; i<count;i++)
        mask[i] = 0;                                    //сначала - все 0
 
    for (i = 0; i<count-1;i++)
    {   if (!mask[i])                                   //если i-ое слово еще не было "двойником по буквам"
        {   printf("\n%20s: ", words[i]);
            for (j = i+1; j<count; j++)
                if (strcmp (copy[i], copy[j]) == 0)     //сравниваем i-ую и j-ую копию, т.е. буквенный состав слов words[i] и words[j]
                {   printf("%20s ", words[j]);          //если буквенный состав совпал - выводим words[j]
                    mask[j] = 1;                        //в маске помечаем j-ое слово как уже найденное в качестве "двойника" 
                }
        }
    }
 
    DestroyArray (copy, count);
    free (mask);
}
 
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
int main()
{   char str[BUFSIZ];
    int len = 20, count = 0;
    printf("Your string:\n");
 
    fgets(str, BUFSIZ, stdin);
    
    char **words = CreateArray (str, len, count);
    printf("\n\nYour words:\n");
    ShowArray (words, count);
 
    printf("\n\nWords with the same set of letters:\n");
    FindBros (words, count);
 
    DestroyArray (words, count);
    getchar();
    return 0;
}
1
419 / 418 / 167
Регистрация: 28.11.2010
Сообщений: 1,183
09.01.2014, 09:52
Предыдущий код на Си
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
//создаем массив из слов введенной строки
char **CreateArray(char line[], int len, int *cnt) {
    int i = -1;
    int count = 0;
    char *buf = (char*) malloc(strlen(line) + 1); //копия исходной строки, уничтожается в процессе подсчета слов
    strcpy(buf, line);
 
    char *delims = " ,.-\n";
    char *word = strtok(buf, delims);
    while (word != NULL) {
        ++count;                                  //считаем фактическое кво слов
        word = strtok(NULL, delims);
    }
    free(buf);
    *cnt = count;
    char **words = (char**) malloc(count * sizeof(char*)); //выделяем память под count слов длиной len
    while (++i < count)
        words[i] = (char*) malloc(len);
 
    word = strtok(line, delims); //заполняем массив словами из строки
    i = -1;
    while (word != NULL) {
        strcpy(words[++i], word);
        word = strtok(NULL, delims);
    }
    return words;
}
 
//печать массива слов
void ShowArray(char **words, int count) {
    int i = -1;
    while (++i < count)
        printf("%s\n", words[i]);
}
 
//копия массива слов
char **CopyArray(char **words, int count) {
    int i = -1;
    char **copy = (char**) malloc(count * sizeof(char*));
    while (++i < count) {
        copy[i] = (char*) malloc(strlen(words[i]) + 1);
        strcpy(copy[i], words[i]);
    }
    return copy;
}
 
//очистка памяти
void DestroyArray(char **words, int count) {
    while (--count > -1)
        free(words[count]);
    free(words);
}
 
//своп двух букв для сортировки по алфавиту
void Swap(char *a, char *b) {
    char t = *a;
    *a = *b;
    *b = t;
}
 
//сортировка слова по алфавиту
void SortLetters(char *word) {
    int i, j, len = strlen(word);
    for (i = 0; i < len - 1; i++)
        for (j = i + 1; j < len; j++)
            if (word[j] < word[i])
                Swap(&word[i], &word[j]);
}
 
//собственно, решение задачи
void FindBros(char **words, int count) {
    int i, j;
 
    char **copy = CopyArray(words, count);          //создаем копию массива слов
    for (i = 0; i < count; i++)
        SortLetters(copy[i]); //в каждом слове переставляем все буквы по алфавиту
 
    int *mask = (int*) malloc(count * sizeof(int)); //маска: слово уже было найдено как "двойник по буквам" или нет
    for (i = 0; i < count; i++)
        mask[i] = 0;                                    //сначала - все 0
 
    for (i = 0; i < count - 1; i++) {
        if (!mask[i])        //если i-ое слово еще не было "двойником по буквам"
        {
            printf("\n%20s: ", words[i]);
            for (j = i + 1; j < count; j++)
                if (strcmp(copy[i], copy[j]) == 0) //сравниваем i-ую и j-ую копию, т.е. буквенный состав слов words[i] и words[j]
                        {
                    printf("%20s ", words[j]); //если буквенный состав совпал - выводим words[j]
                    mask[j] = 1; //в маске помечаем j-ое слово как уже найденное в качестве "двойника"
                }
        }
    }
 
    DestroyArray(copy, count);
    free(mask);
}
 
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
int main() {
    char str[BUFSIZ];
    int len = 20, count = 0;
    printf("Your string:\n");
 
    fgets(str, BUFSIZ, stdin);
 
    char **words = CreateArray(str, len, &count);
    printf("\n\nYour words:\n");
    ShowArray(words, count);
 
    printf("\n\nWords with the same set of letters:\n");
    FindBros(words, count);
 
    DestroyArray(words, count);
    getchar();
    return 0;
}
2
 Аватар для IrineK
2023 / 1641 / 425
Регистрация: 23.02.2011
Сообщений: 6,002
Записей в блоге: 25
09.01.2014, 13:09
Лучший ответ Сообщение было отмечено как решение

Решение

Ну вот все и при деле.
Кто-то пишет, кто-то правит.
Кто, что может.
3
 Аватар для Jelay
1 / 1 / 0
Регистрация: 06.01.2014
Сообщений: 8
09.01.2014, 15:09  [ТС]
вау! огромнейшее! огроменнейшее спасибо!!! Я, конечно, кучу всего у вас в программах не понимаю, но чертовски благодарен!!!
0
 Аватар для IrineK
2023 / 1641 / 425
Регистрация: 23.02.2011
Сообщений: 6,002
Записей в блоге: 25
10.01.2014, 00:03
Цитата Сообщение от Jelay Посмотреть сообщение
в программах
Множественное число здесь будет преувеличением.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
10.01.2014, 00:03
Помогаю со студенческими работами здесь

Сделать так чтобы разбиения, отличающиеся лишь порядком слагаемых, различными не считались
var n, i, j, g: integer; begin Write('Vvedite chislo n&gt;0= '); readln (n); for i:=0 to n do begin // генератор числа i for j:=0...

Вывести слова, которые состоят лишь из латинских букв
Разработать программу что выводит все слова из текста которые состоят лишь из латинских букв

Напечатать все слова, отличающиеся от последнего слова, и не содержащие повторяющихся букв
Добрый день Уважаемы программисты=) Уже неделю мучаюсь над заданием которое дал нам преподаватель по алгоритмам, при чем объяснять он...

Вывести на экран все возможные "слова" (сочетания букв), получаемые из букв этого слова
Пользователь вводит слово. Вывести на экран все возможные &quot;слова&quot;(сочетания букв), получаемые из букв этого слова(число букв не...

Вывести на экран все возможные "слова" (сочетания букв), получаемые из букв слова
пользователь вводит слово. Вывести на экран все возможные &quot;слова&quot;(сочетания букв), получаемые из букв этого слова(число букв не меняется)....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! */ #include <iostream> #include <stack> #include <cctype>. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru