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

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

Восстановить пароль Регистрация
 
ZYL
3 / 3 / 0
Регистрация: 12.01.2013
Сообщений: 47
13.01.2013, 19:44     Инвертировать строки #1
Доброго времени суток. Смотрел несколько похожих задач, но там все делалось с помощью библиотек algorithm и vector. Тут же нужно сделать все как линейный список. Может кто-то помочь решить это задание?

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

C++ Инвертировать стэк
C++ Инвертировать таблицу с++
C++ Инвертировать 2 средних бита в числе
Инвертировать столбцы C++
инвертировать C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11845 / 6824 / 771
Регистрация: 27.09.2012
Сообщений: 16,919
Записей в блоге: 2
Завершенные тесты: 1
13.01.2013, 19:48     Инвертировать строки #2
Считываем всю строку(или даже весь фаил)

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

Потом достаем из стека и выводим на экран.
ZYL
3 / 3 / 0
Регистрация: 12.01.2013
Сообщений: 47
13.01.2013, 19:56  [ТС]     Инвертировать строки #3
Как именно затолкнуть и вытащить со стека, какими командами? Повторюсь, нужно сделать как линейный список, и записать в другой файл.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11845 / 6824 / 771
Регистрация: 27.09.2012
Сообщений: 16,919
Записей в блоге: 2
Завершенные тесты: 1
13.01.2013, 20:18     Инвертировать строки #4
STL можно использовать?
ZYL
3 / 3 / 0
Регистрация: 12.01.2013
Сообщений: 47
13.01.2013, 20:21  [ТС]     Инвертировать строки #5
Нет.. STL нельзя использовать.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11845 / 6824 / 771
Регистрация: 27.09.2012
Сообщений: 16,919
Записей в блоге: 2
Завершенные тесты: 1
13.01.2013, 20:22     Инвертировать строки #6
Цитата Сообщение от ZYL Посмотреть сообщение
Нет.. STL нельзя использовать.
тогда сначала нужно написать сам стек.
JlightenDev_C++
 Аватар для JlightenDev_C++
61 / 61 / 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;
}
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 минут
Да, еще этот код меняет и сами строки местами, первую с последней, вторую с предпоследней.
UserAK
70 / 70 / 4
Регистрация: 25.12.2012
Сообщений: 189
Записей в блоге: 2
13.01.2013, 21:14     Инвертировать строки #9
Цитата Сообщение от ZYL Посмотреть сообщение
У меня в конспекте есть формирование стека
это и есть однонаправленный список
к тому же этот стек сделан для работы со значениями типа int, если Вы перепишете его для char то он сгодится для задания
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11845 / 6824 / 771
Регистрация: 27.09.2012
Сообщений: 16,919
Записей в блоге: 2
Завершенные тесты: 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
Просмотров: 126

Размер: 9.9 Кб
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);
    }
Эх..пичальбеда. Но за старания спасибо =)
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11845 / 6824 / 771
Регистрация: 27.09.2012
Сообщений: 16,919
Записей в блоге: 2
Завершенные тесты: 1
13.01.2013, 22:22     Инвертировать строки #12
Цитата Сообщение от ZYL Посмотреть сообщение
Работает, но этот код тоже меняет строки местами..
Это можно переделать.
Цитата Сообщение от ZYL Посмотреть сообщение
И мне не знакомы операторы private и public. Их можно убрать? И классы тоже не изучал..
Классы со структурами не изучали, а задача со стеком?
Цитата Сообщение от ZYL Посмотреть сообщение
Не пойму для чего нужен этот фрагмент кода
Проходит по буферу и заносит в стек каждый символ.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.01.2013, 20:34     Инвертировать строки
Еще ссылки по теме:

C++ Нужно инвертировать вторую половину строки.
C++ Как инвертировать младшую тетраду
Инвертировать строку C++

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

Или воспользуйтесь поиском по форуму:
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);
}
Yandex
Объявления
14.01.2013, 20:34     Инвертировать строки
Ответ Создать тему
Опции темы

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