Zaloguj się, aby obserwować  
Bartuc

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

1979 postów w tym temacie

Dnia 08.03.2008 o 08:07, Doktor14 napisał:

Olamagato - czyli, żeby zacząć choćby raczkować w Javie trzeba się najpierw wziąć
za C? Tak? Czy podczas uczenia się Javy samo to wyniknie???

Java zawiera wszystkie elementy języka C za wyjątkiem operacji na wskaźnikach czyli upraszczając bez dodawania liczb do wskaźników (indeksowania). A wskazania (znowu upraszczając) można utożsamiać z adresami konkretnych zmiennych w pamięci ram. Poza tym wszystko co jest w C (nawet sposób zapisu programu) jest również w Javie.

Natomiast najprawdopodobniej języka C i tak się nauczysz ponieważ jest to język który jest takim wysokopoziomowym odpowiednikiem jednowątkowego assemblera. Szybkość kodu maszynowego po skompilowaniu go z programu w C jest tylko o 20% mniej wydajna od pisania bezpośrednio w assemblerze, za to kolosalnie przyspiesza pisanie kodu. Dlatego C osiągnął taki sukces. Język ten trzeba znać, żeby nauczyć się jak działa pojedynczy wątek/proces w komputerze. W języku C pisze się też 99% kodu sterowników systemowych i połowę jąder systemów.

Język C++, to można dzisiaj powiedzieć taka hybryda C oraz Javy. Pozwala on na wprowadzenie koncepcji obiektowości, a jednocześnie utrzymuje rygor pełnej kontroli nad programem - szczególnie zarządzeniem pamięcią oraz czasem wykonania krytycznych fragmentów programu. Dlatego w tym języku pisze się obecnie większość gier, systemów operacyjnych, sterowników obsługi itp.
Natomiast nie pisze się w nim prawie nic co jest związane z internetem, ani najbardziej zaawansowanych systemów i programów (w tym serwerowych), nie pisze się też prawie żadnego oprogramowania dla komórek bo te dziedziny opanowała Java i języki specjalizowane dla sieci Web takie jak Ruby, PHP itp.

A co do uczenia języków, to dowolny język ludzki zawiera dziesiątki tysięcy słów. Dowolny język programowania zawiera nie więcej niż kilkadziesiąt słów. Język C ma ok. 30, a pochodne od niego nie więcej niż 70. Z czego najczęściej używa się ok. 20.

Dnia 08.03.2008 o 08:07, Doktor14 napisał:

No i co do tej stronki. Na pewno kiedyś będę na tyle zaawansowany w nauce angielskiego

Dobrze jest uczyć się programowania jednocześnie z angielskim. Większość słów kluczowych, to po prostu słowa z języka angielskiego. Np. if = Jeżeli, for = dla, while = dopóki, itd.

Poza tym wbrew pozorom, wiele języków jest do siebie bardzo podobnych. Różnica często polega tylko w nieco innym zapisie i ułatwieniach jakie w nowszym języku istnieją dla bardzo skomplikowanych rzeczy w starszym języku. Na przykład można pisać obiektowo w języku C, albo strukturalnie w oryginalnym języku Basic, ale jest to bardzo trudne i skomplikowane (w pierwszym trzeba tworzyć specjalne struktury tylko dla obsługi obiektów, a w drugim wydzielać z fragmentów kodu procedury i utrzymywać tablicę stosu powrotów dla instrukcji goto).
Dlatego warto uczyć się tych nowszych języków bo potrzeba pisania coraz lepszych programów (i ewolucja komputerów) wymusiła ich powstanie.

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
Dnia 08.03.2008 o 15:08, Doktor14 napisał:

A więc niech będzie "Thinking in Java". Tylko chodziło ci o edycję 4 tak? -----> http://mindview.net/Books/TIJ4

Tak. Kolejne edycje pojawiają się w miarę aktualizowania języka (Java wciąż się rozwija).

Dnia 08.03.2008 o 15:08, Doktor14 napisał:

Nie wiem czy sobie z tym poradzę, ale spróbuję...

Równie dobrze można znaleźc gdzieś w księgarni internetowej lub nawet w bibliotece polską edycję nr 2 (taką mam).

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
Dnia 08.03.2008 o 15:08, Doktor14 napisał:

> /ciach/

A więc niech będzie "Thinking in Java". Tylko chodziło ci o edycję 4 tak? -----> http://mindview.net/Books/TIJ4
Nie wiem czy sobie z tym poradzę, ale spróbuję...


Myślę, że JAVA to dobry wybór.
Jeśli jednak zaczynasz dopiero programowanie, to skup się dokładnie na podstawach obiektowości. Zrozumienie tego jest kluczowe w dalszej nauce, bo inaczej będziesz miał problemy ze zrozumieniem pewnych spraw.

Swoją drogą, ja przygodę z JAVĄ zacząłem po C++ i muszę przyznać, że nauka w takiej kolejności to taka trochę przyjemna sprawa ;) Chodzi mi o to, że z JAVĄ jest już z górki, bo jest bardzo podobna do C++ i jest ''obcięta'' o pewne elementy.

Jednak, jeśli ty zaczynasz dopiero, to idź na skróty i ucz się JAVY, jednak tak jak pisałem, z dużym naciskiem na podstawy. Potem już jakoś to poleci :P

Pozdrawiam

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
Dnia 08.03.2008 o 15:43, Olamagato napisał:

Równie dobrze można znaleźc gdzieś w księgarni internetowej lub nawet w bibliotece polską
edycję nr 2 (taką mam).


A mógłbyś mi podać stronę z ta wersją. Bo jakoś nie mogę tego znaleźć. Z angielską wersją sobie nie radzę jak na razie. A z polską będzie łatwiej i przyjemniej ;]

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
Dnia 09.03.2008 o 19:36, Doktor14 napisał:

A mógłbyś mi podać stronę z ta wersją. Bo jakoś nie mogę tego znaleźć. Z angielską wersją
sobie nie radzę jak na razie. A z polską będzie łatwiej i przyjemniej ;]

Wersja polska nie jest wydaniem internetowym. To normalna papierowa książka, której trzeba szukać w księgarniach lub bibliotekach. Możesz użyć też po prostu internetu.
Sam znalazłem w ofercie Merlina dwie pozycje tego autora dla Javy i C++:
http://merlin.pl/Thinking-in-Java-Edycja-polska-Wydanie-IV_Bruce-Eckel/browse/product/1,482348.html
http://merlin.pl/Thinking-in-C-Edycja-polska_Bruce-Eckel/browse/product/1,306809.html

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Próbowałem napisać prosty program liczący przekątną prostokąta z T. Pitagorasa. Wszystko spoko, tylko nie wiem jak zapisać 1/2 pierwiastka z "a". Próbowałem z użyciem "sqrt" lecz nie wyszło. Język to c++

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
Dnia 03.04.2008 o 22:54, Bartek 93 napisał:

Próbowałem napisać prosty program liczący przekątną prostokąta z T. Pitagorasa. Wszystko
spoko, tylko nie wiem jak zapisać 1/2 pierwiastka z "a". Próbowałem z użyciem "sqrt"
lecz nie wyszło. Język to c++

Umiesz pewnie dołączać pliki nagłówkowe, więc albo

#include <math.h>
ALBO
#include <cmath>
using namespace std;

Obie wersje są możliwe.
i wtedy 1/2 pierwiastka z a to 0.5*sqrt(a)
Pamiętaj, że 1/2 daje 0 (dzielenie liczb całkowitych), więc raczej pisz 1.0/2.0 (albo od razu 0.5)

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

>/.../
---> Jesli nie chcesz tworzyc wlasnego algorytmu pierwiastkowania, mozesz skorzystac z gotowej funkcji z biblioteki math.h (zalaczanej poprzec #include <math.h> albo #include <cmath>), wtedy funkcja sqrt() bedzie dzialac.

EDIT: Ech, jak zwykle zapomnialem odswiezyc strone ;)

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Przykład w Javie. Generowanie liczb pierwszych.

class LiczbyPierwsze
{
final static short BITS = 18; //liczymy liczby pierwsze mieszczące się w tylu bitach
final static int MAX = (1 << BITS) - 1; //wartość (2^BITS) - 1

//tablica masek do eliminacji liczb podzielnych przez wielokrotności 2
final private int[] maska = new int[BITS];

//tablica znajdowanych liczb pierwszych
private int[] pierwsza = new int[(MAX + 1) >> 3]; //średnio co 8..10 liczba jest pierwsza

private int liczba = 0, znalezione = 0;

LiczbyPierwsze()
{ //przygotowanie masek
maska[0] = 1;
for( int m = 1; m <= maska.length - 1; ++m )
{ //kolejne maski 2^n-1 (1,3,7,15,31,...)
maska[m] = (maska[m - 1] << 1) | 1;
}
}

final public int znalezione() { return znalezione; }

final private boolean podzielnaPrzezDwójkowe(int liczba)
//Sprawdzamy czy liczba dzieli się przez wielokrotność 2
{
for( int l = 0; liczba > maska[l] && l < maska.length; ++l)
if( (liczba & maska[l]) == 0 )
return true;
return false;
}

public int następna()
{
int podzielna, wartownik;

następna:
for( ++liczba; liczba < MAX; ++liczba )
{
switch(liczba)
{
case 1: case 2: case 3: break; //początkowe znane liczby pierwsze
default:
//eliminujemy wielokrotności 2
if( podzielnaPrzezDwójkowe(liczba) )
continue następna;
//dzielimy liczbę przez kolejne znalezione liczby pierwsze (od 3),
//aż do dojścia do 1/3 wartości sprawdzanej liczby
for(podzielna = 2, wartownik = liczba / 3;
pierwsza[podzielna] <= wartownik; ++podzielna)
if( liczba % pierwsza[podzielna] == 0 )
continue następna;
}
return pierwsza[znalezione++] = liczba; //pierwsza
}
return 0;
}
}

class Wykonanie
{
static private long xstart = 0, xend = 0;
static public void start() { xstart = System.currentTimeMillis(); }
static public void stop() { xend = System.currentTimeMillis(); }
static public double czas() { return (double)(xend - xstart) / 1000; }
}

public class Main
{
final String SP=" ";
final int WWIERSZU = 10;

public static void main(String[] args)
{
LiczbyPierwsze l = new LiczbyPierwsze();

int liczba, wypisana = 0;
System.out.println("Liczby Pierwsze:");

Wykonanie.start();
while( (liczba = l.następna()) != 0 )
{
System.out.print(liczba + SP);
if(++wypisana % WWIERSZU == 0)
System.out.println();
}
Wykonanie.stop();
System.out.println("\nKoniec programu." + Wykonanie.czas() );
System.out.println( "Wszystkie znalezione liczby pierwsze: " + l.znalezione() );
}
}

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
Dnia 03.04.2008 o 23:15, Vel Grozny napisał:

> Próbowałem napisać prosty program liczący przekątną prostokąta z T. Pitagorasa.
Wszystko
> spoko, tylko nie wiem jak zapisać 1/2 pierwiastka z "a". Próbowałem z użyciem "sqrt"

> lecz nie wyszło. Język to c++
Umiesz pewnie dołączać pliki nagłówkowe, więc albo

#include <math.h>
ALBO
#include <cmath>
using namespace std;

Obie wersje są możliwe.
i wtedy 1/2 pierwiastka z a to 0.5*sqrt(a)
Pamiętaj, że 1/2 daje 0 (dzielenie liczb całkowitych), więc raczej pisz 1.0/2.0 (albo
od razu 0.5)

Dzięki wielkie, działa bez problemu :)

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Zaczynam uczyć sie w c++ i mam takie pytanie:
Robię lamerski program w którym mam podać liczbe definiującą ilość gwiazdek któe mają wyświetlić sie na ekranie.No i kiedy po
while(a)
{
cout<<"*";

nic nie wpisze to jest nieskończenie wiele gwiazdek po uruchomieniu.
A kiedy wpiszę a=a-1 to już tyle ile być powinno, ale nie rozumiem dlaczego trzeba to wpisać .Oświećcie mnie.

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Logan10

Pętla while działa następująco:
while(warunek)
{ ...co ma się wykonać}
gdy warunek jest różny od 0 to pętla się wykonyje, jej przerwanie następuje w momencie dojścia warunku do 0. Dlatego u Ciebie warunek wynosi ileś i póki nie będziesz go zmniejszał w pętli to pętla nie osiągnie momentu w którym ma się przerwać.

W twoim programie lepiej było by zastosować pętlę odliczającą for:
for (i=0,i<a,i++) {
ciało pętli }
działa ona tak: bierze wartość i podaną przed pierwszym przecinkiem (w tym wypadku zero), następnie sprawdza warunek (i<a) i dopóki jest spełniony się wykonuje, po każdym wykonaniu zwiększa wartość i o 1 (i++). Czyli w tym wypadku po każdym wykonaniu pętla zwiększy wartość o 1 i będzie się wykonywała od i zero do i=a-1 czyli a razy.

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Aha rozumiem.
Jeszcze jedno ,mam program (fragment kodu pod spodem) i kiedy zmieniam char na int to pojawia mi sie tekst który ciągnie się w dół bez końca.Czy char służy do wyrażania tekstu ? i jełśli tak to gdyby chodziłoby o cyfry to czy mógłbym użyć int ?

int main()
{
char litera;
do{
cout<<"Napisz jakas literke: \n";
cin>>litera;
cout<<"Napisales"<<litera<<"\n";
}
whi le(litera!=''K'');
cout<<"\n Skoro napisales K to konczymy !";

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Zmienna typu char przechowuje pojedyncze znaki. Jeśli chcesz zamienić w swoim programie int na char tak, aby potem wszystko działało (wypisywało literkę), to musisz zrobić rzutowanie. Na wejściu podajesz wtedy liczbę z zakresu 65 - 90 (dla dużych liter) lub 97 - 122 (dla małych liter). Program zakończy się gdy wpiszesz liczbę odpowiadającą w kodzie ASCII literze K, czyli 75. Poczytaj trochę o tym kodzie, jeśli chcesz wiedzieć skąd się wzięło to, o czym napisałem.
Ponizej masz kod programu.

#include <iostream>
using namespace std;

int main()
{
int litera;

do
{
cout << "Napisz jakas literke: ";
cin >> litera;
cout << "Napisales " << char(litera) << "\n\n";
}
while (char(litera) != ''K'');

cout << "Skoro napisales K to konczymy!\n";

system("pause");
return 0;
}

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Ale podałeś na wejściu literę, czy liczbę jej odpowiadającą w kodzie ASCII? W tym pierwszym przypadku pętla będzie kręcić się w nieskończoność.

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ć