👤

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