Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
3 / 4 / 1
Регистрация: 12.11.2015
Сообщений: 77
1

Обработать текст согласно условию

07.10.2016, 01:33. Показов 488. Ответов 11
Метки нет (Все метки)

Дана строка текста, в которой слова разделены пробелами. Необходимо:
- определить количество слов в строке;
- найти самое короткое слово в строке и вывести его;
- поменять местами первое и последнее слова в строке, а затем вывести текст на экран.
0

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
07.10.2016, 01:33
Ответы с готовыми решениями:

Обработать вещественное число согласно условию
Всем привет! У меня есть число , припустим , это 0,12345678 мне надо из этого числа сделать...

Обработать одномерный массив согласно условию
В одномерном массиве, состоящем из n целых элементов, вычислить: - сумму элементов массива,...

Обработать одномерный массив согласно условию задачи
В одномерном массиве, состоящем из n целых элементов, вычислить: 1) номер максимального элемента...

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

11
Helper C/C++
286 / 163 / 122
Регистрация: 22.09.2016
Сообщений: 518
07.10.2016, 10:02 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
#include <iostream>
 
using namespace std;
 
int main()
{
    char str[256] = "one two three four five six seven eight nine ten\0";
 
    std::cout << "string = " << str << endl << endl;
 
    int wcount = 1;
    for (int i = 0; str[i] != '\0'; i++)
        wcount = (str[i] == ' ') ? wcount + 1 : wcount;
 
    int min_pos = -1, max_pos = min_pos;
    int min_len = -1, max_len = min_len;
    for (int i = 0; str[i] != '\0'; i++)
        if (str[i] == ' ' || i == strlen(str) - 1)
        {
            int k = (i != strlen(str) - 1) ? i - 1 : i;
            int n = (i == strlen(str) - 1) ? i + 1 : i;
            while (str[k] != ' ' && k >= 0) k--;
 
            if (std::abs(k - n) < min_len || min_len == -1)
            {
                min_len = std::abs(k - n); min_pos = k + 1;
            }
 
            if (std::abs(k - n) > max_len || max_len == -1)
            {
                max_len = std::abs(k - n); max_pos = k + 1;
            }
        }
 
    char* word_min = new char[256];
    strncpy(word_min, &str[min_pos], min_len);
 
    char* word_max = new char[256];
    strncpy(word_max, &str[max_pos], max_len);
 
    word_min[min_len - 1] = '\0'; word_max[max_len - 1] = '\0';
 
    int pos_i = 0, pos_j = strlen(str) - 1;
    while (str[pos_j] != ' ' && pos_j >= 0) pos_j--;
    while (str[pos_i] != ' ' && str[pos_i] != '\0') pos_i++;
 
    char* word_first = new char[256];
    strncpy(word_first, &str[0], pos_i);
 
    char* word_last = new char[256];
    strncpy(word_last, &str[pos_j + 1], strlen(str) - pos_j);
 
    word_first[pos_i] = '\0'; word_last[pos_j] = '\0';
 
    std::cout << "word with minimum length is "" << word_min << """ << " at position: " << min_pos << " with length: " << min_len - 1 << endl;
    std::cout << "word with maximum length is "" << word_max << """ << " at position: " << max_pos << " with length: " << max_len - 1 << endl;
 
    std::cout << endl;
 
    std::cout << "first word of string is "" << word_first << """ << endl;
    std::cout << "last word of string is "" << word_last << """ << endl << endl;
 
    std::cout << "total number of words is: " << wcount << endl;
 
    std::cin.get();
}
1
Миниатюры
Обработать текст согласно условию  
Эксперт C
25822 / 16105 / 3455
Регистрация: 24.12.2010
Сообщений: 35,206
07.10.2016, 10:33 3
Несколько мелочей.
Строчки 12-13 не лучше ли записать так
C++
1
2
for(int i=0; str[i]; i++)
   if (str[i]==' ') wcount++;
Что будет, если слов в строке вообще нет? char str[] = ""; ?
Совсем не обязательно указывать str[256] Транслятор сам догадается.
В задании этого правда не сказано, но по-хорошему слова могут отделяться несколькими пробелами. Ведь довольно глупо будет выглядеть
C++
1
char str[] = "  one  ";  // ваш ответ 5 слов
не правда ли?
Дальше строчки 14 не смотрел, но я вам верю
0
Helper C/C++
286 / 163 / 122
Регистрация: 22.09.2016
Сообщений: 518
07.10.2016, 10:48 4
Байт, вот пожалуйста, если вас это интересует, готовый код решающий данную проблему. Для "новичков" я даю наиболее общее решение, без всяких выкрутасов:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
    char str[256] = "one     two     three      four      five       six      seven       eight     nine            ten\0";
 
    std::cout << "string = " << str << endl << endl;
 
    for (int i = 0; str[i] != '\0'; i++)
        if (str[i] == ' ')
        {
            while (str[i + 1] == ' ')
            {
                int j = i;
                while (str[j] != '\0')
                    str[j++] = str[j + 1];
            }
        }
0
Эксперт C
25822 / 16105 / 3455
Регистрация: 24.12.2010
Сообщений: 35,206
07.10.2016, 10:59 5
Invader0x7F, Сдвигать исходную строку? Имхо, дурной тон, фи. И я бы не стал новичков учить этому.
И забыли поставить поставить терминальный нолик в конце преобразованной. Там же куча мусора осталось.
0
Helper C/C++
286 / 163 / 122
Регистрация: 22.09.2016
Сообщений: 518
07.10.2016, 11:09 6
Вот совсем стабильная версия коде:

C++
1
2
3
4
5
6
7
8
9
10
    char str[256] = " one     two     three      four      five       six      seven       eight     nine            ten  \0";
 
    std::cout << "string = " << str << endl << endl;
 
    for (int i = 0; str[i] != '\0'; i++)
        if (str[i] == ' ')
        {
            while ((str[i + 1] == ' ') || (str[i] == ' ' && (i == 0) || (i == strlen(str)-1)))
                std::memcpy(&str[i], &str[i + 1], strlen(str) - 1);
        }
Что думаете ?

Добавлено через 2 минуты
Байт, для "новичков" все это более чем непонятно. Такие задачи - это уровень профи.
0
Эксперт C
25822 / 16105 / 3455
Регистрация: 24.12.2010
Сообщений: 35,206
07.10.2016, 11:22 7
Цитата Сообщение от Invader0x7F Посмотреть сообщение
Что думаете ?
О сдвиге исходной строки я уже высказался. Но даже если это замечание проигнорировать (что вы и сделали, а напрасно). код поражает своей неэффективностью. Таскать целыми строками (memcpy) - некрасиво как-то.
Я бы сделал так
C++
1
2
3
4
5
6
7
8
9
10
11
12
for(i=wcount=flag=0; s[i]; i++) {
  if (flag==0) {
    if (s[i]==' ') continue;
    else {
      flag = 1;
      wcount++;
    }
  }
  else {
     if (s[i]==' ') flag=0;
  }
}
Возможно, код может быть улучшен, написал первое, что в голову пришло. Возможны и ошибки - не проверял. Если вы их найдете или/и улучшите код, буду благодарен. Но идея, надеюсь, понятна.

Добавлено через 2 минуты
Цитата Сообщение от Invader0x7F Посмотреть сообщение
Такие задачи - это уровень профи.
Что вы говорите? Вы правда так думаете? Невысокого же вы мнения о профи! Ничего не говоря уже о том, что новичков совсем за быдло считаете!
0
Helper C/C++
286 / 163 / 122
Регистрация: 22.09.2016
Сообщений: 518
07.10.2016, 12:09 8
Ваш код НЕ работает . Вот код который выполняет вышеуказанное:

C++
1
2
3
4
5
6
7
8
9
10
    char str[256] = "             one     two     three      four      five       six      seven       eight     nine            ten            \0";
 
    std::cout << "string = " << str << endl << endl;
 
    char str2[256] = "\0"; int n = 0;
    for (int i = 0; str[i] != '\0'; i++)
        if ((str[i] != ' ') || (str[i] == ' ' &&
            str[i + 1] != ' ' && i > 0 && n > 0)) str2[n++] = str[i];
 
    str2[n-1] = '\0';
Добавлено через 3 минуты
Что вы говорите? Вы правда так думаете? Невысокого же вы мнения о профи! Ничего не говоря уже о том, что новичков совсем за быдло считаете!
А что именно Вы считаете уровнем профи ??
0
Эксперт C
25822 / 16105 / 3455
Регистрация: 24.12.2010
Сообщений: 35,206
07.10.2016, 16:08 9
Цитата Сообщение от Invader0x7F Посмотреть сообщение
Ваш код НЕ работает
Естественно. Поскольку это не код, а псевдокод. И его надо грамотно вставить в программу. А как вы его вставили - мне неизвестно.
Во-вторых. Самых начинающих новичков я учу отказываться от этой формулировки. "Не работает". Информативность этого сообщения близка к нулю. Прошу рассказать, где и как не работает. На какой стадии. Не транслируется, не линкуется, зависает, выскакивает с ошибкой (какой), считает, да не так (что ожидается и что выводится). Я считал, что вас, как человека кое-что умеющего, таким азам учить не надо. Однако, заблуждался.
0
Эксперт С++
1594 / 926 / 777
Регистрация: 06.02.2016
Сообщений: 2,412
Записей в блоге: 29
07.10.2016, 16:33 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
#include <iostream>
#include <string>
#include <vector>
#include <sstream>
#include <algorithm>
using namespace std;
int main() {
    setlocale(LC_ALL,"RUS");
    vector<string>val;
    string s;
    getline(cin,s);
    stringstream ss(s);
    string s1;
    while(getline(ss,s1,' ')) {
        val.push_back(s1);
    }
    cout<<"Количество слов в строке "<<val.size()<<endl;
    iter_swap(val.begin(),val.end()-1);
    for(vector<string>::iterator iter=val.begin(); iter!=val.end(); iter++) {
        cout<<*iter<<" ";
    }
    vector<string>::iterator mi=min_element(val.begin(),val.end(),[](string a,string b) {
        return a.length()<b.length();
    });
    cout<<endl;
    cout<<"Наименьшее слово "<<*mi;
    return 0;
}
0
Helper C/C++
286 / 163 / 122
Регистрация: 22.09.2016
Сообщений: 518
07.10.2016, 17:47 11
Естественно. Поскольку это не код, а псевдокод. И его надо грамотно вставить в программу. А как вы его вставили - мне неизвестно.
Во-вторых. Самых начинающих новичков я учу отказываться от этой формулировки. "Не работает". Информативность этого сообщения близка к нулю. Прошу рассказать, где и как не работает. На какой стадии. Не транслируется, не линкуется, зависает, выскакивает с ошибкой (какой), считает, да не так (что ожидается и что выводится). Я считал, что вас, как человека кое-что умеющего, таким азам учить не надо. Однако, заблуждался.
Извините за поздний ответ. Понятие "не работает" означает что выложенный вами код не выполняет заявленной функции. Вы выложили псевдокод, который после преобразование в программу то ли на Паскале, то ли С или же С++ все равно выполнять заявленной функции не будет. Надо ли мне комментировать Вам пошагово процесс работы Вашего кода. И кстати же Вы сами ранее сомневались в его работоспособности и просили меня его проверить:

Возможно, код может быть улучшен, написал первое, что в голову пришло. Возможны и ошибки - не проверял. Если вы их найдете или/и улучшите код, буду благодарен. Но идея, надеюсь, понятна.
Байт, Вы конечно извините, критика - это вполне здоровое явление нашей жизни, и это очень хорошо что Вы пытаетесь критиковать других, НО "вектор Вашей критики, на мой взгляд направлен в неправильную сторону".

Ещё раз извините.
0
Эксперт C
25822 / 16105 / 3455
Регистрация: 24.12.2010
Сообщений: 35,206
07.10.2016, 20:47 12
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>
main()
{
int flag, i, wcount;
//char s[] ="  one   two ";  // Выводит wcount = 2
//char s[] ="one two";       // wcount = 2
char s[] ="one two 3";       // wcount = 3
for(i=wcount=flag=0; s[i]; i++) {
  if (flag==0) {
    if (s[i]==' ') continue;
    else {
      flag = 1;
      wcount++;
    }
  }
  else {
     if (s[i]==' ') flag=0;
  }
}
printf("wcount=%d\n", wcount);
return 0;
}
Цитата Сообщение от Invader0x7F Посмотреть сообщение
Вы сами ранее сомневались в его работоспособности
Все сомнения отметены.
Если у вас как-то по другому, покажите код (с моим псевдокодом)

Добавлено через 2 минуты
Цитата Сообщение от Invader0x7F Посмотреть сообщение
Извините за поздний ответ.
А вот тут извиняться совершенно не за что. Мы же не прикованные к галере. Есть свободная минутка и желание - идем на форум. Нет того или другого - никто не заставит.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
07.10.2016, 20:47

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Обработать одномерный массив согласно условию задачи
1. Найти сумму отрицательных элементов массива. 2. Найти произведение элементов массива,...

Преобразовать матрицу согласно условию
Помогите плииз с задачкой!=) Дана целочисленная матрица размера n x m, целые числа k, l (1 ≤...

Сформировать массив согласно условию
из элементов массива D сформировать массив А того же размера по правилу:если номер чётный, то...

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


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

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

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