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

Ограничение строк и символов

09.10.2019, 17:15. Показов 9263. Ответов 5
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте! Прошу помощи.
Имеется следующая задача:
В произвольном тексте (взятом из файла), содержащем не более 10 строк, в каждой строке не более 80 символов, необходимо перенести первую букву каждого слова в его конец. Отсортировать строки в порядке убывания количества слов. Вывести полученный текст на экран.

Проблема заключается в том, что я не могу ограничить количество строк и символов в строке, строки вроде ограничиваются указанием размера QUAN но если ввожу больше 10 строк он обрезает лишние но тогда сортировать строки в порядке убывания количества слов отказывается, а вот с количеством символов не больше 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
#include "string"
#include "iostream"
#include "fstream"
#include "algorithm"
#include "sstream"
#include "cctype"
#include "locale.h"
#include "windows.h"
#define QUAN 10
using namespace std;
 
size_t change(string &str);  // прототип функции перестановки
 
int main()
{
    setlocale(LC_ALL, "Russian");
    SetConsoleOutputCP(1251);
    SetConsoleCP(1251);
    size_t i = 0,
        j = 0,
        value[QUAN];
    string text[QUAN]; 
    string filename, filename2;
 
    // чтение файла
    cout << "Введите имя файла для открытия :\n";
    getline(cin, filename);
    ifstream infile(filename.c_str());
    if (!infile)
    {
        cerr << "Внимание! Ошибка: Не могу открыть файл!\n";
    }
      
    else
        cout << "Файл для чтения успешно открыт!\n";
    {
        while (getline(infile, text[i]))  
        {
            cout << text[i] << '\n';  
            value[i] = change(text[i]);    
            i++;
        }
 
                
        for (j = 1; j < QUAN; j++)
            for (i = 0; i < QUAN - j; i++)
            {
                if (value[i + 1] > value[i])
                {
                    swap(value[i + 1], value[i]);
                    swap(text[i + 1], text[i]);
                }
            }
    }
    cout << endl;
    // записываем 
    cout << "Введите имя файла для записи :\n";
    getline(cin, filename2);
    ofstream outfile(filename2.c_str());    
 
    if (!outfile)
    {
        cerr << "Внимание! Ошибка: Не могу открыть файл!\n";
        return (1);
    }
    else
        cout << "Файл для записи успешно открыт!\n";
    {
        for (i = 0; i < QUAN; ++i)
        {
            if (!text[i].empty())
            {
                outfile << text[i] << '\n'; 
                cout << text[i] << '\n'; 
            }
        }
    }
    infile.close();
    outfile.close();
    system("pause");
    return (0);
}
Функция переноса первой буквы в конец слова:
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
#include "string"
#include "iostream"
#include "fstream"
#include "algorithm"
#include "sstream"
#include "cctype"
#include "windows.h"
using namespace std;
 
//  функция возвращает количество слов в строке и преобразует каждую строчку 
size_t change(string &str)
{
    setlocale(LC_ALL, "Russian");
    SetConsoleOutputCP(1251);
    SetConsoleCP(1251);
    size_t count = 0, 
 
        beg = 0, 
 
        fin = 0; 
 
    string tmpstring;  
 
    stringstream stream(str); 
 
    while (stream >> str) // разбиваем строку на слова
    {
 
        for (beg = 0; beg < str.length(); beg++)
        {
            if (iswalnum((unsigned char)str[beg])) break;
        }
 
        for (fin = str.length() - 1; fin > 0; fin--)
        {
            if (iswalnum((unsigned char)str[fin])) break;
        }
 
        str.insert(fin + 1, str.substr(beg, 1)); 
 
        str.erase(beg, 1); 
 
        count++;
 
        tmpstring += (' ' + str);
    }
    str = tmpstring;  
    return count;  
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
09.10.2019, 17:15
Ответы с готовыми решениями:

Ограничение символов
Проблема с работой программы. Пользователь должен ввести число (ограниченное до 1000 символов) и...

Ограничение ввода символов.
Здравствуйте, подскажите пожалуйста как ограничеть ввод символолв в программе с помощью кода....

Ограничение ввода символов
Здравствуйте. Пишу программку вроде калькулятора, возникла проблема, если вводить не цифры...

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

5
6579 / 4564 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
09.10.2019, 17:24 2
Цитата Сообщение от kernitskiy Посмотреть сообщение
В произвольном тексте (взятом из файла), содержащем не более 10 строк, в каждой строке не более 80 символов, необходимо перенести первую букву каждого слова в его конец. Отсортировать строки в порядке убывания количества слов. Вывести полученный текст на экран.
Это означает, что во входном файле у тебя будет не более 10 строк, каждая из который не длиннее 80-ти символов.
Т.е. ты смело можешь сделать
C++
1
2
3
4
5
6
7
char lines[10][80];
 
.............................
size_t n = 0;
while(infile.getline(lines[n], 80))
    ++n;
................................
1
7437 / 5029 / 2892
Регистрация: 18.12.2017
Сообщений: 15,692
09.10.2019, 21:25 3
kernitskiy, Вам не нужно ничего ограничивать - это просто по условию не более 10 строк, в каждой строке не более 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
#include <iostream>
#include <string> 
#include <sstream>
#include <map>
using namespace std;
 
int main()
{
    multimap<int, string> m;
    int count;
    
    string text 
    { 
    "aaaaaa bbbbb dd\n"
    "aaaaaa bbbbb\n" 
    "aaaaaa bbbbb cc ddd eee\n"
    "aaaaaa bbbbb ee\n"
    "aaaaa\n"
    }, line, word;  
    stringstream in(text);
    
    while (getline(in, line))
    { 
        count=0;
        stringstream ss(line);
        while (ss >> word)
        {
        count++;
        }       
        ss.clear();       
        m.insert ( pair<int,string>(count,line) );
    }
    
   for (auto iter = m.rbegin(); iter != m.rend(); ++iter) {
        cout << iter->second << "\n";
    } 
    
system("pause");
return 0;
}
1
0 / 0 / 0
Регистрация: 10.03.2019
Сообщений: 7
10.10.2019, 10:24  [ТС] 4
oleg-m1973, спасибо, суть понял, но пока интегрировать в уже написанную программу не могу, либо перестает считывать строки вообще, либо выдает ошибку, я так понимаю из-за вылета за границы массива, а может и нет.

Добавлено через 1 минуту
Yetty, Спасибо! Вся проблема как раз в том, что от меня требуют это самое ограничение и никакие условия не интересуют, вот и мучаюсь, пока еще учусь, не во всем разбираюсь.
0
7437 / 5029 / 2892
Регистрация: 18.12.2017
Сообщений: 15,692
10.10.2019, 11:22 5
Цитата Сообщение от kernitskiy Посмотреть сообщение
проблема как раз в том, что от меня требуют это самое ограничение
думаю, что Вы что-то не так поняли, лучше уточнить. Вам подошёл предложенный вариант кода, получилось перенести букву в словах и поменять на ввод с файла ?
0
0 / 0 / 0
Регистрация: 10.03.2019
Сообщений: 7
19.10.2019, 08:02  [ТС] 6
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
char lines[10][80];
.............................
size_t n = 0;
while(infile.getline(lines[n], 80))
* * ++n;
................................
Здравствуйте! Я решил начать с чистого листа, пробую разные варианты. Для ограничения использую вашу подсказку, но возникла проблема, не могли бы вы написать кусочек считывания с файла и вывода каждой строки на экран, я использую наработки из кода который писал выше и у меня выходит следующее:
1. Ввожу имя файла
2. Проверяю открывается или нет
3. Если открывается, построчно считываю и вывожу каждую строку на экран.
Все отлично работает, открывает, но проблема в том, что у меня на экран выводится либо первая либо вторая строка и все. Ограничение 80 символами при этом срабатывает, но строки выводиться все не хотят.
0
19.10.2019, 08:02
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
19.10.2019, 08:02
Помогаю со студенческими работами здесь

Ограничение длины вводимых символов
Ребят помогите пожалуйста ограничить длину вводимых символов, а именно чисел через cin.getline вот...

Ограничение ввода символов в консоль
Здравствуйте, имеется программа для ввода размера массива, его нижней и верхней границы. Необходимо...

Ограничение ввода арифметических символов
сам код #include &lt;iostream&gt; #include &lt;locale&gt; using namespace std; int main() {...

Ограничение ввода.(цифр, букв и символов)
Мне нужно сделать ограничение ввода. Условие: 1) ввод 1, 2 или 3, если больше, то сообщение об...


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

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