Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > "чистота" кода


Автор: C4sh 3.1.2011, 15:00
Привет. Прошу посмотреть на код и указать на ошибки оформления.

Код

#include <iostream>
using std::cout;
using std::cin;

int find( char string[], char required[], int numberOfCharactersPerLine, int numberOfCharactersInTheDesired );

int firstStageOfTheAnalysisLine( char string[], char required[], int stringLength, int requiredLength );

int secondStageOfTheAnalysisLine( char string[], char required[], int stringLength, int requiredLength,
                 int positionOfFirstCharacter, int positionOfLastCharacter );

void getCharacterPosition( char string[], char required[], int stringLength, int requiredLength,
                          int &positionOfFirstCharacter, int &positionOfLastCharacter );

int compareTheOccurrence( char string[], char required[], int requiredLength, 
                         int positionOfFirstCharacter, int positionOfLastCharacter );
int main( int argc, char *argv[] ) {
    char string[ 128 ];
    char required[ 128 ];
    cin.getline( string, 227 );
    cin.getline( required, 127 );
    int pos = find( string, required, 7, 2);

    cout << pos;

    return 0;
}

int find( char string[], char required[], int numberOfCharactersPerLine, int numberOfCharactersInTheDesired  ) {
    int stringLength = numberOfCharactersPerLine;
    int requiredLength = numberOfCharactersInTheDesired;

    int positionOfFirstCharacter = 0;
    int positionOfLastCharacter = 0;


    if( firstStageOfTheAnalysisLine( string, required, stringLength, requiredLength ) == 0 ) {
        getCharacterPosition( 
            string,
            required, 
            stringLength, 
            requiredLength,
            positionOfFirstCharacter, 
            positionOfLastCharacter 
            );
    }

    if( secondStageOfTheAnalysisLine( string, required, stringLength, requiredLength,
        positionOfFirstCharacter, positionOfLastCharacter ) != 0 )
            return ( - 1 );

    return positionOfFirstCharacter;
}

void getCharacterPosition( char string[], char required[], int stringLength, int requiredLength,
                          int &positionOfFirstCharacter, int &positionOfLastCharacter ) {
        const int firstCharacter = 0;
        const int lastCharacter = requiredLength - 1;

        for( int i = 0; i < stringLength; i++ ) {
            if( string[ i ] == required[ firstCharacter ] )
                positionOfFirstCharacter = i;
            else if( string[ i ] == required[ lastCharacter ] )
                positionOfLastCharacter = i;
        }
    return;
}
int secondStageOfTheAnalysisLine( char string[], char required[], int stringLength, int requiredLength,
                 int positionOfFirstCharacter, int positionOfLastCharacter ) {
    if( requiredLength != ( ( positionOfLastCharacter - positionOfFirstCharacter ) + 1 ) )
        return ( -1 );
    else {
        if( compareTheOccurrence( string, required, requiredLength,
            positionOfFirstCharacter, positionOfLastCharacter ) != 0 )
                return ( -1 );
    }
    return 0;
}

int firstStageOfTheAnalysisLine( char string[], char required[], int stringLength, int requiredLength ) {
    if( stringLength < requiredLength )
        return ( -1 );
    else if( stringLength == requiredLength )
            for( int i = 0; i < stringLength; i++ )
                if( string[ i ] != required[ i ] )
                    return ( -1 );
    return 0;
}

int compareTheOccurrence( char string[], char required[], int requiredLength, 
                         int positionOfFirstCharacter, int positionOfLastCharacter ) {
    for( int i = 0, k = positionOfFirstCharacter; i < requiredLength, k <= positionOfLastCharacter; k++, i++ ) {
        if( string[ k ] != required[ i ] )
            return ( -1 );
        }
    return 0;
}


Спасибо.

Автор: Modul 3.1.2011, 16:14
Бегло просмотрел.

Цитата(C4sh @  3.1.2011,  15:00 Найти цитируемый пост)
int find( char string[], char required[], int numberOfCharactersPerLine, int numberOfCharactersInTheDesired );


Хоть так и можно, но лучше так:
Код

void findToStr(char *a, char *b);



1) Можно оформить в виде модуля (библиотеки функций) или класса;
2) Лучше избегать названий переменных string, чтобы путаницы с std::string не было;
3) Больно длинные имена переменных, например, numberOfCharactersInTheDesired;
4) А в STL этого велосипеда нет случайно ?

Автор: C4sh 3.1.2011, 16:21
Цитата

1) Можно оформить в виде модуля (библиотеки функций) или класса;


Да маловато для класса smile

Цитата

2) Лучше избегать названий переменных string, чтобы путаницы с std::string не было;

учту

Цитата

3) Больно длинные имена переменных, например, numberOfCharactersInTheDesired;

Пытался сделать имена ясными.

Цитата

4) А в STL этого велосипеда нет случайно ? 

Ну задача стояла в реализации своего алгоритма поиска подстроки smile

Автор: alexvs11 3.1.2011, 17:07
Цитата(C4sh @  3.1.2011,  15:00 Найти цитируемый пост)
    return;

бессмысленная конструкция в данном случае
потом всегда считал, что в циклах надо использовать ++i, вместо i++, но это не критично

Автор: triclosan 3.1.2011, 17:10
Цитата(alexvs11 @  3.1.2011,  17:07 Найти цитируемый пост)
но это не критично 

для примитивных типов - да.

Автор: Sartorius 3.1.2011, 17:35
В названии метда/функции должен все-таки быть глагол. Используй стандартные приставки get/set/is. 
Убери magic numbers
Цитата(C4sh @  3.1.2011,  16:00 Найти цитируемый пост)
cin.getline( string, 227 )

а то так и опечататься недолго  smile 

Автор: C4sh 3.1.2011, 17:41
Спасибо за ответы, будем работать над улучшением кода smile

Автор: borisbn 5.1.2011, 17:41
Цитата(Modul @  3.1.2011,  16:14 Найти цитируемый пост)

Бегло просмотрел.

int find( char string[], char required[], int numberOfCharactersPerLine, int numberOfCharactersInTheDesired );

Хоть так и можно, но лучше так:

void findToStr(char *a, char *b);


а правильнее так smile :
Код

void findToStr( const char * const  a, const char * const  b );


А вот по поводу имён переменных типа numberOfCharactersInTheDesired соглашусь с Modul - программа становится не более понятная, а менее читабельная.

Автор: Modul 5.1.2011, 19:34
to borisbn

ну Вы наворотили ! 

Я поклонник древних С-шных динозавров  !

ну мне коннеЧнО это нравится, но вот думаю я: как Вы это на Qt недвусмысленно пишите в тишине ???

Автор: borisbn 6.1.2011, 00:11
Цитата(Modul @  5.1.2011,  19:34 Найти цитируемый пост)
как Вы это на Qt недвусмысленно пишите в тишине ???

да вот как-то так. пописываю потихоньку. Кста, в тишине лучше пишется, НО никогда не получается.
Если знаешь как создать вокруг себя тишину - расскажи.


перечитал всё вышесказанное - набор буков.

Modul, что ты хотел сказать   smile  ?

Автор: Modul 6.1.2011, 10:28
Цитата(borisbn @  6.1.2011,  00:11 Найти цитируемый пост)
перечитал всё вышесказанное - набор буков.


Из букв получаются слова, в словах скрытый смысл.

В смысле - действие, отсюда движение и экономика.

Посмеялись мы с Вами ?!!  smile 

Автор: vnf 7.1.2011, 14:35
1.
Цитата(C4sh @  3.1.2011,  16:21 Найти цитируемый пост)
Да маловато для класса 

В самый раз.
Судя по коду main открытым методом будет только find. Остальные это детали реализации и их нужно скрыть.
2. 4-5 аргументов у функций - это много (использование класса позволит уменьшить их количество).

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)