GRY-Online.pl --> Archiwum Forum

Programowanie w C/C++ i nie tylko ------ dla laików i ekspertów [cz.5]

11.06.2005
20:41
smile
[1]

KULL [ Gladiator ]

Programowanie w C/C++ i nie tylko ------ dla laików i ekspertów [cz.5]

cout >> " ...............[Przydatne strony]............... ";

cout >>"[PL]";

[!!!] https://www.keeller.kompozytor.net/ [Kurs C++]
[!!!] https://www.physd.amu.edu.pl/~tomekkaz/ [Podstawy C++]
[!!!] https://3miasto.net/~chq/ [Kurs C++]
[!!!] https://www.avocado.risp.pl/ [m.in. kursy C++: /pliki do pobrania/teksty/.../]
[!!!] https://www.kursc.terramail.pl/kursc/ [Kurs C++]
[!!!] https://jdomaradzki.republika.pl/cw.html [materiały o C++ z Politech. Wroc.]
[!!!] https://www.playcom.republika.pl/ [duzo ciekawych, gotowycgh programow (pascal i c++) ]

https://stud.wsi.edu.pl/~webber/czarny/?link=cpp
https://jdomaradzki.republika.pl/cw.html [materiały o C++ z Politech. Wroc.]
https://www.phys.uni.torun.pl/~kgrabcze/zajecia/
https://www.elektronet.prv.pl/
https://www.intercon.pl/~sektor/cbx/

https://stud.wsi.edu.pl/~sistudem/ [Podstawy C++]
https://lisek99.w.interia.pl/ [Programowanie w C/C++ pod DOS, WIN, LINUX]
https://maczek.info.bielsko.pl/~zbiju/ATH/ [Ciekawe rzeczy do ściągnięcia]
https://www.sztolnia.pl/?p=faq_pcp
https://www.algorytm.cad.pl/
https://www.republika.pl/piotrciskowski/dydaktyka/materialy.zima.htm#Informatyka3L
https://sprocket.ict.pwr.wroc.pl/~jablonski/
https://www.wemif.pwr.wroc.pl/labc/


cout >>"[ANG]";

https://www.gametutorials.com/Tutorials/c++/Cpp_Pg1.htm
https://www.cprogramming.com/cgi-bin/source/source.cgi




cout >> " ...............[DOWNLOAD]............... ";

https://sourceforge.net/projects/dev-cpp/ //(Dev-C++ 4.9.9.0 PL - kompilator C/C++)
https://www.webhostgalaxy.com/mirrors/eckelbooks/TICPP-2nd-ed-Vol-two.zip // "Thinking in C++" Tom 2
https://www.webhostgalaxy.com/mirrors/eckelbooks/TICPP-2nd-ed-Vol-one.zip // "Thinking in C++" Tom 3
https://www.webhostgalaxy.com/mirrors/eckelbooks/ // Darmowe pubikacje elektroniczne o programowaniu
https://www.wemif.pwr.wroc.pl/labc/labc/lab1/lab1a.html //Borland C++ 3.1




cout >> " ...............[Literatura programisty]............... ";

Symfonia C++ J.Grębosza
Pasja C++ J.Grębosza
Mój pierwszy program wydawnictwa HELP
Książeczka "Programowanie w C++" od Komputer Swiat - Dla BARDZO początkujących

(https://www.komputerswiat.pl/informacje/archiwum/bk0105.html)
"C++ Styl Programowania" Tom'a Cargill'a.
"Język ANSI C" Kernighan, Ritchie.



cout >> " ...............[Poprzednie wątki]............... ";

[1] https://forumarchiwum.gry-online.pl/S043archiwum.asp?ID=3073834&N=1
[2] https://forumarchiwum.gry-online.pl/S043archiwum.asp?ID=3124999&N=1
[3] https://forumarchiwum.gry-online.pl/S043archiwum.asp?ID=3228514&N=1
[4] https://forumarchiwum.gry-online.pl/S043archiwum.asp?ID=3620101&N=1

11.06.2005
20:49
smile
[2]

KULL [ Gladiator ]

a moze maly konkurs na nowa nazwe watku ?? :)

Programowanie w C/C++ i nie tylko ------ dla laików i ekspertów [cz.5]

jest jaka jest, ale zawsze moze byc bardziej chwytliwa ;)

19.06.2005
10:42
[3]

hotDog [ Outsider ]

Witam po dłuższej przerwie!

Jutro mam egz zerówkowy z infy :-)

I mam w związku z nim do Was pytanie:

Chodzi mi o obsługę polskich znaków w drzewach.

Mam drzewa binarne, po lewej wartości mniejsze, po prawej większe.
Przechowywuję w nim np. nazwiska. Litery wielkie (np. A, S, C, D..) są mniejsze (w kodzie ASCII) niż małe litery, więc są wyświetlane w pierwszej kolejności w drzewie.
Natomiast wszystkie polskie znaki (ą, ś, ć, ź, ó, ń, ł, ż) w kodzie ASCII są od 127 w górę, więc pokazywane są na samym końcu drzewa, np.

Andrzejkiewicz
Kowalski
cezary
oleksy
zieliński
ćma
śmieciowy

:-)

i chodzi mi o to, a raczej o pomysł co zrobić, aby polskie znaki (ć, ś) były wyświetlane w dobrej kolejności, tzn. odpowiednio 'ć' zaraz po 'c', a 'ś' zaraz po 's'.

Doszły mnie słuchy, że takie coś może być na egzaminie i teraz się głowię nad tym :-)

19.06.2005
12:07
[4]

Kubol [ Konsul ]

Cóż, nic mi nie wiadomo o wbudowanych mechanizmach tego typu jeśli chodzi o C/C++.
Są dwa szybkie rozwiązania tego problemu:

1. zamiast <,>,= używasz funkcji porównania, która za pomocą n ifów zwraca odp wartośc porównania, ale to dosyć powolne rozwiązanie.

2. Robisz sobie 256 elementową tablicę indeksowaną znakami. Warości w polach będą odpowiadać kolejności znakow w j. polskim, zatem np
tab['a'] = n
tab['ą'] = n+1
tab['b'] = n+2 itp.
Potem porównujac 2 chary zamiast if (a<b) będzie if(tab[a] < tab[b]), co niewątpliwie jest dużo wolniejsze niż a<b, ale szybsze niż wywołanie funkcji, if( cmp(a,b) ).
Aczkolwiek nie jestem pewny, czy aby biblioteka standardowa c++ nie ma mechanizmów do radzenia sobie z tym.

19.06.2005
12:59
[5]

hotDog [ Outsider ]

Dzięki.

Czy mógłbyś mi jakoś przybliżyć oba sposoby? Bo nie skapowałem dokładnie o co biega :-/

Byłbym Ci bardzo wdzięczny.

19.06.2005
23:28
[6]

Kubol [ Konsul ]

Cóż, robiąc drzewo binarne, w momencie wstawiania porównujesz wartości na odpowiedniej pozycji (jeśli dobrze zrozumiałem, to sam piszesz to binarne drzewo).
Czyli masz na każdym poziomie drzewa przy wstawianiu porównujesz 2 chary, żeby zdecydować w którą strone wstawic ten ciag.
Wiec, masz w pewnym pomencie np. coś takiego:

insert(Node *root, char* str, int level) /*w uproszczeniu*/
...
if( root->str[level] < str[level] )
insert(root->right, str, level+1)
else
insert(root->left, str,level+1)


więc, najoczywiściej zrobić funkcję porownujaca 2 chary, tak, żeby np. 'a' < 'ą' <'b' - proste, troszke ifow albo case i jest, ale dzialać będzie znacznie wolniej niż porównanie 2ch charow bezpośrendio, czyli mialbyś

int cmp(char c1, char c2)

if ... /*i tu milion ifów, tak, żeby poprawnie porównywał */


i wtedy bedzie

if( cmp(root->str[level],str[level]) < 0 )
insert(root->right, str, level+1)
else
insert(root->left, str,level+1)



Sposób 2:
Robisz sobie globalną 256 elementową tablicę charów, nastepnie musisz ją odpowiendio wypełnić (sprytnie, coby sie nie naklepać). Tablica będzie pozwalała na porównanie charów w dowolnej przec Ciebie narzuconej kolejności.
Ponieważ tablica jest 256 elementowa, to mając chara c, tab[c] nie wywali błędu. Jeśli porównujesz tylko literki i cyferki, trzeba wypełnić tylko komurki indeksowane nimi, czyli:

char offset=0;

tab['0']='0'
...
tab['9']='9'
tab['a']='a'
tab['ą']='a'+1
tab['b']='a'+2
tab['c']='a'+3
tab['ć]='a'+4

...
Jak zrobisz taką tablice, to zauważ, że tab['ą'] < tab['b'], o co chodzilo, teraz, zamiast pisać
if( root->str[level] < str[level] )

możesz napisać

if( tab[root->str[level]] < tab[str[level]] )

i będzie działać. Zauważ, że ten drugi sposób jest bardzo uniwersalny. Właśnie tak się implementuje porównywanie znaków w dowolnym charsecie.

19.06.2005
23:30
[7]

Kubol [ Konsul ]

*edit: "char offset" jest tam zbędny, został mi z innego przykładu

20.06.2005
18:32
smile
[8]

mysiek [ @#mysieks@# ]

//projekt kalkulatora

#include <iostream>


using namespace std;
int kalk(char arg);

//main
int main()


char co;
int liczba1;
int liczba2;
int wynik;

cout << "Witamy w udoskonalonym kalkulatorze: \n\n";
while(co <> 5)

cout << "Podaj pierwsza liczbe: \n\n";
cin >> liczba1;
cout << "Podaj druga liczbe: \n\n";
cin >> liczba2;
cout << "Aby dodac kliknij 1, aby odjac 2, aby pomnozyc 3, aby podzielic 4, ";
cout << "aby opuscic program 5 \n\n";
cin >> co;
kalk(co);


int kalk(char arg)
switch(arg)

case 1 :
cout << "Wybrales dodawanie \n\n";
wynik = liczba1 + liczba2;
cout << "Wynik dodawania podanych przez Ciebie liczb to: " << wynik ;
case 2 :
cout << "Wybrales odejmowanie \n\n";
wynik = liczba1 - liczba2;
cout << "Wynik odejmowania podanych przez Ciebie liczb to: " << wynik ;
case 3 :
cout << "Wybrales mnozenie \n\n";
wynik = liczba1 * liczba2;
cout << "Wynik mnozenia podanych przez Ciebie liczb to: " << wynik ;
case 4 :
cout << "Wybrales dzielenie \n\n";
wynik = liczba1 : liczba2;
cout << "Wynik dzielenia podanych przez Ciebie liczb to: " << wynik ;
default :
cout << "Wybierz cos sensownego :D \n\n";




Z cyklu gdzie lezy blad? tylko nie bluzgac na mnie :/

20.06.2005
18:34
[9]

Regis [ ]

Z cyklu "A co nie dziala"? Badz troche bardziej precyzyjny... Wywala blad przy kompilacji, czy moze zle dodaje?

20.06.2005
18:37
[10]

mysiek [ @#mysieks@# ]

dobra zrobilem to z czystego lenistwa :P bo wlasnie wychodze pograc w pilke i wpadlem na pomysl ze jesli ja nie bede w tym czasie myslec nad programem to moze zrobi to ktos za mnie :P

Wywala nastepujace bledy

Wiersz 19 expected primary expression berfore > token
19 At global scope;
32 expected init-declarator before switch
32 expected , or ; before "switch"

20.06.2005
18:40
[11]

Regis [ ]

32 expected , or ; before "switch"

Litosci... Czytanie ze zrozumieniem sie klania....

20.06.2005
18:42
[12]

Sir Skull [ Market Square Hero ]

Regis --> w poprzedniej części jest poprawnie działający kalkulator. Poprawiałem już raz :)
Na pierwszy rzut oka widać w Twoim programie parę błędów...
- w pierwszym while - nie ma operatora <> - jest za to !=. <> był w pascalu :)
- w funkcji kalk nie jest zdefiniowana zmienna wynik.
- w mainie nie zwracasz wartości typu int
- w kalk - ":" nie jest operatorem dzielenia - jest za to "/"
- przy dzieleniu sprawdzaj czy nie dzielisz przez 0

20.06.2005
18:43
[13]

Sir Skull [ Market Square Hero ]

sorry Regis, nicki mi się pomyliły :D do Myśka oczywiście miało być :)

20.06.2005
18:44
smile
[14]

Regis [ ]

Domyslilem sie ;)

20.06.2005
20:43
[15]

mysiek [ @#mysieks@# ]

Dzieki za pomoc, nastepnym razem postaram sie byc bardziej skrupulatny zarowno w pisaniu programu jak i postu :P Ale teraz kolejny problem, niby program dziala wszystko ok, ale nawet gdy co=5 nie konczy swojego dzialania, i nigdy nie zwraca wyniku, za kazdym razem wypisuje to co jest w defualt w switchu.

20.06.2005
21:07
[16]

Regis [ ]

Bo Twoj switch sprawdza nieistniejaca zmienna arg, a nie co... albo ja czegos niedowidze...

20.06.2005
21:12
[17]

Kijano [ Generaďż˝ ]

zapomniales nawaisow po casach

20.06.2005
21:40
[18]

mysiek [ @#mysieks@# ]

int kalk(char arg, int liczba1, int liczba2)

arg istnieje =) chyba ze ja czegos nie rozumiem :P

20.06.2005
21:42
[19]

mysiek [ @#mysieks@# ]

aa dodalem break jeszcze po kazdym case ale nadal cos nie tak, wiem ze mozna ten kalkulator napisac prosciej ale chcialem z uzyciem funkcji :D

20.06.2005
22:37
[20]

Llordus [ Generaďż˝ ]

mysiek -->
w case uzywasz kolejno 1,2,3,4 - ale z definicji switch/case wartosci te sa traktowane jako typu int. Z drugiej strony do switcha przekazujesz typ char - zachodzi niejawna konwersja na typ int. Pytanie za 100 pktow - jaka wartosc jest w arg po konwersji na int? Zeby to poprawic masz 2 razy:
1. zamiast case 1 zrobic case '1' etc.
2. zamiast char arg zrobic int arg i wczesniej zamiast char co zrobic int co.

20.06.2005
22:37
[21]

Llordus [ Generaďż˝ ]

kurcze, nie masz 2 razy tylko 2 mozliwosci :) przepracowany jestem chyba :(

25.06.2005
14:34
smile
[22]

KULL [ Gladiator ]

w Empiku przegladalem czasopismo WARP (fajnie wyglada, arty tylko przejrzalem), pierwszy numer z duza iloscia miejsca przeznaczona na programowanie itp. Macie to moze ? Warto kupic ?? Bo 20 PLN kosztuje.


info z warp.arx.pl

Od 1 czerwca w Empikach oraz salonikach prasowych obsługiwanych przez RUCH S.A. można nabyć pierwszy numer magazynu WARP. Na 84 stronach znajdziecie jedenaście obszernych artykułów o:
podstawach renderowania grafiki za pomocą OpenGL i DirectX
twórczości mistrza designu Feng'a Zhu (pracował m.in. nad najnowszą częścią Gwiezdnych Wojen - Star Wars: Epizod III i grami: Battle Realms, Duke Nukem Forever, BloodRayne, Unreal Championships 2006)
programowaniu konsoli GameBoy Advance
oprogramowaniu 3D (Maya, 3ds max, LightWave 3D, Softimage|XSI)
tworzeniu prostej gry 2D (DirectX)
matematyce układów współrzędnych
procesie modelowania obiektów low-poly
podstawach Windows API
programowaniu w C++
modelowaniu postaci 3D
...i kilka innych, ciekawych rzeczy.





Wiecej informacji o czasopismie pod linkiem:
https://www.warp.arx.pl/

25.06.2005
17:52
[23]

Sir Skull [ Market Square Hero ]

KULL --> Fajna gazetka. Szkoda tylko, że tak drogo. Ściągnąłem kilka numerów (z ich strony) i nawet niezłe to.

25.06.2005
19:56
smile
[24]

KULL [ Gladiator ]

Sir Skull --> troche to dziwne, zastanawiam sie nad tymi 20 zl za gazetke od 2 dni, a w piatek na imprezie ot tak wydalem 30 zyla i jedne co mi pozostalo to bolaca glowa :/.... swoja droga, wydaje mi sie , czy w niej nie ma reklam? Chyba wlasnie dla tego cena jest tak wysoka za nawet nie 90 stron. ale czcionka jest dosc mala, wiec txtu jest sporo. No i sam design jest taki oldschoolowy :)

25.06.2005
21:06
[25]

Sir Skull [ Market Square Hero ]

KULL --> Fakt. Sam wolałbym wydać 20zł na imprezce niż na tą gazetę :) Grafiką 3D się nie interesuję a z programowania to znajdę w internecie co mi będzie potrzebne.
Programowanie API ? Od tego jest książka pana Petzolda + msdn.
Przyznać trzeba, że autorzy WARP'a piszą ciekawie. Jednak ze względu na ograniczoną ilość stron każdy z poruszanych tematów jest jedynie wstępem do danego zagadnienia. Gazeta jest dobra, jako źródło pomysłów... jako samodzielne źródło nauki moim zdaniem się nie sprawdzi.
Oceniam jedynie na podstawie archiwum warp'a z poprzedniego roku. Numeru czerwcowego jeszcze nie widziałem.

28.06.2005
21:55
smile
[26]

KULL [ Gladiator ]

moze programisci beda cos o tym wiedziec :) - mam problem z teksturami w grach --> wiecej pod liniem --->
https://forumarchiwum.gry-online.pl/S043archiwum.asp?ID=3916647&N=1

04.07.2005
20:08
smile
[27]

KULL [ Gladiator ]

chce Visual C++ .NET, ale nie chce pliku kilka goga sciagac, bo takie sa na p2p. Ktory mam sciagnac ?? bo wiem, ze wystarczy jakis jeden z programow a nie caly zestaw. help.

Wypowiedź została zmodyfikowana przez jej autora [2005-07-04 20:18:14]

04.07.2005
20:28
[28]

Llordus [ Generaďż˝ ]

KULL --> jesli sie nie myle to na stronach microsoftu powinna byc do zciagniecia wersja .NET 2005 beta. W najprostszej wersji chyba bylo to za free i nie zajmowalo raczej paru giga.

06.07.2005
14:13
smile
[29]

KULL [ Gladiator ]

kurcze. nie chce mi dzialac .... :/

taki komunikat mam jak wlaczam program.

Wypowiedź została zmodyfikowana przez jej autora [2005-07-06 14:12:35]

06.07.2005
14:30
[30]

Sir Skull [ Market Square Hero ]

KULL --> Nic nie poradzisz... koniec wersji beta. Jeśli jesteś studentem jakiejś uczelni, która bierze udział w programie MSDNAA to stamtąd weź jakiegoś Visual'a - zupełnie za free (chociaż pewnie wiesz o tym). Pod warunkiem, że wykorzystujesz go tylko do celów edukacyjnych. :) .W przeciwnym wypadku pozostaje Ci korzystanie z freeware'owych IDE.

06.07.2005
14:45
smile
[31]

KULL [ Gladiator ]

a czym sie dokladnie rozni: visual C++ .NET od MIcrosoft Visual C++ 6.0 ??

06.07.2005
15:02
[32]

Sir Skull [ Market Square Hero ]

W Visual .NET (jak sama nazwa wskazuje) możesz tworzyć aplikacje "dotnetowe". Jego starszym bratem jest Visual C++ 6.0 - tutaj nie masz możliwości wykorzystania .net'u. Głównie służy do tworzenia aplikacji win32. To jest podstawowa różnica miedzy tymi środowiskami.

08.07.2005
18:47
[33]

Maevius [ Czarownik Budyniowy ]

Hej,

Symfonia i thinking swietnie sobie radzi z teoria jesli chodzi o c++, ale potrzebowalbym literatury badz linkow z cwiczeniami z c++ (najlepiej z rozwiazaniami).

Czy moze mi ktos pomoc ?

pozdrawiam,

Mae

08.07.2005
18:49
[34]

Regis [ ]

A w thinking nie ma cwiczen?

08.07.2005
18:54
[35]

Maevius [ Czarownik Budyniowy ]

Za malo.

08.07.2005
18:56
smile
[36]

Regis [ ]

To ile ty tego potrzebujesz? Ja nie wiem jak jest w TiC++, ale w Thinking in Java cwiczen jest na prawde od groma (po kazdym rozdziale kilkanascie :) ), a rozdzialow jest tyle ze glowa boli :)

08.07.2005
18:57
[37]

Maevius [ Czarownik Budyniowy ]

Nie czytalem TiJ, ale TiC++ jest to ilosc niewystarczająca :)

09.07.2005
21:28
smile
[38]

Kubol [ Konsul ]

Mae -> proszę bardzo:

Napisz linkowaną hash mapę używając templatów, oczywiście powinna używac iteratorów. Jak skończysz to mi prześlij, a ja powiem, czy poprawnie ;-) <lol>. (ostatnim razem jak sprawdzałem, to microsoftowa implementacja mapy w stl była koszmarnie badziewna - czyt. powoooooolnaaaaaa)

(linkowana hash mapa to taka, w ktorej komórki są połączone w listę, istnieje więc możliwośc iterowania po niej w porządku wstawiania).

A tak na serio, to wymyśl sobie jakiś większy program, nie musi przecież wykorzystywać calej skladni C++, wystarczy, że będzie działał ;-)

09.07.2005
22:20
smile
[39]

KULL [ Gladiator ]

Maevius --> polecam dzial "Te m a t y p r o j e k t ó w" z mojej uczelnianej strony: https://www.wemif.pwr.wroc.pl/labc/

sa tutaj bardzo ciekawe tematy na programy zaliczeniowe :). jak jakis zrobisz to mi go przeslij, bede mial co sprzedawac mlodszym kolegom :-P

09.07.2005
22:25
[40]

mysiek [ @#mysieks@# ]

nie czytalem calego watku ale we wstepniaku powinno byc chyba cout << a nie cout >>

09.07.2005
22:45
smile
[41]

Maevius [ Czarownik Budyniowy ]

KULL

Dzieki, wlasnie o cos takiego mi chodzilo :)

A za to Kubolowi przypadnie sprawdzenie, skoro tak chetnie sie zaoferowal :-P

:-D

10.07.2005
01:32
smile
[42]

KULL [ Gladiator ]

mysiek --> racja :-/ ale byk.... tak to jest, jak watek zaklada b. poczatkujacy programista :P

10.07.2005
14:31
smile
[43]

Kubol [ Konsul ]

Nie ma sprawy, ale ostrzegam, że będę sie czepiał jak cholera ;P

12.07.2005
20:03
smile
[44]

Maevius [ Czarownik Budyniowy ]

Kubol, nie ma sprawy, zapamietalem sobie :)

Zamecze Cie moimi programami :-P

20.07.2005
21:46
[45]

bartek [ ]

Mam prośbę - jakiś czas temu, bodajże Quicky podawał adres wyszukiwarki dla programistów, która po wpisaniu części kodu aplikacji wypluwała linki do całych kodów źródłowych działających programów. Moglibyście pomóc z adresem? :)

21.07.2005
11:30
smile
[46]

KULL [ Gladiator ]

lepsza jest Thinking in C++ PL czy cala seria Symfonii ?? dla programisty umiejacego niewiele ?

21.07.2005
18:05
[47]

Kubol [ Konsul ]

KULL-->
I to i to. Generalnie z tego co pamiętam, to symfonia jedzie poprostu składnię C++ od deski do deski, bardzo szczegółowo.

Thinking zaczyna od ideii programowania obiektowego. Generalnie jest tam więcej tekstu niż kodu.
Thinking mówi dlaczego, a symfonia jak. Co kto woli. Ja bym zaczął od thinking, a potem zrobił symfonię. Ale to subiekktywne zdanie, bo do symfonii zajrzałem w życiu może ze 2 razy.

21.07.2005
19:03
smile
[48]

Kubol [ Konsul ]

Zagadka, taki mały programik:

#include <stdio.h>

int
main(int argc, char **argv) ‹
int *a=malloc(sizeof(int));
int *b=malloc(sizeof(int));
int *c=malloc(sizeof(int));
*a=6;
*b=3;
*c=*b/*a;
/*Jaki będzie wynik ???*/;
printf("*a=%d, *b=%d, *c=%d\n",*a,*b,*c);

return 0;


jaki będzie wynik ? co wypisze printf ? Spróbujcie zgadnąć bez kompilacji ;-)

21.07.2005
19:24
[49]

Llordus [ Generaďż˝ ]

Kubol -->

jak dla mnie to bedzie :
6, 3, 0

21.07.2005
19:27
smile
[50]

Kubol [ Konsul ]

Nie (*demoniczny smiech*), niestety nie. Próbujcie dalej ;-)

21.07.2005
19:46
[51]

Llordus [ Generaďż˝ ]

Kubol --> no tak :) wrzucilem to w edytor i juz wiem co jest nie tak - ale ta 'zagadka' jest dobra tylko jesli przedstawiasz ja czystym tekstem :)
w edytorze wszystko wychodzi na jaw praktycznie od reki :P

21.07.2005
19:49
[52]

Kubol [ Konsul ]

Zgadza się, ale wyobraź sobie taki numer np. na egzaminie - miazga ;-)

21.07.2005
19:57
[53]

Llordus [ Generaďż˝ ]

Kubol --> fakt, na egzaminie miazga, aczkolwiek obiektywnie swiadczyloby to tylko o glupocie egzaminujacego (i jego kompletnym brakiem praktycznej znajomosci tematu programowania :) ).
Jako ze w edytorze wychodzi to od reki, to szanse na to ze ktos cos takiego zapisze w programie sa praktycznie zerowe. I w zasadzie taki test nie sprawdza w zaden sposob wiedzy merytorycznej - tylko i wylacznie spostrzegawczosc :)

21.07.2005
21:40
smile
[54]

KULL [ Gladiator ]

Ciekawy pomysl z tymi zagadkami :).
Ale po pierwsze, czy malloc da sie uruchomic bez #include <stdlib.h> ??
Troche chcialem oszukac i wrzucilem programik do Devi, ale nie chce mi go skompilowac.

Wpierw krzyczy, ze ` malloc' undeclared (first use this function) , a jak dopisze #include <stdlib.h>, to : invalid conversion from `void*' to `int*' .

moze ktos wytlumaczyc na czym polega ta zagadka ?? :)

21.07.2005
21:59
[55]

Llordus [ Generaďż˝ ]

KULL--> za MSDN'em ->
ad 1)
malloc
required header:
<stdlib.h> and <malloc.h>
compatibility:
ANSI, Win 98, Win Me, Win NT, Win 2000, Win XP

ad 2) Za visualem przy kompilacji:
error C2440: 'initializing' : cannot convert from 'void *' to 'int *'
Conversion from 'void*' to pointer to non-'void' requires an explicit cast

Jest to nawet logiczne uwzgledniajac ze void* moze wskazywac na dowolny typ danych - kompilator po prostu wymaga, zeby programista wprost okreslil, ze faktycznie o rzutowanie do danego typu mu chodzi.

Ten problem pojawia sie przy kompilowaniu kodu C++. Dla ANSI C rzutowanie z malloc-a jest opcjonalne. Sam malloc zreszta jest wykorzystywany w C, w C++ alokacja pamieci powinna odbywac sie poprzez wykorzystanie operatora new.

Idac jeszcze dalej w czepianiu sie - skoro alokujemy pamiec poprzez malloc, to przed return 0 powinno byc uzycie funkcji free - w koncu pamiec trzeba dealokowac, bo w przeciwnym wypadku mamy klasyczne memory leaki - a nie kazdy system radzi sobie z nimi rownie dobrze, co np. kochany windows xp :P

21.07.2005
22:42
[56]

Kubol [ Konsul ]

1. Faktycznie, nie wiem jakim cudem mi sie skompilowalo bez stdliba, hmm. ALe przyżekam, że w tej postaci go kompilowlaem i uruchamialem używajac gcc na windzie (MinGW). Pewnie bierze się to ztąd, że w C funkcje nie muszą być zadeklarowane przed użyciem, a biblioteka automatycznie linkowana zawiera malloc, więc linker sobie poradził.

2. Memory leaki dotyczą jedynie pojedynczego programu i są ograniczone do jego czasu dzialania.
W każdym razie w każdym unixowym systemie wszystkie zasoby są zwalniane automatycznie po zakończeniu procesu. Każdy system, który by czegoś takiego nie robił, byłby praktycznie bezużyteczny. Możesz sobie to prosto sprawdzić - napisz program alokujący np. 100MB i nie wywolaj free, popatrz na zużycie pamięci.

21.07.2005
22:45
[57]

Kubol [ Konsul ]

Acha, no i chciałbym jeszce powiedzieć, że nie używam żadnego ide do kompilowania programów o tak nieksiej złożoności. Szybciej wkleje to do notepada i skompiluje z reki, niż jakiś projekt zrobie ;-). Na unixie tym bardziej nikt by sie nie kłopotał odpalanie X-ów.

21.07.2005
23:38
[58]

sYs|yavor [ Generaďż˝ ]

Kubol, nie masz racji. Dobry programista ma zawsze wyrobione rygorystyczne nawyki pisania kodu. Gdy piszesz malloc(), zanim w nawiasy wpiszesz co, przy wyjściu z funkcji lub programu piszesz free(). To jest bezwzględna reguła i żadne uzasadnianie niechlujności zaradnością systemu nie może wchodzić w grę, bo programowanie to rygor, a nie potańcówka.

Przy okazji: z ciała programu głównego nie wychodzi się poleceniem return, lecz funkcją exit(). Co prawda wychodzić da się i tak, i tak, ale po to jest exit, aby odróżnić zakończenie programu od zakończenia podprogramu. Ot, rygor, dzięki któremu programy działają lepiej (bo idąc z zasadą luzaka dalej: a po kie licho coś na coś rzutować, skoro kompilator może rzutowanie zrobić w większości przypadków automatycznie?).

21.07.2005
23:40
[59]

Llordus [ Generaďż˝ ]

Kubol -> jeszcze odnosnie 2 - mam nadzieje ze nie uwazasz tego za dobra praktyke programowania? Nie ma znaczenia ze dobry OS poradzi sobie ze zwolnieniem pamieci ktora wyciekla. Znaczenie za to ma fakt, ze aplikacja niepotrzebnie marnuje pamiec, ktorej zawsze jest za malo w systemie. Pewnie ze w takim programiku jest to moze troche sztuka dla sztuki ale sztuka potrzebna, utrwalajaca dobre nawyki, ktore w przypadku alokacji/dealokacji pamieci w C++ sa bardzo wazne.
O systemach unixowych (i to wszystkich) nie czuje sie na silach wypowiadac :) Za malo mam praktyki. W przypadku windowsow pamiec jest zwalniana na pewno w XP, W2K. W przypadku NT nie mam pewnosci. W przypadku Win95,Win98 i Win ME wiadomo jak bylo, no ale te OSy juz nie sa supportowane przez MS wiec mozna niby o nich zapomniec :)
A ja do takich smieciowych testow zawsze mam jakis aktualny projekcik - i na windzie z pewnoscia wygodniej mi bedzie odpalic dwuklikiem taki projekt, wkleic kod jak do notepada i kliknac jeden butonik na toolbarze niz kombinowac z recznym odpalaniem kompilatora z lini polecen :)
Ale to juz jest raczej rzecz gustu.

21.07.2005
23:48
[60]

Kubol [ Konsul ]

Goście, zawodowo klepie kod w C, wiec naprawde nie musicie mi mówić jak sie pisze dobrej jakości kod produkcyjny. I sztuke zwalniania pamięci mam utrwaloną bardzo dobrze ...

Ten programik to tylko kalambur, zagadka, czy co tam jeszce. I nic więcej. Chodziło o to, żeby był krótki i zwięzły, brak free w tym wypadku to nic. To samo exit czy return.

EOT.

21.07.2005
23:57
[61]

Kubol [ Konsul ]

Btw, apropos exit i return, naprawde nie ma żadnej równicy. Była w starych kompilatorach M$, gdzie mogłeś sobie zadeklarowac main jako void, i wtedy dalo sie zwrócić wartość. Poza tym nie widze żadnej różnicy praktycznej, bo zawołanie exit w głębi kodu jest z gruntu rzeczy złe, ponieważ nigdy nie wiesz co zostało wyżej zaalokowane. Pisząc duży program, main ma przeważnie 10-20 linijek w których woła kilka dużych funcji i naprawde nietrudno zauważyć w nim return, tymbardziej używając edytora, bo ten podkresla zawsze return jako keyword, a exit nie.

22.07.2005
00:28
[62]

sYs|yavor [ Generaďż˝ ]

Kubol:

"Goście, zawodowo klepie kod w C, wiec naprawde nie musicie mi mówić jak sie pisze dobrej jakości kod produkcyjny. "

Gościu, kiedy ty do mamy gugu mówiłeś, ja pisałem jedne z pierwszych w polskiej prasie komputerowej kompleksowych kursów C. Przyjmij więc do wiadomości, że nawyki programistyczne masz złe. Jeśli nie wierzysz - zerknij sobie do jakiś poważniejszych opracowań.

BTW - jedną z cech odróżniających dobrego programistę od złego jest duma. Ten drugi ją ma. Zupełnie jak Ty.

"Poza tym nie widze żadnej różnicy praktycznej, bo zawołanie exit w głębi kodu jest z gruntu rzeczy złe"

No, praktycznie to już się dowiedzieliśmy, że zwalnianiem pamięci zajmuje się system ;-) Poza tym - skąd ten pomysł na używanie funkcji exit() (to funkcja - terminu "zawołanie" w terminologii programistycznej nie ma w ogóle) wewnątrz podprogramów? Ktoś o tym pisał? Zwrócę Ci również uwagę, że jest subtelna różnica pomiędzy exit i exit(). To pierwsze jest mi nieznanym poleceniem języka, to drugie jest funkcją. Pliz, odrobina rygoru, ok?

"Pisząc duży program, main ma przeważnie 10-20 linijek w których woła kilka dużych funcji"

No patrz, a ja jedynie deklaruję i inicjuję jeden obiekt. Jak to się style programowania różnią...

22.07.2005
09:30
smile
[63]

Kubol [ Konsul ]

Dobra, wyjaśnijmy sobie parę rzeczy:

Ten program nie jest napisany przeze mnie. Napotkałem go w blogu pewnego iżyniera Suna, i zmieniłem tylko komentarz na pl i dodałem return. Ale ideę tego programiku jest to, żeby na niego popatrzeć bez kompilacji. Bo każdy kompilator wywołany z odpowienią flagą wywali Ci błąd i po zabawie (vide gcc -Wall). Natomiast nie dodalem free() (zadowolony z nawiasów ?), bo naprawde nie widzielame tu takiej potrzeby.

Jeśli już się do czegoś doczepiać, to tylko do tego, że ten program alokuje 3 inty 3 wywolaniami malloca, i to jest zbrodnia. Ale ma to na celu odwrócenie uwagi ogładającego. Jakoś nikt z was się do tego nie doczepił. Dodatkowo, większość alokatorów alokuje dane w blokach min. 8 bajtowych, jest więc to także marnotrastwo pamięci. Ale nawet zostawiając te 3 wywołania, po każdym trzeba by sprawdzić czy malloc nie zwraca nulla, i zwolnić poprzednio zaalokowane. Doczepiliście sie do castów, ale braków wydajnościowych i niebespieczeństwa acces violation to już nie widać.

Jeśli myślisz, że programuje w taki sposób, jak w tej zagadce, to masz mnie za idiotę, i to mnie tak zdenerwowało.

Co do zwalniania pamięci przez system, to moja uwaga dotyczyła uwagi o memory leakach. W tym przypdaku memory-leaków nie ma poprostu. Nigdy nie mówiłem, że można sobie bie zwalniać pamięci i nikogo do tego nie namawiam ani sam tak nie robię.

Co do rygoru, to zgadza się, jest on ważny. Nie zmienia to faktu, że pisząc taki jajcarski programik można go spokojnie olać, szczególnie po 9h pisania z rygorem ...

22.07.2005
09:35
[64]

Romanujan [ Konstruktor Katapult ]

6, 3, 3
(Ja wiem, dlaczego po komentarzu jest ten srednik :-)

22.07.2005
09:46
[65]

Romanujan [ Konstruktor Katapult ]

To może teraz ja zadam zagadkę:

#include <iostream.h>

int main(int argc, char **argv) ‹
int a = 1;
cout << a++ * a++ << endl;
cout << a << endl;
return 0;


Co zostanie napisane? Dlaczego?

22.07.2005
10:51
[66]

Llordus [ Generaďż˝ ]

Romanujan --> w zasadzie nie wiadomo co zostanie wypisane. Wynik wyrazenia 'a++ * a++' jest niezdefiniowany.

22.07.2005
13:59
[67]

Kubol [ Konsul ]


Ok, z innej beczki troszke. Zazanczam na początku, że takich deklaracji sie nie robi tak, tylko używa typedefa, żeby mnie ktoś nie posądził. Pytanie, co deklaruje pniższa deklaracja:

int (*( (*fun)() ))(int,int);


?

22.07.2005
14:12
[68]

Llordus [ Generaďż˝ ]

int (*( (*fun)() ))(int,int);

fun bedzie wskazaniem funkcji nie przyjmujacej argumentow, a zwaracajacej wskazanie na funkcje, ktora ma 2 argumenty typu int i zwraca typ int.

06.08.2005
10:19
smile
[69]

KULL [ Gladiator ]

Pisze cos bo mi wywalilo ten watek z watkow "waznych" przez to ze nikt nic nie pisze, no ale mamy wakacje przeciez, :). swoja droga - kupilem na allegro Thinking in C++ za 45 zyla, na dniach dojdzie to bede czytal i pewnie cos napisze w watku :P.

milych wakacji, ja spedzam je przed kompem, pracujac itp. :-/

07.08.2005
22:53
smile
[70]

KULL [ Gladiator ]

2 dni i 100 stron Thinking in C++ przeczytane :). Wstęp trochę długi, ale ciekawy, o już na kilku pierwszych stronach z kodem w cpp dowiaduję się fajowych rzeczy, o jakich nie wyczytałem z dostępnej mi na studiach literatury i o jakich nikt mi na informatyce nie raczył powiedzieć. Np. o możliwościach string, czy zamianie bezpośrednio licz dziesiętnych na szesnastkowe (cout << hex << 15;) i ósemkowe (cout << hex << 15;), chyba też wiem już po co i kiedy pisze się „using namespace std;”. Fajowa książka ! Idę czytać dalej :-P.

08.08.2005
00:20
smile
[71]

hotDog [ Outsider ]

KULL --> nie ubliżając Tobie ani Twojej uczelni, ale ja to miałem w 1 semestrze :-))

Teraz zaczynam walczyć sam ze sobą - mam 3 egzaminy i 1 zalkę do zdobycia.

Jeśli zdam to będziemy mieć wszyscy sporo tematów na kolejne wątki! :-)))


Wracam do analizy...

08.08.2005
11:22
smile
[72]

KULL [ Gladiator ]

napisalem wielkie pytanie w tym poscie, co do przykladu z ksiazki, ale juz sobie sam poradzilem, wiec post edystuje, szkoda, zen ie mozna go kasowac ;)

hotDog --> a na ktorym jestes semestrze ?? i na jakiej uczelni?

Wypowiedź została zmodyfikowana przez jej autora [2005-08-08 11:20:15]

08.08.2005
11:41
smile
[73]

hotDog [ Outsider ]

Ja jestem na 2 semestrze na Politechnice Częstochowskiej :-) Teraz walczę o 2 rok...



Czy jest tutaj jakiś mastach z OpenGL? ;-)

08.08.2005
11:57
[74]

Maevius [ Czarownik Budyniowy ]

ja tylko doprowadze swoj system do porzadku i zaczne Was meczyc ;-›

08.08.2005
12:13
smile
[75]

KULL [ Gladiator ]

hotDog --> hehe, powodzenia, ja na Wroclaskiej Polibudzie czekam na 2 rok juz bez stresu ;), choc jeszcze kampanie wrzesniowa mam, ale to tak dla sportu :P

btw: macie moze "Thinking in C++ Vol 1 Solutions Guide Sample" ?? :) bo w p2p jakos nie moze mi znalezc :/.

08.08.2005
20:17
[76]

Kubol [ Konsul ]

hotDog--> masta to nie, ale cośtam mnie męczyli na uczelni, więc może coś jeszcze pamiętam ;-)

08.08.2005
21:12
smile
[77]

DeV@sT@toR [ Senator ]

Czy ktoś mógłby uratować mojego biednego pc-ta, który zaraz wyląduje za oknem :) i powiedzieć mi jak przeciążyć operator przypisania, aby przyjmował tekst wpisywany w cudzysłowie? Zaznaczam, iż konstrukcje typu:

zwracany_typ operator=(const string&)


mnie nie interesują, albowiem właśnie w ramach szkolenia mam kaprys napisać mini klasę wrapper na chary. Tak więc argumentem powinna być niby stała tablica charów, a jednak, ani

typ& operator=(const char* zmienna)

ani

typ& operator=(const char zmienna) //zmienna jako tablica przekazywana przez referencje

ani nic w tym rodzaju nie chce działać. Z góry dzięki za pomoc.

08.08.2005
22:13
smile
[78]

KULL [ Gladiator ]

To moze inaczej troche pytanie zadam :P. Do posiadaczy Thinking in C++: skad braliscie rozwiazania do zadan z ksiazki ?? :) --> [email protected] :D

08.08.2005
22:28
[79]

DeV@sT@toR [ Senator ]

KULL ---------> Jest to na tyle popularna pozycja, iż wydaje się wręcz nieprawdopodobnym, ażeby nie było ich na np. eMule :)


08.08.2005
22:41
smile
[80]

KULL [ Gladiator ]

DeV@sT@toR --> tez tak myslalem, do czasu, az nie zaczalem tego szukac :).

08.08.2005
23:05
[81]

DeV@sT@toR [ Senator ]

Jeśli nie ma na eMule to będzie trudno to zdobyć za darmo, niestety. Szkoda, że w wątku taki mały ruch, z chęcią bym sobie coś popisał, ale nie ruszę się z miejsca póki odpowiednio nie przeciążę tego cholernego operatora.

09.08.2005
00:30
[82]

KULL [ Gladiator ]

cytat z ksiazki: "Annotated Solution Guide for Thinking in C++ 2nd. ed. Vol. 1 dostepne za niewielka oplata w witrnie https://www.bruceeckel.com". a W witrynie ;)- -> $12 plus przesylka ... wyjdzie mi wiecej niz za ksiazke Thinking in C++ :).

DeV@sT@toR --> ja Ci nic nie przecieze, bo nie wiem o co chodzi :). Mam za to do przeczytania jeszcze ponad 500 stron ksiazki TICpp, wiec wracam do lektury :).

09.08.2005
02:04
[83]

DeV@sT@toR [ Senator ]

KULL --------> Jedynie czytając nic nie zdziałasz - lepiej po każdym rozdziale posiedź nad kodem, bo skończysz jak ja przy moim poprzednim podejściu do C :) Niuansów jest mnóstwo i tylko w praktyce da się je wychwycić.

[DO WSZYSTKICH] :P

Błędem przez który nie działał mi ten przeciążony operator było to, iż inicjowałem z miejsca obiekt stringiem:

klasa obiekt="tekst";

Do takiego zainicjowania wystarcza konstruktor przyjmujący jako argument const char*.
Natomiast przy przypisywaniu tekstu już zainicjowanemu obiektowi wszystko działa w porządku, a więc i przeciążenie było poprawne.

I teraz kolejne pytanie!!!

W celu używania przeciążonego operatora do wielokrotnych przypisań np. A=B=C; trzeba zwrócić w funkcji przeciążającej obiekt, który wywołuje tę funkcję czyli *this. Tylko czy nie jest to zbytnio kosztowne? W ogóle dziwne to jest. Takie przypisanie bowiem wygląda mniej więcej tak:

1. Obiekt B wywołujue funkcję przeciążającą operator przypisania - dokonuje odpowiednich operacji np. przepisując jakąś składową z C.

2. Wywoływany jest konstruktor kopiujący mający za wzór obiekt B w celu zwrócenia przez wartość kopii tego obiektu (*this).

3. Funkcję przeciążającą wywołuje obiekt A i dokonuje odpowiednich operacji.

4. Obiekt A wywołuje konstruktor kopiujący i zwraca się :P przez wartość.


Oczywiście owe zwroty mogłby zostać dokonane przez referencję. Jednak często można spotkać zwracanie przez wartość, dlaczego? Zresztą takie działanie uniemożliwia rozdzielenie tworzenia kopii od przypisania, a mimo wszystko widziałbym raczej w lepszym świetle pozostawienie sobie tego rozróżnienia :P

09.08.2005
13:34
smile
[84]

hotDog [ Outsider ]

KULL --> Nie dziękuję i gratuluję! Co ja bym dał żeby być na Twoim miejscu :-)

Kubol --> To powiedz mi proszę jak zacząć? Jak to ugryźć? :-) Kilka miesięcy temu napisałem nawet jedną aplikację w OpenGL - kwadrat który się obracało myszką itd :-) Ale miałem spore problemy z teksturami :-/

09.08.2005
17:48
[85]

KULL [ Gladiator ]

hotDog --> ja na OpenGL sie nie znam, ale czytalem o tym w WARPie. z tego co pamietam to jest do OpenGL jakies tutoriale czy cus w ich wydaniach elektronicznych pod adresem --> tp://www.warp.arx.pl/

09.08.2005
19:09
[86]

DeV@sT@toR [ Senator ]

Ja w przyszłości planuję ugryźć nieco Direct'a i myślę, że choć jest ponoć trudniejszy od OpenGL, to planowany przez MIcrosoft przestój w rozwoju tej biblioteki oraz pozycje takie jak np.
"Triki najlepszych programistów gier 3D. Vademecum profesjonalisty", "DirectX. Rendering w czasie rzeczywistym" itp. mogą skłonić do zastanowienia nad tą właśnie biblioteką.

09.08.2005
23:01
smile
[87]

hotDog [ Outsider ]

KULL --> Dzięki :-) Poszukam tam czegoś o tym.

DeV@sT@toR --> Próbowałem także w DX, ale mimo wszystko OpenGL wydał mi się łatwiejszy jak na początkującego i na razie (tzn. od pół roku) próbuję zacząć się tym interesować na poważnie. Niestety, czasu na OpenGL za bardzo nie mam, męczą mnie cały czas całkami albo drzewami w cpp :-)

09.08.2005
23:21
[88]

DeV@sT@toR [ Senator ]

hotDog ---------> Dla mnie to obecnie czarna magia - w przyszłym roku mam zamiar zdawać na informatykę, ale jak będzie to się dopiero okaże. Jak na razie uczę się podstaw C++, za jakiś czas będę się musiał zająć algorytmiką itp. sprawami, raczej dla własnej przyjemności niż z obowiązku.

10.08.2005
12:48
smile
[89]

KULL [ Gladiator ]

Mam takie pytanie w związku z operatorami przesunięcia, czy dobrze kapuje taki oto przykład:


int main()


const unsigned char val=1;
for (int i=7; i>=0; i--)

if (val & (1<< i))
cout <<"1";
else
cout << "0";

system("PAUSE");



w tym przypadku wartosc val = 1.
czyli if sprawdza bit po bicie ( 00000001 & (1<<i ))
a wartosc „i” leci: dla i=0 : 00000001, dla i=1 : 00000010, dla i = 3 : 00000100 itd.

Wiec operator << przesuwa 1 w lewo po zerach. A jak wpisze 2 << 0 to będzie:
00000010, 00000100 itd. ?? czyli będzie przesuwal wartosc 10, czyli 0000 0010 ??

Dobrze rozumiem?

10.08.2005
13:38
[90]

DeV@sT@toR [ Senator ]

KULL --------> Nie znam się na operatorach bitowych, ten temat zostawiłem sobie na później, ponieważ nie jest w żadnym wypadku niezbędny dla poznawania języka na tym poziomie. Operatory przesunięć bitowych przesuwają wartości poszczególnych bitów tak więc mając np.

unsigned char zmienna=2; (czyli w systemie binarnym 00000010 )

i zapisując:

zmienna<<1;

otrzymujemy 00000100, przesuwamy bity o jedno miejsce, a więc w konsekwencji zapis
zmienna<<wartosc_przesuniecia w naszym systemie jest równy zmienna*(2^wartosc_przesuniecia). Nie rozumiem co ma robić zapis 2<<0, czyli przesunięcie zerowe? Przesunięcie bitowe po prostu przesuwa wartości poszczególnych bitów, a więc obrazowo:

abcdefgh<<2; (literki tylko dla zobrazowania)

w wyniku daje:

cdefgh00 (po prawej dodawane są zera, bity wychodzące z lewej poza przesunięcie są tracone).

Jak już jednak mówiłem ja się nie znam na tym kompletnie więc proponuję lekturę:

https://avocado.risp.pl/files/texts/od0dogk/html/D_B.html (poszukaj też w tutorialu na tej stronie, powinno być coś o operatorach)


10.08.2005
13:43
[91]

DeV@sT@toR [ Senator ]

PS. Przy przesunięciach w prawo zachodzą odwrotne zjawiska :) czyli z lewej dodawane są zera, z z prawej bity wychodzące poza zakres są tracone.

10.08.2005
13:46
smile
[92]

KULL [ Gladiator ]

ok, thx

(1<< i) to przyklad z ksaizki TIC++

10.08.2005
14:03
smile
[93]

KULL [ Gladiator ]

wiec tutaj:
int i =2;
(1<< i)

kompilator widzi:
( 00000001 << 2)
i wynik to 00000100 ??

10.08.2005
14:09
[94]

DeV@sT@toR [ Senator ]

Powinno tak być, aczkolwiek w praktyce tego nie sprawdzałem :)

10.08.2005
14:31
[95]

DeV@sT@toR [ Senator ]

Zgadza się - wypisuje mi 4 (czyli właśnie 00000100).
W dziesiętnym:

zmienna(czyli 1)*2^przesunięcie(czyli też 2)=1*4=4

Takie mnożenie za pomocą operatorów bitowych (podobnie jak inne działania na bitach) jest ponoć dużo szybsze. Ogólnie z praktycznych zastosowań tych operatorów do tej pory widziałem dwa: właśnie owe mnożenie i tzw. flagi bitowe, które umożliwiają przekazanie w jednej zmiennej wielu danych i następnie np. wrzucenie tego do switch'a (takie flagi napotkasz np. w WinApi).

A wygląda to tak (owe flagi):

enum typ ‹PASEK_JEDNOLITY=1, PASEK_OBRAMOWANY=2, PASEK_PODSWIETLONY=4›;

później jakaś funkcja przyjmuje argumenty typ np.

wyswielt_pasek(typ zmienna);

i np. wpisujesz w ta funkcję coś takiego

wyswietl_pasek(PASEK_JEDNOLITY|PASEK_OBRAMOWANY);

Suma bitowa składa Ci to odpowiednio(00000001|00000010=00000011), a w funkcji masz np. switch, który przy takiej wartości wyświetla Ci pasek jednolity i obramowany). Coś takiego.

12.08.2005
23:40
[96]

DeV@sT@toR [ Senator ]

Czy rzeczywiście nie da się tego rozwiązać w standardzie C++ ?

14.08.2005
23:50
smile
[97]

KULL [ Gladiator ]

zadanie z thinking in C++:

Napisac prog. z zagniezdzonymi petlami for i operatorem %, do znalezienia liczb pierwszych.

No wiec, zrobilem to tak i mniej wiecej dziala :). Jak komus sie chce to moze przetestowac i jezeli da sie to latwiej/inaczej zrobic, to chetnie to zobacze :).

#include <iostream>
#include <string>
#include <fstream>
#include <vector>

using namespace std;

int main()



int a[5];
for (int i=0; i<5; i++)

cout << "podaj "<< i << " liczbe" << endl;
cin >> a[i ];



for (int i=0; i<5; i++)

for (int b=2; a[i ]>=b; b++)


if (((a[i ]%b)==0) && (a[i ]!=b)) break;
if (a[i ]==b) cout << "liczba pierwsza: " << a[i ] << endl;




system("PAUSE");


15.08.2005
00:41
[98]

DeV@sT@toR [ Senator ]

Całkiem cwana implementacja :) Gdzieś jednak widziałem przykład optymalizacji tego algorytmu, która bazowała na rozkładzie liczby na czynniki. Poza tym, ten algorytm miał chyba znajdować liczby pierwsze do zadanej granicy, a więc np. do wartości 10000, a nie wyszukiwać je w podanym ciągu, ale to kwestia interpretacji ćwiczenia, w sumie nieistotna.

15.08.2005
00:55
[99]

DeV@sT@toR [ Senator ]

Tutaj np. są przykłady różnych algorytmów i ich stopniowych optymalizacji:

15.08.2005
01:06
smile
[100]

KULL [ Gladiator ]

OK, teraz oblicza wszystkie liczby pierwsze z przedzialu do 1000, ale bez 1 :/. rano pomysle jak dodac do tego jeszcze ta 1 (spac mi sie chce ;)), bo jak zmienie na b=1 to znajduje tylko jedna liczbe pierwsza = 1.


#include <iostream>
#include <string>
#include <fstream>
#include <vector>

using namespace std;

int main()



int a[1000];
for (int i=0; i<1000; i++)


a[i ]=i+1;



for (int i=0; i<1000; i++)

for (int b=2; a[i ]>=b; b++)



if (((a[i ]%b)==0) && (a[i ]!=b)) break;
if (a[i ]==b) cout << "liczba pierwsza: " << a[i ] << endl;




system("PAUSE");







DeV@sT@toR ---> THX za linka, rano chetnie poczytam.

15.08.2005
01:15
[101]

DeV@sT@toR [ Senator ]

Jedynka i tak nie zalicza się do liczb pierwszych, więc można ją pominąć.

15.08.2005
01:24
[102]

DeV@sT@toR [ Senator ]

Właściwie to musisz ją opuścić bo zawsze będzie Ci wychodzić z pętli instrukcją break; :)

15.08.2005
10:44
[103]

Regis [ ]

Jesli dobrze widze, to sprawdzasz 1000 kolejnych liczb, tak? Zaczynasz od 1 i idziesz do 1000 co 1? Po co? PRzeciez wiadomo ze liczba przysta nie bedzie pierwsza :)

15.08.2005
10:46
[104]

Regis [ ]

No, oczywiscie procz 2, ale ja mozna wypisac "poza petla", lub zapisac do tablicy na poczatku, dodac jeden, zapisac, a potem dodawac juz tylko 2.

A jedynka nie jest liczba pierwsza, wiec nie ma sie co cackac :P

19.08.2005
13:49
smile
[105]

Thufir Hawat [ Konsul ]

Czy mógłby ktoś w jakimś języku programowania zamieścić algorytm, który z dowolnej ilości wczytanych przy uruchomieniu parametrów wyeliminuje powtórzenia? Wynik by pokazywałby już bezpowtórzeniowe paramtery, z jakim uruchomiono program. Przykładowo:

Uruchomienie z parametrem:
run.exe 1 2 3 2 3 4 5 6 7

Wynik
1 2 3 4 5 6 7

Mam dziś cholerną zaćmę i nic nie mogę wymyśleć :/

19.08.2005
14:18
[106]

Romanujan [ Konstruktor Katapult ]

Niech data[SIZE] będzie tablicą z danymi. Poniższy program powinien wyzerować wszystkie powtórzenia,np.

1 2 3 2 3 4 5 6 7

przetworzy na:

1 2 3 0 0 4 5 6 7

// Kod w C++

for(int i = 0; i < SIZE - 1; i++) ‹
for(int j = i + 1; j < SIZE; j++) ‹
if(data == data[j]) ‹
data[j] = 0;




No, mam nadzieję, że się nie pomyliłem :-) Teraz przy wypisywaniu wyników pomijaj zera. Można też przetworzyć tablicę tak, żeby zera były na końcu:

for(int i = 0; i < SIZE - 1; i++) ‹
if(data == 0) ‹
for(int j = i + 1; j < SIZE; j++) ‹
data[j - 1] = data[j];

data[SIZE - 1] = 0;



No, nie jest to może najefektywniejsza metoda, ale chyba powinna działać.

19.08.2005
14:20
smile
[107]

Romanujan [ Konstruktor Katapult ]

O do diaska, co to forum zrobiło z moim postem??? Nie wie ktoś, jak tu można wpisać fragment kodu C++?

19.08.2005
19:43
[108]

KULL [ Gladiator ]

Romanujan --> nawiasy klamrowe zamieniaja sie na > i < a a jak chcesz zapisac "i" w nawiasie kwadratowym to trzeba ze spacja. [i ]

Wypowiedź została zmodyfikowana przez jej autora [2005-08-19 19:41:52]

19.08.2005
20:40
smile
[109]

KULL [ Gladiator ]

a jak dziala uruchamianie z parametrem?

jak wpisze
int main (int arg, char* argv[]);

to po podaniu parametrow, w tablicy
argv[] powinny byc kolejne liczby jakie podam. i sa co mozna sprawdzic przez


for (int a = 1; a<10; a++)

cout << argv[a] << endl;





od 1, bo argv[0] to nazwa pliku. Ale teraz jak przepisac wartosc tabelki argv[a] do np.:
int tab[10]; ????

bo takie cos nie dziala--> tab[0]=argv[1];
a takie cos przepisuje glupoty--> tab[0]=int(argv[1]);

19.08.2005
21:05
[110]

Sir Skull [ Market Square Hero ]

KULL --> Lepiej tak:
for (int a = 1; a<arg; a++)

cout << argv[a] << endl;

Po to jest ten arg żeby z niego korzystać :)

Jeśli chodzi o drugą część, to pamiętaj, że argv to wektor wskaźników na napisy.
Coś takiego tab[0]=argv[1]; , gdzie tab jest typu int nigdy nie zadziała.
Natomiast to tab[0]=int(argv[1]); nie wypisuje głupoty, tylko wykonuje dokładnie to co kazałeś wykonać :)

edit:
Zapomniałem dodać :) Przyda Ci się funkcja atoi(const char* string) do konwersji typów.

Wypowiedź została zmodyfikowana przez jej autora [2005-08-19 21:23:39]

20.08.2005
09:27
smile
[111]

KULL [ Gladiator ]

Myslelem ze cos genialnego wymyslielem, a tutaj przepisuje mi liczby :). Nie wiem jak sie dobrac do zawartopsci argv[] :/.

Sir Skull -> na stringa trzeba zamienic ten argv[] ?


#include <iostream>
#include <string>
#include <fstream>
#include <vector>

using namespace std;


int main (int arg, char* argv[])



for (int d=1; d<6;d++)


cout << atoi(argv[d]) << " ";



system("PAUSE");

cout << endl << "..................." << endl;

int c=0;
int e=0;
for (int a=1; a<6;a++)

if (argv[a]==0)

e=a;
c=2;





for (int a=1; a<6 ; a++)

if (argv[a]==0) continue;
else

for (int g=(a+1); g<6; g++)

if (argv[a]==argv[g]) argv[g]=0;






for (int c=1; c<6; c++)

if (c==2 && c==e) cout << "0,";
if (argv[c]!=0) cout << argv[c] << ", ";


system("PAUSE");




Wypowiedź została zmodyfikowana przez jej autora [2005-08-20 09:25:02]

20.08.2005
10:22
[112]

Sir Skull [ Market Square Hero ]

KULL --> Pokażę Ci 2 rozwiązania. Pierwsze jest z zastosowaniem tablicy int'ów (tak jak chciałeś wczoraj):
#include <iostream>
#include <stdlib.h>

using namespace std;
int main(int argc, char* argv[])

int tab[argc-1];
int a=1;
for (a = 1; a<argc ; a++)

cout << argv[a] << endl; //najpierw wypisuję z argv[]
tab[a]=atoi(argv[a]); // konieczna konwersja

cout << "-------------------" <<endl;
for (a = 1; a<argc ; a++)

cout << tab[a] << endl; //tutaj dla sprawdzenia czy mamy to samo w tab[]

system("PAUSE");
return 0;


Drugie rozwiązanie różni się od pierwszego jedynie tym, że tab[] jest typu char*. Dzięki temu nie musimy robić konwersji i taki zapis: tab[a]=argv[a] zadziała poprawnie. Podaje całość:
#include <iostream>
#include <stdlib.h>

using namespace std;
int main(int argc, char* argv[])

char* tab[argc-1];
int a=1;
for (a = 1; a<argc ; a++)

cout << argv[a] << endl;
tab[a]=argv[a];

cout << "-------------------" <<endl;
for (a = 1; a<argc ; a++)

cout << tab[a] << endl;

system("PAUSE");
return 0;


Pierwszy przykład zadziała tylko w przypadku int'ów. Drugi jest ciut bardziej wszechstronny, dlatego też lepszy :)

20.08.2005
11:15
[113]

KULL [ Gladiator ]

Sir Skull --> aaa.. czyli to tak dziala. Dzieki wielkie! Genialne.
Teraz mam problem z np. tab[j]=0;
Nie chce mi w taki sposob zmienic wartosci w tabeli, program sie sypie :(

ponizej kod programu, ktory nadal przepisuje tylko liczby :/


#include <iostream>
#include <string>
#include <fstream>
#include <vector>

using namespace std;


int main (int argc, char* argv[])



char* tab[argc-1];
int a=1;
for (a = 1; a<argc ; a++)

cout << argv[a] << endl;
tab[a]=argv[a];

cout << "-------------------" <<endl;
for (a = 1; a<argc ; a++)

cout << tab[a] << endl;


system("PAUSE");





// zamiana podwojnych liczb na 0

for(int i = 1; i < argc - 1; i++)


for(int j = i + 1; j < argc; j++)


if(tab==tab[j]) tab[j]=0;








//wypisanie wynikow z zerami




for (int t = 1; t<argc ; t++)

cout << tab[t] << endl; //tab[] z 0

system("PAUSE");





//wypisanie wynikow bez zer





for (int c=1; c<argc ; c++)

if (tab[c]!=0) cout << tab[c] << ", ";


system("PAUSE");


20.08.2005
21:52
smile
[114]

KULL [ Gladiator ]

ok, mam, juz wiem w czym problem :). Do tab[] ktory jest typu char, chcialem wpisac tab[]=0;, zamiast tab[]="0". Zaraz podam pelny kod programu, ktory nawet zero potrafi zobaczyc :).

20.08.2005
22:02
smile
[115]

KULL [ Gladiator ]

Gotowe. Fajnie dziala. Dzieki za pomoc :). Thufir Hawat wystarczyli Ci co dal Romanujan, ale pomysl na algorytm dla mnie w tym przypadku byl prostrzy niz zaimportowanie juz gotowego algorytmu do kodu C++ i fajne zadanko sie z tego zrobilo :). Sir Skull - thx za objasnienia.

Do programu sie jeszcze przyda na koncu menu z sortowaniem tych liczb.


#include <iostream>
#include <string>
#include <fstream>
#include <vector>

using namespace std;


int main (int argc, char* argv[])

cout << "----------------------------------" <<endl;
cout << "--------- Podane liczbt ----------" <<endl;
cout << "----------------------------------" <<endl;
cout << " " <<endl;
char* tab[argc];
int a=1;
for (a = 1; a<argc ; a++)

cout << argv[a] << ", ";
tab[a]=argv[a];



cout << " " <<endl;
cout << " " <<endl;
system("PAUSE");





// zamiana podwojnych liczb na "zero"

for(int i = 1; i < argc - 1; i++)


for(int j = i + 1; j < argc; j++)


if(atoi(tab)==atoi(tab[j])) tab[j]="zero";
››



cout << " " <<endl;

cout << "----------------------------------" <<endl;
cout << "------ Liczby bez powtorzen ------" <<endl;
cout << "----------------------------------" <<endl;
cout << " " <<endl;





for (int c=1; c<argc ; c++)

if (tab[c]!="zero") cout << tab[c] << ", ";

cout << " " <<endl;
cout << " " <<endl;
system("PAUSE");


20.08.2005
22:06
smile
[116]

Thufir Hawat [ Konsul ]

Dzięki chłopaki za pomoc! :)

Potrzebowałem posegregować wszelkie replikacje kontrolerów domeny, sprawdzić daty, ilość replikacji nieudanych itp.
Od tej rzeźby już miałem taki zator, że głupiego sortowanio-czyściciela nie mogłem wykombinować :)

20.08.2005
22:44
smile
[117]

KULL [ Gladiator ]

a ja teraz sie mecze z sortowaniem od najmniejszej do najwiekszej, bo nie moge przepisac wartosci jednej tabelki do drugiej. np.:

char* tab1[1];
char* tab2[1];
tab1[0]=tab2[2]; // to nie dziala :(

jak to przepisac?

20.08.2005
23:32
[118]

aka [ Chor��y ]

KULL --> musisz dolaczyc <cstring> i użyć funkcji strcpy(cel, zrodlo);

a poniżej moja wersja rozwiązania:

#include <list>
#include <iostream>
#include <string>

int main(int argc, char* argv[])

using namespace std;
list <string> c1;
list <string>::iterator c1_Iter;

for (int i = 1; i < argc; ++i) ‹
c1.push_back(argv[i]);

c1.sort();
c1.unique();
for (c1_Iter = c1.begin(); c1_Iter != c1.end(); ++c1_Iter) ‹
cout << *c1_Iter << endl;

system("pause");

21.08.2005
09:55
[119]

KULL [ Gladiator ]

aka --> przy list<string> c1;
krzyczy: 'list' is used as a type, but is not defined as a type.

co oznacza to list? ja znam tylko deklaracje stringa typu: string s1;


btw: fatalnie wyglada jak kod programu potraktuje sie italickiem :]. zmieniam upodobania.

21.08.2005
10:08
[120]

Sir Skull [ Market Square Hero ]

list <string> jest szablonem listy z STL'a. STL - Standard Template Library czyli taka fajna biblioteka znacznie ułatwiająca życie programisty :)

Kod aka jest dobry. W Dev-C++ i Visual 6.0 kompiluje się i działa poprawnie.

28.08.2005
18:01
smile
[121]

Unreal20044 [ Centurion ]

Jest to zwykły program na konsole. Za kazdym razem gdy go robie wyskakuja mi bledy w! pierwszym Case 1: i zawsze mam tam blad. pod Koniec break. Pomocy juz ku........... mam tego dosyc. ile razy moge sie na to wtykac!!!!!!!!!!!!!!
Oto Moj program:


#include <cstdlib>
#include <iostream>

using namespace std;

int main(int argc, char *argv[])

int haslo, pole;
char decyzja, wybor;
float x, b;
cout << "Autor:Pawel Paryga 8====D" << endl;
cout << "Haslo="; cin >> haslo; cout << endl;
if (haslo==4444)

while (1) ‹
poczatek:
cout << "Wybierz figure: 1 - Prostokat, 2 - trojkat, 3 - kolo, 0 - Koniec" << endl;
cin >> wybor; cout << endl;
switch (wybor)

case 1:
cout << "Poddaj dlugosc bokow prostokata:"; cin >> x >> b;
pole = x * b;
break;
case 2:
cout << "Podaj wysokosc i dlugosc podstawy trojkata:"; cin >> x >> b;
pole = 0.5 * x * b;
case 3:
cout << "Podaj promien kola:"; cin >> x;
pole = 3.14 * x * x;
case 0: goto koniec;
default: continue




else cout << haslo << "-To haslo jest bledne. Zakonczyc? (t/n)";
cin >> decyzja;
if (decyzja=='t')‹ goto poczatek; ›
if (decyzj=='n') continue
koniec:


system("PAUSE");
return EXIT_SUCCESS;




Błagam. Jak ktos zna odpowiedz. Gdzie ja robie bład to niech mi tu umiescie drugi poprawny kod lub powie przynajmiej gdzie on tkwi.

28.08.2005
18:55
[122]

Daro2k [ Pretorianin ]

Unreal20044 -> zmień typ zmiennej "pole" z int na float.

28.08.2005
20:20
smile
[123]

Unreal20044 [ Centurion ]

Dzikuje. A czy są jakies zmiene które moga przechowywać wyraz?

28.08.2005
23:00
[124]

Voutrin [ Pretorianin ]

Wyraz mozna przechowywac w tablicy:

char tablica[] = "wyraz"

Wypowiedź została zmodyfikowana przez jej autora [2005-08-28 22:57:11]

29.08.2005
00:02
smile
[125]

KULL [ Gladiator ]

Unreal20044 -->

ja polecam string :)

#include <string>
int main()

string s1; //pusty lancuch
s1="tralala"; //przypisanie lancuchowi wartosci :)

07.09.2005
17:18
smile
[126]

KULL [ Gladiator ]

Czy obrazek ze schematem to schemat petli FOR i czy zgadza on sie w pelni z zamieszczonym kodem??

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


#include <iostream>
using namespace std;

int main (int argc, char *argv[])

for (int i=0; i<=7; i+=2)

cout << "x";


system("pause");

return 0;


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

Wypowiedź została zmodyfikowana przez jej autora [2005-09-07 17:21:35]

07.09.2005
17:21
[127]

..:::Marbi:::.. [ I am Enjoy! ]

Witam, szukam jakiegoś dobrego kursy c++... najlepiej z przykładami i zadaniami... Narazie kupiłem sobie naukę w C++ od komputer świata, ale słyszałem, że jest słaba... i mało się nauczę... niedługo pewnie ją zacznę :) WAle co polecacie później? Jakieś książki? Może coś dobrego w internecie?

07.09.2005
17:22
smile
[128]

KULL [ Gladiator ]

I jeszcze kolejne pytanko :)
niby banalne, niby napisalem to, ale wole sie upewnic, bo mam jeszcze w glowie wakacyjny metik :P.


Ma pokazywac 0 gdy podana liczba jest parzysta i 1 gdy nieparzysta.
-------------------------------------------------------------------------
#include <iostream>
using namespace std;

int main (int argc, char *argv[])

int a, b;
cin >> a;
b = (a% 2==0)? 0 : 1;

cout <<b;
system("pause");

return 0;


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

07.09.2005
17:24
smile
[129]

KULL [ Gladiator ]

..:::Marbi:::.. --> na samym poczatku watku masz od zarabania dobrych kursow :). A z ksiazek to Symfonie polecam. Bo kilka tygodni temu kupilem sobie Thinking in C++ - super ksiazka, ale tylko dla tych co maja jakies poddstawy w C lub C++. Osobiscie polecam, nauke podstaw ze stron www, a pozniej zakup Thinking in C++ do poczytania przed snem :).

07.09.2005
17:27
[130]

Regis [ ]

Pierwsze (rysunek) - w for zwiekszasz zmienna i, a w samej petli wypisujesz nieistniejaca zmienna X. Nie bardzo kumam w czym rzecz...

Ale pomijajac brak logiki z tym 'i' i 'x', to sie zgadza.

Co do drugiego - a nie mozesz sam tego sprawdzic dajac programowi do sprawdzenia kilka cyfr? :)

07.09.2005
17:28
smile
[131]

Sir Skull [ Market Square Hero ]

KULL --> Poprawnie :)

07.09.2005
17:33
[132]

alpha_omega [ Generaďż˝ ]

W sumie zakładałem już taki wątek, ale popłynął w innym kierunku, niż założony. Tak więc zapytam tutaj:

Jakie książki polecacie do nauki matematyki na poziomie licealnym i zapewniającym wstęp na kierunek informatyczny? Jakie działy matematyki powinienem poznać w pierwszej kolejności, jakie następnie, ażeby osiągnąć najwyższą efektywność i się nie zagubić? Z góry dzięki za pomoc :)

07.09.2005
17:33
smile
[133]

KULL [ Gladiator ]

Regis --> sprawdzalem, ale strasznie rozrzesiony mam umysl przez kampanie wrzesniowa na uczelni :) i nie jestem pewien wlasnych przemyslen :P. "i" to zmienna, a "X" to litera. I jest pytanie, ile literek X taka petla napisze. Mi wychodzi, ze 4. :)

Dzieki wielkie za sprawdzenie !!!.

07.09.2005
17:38
smile
[134]

KULL [ Gladiator ]

alpha_omega ---> w pierwszym numerze czasopisma WARP jest duzo o matmie napisane. O matematyce ukierumnkowanej na programowanie i grafike. Na WARPowej stronie www.warp.arx.pl tez znajdziesz sporo artykulow o matematyce dla informatyka. Ogolnie rzecz ujmując. glownie trzeba sie znac na ukladach wspołrzędnych 2D/3D i umieć przeliczać systemy liczbowe.

07.09.2005
17:44
[135]

Sir Skull [ Market Square Hero ]

KULL --> jasne, że 4 ;)
alpha_omega --> Kup sobie jakikolwiek zbiorek zadań, albo nawet i dwa. Mogę Ci polecić dwa: Gdowski, Pluciński "Zbiór zadań z matematyki dla kandydatów na wyższe uczelnie" i Szymański, Dróbka "Matematyka w szkole średniej". Pierwsza ma ponad 2000 zadań (w tym z egzaminów wstępnych z różnych polskich uczelni ) - wszystko co trzeba. Druga zawiera trochę mniej zadań, ale za to przy każdym dziale jest wyłożona teoria. Do tego jeszcze są zestawy maturalne. Nie wiem jak w nowszych wydaniach. Moje mają już 6 lat.

Wypowiedź została zmodyfikowana przez jej autora [2005-09-07 17:42:31]

07.09.2005
23:34
[136]

Qbaa [ Senator ]

KULL ile ten WARP kosztuje? pierwszy raz o tym słyszę :)

ALL wie ktoś może gdzie można dostać tę książeczkę C++ z KŚ? chciałbym to sobie obadać :)

08.09.2005
08:50
[137]

KULL [ Gladiator ]

Qbaa --> www.warp.arx.pl :). szukaj w Empiku, cena 19.90, na dniach ma wyjsc drugi numer.

co do Komp. Swiat, to jest to dla bardzo poczatkujacych. Osobiscie mam to i nie polecam. Za 10zl sie nie oplaca. Bo w stosunku do np. Thinking in C++, ktora na allegro kupilem za jakies 46zl, to jest to 1/5 tej ceny. wiec lepiej odlozyc kilka razy te 10zl, pozbierac i kupic cos lepsiejszego.

08.09.2005
17:25
smile
[138]

alpha_omega [ Generaďż˝ ]

KULL ----------> Dzięki, ale chodziło mi o matmę wymaganą na egzaminie tj. program licealny, orientuję się dość dobrze w wymaganiach matematycznych stawianych przed programistą z ukierunkowaniem na API graficzne. Magazyn z chęcią przejrzę :)

Sir Skull -----------> Wielkie dzięki :)

08.09.2005
23:27
smile
[139]

KULL [ Gladiator ]

alpha_omega --> no racja :). Dodam wiec jeszcze, ze na studiach politechnicznych to na matmie sa same calki :]. W liceum jest fajna matma :P, mozna sie nia cieszyc, co udowadniam codziennie bratu pomagajac (czytac: robiac) mu w zadaniach domowych. Studia to juz katorga, jak lubialem matme, tak tutaj walczy sie tylko o przetrwanie :P.

12.09.2005
18:11
smile
[140]

Toolism [ GameDev ]

Ok panowie będę do was miał wielką prośbę.. męczę się nad pewnym programem który w gruncie rzeczy jest bardzo banalny.. i dlatego trochę mi wstyd ale tak czy siak wysłuchajcie mnie..

Chcę napisać funkcję która zwracałaby drugi bajt liczby którą jej się poda jako argument. Niech argumentem będzie zmienna typu int..

Wiem że wskaźnik do char przeskakuje co 1 bajt prawda? Zatem mój pomysł opierał się na tym że gdyby zastosować wskaznik do char na tej liczbie int.. to mógłbym przelecieć po poszczególnych bajtach. Niestety coś robię źle.. nie wiem nawet czy dobrze rozumiję. Popatrzcie na kod. Aha chodzi mi o to zeby ten drugi bajt był interpretowany jako jakaś liczba. Wiem że ta funkcja jest trochę idiotyczna.. ale chodzi o samo zastosowanie.

#include <iostream.h>

int secondByte(int a)

char* point;
int help[1];
help[1]=a;

point=(char*)&help;
return (int)*(help+1);



int main()

cout << "and the result is.. : " << secondByte(124) << endl;
return 1;



12.09.2005
18:12
[141]

Toolism [ GameDev ]

No i oczywiscie.. ee.. program mi nie działa:) Wytknijcie proszę błędy:) Gdzie ja źle rozumiję?

12.09.2005
19:15
[142]

Toolism [ GameDev ]

poratujcie koledzy :)
swoją drogą , strasznie dłuuuuuuuuuuuugi się ten wątek zrobił. Może zrobilibyście nowy?:)

12.09.2005
19:43
[143]

Kubol [ Konsul ]

Wystarczy tak:

char *point;

point=(char*)&a;
return point[1];


dwie uwagi:
1. To który bajt zwróci, zależy od procesora, może zwrócić drugi lub trzeci bajt (o ile skompilowane na 32 bity).

2.jeśli robisz
int help[1], to
a.) samo help już jest wskaźnikiem
b.) tablice się indeksuje od 0, więc help[1] jest w ogóle tutaj poza zakresem.

12.09.2005
20:04
[144]

Toolism [ GameDev ]

Czyli to powinno wyglądać jakoś tak?
Mam tutaj pytanie.. Kompiluje się toto bezbłędnie ale jednak.. przeciez funckja ma zwracac wartość typu INT a skoro uzywam wzkaznika typu char to czy poszczególne komórki na które będzie wskazywał nie będą interpretowane jako CHAR wlasnie? Nie trzeba tutaj robic castowania?
czyli jakos najpierw
return (int)point[1] ? Jesli nie to dlaczego>?



#include <iostream.h>

int secondByte(int a)

char* point;
point=(char*)&a;
return point[1];



int main()

cout << secondByte(456) << endl;
return 1;

12.09.2005
20:37
[145]

Kubol [ Konsul ]

Nie, bo pisząc return point[1] zwracasz przez wartość, kompilator nie traktuje tego jak tablicy. Sam robi cast na int.

12.09.2005
23:14
[146]

zurg [ Centurion ]

hmmm... mam wrażenie że robicie to trochę naokoło... Zaprzęgać do tego wskaźniki? Przecież po to wymyślono operatory bitowe...

#include <iostream.h>

int secondByte(int a)

return ((a & 240)>>4);


int main()

cout << secondByte(2233);
return 0;


Krótki opis:
a & 240 powoduje iloczyn logiczny liczby a i 240 (w zapisie bitowym 1111000) czyli wynik to zawsze xxxx0000 (w zapisie bitowym) gdzie zamiast 'xxxx' mamy cztery interesujące bity liczby a składające się na jej przedostatni bajt.

>>4 to przesunięcie otrzymanej liczby o 4 bity w lewo czyli usunięcie zer. Z liczby xxxx0000 otrzymujemy xxxx.

13.09.2005
00:56
smile
[147]

KULL [ Gladiator ]

Toolism --> juz na dniach zrobie nowy watek, tylko musze pozbierac do kupy wszystkie nowe linki jakie maja trafic do wstepu :)

23.09.2005
15:00
[148]

KULL [ Gladiator ]

............ to nie spam :) nie moge podpiac watku bo jest dosc stary juz wiec pisze bzdety :). Za kilka dni zrobie nowy, z nowymi suepr linkami :P

24.09.2005
11:33
smile
[149]

KULL [ Gladiator ]

NOWY wątek !!!!!!!!!!!!!!!!!!! :)
z nowymi fajnymi linkami, zapraszam.

https://forumarchiwum.gry-online.pl/S043archiwum.asp?ID=4245197&N=1

© 2000-2025 GRY-OnLine S.A.