Odpowiedź :
Odpowiedź
Program w załącznikach 1-3.
Po uważniejszej lekturze treści zadania uznałam, że zapewne w pliku dane.txt liczby będą bez zera na początku. ( Czyli inaczej niż napisałam w komentarzu pod zadaniem! )
Nie generowałam pliku z 5000 liczbami... Moje dane testowe znajdziesz w czwartym załączniku. Natomiast wynik działania programu na tych danych w piątym.
Dla ułatwienia analizy kodu programu poniżej podaję liczby, które były odpowiedzią do każdego z podpunktów.
- a)
171
1111
222222
7617
5705
4004
3113
636
- b)
8₁₀ = 10₈
121₁₀ = 171₈
131₁₀ = 203₈
585₁₀ = 1111₈
3983₁₀ = 7617₈
3013₁₀ = 5705₈
2052₁₀ = 4004₈
1611₁₀ = 3113₈
414₁₀ = 636₈
- c)
1111
1234567
222222
23456
12345
Wprawdzie napisałam najprościej jak tylko można, ale może będą potrzebne objaśnienia więc pozostawiłam numery wierszy kodu źródłowego.
Wiersze 26-27.
Pierwszy znak taki sam jak ostatni.
Wiersze 30-33.
Zmienną liczba_10 (liczba w systemie dziesiątkowym) używam więcej niż jeden raz.
Wiersze 43-44.
Jeżeli jest mniejsza to warunek nie jest spełniony.
Wiersze 39-45.
Bardziej elegancka (bardziej poprawna i bardziej efektywna obliczeniowo) byłaby pętla while, jednak obawiałam się, że nie byłoby oczywiste co się dzieje. Natomiast możesz dodać break, czyli przestać sprawdzać gdy już wiadomo, że warunek nie zachodzi: możesz zastąpić wiersz 44 wierszami
{
warunek = false;
break;
}
Nie napisałam funkcji wyliczającej wartość liczby z systemu ósemkowego w systemie dziesiątkowym, ponieważ
- wcale o nic takiego nie proszono;
- nie było takiej potrzeby, gdyż C++ już przychodzi z funkcją stoi() przekształcającą ciąg znaków (w dowolnym systemie od podstawy 2, do podstawy 35) na system dziesiętny.
Poprzednim razem – muszę przyznać, że bardzo nieelegancko... – posłużyłam się wartościami kodów znaków. Jednak nie jest to właściwe podejście ponieważ kody znaków zupełnie nie powinny wchodzi w rachubę.
Nie napisałam poprawnie po polsku, bo powinno być
- 1 liczba
- 2 liczby
- 5 liczb
a nie jest...
Nie ma sprawdzania błędów
- czy plik dane.txt istnieje i można go odczytać
- czy zawiera tylko liczby w systemie po podstawie 8;
- czy liczby są z deklarowanego zakresu 10₈ − 2000000₈
- czy jest 5000 liczb...
Za to program zadziała w przypadku zadania dla podstawy systemu od 2 do 35 ! :)
Wyjaśnienie
Używając bieżących wersji g++ ( GCC ), clang oraz Visual Studio program zadziała bez żadnych zmian. W przypadku GCC oraz clang można usunąć pierwszą linię ( #define ) ponieważ jest ona w przypadku GCC oraz clang zbędna. Bieżąca wersja GCC oznacza GCC 10.1 wydany 7 maja 2020 r. lub nowszy. Najnowszą wersją jest GCC 11.2 z 28 lipca 2021 r. Niestety Microsoft Visual C++ 2010 jest tak stary, że nie jest już dostępny więc nie mogłam na nim przetestować.
Program zadziała bez żadnych zmian dla następujących wersji języka (dla następujących standardów) C++11, C++14 oraz C++17. W przypadku użycia wersji C++20 należy wszędzie w funkcji fprintf() usunąć u8. Dodatkowo gdyby używać wersji C++20 i używać kompilatora MSVC (Visual Studio) wtedy należy we wszystkich wywołaniach fprintf() zamienić polskie znaki na odpowiadające im litery ASCII, inaczej w pliku wynikowym będą w miejscach polskich liter znaki zapytania.
Używając starszych wersji g++ ( GCC ) – uwaga np. Code::Blocks na razie używa starszych wersji GCC ! – należy zamienić w nazwach zmiennych
- największa
- długość
polskie znaki na odpowiadające im litery ASCII, inaczej nie będzie można programu skompilować.




