Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Олимпиады

Страница: 1 | 2 | 3 | 4 | 5 |

 

  Вопрос: VC++ Help Please ! (задачка) Добавлено: 08.11.05 23:06  

Автор вопроса:  HACKER

Ответить

  Ответы Всего ответов: 67  

Номер ответа: 61
Автор ответа:
 HOOLIGAN



Вопросов: 0
Ответов: 1066
 Профиль | | #61 Добавлено: 16.11.05 15:01
Блин, тэг code забыл :( Чтобы не запутался в циклах, которые без {}, ещё раз

//==========================================================
char* replace ( char* lpString, char* lpMatch, char* lpReplace )
{
    int     match_count=0;
    int     str_len=0;
    int     match_len=0;
    int     repl_len=0;
    int     required;
    char*   pOut;
    char*   pSrc;
    char*   output;
    int     i=0;
    
    while ( lpString[str_len] ) str_len++;      //длина lpString
    if ( !str_len ) return 0;
    while ( lpMatch[match_len] ) match_len++;   //длина lpMatch      
    if ( !match_len ) return 0;
    while ( lpReplace[repl_len] ) repl_len++;   //длина lpReplace

    pSrc = lpString;
    while ( pSrc[0] )                           //подсчёт кол-ва вхождений lpMatch в lpString
    {
        i=0;
        while ( pSrc[i] && (pSrc[i]==lpMatch[i];) ) i++;
        if ( i == match_len )
        {
            match_count++;
            pSrc += i;
        }
        else pSrc++;
    }

    if ( ! match_count ) return 0;
    
    required = str_len - ((match_len- repl_len)*match_count);   //длина новой строки
    if ( 0 == (output = new char[required+1];) ) return 0;       //и получение памяти под неё
    pOut = output;
    pSrc = lpString;
    
    while ( pSrc[0] )                       //поиск фрагментов и замена на новые
    {
        if ( pSrc[0] != lpMatch[0] )        //копируем символы не подлежащие замене, в вых.строку
        {
            pOut[0] = pSrc[0];
            pOut++; pSrc++;
        }
        else                                //если встретился символ, с которого начинается lpMatch
        {
            i = 0;
            while ( pSrc[i] && (pSrc[i]==lpMatch[i];) ) i++;
            if ( i == match_len )           //и lpMatch найдена целиком
            {
                for (i=0; i<repl_len; i++)  //вместо неё в вых. строку копируем lpReplace
                    pOut[i] = lpReplace[i];
                pOut += i; pSrc += match_len;
            }
            else pSrc++;                    //если совпал только первый символ lpMatch, продолжаем
        }                                   //копировать старую строку в вых. строку
    }
    pOut[0]=0;                              //завершаем вых. строку нулём
    
    return output;
    
}


P.S.
Павел, это не накрутка рейтинга. Не надо ругаться.

Ответить

Номер ответа: 62
Автор ответа:
 HACKER


 

Разработчик Offline Client

Вопросов: 236
Ответов: 8362
 Профиль | | #62 Добавлено: 16.11.05 15:07
про memset понял, сёдня пойду препода загонять :)

А вот с replace ... :(

#include <windows.h>
    #include <iostream.h>
    
//==========================================================
char* replace ( char* lpString, char* lpMatch, char* lpReplace )
{
    int match_count=0;
    int str_len=0;
    int match_len=0;
    int repl_len=0;
    int required;
    char* pOut;
    char* pSrc;
    char* output;
    int i=0;
     
    while ( lpString[str_len] ) str_len++; //длина lpString
    if ( !str_len ) return 0;
    while ( lpMatch[match_len] ) match_len++; //длина lpMatch
    if ( !match_len ) return 0;
    while ( lpReplace[repl_len] ) repl_len++; //длина lpReplace

    pSrc = lpString;
    while ( pSrc[0] ) //подсчёт кол-ва вхождений lpMatch в lpString
    {
        i=0;
        while ( pSrc && (pSrc==lpMatch) ) i++;
        if ( i == match_len )
        {
            match_count++;
            pSrc += i;
        }
        else pSrc++;
    }

    if ( ! match_count ) return 0;
     
    required = str_len - ((match_len- repl_len)*match_count); //длина новой строки
    if ( 0 == (output = new char[required+1];) ) return 0; //и получение памяти под неё
    pOut = output;
    pSrc = lpString;
     
    while ( pSrc[0] ) //поиск фрагментов и замена на новые
    {
        if ( pSrc[0] != lpMatch[0] ) //копируем символы не подлежащие замене, в вых.строку
        {
            pOut[0] = pSrc[0];
            pOut++; pSrc++;
        }
        else //если встретился символ, с которого начинается lpMatch
        {
            i = 0;
            while ( pSrc && (pSrc==lpMatch) ) i++;
            if ( i == match_len ) //и lpMatch найдена целиком
            {
                for (i=0; i<repl_len; i++) //вместо неё в вых. строку копируем lpReplace
                    pOut = lpReplace;
                pOut += i; pSrc += match_len;
            }
            else pSrc++; //если совпал только первый символ lpMatch, продолжаем
        } //копировать старую строку в вых. строку
    }
    pOut[0]=0; //завершаем вых. строку нулём
     
    return output;
     
}


void main(){
    char    String[128];        //буфер для строки "sadasd        sadasd  f"
    char    Match[128]= " ";         //буфер для заменяемой строки (два пробела)
    char    Replace[128]= "  ";       //буфер для заменяющей строки (один пробел)
    char*   new_string;
    char*   temp;

    cout<<"Input string: \n";
    cin.getline (String,128);

    /* временная строка */
    temp = (char*) SysAllocStringByteLen( NULL, strlen(String) +1 );      
    
strcpy (temp, String); //скопироали
     
    while ( (new_string = replace (temp, Match, Replace)) != 0 ) //цикл удаления пробелов
    {
        strcpy ( temp, new_string );
        /*удаляем new_string*/
        SysFreeString( (BSTR) new_string );
    }
     
    /* на выходе имеем строку "sadasd sadasd f"*/
    cout<<"\n"<<temp;
    /*освобождаем временную строку*/
    SysFreeString( (BSTR) temp );
cin.get();
}


Не вылетает, но и НЕ уберает пробелы ;)

Ответить

Номер ответа: 63
Автор ответа:
 HACKER


 

Разработчик Offline Client

Вопросов: 236
Ответов: 8362
 Профиль | | #63 Добавлено: 16.11.05 15:12
ой незаметил 5-уй стр :) ну короче скопировал replace тот что ты в [CODE]... написал, и опять вылетать начало по тому же адресу :(

Ответить

Номер ответа: 64
Автор ответа:
 HOOLIGAN



Вопросов: 0
Ответов: 1066
 Профиль | | #64 Добавлено: 16.11.05 16:27
Ясно дело, пробелы не уберет, ты же заменяешь один пробел на два! А надо наоборот :)

И ещё: я ж написал, что переходим с SysAllocString на оператор new. Чтобы твоему преподу понравилось. Соответственно и удалять надо с delete[].

короче вот так должно быть:

    char    String[128];
    char    Match[]="  ";
    char    Replace[]=" ";
    char*   new_string;

    cout << "Input string: \n";
    cin.getline (String,128);

    char*   temp = new char[strlen(String) +1];
    
    strcpy (temp, String);

    while ( (new_string = replace (temp, Match, Replace)) != 0 )
    {
        strcpy ( temp, new_string );
        delete[] new_string ;
    }

    cout << "\n" << temp;
    cin.get();


И ещё: в replace замени фрагмент
else pSrc++; //если совпал только первый символ lpMatch, продолжаем

на такой:
else                            //если совпал только первый символ lpMatch, продолжаем
{
    pOut[0] = pSrc[0];
    pOut++; pSrc++;
}


так будет лучше.
Внимательней надо быть :)

Ответить

Номер ответа: 65
Автор ответа:
 HACKER


 

Разработчик Offline Client

Вопросов: 236
Ответов: 8362
 Профиль | | #65 Добавлено: 16.11.05 22:44
эх... :(

char* replace ( char* lpString, char* lpMatch, char* lpReplace )
{
    int match_count=0;
    int str_len=0;
    int match_len=0;
    int repl_len=0;
    int required;
    char* pOut;
    char* pSrc;
    char* output;
    int i=0;
      
    while ( lpString[str_len] ) str_len++; //длина lpString
    if ( !str_len ) return 0;
    while ( lpMatch[match_len] ) match_len++; //длина lpMatch
    if ( !match_len ) return 0;
    while ( lpReplace[repl_len] ) repl_len++; //длина lpReplace

    pSrc = lpString;
    while ( pSrc[0] ) //подсчёт кол-ва вхождений lpMatch в lpString
    {
        i=0;
        while ( pSrc && (pSrc==lpMatch) ) i++;
        if ( i == match_len )
        {
            match_count++;
            pSrc += i;
        }
        else pSrc++;
    }

    if ( ! match_count ) return 0;
      
    required = str_len - ((match_len- repl_len)*match_count); //длина новой строки
    if ( 0 == (output = new char[required+1];) ) return 0; //и получение памяти под неё
    pOut = output;
    pSrc = lpString;
      
    while ( pSrc[0] ) //поиск фрагментов и замена на новые
    {
        if ( pSrc[0] != lpMatch[0] ) //копируем символы не подлежащие замене, в вых.строку
        {
            pOut[0] = pSrc[0];
            pOut++; pSrc++;
        }
        else //если встретился символ, с которого начинается lpMatch
        {
            i = 0;
            while ( pSrc && (pSrc==lpMatch) ) i++;
            if ( i == match_len ) //и lpMatch найдена целиком
            {
                for (i=0; i<repl_len; i++) //вместо неё в вых. строку копируем lpReplace
                    pOut = lpReplace;
                pOut += i; pSrc += match_len;
            }
else                            //если совпал только первый символ lpMatch, продолжаем
{
pOut[0] = pSrc[0];
pOut++; pSrc++;
}
        } //копировать старую строку в вых. строку
    }
    pOut[0]=0; //завершаем вых. строку нулём
      
    return output;
      
}



void main(){
    char    String[128];
    char    Match[]="  ";
    char    Replace[]=" ";
    char*   new_string;

    cout << "Input string: \n";
    cin.getline (String,128);

    char*   temp = new char[strlen(String) +1];
     
    strcpy (temp, String);

    while ( (new_string = replace (temp, Match, Replace)) != 0 )
    {
        strcpy ( temp, new_string );
        delete[] new_string ;
    }

    cout << "\n" << temp;
    cin.get();
}


Что я теперь забыл? Сделал неправельно итп??? Всёравно нефига не заменят...

Ответить

Номер ответа: 66
Автор ответа:
 HOOLIGAN



Вопросов: 0
Ответов: 1066
 Профиль | | #66 Добавлено: 17.11.05 00:08
HACKER, ты блин чего, меня в гроб загнать хочешь своей невнимательностью :(
Я тебе специально повторил код с тегом CODE.
А ты что скопировал к себе?
Вот твои строки:
while ( pSrc && (pSrc==lpMatch) ) i++;
....
....
while ( pSrc && (pSrc==lpMatch) ) i++;


Таких строк нет в ответе №61.
Там есть такие строки:

while ( pSrc[i] && (pSrc[i]==lpMatch[i];) ) i++;
...
...
while ( pSrc[i] && (pSrc[i]==lpMatch[i];) ) i++;


Разницу улавливаешь? Индексы потерял, пока копировал. Индекс i в квадратных скобках. Я потому и повторил код в 61 ответе с тегом code, что форум этот индекс воспринимает как тэг курсива, бля.

Короче ещё раз :-/
Вот эту ф-цию аккуратненько берешь и копируешь вместо того, что у тебя

char* replace ( char* lpString, char* lpMatch, char* lpReplace )
{
    int     match_count=0;
    int     str_len=0;
    int     match_len=0;
    int     repl_len=0;
    int     required;
    char*   pOut;
    char*   pSrc;
    char*   output;
    int     i=0;
    
    while ( lpString[str_len] ) str_len++;      //длина строки
    if ( !str_len ) return 0;
    while ( lpMatch[match_len] ) match_len++;   //длина lpMatch      
    if ( !match_len ) return 0;
    while ( lpReplace[repl_len] ) repl_len++;   //длина lpReplace

    pSrc = lpString;
    while ( pSrc[0] )                           //подсчёт кол-ва вхождений lpMatch в lpString
    {
        i=0;
        while ( pSrc[i] && (pSrc[i]==lpMatch[i];) ) i++;
        if ( i == match_len )
        {
            match_count++;
            pSrc += i;
        }
        else pSrc++;
    }

    if ( ! match_count ) return 0;
    
    required = str_len - ((match_len- repl_len)*match_count);   //длина новой строки

    if ( 0 == (output = new char[required+1];) ) return 0;       //и получение памяти под неё
    
    pOut = output;
    pSrc = lpString;
    
    while ( pSrc[0] )                       //поиск фрагментов и замена на новые
    {
     if ( pSrc[0] != lpMatch[0] )        //копируем символы не подлежащие замене, в вых.строку
     {
     pOut[0] = pSrc[0];
     pOut++; pSrc++;
     }
     else                                //если встретился символ, с которого начинается lpMatch
     {
     i = 0;
     while ( pSrc[i] && (pSrc[i]==lpMatch[i];) ) i++;
            if ( i == match_len )           //и lpMatch найдена целиком
            {
             for (i=0; i<repl_len; i++)  //вместо неё в вых. строку копируем lpReplace
                    pOut[i] = lpReplace[i];
                pOut += i; pSrc += match_len;
            }
            else                            //если совпал только первый символ lpMatch, продолжаем
            {
                pOut[0] = pSrc[0];
                pOut++; pSrc++;
            }
            
     }                                   //копировать старую строку в вых. строку
    }
    pOut[0]=0;                              //завершаем вых. строку нулём
    
    return output;
    
}


Если опять ошибёшься, расстреляю :)

P.S.
Павел, не ругайся.
Я уже выругался вместо тебя.

Ответить

Номер ответа: 67
Автор ответа:
 HACKER


 

Разработчик Offline Client

Вопросов: 236
Ответов: 8362
 Профиль | | #67 Добавлено: 17.11.05 01:46
:))) ыыыы... спасибо, теперь работает :)))) Ну ты это... не злись :) яж ничё ;) просто глючЕло :)))

Ответить

Страница: 1 | 2 | 3 | 4 | 5 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам