0 / 0 / 0
Регистрация: 15.02.2013
Сообщений: 16
1

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

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

Author24 — интернет-сервис помощи студентам
Здравствуйте, уважаемые программисты! Я в С++ только недавно, в программировании совсем ничего еще не смыслю, поэтому обращаюсь к Вам за помощью.
Мне необходимо создать программу, которая используя список, удаляет из текста программы комментарии и помещает их в отдельных текстовый файл.
Помогите пожалуйста! Заранее, спасибо за помощь!
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
15.02.2013, 20:37
Ответы с готовыми решениями:

Удаление комментариев из текста программы с использованием STL, ошибка при выполнении
Здравствуйте решал задачу с использованием STL из книги Страуструпа 6.22 возникла проблема...

Удаление комментариев из листинга программы
Создать программу, которая будет удалять из листинга программы на языке с++ (файл*.cpp) коментарии...

Удаление всех комментариев из листинга программы на С++. В чем ошибка?
Выходит ошибка, файл во вложении. Помогите разобраться, пишу программу по программированию,...

Таблица идентификаторов, лексический анализатор, удаление комментариев из текста программы
Здравствуйте, уважаемые программисты! Я в С++ Builder новенький, и то это громко сказано, поэтому...

2
1186 / 542 / 78
Регистрация: 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;
}
1
0 / 0 / 0
Регистрация: 15.02.2013
Сообщений: 16
16.02.2013, 16:24  [ТС] 3
Спасибо большое!!! Постараюсь переделать!
0
16.02.2013, 16:24
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
16.02.2013, 16:24
Помогаю со студенческими работами здесь

Удаление комментариев из текста
вот написал прогу, которая убирает комментарий из текста в стиле /*... */ но есть 1 но, если в 1...

Удаление из текста комментариев и тегов summary
Исходный текст представляет описание класса на C#. Напишите процедуру, удаляющую из этого текста...

Удаление комментариев в тексте программы .cs
Здравствуйте. Помогите, пожалуйста, подправить код. Когда ввожу '/*' и через несколько символов...

Удаление комментариев из файла с текстом программы
В чём проблема? Выдаёт ошибку, что входная строка имела неверный формат? нужно удалить из...


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

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

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