Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
ZYL
3 / 3 / 0
Регистрация: 12.01.2013
Сообщений: 47
#1

Инвертировать строки - C++

13.01.2013, 19:44. Просмотров 838. Ответов 12
Метки нет (Все метки)

Доброго времени суток. Смотрел несколько похожих задач, но там все делалось с помощью библиотек algorithm и vector. Тут же нужно сделать все как линейный список. Может кто-то помочь решить это задание?

Инвертировать каждую строку текстового файла с помощью стека (записать символы в обратном порядке).
Результат записать в новый файл.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.01.2013, 19:44
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Инвертировать строки (C++):

Инвертировать две строки - C++
Помогите, пожалуйста, доработать. Нужно написать функцию инвертирования строки символов. Инвертировать две строки. Для одной строки...

Нужно инвертировать вторую половину строки. - C++
1) нужно инвертировать вторую половину строки. помогите пожалуйста.

Сформировать квадратную матрицу; транспонировать матрицу и инвертировать порядок элементов каждой ее строки - C++
Заданы два одномерных массива одинаковой длины: R и S.Сформировать квадратную матрицу A, каждый элемент которой, что находится в i-той...

инвертировать - C++
инвертировать 3-ий и 5-ый бит в слове. как это сделать? какие команды использовать?

Инвертировать строку - C++
Определите класс strtype_a, в состав которого входит функция-член invert, инвертирующая строку и конструктор, параметрами его являются...

Инвертировать таблицу с++ - C++
Здравствуйте, прошу помочь в написании программы инвертирования таблицы (структура).Таблица: 3 слолбика и 10 строк (поля можно любые). И...

12
Croessmah
Ушел
Эксперт CЭксперт С++
13554 / 7705 / 872
Регистрация: 27.09.2012
Сообщений: 19,006
Записей в блоге: 3
Завершенные тесты: 1
13.01.2013, 19:48 #2
Считываем всю строку(или даже весь фаил)

Считываем символ строки, Пихаем его в стек.
И так со всеми символами в строке.

Потом достаем из стека и выводим на экран.
0
ZYL
3 / 3 / 0
Регистрация: 12.01.2013
Сообщений: 47
13.01.2013, 19:56  [ТС] #3
Как именно затолкнуть и вытащить со стека, какими командами? Повторюсь, нужно сделать как линейный список, и записать в другой файл.
0
Croessmah
Ушел
Эксперт CЭксперт С++
13554 / 7705 / 872
Регистрация: 27.09.2012
Сообщений: 19,006
Записей в блоге: 3
Завершенные тесты: 1
13.01.2013, 20:18 #4
STL можно использовать?
0
ZYL
3 / 3 / 0
Регистрация: 12.01.2013
Сообщений: 47
13.01.2013, 20:21  [ТС] #5
Нет.. STL нельзя использовать.
0
Croessmah
Ушел
Эксперт CЭксперт С++
13554 / 7705 / 872
Регистрация: 27.09.2012
Сообщений: 19,006
Записей в блоге: 3
Завершенные тесты: 1
13.01.2013, 20:22 #6
Цитата Сообщение от ZYL Посмотреть сообщение
Нет.. STL нельзя использовать.
тогда сначала нужно написать сам стек.
0
JlightenDev_C++
62 / 62 / 7
Регистрация: 12.08.2012
Сообщений: 150
13.01.2013, 20:37 #7
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
#include <iostream>
#include <conio.h>
#include <fstream>
#include <stack>
 
int main()
{
    setlocale(LC_ALL, "RUS");
    std::stack<char> strStack;
    char c = ' ';
    std::fstream file;
    std::fstream fileOut;
    file.open("text.txt", std::ios::in);
    fileOut.open("textOut.txt", std::ios::out);
    if(!file.is_open())
    {
         std::cout << "File is not found.";
         getch();
         return 1;
    }
    int len(0);
    while(!file.eof())
    {
         file.get(c);
         strStack.push(c);
         len++;
    }
    file.close();
    strStack.pop(); // Для избавления от лишнего символа
    for(int i = 0; i < len - 1; i++)
    {
         fileOut << strStack.top();
         strStack.pop();
    }
    fileOut.close();
    return EXIT_SUCCESS;
}
1
ZYL
3 / 3 / 0
Регистрация: 12.01.2013
Сообщений: 47
13.01.2013, 20:50  [ТС] #8
Спасибо, но это тоже не то..(
У меня в конспекте есть формирование стека, но там ошибки есть..
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
struct stack
{
    int x;
    stack *prev;
}; typedef stack*pstack;
 
int Pop (pstack&top)
{ pstack p;
  int a;
  p=top;
  a=top->x;
  top=p->prev;
  delete p;
  return a;
}
Нужно сделать как линейный список...

Добавлено через 8 минут
Да, еще этот код меняет и сами строки местами, первую с последней, вторую с предпоследней.
0
UserAK
73 / 73 / 4
Регистрация: 25.12.2012
Сообщений: 189
Записей в блоге: 2
13.01.2013, 21:14 #9
Цитата Сообщение от ZYL Посмотреть сообщение
У меня в конспекте есть формирование стека
это и есть однонаправленный список
к тому же этот стек сделан для работы со значениями типа int, если Вы перепишете его для char то он сгодится для задания
0
Croessmah
Ушел
Эксперт CЭксперт С++
13554 / 7705 / 872
Регистрация: 27.09.2012
Сообщений: 19,006
Записей в блоге: 3
Завершенные тесты: 1
13.01.2013, 21:23 #10
Оно? Только не мешало бы доработать
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 <fstream>
class Stack{
private:
    struct Node{
        char symbol;
        Node *next;
    };
    Node * top;
    size_t size;
public:
    Stack();
    ~Stack();
    char Top();
    size_t Size();
    Stack & Push(char);
    bool IsEmpty();
    char Pop();
};
 
Stack::Stack(){
    this->top=NULL;
    this->size=0;
}
 
Stack::~Stack(){
    if (!this->top) return;
        Node * temp=this->top;
        while (this->top){
            temp=this->top;
            this->top=this->top->next;
            delete temp;
        }
}
 
bool Stack::IsEmpty(){
    return (this->size==0);
}
char Stack::Top(){
    if (this->top)
        return this->top->symbol;
    return 0;
}
char Stack::Pop(){
    if (!this->top) return 0;
    Node * temp;
    char rez=this->top->symbol;
    temp=this->top;
    this->top=this->top->next;
    delete temp;
    --(this->size);
    return rez;
}
Stack & Stack::Push(char ch){
    Node * temp=new Node;
    temp->symbol=ch;
    temp->next=this->top;
    this->top=temp;
    ++(this->size);
    return *this;
}
size_t Stack::Size(){
    return this->size;
}
 
int main(){
    Stack st;
    char * buffer=NULL;
    std::ifstream ifile("input.txt",std::ios::binary);
    std::ofstream ofile("output.txt",std::ios::binary);
 
    std::cout<<"Wait..."<<std::endl;
    ifile.seekg(0,std::ios::end);
    fpos_t size=ifile.tellg();  
    buffer=new char [size];
    ifile.seekg(0,std::ios::beg);
    ifile.read(buffer,size);
    for(char *p=buffer,*pend=buffer+size;p<pend;++p){
        if(*p==10)//Эти условия в Linux и MAC надо убрать оставить только st.Push(*p);
            *p=13;
        else
            if(*p==13)
                *p=10;
        st.Push(*p);
    }
    for(char *p=buffer;!st.IsEmpty();++p){
        *p=st.Pop();
    }
    ofile.write(buffer,size);
    delete [] buffer;
    std::cout<<"Operation has been complited"<<std::endl;
    return 0;
}
Название: Безымянный.jpg
Просмотров: 129

Размер: 9.9 Кб
1
ZYL
3 / 3 / 0
Регистрация: 12.01.2013
Сообщений: 47
13.01.2013, 22:16  [ТС] #11
Работает, но этот код тоже меняет строки местами.. И мне не знакомы операторы private и public. Их можно убрать? И классы тоже не изучал..
Не пойму для чего нужен этот фрагмент кода
C++
1
2
3
4
5
6
7
8
for(char *p=buffer,*pend=buffer+size;p<pend;++p){
        if(*p==10)//Эти условия в Linux и MAC надо убрать оставить только st.Push(*p);
            *p=13;
        else
            if(*p==13)
                *p=10;
        st.Push(*p);
    }
Эх..пичальбеда. Но за старания спасибо =)
0
Croessmah
Ушел
Эксперт CЭксперт С++
13554 / 7705 / 872
Регистрация: 27.09.2012
Сообщений: 19,006
Записей в блоге: 3
Завершенные тесты: 1
13.01.2013, 22:22 #12
Цитата Сообщение от ZYL Посмотреть сообщение
Работает, но этот код тоже меняет строки местами..
Это можно переделать.
Цитата Сообщение от ZYL Посмотреть сообщение
И мне не знакомы операторы private и public. Их можно убрать? И классы тоже не изучал..
Классы со структурами не изучали, а задача со стеком?
Цитата Сообщение от ZYL Посмотреть сообщение
Не пойму для чего нужен этот фрагмент кода
Проходит по буферу и заносит в стек каждый символ.
0
ZYL
3 / 3 / 0
Регистрация: 12.01.2013
Сообщений: 47
14.01.2013, 20:34  [ТС] #13
Вот, вдруг кому пригодится ( код не мой ).
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
/*  Вариант 14.
    Инвертировать каждую строку текстового файла с помощью стека (записать символы в обратном порядке).
    Результат записать в новый файл.
*/
 
#include <iostream>
#include<fstream>
 
using namespace std;
 
struct stack
{
    char x;
    stack*prew; 
};
typedef stack*pstack;
 
void Out_file(fstream&f,char*namef)
{
    f.open(namef,ios::out);
    if(!f.is_open())
    {
        cout<<"Error!";
        exit(1);
    }
    else
    {
        if (f.eof())
        {
            f.clear();
            f.seekg(0);
        }
    }
 
    char*a=new char[40];
    cout<<"Введите строку :"<<endl;
    cin.get();
    cin.getline(a,40);
    while(a[0]!='*')
    {
        f<<a<<endl;
        cin.getline(a,40);
    }
    f.close();
    delete a;
    a=NULL;
}
 
void push(pstack&top,char a)
{
    pstack p;
    p=new stack;
    p->x=a;
    p->prew=top;
    top=p;
}
 
bool empty(pstack top)
{
    return(top==NULL);
}
 
char pop(pstack&top)
{
    pstack p;
    char a;
    p=top;
    a=top->x;
    top=p->prew;
    delete p;
    return a;   
}
 
void Read_file(fstream&f,char*namef)
{
    f.open(namef,ios::in);
    if(!f.is_open())
    {
        cout<<"Error!";
        exit(1);
    }
    else
    {
        if(f.eof())
        {
            f.clear();
            f.seekg(0);
        }
    }
    char *x=new char[40];
    while(!f.eof())
    {
        f.getline(x,40);
        cout<<x<<endl;
    }
    f.close();
    delete[] x;
    x=NULL;
}
 
void New_file(fstream&f1,char*namef,fstream&g,char*nameg)
{
    char x1;
    pstack top=NULL;
    f1.open(namef,ios::in);
    {
        if(f1.eof())
        {
            f1.clear();
            f1.seekg(0);
        }
    }
    g.open(nameg,ios::out); 
    char *x=new char[40];
    int i=0;
    while(!f1.eof())
    {
        f1.getline(x,40);
        i=-1;
        do
        {
            i++;
        if (x[i]!='\0')push(top,x[i]);
        }while(x[i]!='\0');
        while(!empty(top))
        {
            x1=pop(top);
            g.put(x1);
    }
            if (i>0)g.put('\n');
    }
    g.close();
    f1.close();
    delete[] x;
    x=NULL;
}
 
void main()
{
    setlocale (LC_ALL,"Russian");
 
    fstream fout,fin;
    char namef[10],nameg[10];
 
    cout<<"\n namef = ";
    cin>>namef;
 
    cout<<"\n nameg = ";
    cin>>nameg;
 
    Out_file(fout,namef);
    Read_file(fin,namef);
    New_file(fin,namef,fout,nameg);
    Read_file(fin,nameg);
}
1
14.01.2013, 20:34
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.01.2013, 20:34
Привет! Вот еще темы с ответами:

Инвертировать массив - C++
Доброе время суток! Начал делать задачу, но сказал преподаватель, что не все тут, что необходимо!!! Подскажите пожалуйста, что...

Инвертировать столбцы - C++
Помогите,пожалуйста переписать частично код программы...Преподаватель говорит что столбы инвертирую неправильно. #include &lt;clx.h&gt; ...

Инвертировать стэк - C++
Тектс взял товарища с этого форума копирайты ему и респект вот этот чувак Monte-Cristo Алгоритм инвертирования элементы из одного...

Инвертировать строку - C++
Разбираюсь со строками. Почему на выводе получается &quot;sace&quot;?(должно быть &quot;aces&quot;, т.е. переворот строки) Перепроверил уже несколько раз....


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

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

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