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


Nieoszlifowany diament
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.


Nieoszlifowany diament
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.


Nieoszlifowany diament

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

2019-03-08 07:10
0

New version of the program.


Nieoszlifowany diament

Pozostało 580 znaków

2019-03-08 15:26
1

Te randomowej wielkości wcięcia skutecznie utrudniają analizę kodu. Zawsze powinny mieć rozmiar dwóch spacji (z wyjątkiem zawijania bardzo długich linii). Nie stosujesz przyjętej konwencji nazewnictwa (i używasz niewiele lub nic nie mówiących nazw), piszesz kod po polsku, tłumaczysz w komentarzach rzeczy absolutnie oczywiste, wszystko pakujesz do zmiennych globalnych, do tego mieszasz logikę pobierania danych z klawiatury z wyświetlaniem danych na ekranie i jeszcze innymi rzeczami. No i wszystko trzymasz w jednym pliku (który nazwą sugeruje, że pochodzi z ubiegłego tysiąclecia), zamiast rozłożyć sobie logikę na kilka modułów.

Ogólnie nie jest źle, ale jeszcze bardzo dużo pracy przed Tobą. :]


edytowany 2x, ostatnio: furious programming, 2019-03-08 15:28

Pozostało 580 znaków

2019-04-02 15:01
0

Witajcie
Po przerobieniu działu z listami, postanowiłem stworzyć alternatywne założenie do powyższego projektu. Mam też taką sugestię dla tych, którzy zechcą analizować mój kod, żeby najpierw porządnie przetestowali sam plik exe a dopiero później zabrali się za analizowanie kodu, tak będzie może łatwiej zrozumieć zasadę działania programu.
Pozdrawiam


Nieoszlifowany diament
Ps W rekordzie o nazwie data pole typu integer o nazwie rok przyjmuje wartości od 1950 do 2001 - Adept123 2019-04-02 15:52

Pozostało 580 znaków

2019-04-02 15:40
0

Odnośnie fragmentu "[...] żeby najpierw porządnie przetestowali sam plik exe a dopiero później zabrali się za analizowanie kodu" - chyba nie masz racji.

To, jak się program obsługuje oraz to, jak jest napisany, to są całkowicie odmienne i niezwiązane z sobą rzeczy. Może być program super przyjazny użytkownikowi, ale napisany tak paskudnie, że aż oczy będą boleć na sam widok kodu, ale bywa też odwrotnie - super napisany, ale totalnie toporny w obsłudze. To są dwa odrębne kwestie i dwa powody do wystawienia recenzji/opinii. Zwłaszcza, że inaczej na program patrzy ktoś grzebiący w kodzie, a inaczej przeciętny użytkownik, który prawdopodobnie nigdy z kodem styczności mieć nie będzie.


That game of life is hard to play
I'm gonna lose it anyway
The losing card I'll someday lay
So this is all I have to say
edytowany 1x, ostatnio: cerrato, 2019-04-02 15:40

Pozostało 580 znaków

2019-04-09 16:21
0

Witajcie
Tak z ciekawości pytam. Czy ma ktoś jakoś koncepcję na skrócenie OWEGO kodu ? Jak ten ostatni mój kod źródłowy można byłoby skrócić. Zrobić bardziej przyjazny dla programisty a jednocześnie zachowując działanie pliku exe. ;)
Pozdrawiam


Nieoszlifowany diament

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