Модераторы: Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [C++]Проверить выполнение баланса, (begin,case,record,feof) -> end 
V
    Опции темы
desert_rose
Дата 29.5.2007, 21:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 51
Регистрация: 18.12.2006
Где: Беллорусия, Минск

Репутация: 3
Всего: 3



Похожая задача уже решалась здесь

Произвести проверку соблюдения баланса операторов CASE -  END, BEGIN - END в тексте программы на  языке  Паскаль(в моем случае на языке С++). Использовать  программный стек.

Но когда я пыталась ее сдать, мне сказали, что во-первых надо все таки проверить не баланс скобок, а выполнение Case-end, begin-end, record-end и feof.  т.е. задача должна быть на С++, но в файле input(в данной задаче main.cpp) программа должна быть на Паскале. но это несовсем важно, мне сказали передалать вот эту часть программы :

Код

#include <stack>     
#include <fstream>
#include <iostream>

using std::cin;
using std::cout;

//проверяет баланс скобок в файле
bool CheckFile( const char *strFileName );

int main(int argc, char* argv[])
{
    if( CheckFile("main.cpp") )
        cout<<"\n main.cpp - good file";
    else
        cout<<"\n main.cpp - bad file";
    cin.get();
}

//проверяет баланс скобок в файле
bool CheckFile( const char *strFileName )
{
    std::stack<char> stkBrackets;
    std::ifstream fin( strFileName );
    if( !fin )
    {
        cout<<"\nCant open it";
        return false;
    }
/*------------------------------------------------------------------------------------------*/   
char cSym = 0;
    while( !fin.eof() )
    {
        fin.get( cSym );  /* вот тут идет считывание следующего символа, а надо заменить на считывание 
                                      следующего слова ("begin", "end", "case", "record", "feof" )*/
        if( fin.eof() )
            break;
       
        switch( cSym )
        {
        case '{': 
        case '[':
        case '(': 
            cout<<"\n push "<<cSym;   
            stkBrackets.push( cSym );
        break;
/*-------------------------------------------------------------------------------------------*/
        case '}': 
            if( stkBrackets.top() == '{'  )
            {
                cout<<"\n pop "<<cSym;
                stkBrackets.pop();
            }
            else
            {
                cout<<"\n Incorrect bracket:"<<cSym;
                return false;
            }
        break;
        case ']':
            if( stkBrackets.top() == '['  )
            {
                cout<<"\n pop "<<cSym;
                stkBrackets.pop();
            }
            else
            {
                cout<<"\n Incorrect bracket:"<<cSym;
                return false;
            }
        break;
        case ')':
            if( stkBrackets.top() == '('  )
            {
                cout<<"\n pop "<<cSym;
                stkBrackets.pop();
            }
            else
            {
                cout<<"\n Incorrect bracket:"<<cSym;
                return false;
            }
        break;
        }
    }
    return stkBrackets.size() == 0;
}



Если кто знает как это сделать, буду признательна если поможете...заранее благодарна...smile

Это сообщение отредактировал(а) desert_rose - 29.5.2007, 21:04
PM   Вверх
zkv
Дата 29.5.2007, 22:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Участник Клуба
Сообщений: 2133
Регистрация: 23.7.2006
Где: Санкт-Петербург

Репутация: 21
Всего: 92



desert_rose, все понятно, кроме feof - что под этим подразумевается? 
Что-то не припомню такого в Паскале...
PM MAIL   Вверх
Guedda
Дата 29.5.2007, 22:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Подрывник
****


Профиль
Группа: Завсегдатай
Сообщений: 3137
Регистрация: 27.12.2005
Где: Ростов-на-Дону

Репутация: 6
Всего: 78



Цитата(zkv @  29.5.2007,  23:48 Найти цитируемый пост)
кроме feof - что под этим подразумевается? Что-то не припомню такого в Паскале...

Вообще то это СиПиПи, и эта функция означает function End of file


--------------------
Ll 2
PM MAIL WWW ICQ Skype GTalk   Вверх
desert_rose
Дата 29.5.2007, 22:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 51
Регистрация: 18.12.2006
Где: Беллорусия, Минск

Репутация: 3
Всего: 3



zkv, file end of file -- вроде так, я не в курсе есть ли такое в паскале, но наверное должно быть, если преподователь сказал...
или если нет, то тогда просто eof...


Это сообщение отредактировал(а) desert_rose - 30.5.2007, 00:01
PM   Вверх
zkv
Дата 29.5.2007, 22:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Участник Клуба
Сообщений: 2133
Регистрация: 23.7.2006
Где: Санкт-Петербург

Репутация: 21
Всего: 92



Цитата(Guedda @  29.5.2007,  22:55 Найти цитируемый пост)
Вообще то это СиПиПи, и эта функция означает function End of file 

Цитата(desert_rose @  29.5.2007,  21:02 Найти цитируемый пост)
надо все таки проверить не баланс скобок, а выполнение Case-end, begin-end, record-end и feof

я понял речь идет о Паскале
про существование Си'шной функции feof() я в курсе, спасибо  smile 

Цитата

или если нет, то тогда просто eof...

не понятно, что с ней надо делать, как она должна влиять на выполнение программы?

PS а расшифровывается скорее file End of file, по аналогии с fprintf(), fscanf() и прочими.

Это сообщение отредактировал(а) zkv - 29.5.2007, 23:16
PM MAIL   Вверх
desert_rose
Дата 29.5.2007, 23:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 51
Регистрация: 18.12.2006
Где: Беллорусия, Минск

Репутация: 3
Всего: 3



Цитата

не понятно, что с ней надо делать, как она должна влиять на выполнение программы?

не знаю..., в Паскале мало чего знаю, если там такого нет, то можете проигнорировать это.

Это сообщение отредактировал(а) desert_rose - 3.6.2007, 23:20
PM   Вверх
zkv
Дата 31.5.2007, 03:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Участник Клуба
Сообщений: 2133
Регистрация: 23.7.2006
Где: Санкт-Петербург

Репутация: 21
Всего: 92



ну вот, работает со всем кроме feof.  Обязательное условие для работы - все требуемые ключевые слова должны быть отделены символами пробельной группы. Не люблю со строками возиться smile

Код

#include <stack>     
#include <fstream>
#include <iostream>
#include <string>
#include <algorithm>

using std::cin;
using std::cout;
using std::string;

//проверяет баланс скобок в файле
bool CheckFile( const char *strFileName );
int main(int argc, char* argv[])
{
    if( CheckFile("main.pas") )
        cout<<"\n main.pas - good file";
    else
        cout<<"\n main.pas - bad file";
    cin.get();
}

void ToUpper( char &cSym );
//проверяет баланс скобок в файле
bool CheckFile( const char *strFileName )
{
    std::stack<string> stkBrackets;
    std::ifstream fin( strFileName );
    if( !fin )
    {
        cout<<"\nCant open it";
        return false;
    }
/*------------------------------------------------------------------------------------------*/   
    string strTemp;

    while( !fin.eof() )
    {
          /* вот тут идет считывание следующего символа, а надо заменить на считывание 
                                      следующего слова ("begin", "end", "case", "record", "feof" )*/
        fin>>strTemp;

        if( fin.eof() )
            break;
        
        std::for_each( &strTemp[ 0 ], &strTemp[ strTemp.length() ], ToUpper );
        
        if( strTemp == "BEGIN" || strTemp == "CASE" || strTemp == "RECORD" )
        {
            cout<<"\n push "<<strTemp;   
            stkBrackets.push( strTemp );
        }
        else if( strTemp == "END" )
        {
            if( stkBrackets.size() )
                cout<<"\n pop "<<strTemp;
            else
                return false;

            stkBrackets.pop();
        }
    }
    return stkBrackets.size() == 0;
}

void ToUpper( char &cSym )
{
    cSym = toupper(cSym);
}

PM MAIL   Вверх
desert_rose
Дата 31.5.2007, 19:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 51
Регистрация: 18.12.2006
Где: Беллорусия, Минск

Репутация: 3
Всего: 3



zkv, спасибо большое!чтобы я без Вас делала!!!!!!!!smileспасибо!smile)))))
PM   Вверх
desert_rose
Дата 1.6.2007, 18:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 51
Регистрация: 18.12.2006
Где: Беллорусия, Минск

Репутация: 3
Всего: 3



м...я наверное уже надоела, но вот тут небольшое замечание появилось, как я сразу не подумала про это...,например, если у нас в комментариях написать одно из этих слов, то баланс уже выполняться не будет...
т.е тут наверное надо идти по массиву посимвольно и построчно, чтоб как только появятся {} как-ни-будь ингорировать это, вот только как это записать...?

PM   Вверх
zkv
Дата 1.6.2007, 22:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Участник Клуба
Сообщений: 2133
Регистрация: 23.7.2006
Где: Санкт-Петербург

Репутация: 21
Всего: 92



desert_rose, про это уже говорили в предыдущей теме. Если подходить с этой стороны, то задача значительно усложняется, так как  эти строки могут встретиться не только в комментариях, но и в строковых константах, всвязи с этим добавляется еще и разбор слеш последовательности '\"'. В настоящий момент программа также не разбирает случаев, когда сразу после служебного слова идут какие - либо разрешенные символы ('{' ';' '.'). Вообщем, решать задачу "по всем правилам" не очень просто и быстро... Возможно, я забыл про еще какие то важные моменты, директивы компилятору, например.
PM MAIL   Вверх
apook
Дата 2.6.2007, 08:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 794
Регистрация: 12.7.2006

Репутация: 10
Всего: 23



Вроде работает smile НЕ обнаружит тока если вставить begin в условие напр
Цитата

if( begin ... end )

ну или подобных нелепых ситуациях, конечно не гарантирую стабильность, но несколко небольших файлов проверил без ошибок
тестировать нехочу надоело
Код

#include<ctype.h>
#include<conio.h>

#include<stdio.h>
#include<string.h>

#include<io.h>

#include<stdlib.h>

#define N (sizeof(ident_acess) / sizeof(ident_acess[ 0 ]))

#define NON     -1
#define DELIMITERS    FNDelm( "DELIMITERS" )
#define COMMENT1      FNDelm( "COMMENT1" )
#define COMMENT2      FNDelm( "COMMENT2" )
#define TEXT          FNDelm( "TEXT" )
#define BLOCK         FNDelm( "BLOCK" )
#define MAXSZ 1024

/*определяем существование файла*/
bool EXISTF( const char name_f[] )
{
    return( access( name_f, 0 )!=-1 ) ? true : false;
}

struct id

    char *ident[ 3 ];    //идентификаторы
    int number;          //количество
    char value[ 50 ];    //Название
    } ident_acess[]={
    { {"end", "begin", "record"}, {3}, {"BLOCK"} },
    { {"//"}, {1}, {"COMMENT1"} },
    { {"{", "}"}, {2}, {"COMMENT2"} },
    { {"'"}, {1}, {"TEXT"} },
    { {";:,./*^#=-+'[]{}<>()"}, {1}, {"DELIMITERS"} }
    };


int FNDelm( const char *elm_name )
{
int i, c=NON;
for( i=0;  i<N; i++ )
    if( stricmp(ident_acess[ i ].value, elm_name)==0 )
    { 
        ++c;
        break;
        }
return( c>NON ) ? i : c;
}

class analys
{

public:
    analys( char *srcf="main.pas" );
    void TMPread();
    int block_whether( char * );
    ~analys();
protected:
    FILE *code_file;
    id *ids;

};

//Конструктор
analys::analys( char *srcf )
{
int i, j, c;

ids=&ident_acess[ 0 ];

//файл с кодом()
if( EXISTF( srcf ) )
{
    code_file=fopen( srcf, "r" );
    if( !code_file )
    { 
        perror( "Error: Cant open file" );
        exit( 1 ); 
        }
    }
else
{
    printf( "Cant open source file %s", srcf );
    exit( 1 );
    }
}

analys::~analys()
{
fcloseall();
}

void analys::TMPread()
{
int i, j, c, FLAG, small_flag, ch, a_count;
long curpos;
char temp[ MAXSZ ], buf[ MAXSZ ], *tmp;

fseek( code_file, 0L, SEEK_SET );
for( i=0, a_count=0; (ch=(fgetc(code_file)))!=EOF; )
{

    //читаем слово 
    FLAG=0;     
    for( j=0; j<strlen(ids[ DELIMITERS ].ident[ 0 ]); j++ )
    {
        if( ch==ids[ DELIMITERS ].ident[ 0 ][ j ]
        || ch=='\n' || ch=='\t' || ch==' ' )
        {
            FLAG=1;
            break; 
            }
        }

    if( FLAG==0 )
    {
        buf[ i ]=ch;
        ++i;
        }
    //Указатель находится на символе разделителе
    //переменная buf содержит все что до него
    //переменная ch содержит сам символ разделитель DELIMITERS 
    else if( FLAG==1 )
    {
        small_flag=0;
        buf[ i ]='\0';

        curpos=ftell( code_file );

        //text 
        if( small_flag==0 )
        {
            if( ch==ids[ TEXT ].ident[ 0 ][ 0 ] )
            {
                for( j=i; buf[ j ]!=EOF; j++ )
                {
                    if( (buf[ j ]=(fgetc(code_file)))=='\n' && buf[ j-1 ]!='\\' )
                       break;

                    else if( buf[ j ]==ids[ TEXT ].ident[ 0 ][ 0 ] )
                    {
                        small_flag=2;
                        break;
                        }
                    }
 
                if( small_flag>0 )
                { 
                    if( buf[ j ]!=EOF )
                        ch=buf[ j ];
                    else
                        ch='\0';
                    buf[ j ]='\0';
                    }
                else
                {
                    fseek( code_file, curpos, SEEK_SET );
                    buf[ i ]='\0';
                    }
                }   
            }

        //Комментарий  1
        if( small_flag==0 )
        {

            temp[ 0 ]=ch;
            temp[ 1 ]=fgetc( code_file ); //считать следующий символ
            temp[ 2 ]='\0';

            for( j=0; j<ids[ COMMENT1 ].number; j++ )
            {
                if( strcmp( temp, ids[ COMMENT1 ].ident[ j ])==0 )
                {
                    for( ; (buf[ i ]=(fgetc(code_file)))!='\n' && buf[ i ]!=EOF; i++ )
                        ;
                    if( buf[ i ]!=EOF )
                        ch=buf[ i ];
                    else
                        ch='\0';
                    buf[ i ]='\0';
                    small_flag=1;
                    break;
                    }
                }
            if( small_flag==0 )
                fseek( code_file, curpos, SEEK_SET );
            }

        //Комментарий  2 
        if( small_flag==0 )
        {
            temp[ 0 ]=ch;
            temp[ 1 ]='\0';

            if( strncmp(temp, ids[ COMMENT2 ].ident[ 0 ], 1)==0 )
            {
                for( j=i; (buf[ j ]=(fgetc(code_file)))!=EOF; )
                {
                    if( buf[ j ]==ids[ COMMENT2 ].ident[ 1 ][ 0 ] )
                    { 
                        small_flag=2;
                        break;
                        }
                    else
                        j++;
                    }
                if( small_flag>0 )
                {
                    if( buf[ j ]!=EOF )
                        ch=buf[ j ];
                    else
                        ch='\0';
                    buf[ j ]='\0'; 
                    }
                else
                {
                   ch='\0';
                   buf[ i ]='\0';
                   }
               }   
          }

        if( small_flag==0 )
        {
            if( strncmpi( buf, ids[ BLOCK ].ident[ 1 ], strlen(ids[ BLOCK ].ident[ 1 ]))==0 )
            {
                printf( " %s-+->", ids[ BLOCK ].ident[ 1 ] );
                ++a_count;
                }
            else if( strncmpi( buf, ids[ BLOCK ].ident[ 2 ], strlen(ids[ BLOCK ].ident[ 2 ]))==0 )
            {
                printf( " %s-^->", ids[ BLOCK ].ident[ 2 ] );
                ++a_count;
                }

            else if( strncmpi(ids[BLOCK].ident[ 0 ], buf, 3)==0)
            {
                printf( "<--%s ", ids[BLOCK].ident[ 0 ] );
                --a_count;
                }
            }
        i=0;
        }
    }

if( a_count==0 )
    printf( " GOOD!!!" );
else
    printf( " BAD !!!" );
return;
}



void main( int argc, char *argv[] )
{
analys CODEFILE( "main.pas" );

CODEFILE.TMPread();
getch();

return;
}





--------------------
Мои руки из дуба, голова из свинца ну и пусть ...
PM MAIL   Вверх
apook
Дата 2.6.2007, 11:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 794
Регистрация: 12.7.2006

Репутация: 10
Всего: 23



Улучшенный вариант добавлена оьработка комментариев типа (* *)
и можно добавить еще операторов  кроме begin record до 10 шт
(лишь бы заканчивались end-ом просто не очень знаком с паскалем)
Код


#include<ctype.h>
#include<conio.h>

#include<stdio.h>
#include<string.h>

#include<io.h>

#include<stdlib.h>

//Препроцессор при компилировании посчитает размер массива структур
#define N (sizeof(ident_acess) / sizeof(ident_acess[ 0 ]))

//благодаря этому участку кода мы далее обращаемся к любомк элементу
//структуры так сказать без проблем
#define NON     -1
#define DELIMITERS    FNDelm( "DELIMITERS" )
#define COMMENT1      FNDelm( "COMMENT1" )
#define COMMENT2      FNDelm( "COMMENT2" )
#define COMMENT3      FNDelm( "COMMENT3" )
#define TEXT          FNDelm( "TEXT" )
#define BLOCK         FNDelm( "BLOCK" )
#define MAXSZ 1024

/*определяем существование файла*/
bool EXISTF( const char name_f[] )
{
    return( access( name_f, 0 )!=-1 ) ? true : false;
}



//стуктура является массивом и содержит разделители, идентификаторы и прочую дребедень(нужную)
struct id

    char *ident[ 10 ];   //идентификаторы
    int number;          //количество
    char value[ 50 ];    //Название
    } ident_acess[]={
// можно добавит еще операторорв равнозначных begin record (до 10 шт)но end всегда первый элемент
    { {"end", "begin", "record", "class", "case"}, {5}, {"BLOCK"} },
    { {"//"}, {1}, {"COMMENT1"} },
    { {"{", "}"}, {2}, {"COMMENT2"} },
    { {"(**)"}, {1}, {"COMMENT3"} },
    { {"'"}, {1}, {"TEXT"} },
    { {";:,./*^#=-+'[]{}<>()"}, {1}, {"DELIMITERS"} }
    };

//Функцию использует препроцессор 
int FNDelm( const char *elm_name )
{
int i, c=NON;
for( i=0;  i<N; i++ )
    if( stricmp(ident_acess[ i ].value, elm_name)==0 )
    { 
        ++c;
        break;
        }
return( c>NON ) ? i : c;
}

//Класс содержит функцию TMPread()
//и это вся с него польза (в данном случае)
class analys
{

public:
    analys( char *srcf="main.pas" );
    void TMPread();
    ~analys();
protected:
    FILE *code_file;
    id *ids;

};

//К о н с т р у к т о р
analys::analys( char *srcf )
{
int i, j, c;

ids=&ident_acess[ 0 ];

//файл с кодом()
if( EXISTF( srcf ) )
{
    code_file=fopen( srcf, "r" );
    if( !code_file )
    { 
        perror( "Error: Cant open file" );
        exit( 1 ); 
        }
    }
else
{
    printf( "Cant open source file %s", srcf );
    exit( 1 );
    }
}
//Д е с т р к т о р
analys::~analys()
{
fcloseall();
}

//О б р а б о т к а 
void analys::TMPread()
{
int i, j, c, FLAG, small_flag, ch, a_count;
long curpos;
char temp[ MAXSZ ], buf[ MAXSZ ], *tmp;

fseek( code_file, 0L, SEEK_SET );
for( i=0, a_count=0; (ch=(fgetc(code_file)))!=EOF; )
{

    //читаем слово 
    FLAG=0;     
    for( j=0; j<strlen(ids[ DELIMITERS ].ident[ 0 ]); j++ )
    {
        if( ch==ids[ DELIMITERS ].ident[ 0 ][ j ]
        || ch=='\n' || ch=='\t' || ch==' ' )
        {
            FLAG=1;
            break; 
            }
        }

    if( FLAG==0 )
    {
        buf[ i ]=ch;
        ++i;
        }
    //Указатель находится на символе разделителе
    //переменная buf содержит все что до него
    //переменная ch содержит сам символ разделитель DELIMITERS 
    else if( FLAG==1 )
    {
        small_flag=0;
        buf[ i ]='\0';

        curpos=ftell( code_file );

        //text 
        if( small_flag==0 )
        {
            if( ch==ids[ TEXT ].ident[ 0 ][ 0 ] )
            {
                for( j=i; buf[ j ]!=EOF; j++ )
                {
                    if( (buf[ j ]=(fgetc(code_file)))=='\n' && buf[ j-1 ]!='\\' )
                       break;

                    else if( buf[ j ]==ids[ TEXT ].ident[ 0 ][ 0 ] )
                    {
                        small_flag=2;
                        break;
                        }
                    }
 
                if( small_flag>0 )
                { 
                    if( buf[ j ]!=EOF )
                        ch=buf[ j ];
                    else
                        ch='\0';
                    buf[ j ]='\0';
                    }
                else
                {
                    fseek( code_file, curpos, SEEK_SET );
                    buf[ i ]='\0';
                    }
                }   
            }

        //Комментарий  1
        if( small_flag==0 )
        {
            temp[ 0 ]=ch;
            temp[ 1 ]=fgetc( code_file ); //считать следующий символ
            temp[ 2 ]='\0';

            for( j=0; j<ids[ COMMENT1 ].number; j++ )
            {
                if( strcmp( temp, ids[ COMMENT1 ].ident[ j ])==0 )
                {
                    for( ; (buf[ i ]=(fgetc(code_file)))!='\n' && buf[ i ]!=EOF; i++ )
                        ;
                    if( buf[ i ]!=EOF )
                        ch=buf[ i ];
                    else
                        ch='\0';
                    buf[ i ]='\0';
                    small_flag=1;
                    break;
                    }
                }
            if( small_flag==0 )
                fseek( code_file, curpos, SEEK_SET );
            }

        //Комментарий  2 
        if( small_flag==0 )
        {
            temp[ 0 ]=ch;
            temp[ 1 ]='\0';

            if( strncmp(temp, ids[ COMMENT2 ].ident[ 0 ], 1)==0 )
            {
                for( j=i; (buf[ j ]=(fgetc(code_file)))!=EOF; )
                {
                    if( buf[ j ]==ids[ COMMENT2 ].ident[ 1 ][ 0 ] )
                    { 
                        small_flag=2;
                        break;
                        }
                    else
                        j++;
                    }
                if( small_flag>0 )
                {
                    if( buf[ j ]!=EOF )
                        ch=buf[ j ];
                    else
                        ch='\0';
                    buf[ j ]='\0'; 
                    }
                else
                {
                   ch='\0';
                   buf[ i ]='\0';
                   }
               }   
           }

        //Комментарий  3 
        if( small_flag==0 )
        {
            temp[ 0 ]=ch;
            temp[ 1 ]=fgetc( code_file ); //считать следующий символ
            temp[ 2 ]='\0';

            if( strncmp(temp, ids[ COMMENT3 ].ident[ 0 ], 2)==0 )
            {
                for( j=i; (buf[ j ]=(fgetc(code_file)))!=EOF; )
                {
                    if( buf[ j ]==ids[ COMMENT3 ].ident[ 0 ][ 3 ]
                    && buf[ j-1 ]==ids[ COMMENT3 ].ident[ 0 ][ 2 ]  )
                    { 
                        small_flag=1;
                        break;
                        }
                    else
                        j++;

                    }
                if( small_flag>0 )
                {
                    if( buf[ j ]!=EOF )
                        ch=buf[ j ];
                    else
                        ch='\0';
                    buf[ j-1 ]='\0'; 
                    }
                else
                {
                   ch='\0';
                   buf[ i-1 ]='\0';
                   }

                }
            if( small_flag==0 )
                fseek( code_file, curpos, SEEK_SET );
            }

        //ПРоверка на баланс 
        if( small_flag==0 )
        {

            for( j=1; j<ids[ BLOCK ].number; j++ )
            {
                if( strncmpi( buf, ids[ BLOCK ].ident[ j ], strlen(ids[ BLOCK ].ident[ j ]))==0 )
                {
                    printf( " [%s-+->", ids[ BLOCK ].ident[ j ] );
                    ++a_count;
                    }
                }
  
            if( strncmpi(ids[BLOCK].ident[ 0 ], buf, 3)==0)
            {
                printf( "<--%s] ", ids[BLOCK].ident[ 0 ] );
                --a_count;
                }
            }
        i=0;
        }
    }

if( a_count==0 )
    printf( "\n\nGOOD!!!" );
else
    printf( "\n\nBAD !!!" );
return;
}



void main( int argc, char *argv[] )
{
analys CODEFILE( "main.pas" );

CODEFILE.TMPread();
getch();

return;
}




Это сообщение отредактировал(а) apook - 3.6.2007, 03:27


--------------------
Мои руки из дуба, голова из свинца ну и пусть ...
PM MAIL   Вверх
desert_rose
Дата 2.6.2007, 15:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 51
Регистрация: 18.12.2006
Где: Беллорусия, Минск

Репутация: 3
Всего: 3



apook, большое спасибоsmileа можно туда комментариев...?потому что без них практически ничего понять не могу...
PM   Вверх
apook
Дата 2.6.2007, 16:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 794
Регистрация: 12.7.2006

Репутация: 10
Всего: 23



Боюсь понять будет сложно, я думал тебе просто чтоб здать лабу не вникая, тагда основные моменты прокомментирую( как бы самому там не запутаться  smile).
Код

/*                               -- Проверка баланса --

Суть в следующем:
Операторы типа begin record class хранятся в стуктуре (массиве) ident_acess
она заполняется статически !
Основную работу производит функция TMPread()

К моменту ее запуска имеем
 Открытый файл с кодом на паскале
 известно положение в массиве  каждого элемента (вычисляется препроцессором поэтому их
 можно менять местами) 
 
функция TMPread() читает в массив до первого встреченного символа разделителя которые
мы сами и задаем при инициализации массива структур в данном случае это строка 
";:,./*^#=-+'[]{}<>()" но можно добавить (убовлять не надо)
Таким образои получается некое СЛОВО оно сперва проверяется на то
 не строковая ли константа
 не комментарий ли ( разных типов //, {}, (**) )
 и если нет то проверяется не оператор ли это begin или record и т.п
 и если да то проверяется баланс
*/

 

Это сообщение отредактировал(а) apook - 3.6.2007, 00:17


--------------------
Мои руки из дуба, голова из свинца ну и пусть ...
PM MAIL   Вверх
desert_rose
Дата 3.6.2007, 14:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 51
Регистрация: 18.12.2006
Где: Беллорусия, Минск

Репутация: 3
Всего: 3



apook, ок, алгоритм понятен, спасибо еще разsmile


M
Guedda
Модератор: Не забываем отмечать вопрос решенным!


Это сообщение отредактировал(а) Guedda - 3.6.2007, 16:14
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Центр помощи"

ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Несоблюдение правил может повлечь за собой самые строгие меры от закрытия/удаления темы до бана пользователя!


  • Название темы должно отражать её суть! (Не следует добавлять туда слова "помогите", "срочно" и т.п.)
  • При создании темы, первым делом в квадратных скобках укажите область, из которой исходит вопрос (язык, дисциплина, диплом). Пример: [C++].
  • В названии темы не нужно указывать происхождение задачи (например "школьная задача", "задача из учебника" и т.п.), не нужно указывать ее сложность ("простая задача", "легкий вопрос" и т.п.). Все это можно писать в тексте самой задачи.
  • Если Вы ошиблись при вводе названия темы, отправьте письмо любому из модераторов раздела (через личные сообщения или report).
  • Для подсветки кода пользуйтесь тегами [code][/code] (выделяйте код и нажимаете на кнопку "Код"). Не забывайте выбирать при этом соответствующий язык.
  • Помните: один топик - один вопрос!
  • В данном разделе запрещено поднимать темы, т.е. при отсутствии ответов на Ваш вопрос добавлять новые ответы к теме, тем самым поднимая тему на верх списка.
  • Если вы хотите, чтобы вашу проблему решили при помощи определенного алгоритма, то не забудьте описать его!
  • Если вопрос решён, то воспользуйтесь ссылкой "Пометить как решённый", которая находится под кнопками создания темы или специальным флажком при ответе.

Более подробно с правилами данного раздела Вы можете ознакомится в этой теме.

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Poseidon, Rodman

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Центр помощи | Следующая тема »


 




[ Время генерации скрипта: 0.1124 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.