Strona używa cookies (ciasteczek). Dowiedz się więcej o celu ich używania i zmianach ustawień. Korzystając ze strony wyrażasz zgodę na używanie cookies, zgodnie z aktualnymi ustawieniami przeglądarki.    X

Własna aplikacja? Program? Tak!

Dzisiaj troszkę inny temat. Czy żeby napisać własną aplikację, program trzeba znać tysiące linii kodu? Czy to jest aż tak bardzo konieczne? Nie do końca...

Chciałbym pokazać jak można stworzyć co prawda prostą aplikację, lecz bez posiadania ogromnej wiedzy z zakresu programowania. Do tego celu użyjemy oprogramowania

Co będziemy robić?

Nasza aplikacja będzie liczyła obwód i pole trójkąta prostokątnego. By usprawnić pracę stwórzmy...

Założenia

Tutaj zobaczmy co nam będzie potrzebne. Z pewnością użytkownik naszego małego programu będzie musiał podać nam długości boków trójkąta, więc potrzebne nam są trzy zmienne, w których je przechowamy. Warto byłoby także dodać opis, co nasz program robi oraz jak go używać. Razem potrzebujemy około 4-5 pól tekstowych.

Przyda się również jakiś element graficzny, by użytkownik wiedział, którego boku długość podaje aktualnie. Wystarczy prosty szkic takiego trójkąta. Oczywiście nic nie stanie się samo, więc potrzebujemy także elementu, który wywoła obliczenia i pokaże wynik. Do tego celu przyda nam się np. Przycisk.Także nasz ogólny "Worek potrzeb" wygląda tak:

  • 5 pól tekstowych
  • 1 przycisk
  • 1 obrazek

Działamy

uruchamiamy Visual Studio i przystępujemy do prac. Na początku wybieramy "New Project...",a następnie Visual C# -> Windows Form Application. Na dole nadajemy jej nazwę i zatwierdzamy. Czekamy chwilkę, aż program stworzy projekt.

Po chwili powinniśmy ujrzeć taki widok:

By móc dodawać elementy z naszego "Worka potrzeb" musimy dostać się do przybornika (Toolbox). Najeżdżamy więc po lewej stronie na nazwę Toolbox, klikamy ją, a następnie przypinamy nas przybornik klikając na pinezkę. Możemy przystąpić do pracy.

Na początku zmieńmy nazwę naszego okienka. W tym celu w prawej zakładce Properties szukamy opcji Text, gdzie zmieniamy nazwę Form1 na nasza własną. W przykładzie "Program do obliczania trójkąta". Z racji tego, że chciałem, by aplikacja miała wszystkie elementu w jednym oknie, rozszerzyłem pole okienka, by wszystko zmieścić.

Worek potrzeb

Dodajemy kolejno elementu naszego "worka potrzeb" wybierając je z przybornika (Toolbox) i przeciągając na nasze okienko. Potrzebujemy:

  • 5 x Label
  • 3 x numericUpDown
  • 1 x Button
  • 1 x PictureBox

Oczywiście nie musimy dodawać wszystkiego naraz. Możemy to robić po kolei. Ja na początku dodałem opis tej małej aplikacji. By lepiej pogrupować elementy możemy nadać im własne nazwy. W tym celu klikamy LPM raz na danym elemencie i w prawej zakładce Properties znajdujemy gałąź DataBindings. Rozwijamy ja i w polu Name wpisujemy własną nazwę.

Dla zachowania porządku nazwy w przykładzie to:

  • label1 -> Opis
  • label2 ->Działanie
  • numericUpDown1 -> dl_boku_A
  • numericUpDown2 -> dl_boku_B
  • numericUpDown3 -> dl_boku_C
  • button1 -> przycisk_Oblicz
  • picturebox -> trojkat

Ustawiamy wszystko. Wszelkich zmian w parametrach elementów dokonujemy w prawej zakładce Properties. W polu Text możemy zmienić domyślny tekst pól tekstowych czy przycisków.

Natomiast w przypadku elementu PictureBox, możemy tam załadować obrazem klikając na przycisk przy parametrze Image.

Gdy już uporamy się w "poskładaniem" elementów na ekranie naciskamy klawisz F5 lub zielona strzałkę w pasku narzędziowym. Jak widzimy nasz program uruchomił się, jednak jak nożna się tego spodziewać, po kliknięciu na przycisk "Oblicz" nic się nie dzieje.

Czas to zmienić..

Trochę kodu

Na początku wyłączmy nasz program zamykając go. By stworzyć funkcję wywołująca określone zdarzenia po naciśnięciu przycisk "Oblicz" klikamy go podwójnie LPM. Przechodzimy do pisania kodu. Ukaże nam się taki widok:

private void przycisk_Oblicz_Click(object sender, EventArgs e) { // Tutaj wstawiamy zdarzenia }

to funkcja, która wywoła określone przez nas zdarzenia po naciśnięciu przycisku "Oblicz" (nazwanego przez nas przycisk_Oblicz). Zdarzenia do wykonania wpisujemy wewnątrz nawiasów klamrowych.

Na początek dodajmy zdarzenie, które wyświetli zdefiniowany przez nas tekst po naciśnięciu przycisku za pomocą wyskakującego okienka. Tak więc w nawiasach klamrowych wpisujemy:

MessageBox.Show("Tutaj zobaczysz swój wynik");

Całość powinna wyglądać tak:

Ponownie uruchamiamy nasz program poprzez F5 i naciskamy przycisk Oblicz. Efektem jest ukazanie się okienka z naszym tekstem.

Zmienne

No dobrze, ale zamiast wyniku, chcemy liczny. Sprawdźmy jak to zrobić. Po pierwsze wiemy, ze trójkąt ma 3 boki. Przypiszmy do nich litery a,b,c z czego c będzie przeciwprostokątną trójkąta. Po drugie chcemy poznać obwód i pole tego trójkąta. Razem potrzebujemy pięciu zmiennych, które nam te wartości przechowają. Wprowadźmy to przed naszą informacją o wyniku.

Przykładowo wprowadzona przez użytkownika długość boku A odczytamy następująco.

decimal a = dl_boku_A.Value;

Tłumacząc:
decimal – typ zmiennej
dl_boku_A – nazwa elementu jaką przypisaliśmy obiektowi, w którym użytkownik podaje nam długość tego boku (domyślnie był to obiekt numericUpDown1).
Vale – wartość wskazana, wpisana przez użytkownika do elementu dl_boku_A

Podobnie postępujemy także ze zmienna obwód i pole. Są to po prostu wzory matematyczne

decimal obwod=(a+b+c); deciaml pole=((a*b)/2);

Ta wygląda nasz kawałek kodu po wpisaniu zmiennych. Zmieńmy teraz nasz tekst wyświetlany w wyskakującym okienku na wiadomość pokazująca nasz wynik:

MessageBox.Show("Obwód tego trójkąta wynosi: " + obwod + ", a tego pole jest równe: " + pole);

Po ponownym uruchomieniu programu, wprowadzeniu losowych danych i kliknięciu przycisku "Oblicz" otrzymujemy następującą informację:

Mała rzecz, a jak ważna

Jak wiadomo trójkąt prostokątny jest specyficznym rodzajem trójkąta. Więc co się stanie, gdy użytkownik poda nam długości, które nie tworzą tego trójkąta? Musimy się przed tym zabezpieczyć. Skorzystajmy więc z twierdzenia Pitagorasa , które mówi nam o tym, że trójkąt prostokątny otrzymamy wtedy, gdy suma kwadratów jego przyprostokątnych, będzie równa kwadratowi przeciwprostokątnej. Innymi słowy nasz warunek, jaki podane wartości muszą spełnić, by trójkąt został uznany za trójkąt prostokątny to:

a*a+b*b = c*c

Tutaj podziękowania dla lukasamd za zauważenie oczywistego błędu, jakiego tutaj nie zaimplementowałem. Bok nie może być równy 0, więc spełnione muszą być łącznie 4 założenia:

  • a*a+b*b = c*c
  • a>0
  • b>0
  • c>0

Skorzystajmy z instrukcji warunkowej if, by sprawdzić czy nasz warunek zaszedł

if (warunek) { //zdarzenie, jeżeli warunek jest prawdziwy } else{ //zdarzenie w przeciwnym wypadku – warunek jest nieprawdziwy };

W tym celu "przerabiamy" nasz kod wiadomości na instrukcję if.

if (a>0 && b>0 && c>0 && (a * a + b * b == c * c)) { MessageBox.Show("Obwód tego trójkąta wynosi: " + obwod + ", a tego pole jest równe: " + pole); } else{ MessageBox.Show("Podane przez Ciebie długości nie tworzą trójkąta prostokątnego!"); };

Całość prezentuje się następująco:

Sprawdźmy teraz:

Jak widać program działa poprawnie i jedynie w przypadku trójkąta Pitagorasa (np. 3,4,5) dostajemy prawidłowy wynik. W innym przypadku program pokazuje nam okienko z drugą wiadomością, mówiąca o tym, że wprowadziliśmy złe dane. Teraz wystarczy tylko wykonać Build naszego programu i mamy gotowy plik .exe z nasza małą działająca aplikacją.

Jak widać nie jest to jakiś super złożony projekt, który policzy za nas od razu wszystko, ale myślę, ze wykonanie czegoś takiego i tak daje satysfakcję i pozwala poznać trochę mechanizmy, działanie i zdobyć jakąś wiedzę :)

Oczywiście każdy ma własne zdanie dotyczące danych kwestii nie zamierzam go w żaden sposób podważać, czy obrażać kogokolwiek w jakikolwiek sposób. Przepraszam także za ewentualne błędy. 

windows porady programowanie

Komentarze

0 nowych
  #1 27.12.2012 16:08

A co jak podamy boki:
a = 0
b = 1
c = 1

:)

arlid   14 #2 27.12.2012 16:40

@lukasamd

Fakt, dzięki za zauważenie tego. Poprawiłem co trzeba. Nie wiem jak to przeoczyłem :P Wstyd :) Taka oczywistość, a na kartce miałem zapisane jak robiłem wpis :)

kadet90   5 #3 27.12.2012 17:02

Nadal masz błąd :) Powinieneś użyć && :)

arlid   14 #4 27.12.2012 17:20

@kadet90

Eh :p Dzięki :)

alucosoftware   7 #5 27.12.2012 17:24

@arlid
Brawo! Świetny wpis!

  #6 27.12.2012 18:18

Polecam zmienić skórkę na ciemną. Tools->Options...->Environment->General->Color theme->Dark

tfl   8 #7 27.12.2012 18:29

+1

promocja programowania jak najbardziej porzadana!

To teraz proponuje male utrudnienie - niech program liczy to samo, ale na podstawie wspolrzednych kartezjanskich trzech wierzcholkow (dla ulatwienia - uklad dwuwymiarowy). A kolejny krok - to samo, ale na podstawie wspolrzednych dwoch wierzcholkow i cosinusa jednego z katow miedzy przyprostokatna i przeciwprostokatna.

Jakis konkursik na implementacje ? :)

nitro2012   10 #8 27.12.2012 18:52

Powiem tak, mamy zrobić program w C# jako aplikację okienkową i jako stronę .NET ASPX z obsługą Silverlight i bazy MSSQL i nie jest tak trudno, trzeba tylko pomyśleć. Większość odpowiedzi jak coś nie wiedziałem to dokumentacja Microsoftu i forum social msdn.

budda86   9 #9 27.12.2012 18:58

Warto dodać, że Visual Studio Express można pobrać całkowicie legalnie i za darmo ze stron Microsoftu: http://www.microsoft.com/visualstudio/plk/products/visual-studio-express-products

kwpolska   6 #10 27.12.2012 19:01

A ja proponuję zastąpienie przycisku automatycznym przeliczaniem przy zmianie wartości spinboksów.

nitro2012   10 #11 27.12.2012 19:06

Ja mam Visual Studio 2012 Ultimate z DreamSpark

Over   9 #12 27.12.2012 20:05

Ciekawe Ciekawe ;)

kamilkowy   3 #13 27.12.2012 20:36

ja też jestem za, moim zdaniem świetna sprawa, co prawda szkoda, że na platformie Windowsa, a nie na Ubuntu, ale i tak szacun leci

Druedain   14 #14 27.12.2012 20:48

A ja dla równowagi zadam pytanie: czy na pewno tędy droga?

budda86   9 #15 27.12.2012 22:42

@Druedain
Każda droga, która prowadzi do celu, jest dobra. Jeśli ktoś dzięki takiemu wpisowi zainteresuje się programowaniem i będzie rozwijał w tym kierunku swoje zainteresowania i umiejętności, to czemu ma to być zła droga? Moim zdaniem wpisu pokazujący jak zrobić ładną aplikację okienkową ma większe szanse, żeby zainteresować kogoś programowaniem, niż napisanie w vimie quicksorta i kompilacja tego w bashu. Albo rozrysowywanie algorytmów. Nawet, jeśli czytelnik nie do końca będzie rozumiał co robi, podążając za wskazówkami z takiego wpisu, to jest szansa, że się zainteresuje i zrobi wszystko, żeby zrozumieć i dowiedzieć się więcej.

Piszę z własnego doświadczenia - uczyłem się kodować na Visual Basicu, gdzie można było robić ładne okienka, niewiele rozumiejąc z tego, co dzieje się pod spodem. Dziś robię właśnie to pod spodem, a nie okienka, ale może gdyby nie one, to zostałbym marynarzem. Kto wie? ;)

soanvig   10 #16 28.12.2012 00:23

jeśli twierdzeniem pitagorasa sprawdzamy czy trojkat jest prostokątny, to trójkąt prostokątny o bokach ujemnych tez jest prostokątny

Uwzględnij w założeniach to co trzeba :)

Autor edytował komentarz.
tfl   8 #17 28.12.2012 08:13

@soanvig

f (a>0 && b>0 && c>0 && (a * a + b * b == c * c)) to juz jest zalozone

Shaki81 MODERATOR BLOGA  38 #18 28.12.2012 08:14

Dobry wpis, ale popatrzę ile to roboty, klepania aby stworzyć coś tak prostego to mi się nauki programowania odechciewa :)

arlid   14 #19 28.12.2012 08:16

@alucosoftware
Dzięki za dobre słowo :)

@tfl
"niech program liczy to samo, ale na podstawie wspolrzednych kartezjanskich trzech wierzcholkow (dla ulatwienia - uklad dwuwymiarowy)"

Da się zrobić :P Rozwinięcie "aplikacji" w następnym wpisie :)

@kwpolska
Tak, mogłoby tak być, jednak zauważ, ze przy pierwszej zmianie wartości dowolnego ze spinboxów otrzymałbyś od razu komunikat o tym, że wartości nie tworzą zadanego trójkąta.

@soanvig
Tak, taki trójkąt także byłby trójkątem prostokątnym, jednak dlatego są spinboxy, nie wstawisz liczby ujemnej :p To takie odgórne założenie, ze wszystkie boki są dodatnie. Poza tym nie zagłębiałem się aż tak, gdyż główną istotą wpisu było pokazanie, ze nawet bez wielkiej wiedzy programistycznej i w dość przyjemny sposób także można stworzyć coś własnego. A to z pewnością podniesie na duchu i być może zachęci do dalszych poszukiwań :)

@Shaki81
jak się "wczujesz" to jak klocki :P Spróbuj :P

Dziękuję wszystkim za dotychczasowe komentarze :)

Autor edytował komentarz.
djfoxer   18 #20 28.12.2012 10:50

A nóż takie wpisy zachęcą kogoś do nauki programowania. + dla arlida :)

soanvig   10 #21 28.12.2012 11:41

A, faktycznie, zwróciłem uwagę tylko na zdanie: "bok nie może być równy 0" :P

tfl   8 #22 28.12.2012 11:42

i jeszcze cos... podanie dlugosci trzeciego boku, przy zalozeniu, ze trojkat jest prostokatny, nie powinno byc konieczne :)

drobok   14 #23 28.12.2012 11:53

Rozumiem że kod ma być prosty, jednak jeśli dasz dużo zmiennych to zamysł samego zachęcenia do programowania się mija z celem.

kwpolska   6 #24 28.12.2012 13:03

@arlid
zastąpić automatycznym przeliczaniem i umieszczaniem odpowiedzi w tym samym oknie, po cichu.

Autor edytował komentarz.
  #25 29.12.2012 13:59

Myślę, że program zyskałby na wartości gdyby obliczał pole i obwód dowolnego trójkąta, wtedy zniknąłby problem z niepotrzebnym podawaniem trzeciego boku.
Odnośnie kodu, trochę dziwi mnie typ użyty do zdefiniowania boków trójkąta (decimal jest aż 128 bitowy i ma dokładność do blisko 30 cyfr po przecinku) w związku z użyciem spinboxów najlepsze wydaje się jedno proste rzutowanie i użycie typu int :). Ostatecznie trzy boki, pole i obwód można by zdefiniować jako pola klasy. Inna sprawa to czy warto przy tak prostym przykładzie stosować się do MVC? Moim skromnym zdaniem nie ma takiej potrzeby. Abstrahując od żalów wylewanych powyżej, dodam tylko: szkoda, że przykład nie został zrealizowany w WPF. W tekście napisałeś "Zdarzenia do wykonania wpisujemy wewnątrz nawiasów klamrowych." zdarzenie zostało już zdefiniowane, w tym miejscu dodajemy instrukcje (taka mała różnica a cieszy). Podsumowując wpis fajny, ponieważ pokazuje, że można napisać coś małego, samodzielnie i użyć np.: delegat i eventów nie mając kompletnie pojęcia czym są i jak działają.

Lepsus   2 #26 30.12.2012 18:37

Program do obliczania trójkąta? xD

arlid   14 #27 31.12.2012 08:46

A dlaczego by nie taka nazwa xD :P

llindelou   7 #28 31.12.2012 10:39

Też zastanawiałam się nad nazwą tego programu ale jesli arlidowi pasuje to czemu nie... w sumie to nazwa tylko na potrzeby pokazania, że można napisać program do obliczania obwodu i długości boków trójkąta. Tak ostatecznie nazwa obliczanie trójkąta to skrót myślowy :)

+ plus za pomysł na wpis
W dalszych wpisach można dodać trzeci wymiar :)

arlid   14 #29 02.01.2013 18:00

Tak chodziło jedynie o pokazanie jak zmienić nazwę i została zmieniona na taka jedynie na potrzeby wpisu. Można wpisać bla, bla i też będzie ok ;)

  #30 04.01.2013 06:33

Problem pojawi się gdy to nie będzie trójkąt prostokątny.Musiałbyś dodać wysokość trójkąta a poza tym coś żeby nie można było podać boków z których trójkąt nie może powstać np. 1,1,2 lub 3,4,1.

arlid   14 #31 04.01.2013 18:26

Sprawdzenie czy długości boków tworzą trójkąt prostokątny jest przeprowadzane dzięki twierdzeniu Pitagorasa.

  #32 05.01.2013 13:16

Witam. Jak gotowy projekt zapisać w postaci pliku .exe? Bardzo proszę o pomoc. Pozdrawiam. :)

arlid   14 #33 08.01.2013 18:50

Gotowy plik zapisujemy poprzez "opcję Build" a plik znajdziemy w katalogu projektu w Moich dokumentach.

  #34 08.01.2013 19:48

Witam, mam folder ze sporą ilością plików. Czy wszystkie są niezbędne? Których można się pozbyć i który plik jest głównym plikiem programu? :) pozdrawiam.

  #35 08.01.2013 19:49

Czy można zrobić podobny interfejs graficzny dla programu w C++?

  #36 19.01.2014 23:43

Witam,
jestem przykladem osoby, ktora dopiero zaczyna programowanie a dokladniej szukam odpowiedniego narzedzia do tworzenia malych programikow pozwalajacych na wykonywanie obliczen jak rowniez, pewnie w przyszlosci, rysowanie w AUTOCAD roznego rodzaju elementow konstrukcji budowli.
Ten post mnie przekonal, ze nawet ja potrafie to zrobic a komentarze mnie w tym tylko upewnily.
DZIEKI artid!

Wracajac do mojego zagadnienia, czy uwazacie ze ta droga jest sluszna? Mam na mysli Visual Studio. Jaki jezyk programowania jest do tego najbardziej odpowiedni? Dodam, ze prawdopodobnie wszystko w przyszlosci bedzie sie odbywalo za pomoca przegladarki internetowej.
Dzieki za informcje i porady.

  #37 28.05.2015 13:47

Czesc,

gratuluje programu. Zauwazylem jeden blad, mianowicie brak warunku poprawnosci istnienia trojkata. Nie wystarczy aby trojkata boki byly wieksze od 0, lecz rowniez aby w ogole trojkat mogl istniec to suma kazdych dwoch bokow musi byc >= od trzeciego boku. Tylko przy spelnieniu tej zaleznosci nasz trojkat moze sie 'zamknac', w innym przypadku ramiona beda zbyt krotkie aby powstala figura zamknieta :)

pzdr
Przemek