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

Сортировка слов в строке по длине слова

23.02.2016, 14:52. Просмотров 4040. Ответов 7
Метки нет (Все метки)

Помогите пожалуйста с алгоритмом сортировки строки.
Необходимо осуществить сортировку строки чтобы в начале строки
располагалось слово максимальной длины, а в конце строки - минимальной.
Не совсем понимаю как реализовать данный алгоритм.
Мудрил, но так ничего и не получилось.
Примерно в голове понимаю что надо сделать. Но на реализацию не хватает знания.
Задать строку размером n символов.
Попросить пользователя ввести её. используя gets.
Затем взять строку и разбить её на слова используя strtok.
Ну и тут у меня начинаются проблемы. Я не понимаю
как это сделать, в цикле, слово должно записаться в новую строку а потом свериться ещё одним разбитым словом.
Если оно больше, поменять их местами используя дополнительный массив, чтоб не потерять данные.
Затем это всё соеденить используя strcat.
Никак не получается это воплотить в реальность.
P.S может у меня алгоритм кривой, поэтому ничего не получается?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
23.02.2016, 14:52
Ответы с готовыми решениями:

Ввести строку и слово. Вывести количество слов в строке, имеющих длину, равную длине введенного слова.
Ввести строку и слово. Вывести количество слов в строке, имеющих длину, равную длине введенного...

Ввести строку и слово. Вывести количество слов в строке, имеющих длину, равную длине введенного слова.
Как ввести строку и слово, чтобы вывести количество слов в строке, имеющих длину, равную длине...

Как отсортировать строки по кол-ву слов и слова в строке по длине слов
Суть задания:Вводить последовательность не более чем 256 символов,ввод заканчивается...

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

7
Заблокирован
23.02.2016, 17:23 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
#include <iostream>
#include <cstring>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
 
bool pred(const string &a, const string &b)
{
    if (a.size() > b.size()) return true;
    return false;
}
 
int main() 
{
    vector<string> v;
    vector<string> :: iterator it;
    char str[] = "AAAAAA BBBBBBBB CCCCCCcCC";
    cout<<str<<endl;
    char * pch = strtok (str," ,.-"); 
 
  while (pch != NULL)                         
  {
      v.push_back(string(pch));
      pch = strtok (NULL, " ,.-");
  }
  
  sort(v.begin(),v.end(),pred);
  cout<<"**************************************"<<endl;
  
  string s;
  it = v.begin();
  while (it!=v.end())
  {
    s += *it;
    s += " ";
    it++;
  }
  v.clear();
  cout<<s<<endl;
    return 0;
}
1
0 / 0 / 0
Регистрация: 10.12.2015
Сообщений: 18
24.02.2016, 11:41  [ТС] 3
Спасибо, не совсем понимаю что происходит в данном коде. Не проходил ещё вектора. Попробую почитать про вектора. Попробую переделать под обычное управление массивами.

Добавлено через 17 часов 23 минуты
Чёт я вообще потух. Помогите с решением задачи.
Задан текст, состоящий из строк. Строк не менее 10. В строке не менее 5
слов. В слове не менее 5 символов. Слова разделены 1 пробелом.
Осуществить сортировку строк таким образом, чтобы в начале строки
располагалось слово максимальной длины, а в конце строки - минимальной.
Программа должна выполнять ввод текста, вывод его исходного варианта,
выполнять необходимые действия и выводить полученный текст.
Без использования векторов.
Пытался хотя бы для 1 строки выполнить сортировку. Дохожу до разделение предложения на буквы и
дальше даже не понимаю в каком направлении двигаться.
з.ы голова уже пухнет от всего
0
0 / 0 / 0
Регистрация: 18.02.2016
Сообщений: 2
24.02.2016, 12:06 4
Цитата Сообщение от Siplbl Посмотреть сообщение
Дохожу до разделение предложения на буквы и
дальше даже не понимаю в каком направлении двигаться.
Зачем ты разделяешь предложение на буквы?
Читаешь слово, считаешь в нем кол-во букв, пишешь в новый массив, читаешь следующее, до знака перехода, сортируешь массив.

Добавлено через 13 минут
Или считай буквы до пробела и записывай результат в массив, потом сортируй. Так до знака перехода.

Или юзай библиотеки.
0
Заблокирован
24.02.2016, 12:32 5
Цитата Сообщение от Siplbl Посмотреть сообщение
Спасибо, не совсем понимаю что происходит в данном коде. Не проходил ещё вектора.
происходит то что сам предложил. можешь написать свой вектор.
Цитата Сообщение от Siplbl Посмотреть сообщение
Чёт я вообще потух
я привел решение твоей проблемы , что еще надо то ?

Цитата Сообщение от Siplbl Посмотреть сообщение
Без использования векторов.
я пас ! не шибко хочу создавать колесо.
0
0 / 0 / 0
Регистрация: 10.12.2015
Сообщений: 18
24.02.2016, 20:21  [ТС] 6
Цитата Сообщение от Arzanis Посмотреть сообщение
Зачем ты разделяешь предложение на буквы?
Нето написал
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
#include <iostream>
#include <string.h>
using namespace std;
void main(void)
{
    int n = 5;
    char **str = new char*[n];
    cout << "Enter strings:\n";
    for (int i = 0; i < n; i++)
    {
        str[i] = new char[50];
        gets(str[i]);
    }
    char *temp = new char[100];
    for (int y = 0; y < n; y++)
        for (int i = 0; i < n - 1; i++)
        {
            char *pch = strtok(str[i], " ,.-");
            while (pch != NULL)
            {
                strcpy(temp, pch);
                pch = strtok(NULL, " ,.");
            }
        }
}
Дохожу до сюда и дальше просто не понимаю как реализовать проверку длинны слов и сортировку строк.strtok даёт слово я его кидаю в новый массив. Дальше что с ним делать?

Добавлено через 4 минуты
Цитата Сообщение от RAFA91 Посмотреть сообщение
Сообщение от Siplbl
Чёт я вообще потух
я привел решение твоей проблемы , что еще надо то ?
Сообщение от Siplbl
Без использования векторов.
я пас ! не шибко хочу создавать колесо.
Да я просто разобрать пытаюсь взяв ваш алгоритм и переделать под свои знания.
0
Заблокирован
25.02.2016, 12:58 7
Цитата Сообщение от Siplbl Посмотреть сообщение
gets(str[i]);
тут ты вводишь слово или строку ?
0
0 / 0 / 0
Регистрация: 10.12.2015
Сообщений: 18
25.02.2016, 20:26  [ТС] 8
Как сделать корректный вывод строк?
Чтоб строки выводились как при вводе только отсортированные.
у меня только так получается
http://images.vfl.ru/ii/145641... 5064_m.jpg
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<string.h>
using namespace std;
int main()
{
    int bg = 0;
    int n = 2;
    char*str = new char[120];
    char *p = NULL, *tmp = NULL;
    char *pts[20];
    for (int i = 0; i < n; i++)
    {
        pts[i] = new char[80];
        cout << "Enter string  " << i << ": ";
        gets(pts[i]);
    }
    char *strarray [20];
    for (int y = 0; y < n; y++)
    {
        str = new char[120];
        strcpy(str, pts[y]);
            p = strtok(str, " ");
            for (int j = 0;; j++)
            {
                if (p)
                {
                    strarray[bg] = new char[80];
                    strcpy(strarray[bg], p);
                    strarray[bg];
                    bg++;
                }
                else
                    break;
                p = strtok(NULL, " ");
            }
            delete[]str;
    }
    for (int i = 0; i<bg; i++)
    {
        for (int j = 0; j<bg - 1; j++)
        {
            if (strlen(strarray[j])<strlen(strarray[j + 1]))
            {
                tmp = strarray[j];
                strarray[j] = strarray[j + 1];
                strarray[j + 1] = tmp;
            }
        }
    }
    for (int i = 0; i < bg; i++)
    {
        str = new char[120];
        strcpy(str, strarray[i]);
        cout << str << " ";
        delete[]str;
    }
    cout << "\n";
    for (int i = 0; i < bg; i++)
    {
        delete [] strarray[i];
    }
    for (int i = 0; i < n; i++)
    {
        delete[]pts[i];
    }
}
Добавлено через 47 минут
а всё, переделал.
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
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
/*Эта программа сортирует слова в строках по убыванию*/
/*Вариант 8:*/
/*Задан текст, состоящий из строк. Строк не менее 10. В строке не менее 5
слов. В слове не менее 5 символов. Слова разделены 1 пробелом.
Осуществить сортировку строк таким образом, чтобы в начале строки
располагалось слово максимальной длины, а в конце строки - минимальной.
Программа должна выполнять ввод текста, вывод его исходного варианта,
выполнять необходимые действия и выводить полученный текст.
*/
#include<iostream>
#include<string.h>
#include<Windows.h>
using namespace std;
char*Rus(const char*text);
void str_sort(char *string[], int num);
void str_out(char*string[], int num);
void del(char*string[], int num);
void main()
{
    int bg = 0;
    int n = 5;
    char*str = new char[120];
    char *p = NULL, *tmp = NULL;
    char *pts[20];
    for (int i = 0; i < n; i++)
    {
        pts[i] = new char[80];
        cout << "Enter string  " << i << ": ";
        gets(pts[i]);
    }
    char *strarray [20];
    for (int y = 0; y < n; y++)
    {
        int bg = 0;
        str = new char[120];
        strcpy(str, pts[y]);
        p = strtok(str, " ");
        for (int j = 0;; j++)
        {
            if (p)
            {
                strarray[bg] = new char[80];
                strcpy(strarray[bg], p);
                strarray[bg];
                bg++;
            }
            else
                break;
            p = strtok(NULL, " ");
        }
        str_sort(strarray, bg);
        str_out(strarray, bg);
        del(strarray, bg);
        bg = 0;
        delete[]str;
    }
    for (int i = 0; i < n; i++)
    {
        delete[]pts[i];
    }
}
void del(char*string[], int num)
{
    for (int i = 0; i < num; i++)
    {
        delete[]string[i];
    }
}
void str_out(char*string[], int num)
{
    for (int i = 0; i < num; i++)
    {
        cout<<(string[i]);
        cout << " ";
    }
    cout << "\n";
}
void str_sort(char *string[], int num)
{
    char *tmp;
    for (int i = 0; i<num; i++)
    {
        for (int j = 0; j<num - 1; j++)
        {
            if (strlen(string[j])<strlen(string[j + 1]))
            {
                tmp = string[j];
                string[j] = string[j + 1];
                string[j + 1] = tmp;
            }
        }
    }
}
char bufRus[256];
char*Rus(const char*text)
{
    CharToOemA(text, bufRus);
    return bufRus;
}
3 дня [censored]
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
25.02.2016, 20:26

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

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

Сортировка слов по длине первого слова
Хотелось бы понять, почему в нижнем цикле я ставлю || != '\n' вместо &amp;&amp; != '\n' то проиходит ошибка...

Сортировка по длине слов в строке в тасме
Здравствуйте, решал задачу по ассемблеру и возникла проблема с типом данных, но я так и не смог ее...

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


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

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

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