Zaloguj się, aby obserwować  
Bartuc

Język C / C++ / C# / Java - pytania, problemy...

1979 postów w tym temacie

Dnia 22.05.2008 o 12:37, Eldven napisał:

Ej, jaka jest komenda na czyszczenie ekranu w konsoli i jaka biblioteka jest do tego
potrzebna??? Chodzi oczywiście o C++

chodzi o clrscr();, bibliotek chyba akurat do tej nie trzeba

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
Dnia 21.05.2008 o 21:49, Baneb14de napisał:

Czym różni się Java od C++ ? Do jakich rzeczy używa się tych programów?

Java jest nowsza i ma obsługiwane w języku pewne rzeczy , które w C++ trzeba nadrabiać użyciem komercyjnych bibliotek. Na przykład w C++ nie ma praktycznie żadnej obsługi współbieżności, która dzisiaj jest absolutnie niezbędna do zrobienia wydajnie pracującego programu. C++ jako język nie ma też praktycznie żadnego standardu obiektowości. Można oczywiście budować obiekty i zależności między nimi, ale za każdym razem albo trzeba robić je od zera, albo korzystać z bibliotek, które najczęściej są komercyjne jeżeli mają być dobre. Za to plusem C++ jest bardzo szeroka możliwość zastosowań. Ponieważ mając w sobie wszystkie cechy języka C, który jest poziomu niemal maszynowego (instrukcje C++ są bardzo często odpowiednikami rozkazów maszynowych na wielu komputerach) i jednocześnie pisania bardzo wysokopoziomowego z użyciem obiektów - można w jednym języku zrobić bardzo kompleksowe programy. I tak się dzieje. Od wielu już lat język C++ jest podstawowym językiem pisania 90% wszystkich systemów operacyjnych na świecie (nieco inaczej niż napisał to Sig, który zna nieco nieaktualną informację w tej sprawie).

Jest jeszcze jedna alternatywa. Jest nim język C# wymyślony w Microsofcie, który jest czymś pośrednim między Javą, a C++.
Język C++ kompiluje się ostatecznie zawsze do kodu maszynowego, natomiast Java i C# są zasadniczo kompilowane do kodu pośredniego uruchamianego przez bardzo szybki interpreter.
W przypadku Javy kodem jest bytecode, a maszyną Java Virtual Machine, czyli Java Runtime Environment (JRE) [obecna wersja to Java SE 6 czyli JRE obsługujący język Java w wersji 1.6].
W przypadku C# maszyną wirtualną jest klient .NET (obecnie wersja 3.0).
Jednak w obu przypadkach istnieją kompilatory pozwalające kompilować programy w tych językach do kodu maszynowego. W takim wypadku prędkość programów wygląda tak, że programy w C i C++ są o ok. 10-20% wolniejsze od odpowiednika w Assemblerze, C# jest wolniejszy o ok. 5-10% od programu w C++, a Java o 10-20% od programu w C++.

Trzeba jednak pamiętać, że nie da się tego tak porównywać ponieważ duży program w każdym języku, to ok. 50-100 tys. wierszy kodu. Jednak w jezyku C taka sama ilość kodu, to po skompilowaniu do kodu maszynowego i zdeasemblowaniu jakieś 250-500 tys. wierszy kodu asemblerowego, a języku C++ może to być spokojnie milion wierszy, a w Javie i C# może to być nawet 2-3 miliony wierszy.
Krótko mówiąc języki wysokopoziomowe pozwalają zrobić programy, które są wolniejsze, ale można je zrobić o wiele szybciej niż w językach starszych i niższego poziomu. Na przykład dzisiaj nie robi się większych programów w asemblerze bo byłoby to zwykłe marnotrawstwo czasu.

Dnia 21.05.2008 o 21:49, Baneb14de napisał:

PS Jeżeli chodzi o gierki online to lepiej java czy flash?

Flash nadaje się do dość prostych gierek, które robi się naprawdę szybko bo Adobe zrobiło dość dobre narzędzie, które się do tego stosuje. Jednak flash obsługiwany jest przez dość prosty język skryptowy ActionScript3 (obecnie), który zgodnie z modą ma nawet dzisiaj obsługę obiektowości, ale nadal jest to zbyt prymitywne rozwiązanie do bardziej skomplikowanych programów. Jest to kolejny przykład programowania dośc wysokiego poziomu, który jednak daje możliwości niewiele wykraczające poza to co dali do dyspozycji twórcy Flexa (program do budowy programów w kodzie pośrednim SWF).
Budowa języka nawet w wersji ActionScript3 nadaje się do prostego budowania ruchomej grafiki, ale z prawdziwym kodem gier ledwo sobie daje radę. Oczywiście da się zrobić grę jak się uprzeć nawet w języku skryptów Windows (BAT), ale jest to raczej sztuka dla sztuki bo efektywność czegoś takiego jest niewielka. Poza tym tylko Java daje możliwość łatwego uruchomienia gry zarówno na Linuxie, Windows PC, konsoli przenośnej, iPodzie i większości telefonów komórkowych prawie bez żadnych zmian w jej kodzie. Takich możliwości nie ma żaden inny język czy środowisko.

Minusem jest to, że Java podobnie jak pozostałe zaawansowane języki (C++, czy C#) jest pełnowymiarowym językiem, wymagającym conajmniej roku uczenia się, aby posługiwać się nim na najwyższym poziomie (w sensie efektywności i jakości programowania).
Natomiast prostą gierkę we flashu zrobi nawet bęcwał (i to dość szybko).

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
Dnia 22.05.2008 o 12:59, Xanax napisał:

Najlepiej jest używać komendy system("cls") dostępnej z biblioteki iostream.

Po pierwsze nie ma ona nic wspólnego z <iostream>, bo pochodzi z czego innego. Po drugie polecenie CLS istnieje i działa wyłącznie w Windows. Jest to polecenie skryptowe tego systemu.
http://forum.gram.pl/forum_post.asp?tid=529&pid=490

Przestań więc ludziom proponować używanie funkcji "system" bo jest to nonsens. W każdym języku i środowisku istnieje funkcja czyszcząca ekran, która robi to lepiej, szybciej i bez ładowania zewnętrznego programu, który robi to co powinien zrobić program.
Porównaj sobie wywołania czyszczenia ekranu:

1. "Krótka" droga polecenia system("cls"):
- Wywołuje funkcję biblioteczną, która wywołuje funkcję API systemu, która próbuje rozpoznać czy "cls" jest nazwą programu lub próbuje znaleźć taką nazwę pliku wykonywalnego uruchamiając przy okazji całe stado funkcji API. Kiedy systemowi uda się znaleźć program wczytuje do pamięci zewnętrzny program (CLS), który zostaje uruchomiony jako nowy proces, wtedy następnie wywołuje on funkcję API systemu, która kasuje ekran, następnie zamyka swój program, oddaje informację do systemu o powodzeniu lub porażce uruchomienia swojego programu, system przekazuje informację z powrotem do funkcji API, która jako synchroniczna dopiero teraz się kończy i przekazuje rezultat do funkcji bibliotecznej, która zwraca rezultat to programu.

2. Dla odmiany bezpośrednia funkcja np. clrscr():
- Albo bezpośrednio czyści pamięć ekranu, albo wywołuje funkcję API, która to robi i od razu zwraca rezultat.

Widzisz różnicę?

Funkcja int system(const char*s) służy do bardzo rzadkich zastosowań - zasadniczo do programów wspomagających skrypty konkretnego systemu operacyjnego.

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
Dnia 22.05.2008 o 12:55, sig. napisał:

chodzi o clrscr();, bibliotek chyba akurat do tej nie trzeba


Nie wiem czemu ale to nie działa. Próbowałem tez z biblioteką <conio.h> ale to nic nie dało.
W błędach jest napisane: `slrscr'' undeclared (first use this function)

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

No cóż, jesteś na pewno dużo bardziej doświadczonym programistą i wiesz, co mówisz. Moja propozycja wynikała z mojej obecnej (raczej mizernej) wiedzy. Oczywiście wiem, że funkcja system() działa tylko pod Windows, ale zakładałem, że Eldven działa pod tym systemem. Dziękuję też za wyjaśnienie jej działania.

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
Dnia 22.05.2008 o 14:17, Xanax napisał:

Oczywiście wiem, że funkcja
system() działa tylko pod Windows, ale zakładałem, że Eldven działa pod tym systemem.


Dokładnie. Zawsze używam system("pause"). Nie wiedziałem, że to tworzy 2 procesy... (?) xD

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
Dnia 22.05.2008 o 13:45, Eldven napisał:

W błędach jest napisane: `slrscr'' undeclared (first use this function)

c l r s c r - skrót do Clear Screen. Ale możliwe, że i nie znajdziesz ponieważ była to niestandardowa funkcja biblioteczna w kompilatorach Borlanda/Inprise.
Dzisiaj w czasach systemów okienkowych programowanie grafiki na konsoli praktycznie zanikło, więc, żeby wykasować ekran graficzny trzebaby użyć funkcji dos/bios, co jest znacznie trudniejsze dla początkującego.
Konsola tekstowa w dzisiejszych czasach służy tylko do wyrzucania komunikatów, więc w naturalny sposób znikły funkcje, które potrafią kasować ekran, zmieniać kolor tła i znaków oraz pozycjonować kursor.
Zresztą funkcje te uczyły bardzo złego programowania, więc nie ma o co mieć żal.
Dlatego najprostszą funkcją kasującą ekran tekstowy związany ze standardowym wyjściem (taki rodzaj strumienia) jest taki kawałek kodu:

for(int i = 0 ; i < 80*25; ++i) putchar('' '');

Wysyła on na wyjście 80 spacji na każde 25 wierszy ekranu. Jeżeli konsola na którą wysyłasz ma inne rozmiary wierszy i kolumn, to odpowiednio zmieniasz liczby.

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
Dnia 22.05.2008 o 14:33, Eldven napisał:

Dokładnie. Zawsze używam system("pause"). Nie wiedziałem, że to tworzy 2 procesy... (?)
xD


Dokładny odpowiednik system("pause"), który robi dokładnie to samo i nie potrzebuje wczytywać cmd.exe lub command.com do pamięci:
puts("Press any key...");
while(!kbhit());
/*sam średnik jest instrukcją pustą, pętla kręci się dopóki nie ma klawisza do wczytania*/

Działa w każdym C i C++.

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

To jest tak, że robie program na lekcję informatyki ( zadanie domowe xD ). Uczymy się na razie programować w konsoli w Borlandzie. Co rozumiesz pod pojęciem "złe programowanie"?

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Olamagato
> Na przykład w C++ nie ma praktycznie żadnej obsługi współbieżności (...)
-> Prawda, ale chocby przyswojenie podstaw OpenMP daje zaskakujaco dobre rezultaty. A jesli chodzi o rzeczy umieszczone w standardzie, to wyglada na to, ze w C++09 to o czym piszesz zostanie dodane. ( zrodlo: http://www.open-std.org/JTC1/SC22/WG21/docs/papers/2008/n2565.html ). Poza tym adopcja wielu rozwiazan z biblioteki boost , czy tez "proste" wyrazenia lambda w postaci, ktorej nie ma obecnie nawet w booscie - nie ma sensu wyliczac, skoro mozna samemu sprawdzic.
A co do obiektowosci - obiektowy jest Smalltalk, a Java... Wnosi na pewno wiecej niz C++, ale i C++ nigdy nie mial byc i nie jest jezykiem obiektowym (:
Na szczescie, wedlug mnie na szczescie, nie zmusza do obiektowego programowania, pozwalajac uzywac tego, co w danej sytuacji jest dla danego projektu najlepsze - czy to programowanie hierarchiczne, obiektowe, generyczne, czy tez nawet proceduralne ;)

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Mam brak z lekcji i nie za bardzo pamiętam algorytmu Euklidesa.Wiem że ma on za zadanie znaleźć największy współny dzielnik.Ale nie jest pewny co do jednego:
while(a!=b)
{
if(a>b)
a=a-b;
else
b=b-a;
}

Chodz i mi o pogrubione.To taka zasada w tym algorytmie że tak należy pisać czy też da się to jakoś wyjaśnić ?

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Logan10
>/.../
- Nie do konca wiem o co pytasz - o zapis pogrubionych linijek, czy moze o sam algorytm ?

Przedstawiony przez Ciebie kod odejmuje od wiekszej liczby mniejsza, dopoki obie nie beda sobie rowne, i powinien znajdowac NWD(a,b). Np:
a=7 , b=4

a!=b wiec wykonuj dalej
1. przejscie petli
7>4 (a>b) wiec a=7-4=3
a!=b wiec wykonuj dalej

2. przejscie petli
3<4 (a nie jest mniejsze od b) wiec b=4-3=1
a!=b wiec wykonuj dalej

3. przejscie petli
3>1 (a>b) wiec a=3-1=2
a!=b wiec wykonuj dalej

4. przejscie petli
2>1 (a>b) wiec a=2-1=1
a==b (a rowne b) wiec zakoncz petle while

a NWD(a=7,b=4)==1 co jest wynikiem prawdziwym

Zauwaz tylko, ze taki kod jest nieodporny na bledy - sprobuj wprowadzic jako a i b np 0 i 1, albo 1 i -1 czy tez -1 i -2 - w takiej sytuacji program nigdy nie wyjdzie z petli.

Natomiast jesli chodzi o sam zapis, to duzo lepiej zamiast a=a-b napisac a-=b , ktore oznacza dokladnie to samo, a jest podpowiedzia dla kompilatora, ze dokonujemy operacji jedynie na dwoch liczbach a nie trzech (choc kompilator w wiekszosci przypadkow i tak zoptymalizuje nasz kod).

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
Dnia 22.05.2008 o 20:48, LifaR napisał:

Olamagato
> Na przykład w C++ nie ma praktycznie żadnej obsługi współbieżności (...)
-> Prawda, ale chocby przyswojenie podstaw OpenMP daje zaskakujaco dobre rezultaty.

Dobre rezultaty daje poznanie wielu bibliotek - bo jak uważam w C++ czy nawet C da się napisać dosłownie wszystko. Problem w tym, że utrzymywanie takich programów, to organizacyjny koszmar. A koszmar przekłada się na czasem ogromne pieniądze.

Zwróć zresztą uwagę na czytelność kodu. Kiedyś czytelność oryginalnego C była niemal doskonała. Mogłeś zastosować bardzo skomplikowane struktury danych i powiązania funkcji, ale nadal było to czytelne. Oczywiście przestawało gdy w C próbowało się zapisywać kod obiektowy tworząc mnóstwo skomplikowanych struktur będących odpowiednikiem funkcjonalnym klas. No, ale do tak skomplikowanych programów składnia C nie była pomyślana.

Dnia 22.05.2008 o 20:48, LifaR napisał:

A jesli chodzi o rzeczy umieszczone w standardzie, to wyglada na to, ze w C++09 to o czym piszesz zostanie dodane.

Jeżeli chodzi o współbieżność, to C++ nie jest to taki wielki problem ponieważ spora "niskopoziomowość" powoduje, że wiele operacji może zostać zagwarantowanych jako atomowe. Automatycznie oznacza to, że nie trzeba generować kodu transakcyjnego, który a to blokowałby, albo atomizowałby poszczególne operacje.

Problem z C++ jest taki, że jego już dzisiaj przestarzała koncepcja jest nie do uratowania. Zwróć uwagę jaki nieczytelny jest kod źródłowy zaawansowanych programów w C++. Ba, nagłówki .h są jeszcze bardziej nieczytelne. Dzisiaj nie wystarczy już rzut okiem na kawałek kodu w C++, żeby łatwo stwierdzić co on robi. A to oznacza, że projekt języka poszedł w maliny.

Dnia 22.05.2008 o 20:48, LifaR napisał:

A co do obiektowosci - obiektowy jest Smalltalk, a Java...

Bez wątpienia jest moim zdaniem obiektowa. Naprawdę trudno to podważyć. W Javie wszystko jest obiektem poza typami podstawowymi, które nimi nie są tylko z powodów wydajnościowych.

Dnia 22.05.2008 o 20:48, LifaR napisał:

C++ nigdy nie mial byc i nie jest jezykiem obiektowym (:

Miał być. Cały sens tego pierwotnie rozszerzenia C opierał się na udostępnieniu obiektowości. To było modne i na modelu tamtych czasów zostało zrobione.

Dnia 22.05.2008 o 20:48, LifaR napisał:

Na szczescie, wedlug mnie na szczescie, nie zmusza do obiektowego programowania

Tyle, że sprowadza się to do programowania w C, którego najnowszy standard jest właściwie nieobiektową częścią C++. Programowanie nieobiektowe w C++ ma moim zdaniem tyle sensu co jazda Cessną ze złożonymi skrzydłami po drodze publicznej.

Dnia 22.05.2008 o 20:48, LifaR napisał:

programowanie hierarchiczne, obiektowe, generyczne, czy tez nawet proceduralne ;)

Programowanie uogólnione, które nazywasz generycznym powoduje nieco problemów. Kod tego typu w zaawansowanym użyciu staje się bardzo zaciemniony. Zauważ, że bez doskonałej znajomości składni nie ma co się zabierać za rozgryzanie jakiegoś niebanalnego algorytmu używającego uogólnień. Programowanie proceduralne jak już to napisałem nie ma najmniejszego sensu gdy istnieje ANSI C. Co do "hierarchicznego", to nie bardzo wiem co przez to rozumiesz.
Zauważ też, że 9/10 rozszerzeń C++0x, to rzeczy, które istnieją w Javie od dość dawna bo od wersji 1.2 (czyli Java 2; dzisiaj mamy 1.6). Mimo to ich wprowadzenie jeszcze bardziej zaciemni składnię czyli będzie skutkować czymś przeciwnym do trendu jaki moim zdaniem powinien być pożądany. Poza tym kolejne wprowadzanie nowych elementów do języka przu utrzymaniu zasady zgodności z każdą wcześniejszą wersją wprowadza niesamowity bałagan.
Dlatego moim zdaniem C++ powoli zacznie przegrywać - może nie tyle z Javą, ale bardziej z C#, który ma większość cech Javy, ale postawiono w nim na efektywność podobną jak C++.

Moim zdaniem powinno się pozostawić C++ w formie takiej jaka jest i od nowa stworzyć efektywny współczesny język o spójnej i bardzo czytelnej składni mający wszystkie współcześnie potrzebne cechy obsługiwane przez kompilator. Mógłby się on nazywać F (chyba kolejna niezajęta litera), albo C+2.

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Ale języka używasz <wow> normalnie niesamowite (moze kiedys też będę taim operował) ;)

Dnia 23.05.2008 o 03:17, Olamagato napisał:

Problem z C++ jest taki, że jego już dzisiaj przestarzała koncepcja jest nie do uratowania.
Zwróć uwagę jaki nieczytelny jest kod źródłowy zaawansowanych programów w C++. Ba, nagłówki
.h są jeszcze bardziej nieczytelne. Dzisiaj nie wystarczy już rzut okiem na kawałek kodu
w C++, żeby łatwo stwierdzić co on robi. A to oznacza, że projekt języka poszedł w maliny.

To dlaczego w c++ robi się tyle różnych aplikacji ? fakt ja zebym zrozumiał co robi program (jak nie mam zapisanej treści co on robi) to czasami musze go uruchomić bo z kodu sie nie rozeznam ,ale myślałem że to normalne.

Dnia 23.05.2008 o 03:17, Olamagato napisał:

> C++ nigdy nie mial byc i nie jest jezykiem obiektowym (:
Miał być. Cały sens tego pierwotnie rozszerzenia C opierał się na udostępnieniu obiektowości.
To było modne i na modelu tamtych czasów zostało zrobione.

A co znaczy obiektowośc ? :D

Dnia 23.05.2008 o 03:17, Olamagato napisał:


> programowanie hierarchiczne, obiektowe, generyczne, czy tez nawet proceduralne ;)
Programowanie uogólnione, które nazywasz generycznym powoduje nieco problemów. Kod tego
typu w zaawansowanym użyciu staje się bardzo zaciemniony. Zauważ, że bez doskonałej znajomości
składni nie ma co się zabierać za rozgryzanie jakiegoś niebanalnego algorytmu używającego
uogólnień. Programowanie proceduralne jak już to napisałem nie ma najmniejszego sensu
gdy istnieje ANSI C. Co do "hierarchicznego", to nie bardzo wiem co przez to rozumiesz.
Zauważ też, że 9/10 rozszerzeń C++0x, to rzeczy, które istnieją w Javie od dość dawna
bo od wersji 1.2 (czyli Java 2; dzisiaj mamy 1.6). Mimo to ich wprowadzenie jeszcze bardziej
zaciemni składnię czyli będzie skutkować czymś przeciwnym do trendu jaki moim zdaniem
powinien być pożądany. Poza tym kolejne wprowadzanie nowych elementów do języka przu
utrzymaniu zasady zgodności z każdą wcześniejszą wersją wprowadza niesamowity bałagan.
Dlatego moim zdaniem C++ powoli zacznie przegrywać - może nie tyle z Javą, ale bardziej
z C#, który ma większość cech Javy, ale postawiono w nim na efektywność podobną jak C++.

Hierarchiczne ,generyczne ,strukturalne ,mozesz przyblizyc te pojęcia ?

Dnia 23.05.2008 o 03:17, Olamagato napisał:

Moim zdaniem powinno się pozostawić C++ w formie takiej jaka jest i od nowa stworzyć
efektywny współczesny język o spójnej i bardzo czytelnej składni mający wszystkie współcześnie
potrzebne cechy obsługiwane przez kompilator. Mógłby się on nazywać F (chyba kolejna
niezajęta litera), albo C+2.


Chciałbys się uczyć nowego języka ,zwłaszcza jakbyś w pracy używał c++ ?

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
Dnia 23.05.2008 o 11:07, Logan10 napisał:

To dlaczego w c++ robi się tyle różnych aplikacji?

Jest mnóstwo osób, które się C i C++ nauczyły. O ile jeszcze w 1985 r. , kiedy się go uczyłem (tzn. C) pojawiały się dopiero pierwsze kompilatory na PC (jeden był nawet na Elwro Juniora, a tak naprawdę pod system CP/M [przodek DOS''a], pod którym Juniory pracowały.
10 lat później w osoby, które nie znały języka C lub C++ były programistycznymi analfabetami.
Język osiągnął sukces, a to oznacza, że większość programistów zna ten język i używa go. Dodatkowo C++ pozwalał na zbudowanie i utrzymanie programu o setkach tysięcy lub nawet milionach wierszy tak, żeby nadal można było się nie pogubić (pod warunkiem rygorystycznego trzymania się pewnych zasad organizacyjnych).

Dnia 23.05.2008 o 11:07, Logan10 napisał:

fakt ja zebym zrozumiał co robi program (jak nie mam zapisanej treści co on robi) to czasami musze go uruchomić

Normalnie czyta się dokumentację, ale jest ona dla większych programów. Małe kilkusetwierszowe programiki można całkowicie rozpoznać przez przeczytanie listingu. Porządnie zaprojektowany język powinien to umożliwiać łatwe odczytywanie i rozumienie co program robi i w jaki sposób.
Na przykład zdaje mi się, że nie ma jeszcze żadnego języka, który umożliwiałby zrozumiałt zapis programu wielowątkowego tak, żeby nie wydawał się on niedeterministyczny (tzn. nieprzewidywalny).

Dnia 23.05.2008 o 11:07, Logan10 napisał:

bo z kodu sie nie rozeznam ,ale myślałem że to normalne.

Jak byś się wgryzł, to byś rozeznał. Ale jest to strasznie czasochłonne. Mogłoby to byc czasochłonne, gdybyś czytał zapis jakiegoś skomplikowanego algorytmu, ale w C++ już nawet proste koncepcje obiektowe (szczególnie z użyciem szablonów) mają fatalnie nieczytelny zapis.

Dnia 23.05.2008 o 11:07, Logan10 napisał:

A co znaczy obiektowośc ? :D

Najkrócej chodzi o powiązanie struktur danych (czyli np. informacji takich jak w bazie danych) z przywiązanym do tych informacji listą/zapisem działań. Na przykład masz obiekt "książka". Możesz ją przeczytać, podrzeć, zostawić, oddać do biblioteki, zeskanować, sprzedać. Zazwyczaj nie możesz nią pływać, trawić, stawiać na głowie, jeździć itd. Obiekty wraz z algorytmami tego co można z nimi zrobić, to koncepcja programowania, które jest o wiele łatwiejsze do zrozumienia i zaprogramowania niż tradycyjne podejście do niego będące zapisem rozkazów do wykonania przez procesor.
Taki zapis rozkazów zazwyczaj nie ma wiele wspólnego z informacją, której obróbki dotyczy, a to powoduje wiele błędów z których najczęstszym jest użycie jakiegoś kawałka algorytmu, do przetworzenia informacji, której on nie powinien obrabiać. Również dużo łatwiej się czyta zapis algorytmu, operującego na danych, które łatwo widzimy bo są "obok".

Dnia 23.05.2008 o 11:07, Logan10 napisał:

Hierarchiczne ,generyczne ,strukturalne ,mozesz przyblizyc te pojęcia ?

Hierarchiczne - nie mam pojęcia bo każdy program poza kodem maszynowym i odpowiednim dla niego asemblerem jest hierarchiczny.
Generyczne - programowanie z użyciem szablonów. Szablony to kawałki kodu, które są dość luźno związane z danymi, które obrabiają. Szablony osłabiają ścisłe powiązanie kodu z danymi stosowane w kodzie obiektowym. Dlatego dość mocno zaciemniają kod i moim zdaniem nie powinno się ich używać szerzej niż dobrze uzasadnione rozszerzanie języka programowania.
Strukturalne - programy, które ewoluowały z prostego kodu maszynowego stawały się coraz większe i coraz trudniej było zapanować nad przetwarzanymi informacjami za pomocą pojedynczych zmiennych globalnych. W tym celu najpierw wprowadzono zmienne lokalne do procedur, a potem gdy to się okazało niewystarczające zaczęto grupować poszczególne zmienne przechowujące różne dane w grupy nazywane strukturami, rekordami lub krotkami.
To z tego okresu właśnie pochodzą wszystkie znane nam dzisiaj relacyjne bazy danych. Koncepcja grupowania prostych informacji w całe ich grupy, które same stawały się jednolitą informacją, to właśnie skutek potrzeb przetwarzania tych danych przez programy. Dopóki języki nie umożliwiały budowania struktur robiono to w ten sposób, że zmiennym należącym do tej samej grupy danych nadawano te same przedrostki, np.:
var auto_liczbakół, auto_kolor, auto_liczbadrzwi, auto_nadwozie, auto_pojemnośćsilnika.. itd.
Łatwiej było wykryć w procedurach dotyczących samochodu, że używana jest zmienna bez przedrostka "auto" i to oznaczało błąd. Poprawny kod działających na kodzie auta musiał używać zmiennych z tym przedrostkiem. Oczywiście nie było to wystarczające, ale działało lepiej niż bez stosowania takiej zasady. Języki strukturalne wprowadzały grupowanie danych jako element zapisu kodu. Postały słowa kluczowe takie jak record lub struct, dzięki którym można było definiować dane jednego rodzaju.
Po kilku latach poszło to jeszcze dalej gdy liczba samych struktur w jednym programie zaczynała przekraczać kilkaset pozycji (wtedy również nazwy struktur musiano grupować za pomocą przedrostków lub przyrostków). Wtedy pojawiła się koncepcja obiektowości, która pozwalała uporządkować struktury i ściśle powiązać je z kodem, który przetwarzał zawartą w nich informację.

Dnia 23.05.2008 o 11:07, Logan10 napisał:

Chciałbys się uczyć nowego języka ,zwłaszcza jakbyś w pracy używał c++ ?

Poniekąd to jest konieczność. Z drugiej strony masz właśnie odpowiedź dlaczego jeżeli jakiś język programowania osiągnie sukces, to ludzie tak trudno przestawiają się na coś nowego. Dla wielu osób wystarczające staje się ograniczanie swoich potrzeb do możliwości języka, albo radzenie sobie z rzeczami nieobsługiwanymi przez język za pomocą różnych sposobów - a to systematyczności, a to sztuczek. Dlatego nikt kto zna Visual Basica nie próbuje za jego pomocą programować sztucznej inteligencji, albo wielkich baz danych. Ogranicza się do tego co umożliwia ten język. Tak samo osoby piszące tylko w C nie robią wielkich projektów bo ten język świetnie sobie radzi przy relatywnie małych programach. Jeżeli większość programistów zna dzisiaj C++ oraz współczesne koncepcje programowania na pewnym poziomie, to nie będą w swoich programach wykraczać zbyt daleko poza możliwości tego języka (bo i możliwości te są dość duże).
Jednak w całej masie zawsze jest pewna niewielka grupa osób, która na kompromisy i prowizorki się nie godzi. I to zwykle ta niewielka grupa doprowadza do powstawania nowych języków coraz lepiej obsługujących nowe potrzeby. Co ciekawe są to najczęściej grupy programistów, którzy do perfekcji opanowali użycie dotychczasowych języków i zdają sobie sprawę, że na tym co jest już nic więcej nie wycisną.
Taki osoby zwykle są elitą w światku informatycznym i ich nazwiska są często dość znane. To oni często wymyślają nowe algorytmy, koncepcje i języki, które stają się standardem. Po jakimś czasie wszyscy studenci muszę się uczyć tego co wymyślili.

W tej chwili najbardziej zaawansowane języki pozwalają na pisanie i utrzymywanie programów o wielu milionach wierszy kodu. Jest to dość kosztowne, ale stworzenie systemów wymagających miliardów i bilionów wierszy kodu jest już poza zasięgiem współczesnych języków (pomijając fakt co, i ile te wiersze kodu potrafią zrobić) ponieważ tak skomplikowane projekty najprawdopodobniej padłyby logistycznie.
Obecnie technika zmusza programistów do pisania kodu współbieżnego, a programy muszą być coraz bardziej skomplikowane (bo rzeczy proste już istnieją i działają), więc Ci muszą sobie z tym radzić. Na przykład pewne podstawowe koncepcje współbieżności istnieją i działają, ale wciąż kod napisany z ich użyciem wydaje się już niedeterministyczny. Co oznacza, że tak naprawdę nie wiadomo jak zachowa się komputer gdy dostanie do przetworzenia różne komplety danych, gdy zależności między nimi to miliardy kombinacji. Wtedy programowanie zaczyna się stawać statystyką lub losowaniem. Być może taka jest naturalna ewolucja przetwarzania informacji - ale tego jeszcze nikt nie wie.

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
Dnia 22.05.2008 o 14:46, Eldven napisał:

Co rozumiesz pod pojęciem "złe programowanie"?

Złe programowanie, to wpojenie nawyków, o których już w obecnych momencie wiadomo, że są albo przestarzałe, albo przeszkadzają poprawnemu programowaniu. To po prostu uczenie się rzeczy o których wiadomo, że znikną lub nie będą już nigdy rozwijane.
Na przykład jakiś czas temu złym programowaniem było nadużywanie instrukcji "goto". Jest to podstawowa instrukcja maszynowa, ale jest ona niezbędna tylko przy programowaniu liniowym (bez użycia procedur - najstarszy sposób programowania, zgodny z językiem procesora maszyny). W programach strukturalnych lub obiektowych gdzie pisany kod w toku ewolucji musiał zastosować się do pewnych zasad - instrukcja goto łamie te zasady. Na przykład przeskakiwanie ze sterowaniem ze środka jednej procedury do środka innej - choć jest możliwe w języku C - jest przykładem niebezpiecznego anachronizmu bo wprowadza całkowity chaos w uporządkowanym za pomocą funkcji kodzie.
Podobnie przykładem złego programowania jest wielokrotne pisanie (kopiowanie) tego samego kodu bo dzisiaj nie jest głównym problemem napisanie kodu, który coś robi, ale pisanie kodu tak aby nie popełniać błędów (które skutkują wadliwymi programami).
Na przykład jeszcze 10 lat temu gdy wprowadzano pierwsze okienkowe środowiska programowania mnóstwo firm i ich programistów piszących tradycyjnie produkowało programy, które co jakiś czas kończyły się wyjątkiem procesora (runtime exception, albo general protect fault). To było skutkiem stosowania przez nich pewnych założeń i nawyków, które nie były prawdziwe w nowym środowisku. Dzisiaj jest znacznie mniej takich programów główne dlatego, że zaczęto używać narzędzi (w tym języków), które eliminują szansę ich pojawienia się w kodzie. Po prostu zauważono, że to człowiek jest największym źródłem błędów i że należy ufać tylko kodowi, który już działa i sprawdził się przez długi czas. Stąd koncepcje wizualnych kontrolek, które są niczym innym jak użyciem sprawnego i działającego kodu napisanego wcześniej.

Dzisiaj złą nauka programowania jest programowanie konsoli tekstowej, o czym wiadomo, że nie będzie to nikomu do niczego przydatne. To samo zadanie nauki można wykonać w środowisku nowoczesnego języka programowania po przyjęciu pewnych założeń i ograniczeń dotyczących zakresu rzeczy do nauczenia. Na przykład jeżeli dzisiaj standardem jest programowanie zdarzeniowe (czyli pisanie procedur reagujących na zdarzenie generowane przez graficzny system operacyjny w reakcji na działanie myszki, klawiatury czy ekranu dotykowego), to nie ma sensu uczyć się programowania konsoli tekstowej. To po prostu strata czasu, a pewne programowe rozwiązania problemów z konsolą stają się nie tylko nieprzydatne w środowisku okienkowym, ale wręcz szkodzą w zrozumieniu bardziej zaawansowanej obsługi tych okienek.

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

>/.../
Hm, dziękuję za wyczerpującą odpowiedź :) W takim razie pozostają tylko 2 możliwości [dla mnie] - uczyć się Javy lub Flasha. Z tego co napisałeś to odpowiedź jest oczywista, jednak - co również napisałeś - Javy trzeba się długo uczyć, a ja nie wiem czy podołam. Dlatego chyba na początek zadowolę się Flashem, później przyjdzie kolej na Jave.

Zastanawia mnie fakt, że skoro tak prosto pisze się programy [tutaj: gry], to czemu jest tak mało dobrych gierek online? Co chwila wychodzi jakaś nowa pozycja, jednak patrząc na poziom trudności ich tworzenia, mogłoby ich być znacznie więcej - może chodzi o coś innego? Może coś źle zrozumiałem? :)

PS Mam 3 złamania w lewej ręce, więc nie będę się tu dużo rozpisywał ;p
PPS Zbliżam się do wyboru studiów i zastanawia mnie, jak wygląda praca informatyka (co dziwne, nie programisty).

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Utwórz konto lub zaloguj się, aby skomentować

Musisz być użytkownikiem, aby dodać komentarz

Utwórz konto

Zarejestruj nowe konto na forum. To jest łatwe!


Zarejestruj nowe konto

Zaloguj się

Masz już konto? Zaloguj się.


Zaloguj się
Zaloguj się, aby obserwować