Wpis z mikrobloga

I przyszła pora na wątek z natury programistycznej.
Przedstawiam przykładowe podejście do rozwiązania problemu obliczania wymiarów opon samochodowych, jak średnica felgi, wysokość profilu opony, całkowita średnica opony oraz jej obwód.
Na wstępie przedstawiłem zasady obliczania oraz interpretacji poszczególnych wartości, natomiast kolejno przedstawiłem i omówiłem źródło przygotowanego programu.
Pragnę również zaznaczyć w tym miejscu, że nie jestem ani zawodowym ani profesjonalnym programistą. Wykorzystuję programowanie do rozwiązywania swoich problemów natury inżynierskiej lub okołoinżynierskiej w pojawiających się schematach, zaś pokazywane przeze mnie rozwiązania mają jedynie służyć jako wskazanie przykładowej drogi do realizacji wybranego problemu dla osób, które nie są biegłe w programowaniu, stąd też proszę o wyrozumiałość osób zaawansowanych w programowaniu, a wszelkie ewentualne wskazówki dotyczące moich rozwiązań będę starał się omówić w kolejnych odcinkach.

Zapraszam: Jak obliczyć rozmiar opon? Program w języku C oraz omówienie biblioteki ctype.h

A już w kolejnym odcinku: przepis na uniwersalne koło jako koncepcyjne podejście do modelowania 3D.

#inzynierprogramista #jezykc #programista15k #programowanie #naukaprogramowania #motoryzacja
  • 14
  • Odpowiedz
@Zelber: W zasadzie kieruję się takim stwierdzeniem, że skoro ja - amator programowania, napiszę sobie coś w C i to działa i jeszcze staram się przez logikę wyjaśnić dlaczego użyłem takiego typu danych a nie innego, lub takiego sposobu a nie innego, tak też każdy inny, kto poznaje lub włada innym językiem programowania, bez problemu to wykorzysta dla siebie (jeśli się mu to oczywiście do czegoś przyda) i będzie mu
  • Odpowiedz
@InzynierProgramista:

W zasadzie kieruję się takim stwierdzeniem, że skoro ja - amator programowania, napiszę sobie coś w C i to działa i jeszcze staram się przez logikę wyjaśnić dlaczego użyłem takiego typu danych a nie innego, lub takiego sposobu a nie innego, tak też każdy inny, kto poznaje lub włada innym językiem programowania, bez problemu to wykorzysta dla siebie (jeśli się mu to oczywiście do czegoś przyda) i będzie mu to łatwiej napisać, mniejszym kosztem czy wysiłkiem.

Jest to błędne założenie. W C tracisz czas na klepanie boilerplate kodu, pisanie funkcji do parsowania stringów, pisanie logiki wczytywania danych z konsoli. W językach "wyższych" nie zajmujesz ww czynnościami, a po prostu rozwiązaniem problemu.

Języka C używam dlatego, że bez problemu skompiluję czy na Windowsie, czy na Linuksie, czy na telefonie przy użyciu praktycznie jednego kompilatora, bo i takich rozwiązań
  • Odpowiedz
@Zelber:

W C tracisz czas na klepanie boilerplate kodu, pisanie funkcji do parsowania stringów, pisanie logiki wczytywania danych z konsoli.


Dla jednego strata czasu, dla innego cenna wiedza. Dużo więcej wyniesie z klepania w C niż gdyby wziął Pythona i napisał serwer w jednej linijce. Tym bardziej, że kolega chce się zająć mikrokontrolerami. Zresztą co za problem przesiąść się z C na coś wysokopoziomowego w zależności od potrzeb?
  • Odpowiedz
@zwei: co wyniesie? W C w takim zastosowaniu piszesz znacznie więcej dziwnego kodu i dbasz o rzeczy, które w "normalnych" językach się kompletnie nie przydają, a nie przybliżają Cię zupełnie do rozwiązania głównego problemu.

A i tak taki kod jest podatny na multum błędów, których autor może zupełnie nie być świadomy. W pełni zgadzam się z @Zelber - jak nie piszesz na mikro albo OSa, to C w takim
  • Odpowiedz
@zwei:
@Zelber:
Cieszę się, że dyskusja się rozwija, dziękuję za zrozumienie ze strony @zwei, i chciałbym, żeby kolega @Zelber jednak troszeczkę spojrzał na przedstawiony problem w inny sposób.
1) Standardowo zajmuję się pracą związaną z technologią oraz konstruowaniem, przeliczaniem itd. Niekiedy w zależności od złożoności elementu mechanicznego są to czynności żmudne i nie zawsze znajdzie się recepta na zrobienie tego w sposób automatyczny. Dlatego z
  • Odpowiedz
@InzynierProgramista:

1) Standardowo zajmuję się pracą związaną z technologią oraz konstruowaniem, przeliczaniem itd. Niekiedy w zależności od złożoności elementu mechanicznego są to czynności żmudne i nie zawsze znajdzie się recepta na zrobienie tego w sposób automatyczny. Dlatego z mojego punktu widzenia, używanie języka C w porównaniu do niektórych obliczeń i ich czasochłonności wcale nie jest jakimś bardzo żmudnym działaniem. Zrozum proszę, że czas stracony na napisanie własnych funkcji ułatwiających pracę, niekiedy są tylko ułamkiem czasu potrzebnego na wykonanie niekiedy bardziej skomplikowanych obliczeń pomimo stosowania metody MES.

W jakimś Pythonie, czy innym matlabie zajmie to 3-5x mniej czasu mniej niż w C. Warto do tego dodać, że do sporej części obliczeń inżynierskich te języki mają już gotowe rozwiązania/biblioteki.

2) Kolejne podejście związane jest z również z tematem inżynierskim. W trakcie projektowania nowego elementu zaczynamy od pewnych wymagań, dostępności materiałów i na podstawie ich parametrów, przeliczeniu obciążeń, późniejszej weryfikacji MES dochodzimy do rysunku wykonawczego detalu. Czyli muszę mieć przemyślane wszystko od początku. To samo umożliwia język C. Od początku zakładamy ścieżkę jaką będziemy pisać program, jakich typów użyjemy, czy potrzebujemy zmiennoprzecinkowe, czy typy całkowite, a jeżeli tak to jaki ich zakres nam jest potrzebny. I to mi się w tym
  • Odpowiedz
@Zelber:

W jakimś Pythonie, czy innym matlabie zajmie to 3-5x mniej czasu mniej niż w C. Warto do tego dodać, że do sporej części obliczeń inżynierskich te języki mają już gotowe rozwiązania/biblioteki.


Zgadzam się z tym, że zarówno w Pythonie, Matlabie, Javie itd... zostałoby to wykonane w pewnym krótszym odcinku czasu. Zgadza się, że istnieją biblioteki czy rozszerzenia wspomagające i przyspieszające dodatkowo prace.
Jednakże jest wg mnie trochę innej maści problem. Zwykle narzędzia, które przychodzi mi tworzyć prywatnie (niepublikowane) lub w zakresie zawodowym są nieco bardziej skomplikowane do tego by użyć np. nawet Excela, ale nie aż tak skomplikowane by używać zewnętrznych bibliotek. Suma sumarum w efekcie końcowym, czas włożony na napisanie programu nawet w tym języku C zwraca się w momencie dłuższego testowania
  • Odpowiedz
@InzynierProgramista: ten kod jest tak słabvej jakości, że ciężko się na to patrzy, fefdziesiąt linii kodu, który można zastąpić jednym wywołaniem sscanf, a no i ctype.h to plik nagłówkowy, a nie biblioteka
  • Odpowiedz
Panie @leoha, ale powoli...
Kod jest słabej jakości ponieważ postanowiłem poeksperymentować z funkcjami, strukturami, wskaźnikami i napisać własną interpretację ciągu wydarzeń w programie, czy kod jest słabej jakości ponieważ użyłem funkcji lub instrukcji, która źle działa i powinna wyglądać inaczej, czy kod jest słabej jakości tylko dlatego, że nie użyłem funkcji sscanf?
  • Odpowiedz
@InzynierProgramista:
- nie do końca chyba wiesz, że wskaźnikiem można operować jak tablicą i robisz jakieś dziwne operacje arytmetyczne np: *(oznaczenie + licznik) zamiast po prostu napisać oznaczenie[licznik], dużo czytelniejsze i od razu widać intencję
- formatowanie: aż się prosi, żeby wstawić gdzieniegdzie spację (np. po słowach kluczowych "if", przed nawiasami "{" jeśli są w linii z if'em albo while'em), warto też dla czytelności wstawić pustą linię np. między funkcjami itd..
- polskie nazwy zmiennych i funkcji, to jest bardzo zły nawyk programistyczny, na dodatek nazwy funkcji niekoniecznie mówią co rzeczywiście robią,
- nadmierne skomplikowanie, nawet parsując to ręcznie da się to zrobić prościej jakąś prostą maszyną stanów i jeszcze ma się "za darmo" obsługę błędów, a tak mamy spaghetti code ifów i pętli,
- brak
  • Odpowiedz
@leoha: I teraz mi się podoba, ponieważ mogę zobaczyć konkretną opinię, miejsca problemów, merytorykę do której mogę się jakoś odnieść.
Zacznijmy zatem po kolei:

nie do końca chyba wiesz, że wskaźnikiem można operować jak tablicą i robisz jakieś dziwne operacje arytmetyczne np: *(oznaczenie + licznik) zamiast po prostu napisać oznaczenie[licznik], dużo czytelniejsze i od razu widać intencję


Owszem, wiem. Opowiadałem o tym np. w odcinku nr 15. I teraz jak można zauważyć, używam zarówno odwołania zalecanego przez Ciebie, tablica[identyfikator] jak i drugiego poprzez operator wyłuskania *(tablica + identyfikator). Skoro coś jest dopuszczalne to dlaczego z tego nie korzystać i nie używać? Kwestia czytelności: być może jest to prawda, że sugerowane przez Ciebie oznaczenie jest bardziej czytelne - z tym się sprzeczał nie będę. Aczkolwiek w momencie czytania kodu czy widzę zapis pierwszy czy drugi - nie sprawia mi to problemu w zrozumieniu kodu. W zasadzie nie dociera to do mnie, że to jest mniej czytelne i bardziej
  • Odpowiedz
@InzynierProgramista:

Skoro coś jest dopuszczalne to dlaczego z tego nie korzystać i nie używać?

kod się pisze dla ludzi, nie dla komputerów, więc powinieneś używać konstrukcji, która jest najprostsza do zrozumienia dla człowieka, a nie używać czegoś tylko dlatego, że jest. Arytmetyka pointerów zawsze będzie mniej czytelna niż indeksowanie tablicy

W zasadzie nie dociera to do mnie, że to jest mniej czytelne i bardziej
  • Odpowiedz
@leoha: Dziękuję za podesłane przykłady. Postaram się z nimi zapoznać i wyciągnąć wnioski.
Mam nadzieję, że będzie udawało mi się w miarę możliwości poprawiać jakość prezentowanego kodu, jednakże chciałbym pozostawić sobie furtkę na dalsze eksperymenty w nawiązaniu do sposobu osiągnięcia celu, czyli tak jak to w tym przypadku było - własne funkcje zamiast jedna gotowa wbudowana.
Cieszę się, że udało się rozwinąć dyskusję, dzięki której mogę wynieść pomocne informacje, a
  • Odpowiedz