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

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

Войти
Регистрация
Восстановить пароль
 
уТатьяна
0 / 0 / 0
Регистрация: 15.02.2013
Сообщений: 16
#1

Удаление из текста программы комментариев с использованием списков - C++

15.02.2013, 20:37. Просмотров 1138. Ответов 2
Метки нет (Все метки)

Здравствуйте, уважаемые программисты! Я в С++ только недавно, в программировании совсем ничего еще не смыслю, поэтому обращаюсь к Вам за помощью.
Мне необходимо создать программу, которая используя список, удаляет из текста программы комментарии и помещает их в отдельных текстовый файл.
Помогите пожалуйста! Заранее, спасибо за помощь!
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.02.2013, 20:37     Удаление из текста программы комментариев с использованием списков
Посмотрите здесь:
C++ Удаление комментариев из текста программы с использованием STL, ошибка при выполнении
Удаление комментариев из листинга программы C++
C++ Удаление всех комментариев из листинга программы на С++. В чем ошибка?
C++ Удаление комментариев из файла
Решение: Удаление комментариев // и /* */ C++
C++ Поиск и удаление комментариев из файла
Перенос текста в файл без комментариев C++
C++ Удаление комментариев в файле (файл - код програмы на с++ записанв блокноте)
C++ Дан текст программы на С++...Записать в выходной файл текст программы без комментариев
«Хранение и обработка данных с использованием линейных списков». C++
Хранение и обработка данных с использованием линейных списков C++
C++ Разработайте функцию для удаления из Си-программы всех комментариев

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Gepar
1175 / 531 / 20
Регистрация: 01.07.2009
Сообщений: 3,517
16.02.2013, 03:22     Удаление из текста программы комментариев с использованием списков #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
//В исходном тексте на языке Си выделить все операторы присваивания и напечатать их.
//Рекомендации: сначала удалите все комментарии и оформите каждую линию в форме узла списка.
#include "stdafx.h"
#include <iostream>
#include <string>
#include <fstream>
#include <cstring>
using namespace std;
 
//комментарий где есть = чтобы продемонстрировать что его программа не должна найти и не найдёт
 
#define list node*
 
//узел списка
//хранит строку кода (без комментариев)
//и указатель на след. элемент
struct node
{
    string str;
    node* next;
 
    //конструктор по умолчанию
    //сохраняется строка и адрес след. элемента (по умолчанию след. элемент = null)
    node(const string line, node* _next=0)
    {
        str = line;
        next=_next;
    }
};
 
 
//добавление элемента в списка
//функция возвращает указатель на голову списка с добавленным элементом
//используется чтобы добавлять очередную строку кода в список
list addElementToList(list lst, const string element)
{
    //текущий узел списка
    node* temp = lst;
 
    //если список пустой то сразу добавляем узел
    if(!lst)
        lst = new node(element);
 
    //иначе ищем хвост и добавляем узел в хвост
    else
    {
        while(temp->next)
            temp=temp->next;
        temp->next = new node(element);
    }
    return lst;
}
 
 
//функция получает адрес файлового потока
//и на основе кода что там делает список со строчками кода
//комментарии при этом пропускаются
list makeList(ifstream& file)
{
    list lst = 0;//результирующий список
    string temp;
 
    //пока есть строчки
    while(!file.eof())
    {
        //считать очередную строку
        getline(file,temp,'\n');
        bool longComment;
 
        //если в ней есть многострочный комментарий 
        if(temp.find("/*")!=string::npos)
        {
            //удаляем всё что после многострочного комментария
            temp.erase(temp.find("/*"),temp.length()-temp.find("/*"));
 
            //если что-то осталось то добавляем его в список
            if(temp.length())
                lst = addElementToList(lst,temp);
 
            //пока не найдём закрывающую скобку для этого многосрочного комментария
            //мы код добавлять в список не будем (по условию)
            while(temp.find("\\*")!=string::npos)
                file>>temp;
        }
        //если есть в строке однострочный комментарий то удаляем его
        else if(temp.find("//")!=string::npos)
            temp.erase(temp.find("//"),temp.length()-temp.find("//"));
 
        //если в конце после всех тех удалений ещё осталось хоть что-то то добавляем это что-то в список
        if(temp.length())
            lst = addElementToList(lst,temp);
    }
 
    return lst;
}
 
//распечатка строк где есть оператор =
//ищет в списке строку и если там есть оператор = (не == и не !=) то выводит эту строку на экран
//так же ведётся подсчёт таких строк отвечающих этому условию
void printStringWithEqually(list lst)
{
    int count = 0;//счётчик подходящих нам строк
 
    //пока в списке есть элементы
    while(lst)
    {
        //ищем в строке оператор =
        int pos = lst->str.find("=");
        
        //если нашли
        if(pos != string::npos)
        {
            //если это действительно =, а не == и не !=
            if(lst->str.at(pos+1) != '=' && lst->str.at(pos-1) != '!' && lst->str.at(pos-1) != '=')  
            {
                //выводим на экран и инкрементируем счётчик на единичку
                cout<<lst->str<<endl;
                count++; 
            }
        }
        lst = lst->next;
    }
    //выводим в конце сколько всего мы нашли подходящих нам строчек
    cout<<endl<<"Count of all string with operator = :"<<count<<endl;
}
 
 
//освобождение памяти из-под списка
void DestroyList(list lst)
{
    node* t;
 
    //пока есть элементы удаляем их
    while(lst)
    {
        t = lst;
        lst = lst->next;
        delete t;
    }
}
 
 
int main()
{
    //открываем файл
    ifstream file("code.c");
 
    //создаём наш список строчек кода без комментов
    list lst = 0;
 
    //если файл не открылся
    if(!file)
    {
        cerr<<"Error when try to open \"code.c\"."<<endl;
        exit(-1);
    }
    else
    {
        //создаём список с кодом без комментов
        lst = makeList(file);
 
        //печатаем те строки где есть оператор =
        printStringWithEqually(lst);
    }
 
    //освобождаем память из-под списка
    DestroyList(lst);
    lst = 0;
 
    //задержка вывода
    system("PAUSE");
    return 0;
}
уТатьяна
0 / 0 / 0
Регистрация: 15.02.2013
Сообщений: 16
16.02.2013, 16:24  [ТС]     Удаление из текста программы комментариев с использованием списков #3
Спасибо большое!!! Постараюсь переделать!
Ответ Создать тему
Опции темы

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