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

SPOJ FLAMASTER - Ratunku pomocy ! Problemy początkującego...

Object Storage Arubacloud
0 głosów
416 wizyt
pytanie zadane 8 września 2020 w SPOJ przez Heatrow Nowicjusz (160 p.)
edycja 8 września 2020 przez Heatrow

Hejka ! Dostałem za zadanie rozwiązanie kultowego już zadania " FLAMASTER". Jako, że dopiero co stawiam kroki w tym zwariowanym programistycznym świecie to zrobiłem je po swojemu na tyle na ile umiałem. Na nic mi szukania odpowiedzi na swój błąd w gotowcach innych bo zwyczajnie nie rozumiem większości z ich skomplikowanych kodów, także błagam o pomoc ! 

Zadanie polega na tym by w danym wyrazie jeśli ta sama litera pojawia się obok siebie co najmniej 3 razy to zapisać ją w skróconej formie tj. liczba ile razy ta litera się powtarza i później ta litera.Czyli np BSSSD to będzie B3SD. W pierwszej linijce pliku znajduje się liczba wyrazów. Przykładowe dane do tego zadania :

 

4
OPSS
ABCDEF
ABBCCCDDDDEEEEEFGGHIIJKKKL
AAAAAAAAAABBBBBBBBBBBBBBBB

A oto mój kod :) 
 

#include <iostream>
#include<fstream>

using namespace std;

int main()
{
    //moje nieudolne próby wczytania danych z pliku i wrzucenia ich do tabeli

    fstream plik;
    plik.open("dane.txt");

    string dane;
    plik>>dane;
    //nasza dana ilość wyrazów, która jest w 1 rzędzie
    int c;
    c=dane[0];


    for(int a=0;a<c;a++)
    {
        //pętla wczytująca każde słowo
        for( int i=0; dane[i]!='/n';i++)
        {
            //warunek sprawdzający czy kurczymy czy zostaje tak jak jest
            if(dane[i]==dane[i+1]==dane[i+2])
            {
                int licznik=0;
                //liczymy ile razy powtarza się dana litera
                for(;dane[i]==dane[i+1];i++)
                {
                    licznik++;
                }
                cout<<licznik<<dane[i];

            }
            //jeśli nie kurczymy to wyświetlamy po prostu literę
            else
            {
                cout<<dane[i];
            }


        }
        cout<<endl;
    }
    return 0;
}

 

komentarz 9 września 2020 przez gagyn Stary wyjadacz (11,050 p.)
Ze spoja nie wczytuj danych z pliku tylko z konsoli, bo tak je podaje sprawdzarka.

1 odpowiedź

+2 głosów
odpowiedź 9 września 2020 przez Bun1o Obywatel (1,620 p.)
edycja 9 września 2020 przez Bun1o

Bez urazy, ale masz w tym kodzie całkiem sporo luk i błędów

  • Po pierwsze masz podaną liczbę danych wejściowych, więc zamiast używania otwierania danych z pliku wystarczy zapis w pętli for, np.
int n;
cin >> n;
for (int i = 0; i < n; i++)
{
  // tutaj reszta zadania
}
  • Następnie wczytywanie słów. Łatwiej jest je wczytywać pojedynczo i pojedynczo podawać wyniki, niż tworzyć tablicę, a SPOJ uznaje taki sposób, ponieważ odróżnia wczytywanie danych od ich wypisywania. Tak więc tworzysz string i potem najnormalniej cin >> słowo
  • Nie mam pojęcia czy u Ciebie to działa: " dane[i]!='/n' ", ale możesz spróbować z funkcją z biblioteki string (dodajesz na górze pod iostream   #include <string>), a następnie jako warunek w for podajesz 'i' mniejsze niż długość tego ciągu danych, w efekcie wygląda to tak:
    for(int i = 0; i < słowo.size(); i++)
  • Warunek nie powinien wyglądać tak jak u Ciebie, zamiast trzech znaków '==' użyj '&&', czyli oraz. Mniej więcej tak, bo inaczej Ci się nie skompiluje:
    if ((m[i] == m [i + 1]) && ( m [i + 1] == m [i + 2]))
  • zamiast for przy sprawdzaniu powtarzania się danej litery użyj while z tym samym warunkiem (oprócz średnika na początku :D) i bez i++, które możesz zapisać po prostu w środku while
  • dane wyświetlasz na odwrót, powinno być najpierw dane [i], potem licznik
  • ustaw w liczniku początkową wartość 1, bo inaczej zaniża liczbę cyfr

Teraz powinno działać, jednak jeżeli byś miał jeszcze jakiś kłopot, albo coś by nie wychodziło to pisz śmiało. Przepraszam również za mój niefachowy język i nieużywanie trudnych zwrotów, ale również jestem początkujący i po prostu jakoś udało mi się zrobić to zadanie, więc przedstawiłem mój pomysł na jego wykonanie, co nie oznacza, że jest jedyny i właściwy.

Podobne pytania

0 głosów
1 odpowiedź 209 wizyt
pytanie zadane 21 września 2020 w SPOJ przez Billy Użytkownik (680 p.)
0 głosów
1 odpowiedź 556 wizyt
pytanie zadane 18 lutego 2020 w SPOJ przez MakaBresk Obywatel (1,060 p.)
0 głosów
0 odpowiedzi 210 wizyt
pytanie zadane 3 lutego 2021 w C i C++ przez Rainbow99 Początkujący (430 p.)

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!

...