Skocz do zawartości

Zabawy algorytmiczne i programowanie


Maklak2

Recommended Posts


Tak przy okazji: to zadanie było na programowaniu 2 jako praca domowa i prawie nikt go nie zrobił, a ci którzy zrobili, gadali coś o wektorach.

 

A nie dało by się tego załatwić za pomocą iloczynu mieszanego wektorów? 

http://www.matematyka.pl/206480.htm 

Daję linka do stronki z teorią, bo zapomniałem jak się to konkretnie liczyło. Ale wiem, że posiadając wektor podstawy, drugi wektor podstawy oraz wektor wysokości można to spokojnie obliczyć. 

Bez całek też się da jak widać. 

Link do komentarza
Udostępnij na innych stronach

W tę stronę też próbowałem kombinować, ale do iloczynu mieszanego trzeba mieć te wektory. Wektory można by policzyć ze współrzednych wierzchołków, ale problem  w tym, że nie ma współrzędnych -- tylko długości wszystkich krawędzi. Współrzędne pierwszych trzech wierzchołków mogę sobie wyznaczyć, np. przyjmujac że pierwszy to A(0, 0, 0), drugi to B(a, 0, 0), a trzeci sobie policzyć jako C(x, y, 0), wyznaczajac współrzędne z długości boków b i c. Schody są przy ostatnim.

Link do komentarza
Udostępnij na innych stronach

Chemik, odpiszę na to tutaj, bo w tym wątku bardziej pasuje: http://mlppolska.pl/watek/3011-sesje-roleplaying-is-magic-w-warszawie/page-7#entry625469

Dla kogoś kto lubi Javę i programowanie obiektowe to trochę herezje :)

Jeśli chodzi o programiki na kilkaset linii kodu, to nie trzeba zawracać sobie głowy klasami i innymi sprawami, które bardzo przydają się w większych programach. Ewentualnie w Matlabie warto rozbić sobie nawet mały program na osobne pliki z funkcjami, ale generalnie robisz tak:

1) Includy / import / use, itp - na początek deklaracje z jakich bibliotek korzystasz.
2) Deklaracje i inicjalizacje zmiennych globalnych. W większych programch używa się tego jak najmniej, ale w małym skrypcie są OK. Pomagają też zmniejszyć ilość parametrów wielu funkcji, co generalnie jest mocno złą praktyką.
3) Deklaracje funkcji. Funkcje przydają się zawsze, nawet w małych programach. No i możesz sobie zrobić coś w rodzaju własnej biblioteki, to znaczy jakiś plik z funkcjami, z którego korzystasz w różnych programach. Akurat w Perlu to jest zderipone, więc jesli tylko mogę, najchętniej trzymam cały kod w jednym pliku.
4) Funkcja main. Nawet w skrypcie wykonywane instrukcje ładniej jest opakować sobie w funkcję, którą wywołujesz raz.
5) Różne funkcje z których korzystasz. Najczęściej mam tam coś do inicjalizacji opcji (ustawia zmienne globalne na podstawie opcji programu), coś do wczytania danych z pliku lub wykonania obliczeń i coś do wypisania wyniku. Czyli main często wygląda tak:
sub main
{ init_options();
  read_data();
  compute();
  print_result();
}

Jeśli chodzi o obliczenia statystyczne na wynikach rzutu kostką, to można do tego podejść po pierwsze tak:
A) Wyczerpanie wszystkich mozliwości. Wchodzi w grę, jeśli możliwych kombinacji jest powiedzmy 10^10 lub mniej. Ta metoda jest dokładna, zakładając że w rzeczywistości używamy idealnych kostek (nie używamy, ale to dobre przybliżenie).
B) Obliczenia metodą Monte Carlo: Generujemy powiedzmy 10^8 losowych wyników i dla nich liczymy statystyki. Najlepiej uzyć do tego jakiegoś lepszego generatora liczb pseudolosowych niż ten standardowy. Statystycznie to zbiega do poprawnego wyniku z szybkością pierwiastka z liczby próbek.

Są jeszcze dwa sposoby jak wkomponować w kod pobieranie nowej kombinacji:
Sposób 1)
sub main
{ for (int i=1; i<=6; i++)
  { for (int j=1; j<=6; j++)
    { for (int k=1; k<=6; k++)
      { # Wybierz odpowiednie kostki i policz statystyki
      }
    }
  }
 
  # Wyświetl statystyki
}
Czyli zagnieżdżamy sobie pętle z wynikami z kostek i w środku coś z tym robimy. To rozwiązanie jest szybsze, ale trochę bardziej bałaganiarskie

 

Można też zrobić osobną funkcję, która generuje następna kombinację, zwraca kolejny ciąg znaków z czytanego pliku, itp. Dla kostek zaczynasz od (1, 1, 1), dodajesz 1 i przenosisz nadmiar na następną kostke, czyli (7, 1, 1) zmienia się w (1, 2, 1), itp.

Sposób 2) -- przy Monte Carlo to jedyna możliwość.
my $state;
sub main
{ $state = init();
  do
  { # compute statistics on current state
  } while ($state = next_state($state))

  # Wyświetl wynik.
}

Jest wolniej, choćby dlatego że tutaj tak jakby w najbardziej wewnętrznej pętli masz wywołanie funkcji.

  • +1 1
Link do komentarza
Udostępnij na innych stronach

Jak zrobić, żeby mi się w HTMLu wyświetlały polskie znaki, a nie "ĄżĘęÅłÓ󯿏ź"?

 

Nagłówek w postaci "<content-type: text/html charset=\"UTF-8\">\n\n" nie działa.

 

EDIT: Już nieważne. Do html wystarczy nagłówek "<!DOCTYPE html> <meta charset=\"utf-8\">" i już wtedy nie trzeba używać tych HEAD, HTML i BODY.

Więcej info tutaj: http://www.sitepoint.com/a-minimal-html-document-html5-edition/

Edytowano przez Maklak2
Link do komentarza
Udostępnij na innych stronach

  • 3 weeks later...

Umie ktoś tutaj język C# i chciałby mi pomóc z zadaniami? 

Nie. Poco komu ten substytut jedynego języka prawdziwego programowania  :hmpf:

Nie no bardziej nie lubię tego że nic nie działa pod Mono :-D Może i Unity3D korzysta z Mono, ale wiem że zawsze są problemy, po za tym do dzisiaj nie zrobili WebPlayera na Linuksa (A wtedy mógłbym hejcić tych co piszą w Unity tak, że nawet pod osx nie działa).

 

A tak na serio to Maklak powinien coś ogarniać, bo ostatnio stwierdził że w tym pracuje.

 

Że też się z ciekawości spytam, o czym te zadanka i dlaczego C#?

Jak coś to zadanka możesz je tutaj przedstawić. Tematem przewodnim wątku jest głównie sama algorytmika, co jest ortogonalne do pojęcia samego języka programowania.

 

 PS. W tym wątku nie zamierzam hejcić nikogo za to jakiego języka używa.

:lie:

 

Edytowano przez Arpegius
Link do komentarza
Udostępnij na innych stronach

Gość PervKapitan

Ehh.. właściwie na studia. Wiem, że powinnam sama robić, ale nie każdy informatyk musi być programistą. Też nie lubię poza tym C#

 

 

10906312_1514919132105292_62921631527764

 

1922363_1514919162105289_613179207500934

 

10430406_1514919168771955_91902614194985

 

A tutaj są kody programów z tych zadań: http://pastebin.com/u/agace

 

Ona nam daje listy i każe rozwiązywać samemu, na lekcjach przedstawiamy. Tłumaczy nam może 10 minut na czym to polega, a ja nie mam pojęcia co robić. Pierwsze listy były banalne, bo było to programowanie strukturalne, ale obiektowego całkowicie nie roumiem.

Edytowano przez PervKapitan
Link do komentarza
Udostępnij na innych stronach

Meh, to są podstawowe rzeczy i wyglądają nudno. Programowania obiektowego i tak będziesz musiała się nauczyć. Na kiedy masz to zrobić i dlaczemu nie masz kolegów na uczelni? Dziewczyny zwykle dostawały takie rzeczy rozwiązane, ot tak po prostu.

 

> Poco komu ten substytut jedynego języka prawdziwego programowania  :hmpf:

Tja, Javy :trollface:

 

Dobra, na zachętę zrobiłem 10.1, ale na odwal się i nawet nie wiem czy się skompiluje, a w domu mam gcc a nie Visual Studio. http://pastebin.com/RthGtKDX  Po powrocie z pracy nie chce mi się rozwiązywac takich zadań.

Edytowano przez Maklak2
Link do komentarza
Udostępnij na innych stronach

Gość PervKapitan

Wiem, że będę musiała. Ale ona nie tłumaczy nam tego. A ja na googlach nie potrafię nic sensownego znaleźć. Na poniedziałek to mam mieć. Koledzy... meh... dziewczyny dostawały jak nie wyglądały jak babo-chłopy może :v

Link do komentarza
Udostępnij na innych stronach

Gość PervKapitan

Ogólnie nie chcę, byście "odje*ali" za mnie całą robotę. Tylko chciałam by ktoś mi to zrobił, ale też wytłumaczył co jest czym i dlatego tak a nie inaczej. 

Link do komentarza
Udostępnij na innych stronach

1) Klasa ostateczna to taka, której nie można odziedziczyć, a metoda ostateczna to taka, która przestaje być wirtualna. W C# uzywa sie do tego słowa kluczowego "sealed". O dziedziczeniu i metodach wirtualnych raczej sama sobie poszukaj, ale tak w skrócie to każda instancja klasy ma vtable, ukryty wskaźnik na tablicę wskaźników do funkcji. Przy dziedziczeniu część z tych wskaźników może pokazywać na metody z nowej klasy.

2) Konstruktory przeciążone to konstruktory z różnymi argumentami, np.
class Statek
{
    // pola tej klasy
    static int counter = 0;
    
    Statek(int arg1, float arg2, String arg3)
    {
        counter++;
        ...
    }

    Statek(float arg1)
    {
        counter++;
        ...
    }
}

Żeby mieć liczbę obiektów trzeba mieć w klasie statyczną zmienną i inkrementować ją w konstruktorach. W C++ dekrementuje się ją w destruktorach, w C# można co najwyżej dekrementować ją w metodzie Dispose, która działa kiedy ruszy garbage collector (i trzebaodziedziczyc interfejs Idisposable). Do zmiennej statycznej można się odwołać z każdej metody klasy, więc dodaj sobie:
public static int GetCounter { return counter;}
albo
public static int Counter { get { return counter; } }
i wywołaj np. Statek.Counter w main.

3) To będzie w sumie podobne do przykładowego kodu. Musisz mieć klasę abstrakcyjną Zwierz z jakimiś polami i metodami, np do wagi, długości, czy kiedy się urodził oraz jakieś metody do obsługi tego i najlepiej konstruktor z parametrami.
Dziedziczysz z tego klasę Ptak z metodami Przylot(), Odlot() i pewnie dwa pola na czas przylotu i odlotu i dodajesz jakąś metodę main, któa wypisze rzeczy na ekran.

4) Więcej zmiennych i więcej metod i więcej rzeczy do wypisania na ekran. Taka tam głupiego robota.

O obiektach, dziedziczeniu, itp. trzeba napisac naprawdę sporo, żeby to jako-tako wytłumaczyć. Nie oczekuj, że zrobię to w jednym poście na forum.
 

Link do komentarza
Udostępnij na innych stronach

Gość PervKapitan

I tak wielkie dzięki, że chciało Ci się napisać to. Na pewno mi to pomoże w zrobieniu tych zadań. :)

 

A nasza babka to tłumaczyła w dwie minuty i na tym skończyła :v

Link do komentarza
Udostępnij na innych stronach

Ehh.. właściwie na studia. Wiem, że powinnam sama robić, ale nie każdy informatyk musi być programistą. Też nie lubię poza tym C#

 

No ja bym raczej powiedział że nie każdy programista musi być informatykiem. A sama umiejętność programowania przydaje się praktycznie wszędzie gdzie mamy doczynienia z automatyzacją, czyli praktycznie wszędzie.

 

Tylko że patrząc na te zadanka to ciebie nie uczą programować, tylko uczą cię znajomości jezyka C♯ (nie C#). O ile ta wiedza jest niezbędna aby tworzyć prawidłowo oprogramowanie w .NETcie, to jednak jest tylko drobnym wycinkiem wiedzy jaki architekt oprogramowania (wyspecjalizowany informatyk) powinien posiąść o technologii w której pracuje.

 

 

Ogólnie nie chcę, byście "odje*ali" za mnie całą robotę. Tylko chciałam by ktoś mi to zrobił, ale też wytłumaczył co jest czym i dlatego tak a nie inaczej. 

No cóż ja mogę tylko ponarzekać, chyba że chcesz posłuchać skąd to się wzieło i jak może być inaczej :godpony: ale to raczej długa rozmowa i nie na to forum. Zresztą podstawowa wiedza z wzorców programowania była by chyba tu konieczna by to zrozumieć, no i jeszcze matematyka, ta mocno abstrakcyjna.

Edytowano przez Arpegius
Link do komentarza
Udostępnij na innych stronach

Chcesz dodać odpowiedź ? Zaloguj się lub zarejestruj nowe konto.

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto

Zarejestruj nowe konto, to bardzo łatwy proces!

Zarejestruj nowe konto

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się
×
×
  • Utwórz nowe...