Wątek przeniesiony 2019-08-11 22:07 z przez kq.

Jak rozwinąć wyraz

Odpowiedz Nowy wątek
2019-08-11 22:04
0

Mam do napisania program, który z wyrazu A4BD powinien wydrukować AAAABD. Mam już warunek, ale nie wiem co wpisać w pętli while. A poza tym nic się nie wypisuje. Ktoś coś?

#include <iostream>
#include <string>
#include <cctype>

using namespace std;

int main()
{
    string wyraz = "A4BD";
    int dlugoscWyrazu = wyraz.length();
    int liczba;
    char znak;

    for(int i = 0; i < dlugoscWyrazu; i++)
    {

        if(wyraz[i] == isdigit(wyraz[i]))
        {
            while(true)
            {
                cout << wyraz;
            }

        }
        else
        {
            //cout << wyraz[i];
        }
    }

    return 0;
}

Pozostało 580 znaków

2019-08-12 00:40
0

Coś takiego na szybkości:

#include <iostream>

void append_string_n_times(std::string &str, const int n)
{
    char appended_char = str.back();

    for (int i = 0; i < n - 1; i++)
        str += appended_char;
}

void decompress_string(const std::string src, std::string &out)
{
    for (int i = 0; i < src.length(); i++)
        if (isalpha(src[i]))
            out += src[i];
        else
            append_string_n_times(out, (int) src[i] - 48);
}

int main()
{
    std::string input = "A4B9D1";
    std::string output = "";

    decompress_string(input, output);

    std::cout << output;

    return 0;
}

Ale żeby to sensowniej funkcjonowało wypadałoby obsłużyć stringi typu A158BD, whitespacy i zastanowić się jaki chce się mieć output np. w takiej sytuacji: 5A0D 4C i odpowiednio rozwinąć program.

To co napisałeś nie obsługuje liczb większych od 9 ;) - Shalom 2019-08-12 00:57

Pozostało 580 znaków

2019-08-12 00:46
kq
2

Trochę przekombinowujecie imo. Wystarczy użyć std::stoi (albo nawet atoi) jeśli pierwszym znakiem jest cyfra.

Niestety, obsługa RE w C++ nie jest trywialna, szczególnie dla początkujących, którzy z samymi regexami mogą mieć problemy.


Pozostało 580 znaków

2019-08-12 00:56
0

Sam jestem początkujący. Moim zdaniem skoro ma wyjść z tego AAAABD to takie jest rozwiązanie i po co dalej kombinować i wymyślać czy to mają być kilku cyfrowe liczby czy tylko jednocyfrowe ;p Ja bym oddał taki kod jako rozwiązanie ale pewnie koledzy mają racje że lepiej chyba byłoby zrobić wersje dla kilku cyfrowych liczb.

#include <iostream>
#include <string>
#include <cctype>

using namespace std;

int main()
{
    string wyraz = "A4BD3";
    int dlugoscWyrazu = wyraz.length();
    int liczba;
    char znak;

    for (int i=0; i<wyraz.length(); i++) {
        znak = wyraz[i - 1];
        if (isdigit(wyraz[i])) {
            liczba = (int) wyraz[i] - 48; // https://stackoverflow.com/questions/5029840/convert-char-to-int-in-c-and-c
            for (int i=1; i<liczba; i++) {
                cout << znak;
            }
        } else {
            cout << wyraz[i];
        }
    }

    return 0;
}

g++ main.cpp -o out.exe

Pokaż pozostałe 2 komentarze
Dlaczego wyraz [i] konwertujesz na int? Czy to już nie jest int'em? - Magda Pietrzykowska 2019-08-14 00:45
Jest charem, ale w C to akurat bez różnicy specjalnie. - Shalom 2019-08-14 01:37
Jeśli pytasz o linijke 17 to żeby przypisać do zmiennej liczba która jest poza pętlami, żeby w pętli od linii 18 zwracało dobrą wartość. Gdyby użyć for (int i=1; i<wyraz[i]; i++) zamiast for (int i=1; i<liczba; i++) wtedy zwróci złe wyniki. A że opierałem się na kodzie który wstawiłaś, to żeby przypisać do int liczba konwertowałem to do (int) w linii 17. Ale tak jak pisałem, dopiero uczę się C i C++ w sumie. Kolega hodor dał fajny program który można przeanalizować i podnieść skill w C Oceny i recenzje->Prośba o review projektu C z 1 roku: bot do myszki i klaw.. - goose_ 2019-08-14 05:27
Ale tak jak napisał Shalom, bo wyraz[i] to char a liczba to int głównie dlatego konwertowałem. - goose_ 2019-08-14 06:19
Oki, teraz rozumiem. Nie zauważyłam, że wyraz[i] jest char'em - Magda Pietrzykowska 2019-08-14 08:24

Pozostało 580 znaków

2019-08-12 01:04
0

Tak, pisałem o tym w swoim poście, @Shalom. Tutaj wersja z liczbami większymi od 9:

#include <iostream>

void append_string_n_times(std::string &str, const int n)
{
    char appended_char = str.back();

    for (int i = 0; i < n - 1; i++)
        str += appended_char;
}

void decompress_string(const std::string src, std::string &out)
{
    for (int i = 0; i < src.length(); i++) {
        if (isalpha(src[i]))
            out += src[i];
        else {
            int n = (int) src[i] - 48;
            while (isdigit(src[i + 1])) {
                n *= 10;
                n += (int) src[i + 1] - 48;
                i++;
            }
            append_string_n_times(out, n);
        }
    }
}

int main()
{
    std::string input = "A10BDBDBDBDBD2257";
    std::string output = "";

    decompress_string(input, output);

    std::cout << output;

    return 0;
}

Patrzyłem wstępnie i działa, choć nie zdziwię się jeśli jednak coś nie działa. :D

Przydałyby się komentarze, jeśli @Magda Pietrzykowska miałaby się czegoś nauczyć... - Silv 2019-08-12 01:06
A, a może i niepotrzebne... - Silv 2019-08-12 01:15
Nie wiem czy sarkazm czy nie. :P - Hodor 2019-08-12 01:17
@Hodor: staram się nigdy nie używać sarkazmu. - Silv 2019-08-12 01:17
Pomyślałem, że jak byłem... eee... gdy czuję się jak początkujący w czymś, to nie lubię, gdy ktoś pokazuje mi sam kod bez komentarzy. Ale z drugiej strony – wyjaśnianie wszystkiego przydaje się tylko w momentach, gdy całkiem nie wiem, gdzie jestem. A na ogół lepiej, tak sądzę, by ktoś musiał pogłówkować. Więcej zapamięta. - Silv 2019-08-12 01:19

Pozostało 580 znaków

2019-08-12 01:16
1

topcoder material 4sure

#include <iostream>
#include <string>

using namespace std;

int main()
{
    string wyraz = "ABCQ11ABC";
    string ilosc_powtorzen = "";
    string znak_do_powtorzenia = "";

    for(int i = 0; i < wyraz.length(); i++)
    {
        if(isdigit(wyraz[i]))
        {
            ilosc_powtorzen += wyraz[i];

            if (i == wyraz.length()-1 || !isdigit(wyraz[i+1]))
            {
                int ilosc = std::stoi(ilosc_powtorzen)-1;
                cout << std::string(ilosc, znak_do_powtorzenia[0] /* let's do not talk about this one */);
            }
        }
        else
        {
            znak_do_powtorzenia = wyraz[i];
            ilosc_powtorzen = "";
            cout << wyraz[i];
        }
    }

    return 0;
}
edytowany 2x, ostatnio: WeiXiao, 2019-08-12 01:17

Pozostało 580 znaków

2019-08-12 01:32
0

Chyba sprawa jest wyjaśniona, dzięki wszystkim za podpowiedzi

Pokaż pozostałe 8 komentarzy
std::string przyjmuje w tym przypadku 2 parametry: 1 mówi ile razy ma powtórzyć dany znak, a drugi parametr to właśnie ten znak. - WeiXiao 2019-08-12 01:53
A, w tym sensie. Dobrze. (Nie rozumiem, ale nie będę się wgryzać). - Silv 2019-08-12 01:53
@Silv: no typ danych to string, a ja tylko używam go jako string[0] (czyli char) i ten string = wyraz[i] (czyli char), czyli tylko manipuluje 1 znakiem (czyli char) - WeiXiao 2019-08-12 01:56
A co z linijką 18. Czemu długość -1? - Magda Pietrzykowska 2019-08-12 03:11
@Magda Pietrzykowska: algorytm jest taki. jeżeli literka, to zapisz ja w pamieci, wyzeruj ile razy ma ja powtorzyc i wyswietl raz na ekranie. jezeli liczba, to dodaj ja do ilosci powtorzen, a nastepnie. jezeli cyfra to byla ostatnia rzecz w stringu (całym), lub gdy nastepny znaczek nie jest cyfra (czyli liczba sie skonczyla i zaczyna nowa literka), to wyswietl - WeiXiao 2019-08-12 18:11

Pozostało 580 znaków

2019-08-12 02:53
0

Jeśli chodzi o sam algorytm, być może logiczniej byłoby to zrobić na stosie na odwróconym stosie. Mówię jakby co.


edytowany 1x, ostatnio: Silv, 2019-08-12 02:55

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 0, botów: 1

Robot: CCBot