0 / 0 / 0
Регистрация: 16.03.2015
Сообщений: 17
1

Упорядочить строки по возрастанию их длины

16.11.2015, 14:36. Показов 1733. Ответов 5
Метки нет (Все метки)

Добрового времени суток ,нужно упорядочить строки по возрастанию их длины и записать из 1 файла во второй ,все реализовал кроме сортировки в "void rezult" .Прошу помочь .
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
#include<iostream>
#include<string.h>
#include <stdlib.h>
using namespace std; //добавление std в слудующем не потребуется
void vivod();
void vvod();
void rezult();
int main()
{
    setlocale(0, "");
    int q;
 
    do
    {
        system("cls");
        cout << " --------------  МЕНЮ  --------------------------\n";
        cout << "=================================================\n";
        cout << "      1- Создание файла с числами" << "\n";
        cout << "      2- Вывод информации существующих файлов " << "\n";
        cout << "      3- Преобразование файла" << "\n";
        cout << "      4- Выход" << "\n\n";
        cout << "  Введите пункт меню и нажмите enter: ";
        cin >> q;
        switch (q)
        {
 
        case 1: vvod(); break;
        case 2: vivod(); break;
        case 3: rezult(); break;
        case 4: break;
 
        }
    } while (q != 4);  // цикл до 4
    return 0;
}
 
void vvod()
{
    FILE*f1;
    char name[30], str[255][255], i = 0;
    printf("\nВведите имя файла fl: ");
    scanf("%s", name);
    printf("\nВведите данныев файл fl\n"
        "при вводе в конце каждой строки нажмите ENTER\n"
        "в конце текста введите точку и нажмите ENTER\n");
    f1 = fopen(name, "w");
    scanf("\n");
    while (gets(str[i]) && str[i - 1][strlen(str[i - 1]) - 1] != '.')
    {
        fprintf(f1, "%s\n", str[i]);
        i++;
    }
    fprintf(f1, ".");
    fclose(f1);
}
void vivod()
{
    FILE*f2;
    char str[255][255], i = 0, name[30];
    printf("\nВведите имя файла который хотите открыть: ");
    scanf("%s", name);
    f2 = fopen(name, "r");
    printf("Данные файла:\n");
    while (fgets(str[i], 100, f2) && str[i] != ".")
    {
        printf("%s", str[i]);
        ++i;
    }
    fclose(f2);
    system("pause");
}
void rezult()
{
    FILE*f2, *f1;
    char str1[255][255], str[255][255], i = 0, Name[30], name[30];
    printf("Введите имя существуещего файла сортировку которого вы хотите провести: ");
    scanf("%s", name);
    f2 = fopen(name, "r");
    printf("\nВведите имя нового файла куда хотите сохранить данные: ");
    scanf("%s", Name);
    f1 = fopen(Name, "w");
    printf("\nДанные преобразуемого файла: \n");
    while (fgets(str[i], 100, f2) && str[i] != ".")
    {
        printf("%s", str[i]);
        ++i;
    }
            
     //Тут сортировка и запись в файл нужна
    fclose(f1);
    fclose(f2);
    system("pause");
}
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
16.11.2015, 14:36
Ответы с готовыми решениями:

Списки: упорядочить строки в тексте по возрастанию длины минимального слова в каждой строке
Упорядочить строки в тексте по возрастанию длины минимального слова в каждой строке. 1) делим...

Упорядочить слова в строке по возрастанию их длины
Нужно упорядочить слова в строке по возрастанию их длины Найти ошибки #include &quot;StdAfx.h&quot;...

Упорядочить слова в предложении по возрастанию их длины
Пусть Предложение – это последовательность слов, разделенных пробелами, где Слово –...

Упорядочить слова в строке по возрастанию длины слов.
1)Упорядочить слова в строке по возрастанию длины слов. 2)Вводятся фамилия и баллы от1 до 100....

5
49 / 49 / 31
Регистрация: 07.10.2015
Сообщений: 170
17.11.2015, 15: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
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
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
#include<iostream>
#include<string.h>
#include <stdlib.h>
using namespace std; //добавление std в слудующем не потребуется
 
struct OneString
{
    char *str = nullptr;
    int size = 0;
 
    OneString() { }
    OneString(char *new_str)
    {
        size = strlen(new_str);
        this->str = new char[size + 1];
        strcpy_s(this->str, size + 1, new_str);
    }
};
 
class Strings
{
private:
    int _amount = 0;
    OneString *_strings = nullptr;
 
public:
    Strings() { }
 
    void ReadStrings(char *file_name)
    {
        FILE *source;
        int max_length = 5000;
        char *tmp_str = new char[max_length];
 
        source = fopen(file_name, "r");
 
        _amount = 0;
        while (fgets(tmp_str, max_length, source) && tmp_str != ".")
            _amount++;
 
        _amount--;
 
        fclose(source);
 
        _strings = new OneString[_amount];
        source = fopen(file_name, "r");
 
        int length;
 
        for (int i = 0; i < _amount; i++)
        {
            fgets(tmp_str, max_length, source);
            _strings[i] = OneString(tmp_str);
        }
        fclose(source);
    }
 
    void ShowStrings()
    {
        for (int i = 0; i < _amount; i++)
            cout << _strings[i].str;
    }
 
    void SortDesendingLength()
    {
        OneString tmp_str;
 
        for (int i = 0; i < _amount - 1; i++)
        for (int k = 0; k < _amount - i - 1; k++)
        if (_strings[k].size > _strings[k + 1].size)
        {
            tmp_str = _strings[k];
            _strings[k] = _strings[k + 1];
            _strings[k + 1] = tmp_str;
        }
    }
 
    void WriteToFile(char *file_name)
    {
        FILE *file;
 
        file = fopen(file_name, "w");
 
        for (int i = 0; i < _amount; i++)
            fwrite(_strings[i].str, 1, _strings[i].size, file);
    }
 
};
 
void vivod();
void vvod();
void rezult();
int main()
{
    setlocale(0, "");
    int q;
 
    do
    {
        system("cls");
        cout << " --------------  МЕНЮ  --------------------------\n";
        cout << "=================================================\n";
        cout << "      1- Создание файла с числами" << "\n";
        cout << "      2- Вывод информации существующих файлов " << "\n";
        cout << "      3- Преобразование файла" << "\n";
        cout << "      4- Выход" << "\n\n";
        cout << "  Введите пункт меню и нажмите enter: ";
        cin >> q;
        switch (q)
        {
 
        case 1: vvod(); break;
        case 2: vivod(); break;
        case 3: rezult(); break;
        case 4: break;
 
        }
    }
    while (q != 4);  // цикл до 4
    return 0;
}
 
void vvod()
{
    FILE*f1;
    char name[30], str[255][255], i = 0;
    printf("\nВведите имя файла fl: ");
    scanf("%s", name);
    printf("\nВведите данныев файл fl\n"
        "при вводе в конце каждой строки нажмите ENTER\n"
        "в конце текста введите точку и нажмите ENTER\n");
    f1 = fopen(name, "w");
    scanf("\n");
    while (gets(str[i]) && str[i - 1][strlen(str[i - 1]) - 1] != '.')
    {
        fprintf(f1, "%s\n", str[i]);
        i++;
    }
    fprintf(f1, ".");
    fclose(f1);
}
void vivod()
{
    FILE*f2;
    char str[255][255], i = 0, name[30];
    printf("\nВведите имя файла который хотите открыть: ");
    scanf("%s", name);
    f2 = fopen(name, "r");
    printf("Данные файла:\n");
    while (fgets(str[i], 100, f2) && str[i] != ".")
    {
        printf("%s", str[i]);
        ++i;
    }
    fclose(f2);
    system("pause");
}
void rezult()
{
    FILE*f2, *f1;
    char str1[255][255], str[255][255], i = 0, Name[30], name[30];
    printf("Введите имя существуещего файла сортировку которого вы хотите провести: ");
    scanf("%s", name);
    f2 = fopen(name, "r");
    printf("\nВведите имя нового файла куда хотите сохранить данные: ");
    scanf("%s", Name);
    f1 = fopen(Name, "w");
    printf("\nДанные преобразуемого файла: \n");
    while (fgets(str[i], 100, f2) && str[i] != ".")
    {
        printf("%s", str[i]);
        ++i;
    }
    fclose(f1);
    fclose(f2);
 
    Strings strings;
    strings.ReadStrings(name);
    strings.SortDesendingLength();
    strings.WriteToFile(Name);
 
    system("pause");
}
0
0 / 0 / 0
Регистрация: 16.03.2015
Сообщений: 17
17.11.2015, 15:42  [ТС] 3
Извините ,но у меня в вашей программе при запросе на вывод информации отсортированного файла ничего не выводит
0
49 / 49 / 31
Регистрация: 07.10.2015
Сообщений: 170
17.11.2015, 15:49 4
Лучший ответ Сообщение было отмечено Aziimut как решение

Решение

Цитата Сообщение от Aziimut Посмотреть сообщение
Извините ,но у меня в вашей программе при запросе на вывод информации отсортированного файла ничего не выводит
Прошу прощения, забыл закрыть поток.
Выполнил программу и открыл файл в totale для проверки, а в проге не пробовал выводить.
Просто добавить fclose(file);

C++
1
2
3
4
5
6
7
8
9
10
11
    void WriteToFile(char *file_name)
    {
        FILE *file;
 
        file = fopen(file_name, "w");
 
        for (int i = 0; i < _amount; i++)
            fwrite(_strings[i].str, 1, _strings[i].size, file);
 
        fclose(file);
    }
1
0 / 0 / 0
Регистрация: 16.03.2015
Сообщений: 17
17.11.2015, 15:52  [ТС] 5
Большое спасибо ,и еще один вопрос можно ли как нибудь сделать чтобы точка не считалась за символ?
0
49 / 49 / 31
Регистрация: 07.10.2015
Сообщений: 170
17.11.2015, 16:03 6
Например так:
C++
1
2
3
4
5
6
7
8
while (gets(str[i]) && str[i][strlen(str[i]) - 1] != '.')
    {
        if (str[i][strlen(str[i]) - 1] != '.')
        {
            fprintf(f1, "%s\n", str[i]);
            i++;
        }
    }
Но лучше вообще точку не записывать в файл, а проверять какой символ был введен и если это не точка, то уже пишем.
Затем при чтении файла ориентироваться на eof (как показатель, что файл закончился) или отлавливать ошибку чтения. Сейчас не помню точно.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
17.11.2015, 16:03
Помогаю со студенческими работами здесь

Упорядочить элементы строк матрицы по возрастанию, а сами строки по возрастанию суммы элементов
Дана матрица Х. Упорядочить элементы строк матрицы по возрастанию, а сами строки по возрастанию...

Выделить знакочередующуюся подпоследовательность наибольшей длины и упорядочить ее по возрастанию
Дана последовательность a1,...,an (n&lt;=100) действительных чисел. Выделить из нее знакочередующуюся...

Упорядочить слова в строке по возрастанию их длины (SortWords(s) функция)
SortWords(s)

Упорядочить элементы строк матрицы по возрастанию, а сами строки по возрастанию произведения чётных элементов строк
Дана матрица X. Упорядочить элементы строк матрицы по возрастанию, а сами строки по возрастанию...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru