Форум программистов, компьютерный форум CyberForum.ru

Поменять местами слово максимальной и минимальной длины. - C++

Восстановить пароль Регистрация
 
rafiksaiti
1 / 1 / 0
Регистрация: 15.09.2012
Сообщений: 40
10.01.2013, 04:59     Поменять местами слово максимальной и минимальной длины. #1
Поменять местами слово максимальной и минимальной длины. строки char*. Как это можно сделать? Слова в строке разделены пробелом или пробелами, знаками препинания.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.01.2013, 04:59     Поменять местами слово максимальной и минимальной длины.
Посмотрите здесь:

найти слово минимальной длины, которое есть в обеих строках C++
C++ Слово максимальной длины заменить на слово минимальной длины
Определить в предложении слова максимальной и минимальной длины и поменять их местами. C C++
C++ В строке, состоящей из слов и знаков препинания (пробел . : , ! ?-;), найти слово максимальной длины
C++ Найти в функции в строке слово максимальной длины
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Евгений89
 Аватар для Евгений89
99 / 99 / 9
Регистрация: 17.04.2011
Сообщений: 554
Завершенные тесты: 2
10.01.2013, 13:02     Поменять местами слово максимальной и минимальной длины. #2
сортировкой попробуй
David Sylva
 Аватар для David Sylva
1281 / 943 / 51
Регистрация: 17.05.2012
Сообщений: 2,686
10.01.2013, 14:04     Поменять местами слово максимальной и минимальной длины. #3
Цитата Сообщение от rafiksaiti Посмотреть сообщение
Слова в строке разделены пробелом или пробелами, знаками препинания.
Разбить строку на слова можно с помощью http://www.cplusplus.com/reference/cstring/strtok/
Tiva
94 / 94 / 1
Регистрация: 25.04.2012
Сообщений: 429
10.01.2013, 14:11     Поменять местами слово максимальной и минимальной длины. #4
я вот не могу решить через char*
ну как могу
но как только, немного поменять условие к более реальным, что "размер входных данных не известен", программа перестанет работать.
string совсем не торт?
rafiksaiti
1 / 1 / 0
Регистрация: 15.09.2012
Сообщений: 40
10.01.2013, 17:34  [ТС]     Поменять местами слово максимальной и минимальной длины. #5
Цитата Сообщение от David Sylva Посмотреть сообщение
Разбить строку на слова можно с помощью http://www.cplusplus.com/reference/cstring/strtok/
а как потом учесть если у меня было 10 пробелов между словами? да, я могу как вариант разбить строку на слова, занести их в массив, запомнить номера макс и минимального, потом создать новую, но я потеряю пробелы и знаки препинания. Есть еще вариант через for самому растягивать, потом сжимать строку, но это очень не хочется...

Добавлено через 2 минуты
Цитата Сообщение от Tiva Посмотреть сообщение
я вот не могу решить через char*
ну как могу
но как только, немного поменять условие к более реальным, что "размер входных данных не известен", программа перестанет работать.
string совсем не торт?
на самом деле можно и стринг, условие не стоит именно через char*.
Собственно вот, полное условие, если интересно:
В текстовом файле записаны строки длиной не более 255 символов, слова в которых разделены хотя бы одним пробелом или знаками препинания. В каждой строке поменять местами слова максимальной и минимальной длины. Если максимальных и/или минимальных слов.

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

Добавлено через 2 часа 1 минуту
если кому интересно(особо не тестил, но работает):
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
100
#include<iostream>
#include<limits.h>
#include<string>
using namespace std;
bool prov(string,int);
int dlina(string,int);
int main()
{
    setlocale(LC_ALL,".1251");
    FILE* f_in;
    FILE* f_out;
    if((f_in=fopen("input.txt","r"))==NULL)
    {
        cout<<"Ошибка открытия файла"<<endl;
        return 1;
    }
    if((f_out=fopen("output.txt","w"))==NULL)
    {
        cout<<"Ошибка создания файла"<<endl;
        return 1;
    }
    char *s=new char[100];
    fgets(s,99,f_in);
    if(feof(f_in))
    {
        cout<<"Файл пуст"<<endl;
        return 1;
    }
    string st; string st_min; string st_max;
    st=s;
    int konec_max; int nach_max;
    int konec_min; int nach_min;
    int max=0; int min=INT_MAX;
    while(!feof(f_in))
    {
        st=s;
        for(int i=0;i<st.length();i++)
        {
            if(prov(st,i))
            {
                int dlin=dlina(st,i);
                if(dlin>=max)
                {
                    max=dlin;
                    konec_max=i+dlin;
                    nach_max=i;
                    st_max=st.substr(nach_max,konec_max-nach_max);
                }
                if(dlin<=min)
                {
                    min=dlin;
                    konec_min=i+dlin;
                    nach_min=i;
                    st_min=st.substr(nach_min,konec_min-nach_min);
                }
            }
        
        }
        if(nach_max>nach_min)
        {
            st.erase(nach_min,konec_min-nach_min);
            st.insert(nach_min,st_max);
            st.erase(nach_max+konec_max-nach_max-konec_min+nach_min,konec_max-nach_max);
            st.insert(nach_max+konec_max-nach_max-konec_min+nach_min,st_min);
        }
        else
        {
            st.erase(nach_max,konec_max-nach_max);
            st.insert(nach_max,st_min);
            st.erase(nach_min-(konec_max-nach_max-konec_min+nach_min),konec_min-nach_min);
            st.insert(nach_min+konec_min-nach_min-konec_max+nach_max,st_max);
        }
 
        strcpy(s,st.c_str());
        fputs(s,f_out);
        max=0;
        min=INT_MAX;
        fgets(s,99,f_in);
    }
    return 0;
}
 
bool prov(string st,int i)
{
    if(i==0&&(st[i]!=' '||st[i]!='.'||st[i]!=','||st[i]!=':'))
        return true;
    if((st[i]!=' '&&st[i]!='.'&&st[i]!=','&&st[i]!=':'&&st[i]!='\n')&&(st[i-1]==' '||st[i-1]=='.'||st[i-1]==','||st[i-1]==':'))
        return true;
    else return false;
}
int dlina(string st,int i)
{
    int dlina=0; int i2=i;
    while((st[i2]!=' '&&st[i2]!='.'&&st[i2]!=','&&st[i2]!=':'&&st[i2]!='\n'&&st[i2]))
    {
        dlina++;
        i2++;
    }
    return dlina;
}
Yandex
Объявления
10.01.2013, 17:34     Поменять местами слово максимальной и минимальной длины.
Ответ Создать тему
Опции темы

Текущее время: 12:47. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru