int *lines_to_ignore - массив, состоящий из номеров строк, которые не нужно выводить в выходной файл.
3. Разбивая исходную программу на блоки инициализации, для каждого блока формируем массив vars. Далее для каждого элемента массива vars получаем номер последней строки, в которой ему (елементу) присваивается значение. Одновременно с этим помещаем старые номера строк (в случае обновления элемента массива lines) в массив lines_to_ignore. После обработки всех блоков программы выводим в выходной файл текст программы, учитывая номера строк, содержащиеся в массиве lines_to_ignore (номера строк, содержащиеся в этом массиве мы пропускаем и на вывод не посылаем).
Исходный текст
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>
#include <string>
using namespace std;
// прототипы вспомогательных функций
// функция выделения операндов из оператора присваивания
void GetVariables(const char* str, vector<string> &to);
// функции поиска элемента в структуре данных
int FindValue(const char* array, char symbol);
int FindValue(vector<string> &vec, string val);
int FindValue(const int* array, int value, const int size);
// функция выделения блока инициализации
int GetNextBlock(int block_start, string buf[500], int lr);
int main()
{
fstream fin, fout;
vector<string> vars;
string buffer[500];
string val, operand;
int *lines; char input_line[256];
int *lines_to_ignore;
int i = 0, j = 0, k = 0, lines_read = 0, index;
int block_start, block_end;
fin.open("input.txt", ios::in);
if(!fin)
return 1;
// считываем данные из входного файла
while(!fin.eof())
{
fin.getline(input_line, 255);
// это коней файла ?
if(input_line[0] == '#')
break;
buffer[i] = input_line;
i++; lines_read++;
}
fin.close();
lines_to_ignore = new int[lines_read];
for(i = 0; i < lines_read; i++)
lines_to_ignore[i] = -1;
// основной алгоритм
block_start = block_end = -1;
for(i = 0; i < lines_read; i++)
if(FindValue(buffer[i].c_str(), '=') >= 0)
{
block_start = i;
break;
}
if(block_start == -1)
{
fout.open("output.txt", ios::out);
if(!fout)
return 1;
for(i = 0; i < lines_read; i++)
fout << buffer[i] << endl;
fout.close();
}
while(1)
{
// мы выделили и обработали все возможные блоки
if(block_start > lines_read)
break;
// получаем границу следующего блока
block_end = GetNextBlock(block_start, buffer, lines_read);
// это не оператор присваивания, движемся дальше
if(block_end == block_start)
{
block_start++;
continue;
}
block_end--;
// для текущего блока обновляем список переменных и список пропускаемых строк
vars.clear();
for(i = block_start; i <= block_end; i++)
GetVariables(buffer[i].c_str(), vars);
lines = new int[vars.size()];
for(i = 0; i < vars.size(); i++)
lines[i] = -1;
// двигаемся по массиву переменных
for(i = 0; i < vars.size(); i++)
{
// двигаемся по строкам входного файла
for(j = block_start; j <= block_end; j++)
{
// получаем левый операнд
operand.assign(buffer[j].substr(0,
buffer[j].find_first_of("=", 0)));
// это текущая искомая переменная?
if(operand == vars[i])
{
// присвоение значения этой переменной уже имело место?
if(lines[i] < j)
{
// обновляем вспомогательные массивы
lines_to_ignore[k] = lines[i];
lines[i] = j; k++;
continue;
}
}
}
}
block_start = (block_end + 1);
}
fout.open("output.txt", ios::out);
if(!fout)
return 1;
// осуществляем запись в выходной файл
for(i = 0; i < lines_read; i++)
// текущий номер строки имеется в списке пропускаемых строк ?
if(FindValue(lines_to_ignore, i, lines_read) >= 0)
continue;
else
fout<<buffer[i]<<endl;
// не забыть про символ конца прграммы
fout<<"#\n";
fout.close();
return 0;
}
void GetVariables(const char* str, vector<string> &to)
{
string param1 = "", param2 = "";
string tmp_var = str;
param1.assign(tmp_var.substr(0,
tmp_var.find_first_of("=", 0)));
param2.assign(tmp_var.substr(param1.length() + 1,
tmp_var.length() - param1.length() - 1));
if(find(to.begin(), to.end(), param1) == to.end())
to.push_back(param1);
if(find(to.begin(), to.end(), param2) == to.end())
to.push_back(param2);
}
int FindValue(const char* array, char symbol)
{
int i;
for(i = 0; i < strlen(array); i++)
if(array[i] == symbol)
return i;
return -1;
}
int FindValue(vector<string> &vec, string val)
{
int i;
for(i = 0; i < vec.size(); i++)
if(vec[i] == val)
return i;
return -1;
}
int FindValue(const int* array, int value, const int size)
{
int i;
for(i = 0; i < size; i++)
if(array[i] == value)
return i;
return -1;
}
int GetNextBlock(int block_start, string buf[500], int lr)
{
int block_end = block_start;
while(1)
{
if((int)buf[block_start][0] < 65 ||
(int)buf[block_start][0] > 90 ||
FindValue(buf[block_start].c_str(), '=') < 0 ||
block_start >= lr)
break;
block_end++;
block_start++;
}
return block_end;
}
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.