Pierwszy program w portfolio

Odpowiedz Nowy wątek
2019-01-17 08:15
0

Witajcie
Po wielkich trudach, stworzyłem swój pierwszy poważniejszy program i dlatego tym chętniej wysłucham waszych opinii.
Pozdrawiam

edytowany 1x, ostatnio: Adept123, 2019-01-17 08:21

Pozostało 580 znaków

2019-01-21 22:46
1

Witam
Warunku w pętli while nie poprawiłem, ale za to dołożyłem kilka innych funkcji, zlikwidowałem jak i dodałem niektóre komentarze. Na pierwszym miejscu postawiłem na prawidłowe działanie procedur jak i funkcji. Wszystkie je przetestowałem i wszystkie działają prawidłowo. Błędów w testach żadnych nie zauważyłem. Moim zdaniem gdy wszystko działa to wtedy można pomyśleć nad rozbiciem "skomplikowanego kodu" występującego w niektórych miejscach programu.
Pozdrawiam

Ps. Jeśli ktoś wcześniej testował program to być może będzie musiał usunąć stary plik elementowy.

Tak na szybko rzuciłem okiem. Pytanie - czemu się upierasz przy ograniczaniu długości stringów? Zarówno ja, jak i @Patryk27 pisaliśmy Ci, że to nie ma większego sensu. - cerrato 2019-01-21 22:50

Pozostało 580 znaków

2019-02-10 09:06
0

Program po liftingu.

Pozostało 580 znaków

2019-02-10 12:35
1

@Adept123: jeszcze sporo masz do poprawienia. ;)

Masz bardzo dziwny sposób tworzenia wcięć, wyrównując zagnieżdżone linijki do końca pierwszego słowa nagłówka bloku. Nie rób tak – stosuj wcięcie o jednolitym rozmiarze, dokładnie dwóch znaków. Użyj wbudowanego w środowisko narzędzia do formatowania i zobacz jak drastycznie zmieni się Twój kod.

Nie stosujesz się do przyjętej konwencji nazewnictwa elementów kodu – rzadko kiedy używasz dużych liter, a to sprawia, że kod trudniej się analizuje. Styl PascalCase to podstawa, jeśli o identyfikatory chodzi, tak samo jak przyjęty system prefiksów dla różnych typów identyfikatorów. Poza tym mieszasz identyfikatory angielskie z polskimi.

Kolejna rzecz to interpunkcja i nawiasy. W przypadku bezparametrowych podprogramów nie zapisujesz pustych nawiasów, przez co gołym okiem nie da się odróżnić wywołania funkcji od użycia np. zmiennej. Co prawda składnia pozwala na pominięcie nawiasów w takim przypadku, jednak ich stosowanie poprawia czytelność kodu. Inny problem to pomijanie średnika po ostatniej instrukcji w danym bloku kodu. To też jest dopuszczalne, jednak niezalecane – w końcu jest to pozostałość po prehistorycznych kompilatorach, które braku średnika wymagały.

Poza tym często mieszasz logikę z wyświetlaniem i pobieraniem danych z klawiatury, a także unikasz używania parametrów funkcji i zamiast tego korzystasz ze zmiennych globalnych, a to prędzej czy później nie wyjdzie na dobre.

No i nie rozumiem co tam na górze robi moduł Dos. Ten program jest przeznaczony dla DOS-a?


Jeśli o techniczne sprawy chodzi, to niektóre funkcje są strasznie długie i pasowałoby je podzielić na mniejsze. Tak po kolei:

if (telef[cyfra] in ['0'..'9']) or (((telef[cyfra] = '*') or (telef[cyfra] = '+')) and (cyfra = 1)) then

taką linijkę możesz napisać w ten sposób, skoro i tak ze zbiorów korzystasz:

if (telef[cyfra] in ['0'..'9']) or ((telef[cyfra] in ['*','+']) (and cyfra = 1)) then

Możesz też wyciągnąć sprawdzanie pierwszego znaku przed pętlę, a tę indeksować od drugiego znaku, już bez dodatkowej instrukcji warunkowej.


function Poprawna_data(d,m,r: integer): boolean;
var
   skrocony_rok,wiek: integer;
begin
     Poprawna_data := false;

     skrocony_rok := r mod 100;
     wiek := r div 100;

     if (d in [1..31]) and (m in [1..12])
     and (((wiek = 19) and (skrocony_rok in [50..99])) or  ((wiek = 20) and (skrocony_rok in [0,1])))
     then
         if ((m = 1) and (d in [1..31])) or
            ((m = 2) and (d in [1..29])) or
            ((m = 3) and (d in [1..31])) or
            ((m = 5) and (d in [1..31])) or
            ((m = 7) and (d in [1..31])) or
            ((m = 8) and (d in [1..31])) or
            ((m = 10) and (d in [1..31])) or
            ((m = 12) and (d in [1..31])) or
            ((m <> 2) and (d in [1..30]))
         then Poprawna_data := true
end;

Ta funkcja jest zbędna, bo możesz sprawdzić poprawność składowych daty za pomocą funkcji TryEncodeDate.


Procedura Czytaj i końcowy fragment:

if obce[1] <> '' then
  begin
       writeln('j©zyk drugi: '); obce[2] := '';
       readln(obce[2]);

       if obce[2] <> '' then
         begin
              writeln('j©zyk trzeci: '); obce[3] := '';
              readln(obce[3]);

              if obce[3] <> '' then
                begin
                     writeln('j©zyk czwarty: '); obce[4] := '';
                     readln(obce[4])
                end
         end
  end;

Wczytujesz dane do tablicy, więc powinieneś skorzystać z pętli, a literały łańcuchowe wrzucić do stałej tablicy.


if znaleziono = true then

Hmm…

if znaleziono = true and not false then

Co Ty na to? ;)

Warunek wymaga wartości logicznej, a zmienna znaleziono zawiera wartość logiczną – porównanie zbędne.


To tak z grubsza, bo wszystkiego wymienić nie dam rady ze względu na potrzebny czas do analizy całości.


edytowany 1x, ostatnio: furious programming, 2019-02-10 12:37
((znaleziono = true) = true) = true and not (not (not false)) jeśli już. - babubabu 2019-02-11 20:38
znaleziono = true and false or true and not false xor false and true – nawiasy są fuj. - furious programming 2019-02-11 22:49

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0