Форум программистов, компьютерный форум, киберфорум
Наши страницы
C для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.56/9: Рейтинг темы: голосов - 9, средняя оценка - 4.56
bladzher
2 / 2 / 0
Регистрация: 15.10.2012
Сообщений: 76
1

В символьной строке оставить только те слова, в которых есть повторяющиеся буквы

15.02.2013, 15:08. Просмотров 1712. Ответов 12
Метки нет (Все метки)

Здравствуйте!
Не могли бы вы помочь мне в решении задачи?
Я уже третий день работаю,но не получается,за каникулы почти все забыл
Уже все обгуглил...
Задание:
В символьной строке оставить только те слова, в которых есть повторяющиеся буквы.
(Не использовать дефолтные функции работы со строками (например strstr, strlen). )

Вот код который наработал за сегодня:
Кликните здесь для просмотра всего текста
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
#include <stdio.h>
#include <string.h>
#include <conio.h>
#define VOWELS "AaEeIiOoUu"
#define DELIM " "
 
int main(void) {
    int i=0,y=0,z=0,t=0,q=0,N=0,p=0;
char buf[BUFSIZ], * ptr;
char fan[10], * finish;
printf("Enter_string: ");
while ( fgets(buf, BUFSIZ, stdin) && *buf != '\n' ) {
    for (i=0;i<buf[i]!='\0';i++) {
    if (buf[i]!=' ') {
    y++;
    fan[z]=buf[i];
    z++;
    N=i;
    }
    }
}
 
//printf("%c",fan[z]);
for (z=0;z<9;z++) {
printf("%c\n",fan[z]);
}
 
printf("\n\n%d\n\n\n",y);
 
for (t=0;t<N;t++) {
    for (q=0;q<N;q++) {
if (fan[t]==fan[q]){p++;
if (p>1){
printf("%c",fan[t]);
}
}
    }
}
printf("\n\n... Press any key ...");
getch();
return 0;
}

Там правда много лишнего,я там уже запутался

Спасибо!
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.02.2013, 15:08
Ответы с готовыми решениями:

В символьной строке оставить только те слова, в которых встречаются подряд идущие одинаковые буквы
Задача такая: В символьной строке оставить только те слова, в которых встречаются подряд идущие...

Создать программу, которая в символьной строке оставляет только те слова, в которых есть повторяющиеся символы
Помогите создать программу, которая в символьной строке оставляет только те слова, в которых есть...

В символьной строке оставить только те слова, которые состоят только из разных букв
Мне дали такое задание В символьной строке оставить только те слова, которые состоят только из...

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

В символьной строке удалить повторяющиеся слова
В символьной строке удалить повторяющиеся слова.

12
gazlan
3162 / 1921 / 312
Регистрация: 27.08.2010
Сообщений: 5,132
Записей в блоге: 1
15.02.2013, 16:46 2
Код совершенно невразумительный, выбросьте и напишите как следует.

Задача ваша разбивается на две - токенизация строки (получение очередного слова)
и валидация слова (проверка на повторяющиеся буквы).

При решении первой учтите, что разделителями слов могут быть не только пробелы (два вида табуляции итд). Здесь лучше идти от обратного - определить список alpha-символов (из которых может состоять слово) и все остальные считать разделителями.

Для решения второй, для каждого очередного слова нужно использовать массив счетчиков кратности букв (частотная карта). Если хотя бы один из счетчиков > 1, выводим слово в поток. Если под повторяюшимися буквами, на самом деле, подразумеваются удвоенные, то проверка незначительно усложнится.

Из вашего описания неясно, что требуется делать с разделителями, полагаю, все их можно заменить на пробелы.

Тогда алго выглядит так: считываем и валидируем очередное слово. Если слово содержит кратные буквы, выдаем в выходной поток слово и разделяющий пробел.

Если хвостовой пробел (после последнего слова) вас раздражает, добавьте проверки.
0
easybudda
Модератор
Эксперт CЭксперт С++
10240 / 6132 / 1542
Регистрация: 25.07.2009
Сообщений: 11,671
15.02.2013, 17:01 3
Положившись на то, что слова - это наборы символов, разделённые пробельными символами, и забив на
Цитата Сообщение от bladzher Посмотреть сообщение
Не использовать дефолтные функции работы со строками
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <stdio.h>
#include <string.h>
 
int have_doubling_letters(const char * wrd) {
    return ( *wrd == '\0' ) ? 0 : ( strchr(wrd + 1, *wrd) ) ? 1 : have_doubling_letters(wrd + 1);
}
 
#define DELIM " \t\n"
 
int main(void) {
    char buf[BUFSIZ], * p;
    
    while ( printf("String: ") && fgets(buf, BUFSIZ, stdin) && *buf != '\n' ) {
        printf("Result: ");
        for ( p = strtok(buf, DELIM); p; p = strtok(NULL, DELIM) )
            if ( have_doubling_letters(p) )
                printf("%s ", p);
        printf("\n");
    }
    
    return 0;
}
1
bladzher
2 / 2 / 0
Регистрация: 15.10.2012
Сообщений: 76
15.02.2013, 17:12  [ТС] 4
easybudda, Если б на это можно было забить,то я бы ее уже сделал

А вот из-за этой строчки "Не использовать дефолтные функции работы со строками",парюсь и не получается
0
easybudda
Модератор
Эксперт CЭксперт С++
10240 / 6132 / 1542
Регистрация: 25.07.2009
Сообщений: 11,671
15.02.2013, 17:15 5
Цитата Сообщение от bladzher Посмотреть сообщение
Если б на это можно было забить,то я бы ее уже сделал
А вот из-за этой строчки "Не использовать дефолтные функции работы со строками",парюсь и не получается
Таки в чём проблема? Напиши свои реализации strchr и strtok (последнюю можно в упрощённом варианте) и будет тебе счастье...
1
bladzher
2 / 2 / 0
Регистрация: 15.10.2012
Сообщений: 76
17.02.2013, 13:40  [ТС] 6
easybudda, вроде,более менее довел код до ума...
Можете помочь исправить ошибки и до вести код до полного ума?Две ошибки которые я заметил:1)после вывода press any key нажимаю люб.клавишу и выводится ошибка.2)Повторяющиеся буквы почему то считаются во всех строках одновременно,например:введем hello how и в итоге окажется что букв "o" две,хотя должна быть одна...

код:
Кликните здесь для просмотра всего текста
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
#include <stdio.h>
 
 
main()
{
    int c,row_index=0,symbol_index=0,i=0,j=0,s=0,d=0,k=0,z=0;
    char mas[100][100],*ptr;
 
    
while ( (c = getchar()) != '\n') {
     if (c == ' ') {
    ++row_index;
    symbol_index = 0;
  } else {
    mas[row_index][symbol_index] = c;
    ++symbol_index;
  }
}
for(j=0;j<10;j++){
    for (i=0;i<10;i++){
    printf("%c",mas[j][i]);
}
    printf("\n");
}
 
for (z=0;mas[z][i];z++) {
   for(i=0;mas[z][i];i++)
        {
        for(d=1,j=i+1;mas[z][j];j++)
            {
            while (mas[z][i]==mas[z][j])
                {
                d++;
                for(k=j;mas[z][k-1];k++)
                    {
                    mas[z][k]=mas[z][k+1];
                    }
                }
            }
            printf("%c=""%d\n",mas[z][i],d);
        }
   d=0;
}
      //  puts(s);
 
 
//if (mas[0][i])
 
 
 
    printf("\n\n... Press any key ...");
getch();
return 0;
}



Спасибо!
0
gazlan
3162 / 1921 / 312
Регистрация: 27.08.2010
Сообщений: 5,132
Записей в блоге: 1
17.02.2013, 14:21 7
Напиши свои реализации strchr и strtok
Достаточно пробежаться в цикле по буферу и в сохраненной в буфере строке заменить все "небуквы" на 0x00.
А потом просто сканировать в цикле до размера буфера:

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
int ii = 0;
 
while (true)
{
   while (!pBuf[ii++])
   {
      if (ii >= iBufSize)
      {
         return;
      }
   }
 
   int iWordStart = ii;
   int iWordSize  = 0;
 
   while (pBuf[ii++])
   {
      ++iWordSize;
   }
 
   if (iWordSize)
   {
      ValidateWord(pBuf,iWordStart,iWordSize);
   }
}
0
easybudda
Модератор
Эксперт CЭксперт С++
10240 / 6132 / 1542
Регистрация: 25.07.2009
Сообщений: 11,671
17.02.2013, 15:43 8
bladzher, не, я в половине алфавита переменных запутаюсь Намекну, что не так: массив из ста строк по сто символов - это, конечно, хорошо, но каждая строка в С должна бы '\0' завершаться. Но это только одна из проблем, наверняка ещё есть...

Добавлено через 13 минут
gazlan, да можно и ещё проще - размер слова можно и не выщитывать и уж тем более не передавать никуда, достаточно запоминать позицию, с которой очередное слово началось. Раз уже все разделители нулями заменили, можно этим пользоваться...
0
gazlan
3162 / 1921 / 312
Регистрация: 27.08.2010
Сообщений: 5,132
Записей в блоге: 1
17.02.2013, 16:23 9
Цитата Сообщение от easybudda Посмотреть сообщение
gazlan, да можно и ещё проще - размер слова можно и не выщитывать и уж тем более не передавать никуда, достаточно запоминать позицию, с которой очередное слово началось. Раз уже все разделители нулями заменили, можно этим пользоваться...
С учетом:
Не использовать дефолтные функции работы со строками (например strstr, strlen).
0
easybudda
Модератор
Эксперт CЭксперт С++
10240 / 6132 / 1542
Регистрация: 25.07.2009
Сообщений: 11,671
17.02.2013, 16:42 10
gazlan, а оно и не понадобится, ну разве, что strchr, и то не обязательно
C
1
2
3
4
5
6
7
8
9
10
11
12
char * mystrchr(const char * s, const char c) {
    return ( *s == '\0' ) ? NULL : ( *s == c ) ? (char*)s : mystrchr(s + 1, c);
}
 
int have_doubling_letters(const char * w) {
    return ( *w == '\0' ) ? 0 : ( mystrchr(w + 1, *w) ) ? 1 : have_doubling_letters(w + 1);
}
 
/* ну и где-то внутри main */
/*...*/
    if ( have_doubling_letters(pBuf + posStartingWord) )
        /*...*/
0
bladzher
2 / 2 / 0
Регистрация: 15.10.2012
Сообщений: 76
17.02.2013, 17:52  [ТС] 11
easybudda, не подскажите как это реализовать?
0
easybudda
Модератор
Эксперт CЭксперт С++
10240 / 6132 / 1542
Регистрация: 25.07.2009
Сообщений: 11,671
18.02.2013, 22:42 12
Цитата Сообщение от bladzher Посмотреть сообщение
easybudda, не подскажите как это реализовать?
интересно было бы посмотреть на с лёгкостью выполненное задание с использованием стандартных функций...
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
#include <stdio.h>
 
char * mystrchr(const char * s, const char c) {
    return ( *s == '\0' ) ? NULL : ( *s == c ) ? (char*)s : mystrchr(s + 1, c);
}
 
int have_dbl(const char * s) {
    return ( *s == '\0' ) ? 0 : mystrchr(s + 1, *s) ? 1 : have_dbl(s + 1);
}
 
#define DELIM " \t\n"
 
 
int main(void) {
    char buf[BUFSIZ];
    int len, pos, inword;
 
    while ( printf("String: ") && fgets(buf, BUFSIZ, stdin) && *buf != '\n' ) {
        printf("Result: ");
 
        for ( len = 0; buf[len]; ++len )
            ;
        for ( pos = 0; pos < len; ++pos )
            if ( mystrchr(DELIM, buf[pos]) )
                buf[pos] = '\0';
        for ( inword = 0, pos = 0; pos < len; ++pos ) {
            if ( buf[pos] == '\0' )
                inword = 0;
            else if ( ! inword ) {
                inword = 1;
                if ( have_dbl(buf + pos) )
                    printf("%s ", buf + pos);
            }
        }
        printf("\n");
    }
 
    return 0;
}
0
bladzher
2 / 2 / 0
Регистрация: 15.10.2012
Сообщений: 76
18.02.2013, 23:33  [ТС] 13
easybudda, Спасибо,а не могли бы вы подписать комментариями? а то к сожалению пока многое не понятно
Особенно между include and define ...
0
18.02.2013, 23:33
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.02.2013, 23:33

В символьной строке удалить все слова, начинающиеся с гласной буквы
Добрый день,есть задание:В символьной строке удалить все слова, начинающиеся с гласной...

Удалить все буквы, символы и оставить в строке только цифры
Нужно удалить все буквы, символы и оставить в строке только цифры. Например вводим : 4fe e4ge 4 t...

В символьной строке удалить все слова, содержащие две подряд идущие гласные буквы
Здравствуйте, помогите пожалуйста напрсать программу, сам вообще ноль :( Условие: В символьной...


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru