31 / 47
Aug 2018

Będę na przyszłość pamiętał o tym faktycznie małym ale istotnym drobiazgu :wink:

4 months later

To ja może również odświeżę temat, aby nie tworzyć nowego.

Mój program niby pokazuje dobry wynik, ale SPOJ go nie uznaje (błędny wynik). Analizuję go ciągle i nie umiem znaleźć nigdzie błędu i zaczęło mnie to już frustrować :confused:

Napisałby mi może ktoś jakąś wskazówkę, co może być w moim programie nie tak? Byłbym bardzo wdzięczny :slight_smile:

Mój kod54

Tam jest wymagana nieskonczona petla na input. U Ciebie program sie konczy po wprowadzeniu jednej pary liczb.

23 days later

Witam, po przeczytaniu powyższych wskazówek i porad, nadal nie przyjmuje mojego kodu:
REMOVED (wypisuje wynik zaraz po wklepaniu 2 liczb)
REMOVED (nowy link. Wypisuje wyniki gdy skończy wczytywać wszystkie dane)

Kod trochę chaotyczny, ale drukuje odpowiednie liczby. Powinienem uwzględnić złośliwe zestawy testowe (sprawdzałem skrajne wartości czyli M + M oraz I + I)? :stuck_out_tongue: Może coś przeoczyłem?

No tak nie przemyślałem jednego warunku :smiley: Wielkie dzięki! Teraz zaakceptowało.

1 year later

Witam, żeby nie zaśmiecać forum piszę tutaj. Mam problem z owym zadaniem:
Link: https://pl.spoj.com/problems/JSUMRZYM/9
Język C++, kod: Tu był kod. Kod zdaje się podawać poprawne wyniki, ale na “zdawaniu się” niestety się kończy. Spoj wyrzuca mi WA i nie mam pomysłu w którym miejscu popełniam błąd, byłbym wdzięczny jeśli ktoś z większym doświadczeniem naprowadzi mnie gdzie go szukać, dodatkowo z racji małego stażu w programowaniu chętnie przyjmę trochę krytyki odnośnie jakości kodu lub możliwości jego usprawnień. Z góry dzięki za pomoc;)

A czy program nie powinien obliczac nieokreslona liczbe dodawan? (ja tego zadania nie robilem jeszcze - ale tresc zadania troszke jest niejednoznacznia, test umieszczony pod zadaniem na to wskazuje)

Tak jak pisałem to nie moja sprawa, ale mimo wszystko zwracam honor @hipcia. Dzięki za chęci i za pomoc.

6 months later

Witam

Przed chwilą dostałem AC dla tego zadania. Od samego początku miałem prawidłowo działający algorytm, ale dopiero za 4 podejściem sędzia mi go zaliczył. Czy naprawdę musimy marnować godziny na detale typu spacje czy ilość wczytywanych danych ? Autor zadania pisze że "na wejściu w pojedynczych wierszach wczytywane są dane. Zatem pomyślałem sobie że dane należy wczytać tylko raz:
cin>>str1>>str2;
dopiero potem domyśliłem się że chodzi o wczytanie nieokreślonej ilości danych i zmieniłem to na:
while(cin>>str1>>str2).

Czy naprawdę administratorzy/moderatorzy serwisu nie mogą wyedytowac treści zadania tak aby jasno mówiła o co chodzi. Sorry ale musiałem… ciśnienie ze mnie zeszło.

Hmm, wydaje mi się, że jest to jeden z elementów gry - zrozumieć intencje autora. SPOJ to nie jest zbiór zadań z matematyki. Myślę, że jeśli tylko autor nie wprowadza w błąd to wszystko jest ok. Z treści zadania nie wynika czy test będzie jeden czy więcej, ale przykład pod zadaniem to ujednoznacznia. W tym zadaniu jest wszystko jasne, są chyba zadania, gdzie się trzeba więcej nagłówkować by zrozumieć intencje autora. Poza tym trzeba pamiętać o nadrzędnej zasadzie, którą zrozumiałem wiele lat temu (być może ktoś wymyślił to wcześniej - nie będę się spierał o pierwszeństwo… :slight_smile: ). INFORMATYKA JEST NAUKĄ DOŚWIADCZALNĄ.
Doświadczenie pokazuje czy dobrze coś zrozumiałem i wykonałem :wink:

17 days later

Cześć mam problem z zamianą liczb Arabskich na rzymskie używam mapy, a w pętli while dzielenia modulo ale na przykład dla liczby 19 wyrzuca mi “XX” nie wiem gdzie popełniam błąd za naprowadzenie dziękuje

Bardzo ciekawy błąd.
Tworząc mapę int-string używasz apostrofów zamiast cudzysłowów.
liczbaArabskaRzymska[1] = ‘I’;
zamiast
liczbaArabskaRzymska[1] = “I”;

Dla pojedynczych znaków może i to spoko, to dla podwójnych znaków
liczbaArabskaRzymska[900] = ‘CM’;
to już jest bez sensu. Nie ma znaku ascii ‘CM’. Możemy tylko zgadywać, co trafiło do mapy.

Włącz sobie warningi podczas kompilacji (albo zwracaj na nie uwagę). Na ideone od razu pokazało, że coś jest nie tak.

Dziękuje Ci bardzo za pomoc i wskazówkę , będę bardziej zwracał uwagę na warningi

11 days later

Poprawiłem apostrofy ,mam zapętlone na nieokreśloną liczbę testów , testowałem wyniki ale nadal pokazuje błędna odpowiedź , nie umiem zlokalizować problemu tego kodu

Inicjalizuj zmienne. Kropka.

Jakieś takie uwagi dla polepszenia kodu w trosce o mój komfort i zdrowie psychiczne innych użytkowników forum:

  • Formatuj czytelnie kod3
  • Włącz i czytaj ostrzeżenia kompilatora (rozwiązują większość problemów początkujących, a nawet zaawansowanych programistów)
  • <string.h> to zdeprecjonowany nagłówek dla funkcji typu strcpy, strlen z języka C (<cstring> dla C++). Natomiast chyba chciałeś dołączyć po prostu <string> dla klasy std::string.
  • Popracuj nad nazewnictwem zmiennych. Jak widzę “LiteraRzymska” to nie wiem z czym mam do czynienia.
  • Wypełnianie mapy w funkcji przy każdym jej użyciu jest strasznie czasochłonne. Wystarczy zrobić to raz :wink:
  • Nie musiałbyś dekrementować iteratorów gdybyś użył funkcji rbegin() / rend() (uwaga zwracają reverse_iterator!).

Super pomysł z linkiem formatera. Nigdy nie potrzebowałem dla siebie, ale aby chociaż spojrzeć na cudze kody to chyba stanie się mój niezbędnik. Wiem, że takich narzędzi jest bez liku [dobre IDE chyba mają wbudowane] ale naprawdę nie potrzebowałem i nie używałem. Aż nie mogłem się powstrzymać i nie wkleić przeformatowanego [styl LLVM] kodu:

#include <string.h>
#include <map>
#include <iostream>
using namespace std;

int ZamianaRzymskieNaArabskie(string LiteraRzymska) {
  map<char, int> wartosci;

  int DlogoscLiczby, wynik, WartoscPojedynczejCyfry, OstatniaWartosc;

  wartosci['I'] = 1;
  wartosci['V'] = 5;
  wartosci['X'] = 10;
  wartosci['L'] = 50;
  wartosci['C'] = 100;
  wartosci['D'] = 500;
  wartosci['M'] = 1000;

  DlogoscLiczby = LiteraRzymska.length();

  for (DlogoscLiczby; DlogoscLiczby >= 0; DlogoscLiczby--) {
    WartoscPojedynczejCyfry = wartosci[LiteraRzymska[DlogoscLiczby]];

    if (WartoscPojedynczejCyfry >= OstatniaWartosc) {
      OstatniaWartosc = WartoscPojedynczejCyfry;
      wynik += WartoscPojedynczejCyfry;
    } else
      wynik -= WartoscPojedynczejCyfry;
  }
  return wynik;
}

string ZamianaArabskaNaRzymska(int arabskaWejsciowa)

{
  map<int, string> liczbaArabskaRzymska;

  string liczbaRzymska = "";

  liczbaArabskaRzymska[1] = "I";
  liczbaArabskaRzymska[4] = "IV";
  liczbaArabskaRzymska[5] = "V";
  liczbaArabskaRzymska[9] = "IX";
  liczbaArabskaRzymska[10] = "X";
  liczbaArabskaRzymska[40] = "XL";
  liczbaArabskaRzymska[50] = "L";
  liczbaArabskaRzymska[90] = "XC";
  liczbaArabskaRzymska[100] = "C";
  liczbaArabskaRzymska[400] = "CD";
  liczbaArabskaRzymska[500] = "D";
  liczbaArabskaRzymska[900] = "CM";
  liczbaArabskaRzymska[1000] = "M";

  map<int, string>::iterator koniec = --liczbaArabskaRzymska.end();
  map<int, string>::iterator poczatek = --liczbaArabskaRzymska.begin();

  for (koniec; koniec != poczatek; koniec--) {
    while (arabskaWejsciowa % koniec->first < arabskaWejsciowa) {
      liczbaRzymska += koniec->second;
      arabskaWejsciowa -= koniec->first;
    }
  }

  return liczbaRzymska;
}

int main() {
  string LiteraRzymska;
  string LiteraRzymska2;

  while (cin >> LiteraRzymska >> LiteraRzymska2) {
    int suma = ZamianaRzymskieNaArabskie(LiteraRzymska) +
               ZamianaRzymskieNaArabskie(LiteraRzymska2);
    cout << ZamianaArabskaNaRzymska(suma);
    cout << endl;
  }
}

To nie załatwia fatalnie dobrany nazw zmiennych i funkcji oraz braku testów na ideone.

Warto też przeczytać podstawowe wskazówki: Jeśli zaczynasz, przeczytaj koniecznie! <--kliknij w to proszę!

2 years later

Kod w moim IDE dziala poprawnie, jednak jak testuje go na ideone to zawsze pomija pierwsza linijke. Nie mam pojecia dlaczego tak sie dzieje. Kod : tu byl kod

int wartosci(char s) {
	int result = 0;

Nie zainicjalizowałeś zmiennej result.