• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Dlaczego ten program nie działa?

Object Storage Arubacloud
–1 głos
421 wizyt
pytanie zadane 8 sierpnia 2019 w C i C++ przez magda_19 Gaduła (3,080 p.)

Witam, piszę program, który mam zadanie skracać podany ciąg liter od wybranego znaku, np. gdy podam aaa i chcę skracać od pierwszego miejsca, to program powinien wypisać a3. Jednak mój kod nie działa, nie wiem co jest nie tak...

#include <iostream>
#include <sstream>
#include <fstream>
#include <string>

using namespace std;

string konwersjaIntNaString (int liczba)
{
    ostringstream ss;
    ss << liczba;
    string str = ss.str();

    return str;
}

int obliczIleTakichSamychZnakowWystepujeObokSiebie(string wyraz, int pozycja)
{
    int iloscTakichSamychZnakow = 1;
    char znak;
    if(wyraz.length() > pozycja)
    {
        while((wyraz[iloscTakichSamychZnakow] == wyraz[iloscTakichSamychZnakow + 1]) && (! isdigit(wyraz[iloscTakichSamychZnakow])))
        {
            iloscTakichSamychZnakow++;
            pozycja++;
        }
   }
    else
        iloscTakichSamychZnakow = 0;


    return iloscTakichSamychZnakow;
}


string skracanieWyrazow(string wyrazDoSkrocenia, int minimalnaIloscZnakowOdKtorychNalezySkracac)
{
    int dlugosc = wyrazDoSkrocenia.length();
    int iloscWystapien = 1;
    char powtarzajacySieZnak;
    int pozycja;


    for (int i = 0; i < dlugosc-2; i++)
    {
        if ( !isdigit(wyrazDoSkrocenia[pozycja]) && obliczIleTakichSamychZnakowWystepujeObokSiebie(wyrazDoSkrocenia, pozycja) >= minimalnaIloscZnakowOdKtorychNalezySkracac)
        {
            iloscWystapien = obliczIleTakichSamychZnakowWystepujeObokSiebie(wyrazDoSkrocenia, i);
            powtarzajacySieZnak = wyrazDoSkrocenia[i];
            wyrazDoSkrocenia.replace(i, iloscWystapien, powtarzajacySieZnak + konwersjaIntNaString(iloscWystapien));
            dlugosc = wyrazDoSkrocenia.length();
        }

    }
    return wyrazDoSkrocenia;
}


int main()
{
    string wyraz;
    int minimalnaIloscZnakowOdKtorychNalezySkracac;

    cin >> wyraz;
    cin >> minimalnaIloscZnakowOdKtorychNalezySkracac;
    cout << skracanieWyrazow(wyraz, minimalnaIloscZnakowOdKtorychNalezySkracac) << endl;

    return 0;
}

 

1 odpowiedź

0 głosów
odpowiedź 9 sierpnia 2019 przez adrian17 Ekspert (344,860 p.)

Um, trochę rzeczy w tym kodzie jest dziwnych:

int obliczIleTakichSamychZnakowWystepujeObokSiebie(string wyraz, int pozycja)
{
    int iloscTakichSamychZnakow = 1;
    char znak;
    if(wyraz.length() > pozycja)
    {
        while((wyraz[iloscTakichSamychZnakow] == wyraz[iloscTakichSamychZnakow + 1]) && (! isdigit(wyraz[iloscTakichSamychZnakow])))
        {
            iloscTakichSamychZnakow++;
            pozycja++;
        }
   }
    else
        iloscTakichSamychZnakow = 0;
 
 
    return iloscTakichSamychZnakow;
}

Na pewno w tej pętli nigdzie nie chcesz użyć `pozycja`? Trochę dziwne, że używasz go tylko do porównania z rozmiarem.

    int pozycja;
 
 
    for (int i = 0; i < dlugosc-2; i++)
    {
        if ( !isdigit(wyrazDoSkrocenia[pozycja]) && ...

Nigdzie nie inicjalizujesz tej zmiennej?

BTW:

string konwersjaIntNaString (int liczba)
{
    ostringstream ss;
    ss << liczba;
    string str = ss.str();
 
    return str;
}

dokładnie to robi std::to_string.

komentarz 9 sierpnia 2019 przez DragonCoder Nałogowiec (36,500 p.)

https://forum.pasja-informatyki.pl/443571/dlaczego-nie-dziala-zamiana-i-skracanie-liter

https://forum.pasja-informatyki.pl/443264/skracanie-wyrazu-od-wybranego-znaku

oba pytania o ten sam kod w innym postaciah, kazdy z nich zawiera ta sama funkcje konwertujaca, ale w zadnych z nich nie zostala ona wykorzystana. Wiec nie dokladnie rozumiem po co ona jest w tym kodzie. 

komentarz 9 sierpnia 2019 przez adrian17 Ekspert (344,860 p.)
(konwersjaIntNaString jest wykorzystane w tym kodzie)
komentarz 9 sierpnia 2019 przez niezalogowany
edycja 9 sierpnia 2019

 @magda_19,

Może pisz programy po jednej funkcji, i jak działa to przerzucasz do głównego programu.

A jak nie działa to cout<< po każdej zmiennej lub kontrolne linie kodu np


.... // jakiś kod 
cout<< "sprawdzenie 1 *****************************************************" <<endl;
.... // jakiś kod 
cout<< "sprawdzenie 2 *****************************************************" <<endl;
.... // jakiś kod 
cout<< "sprawdzenie 3 *****************************************************" <<endl;
// i wiesz w którym miejscu się wywala

albo w nagłówku
 #define spr(x) std::cout<<"spwadzenie"<<#x<<"***************************************"<<std::endl;

i w kodzie 

.... // jakiś kod 
spr(1)
.... // jakiś kod 
spr(2)
.... // jakiś kod 
spr(3) // nawet średnika nie musisz wstawiać bo już tam jest

a jeszcze lepiej debuger.

komentarz 9 sierpnia 2019 przez tkz Nałogowiec (42,000 p.)
To o czym piszesz, nazwa się testami jednostkowymi.
komentarz 9 sierpnia 2019 przez niezalogowany
ok, Dzięki nawet nie wiedziałem. Bez klas jak się uczyłem to zawsze zdawało egzamin. Ale teraz staram się tak nie robić, bo jak się zagnieździ klasa w klasie to nie wiadomo co wyciąć, by sprawdzić staram się słuchać kompilatora i uważnie przejrzeć kod. I czasami naprawdę się udaje wyłapać, nawet gdy kompilator waruje.
komentarz 9 sierpnia 2019 przez tkz Nałogowiec (42,000 p.)
Poczytaj o SOLID.

Podobne pytania

–1 głos
1 odpowiedź 433 wizyt
+1 głos
2 odpowiedzi 206 wizyt
pytanie zadane 20 czerwca 2017 w C i C++ przez maksbu23 Użytkownik (730 p.)
+1 głos
2 odpowiedzi 207 wizyt

92,551 zapytań

141,393 odpowiedzi

319,523 komentarzy

61,936 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...