Skip to content

[C++]Liczba PI – ulepszamy kod

Posted in Nauka, and Programowanie

Cześć, jak niedawno wspomniałem ten kod w zasadzie nie jest zły, bo spełnia warunki, których oczekuje od nas zadania, wszakże jednak mamy dosyć słaby kod, ponieważ działa on ściśle tylko z treścią zadania. Zróbmy dzisiaj wspólnie razem lepszy kod; kod, który zapewni nam trochę uniwersalność programu, dzięki czemu w przypadku mniejszej ilości punktów zmniejszymy zużycie pamięci, a w przypadku większej nie zgubimy ani jednego punktu. Dla niewtajemniczonych odsyłam do wpisu tutaj.

Zanim jeszcze podejmiemy się pisania zróbmy kilka założeń, w których kod będzie nadal działać:

  • w pliku źródłowym dla punkty.txt zachowane są stare reguły wpisywania punktów
  • nikt nie będzie fundować nam, no powiedzmy z po za kwadratu ( chodzi mi głównie o to, by nikt nie wymuszał na nas generowanie zmiennych dłuższych niż int w przypadku współrzędnych

Także teraz zabieramy się do zmian w kodzie.

Analizując pobieżnie kod już widzimy, że w zasadzie w jednej funkcji zaczynamy pracować na pliku, a dopiero w głównej po wszystkim kończymy z nimi pracę. Da się to uprościć. Fakt, przy tak małym programie nie odczujemy różnicy jednakże dobre nawyki należy kultywować już od samego początku. Oszczędzając zmienne mamy więcej możliwości do tworzenia kolejnych, a także mniejsze ryzyko pogubienia się z nimi. Dlatego zaczniemy od funkcji void import().

Tutaj zaraz po przepisaniu wszystkich tych punktów do tablic możemy w zasadzie podziękować za współpracę plikowi źródłowemu punkty.txt. Więc zwolnijmy go poprzez usunięcie i wpisanie linijki plik.close() do naszej powyższej funkcji. Dodatkowo musimy nanieść poprawki związane z dynamicznym tworzeniem tablicy. Musimy utworzyć jedną dodatkową funkcję, która nam wyliczy rozmiar tablicy.
Właśnie  w tym momencie zwolniliśmy zmienną fstream plik tuż przed tworzeniem pliku odpowiedz.txt, co daje nam możliwość posłużenia się tą samą zmienną w przypadku tworzenia pliku z odpowiedziami w funkcji void okrag_czy_kolo()
Daruję sobie przepisywanie całej funkcji, aby nie zaśmiecać wpisu za specjalnie po prostu musimy podmienić zmienną w odpowiednich linijkach kodu.

odp.open(„odpowiedz.txt”, ios::appp ) zmieniamy na plik.open („odpowiedz.txt”, ios::appp),
a odp.close() na plik.close()

dodatkowym manewrem dobrym będzie przepisanie funkcji zamykającej nasz plik z int main() do funkcji  void okrag_czy_kolo ()

Pozbyliśmy się właśnie jednej zmiennej fstream. Wiem, że w tym momencie nie czuć za bardzo tej wygody ale przy większych projektach, kiedy będziesz mieć okazję pracować lub po prostu uczestniczyć czynnie w ich tworzeniu zobaczysz jak ważnym elementem jest regulacja i kontrolowanie zasobów zużywanych przez maszynę.

Skoro już o tych zasobach pamięci mowa pora popracować nad naszymi tablicami, które niezależnie od wszystkiego przechowują 10000 slotów na współrzędne. Pewnie już zauważyłeś jak łatwo ograć nasz system importu danych ale o tym za chwilę. Teraz musimy pomyśleć nad tym jak sprawnie usunąć i dostosować wielkość tablic do stawianego przed nimi zadania, o którym już uprzednio rozmawialiśmy.

Teoretycznie można założyć, że możemy zadeklarować zmienną, która będzie widniała jako liczba, która określi wielkość tablicy, czyli coś takiego:

Jednak niestety jest to bardzo niewłaściwe i niezgodne ze standardami C++. Dlatego będziemy się posługiwać operatorami new i delete, aby od razu pozbyć się tablicy, która nas może uwierać.Oto prosty kod na utworzenie tablicy o nieznanym rozmiarze przed kompilacją.

Problem tworzenia dynamicznych tablic w zasadzie jest już rozwiązany. Jednak skąd pobrać wartość naszej tutaj napisanej [ n ]? W zasadzie to, że musimy policzyć wiersze jest po prostu oczywiste. Niestety w bibliotece fstream nie znajdziemy funkcji, która dokładanie da nam rozwiązanie. Musimy sami ją napisać.

Najwygodniej będzie zbudować liczydło, tak jak to zwykle budujemy:

pętla + warunek + zmienna do sumowania = liczydło

W tym wypadku musimy wykazać się sprytem. Z czasem zauważysz, że C++ ma w swoich bibliotekach dużo bazowych funkcji, które to będą naszą bazą wypadową po coś lepszego.
Naszym sposobem na policzenie ile wierszy ma nasz plik jest następujący

  • dopóki nie jest to koniec pliku to nabij nam licznik o 1 więcej
  • pobierz tą linię i przejdź do następnej

Już po treści widzimy, że nie będzie to nic skomplikowanego. Kwestia teraz zapisania tego w odpowiedniej konstrukcji. Tutaj będę potrzebne nam dwie biblioteki – fstream oraz string. Fstream wykorzystujemy rzecz jasna do pracy na pliku, natomiast przyda nam się string, ponieważ zmienne typu string są znacznie wygodniejsze do przechowywania całych wierszy ( przynajmniej w tym wypadku ). Kiedy już się wkręcisz w pisanie własnych algorytmów zauważysz, że wygodniejsza jest praca ze stringami, niż z długimi i nieporęcznymi tablicami typu char.

Kod funkcji sprawdzającej ile wierszy ma nasz plik przedstawia się następująco:

Dobrze. Teraz kiedy mamy już elastyczną tablicę i rozwiązany problem importu danych wypada to wszystko połączyć ze sobą. Tutaj w zasadzie są aż trzy możliwe drogi – stara droga z C, czyli przekazywanie przez wartość, poprzez wskaźniki i referencję.

Cały kod opracowany na wskaźnikach wraz z wyjaśnieniem w komentarzach:

Oczywiście w razie pytań, uwag, czy wątpliwości serdecznie zapraszam do komentowania. Kod źródłowy wrzucam tutaj.

Be First to Comment

Dodaj komentarz

%d bloggers like this: