Входные данные. Описание алгоритма. Описание алгоритма. Список переменных и список пропускаемых строк, страница 2

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;

}