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

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

22.09.2018, 13:35. Показов 10258. Ответов 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
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
22.09.2018, 13:35
Ответы с готовыми решениями:

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

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

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

33
115 / 83 / 43
Регистрация: 19.01.2018
Сообщений: 484
22.09.2018, 13:38
Дарья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  [ТС]
RostikTawer, а как мне это применить в моем коде?
0
475 / 427 / 290
Регистрация: 10.03.2015
Сообщений: 1,782
22.09.2018, 14:01
Дарья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  [ТС]
SuperKir, а что писать в самом цикле?
0
115 / 83 / 43
Регистрация: 19.01.2018
Сообщений: 484
22.09.2018, 14:27
Лучший ответ Сообщение было отмечено Дарья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  [ТС]
Нужно чтобы программа работала меньше 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
Сообщений: 484
22.09.2018, 15:48
Цитата Сообщение от Дарья1907 Посмотреть сообщение
меньше 1 секунды, сейчас работает 2 секунды
зависит от кол-ва слов

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

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

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

Добавлено через 2 минуты
Для 15 слов что то 2 сек это слишком долго...
0
115 / 83 / 43
Регистрация: 19.01.2018
Сообщений: 484
22.09.2018, 16: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
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
22.09.2018, 16:14
Еще endl лучше заменить на '\n' потому что endl так же приводит к flush буфера потока вывода.
Короче это те места которые показались мне неоптимальными
0
Модератор
Эксперт С++
 Аватар для zss
13773 / 10966 / 6491
Регистрация: 18.12.2011
Сообщений: 29,243
22.09.2018, 16:44
Можно сократить улучшив код функций 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
Цитата Сообщение от Дарья1907 Посмотреть сообщение
Нужно чтобы программа работала меньше 1 секунды, сейчас работает 2 секунды
Нужно избавиться от ненужной:
Цитата Сообщение от Дарья1907 Посмотреть сообщение
int Length(char *s)
0
475 / 427 / 290
Регистрация: 10.03.2015
Сообщений: 1,782
22.09.2018, 17:21
Дарья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  [ТС]
EVP, я убрала эту функцию
0
1 / 1 / 0
Регистрация: 15.09.2018
Сообщений: 51
22.09.2018, 17:29  [ТС]
SuperKir, Эта программа не выдает ни одного слова, а в предложении есть слова начин и заканч на гласные

Добавлено через 44 секунды
SuperKir, Эта программа не выдает ни одного слава, хотя в предложении он есть
0
475 / 427 / 290
Регистрация: 10.03.2015
Сообщений: 1,782
22.09.2018, 17:33
Дарья1907, Предложение "Слова, начинающиеся с гласных английских букв:" выводится?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
22.09.2018, 17:33
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
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