2 / 2 / 0
Регистрация: 15.01.2012
Сообщений: 181
1

Для строки объединить в отдельную строку все слова, имеющие заданную букву, разделив их одним пробелом

25.11.2012, 12:26. Показов 865. Ответов 2
Метки нет (Все метки)

Доброго времени суток.
Никак не получается отладить данную программу с учётом того, что буквы разного регистра неразличимы.
Вот код с небольшими комментариям.
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
//Для  строки  объединить  в  отдельную  строку  все  слова,  имеющие  
//заданную  букву,  разделив  их  одним  пробелом. 
#include <iostream>
#include <cstring>
using namespace std;
#define L 80
void subcopy(char* to, char* from, int amount) //куда копируем, откуда и кол - во символов
{
    int i;
    for(i=0; i < amount; i++)
        *(to + i) = *(from + i);
}
void HasLetter(char* str, char* res, char letter) //подразумеваем, что длина строки str не превосходит длину res
{
    int lenr = 0;
    int lenw = 0;
    bool found = false; //присутствие данной буквы в слове
    int reg = (letter < 'A' + 26)? 'a' - 'A': 'A' - 'a';    //считаем, что регистр не важен
    //printf ("letter + reg = %c\n", letter + reg);
    int i;
    for(i=0; *(str + i); i++)
    {   
        found = (*(str + i) == letter || *(str + i) + reg == letter || found)? true: false;
        /*for(int k=lenw; k >= 0; k--)
            printf("%c", *(str + i - k));
        printf("___found = %d\n", found);*/ // для отладки
        if(*(str + i) == ' ')
        {   
            if(found)
            {
                subcopy(res + lenr, str + i - lenw, lenw + 1); 
                /*printf("write: ");
                for(int j=0; j < lenw + 1; j++)
                    printf("%c", *(str + i - lenw + j));
                printf("\n");*/
                lenr+= lenw + 1;
            }
            lenw = 0;
            found = false;
        }
        else
            lenw++;
    }
    if(found)
        subcopy(res + lenr, str + i - lenw, lenw + 1); //если в конце строки стоит подходящее слово, то копируем вместе с '\0'
    else
        if(lenr)
            *(str + lenr - 1) = '\0';   //если есть хотя бы 1 слово с данной буквой
        else
            *(str + lenr) = '\0';       //случай с пустой строкой
}
int main()
{
    char str[L], res[L];
    gets(str);
    HasLetter(str, res, 'a'); 
    puts(res);
    cin.get();
    return 0;
}
Подскажите, что нужно подправить? Спасибо.
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
25.11.2012, 12:26
Ответы с готовыми решениями:

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

Найти все слова в строке, начинающиеся на заданную букву и удалить из строки все слова, начинающиеся на заданную букву
2. Найти все слова в строке, начинающиеся на заданную букву и удалить из строки все слова,...

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

Напечатать все возможные перестановки слов в предложении, разделив их одним пробелом
Задано предложение без предлогов, слова в котором разделены одним или несколькими пробелами....

2
4297 / 1419 / 463
Регистрация: 16.12.2010
Сообщений: 2,939
Записей в блоге: 3
25.11.2012, 13:38 2
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream>
#include <cstring>
int main()
{
     char b[] = "string which has to be divided", s[100], *ss="s";
    char* str = strtok(b, " ,.!?;:");
     do {
         if (strstr(str,ss))
             {
                strcat(s,str);
                strcat(s," ");
             }
     } while (str = strtok(NULL," ,.!?;:"));
     std::cout<<s;
     return 0;
}
Добавлено через 5 минут
А нужно искать совпадение, даже если буквы в разном регистре?
1
2 / 2 / 0
Регистрация: 15.01.2012
Сообщений: 181
25.11.2012, 22:44  [ТС] 3
Спасибо, но меня больше интересует вариант, где библиотечные ф - ии используются по минимуму. Хочу найти ошибки в своей программе, но пока в упор не вижу, что же всё - таки не так.
P.S. важное условие: буквы разного регистра неразличимы
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
25.11.2012, 22:44
Помогаю со студенческими работами здесь

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

Напечатать в алфавитном порядке все слова из данной строки, имеющие заданную длину n
Здравстуйте, если не сложно помогите пожалуйста написать программу. Составить программу, которая...

Напечатать в алфавитном порядке все слова из данной строки, имеющие заданную длину n
Всем доброго времени помогите пожалуйста выполнить задние через тип String и Класс StringBuilder:...

Напечатать в алфавитном порядке все слова из заданной строки, имеющие заданную длину n
Пожалуйста, напишите программу по следующей задаче: Дана строка . Напечатать в алфавитном...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru