Wpis z mikrobloga

Hej Mirki, robię drugie podejście do nauki programowania. Zaczynam od oglądania CS50 i robię zadania udostępnione przez uniwersytet. Przed chwilą skończyłem pisać algorytm Luhna i zastanawiam się co można by zmienić w kodzie, żeby było mniej linijek ;p. Głównie chodzi mi o drugą pętlę while, bo zdaję sobie sprawę, że nie powinienem wrzucać wszystkiego do metody main, tylko porozbijać kod na mniejsze funkcje. Zmienna "cardCopy" to też fuszerka, bo dopiero na koniec zdałem sobie sprawę, że jednak będę jeszcze potrzebował nr karty i to było najszybsze rozwiązanie ;p. #naukaprogramowania
  • 22
@szwe: Dobre pytanie xD Myślałem, żeby rozbić tę pętlę while na dwie metody, ale wtedy w obu funkcjach (jedna podaje ile cyfr jest w liczbie, a druga oblicza Luhn'a) miałbym pętlę, która przelatuje przez całą liczbę. Wywalenie tego co mam w tej pętli do osobnej metody chyba się nie sprawdzi, bo musiałbym zwrócić dwie zmienne, a to jest (chyba) niemożliwe.
@szwe: Ok, to rozumiem, ale ja mam problem ze zrobieniem funkcji, która miałaby policzyć ilość cyfr+Luhn. Jak to wrzuce do osobnej metody, to będę musiał zwrócić dwie zmienne, a tego nie da się zrobić. Czy wrzucenie dwoch wyników to array i zwrócenie jej miałoby sens? Głównie mi chodzi o to w jaki sposób zrobiłaby to osoba zajmująca się programowaniem zawodowo, żeby wyrobić sobie dobre nawyki. xD
@szwe: Chyba się tutaj nie zrozumieliśmy ;). Trochę się już pogubiłem w tym. Według ciebie mam zrobić jedną metodę zajmującą się obliczeniami czy dwie? Jeżeli jedną, to w jaki sposób mam zwrócić dwa wyniki z jednej metody? W tym momencie pętla, która znajduje się w main, oblicza dwie rzeczy na raz.
@Griffith: Na pewno masz 2 razy wypisywanie invalid, nie wiem na teraz czy to konieczne, sprawdź sobie. W pętli masz 3 linijki w których robisz coś z i a możesz to zastąpić jedną. To iterowanie numOfInts na początku i na końcu i dodatkowe sprawdzanie warunku pętli w ifie wygląda co najmniej dziwnie i możesz pomyśleć jak to zastąpić.
@szwe: To wypisywanie już poprawiłem, ale to o czym piszesz dalej, to właśnie problem z którym tutaj przyszedłem, bo nie wiem czy można to zrobić z mniejsza ilością kodu. Przy parzystej ilości cyfr to if nie jest potrzebne.
@szwe: Dzięki za pomoc! No tak, przecież z każdą iteracją to i i tak się zeruje, ale jestem głupi... Jak na razie to jest finalna wersja @SwordPL jak będziesz miał czas to rzuć okiem czy funkcja do liczenia jest najbardziej optymalna.
@szwe: Masz rację, zmieniłem jeszcze linijkę 63 na else if((digits==13||digits==16)&&((firstTwoDigits/10)==4)), bo miało sprawdzić czy pierwsza cyfra w liczbie to 4. Im mniej linijek tym lepiej xD
@Griffith: Tutaj zależy jak dużo rzeczy chcesz zmienić w algorytmie.

Najprościej byłoby przejść z long long na char* za pomocą http://www.cplusplus.com/reference/cstdio/snprintf/.

Ale jeżeli tego robić nie chcemy... To:
https://ideone.com/S2g9MT

Ten cały if > 9 nie ma sensu - tak wygląda algorytm, ale jego implementacja tego nie wymaga:

int numOfDigits(long long card){
int sum1 = 0;
int sum2 = 0;
int numOfInts = 0;

while(card > 0){
numOfInts++;
sum1 += card %
@SwordPL: Trochę mi zajęło przetworzenie o co chodziło tobie w tym drugim linku, a to miał być tylko dowód, że to if jest niepotrzebne xD Dzięki! Chociaż teraz wiem, że ogólnie w porządku było napisane jak nie chciałem zmieniać na char czy string.