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

Поменять местами самое короткое и самое длинное слова

23.12.2017, 06:34. Показов 2475. Ответов 1

Author24 — интернет-сервис помощи студентам
Помогите, пожалуйста
Вот само задание, чтобы было понятнее:
Дана символьная строка длиной не более 80 символов, состоящая из слов, разделенных пробелом.
Составить программу, которая вводит строку, организует из слов строки однонаправленный список,
сортируя его при вводе по длине слова. В сформированном списке поменять местами самое короткое и
самое длинное слова. Вывести на печать список до и после перестановки.
Я начала писать код, но не знаю как поменять эти слова местами
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
#include "stdafx.h"
#include <iostream>
#include <conio.h>
#include <locale.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <cstring>
#define _CRT_SECURE_NO_WARNINGS
#define _CRT_SECURE_NO_DEPRECATE
#define _CRT_NONSTDC_NO_DEPRECATE
#pragma warning(disable : 4996)
 
using namespace std;
 
struct list
{
    char s[80];
    list *next;
};
int _tmain(int argc, _TCHAR* argv[])
{
    setlocale(0, "Russian");
    list *first1, *q, *first, *p, *v, *r;
    int i = 1;
    char str[80];
    char *l;
    char n[] = " ";
    puts("\nВведите строку");
    gets_s(str);//вводится строка
    l = strtok(str, n);
    first = new list;
    first->next = NULL;
    strcpy(first->s, l);
    p = first;
    l = strtok(NULL, n);
    while (l != NULL)
    {
        q = new list;
        q->next = NULL;
        strcpy(q->s, l);
        p->next = q;
        p = q;
        l = strtok(NULL, n);
    }
    p = first;
    
    while (i == 1)//сортировка по длине слов
    {
        i = 0;
        q = first;
        r = first;
        v = first;
        while ((q != NULL) && (q->next != NULL))
        {
            if (strlen(q->next->s)<strlen(q->s))
            {
                if (q == first)
                {
                    v = q->next;
                    q->next = q->next->next;
                    v->next = q;
                    first = v;
                    i = 1;
                }
                else
                {
                    v = q->next;
                    q->next = q->next->next;
                    v->next = q;
                    r->next = v;
                    i = 1;
                }
            }
            r = q;
            q = q->next;
        }
    }
    p = first;
    puts("Список, отсортированный по длине слов");
    while (p != NULL)
    {
        puts(p->s);
        p = p->next;
    }
    getch();
    return 0;
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
23.12.2017, 06:34
Ответы с готовыми решениями:

В заданном предложении поменять местами самое длинное и самое короткое слова
В заданном предложении поменять местами самое длинное и самое короткое слова. Считать, что слова в...

Поменять местами в предложении самое длинное и самое короткое слово
Сам код, но тут 12 ошибок выдает в логе: #include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include...

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

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

1
249 / 219 / 63
Регистрация: 30.07.2013
Сообщений: 465
23.12.2017, 10:40 2
Принцип тот же, что и свопе двух узлов списка при сортировке.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
list* head; // указатель на первый узел в списке
list* tail; //указатель на последний узел
list* prevToTail; // указатель на предпоследний узел
...
// список пустой или состоит из одного элемента
if (!head || head == tail) 
    return head;
 
// список состоит из двух элементов
if (head == prevToTail) 
{
    tail->next = head;
    head->next = nullptr;
    return tail;
}
 
// все остальные случаи
tail->next = head->next;
head->next = nullptr;
prevToTail->next = head;
return tail;
Другие соображение по поводу написанного кода:
1. хорошо бы разбить его на функции, получение строки - функция, составление списка из строки - функция, сортировка списка - функция, вывод списка - функция, поменять первый и последний узлы списка - функция
2. при составлении списка из строки можно сразу искать в списке место, куда надо вставить слово (в зависимости от его длины). Получится отсортированный список, не надо будет его сортировать в отдельной функции.
3. если цель задания - научиться работать с односвязным списков - ок, а так в C++ есть std::forward_list и у него есть метод sort
4. даже если не использовать std::forward_list, в C++ есть std::string для строк (и не придется для каждого сравнения вызывать strlen)
0
23.12.2017, 10:40
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
23.12.2017, 10:40
Помогаю со студенческими работами здесь

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

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

В заданном предложении найти самое короткое и самое длинное слова
В заданном предложении найти самое короткое и самое длинное слова :-[

Строка: Поменять местами в предложении первое и самое длинное слова...
пока что это весь код: #include&lt;iostream&gt; #include&lt;string&gt; #include&lt;Windows.h&gt; using...


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

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru