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

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

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Дек символов http://www.cyberforum.ru/cpp-beginners/thread787135.html
Доброго времени суток всем. У меня такая проблема: есть задача - Реализовать класс "Дек символов" (на базе списка). Реализовать класс "Массив деков". Длина массива определяется во время...
C++ Свежая книга по С++ (без архаизмов) Хочу идти в ногу со временем. Чтобы в книге, по которой буду учиться, было все с оглядкой на стандарт С++11. Например, раньше писали vector<int>::const_iterator itr = myvec.begin(); теперь можно... http://www.cyberforum.ru/cpp-beginners/thread787113.html
C++ Работа со структурами
Подскажите почему ничего не выводится? Когда жму CTRL-F5 выдаёт что есть ошибки, хотя в коде ничего не подсвечивается. #include <stdio.h> #include <stdlib.h> #include <string.h> #include...
непредвиденная ошибка C++
сел за старый проект обнаружил такое: // Elemental war.cpp: главный файл проекта. #include "stdafx.h" #include "Form1.h" int main(array<System::String ^> ^args) {
C++ Оператор switch. В чем ошибка? http://www.cyberforum.ru/cpp-beginners/thread787071.html
Почему Свитч не отрабатывает? После ввода ans1 выводиться вопрос для цикла ДуВаил. Где я торможу? :( #include "stdafx.h" #include <iostream> #include <conio.h> using namespace std; int...
C++ Работа со строками. Определить количество пробелов в строке и вывести на экран ввести строку символов.определить количество пробелов в строке и вывести на экран.вывести на экран символ,номер позиции которого соответствует количеству символов.если можно,с подробным объяснением. подробнее

Показать сообщение отдельно
Gepar
1178 / 534 / 20
Регистрация: 01.07.2009
Сообщений: 3,517
16.02.2013, 03:22
У меня была похожая задача(кто-то заказывал, а преподаватели нынче оригинальностью не страдают), только просили найти все оперыторы = и тоже списком (при этом надо было игнорировать комментарии естественно).
Если немного напрячься то можно переиначить код чтобы удалял комментарии (тем более что он их и так ищет ). Операторы = я кстати тогда искал прямо в самом коде программы ...
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
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.