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-11 23:22
0
Burmistrz napisał(a):
Magda Pietrzykowska napisał(a):

A jaki byłby problem jeśli w wyrazie pojawiłyby się liczby?

Liczby jednocyfrowe to też liczby, ale domyślam się, że w tym pytaniu chodziło Ci o te wielocyfrowe. Pewnie problem byłby taki, że w Twojej wersji programu każda cyfra w wejściowym stringu będzie oznaczała, ile razy poprzedzający ją znak (niekoniecznie litera) pojawi się w wyjściowym stringu. Więc każda cyfra, która nie jest na pierwszej pozycji w liczbie, będzie oznaczała, ile razy poprzedzająca ją cyfra pojawi się w wyjściowym stringu.

Przykład:

Input: A23BC
Output: AA222BC

O tym nie pomyślałam. Wiesz może jak to ogarnąć?

Pozostało 580 znaków

2019-08-11 23:24
0
Magda Pietrzykowska napisał(a):

O tym nie pomyślałam. Wiesz może jak to ogarnąć?

Moim zdaniem to powinno wynikać z treści zadania. Czy treść mówi o liczbach, cyfrach, jakoś to precyzuje?


Pozostało 580 znaków

2019-08-11 23:27
0
Silv napisał(a):
Magda Pietrzykowska napisał(a):

O tym nie pomyślałam. Wiesz może jak to ogarnąć?

Moim zdaniem to powinno wynikać z treści zadania. Czy treść mówi o liczbach, cyfrach, jakoś to precyzuje?

Tylko jest napisane, aby wziąć to pod uwagę...

Nie cytuj całego ostatniego postu, wtedy zmniejsza się czytelność. - Silv 2019-08-11 23:29

Pozostało 580 znaków

2019-08-11 23:38
1

Pytanie brzmi czy musisz to pisać w ten sposób, czy np. możesz użyc http://www.cplusplus.com/reference/regex/ bo, wbrew temu co sie wydaje niektórym początkującym, biblioteki i mechanizmy języka są po to, zeby ułatwić pracę.


Masz problem? Pisz na forum, nie do mnie. Nie masz problemów? Kup komputer...
czyli lepiej aby opanowała regexy zamiast nauczyć się rozwiązywać takie jedne z pierwszych zadań algorytmicznych? bullshit lol - WeiXiao 2019-08-12 00:07

Pozostało 580 znaków

2019-08-11 23:42
0
Shalom napisał(a):

Pytanie brzmi czy musisz to pisać w ten sposób, czy np. możesz użyc http://www.cplusplus.com/reference/regex/ bo, wbrew temu co sie wydaje niektórym początkującym, biblioteki i mechanizmy języka są po to, zeby ułatwić pracę.

Chcę to napisać jak najłatwiejszym sposobem, abym mogła zrozumieć, a zaznaczę, że jestem początkująca

Mam coś takiego, jednak nie wiem dlaczego nie wypisuje tyle znaków ile powinien

#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 < dlugoscWyrazu; i++)
    {

        if((isdigit(wyraz[i])))
        {
            while(wyraz[i]--)
            {

            }
            cout << wyraz[i-1];

        }

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

    return 0;
}
edytowany 1x, ostatnio: Shalom, 2019-08-12 00:03
To, moim zdaniem, lepiej bez wyrażeń regularnych (czyli wspomnianej biblioteki regex). - Silv 2019-08-11 23:46
U nas na forum używaj nie [cpp], tylko ```cpp (w linijce przed kodem) oraz ``` (w linijce za kodem) - Silv 2019-08-11 23:54
Dzięki, @Shalom, za przeniesienie komentarza. :) - Silv 2019-08-12 00:06

Pozostało 580 znaków

2019-08-12 00:06
1

Chcę to napisać jak najłatwiejszym sposobem, abym mogła zrozumieć, a zaznaczę, że jestem początkująca

Tylko że właśnie najłatwiejszy sposób wymaga douczenia się takich rzeczy jak choćby te wspomniane regexy. Bo teraz to jest trochę tak jakbyś miała policzyć ile to będzie jak milion razy dodasz do siebie liczbę 2. My sugerujemy żeby przeczytała jak się mnoży, a ty próbujesz zrobić to najłatwiejszym sposobem, którym wg ciebie jest dodawanie po kolei...

Wbrew pozorom to co chcesz zrobić, korzystając tylko z podstawowych elementów składni, jest skomplikowane. Dużo bardziej niż ten kod który wstawiłaś, bo on zwyczajnie nie działa poprawnie.


Masz problem? Pisz na forum, nie do mnie. Nie masz problemów? Kup komputer...

Pozostało 580 znaków

2019-08-12 00:13
0
Shalom napisał(a):

Chcę to napisać jak najłatwiejszym sposobem, abym mogła zrozumieć, a zaznaczę, że jestem początkująca

Tylko że właśnie najłatwiejszy sposób wymaga douczenia się takich rzeczy jak choćby te wspomniane regexy. Bo teraz to jest trochę tak jakbyś miała policzyć ile to będzie jak milion razy dodasz do siebie liczbę 2. My sugerujemy żeby przeczytała jak się mnoży, a ty próbujesz zrobić to najłatwiejszym sposobem, którym wg ciebie jest dodawanie po kolei...

Wbrew pozorom to co chcesz zrobić, korzystając tylko z podstawowych elementów składni, jest skomplikowane. Dużo bardziej niż ten kod który wstawiłaś, bo on zwyczajnie nie działa poprawnie.

Skoro tak to wygląda, to idę się douczać

Pozostało 580 znaków

2019-08-12 00:16
0

Jeśli bardzo chcesz to robić ręcznie to musisz mieć drugą pętlę, która będzie skanować "całą liczbę" po napotkaniu cyfry. W ogóle nie dawałbym tu pętli for tylko while, bo będzie wygodniej, więc finalnie byłaby główna pętla while (zamiast twojego fora), a w środku while do pobrania całej liczby i kolejny while do wypisania zdekompresowanego ciagu znaków.


Masz problem? Pisz na forum, nie do mnie. Nie masz problemów? Kup komputer...

Pozostało 580 znaków

2019-08-12 00:24
0
Magda Pietrzykowska napisał(a):

nie wiem dlaczego nie wypisuje tyle znaków ile powinien

Tak wygląda mój pomysł:

Dla każdego znaku:
    Jeżeli jest cyfrą:
        Pomnóż zapamiętaną liczbę przez 10 i dodaj aktualną cyfrę
    Jeżeli nie jest cyfrą:
        Jeżeli zapamiętana liczba ma wartość większą od 0:
            Wyświetl literę znajdującą się przed liczbą tyle razy, ile wynosi zapamiętana liczba minus 1
            Wyzeruj zapamiętaną liczbę
        Wyświetl aktualny znak    

Działa w C#, więc jeżeli zaimplementujesz to w C++, to też będzie działać. Nie musisz zapamiętywać litery znajdującej się przed liczbą, jeżeli będziesz pamiętała ilość cyfr w liczbie lub będziesz pamiętała liczbę jako string zamiast int. Dzięki temu uzyskasz indeks ostatnio odwiedzonej litery odejmując ilość cyfr i 1 od aktualnego indeksu.

edytowany 6x, ostatnio: Burmistrz, 2019-08-12 00:31

Pozostało 580 znaków

2019-08-12 00:33
0
import re
import string

def is_digit(val):
    return val in string.digits

def decompress1(data):
    result = ""
    current_letter = data[0]
    multiplier = 0
    for index in range(len(data)):
        if is_digit(data[index]):
            multiplier *= 10
            multiplier += ord(data[index]) - ord('0')
        elif multiplier > 0:
            result += current_letter * multiplier
            multiplier = 0
            current_letter = data[index]
        elif current_letter != data[index]:
            result += current_letter
            current_letter = data[index]
    if multiplier > 0:
        result += current_letter * multiplier
    else:
        result += current_letter
    return result

def decompress2(data):
    matches = re.findall("(\\w\\d*)", data)
    result = ""
    for match in matches:
        if len(match) > 1:
            result += match[0] * int(match[1:])
        else:
            result += match[0]
    return result

def main():
    data = "A10B20C"
    print(decompress1(data))
    print(decompress2(data))

main()

Masz problem? Pisz na forum, nie do mnie. Nie masz problemów? Kup komputer...
edytowany 1x, ostatnio: Shalom, 2019-08-12 00:56
Dopisz jeszcze, co to za język. - Silv 2019-08-12 00:47
nie działa dec1 - WeiXiao 2019-08-12 00:51
Fixed, wiedziałem że będzie jeszcze jakis corner case :P - Shalom 2019-08-12 00:56
PS. No brakuje testów jednostkowych, nie ukrywam... - Silv 2019-08-12 00:59

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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