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

Переписать код без Вектора

11.02.2015, 08:12. Просмотров 1065. Ответов 15
Метки нет (Все метки)

Задание:
Для произвольного текста(Взятого из файла), содержащего не более 10 строк, в каждой строке не более 80 символов, переставить буквы в каждом слове в обратном порядке для слов с нечетным количеством букв и сдвинуть циклический вправо на указанную пользователем величину для слов с четным количеством букв. Вывести полученный текст на экран.
Нужно как то переписать код без использования библиотеки <Vector>
Помогите кто чем может.
В коде нету ограничения на количество символов 80 в строке(Пытался ограничить через Char не получается выдает ошибку)
Заранее благодарю.
Собственно код
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
#include "stdlib.h" // Библиотека для использования макроса NULL
#include <string> // Библиотека для использования строк
#include <fstream> // Библиотека для Работы с файлами
#include <iostream> // Библиотека ввода вывода
#include <vector> //Для создание строчного динамического массива
 
using namespace std;// Пространство Имен std
 
int _main()// Основная функция main
{
    int shift; //Объявляем переменную Shift
    int lines=0;//Объявляем переменную lines Строки и инициализируем её 0
    cout<<"Enter count of shift:";
    cin>>shift;// Принимаем Значение введенное пользователем и записываем это значение в Shift
 
    vector<string> strings;// Создаем вектор с типом значение String
    string str;// Объявляем переменную Str с типом String
    ifstream infile("1.txt");// Открываем файл
    cout<<"\nInitial text:\n";// Выводим текст в файле
    while (lines==10&&getline(infile, str))//Цикл который завершится когда файл закончится
    {
        strings.push_back(str);//делает копию помещаемого объекта и помешает его в вектор и вектор расширяется динамически
        cout<<str<<"\n";
        lines++;
    }
 
    cout<<"\nChanged text:\n";
    for (int i = 0; i < strings.size(); i++)//Цикл завершится когда i будет больше string.size() т.е размер строки
    {
        char *cstr = new char[strings.at(i).length() + 1];//Выделяем память по указатель размером строки +1
        strcpy(cstr, strings.at(i).c_str());//В память, по расположению указателя cstr, копируется i-й элемент из вектора strings.
        char *c = strtok(cstr, " ");// // указатель указывает на первое слово строки(то что до первого пробела)
        while (c != 0) // Цикл с предусловием который завершиться если условие нарушится
        {
            string buf = (const char*) c;//Объявляется строковая переменная с именем buf, в которую заносится строка, хранящаяся по указателю c. 
            int mod = buf.length() % 2;// Объявляем переменную Мод и инициализируем её остатком от деления длины строки
            if (mod == 1)// Сравниваем MOD С 1 если остаток от деления равен единице то выполнять 
            {
                string str2 = buf;// Объявляем переменную Str2 И инициализируем ее BUf
                for (int i = 0; i < buf.length(); i++)// Цикл с параметром Объявляем переменную i и инициализируем её 0, Условие прерывания цикла если i< Длинны буферной длины; i++;
                    str2[buf.length() - 1 - i] = buf[i];//Сдвиг (Перебор)
                cout<<str2<<" ";// Вывод на экран str2
            }
            else // если не равен 1 
            {
                for (int cnt = 0; cnt < shift; cnt++)// цикл завершится когда cnt будет тольше Shift т.е Сдвига введенного пользователем
                {
                    char b = buf[0];// Объявляем переменную b и инициализируем её 1 значением buf[0]
                    for (int j = 0; j < buf.length() - 1; j++)//Объявляется цикл по j от нуля до длины строки-буфера минус один.
                        buf[j] = buf[j + 1];// Сдвиг по столбцам
                    buf[buf.length() - 1] = b;// вставляем 1 символ для завершения переноса в правельном порядке
                }
                cout<<buf<<" ";// Выводим значение переменной buf на экран
            }
            c = strtok(NULL," ");// переходим к следующему слову
        }
        delete[] cstr;// освобождаем память
        cout<<"\n";
    }
 
    system("pause");// Останавливает программу до нажатия, находится в библиотеке iostream
    return 0;
}
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
11.02.2015, 08:12
Ответы с готовыми решениями:

Можете переписать код без указаетелей и без printf\scanf?
#include &lt;stdio.h&gt; #include &lt;time.h&gt; #include &lt;stdlib.h&gt; #include &lt;conio.h&gt; int main() { ...

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

Как переписать код без использования set?
template &lt;class T&gt; // шабло обработки данных array&lt;char&gt; array&lt;T&gt;::proceed() { ...

Переписать код без использования операций сдвига и "битового and"
как переписать (num &amp; ((1) &lt;&lt; k)) != 0не используя операцию &amp; и &lt;&lt;? Помогите, пожалуйста!

15
6911 / 5976 / 2709
Регистрация: 14.04.2014
Сообщений: 25,504
11.02.2015, 08:22 2
У string нет ограничения длины, а если сделать так
C++
1
char strings[10][81];
то придётся всё переделывать на древних функциях.
1
267 / 170 / 40
Регистрация: 25.08.2014
Сообщений: 1,087
Записей в блоге: 1
11.02.2015, 08:33 3
В общем тебе нужна функция считывания строки, функция обработки, функция определения слова, функция перестановки и функция сдвига. Считываешь строку до символа \n или пары\r\n, передаёшь её в обработчик строки, обработчик находит границы слова и передаёт (в зависимости от чётности) указатель на строку и размер в функцию либо перестановки, либо сдвига. После обработки записываешь в то же место откуда считал СТОЛЬКО ЖЕ байтов сколько считал.
Для винды WinAPI будут: CreateFile, CloseHandle, ReadFile, WriteFile, SetFilePointer.
1
0 / 0 / 0
Регистрация: 28.10.2014
Сообщений: 36
11.02.2015, 09:12  [ТС] 4
А может кто-нибудь в коде написать а то я не допираю... Все написал через гугл сопоставлением...
0
267 / 170 / 40
Регистрация: 25.08.2014
Сообщений: 1,087
Записей в блоге: 1
11.02.2015, 09:21 5
Цитата Сообщение от Sarum9n Посмотреть сообщение
А может кто-нибудь в коде написать а то я не допираю
Для начала считай строку из файла. Напиши для этого функцию, которая возвращает размер считанной строки и указатель на участок памяти куда была считана строка.
1
0 / 0 / 0
Регистрация: 28.10.2014
Сообщений: 36
11.02.2015, 11:24  [ТС] 6
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
#include "stdlib.h" // Библиотека для использования макроса NULL
#include <string> // Библиотека для использования строк
#include <fstream> // Библиотека для Работы с файлами
#include <iostream> // Библиотека ввода вывода
using namespace std;// Пространство Имен std
 
int main()// Основная функция main
{
    char ourfile [10][81];
    char vrem[81];
    int shift; //Обявляем переменную Shift
    int a,k;
    cout<<"Enter count of shift:";
    cin>>shift;// Принимаем Значение введенное пользователем и записываем это значение в Shift
    string str;// Обявляем переменную Str с типом String
    ifstream infile("1.txt");// Открываем файл
    cout<<"\nInitial text:\n";// Выводим текст в файле
    while(getline(infile,str))
    {
        for(int i=0;i<10;i++)
        {
            for(int j=0;j<81;j++)
            {
            strcpy(vrem,str.c_str());
            cout<<str<<"/n";
            ourfile[i][j]=vrem[j];
            k++;
            }
 
        }
    }
    
    system("pause");
    delete[] vrem;
    delete[] ourfile;
    return 0;
 
}
Что не так почему не пишет что находится в массиве?

Добавлено через 8 минут
Сейчас поставил файл забыл его к exe Кинуть Но считывает только 1 строку и все. А не весь файл не могу понять почему помогите pls
0
267 / 170 / 40
Регистрация: 25.08.2014
Сообщений: 1,087
Записей в блоге: 1
11.02.2015, 11:53 7
Цитата Сообщение от Sarum9n Посмотреть сообщение
C++
1
2
3
4
5
for(int j=0;j<81;j++) 
{strcpy(vrem,str.c_str());
 cout<<str<<"/n";
ourfile[i][j]=vrem[j];
 k++;}
80 раз копируешь одну и ту же строку.
1
0 / 0 / 0
Регистрация: 28.10.2014
Сообщений: 36
11.02.2015, 12:57  [ТС] 8
А как написать чтобы не одну и ту же? а по очереди строчки файла?
0
267 / 170 / 40
Регистрация: 25.08.2014
Сообщений: 1,087
Записей в блоге: 1
11.02.2015, 13:30 9
По очереди считывать и копировать. Ты понимаешь что у тебя код делает и что тебе надо чтобы он делал?
0
0 / 0 / 0
Регистрация: 28.10.2014
Сообщений: 36
11.02.2015, 14:19  [ТС] 10
не совсем
0
267 / 170 / 40
Регистрация: 25.08.2014
Сообщений: 1,087
Записей в блоге: 1
11.02.2015, 14:45 11
Окей, в каком месте ты не понимаешь свой код и в каком месте ты не понимаешь что надо тебе сделать?
0
0 / 0 / 0
Регистрация: 28.10.2014
Сообщений: 36
11.02.2015, 15:28  [ТС] 12
Я не понимаю как правильно присвоить один массив к вдругом и чтобы его заполнить так как это показано на прошлом коде...
0
267 / 170 / 40
Регистрация: 25.08.2014
Сообщений: 1,087
Записей в блоге: 1
11.02.2015, 16:49 13
Цитата Сообщение от Sarum9n Посмотреть сообщение
присвоить один массив к вдругом
Грамотнее пиши.
У тебя там строки, их можно скопировать функцией strcpy.
0
0 / 0 / 0
Регистрация: 28.10.2014
Сообщений: 36
11.02.2015, 19:13  [ТС] 14
strcpy из стринга в чар не Копирует
0
267 / 170 / 40
Регистрация: 25.08.2014
Сообщений: 1,087
Записей в блоге: 1
12.02.2015, 05:21 15
Цитата Сообщение от Sarum9n Посмотреть сообщение
strcpy из стринга в чар не Копирует
Стринг выдаёт указатель на строку типа const char* с мопощью метода c_str().
0
Модератор
Эксперт CЭксперт С++
5032 / 2214 / 330
Регистрация: 20.02.2013
Сообщений: 5,600
Записей в блоге: 24
12.02.2015, 07:54 16
Лучший ответ Сообщение было отмечено Sarum9n как решение

Решение

Цитата Сообщение от Enno Посмотреть сообщение
Стринг выдаёт указатель на строку типа const char* с мопощью метода c_str().
То есть, проще говоря, чтобы объект типа string превратить в обычную сишную строку надо делать так:
C++
1
2
std::string str = "string";
const char * cstr = str.c_str();
Если ты планируешь потом как-то изменять эту новую строку, то делай так:
C++
1
2
3
4
5
std::string str = "string";
char * cstr = new char[str.length() + 1];
strcpy(cstr, str.c_str());
// какой-то твой код
delete [] cstr;
Честно стырено отсюда.
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
12.02.2015, 07:54

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

Переписать создание вектора посредством шаблона
Всем доброго времени суток. Ранее уже обращался на этот форум за помощью - и мне помогли (за это...

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

Освободить память вектора векторов без swap
Собственно будет ли &quot;Swap-To-Fit&quot; std::vector&lt;std::vector&lt;double&gt;&gt; m_coefficients; . . ....

Массив (переписать без глобальных переменных)
Помогите написать ету програму без глобальных переменных #include &lt;cstdlib&gt; #include...


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

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

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