Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.81/27: Рейтинг темы: голосов - 27, средняя оценка - 4.81
1 / 1 / 0
Регистрация: 15.09.2018
Сообщений: 51
1

Найти последнюю букву слова

22.09.2018, 13:35. Просмотров 5086. Ответов 33

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

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
#include <iostream>
#include <fstream>
#include <cstring>
 
using namespace std;
 
int main()
{
    setlocale (LC_ALL,"rus");
    char slovo[15]; 
    ifstream in("tr.txt"); 
    cout << "Слова,начинающиеся с гласных английских букв: \n";
    while(!in.eof()){ 
        in >> slovo; 
        if( slovo[0] == 'A'
    || slovo[0] == 'a' 
    || slovo[0] == 'E'
    || slovo[0] == 'e'  
    || slovo[0] == 'Y'
    || slovo[0] == 'y' 
    || slovo[0] == 'U'
    || slovo[0] == 'u' 
    || slovo[0] == 'I'
    || slovo[0] == 'i'
    || slovo[0] == 'O'
    || slovo[0] == 'o') 
    cout << slovo << endl;
    }
 
    system ("pause");
    return 0;
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
22.09.2018, 13:35
Ответы с готовыми решениями:

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

Напечатать все слова отличные от последнего слова, предварительно перенести последнюю букву в начало слова
Дано текст, содержащий от 2 до 30 слов, в каждом из которых от 2 до 10 латинских букв, между...

Напечатать слова, которые отличны от последнего слова текста, предварительно удалив из слова последнюю букву
Дана последовательность содержащая от 1 до 30 слов, в каждом из которых от 1 до 5 строчных...

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

33
115 / 83 / 43
Регистрация: 19.01.2018
Сообщений: 485
22.09.2018, 13:38 2
Дарья1907, slovo[slovo.length() - 1] - это так в строке, а ты создай функцию
C++
1
2
3
4
5
6
7
int Length(char *s)
{
   int retInt = 0;
   for(; s[retInt]; retInt++)
      ;
   return retInt; 
}
и используй slovo[Length(slovo) - 1], либо сразу в функции при возращении сделай -1
0
1 / 1 / 0
Регистрация: 15.09.2018
Сообщений: 51
22.09.2018, 13:56  [ТС] 3
RostikTawer, а как мне это применить в моем коде?
0
469 / 422 / 290
Регистрация: 10.03.2015
Сообщений: 1,782
22.09.2018, 14:01 4
Дарья1907,
C++
1
2
3
4
if ((!strcmp(slovo[strlen(slovo) - 1], slovo[0]) && /*тут проверка на гласность*/)
{
...
}
0
1 / 1 / 0
Регистрация: 15.09.2018
Сообщений: 51
22.09.2018, 14:11  [ТС] 5
SuperKir, а что писать в самом цикле?
0
115 / 83 / 43
Регистрация: 19.01.2018
Сообщений: 485
22.09.2018, 14:27 6
Лучший ответ Сообщение было отмечено Дарья1907 как решение

Решение

Дарья1907,
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
#include <iostream>
#include <fstream>
#include <cstring>
 
using namespace std;
 
int Length(char *s)
{
    int retInt = 0;
    for (; s[retInt]; retInt++)
        ;
    return retInt;
}
 
bool FirstWordG(char *slovo)
{
    if (slovo[0] == 'A'
            || slovo[0] == 'a'
            || slovo[0] == 'E'
            || slovo[0] == 'e'
            || slovo[0] == 'Y'
            || slovo[0] == 'y'
            || slovo[0] == 'U'
            || slovo[0] == 'u'
            || slovo[0] == 'I'
            || slovo[0] == 'i'
            || slovo[0] == 'O'
            || slovo[0] == 'o')
            return true;
            return false;
}
 
bool LastWordG(char *slovo)
{
    char s = slovo[Length(slovo) - 1];
    if (s == 'A'
            || s == 'a'
            || s == 'E'
            || s == 'e'
            || s == 'Y'
            || s == 'y'
            || s == 'U'
            || s == 'u'
            || s == 'I'
            || s == 'i'
            || s == 'O'
            || s == 'o')
            return true;
            return false;
}
 
int main()
{
    setlocale(LC_ALL, "rus");
    char slovo[15];
    ifstream in("tr.txt");
    cout << "Слова,начинающиеся с гласных английских букв: \n";
    while (!in.eof()) {
        in >> slovo;
        if (FirstWordG(slovo) || LastWordG(slovo))
            cout << slovo << endl;
    }
 
    system("pause");
    return 0;
}
1
1 / 1 / 0
Регистрация: 15.09.2018
Сообщений: 51
22.09.2018, 15:05  [ТС] 7
Нужно чтобы программа работала меньше 1 секунды, сейчас работает 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
61
62
63
64
65
66
67
68
69
70
71
72
73
#include <iostream>
#include <fstream>
#include <cstring>
 
using namespace std;
 
int Length(char *s)
{
    int retInt = 0;
    for (; s[retInt]; retInt++);
    return retInt;
}
 
bool FirstWordG(char *slovo)
{
    switch (slovo[0])
    {
    case'A':
    case'a':
    case'E':
    case'e':
    case 'Y':
    case 'y':
    case 'U':
    case'u':
    case 'I':
    case 'i':
    case 'O':
    case 'o':
        return true;
    default:
        return false;
    }
}
 
bool LastWordG(char *slovo)
{
    char s = slovo[Length(slovo) - 1];
    switch (s)
    {
    case'A':
    case'a':
    case'E':
    case'e':
    case 'Y':
    case 'y':
    case 'U':
    case'u':
    case 'I':
    case 'i':
    case 'O':
    case 'o':
        return true;
    default:
        return false;
    }
}
 
int main()
{
    setlocale(LC_ALL, "rus");
    char slovo[15];
    ifstream in("tr.txt");
    //cout << "Слова,начинающиеся и оканчивающиеся  гласными  буквами: \n";
    while (!in.eof()) {
        in >> slovo;
        if (FirstWordG(slovo) && LastWordG(slovo))
            cout << slovo << endl;
    }
 
    //system("pause");
    return 0;
}
0
115 / 83 / 43
Регистрация: 19.01.2018
Сообщений: 485
22.09.2018, 15:48 8
Цитата Сообщение от Дарья1907 Посмотреть сообщение
меньше 1 секунды, сейчас работает 2 секунды
зависит от кол-ва слов

Цитата Сообщение от Дарья1907 Посмотреть сообщение
in >> slovo;
оператор так долго считывает
0
737 / 341 / 71
Регистрация: 10.06.2014
Сообщений: 2,357
22.09.2018, 15:48 9
Как я понимаю в файле много данных.
Попробуйте до цикла выделить память которая равна размеру файла.
Далее при помощи например fread запишите данные в этот массив.

Потом уже в цикле за данными обращайтесь к массиву а не к файловому потоку.
Скорее всего тормоза из за постоянных системных вызовов которые нужны для чтения порции данных на каждой итерации
0
115 / 83 / 43
Регистрация: 19.01.2018
Сообщений: 485
22.09.2018, 15:53 10
Цитата Сообщение от Undisputed Посмотреть сообщение
Попробуйте до цикла выделить память которая равна размеру файла.
Далее при помощи например fread запишите данные в этот массив.
разве не то же будет? Все равно будет запись файла, и разделения на слова.
0
1 / 1 / 0
Регистрация: 15.09.2018
Сообщений: 51
22.09.2018, 15:55  [ТС] 11
RostikTawer, в файле одно предложение из 15 слов
0
737 / 341 / 71
Регистрация: 10.06.2014
Сообщений: 2,357
22.09.2018, 16:03 12
RostikTawer,
По идее так должно быть быстрее из за сокращения количества системных вызовов.
Одно дело переключать контекст на каждой итерации (если конечно же нет каких то хитрых оптимизаций), другое дело сделать это один раз при старте программы.

Можно ещё попробовать не выводить строку на каждой итерации через cout, а загнать каждое подходящее слово в результирующий буфер. А в конце один раз вывести этот буфер. Потому что cout по сути тоже системный вызов (хотя у него должна быть своя буферизация, но не резиновая).

Добавлено через 2 минуты
Для 15 слов что то 2 сек это слишком долго...
0
115 / 83 / 43
Регистрация: 19.01.2018
Сообщений: 485
22.09.2018, 16:13 13
Дарья1907, объязательно тип char?

Добавлено через 5 минут
Дарья1907, вот то же самое со стрингом
Кликните здесь для просмотра всего текста
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
#include <iostream>
#include <fstream>
#include <string>
 
using namespace std;
 
int Length(string s)
{
    int retInt = 0;
    for (; s[retInt]; retInt++);
    return retInt;
}
 
bool FirstWordG(string slovo)
{
    switch (slovo[0])
    {
    case'A':
    case'a':
    case'E':
    case'e':
    case 'Y':
    case 'y':
    case 'U':
    case'u':
    case 'I':
    case 'i':
    case 'O':
    case 'o':
        return true;
    default:
        return false;
    }
}
 
bool LastWordG(string slovo)
{
    char s = slovo[slovo.length() - 1];
    switch (s)
    {
    case'A':
    case'a':
    case'E':
    case'e':
    case 'Y':
    case 'y':
    case 'U':
    case'u':
    case 'I':
    case 'i':
    case 'O':
    case 'o':
        return true;
    default:
        return false;
    }
}
 
int main()
{
    setlocale(LC_ALL, "rus");
    char slovo[15];
    ifstream in("tr.txt");
    //cout << "Слова,начинающиеся и оканчивающиеся  гласными  буквами: \n";
    while (!in.eof()) {
        //in >> slovo;
        string st;
        getline(in, st, ' ');
        if (FirstWordG(st) || LastWordG(st))
            cout << st << endl;
    }
 
    //system("pause");
    return 0;
}


Добавлено через 2 минуты
Дарья1907, у меня на 10к слов тратиться меньше секунды, что у тебя за предложения такое?

Кликните здесь для просмотра всего текста
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
#include <iostream>
#include <fstream>
#include <string>
 
using namespace std;
 
bool FirstWordG(string slovo)
{
    switch (slovo[0])
    {
    case'A':
    case'a':
    case'E':
    case'e':
    case 'Y':
    case 'y':
    case 'U':
    case'u':
    case 'I':
    case 'i':
    case 'O':
    case 'o':
        return true;
    default:
        return false;
    }
}
 
bool LastWordG(string slovo)
{
    char s = slovo[slovo.length() - 1];
    switch (s)
    {
    case'A':
    case'a':
    case'E':
    case'e':
    case 'Y':
    case 'y':
    case 'U':
    case'u':
    case 'I':
    case 'i':
    case 'O':
    case 'o':
        return true;
    default:
        return false;
    }
}
 
int main()
{
    setlocale(LC_ALL, "rus");
    string slovo, result;
    ifstream in("tr.txt");
    //cout << "Слова,начинающиеся и оканчивающиеся  гласными  буквами: \n";
    while (!in.eof()) {
        //in >> slovo;
        getline(in, slovo, ' ');
        if (FirstWordG(slovo) || LastWordG(slovo))
            result += slovo + " ";
    }
    cout << result;
 
    //system("pause");
    return 0;
}
0
737 / 341 / 71
Регистрация: 10.06.2014
Сообщений: 2,357
22.09.2018, 16:14 14
Еще endl лучше заменить на '\n' потому что endl так же приводит к flush буфера потока вывода.
Короче это те места которые показались мне неоптимальными
0
Модератор
Эксперт С++
9927 / 8445 / 5134
Регистрация: 18.12.2011
Сообщений: 22,617
22.09.2018, 16:44 15
Можно сократить улучшив код функций LastWordG и FirsttWordG
C++
1
2
3
4
5
6
7
8
9
10
11
bool LastWordG(char *slovo)
{
    char s = slovo[Length(slovo) - 1];
    bool glas[26]={1,0,.... и т.д. ... }; // единички - признак гласной буквы
    if(isaplha(s))
    {
       s=tolower(s);
       return glas[s-'a'];
    }
    return false;
}
1
510 / 272 / 60
Регистрация: 14.12.2010
Сообщений: 548
22.09.2018, 17:13 16
Цитата Сообщение от Дарья1907 Посмотреть сообщение
Нужно чтобы программа работала меньше 1 секунды, сейчас работает 2 секунды
Нужно избавиться от ненужной:
Цитата Сообщение от Дарья1907 Посмотреть сообщение
int Length(char *s)
0
469 / 422 / 290
Регистрация: 10.03.2015
Сообщений: 1,782
22.09.2018, 17:21 17
Дарья1907,
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
#include <iostream>
#include <fstream>
#include <string.h>
 
using namespace std;
 
bool check_letters(char *word)
{
    if (tolower(word[0]) == tolower(word[strlen(word)-1]))
    {
        if (strchr("AaEeIiOoUu", word[0])) return true;
        return false;
    }
    return false;
}
 
int main()
{
    setlocale (0,"");
    char slovo[15];
    ifstream in("tr.txt"); 
    if (in.is_open())
    {
        cout << "Слова, начинающиеся с гласных английских букв: \n";
        while(in >> slovo)
        {
            if (check_letters(slovo))
                cout << slovo << endl;
        }
        in.close()
    }
    return 0;
}
0
1 / 1 / 0
Регистрация: 15.09.2018
Сообщений: 51
22.09.2018, 17:24  [ТС] 18
EVP, я убрала эту функцию
0
1 / 1 / 0
Регистрация: 15.09.2018
Сообщений: 51
22.09.2018, 17:29  [ТС] 19
SuperKir, Эта программа не выдает ни одного слова, а в предложении есть слова начин и заканч на гласные

Добавлено через 44 секунды
SuperKir, Эта программа не выдает ни одного слава, хотя в предложении он есть
0
469 / 422 / 290
Регистрация: 10.03.2015
Сообщений: 1,782
22.09.2018, 17:33 20
Дарья1907, Предложение "Слова, начинающиеся с гласных английских букв:" выводится?
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
22.09.2018, 17:33

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

С клавиатуры вводится многострочный текст. Распечатать слова из текста, преобразовав их следующим образом: · перенести последнюю букву в начало слова;
С клавиатуры вводится многострочный текст. Распечатать слова из текста, преобразовав их следующим...

Найти слова, начинающиеся и оканчивающиеся на одну и ту же букву; слова, содержащие букву, встречающуюся N раз
Пусть задано множество строк. Вывести: а) слова, начинающиеся и оканчивающиеся на одну и ту же...

Перенести последнюю букву слова в начало С++
Дан текст. Словом текста считается любая последовательность букв алфавита; между соседними словами...

Удалить первую и последнюю букву слова - C++
Пользователь вводит массив строк, нужно удалить первую и последнюю букву каждого слова и вывести на...


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

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

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