Skocz do zawartości
  • 👋 Witaj na MPCForum!

    Przeglądasz forum jako gość, co oznacza, że wiele świetnych funkcji jest jeszcze przed Tobą! 😎

    • Pełny dostęp do działów i ukrytych treści
    • Możliwość pisania i odpowiadania w tematach
    • System prywatnych wiadomości
    • Zbieranie reputacji i rozwijanie swojego profilu
    • Członkostwo w jednej z największych społeczności graczy

    👉 Dołączenie zajmie Ci mniej niż minutę – a zyskasz znacznie więcej!

    Zarejestruj się teraz

Poczatek kariery z c++ (Czkawka aka mega amator).


Rekomendowane odpowiedzi

Opublikowano

Jou.

Dwa dni temu postanowiłem, że rozpocznę naukę programowania w języku c++ pod windows'a.

Koledzy stanowczo odradzali mi ten język dla takiego amatora, jak ja - jednak nie lubię łatwych sukcesów, dlatego zdecydowałem się to pociągnąc.

Postanowiłem także, że wszystkie swoje "programy", będę publikował - padło na mpc :C.

Z programowaniem miałem już niewielką stycznosc (php, autoit), poza tym jestem koderem webowym i poza (x)html i css nie zagłębiałem się w nic innego.

Bez zbędnego zanudzania. Proszę o komentarze, rady, sugestie i surowe oceny :).

Nowe programy postaram się wrzucac codziennie po minimum jednym.

 

 

 

1. Kalkulator (drugie odpalenie CodeBlocks'a).

Download: http://niunio.ugu.pl.../kalkulator.exe

Skan: http://virusscan.jot...a79d23c627440ad

Kod źródłowy: http://wklej.to/IVSC6

 

2. Kalkulator ver 2.

Download: http://niunio.ugu.pl...alkulatorv2.exe

Skan: http://virusscan.jot...413d38aedd89b28

Kod źródłowy: http://wklej.to/Ucmwg

Link do postu: http://www.mpcforum....r/#entry5077586

 

3. Gra w "zgadywankę".

Download: http://niunio.ugu.pl.../zgadywanka.exe

Skan: http://virusscan.jot...f0b80a6bdcc6f51

Kod źródłowy: http://wklej.to/TIsPE

Link do postu: http://www.mpcforum....r/#entry5088354

 

4. Nauka pisania bez patrzenia na klawiature ver 1.

Download: http://niunio.ugu.pl/cpp/pisanie.exe

Skan: http://virusscan.jot...960ffe709ba9f1a

Kod źródłowy: http://wklej.to/z7Wq7

Link do postu: http://www.mpcforum.pl/topic/702054-poczatek-kariery-z-c-czkawka-aka-mega-amator/#entry5620459

Opublikowano

Tak jak napisał u góry kolega, zabezpiecz przed wpisywanie np. 0 przy dzieleniu. Dodaj więcej opcji np. obliczanie pierwiastków, potęg.

Opublikowano

Jak na pierwszy program - całkiem fajnie. Wszystko elegancko, dobrze opisane :). Do switcha mogłeś dać jakąś pętlę, która wykonuje się dopóki nie wprowadzisz poprawnego znaku (+,-,/,*).


Pomagam w projektach dotyczących programowania (C++/C/Java/C#/inne). Jak masz jakiś problem, napisz do mnie, wspólnie poszukamy rozwiązania ;).

Opublikowano

w switchu nie musisz robic np tak:

 

case 45:

 

możesz :

 

case '+':

 

(bardzo ważne są apostrofy, nie mogą to być cudzysłowy " )

Zamykam temat, bo autor nie trzyma poziomu.

....

Polityka forum zakazuję nam zamykać tematy, tylko dlatego, że są na niskim poziomie.

I lold.
Opublikowano

w switchu nie musisz robic np tak:

 

case 45:

 

możesz :

 

case '+':

 

(bardzo ważne są apostrofy, nie mogą to być cudzysłowy " )

 

To wyjasnij mu odrazu dlaczego ;)

 

Miedzy apostrofami ' ' umieszcza sie zawsze pojedynczy znak ktory jest interpretowany jako 1 kod ascii. Miedzy cudzyslowami " " dajemy ciagi znakow, zdania, itp. Roznica jest rowniez taka ze dajac nawet pojedynczy znak "a" beda to tak naprawde 2 znaki poniewaz kazdy ciag znakow musi byc zakonczony znakiem \0 czyli konca ciagu.

 

Do tego tak przegladajac kod 2 uwagi. W zaleznosci od kompilatora, ale w wiekszosci long int i int maja taki sam rozmiar (4 bajty), wiec wystarczy napisac int. Dopiero long long int jest wiekszy.

 

Jako nowa linie lepiej uzywac \n niz endl, poniewaz endl wywoluje rowniez flush ktory czysci bufor, wiec jesli nie potrzbujesz tego robic, to lepiej uzyc \n, ktory wykona sie szybciej.

Opublikowano
To wyjasnij mu odrazu dlaczego ;)

Jak już wspomniałem, mam jakieś pojęcie o programowaniu i tak podstawowe rzeczy umiem.

 

 

 

@Topic:

Dziękuję za wszelkie propozycje. Zamieszczam poprawioną wersję. Przy okazji pytanie amatora...

Jak zrobic, aby pętla do-while miała więcej niż jeden warunek?

do
	 {
zn = getch();
	 } while (zn != '43 or zn != 45);

 

Potrzebne jest mi to do sprawdzenia poprawności znaku, aby pętla zadziałała tak, jak ja chce musiałby byc 1 warunek końcowy:

while (zn != '+');

Natomiast potrzebuję takowych kilka. Jakieś propozycje?

Przesiedziałem nad tym lekko ponad godzinę, nie wiedziałem, jak zrobic to sprawdzanie znaku, aż w końcu coś mnie tchnęło i wymyśliłem :D.

Zamiast tego:

do
	 {
		 zn = getch();
	 } while (zn != '43 or zn != 45 or zn != 42 or zn != 47);

 

Zrobiłem tak:

do
	 {
		 zn = getch();
		 if (zn == 43 || zn == 45 || zn == 42 || zn == 47)
		 {
			 blad = 0;
		 }
		 else
		 {
			 blad = 1;
		 }
	 } while (blad != 0);

Dodatkowo musiałem trochę poczytac o metodach cin.good(), cin.fail(), cin.sync() i cin.clear(). Całosc zajęła mi około 1,5 godziny.

 

Anyway...

 

2. Kalkulator ver 2.

Download: http://www20.zippysh...50272/file.html

Skan: http://virusscan.jot...413d38aedd89b28

Kod źródłowy: http://wklej.to/Ucmwg

Opublikowano

To wyjasnij mu odrazu dlaczego ;)

 

Miedzy apostrofami ' ' umieszcza sie zawsze pojedynczy znak ktory jest interpretowany jako 1 kod ascii. Miedzy cudzyslowami " " dajemy ciagi znakow, zdania, itp. Roznica jest rowniez taka ze dajac nawet pojedynczy znak "a" beda to tak naprawde 2 znaki poniewaz kazdy ciag znakow musi byc zakonczony znakiem \0 czyli konca ciagu.

 

Do tego tak przegladajac kod 2 uwagi. W zaleznosci od kompilatora, ale w wiekszosci long int i int maja taki sam rozmiar (4 bajty), wiec wystarczy napisac int. Dopiero long long int jest wiekszy.

 

Jako nowa linie lepiej uzywac \n niz endl, poniewaz endl wywoluje rowniez flush ktory czysci bufor, wiec jesli nie potrzbujesz tego robic, to lepiej uzyc \n, ktory wykona sie szybciej.

 

O to tak straszne, że endl czyści buffor! Ma to naprawdę ogromne znaczenie. Dlaczego ogromne ? Ponieważ trwa o 10 mls dłużej niż \n, co w wypisywaniu tesktu na konsole ma ogromne znaczenie.

A tak na poważnie: śmieszą mnie te głupie 'zasady' jak "nie używaj system bo Ci się nie skompiluje na linuxie !!1", "using namespace jest złe ! boo... sam nie wiem".

 

A co do pierwszej części Twojej wypowiedzi:

 

wyrażenie "a" nie jest tak naprawdę znakiem ascii tylko... liczbą 32/64 bitową ! tak samo jak "adsad adad a adas" !

 

 

A co do calcv2.

Nie rozumiem, to Ci się skompilowało ? Jak można nazwać zmienną samą samymi cyframi o.O

Zamykam temat, bo autor nie trzyma poziomu.

....

Polityka forum zakazuję nam zamykać tematy, tylko dlatego, że są na niskim poziomie.

I lold.
Opublikowano

@UP O co ci chodzi? O tą zmienną?

l1

Przecież to jest małe "L" i 1 ;).

 

A co do kodu, to myślałem tą pętle inaczej zrobić, ale tak też jest dobrze.


Pomagam w projektach dotyczących programowania (C++/C/Java/C#/inne). Jak masz jakiś problem, napisz do mnie, wspólnie poszukamy rozwiązania ;).

Opublikowano

Wiecej niz jeden warunke mozesz otrzymac przez zwykle warunki logiczne and, jak wiadomo jesli ktorys z czlonow bedzie falszywy to calosc tez da 0.

 

wyrażenie "a" nie jest tak naprawdę znakiem ascii tylko... liczbą 32/64 bitową ! tak samo jak "adsad adad a adas" !

WRONG

 

 

Po pierwsze nie napisalem ze 'a' jest znakiem ascii, a ze jest interpretowane jako kod ascii, ktory jak wiadomo jest czym? liczba calkowita

 

Kolejna rzecz ciag znakow ujety w " " nie jest wcale liczba 32/64 bitowa, nie mowiac juz ze wszystkie kody ascii sa typu calkowitoliczbowego(char 0-255). Taki ciag zwraca nam wskaznik na obszar pamieci, gdzie wskaznik ten wskazuje na pierwszy element tego ciagu a kazdy nastepny jest od niego oddalony o adr bazowy+ i*sizeof(CHAR) jako ze jest to tablica charow i tak sa interpretowane wszelkie znaki. Wcale nie jako int, a jako char. CHAR != INT. Char zajmuje 1 bajt a int 4 bajty roznica znaczaca, i zapis w pamieci rowniez. Nie wprowadzaj w blad.

 

Co do optymalizacji i czasu wykonania przez endl, to teraz zalozmy ze wypisujesz bardzo duze porcje danych, to oczywiscie ze to spowolni znaczaco wykonanie. Niech sie uczy dobrych nawykow od poczatku.

 

Zapraszam na pl.spoj.pl, zobaczysz tam jak bardzo wazne sa tego typu pierdolki kiedy twoj kod wykonuje sie kilkaset tysiecy razy i masz limit czasowy wykonania algorytmu.

Opublikowano
wyrażenie "a"

 

Taki ciag zwraca nam wskaznik na obszar pamieci

 

"wskaźnik pamięci" ma 32/64 bity (a przynajmiej na obecnych osobistych komputerach)

 

gdzie wskaznik ten jest pierwszym elementem

Wskaźnik nie jest pierwszym elementem o.O

 

Co do optymalizacji i czasu wykonania przez endl, to teraz zalozmy ze wypisujesz bardzo duze porcje danych, to oczywiscie ze to spowolni znaczaco wykonanie. Niech sie uczy dobrych nawykow od poczatku.

 

I właśnie dlatego nie używamy konsoli do wypisywania bardzo dużych porcji danych, bo z endl, czy \n jest wolneee.

 

A co do spoju - słuszna uwaga. Teraz wszyscy i zawsze używajmy \n ponieważ na jakimś jednym portalu to się przydaje !

Zamykam temat, bo autor nie trzyma poziomu.

....

Polityka forum zakazuję nam zamykać tematy, tylko dlatego, że są na niskim poziomie.

I lold.
Opublikowano
"wskaźnik pamięci" ma 32/64 bity (a przynajmiej na obecnych osobistych komputerach)

Skrot myslowy... dane pod wskaznikiem, konkretniej dane wyluskane z adresu w pamieci na jaki wskazuje wskaznik(starczy?). Jak sama nazwa mowi na cos musi wskazywac.

Wszelkie wskazniki sa umieszczane na stosie wiec maja 4 bajty, ale nie mozna powiedziec jak kolega wyzej ze nie jest znakiem a liczba 32/64 bitowa, jesli jest jakas liczba to 8 bitowa bo tak sa chary reprezentowane.

 

Wskaźnik nie jest pierwszym elementem o.O

j.w.

A co do spoju - słuszna uwaga. Teraz wszyscy i zawsze używajmy \n ponieważ na jakimś jednym portalu to się przydaje !

spojA jesli juz odmieniac chcesz. To byl przyklad, bo wiele jest tego typu pierdol, ktore potem przeoczy, bo nie wiedzia/pomyslal i bedzie sie glowil czemu to tak wolno dziala? Spoj nie jest "jednym portalem gdzie to sie przydaje", wiele jest takich stron testujacych umiejetnosci. Przy wiekszych projektach, tez sie to przyda. Na pewno podejscie typu, a co tam uzyje co mi sie podoba, niewazne czy bedzie szybko dzialac czy wolno nie jest dobre. Jakosc kodu tez jest oceniana, czy to przez wynikowe czasy na takich stronach czy przez pracodawcow.

Opublikowano

nie zmienia to faktu że wyrażenie "a" oznacza POINTER czyli liczbe 32/64 bitową.

 

Wszelkie wskazniki sa umieszczane na stosie wiec maja 4 bajty,

 

WTF ? ośmieszasz sie bro.

Zamykam temat, bo autor nie trzyma poziomu.

....

Polityka forum zakazuję nam zamykać tematy, tylko dlatego, że są na niskim poziomie.

I lold.
Opublikowano

nie zmienia to faktu że wyrażenie "a" oznacza POINTER czyli liczbe 32/64 bitową.

 

 

 

WTF ? ośmieszasz sie bro.

 

No chyba ty...

 

Kazda zmienna,stala,itd. zainicjowane w programie sa umieszczana na stosie, ktory zostal na potrzeby danego programu utworzony(stos lokalny). Jako ze kazdy element na stosie musi miec 4 bajty, wiec jesli jest mniejszy jest do nich dopelniany tak wiec, wskazniki umieszczane na nim rowniez maja 4 bajty.

 

Jedynie dane alokowane dynamicznie dzialaja inaczej, bo dostajemy wskaznik, ktory tez jest odkladany na stos, ale wskazuje on na adres gdzies na stercie.

Opublikowano

O to tak straszne, że endl czyści buffor! Ma to naprawdę ogromne znaczenie. Dlaczego ogromne ? Ponieważ trwa o 10 mls dłużej niż \n, co w wypisywaniu tesktu na konsole ma ogromne znaczenie.

A tak na poważnie: śmieszą mnie te głupie 'zasady' jak "nie używaj system bo Ci się nie skompiluje na linuxie !!1", "using namespace jest złe ! boo... sam nie wiem".

 

A co do pierwszej części Twojej wypowiedzi:

 

wyrażenie "a" nie jest tak naprawdę znakiem ascii tylko... liczbą 32/64 bitową ! tak samo jak "adsad adad a adas" !

 

 

A co do calcv2.

Nie rozumiem, to Ci się skompilowało ? Jak można nazwać zmienną samą samymi cyframi o.O

 

A podstawowe znaki ASCII nie mieszczą się przypadkiem w 1 bajcie (8 bitach)?

Poza tym "a" jest znakiem ASCII.

 

@top

 

Używaj

 "\n"

zamiast endl, podobno lepsze.

 

Przykład:

std::cout << "Dupa jasiu\nkaruzela";

zamiast:

std::cout << "Dupa jasiu" << endl << "karuzela";

 

inne przykłady:

cout << 1 << "\n" << 2;

cout << 1 << "\n";
cout << 2;

cout << 1;
cout << "\n" << 2;

Smutek to skutek chęci w kontekście skutku

raczej niefrasobliwej wzglądu o treści zgryźliwej

ma postać walca co jeździ nam po palcach.

Opublikowano

No chyba ty...

 

Kazda zmienna,stala,itd. zainicjowane w programie sa umieszczana na stosie, ktory zostal na potrzeby danego programu utworzony(stos lokalny). Jako ze kazdy element na stosie musi miec 4 bajty, wiec jesli jest mniejszy jest do nich dopelniany tak wiec, wskazniki umieszczane na nim rowniez maja 4 bajty.

 

Jedynie dane alokowane dynamicznie dzialaja inaczej, bo dostajemy wskaznik, ktory tez jest odkladany na stos, ale wskazuje on na adres gdzies na stercie.

 

Nie masz pojęcia o czym mówisz chłopcze. Skończ waść, wstydu oszczędź.

 

 

Wszelkie wskazniki sa umieszczane na stosie wiec maja 4 bajty,

 

Czyli uważasz że powodem dla którego wskaźniki mają 4 bajty, jest to że są umieszczane na stosie ?

 

Stała umieszczana na stosie ?

 

mov eax, [0400000] ; stała do eax
call eax                    ; uzycie stalej jak pointer do jakiejs funkcji

 

Stałe nie są umieszczane na stosie, aczkolwiek mogą być, lecz ABSOLUTNIE nie muszą. Taki jest właśnie sens stałych. Są stałe, a stos bynajmniej.

 

@up

Tak, w pewnym sensie "a" to jest znak a, ale dla kompilatora coś takiego: "a" , jest WSKAZNIKIEM do ciągu znaków. To nie jest char, tylko char*.

Zamykam temat, bo autor nie trzyma poziomu.

....

Polityka forum zakazuję nam zamykać tematy, tylko dlatego, że są na niskim poziomie.

I lold.
Opublikowano

Stałe nie są umieszczane na stosie, aczkolwiek mogą być, lecz ABSOLUTNIE nie muszą. Taki jest właśnie sens stałych. Są stałe, a stos bynajmniej.

 

Zalezy od kompilatora. Wiekszosc podmieni bezposrednio na to co zostalo przypisane, ale nie kazdy kompilator musi tak zrobic. Chodzilo mi o wskazanie czego innego, ale prosze czepiaj sie slowek dalej, widac ze szukasz tylko...

 

To dlaczego wskazniki maja akurat taka wielkosc to juz inna sprawa.

Opublikowano

Po prostu: "a" to wskaźnik i zrozum to wreszcie. Widzę że nie potrafisz przyznać się do błędu.

Zamykam temat, bo autor nie trzyma poziomu.

....

Polityka forum zakazuję nam zamykać tematy, tylko dlatego, że są na niskim poziomie.

I lold.
Opublikowano

Kolejna rzecz ciag znakow ujety w " " nie jest wcale liczba 32/64 bitowa, nie mowiac juz ze wszystkie kody ascii sa typu calkowitoliczbowego(char 0-255). Taki ciag zwraca nam wskaznik na obszar pamieci, gdzie wskaznik ten wskazuje na pierwszy element tego ciagu a kazdy nastepny jest od niego oddalony o adr bazowy+ i*sizeof(CHAR)....

 

Czytanie ze zrozumieniem kuleje? Czy ja napisalem ze nie jest?

Opublikowano
Cytat

 

 

wyrażenie "a" nie jest tak naprawdę znakiem ascii tylko... liczbą 32/64 bitową ! tak samo jak "adsad adad a adas" !

WRONG

Czym jest wskaźnik jak nie liczbą 32/64 bitową, geniuszu ? Naucz mnie.

Zamykam temat, bo autor nie trzyma poziomu.

....

Polityka forum zakazuję nam zamykać tematy, tylko dlatego, że są na niskim poziomie.

I lold.
Opublikowano

Czym jest wskaźnik jak nie liczbą 32/64 bitową, geniuszu ? Naucz mnie.

 

Nie mowi sie ze wskaznik to jest po prostu liczba. Wiadomo ze wskazuje na jakis adres wiec musi to byc jakas liczba typu 0x..., ale takie mowienie ze wskaznik to po prostu liczba jest bardzo mylace dla poczatakujacego. Potem bedzie probowal do wskaznika przypisac sobie 152 i dostanie WTF, bo wskazniki traktujemy jako adresy. int jest liczba nie adresem.

 

int a int* to 2 rozne rzeczy i chociaz moga byc okreslane przez takie same rzeczy to nie nalezy mowic ze "robia" to samo

Opublikowano

@TOPIC

http://www.mpcforum.pl/topic/621921-tut-source-kalkulator-w-c/

Tu masz dwa gotowce. Pragmatyczny i dla podbudowania ego.

 

 

-----------------------------------

 

Ogarnijcie flamewar. Trochę pokory; tak nie wygląda zdrowa dyskusja.

 

 

"W zaleznosci od kompilatora, ale w wiekszosci long int i int maja taki sam rozmiar (4 bajty), wiec wystarczy napisac int. Dopiero long long int jest wiekszy."

http://klub.chip.pl/b.krzemien/c++-faq/newbie.html#faq-29.5

 

 

Czy ciąg ujęty w " " jest liczbą?

A czy drogowskaz "Warszawa 320km" jest toższamy z liczbą kilometrów? Nie, drogowskaz jest cholernym drogowskazem.

Pointer to nie liczba. Adres jest reprezentowany przez 32/64 bitową liczbę. A to i tak tylko w najpopularniejszych implementacjach procesorów (systemów? nie jestem pewny od czego to zależne).

Zaś pointer to pointer.

Aha, to bardzo łatwo sprawdzić: "assert(typeid(char*)==typeid(int));"

 

sizeof(char) == 1. Zawsze.

 

I nie, char nie musi mieć ośmiu bitów.

http://klub.chip.pl/b.krzemien/c++-faq/intrinsic-types.html#faq-26.4

 

Ta sygnatura jest pusta.

Opublikowano
FAKT

"Przypisał do wskaźnika 152 ponieważ na mpc powiedzieli mu że wskaźnik to liczba"

 

Już zrozumiałeś że wyrażenie "a" nie jest jest charem (czyli jak wspomninałeś

, ale nie mozna powiedziec jak kolega wyzej ze nie jest znakiem a liczba 32/64 bitowa, jesli jest jakas liczba to 8 bitowa bo tak sa chary reprezentowane.

liczbą 8 bitową ).

 

Tylko wskaźnikiem, czyli liczbą 32/64 bitową ?

 

@up:

Czy ciąg ujęty w " " jest liczbą?

 

Ciąg ujęty ? Ja mówie o wyrażeniu "a", czyli o ciągu znaków w cudzysłowach. Takie wyrażenie jest pointerem.

 

"Pointer to nie liczba. Adres jest reprezentowany przez 32/64 bitową liczbę." Widze tu pewną sprzeczność....

Przecież pointer to adres A adres to liczba.

 

ad flame:

To nie moja wina że ten łoś nic nie rozumie.

Zamykam temat, bo autor nie trzyma poziomu.

....

Polityka forum zakazuję nam zamykać tematy, tylko dlatego, że są na niskim poziomie.

I lold.
Opublikowano

Już zrozumiałeś że wyrażenie "a" nie jest jest charem (czyli jak wspomninałeś

liczbą 8 bitową ).

 

Tylko wskaźnikiem, czyli liczbą 32/64 bitową ?

 

@up:

 

 

Ciąg ujęty ? Ja mówie o wyrażeniu "a", czyli o ciągu znaków w cudzysłowach. Takie wyrażenie jest pointerem.

 

"Pointer to nie liczba. Adres jest reprezentowany przez 32/64 bitową liczbę." Widze tu pewną sprzeczność.....

 

ad flame:

To nie moja wina że ten łoś nic nie rozumie.

 

Sry ale losia to ty widzisz jak w lustro patrzysz chyba...

 

Nie musza sie przed toba tlumaczyc bo co jest czym to ja wiem. Jesli mowilem o reprezentacji char to wiadomo ze o konkretnych znakach na jakie wskazuje dany wskaznik. Zaden programista nie bedzie az tak precyzowal swoich wypowiedzi, bo kazdy inny zrozumie o co mu chodzilo, ale widze ze taki łoś jak ty lubi sie po prostu czepiac, chociaz wie o co chodzilo w danej wypowiedzi.

 

Grow up kiddo...

Opublikowano
"Pointer to nie liczba. Adres jest reprezentowany przez 32/64 bitową liczbę." Widze tu pewną sprzeczność....

Przecież pointer to adres A adres to liczba.

 

http://ideone.com/uv81H

Proszę, SpecjalnieDlaCiebie.

Wydawało mi się, że argument przez typeid był dostatecznie dobry.

 

@EDIT

Zaś tutaj kompilujący się kod.

Mam nadzieję, że różnica jest klarowna.

http://ideone.com/40tU0

Ta sygnatura jest pusta.

Zarchiwizowany

Ten temat przebywa obecnie w archiwum. Dodawanie nowych odpowiedzi zostało zablokowane.

×
×
  • Dodaj nową pozycję...