Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 122, средняя оценка - 4.72
Existor
0 / 0 / 0
Регистрация: 17.09.2009
Сообщений: 11
#1

Найти слова, начинающиеся и заканчивающиеся гласными буквами - C++

20.04.2010, 00:45. Просмотров 14907. Ответов 17
Метки нет (Все метки)

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

По идее надо создать новый массив с заглавными и строчными гласными буквами алфавита и искать слова, начинающиеся и заканчивающиеся на любой элемент из массива с гласными буквами. Но я с трудом понимаю, как обратиться к первой букве слов, и последней тем более

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
#include "stdafx.h"
#include <string.h>
#include <fstream.h>
#include <iostream.h>
 
int main()
{
    const int len = 81;
    char word [len];
    char line [len];
    char delim[] = ",.!?/<>|)(*:;";
    cout << "Letter for search:" << endl;
    cin >> word;
 
    ifstream fin ("text.txt", ios::in|ios::nocreate);
 
    if (!fin) {cout << "No text file!" << endl; return 1; }
 
    char *token;
 
    int count = 0;
 
    while (fin.getline(line, len))
    {
        token = strtok (line, delim);
 
        while (token != NULL)
        { if (strcmp (token, word)) count++;
 
        token = strtok (NULL, delim);
        }
    }
    cout << "Words = " << count << endl;
    return 0;
}
Надеюсь на помощь

P.S. Используется старый Microsoft Visual C++ 6.5
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.04.2010, 00:45
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Найти слова, начинающиеся и заканчивающиеся гласными буквами (C++):

Найти слова заканчивающиеся и начинающиеся на одну букву - C++
Ребят, помогите облегчить код: &quot;В строке найти слова, начинающиеся и заканчивающиеся одной буквой&quot; #include &lt;iostream&gt; #include...

Найти в строке слова, начинающиеся и заканчивающиеся заданными символами - C++
Очередная задача, пробовал но, не смог. Понимаю что без циклов не обойтись но, как реализовать так и не понял, помогите пожалуйста. ...

В заданном массиве найти все слова, начинающиеся и заканчивающиеся на одну и ту же букву - C++
Дан массив символов, в нём нужно найти все слова которые начинаются и заканчиваются на одну и ту самую букву.

Найти и вывести все слова начинающиеся и заканчивающиеся на одну и ту же букву (комментирование кода) - C++
Прокомментируйте пожалуйста код: /* Ввести строку длинной до 500 символов.Алфавит русские буквы и пробелы.Найти и вывести все слова...

Слова, начинающиеся и заканчивающиеся на одну и ту же букву - C++
Дано предложение.Вывести на экран: а)слова,начинающиеся и заканчивающиеся на одну и ту же букву; б)его слова,которые содержат 3 буквы...

Выписать из текста слова начинающиеся и заканчивающиеся цифрой. - C++
Вот я попытался что то написать, если её запустить она работает, но если ввести что то с цифрой выдает ошибку. #include &lt;stdafx.h&gt; ...

17
Existor
0 / 0 / 0
Регистрация: 17.09.2009
Сообщений: 11
26.04.2010, 15:37  [ТС] #2
Никто не поможет? =\
0
NNN777
299 / 157 / 19
Регистрация: 27.02.2010
Сообщений: 317
26.04.2010, 16:34 #3
Для файла подредактируйте сами, а вообще можно так:
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
#include <iostream>
#include <stdlib.h>
#include <stdio.h>
using namespace std;
const int SIZE =80;
void form (char*, char*);
 
void main()
{
    char buf[SIZE], outbuf[SIZE]={' '};
 
    while(cout<<"Vvedite stroky: ",
    cin.getline(buf, SIZE))
    {   
        form (buf, outbuf);
 
        cout<<"Rez: ";
        cout<<outbuf;
        cout<<endl<<endl;
    }
}
void form (char *a,char *out)
{   
    char *first=a, *end=a; 
    *out='\0';
    int k=0, flag=false, flag2=false;
    char b[]={"AEIUOYaeiuoy"};
 
    while (*first!='\0')
    {
        flag=false; flag2=false;
 
        while (*first==' '&&*first!='\0')
            first++;
        end=first;
 
        while (*end!=' '&&*end)
            end++;
 
        for (int i=0; i<12; i++)
            if (*first==b[i])
            {
                flag=true;
                break;
            }
        for (int i=0; i<12; i++)
            if (*(end-1)==b[i])
            {
                flag2=true;
                break;
            }
        if (flag==true&&flag2==true)
        {
            while (first!=end)
                *out++=*first++;
            *out++=' ';
            *out='\0';
        }
        else first=end;     
    }
}
1
easybudda
Модератор
Эксперт CЭксперт С++
9693 / 5643 / 962
Регистрация: 25.07.2009
Сообщений: 10,847
26.04.2010, 17:06 #4
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 <iostream>
#include <fstream>
#include <string>
#include <cctype>
 
std::string cut_word(const std::string& wrd){
    static const std::string delim(".,;:!?[](){}@$%&");
    size_t start_pos = wrd.find_first_not_of(delim);
    if ( start_pos == std::string::npos )
        return "";
    size_t stop_pos = wrd.find_last_not_of(delim);
    return wrd.substr(start_pos, stop_pos - start_pos + 1);
}
 
bool start_stop_by_vowel(const std::string& wrd){
    static const std::string vowels("AEIOUY");
    return ( vowels.find(std::toupper(*wrd.begin())) != std::string::npos && vowels.find(std::toupper(*wrd.rbegin())) != std::string::npos );
}
 
int main(){
    std::string buf, tmp;
    std::ifstream ifs("simple.txt");
    if ( !ifs.is_open() ){
        std::cerr << "Ahtung! Niht das file open!" << std::endl;
        return 1;
    }
 
    size_t cnt = 0;
    while ( ifs >> buf ){
        tmp = cut_word(buf);
        if ( tmp.empty() )
            continue;
        if ( start_stop_by_vowel(tmp) ){
            std::cout << tmp << std::endl;
            ++cnt;
        }
    }
    ifs.close();
    std::cout << cnt << " words found." << std::endl;
 
    return 0;
}
0
Existor
0 / 0 / 0
Регистрация: 17.09.2009
Сообщений: 11
26.04.2010, 21:00  [ТС] #5
Большое спасибо! Буду ещё премного благодарен, если бы Вы смогли дописать комментарии к основным этапам программы, поскольку я не профи с программировании, и треть функций (если не половина) либо вижу впервые, либо просто в другом представлении

Ещё раз спасибо человеческое!
0
easybudda
Модератор
Эксперт CЭксперт С++
9693 / 5643 / 962
Регистрация: 25.07.2009
Сообщений: 10,847
26.04.2010, 23:07 #6
Цитата Сообщение от Existor Посмотреть сообщение
Буду ещё премного благодарен, если бы Вы смогли дописать комментарии к основным этапам программы
Вам их две написали. В какой из них что не понятно?
0
Existor
0 / 0 / 0
Регистрация: 17.09.2009
Сообщений: 11
27.04.2010, 01:12  [ТС] #7
Вопросы на каждой строчке почти, легче было бы Вам прокомментировать основные шаги (этапы) программы, поскольку я с трудом понимаю структуру своей программы, спасибо большое за варианты программ, но в них ещё надо вникнуть, что есть что

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
#include <iostream>
#include <stdlib.h>
#include <stdio.h>
using namespace std;
const int SIZE =80;     
void form (char*, char*); //зачем создавать два char'овских указателя?
 
void main()
{
        char buf[SIZE], outbuf[SIZE]={' '};    //для чего нужны оба массива? первый для буфера, но outbuf - ?
 
        while(cout<<"Vvedite stroky: ", 
        cin.getline(buf, SIZE))
        {       
                form (buf, outbuf);
 
                cout<<"Rez: ";
                cout<<outbuf;
                cout<<endl<<endl;
        }
}
void form (char *a,char *out)   //не очень понял, идет обращение (указатель) на переменную а и out, верно?
{       
        char *first=a, *end=a;    //в эти указатели записываются первая и последняя буква определенного слова, верно?
        *out='\0';       // '\0' ? впервые вижу
        int k=0, flag=false, flag2=false;    //создается два флага, меняющих свое значение с ложи на истины, но не очень понимаю структуру программы, зачем ? или первый флаг для начала, второй флаг - для конца слова? или я вообще ничего не понимаю
        char b[]={"AEIUOYaeiuoy"};    
 
        while (*first!='\0')     //опять же, если указатель first не равен.. чему?
        {
                flag=false; flag2=false;
 
                while (*first==' '&&*first!='\0')  //это, как я понял, нужно, чтобы определять сами слова? 
                        first++;    //для чего вообще создавалась переменная first?
                end=first;
 
                while (*end!=' '&&*end)
                        end++;
 
                for (int i=0; i<12; i++)
                        if (*first==b[i])
                        {
                                flag=true;
                                break;
                        }
                for (int i=0; i<12; i++)
                        if (*(end-1)==b[i])
                        {
                                flag2=true;
                                break;
                        }
                if (flag==true&&flag2==true)
                {
                        while (first!=end)
                                *out++=*first++;
                        *out++=' ';
                        *out='\0';
                }
                else first=end;         
        }
}
0
NNN777
299 / 157 / 19
Регистрация: 27.02.2010
Сообщений: 317
27.04.2010, 10:10 #8
Откоментирую свою :
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
#include <iostream>
#include <stdlib.h>
#include <stdio.h>
using namespace std;
const int SIZE =80;     
void form (char*, char*); //это прототип функции form (говорит, что функция ничего не возвращает - void, но принимает 2 параметра - 2 указателя на char), его надо обязательно написать до использования самой функции
 
void main()
{
        char buf[SIZE], outbuf[SIZE]={' '};    //2 массива: один входные данные, что введены с клавиатуры (у вас из файла), второй. чтобы было куда поместить найденные слова 
        while(cout<<"Vvedite stroky: ", 
        cin.getline(buf, SIZE))
        {       
                form (buf, outbuf); //вызов функции form (передаем 2 указателя на 2 массива)
 
                cout<<"Rez: ";
                cout<<outbuf; //печать результата
                cout<<endl<<endl;
        }
}
void form (char *a,char *out)   //описание функции form (функция получает 2 параметра: два указателя на 1-е элементы переданных в нее массивов, а именно на buf и outbuf (см main) просто в самой функции они названы a и out)
{       
        char *first=a, *end=a;    //обыявляем два указателя на char и присваиваем и значение а, т. е. первый элемент массива buf
        *out='\0';       // out - это указатель на 1-й элемент outbuf, а outbuf пустой, мы ему присваиваем 0 байт,т.е. конец строки
        int k=0, flag=false, flag2=false;    //создается два флага
        char b[]={"AEIUOYaeiuoy"};    
 
        while (*first!='\0')     //в конце символьной строки записывается всегда 0 байт - это признак конца строки, так вот, пока указатель *first не будет равен 0 байт, т.е пока не конец строки (это еще можно записать, как while(*first) - значит тоже самое)
        {
                flag=false; flag2=false; //флагам устанавливаем ложь (если это не сделать, то как только программа найдет первое подходящее слово, запишет его и задаст флагам истину, если их не обнулить, все остальные слова будет подходить по заданным ниже критериям) обнуляем для каждого слова
 
                while (*first==' '&&*first!='\0')  //цикл, пока ук-ль *first равен пробелу и не равен концу строки (если равен концу строки,и считать нечего))
                        first++;    //сдвигаем адрес указателя на 1позицию, на 1 символ
//теперь *first у нас стоит на следующем сомволе после пробелов - первая буква слова
                end=first; //адресу end присваиваем адрес first, ставим end на ту же букву
 
                while (*end!=' '&&*end) //пока *end не равен пробелу и концу файла
                        end++; //двигаем указатель end
 //теперь end стоит на первом пробеле! после пройденного слова
                for (int i=0; i<12; i++) //проверяем равна ли первая буква элементу массива
                        if (*first==b[i])
                        {
                                flag=true; //если да, флаг - истина
                                break; //заканчиваем цикл - зачем нам сравнивать дальше
                        }
                for (int i=0; i<12; i++) //проверяем равна ли пследняя буква элементу массива *(end-1) - эти последняя буква (указатель на (end-1 позиция), т.к end - указатель на первый пробел после слова
                        if (*(end-1)==b[i])
                        {
                                flag2=true; //все как в предидущем цикле
                                break;
                        }
                if (flag==true&&flag2==true) //если оба флага истинны ( и 1-я и последняя буквы есть в массиве)
                {
                        while (first!=end) //пока адрес первой буквы не равен первого пробела после слова
                                *out++=*first++; //в массив out записывается содержимое массива buf, на который указывает *first (++ сдвигаем оба указателя на 1 позицию)
                        *out++=' '; //как только скопировали слово, ставим после него пробел
                        *out='\0'; //присваиваем конец файла
//во время этих манипуляций указатель на первую букву пройдет до первого после слова пробела
                }
                else first=end;     //если слово не подходит, просто присваиваем указателю на первую букву адрес первого после слова пробела и цикл продолэается...
        }
}
Надеюсь, теперь все понятно ?
0
Existor
0 / 0 / 0
Регистрация: 17.09.2009
Сообщений: 11
27.04.2010, 14:15  [ТС] #9
Охх, я даже не знаю, как отблагодарить Мега-спасибо!
0
tovsam
0 / 0 / 0
Регистрация: 03.12.2010
Сообщений: 6
06.12.2010, 15:17 #10
не компилируются не одна из предложенных
0
easybudda
Модератор
Эксперт CЭксперт С++
9693 / 5643 / 962
Регистрация: 25.07.2009
Сообщений: 10,847
06.12.2010, 15:39 #11
tovsam, да ну?! А hello world компилируется? И раз уж на то пошло, указывайте компилятор и ошибки.
0
tovsam
0 / 0 / 0
Регистрация: 03.12.2010
Сообщений: 6
06.12.2010, 19:04 #12
ой это c++?

если да, можно её же в си?
0
easybudda
Модератор
Эксперт CЭксперт С++
9693 / 5643 / 962
Регистрация: 25.07.2009
Сообщений: 10,847
07.12.2010, 09:19 #13
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
#include <stdio.h>
#include <string.h>
 
int isvowel(int ch){
    static const char VOWELS[] = "AaEeIiOoUuYy";
    return ( strchr(VOWELS, ch) != NULL );
}
 
#define DELIM " ,.;:\"'[]{}()@#$%^&*-_!?<>\t\n\\"
 
int main(void){
    char buf[BUFSIZ], * p;
    int cnt;
    
    printf("String: ");
    if( ! fgets(buf, BUFSIZ, stdin) ){
        fprintf(stderr, "Wrong input!\n");
        return 1;
    }
    
    cnt = 0;
    for ( p = strtok(buf, DELIM); p; p = strtok(NULL, DELIM) )
        if ( isvowel(p[0]) && isvowel(p[strlen(p) - 1]) && ++cnt )
            printf("%s\n", p);
 
    printf("%d words found.\n", cnt);
    
    return 0;
}
0
tovsam
0 / 0 / 0
Регистрация: 03.12.2010
Сообщений: 6
07.12.2010, 21:47 #14
easybudda очень благодарен, спасибо, только ещё одна вещь можно такое же пояснение как в предыдущих программах на си++?
0
easybudda
Модератор
Эксперт CЭксперт С++
9693 / 5643 / 962
Регистрация: 25.07.2009
Сообщений: 10,847
07.12.2010, 23:23 #15
Цитата Сообщение от tovsam Посмотреть сообщение
можно такое же пояснение как в предыдущих программах на си++?
Да у меня вроде и в первой программе столько же комментариев... На самом деле каждую строчку комментировать - это, как первую пару глав из учебника по частям перепечатывать... Поищите например тут описание стандартных функций, которые были использованы, а их не так много: strchr fgets fprintf strtok strlen printf - можно прям отсюда копировать и там в поиск вставлять. Если останутся вопросы - задавайте...
0
07.12.2010, 23:23
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.12.2010, 23:23
Привет! Вот еще темы с ответами:

Вывести слова, начинающиеся и заканчивающиеся одной и той же буквой - C++
Помогите пожалуйста с задачкой!!! Разработать алгоритм и программу. Вводится тест из заглавных и строчных латинских букв, пробелов....

Считывание текста с клавиатуры и нахождение слова, начинающиеся и заканчивающиеся согласной буквой - C++
#include &lt;iostream&gt; #include &lt;sstream&gt; #include &lt;string&gt; #include &lt;cctype&gt; #include &lt;iterator&gt; int main(){ ...

Распечатать все слова из каждой строки, начинающиеся и заканчивающиеся на заданную букву. - C++
Строки состоят из слов, разделенных пробелами. Распечатать все слова из каждой строки, начинающиеся и заканчивающиеся на заданную букву. ...

Переписать в другой файл только слова, начинающиеся с согласной, а заканчивающиеся гласной - C++
Помогите с лабораторной. Дан файл, содержащий текст. Переписать в другой файл только слова, начинающиеся с согласной, а...


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

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

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