Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Zadanie domowe Poziom 3 Lekcja 28

Ostatnio zmodyfikowano 2013-04-08 21:05
Autor Wiadomość
sibi00
Temat założony przez niniejszego użytkownika
Zadanie domowe Poziom 3 Lekcja 28
» 2013-04-06 09:52:27
Mam pewien problem z odczytem z tablicy. Poniżej wklejam swój kod.

C/C++
//Napisz program, który z podanego łańcucha znaków usunie powtarzające się spacje
//występujące obok siebie i zastąpi znaczniki <b> oraz </b> znacznikami [b] oraz [/b].
//Tekst, który powstanie w wyniku przeprowadzenia wspomnianych operacji wypisz na ekran.
#include "stdafx.h"
#include <iostream>
#include <string>

std::string konwertuj( std::string & sTekst )
{
    int tmp;
    int tmp1;
    std::string sWynik;
    sWynik.insert( 0, sTekst );
    int pozycjespacji[ 40 ];
    size_t spacje = sTekst.find( " " );
    std::cout << spacje << " ";
    pozycjespacji[ 0 ] = spacje;
    std::cout << pozycjespacji[ 0 ];
    do
    {
        int i = 1;
        spacje = sTekst.find( " ", spacje + 1 );
        std::cout << spacje << " ";
        pozycjespacji[ i ] = spacje;
        std::cout << pozycjespacji[ i ] << " " << std::endl;
    } while( spacje != std::string::npos );
   
    std::cout << std::endl;
   
    for( int j = 0; j < sizeof( pozycjespacji ) / sizeof( int ); j++ )
    {
        int kolejny = j + 1;
        tmp = pozycjespacji[ kolejny ];
        tmp1 = pozycjespacji[ j ] + 1;
        //std::cout<<tmp<<" "<<tmp1<<std::endl;
        if( tmp1 == tmp )
        {
            sWynik.erase( tmp1, 1 );
           
            for( int g = j; g < sizeof( pozycjespacji ) / sizeof( int ); g++ )
            {
                pozycjespacji[ g ] = pozycjespacji[ g ] - 1;
            }
           
        } else { };
    }
   
   
    return sWynik;
}
int main()
{
    int stop;
    std::string tekst = "<b>to jest </b> testowy        napis     :)";
    std::cout << konwertuj( tekst ) << std::endl;
    std::cin >> stop;
    return 0;
}

Przy usuwaniu spacji z ciagu znakow. Chcę to zrobić w taki sposób, że zczytałem pozycje spacji w ciągu znakow i zapisalem te pozycje do tablicy. Nastepnie w petli chcialem usuwac po jednym znaku z ciagu w przypadku gdy element tablicy jest o 1 wiekszy od poprzedniego oraz pozostalem elementy tablicy z wpolrzednymi spacjami zmniejszac o 1 ( usuwam znak to ciag robi sie o 1 element krotszy). Problem polega na tym, że w debugowaniu jak wchodze do funkcji to pokazuje mi jakies dziwne wartosci znajdujace sie w tablicy. W pierwszym obiegu petli w funkcji jak wpisuje do zmiennej tmp wartosc tablicy o spolrzednej j+1 to znajduje sie tam wartosc nie wiem dlaczego -1.

P-80022
Monika90
» 2013-04-06 10:16:38
Twoja pierwsza pętla zapisuje pozycje spacji do komórki pozycjespacji[1], jak już nie ma wiecej spacji, to find zwraca std::string::npos, które też jest zapisywane do pozycjespacji[1], npos konwertowane na int przyjmuje wartość -1. Czyli pozycjespacji[1] zawiera wartośc -1, pozostałe komórki tablicy zawierają śmieci. Napisz ten program jeszcze raz.
P-80024
sibi00
Temat założony przez niniejszego użytkownika
» 2013-04-08 18:50:25
C/C++
//Napisz program, który z podanego łańcucha znaków usunie powtarzające się spacje
//występujące obok siebie i zastąpi znaczniki <b> oraz </b> znacznikami [b] oraz [/b].
//Tekst, który powstanie w wyniku przeprowadzenia wspomnianych operacji wypisz na ekran.
#include "stdafx.h"
#include <iostream>
#include <string>

std::string konwertuj( std::string & sTekst )
{
    std::string sWynik;
    sWynik.insert( 0, sTekst );
    size_t spacjel = sWynik.find( " " );
    size_t spacjep = sWynik.find( " ", spacjel + 1 );
    std::string spacja = " ";
   
    do
    {
        if( spacjel == std::string::npos && spacjep == std::string::npos )
        {
            return sWynik;
        }
        if( spacjel + 1 == spacjep )
        {
            sWynik.erase( spacjel, 1 );
        }
       
        spacjel = spacjep;
        spacjep = sWynik.find( spacja, spacjep + 1 );
       
    } while( spacjel != std::string::npos && spacjep != std::string::npos );
   
    /*
    for(int i=1;i<16;i++)
    {
    spacje=sWynik.find(" ",spacje+1); //znajdoweanie kolejnych spacji
    if(spacje != std::string::npos)
    {
    pozycjespacji[i]=spacje; //uzupelnienie tablicy pozycjami spacji
    }
    }
   
    for(int g=0;g<20;g++)
    {
    if(pozycjespacji[g+1]>0)
    {
    int lewa = pozycjespacji[g]+1;
    int prawa = pozycjespacji[g+1];
    if(lewa == prawa) //sprawdzenie czy spacje sa obok siebie
    {
    sWynik.erase(prawa,1);  //usuniecie nadmiarowej spacji
    for(int h=g+1;h<20;h++)
    {
    pozycjespacji[h]=pozycjespacji[h]-1; //pomniejszenie o 1 pozostalych pozycji spacji ( string zmniejszony o 1 - usunieto spacje ;) )
    }
   
    }
    }
    }
    */
    std::string b = "<b>";
    std::string nowe_b = "[b]";
    size_t pozycjab = sWynik.find( b );
   
    do
    {
        if( pozycjab == std::string::npos )
        {
            return sWynik;
        }
        sWynik.erase( pozycjab, b.size() );
        sWynik.insert( pozycjab, nowe_b );
        pozycjab = sWynik.find( b, pozycjab + 1 );
       
    } while( pozycjab != std::string::npos );
   
    std::string c = "</b>";
    std::string nowe_c = "[/b]";
    size_t pozycjac = sWynik.find( c );
   
    do
    {
        if( pozycjac == std::string::npos )
        {
            return sWynik;
        }
        sWynik.erase( pozycjac, c.size() );
        sWynik.insert( pozycjac, nowe_c );
        pozycjac = sWynik.find( c, pozycjac + 1 );
       
    } while( pozycjac != std::string::npos );
   
    return sWynik;
}
int main()
{
    int stop;
    std::string tekst = "<b>to jest </b> testowy  napis <b>   </b>    :)";
    std::cout << konwertuj( tekst ) << std::endl;
    std::cout << tekst;
    std::cin >> stop;
    return 0;
}

Ponownie problem pojawił się w kasowaniu nadmiarowych spacji. Postanowilem nie robic dodatkowej tablicy tylko pojechac po kolei po spacjach. spacjel to pierwsza spacja natomiast spacjap to kolejna. Mialo to dzialac na zasadzie przeskokow przedzialu. Po pierwsze nie kasuje wszystkich spacji, a pod drugie debugujac pierwsza petle wchodzi w jakies pliki xstring, xutility. Może ktoś coś podpowie co robię źle? Odrazu możecie spojrzeć czy pozostała część zadania została dobrze wykonana.
P-80221
sibi00
Temat założony przez niniejszego użytkownika
» 2013-04-08 21:05:46
bump.
czekam na jakies wskazowki. Każdy pomysl bedzie bardzo pomocny.

[edit] Poprostu nie pomyślałem o tym, że można wykrywać 2 spacji obok siebie jakos ciag znakow i usuwac 1 znak. Poradzilem sobie przy pomocy rozwiazan zamieszczonych na forum ;)
P-80232
« 1 »
  Strona 1 z 1