W pliku dane.txt znajduje sie 5 000 liczb calkowitych z przedzialu od 108 do 20000008, zapisanych w systemie ósemkowym, po jednej liczbie w wierszu. W wybranym przez siebie jezyku programowania napisz program, za pomocą którego uzyskasz odpowiedzi na ponizsze polecenia. Odpowiedzi zapisz w pliku wyniki6.txt, a odpowiedz do kazdego podpunktu poprzedz literą oznaczającą ten podpunkt.

a)Ile sposród liczb zapisanych w pliku dane.txt spelnia taki warunek, ze pierwsza cyfra tej liczby jest równa ostatniej cyfrze tej samej liczby?

b)Podaj, ile liczb w pliku dane.txt ,po ich zapisaniu w systemie dziesistnym, spelnia warunek podany w podpunkcie a), tzn. pierwsza cyfra liczby jest równa ostatniej cyfrze tej samej liczby. Przyklad: Liczba 2038 = 13110 spelnia podany warunek, natomiast 71238 = 366710 nie spelnia ządanego warunku.

c)Ile sposrod liczb zapisanych w pliku dane.txt spelnia warunek, ze rozpoczynając od najbardziej znaczącej cyfry w zapisie ósemkowym, kazda kolejna cyfra tej liczby nie jest mniejsza od cyfry poprzedzającej? Podaj najwiekszą i najmniejszą liczba z pliku dane.txt ,ktore spelniają ten warunek.

DAJE NAJ


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ć.

Zobacz obrazek 0AB
Zobacz obrazek 0AB
Zobacz obrazek 0AB
Zobacz obrazek 0AB
Zobacz obrazek 0AB

Go Studying: Inne Pytanie