more_numbers = (int*) realloc (numbers, count * sizeof(int));
Zanima me što znači int*, znam da je '*' inače pointer ali ne znam u ovome smislu što predstavlja? Mislim da radi i bez '*'. Znam da je funkcija tog dijela da definira pokazivač kojem tipu podataka pripada.
Programiranje u C++-u - pitanja i odgovori
- poruka: 7.284
- |
- čitano: 1.955.815
- |
- moderatori:
XXX-Man
- +/- sve poruke
- ravni prikaz
- starije poruke gore
more_numbers = (int*) realloc (numbers, count * sizeof(int));
Zanima me što znači int*, znam da je '*' inače pointer ali ne znam u ovome smislu što predstavlja? Mislim da radi i bez '*'. Znam je funkcija tog dijela da definira pokazivač kojem tipu podataka pripada.
Radi se o type castingu. U osnovi govoriš kompajleru da neku varijablu treba tretirati kao da je nekog drugog tipa.
Funkcija realloc vraća pokazivač tipa void. Ovo je jednostavno castanje onoga što realloc vraća u pokazivač na integer (int*).
C dozvoljava dodjeljivanje vrijednosti void pokazivača pokazivaču nekog drugog tipa bez castanja:
int *a = malloc(sizeof(int)*10);
Dok C++ ne dozvoljava pa je potrebno castati void pokazivač u npr. int pokazivač:
int *a = (int*)malloc(sizeof(int)*10);
Hvala na odgovoru, ali to sam u osnovi sve znao.
Nego me konkretno zanima uloga '*' jer u C-u normalno funkcionira i:
int *a = (int *) malloc (sizeof(int)*10);
...a i:
int *a = (int) malloc (sizeof(int)*10);
Nego me konkretno zanima uloga '*' jer u C-u normalno funkcionira i:
int *a = (int *) malloc (sizeof(int)*10);
...a i:
int *a = (int) malloc (sizeof(int)*10);
Zato što na 32 bitnim sustavima ništa u biti ne gubiš. Memorijska adresa koju pokazivač drži u sebi jest cijeli broj (integer). C takve radnje dozvoljava, iako ja ne bih castao pokazivač u integer iz razloga što na 64 bitnim sustavima integer može biti i 32 bita, a pokazivači su 64 bitni pa ćeš napraviti cirkus, (a i ne mora tako biti ako je adresa ispod 4 GB, ali nemoj se povoditi za time).
Plus izgleda zbunjujuće.
Zvjezdica u castingu govori da se radi o pokazivaču na neki tip, a ne o tom tipu kao takvom.
Prvi casting pretvara pokazivač na void u pokazivač na integer, a drugi pretvara pokazivač na void u integer.
Nego me konkretno zanima uloga '*' jer u C-u normalno funkcionira i:
int *a = (int *) malloc (sizeof(int)*10);
...a i:
int *a = (int) malloc (sizeof(int)*10);
Zato što na 32 bitnim sustavima ništa u biti ne gubiš. Memorijska adresa koju pokazivač drži u sebi jest cijeli broj (integer). C takve radnje dozvoljava, iako ja ne bih castao pokazivač u integer iz razloga što na 64 bitnim sustavima integer može biti i 32 bita, a pokazivači su 64 bitni pa ćeš napraviti cirkus, (a i ne mora tako biti ako je adresa ispod 4 GB, ali nemoj se povoditi za time).
Ispravnije bi bilo reći da alocirana adresa može biti iznad 32 bita (32-64), što običan int (32bit) ne može obuhvatiti.
dvije rijeci npr:
abdkl
addsl
da izbaci funkcija rezultat
adl 3
Dakle adl su slova koja se sadrze u obje rijeci, a 3 duzina ponavljanih slova?
#include<iostream>
#include<vector>
using namespace std;
int provjeri(string a,string b,vector<bool>& indeksi_ponavljanja){
if(a.length()==b.length()){
int brojac=0;
for(int i=0;i<a.length();i++){
if(a.at(i)==b.at(i)){
indeksi_ponavljanja.push_back(true);
brojac++;
}
else
indeksi_ponavljanja.push_back(false);
}
return brojac;
}
else {
cout<<"Duzine nisu iste!!"<<endl;
return 0;
}
}
int main(){
string rijec1;
cout<<"Unesite rijec1: "<<endl;
cin>>rijec1;
cin.clear();
cout<<"Unesite rijec2: "<<endl;
string rijec2;
cin>>rijec2;
cin.clear();
vector<bool> ponavljanja;
int broj=provjeri(rijec1,rijec2,ponavljanja);
for(int i=0;i<ponavljanja.size();i++){
if(ponavljanja.at(i))
cout<<rijec1.at(i);
}
cout<<" "<<broj<<endl;
}
jel garantirano da su sortirani nizovi ?
@code breaker
Je li moguce kako bez vektora ovo uraditi? Nikako ne mogu da skontam kako sa njima da radim, jer uopste do njih nismo ni dosli.
#include<iostream>
using namespace std;
int provjeri(string a,string b,int* indeksi_ponavljanja){ //proslijedim adresu prvog elementa u nizu., u niz na indeksima gdje su elementi isti postavim 1, gdje nisu 0.
if(a.length()==b.length()){
int brojac=0;
for(int i=0;i<a.length();i++){
if(a.at(i)==b.at(i)){
indeksi_ponavljanja[i]=1;
brojac++;
}
else
indeksi_ponavljanja[i]=0;
}
return brojac;
}
else {
cout<<"Duzine nisu iste!!"<<endl;
return 0;
}
}
int main(){
string rijec1;
cout<<"Unesite rijec1: "<<endl;
cin>>rijec1;
cin.clear();
cout<<"Unesite rijec2: "<<endl;
string rijec2;
cin>>rijec2;
cin.clear();
int ponavljanja[rijec1.length()]; //duzina niza je jednaka duzini prve unesene rijeci
int broj=provjeri(rijec1,rijec2,ponavljanja);
for(int i=0;i<rijec1.length();i++){ //ovo ovdje mozes postaviti u if statement da provjeris jesu li doista rijeci iste duzine pa onda da ispisujes.
if(ponavljanja[i]==1)
cout<<rijec1.at(i);
}
cout<<" "<<broj<<endl;
}
dvije rijeci npr:
abdkl
addsl
da izbaci funkcija rezultat
adl 3
Dakle adl su slova koja se sadrze u obje rijeci, a 3 duzina ponavljanih slova?
Može ovako?
#include <stdlib.h>
#include <stdio.h>
int main()
{
char *rijec1="abdkl", *rijec2="addsl";
char znakovi1[256]={0}, znakovi2[256]={0};
int n, ponavljanja=0;
for (n=0; rijec1[n]; n++)
znakovi1[rijec1[n]]++;
for (n=0; rijec2[n]; n++)
znakovi2[rijec2[n]]++;
for (n=0; n<256; n++)
if (znakovi1[n] && znakovi2[n])
{
printf("%c", n);
ponavljanja++;
}
printf(" %d\n", ponavljanja);
system("pause");
return 0;
}
Hvala ti puno na vremenu I objasnjenju, Evo radi program bas kako mi I treba. Ono sa cim imam problema su zavrsni koraci. Petlje mi nisu toliko komplikovane za napisati. Ali problem mi skoro uvijek predstavlja kako da se rezultat ocita u main funkciji. Ne mogu da skontam kako da prevedem rezultat iz sporedne funkcije da se ocita u glavnoj.
@rustweaver - mozes li mi reci kako koristimo printf? Sta se nalazi u zagradi nakon printf? Je li ono potice iz C-a, jer sa njim nemam nikakvog iskustva. Poceo sam odmah sa c++, I uvijek smo nastojali da ne koristimo printf. Je li greska poceti odmah sa c++, a ne sa C?
Hvala ti puno na vremenu I objasnjenju, Evo radi program bas kako mi I treba. Ono sa cim imam problema su zavrsni koraci. Petlje mi nisu toliko komplikovane za napisati. Ali problem mi skoro uvijek predstavlja kako da se rezultat ocita u main funkciji. Ne mogu da skontam kako da prevedem rezultat iz sporedne funkcije da se ocita u glavnoj.
Nisam bas siguran sta ti predstavlja problem. Ne znas kako napraviti fju koja ce odraditi nesto ili ne znas sta vratiti kao rezultat poziva te fje? Sto god ti nije jasno pitaj ovdje., pomoci ce vec neko.
Hvala ti puno na vremenu I objasnjenju, Evo radi program bas kako mi I treba. Ono sa cim imam problema su zavrsni koraci. Petlje mi nisu toliko komplikovane za napisati. Ali problem mi skoro uvijek predstavlja kako da se rezultat ocita u main funkciji. Ne mogu da skontam kako da prevedem rezultat iz sporedne funkcije da se ocita u glavnoj.
Nisam bas siguran sta ti predstavlja problem. Ne znas kako napraviti fju koja ce odraditi nesto ili ne znas sta vratiti kao rezultat poziva te fje? Sto god ti nije jasno pitaj ovdje., pomoci ce vec neko.
Ovako, kada stavimo u main funkciju cout<<nekafunkcija, ovdje ce se ocitati linija return nesto; iz te sporedne funkcije ili?
A ako ne stavimo ovo cout, vec samo pozovemo funkciju tu iz main-a, onda moramo da stavimo cout<<nesto u sporednu funkciju?
Da, printf je funkcija standardne C input/output biblioteke. Sama funkcija zapravo i nije komplicirana za koristiti, prvi argument je uvijek string koji određuje kako će se što ispisivati, a drugi argumenti su podatci koje želiš ispisati. Ali tebi je vjerojatno neobična i zbunjujuća zato što si navikao koristiti cout.
http://www.cplusplus.com/reference/cstdio/printf/
Iako ovdje nema razloga zašto ne bi mogao koristiti cout umjesto printf ;)
Ta dva printfa lako zamijeniš coutima ovako:
printf("%c", n);
u:
cout << (char)n;
i
printf(" %d\n", ponavljanja);
u:
cout << " " << ponavljanja << endl;
Nije, ionako je C "dio" C++ jezika, pa sve iz C-a imaš i u C++-u ako ti zatreba.
Hvala ti puno na vremenu I objasnjenju, Evo radi program bas kako mi I treba. Ono sa cim imam problema su zavrsni koraci. Petlje mi nisu toliko komplikovane za napisati. Ali problem mi skoro uvijek predstavlja kako da se rezultat ocita u main funkciji. Ne mogu da skontam kako da prevedem rezultat iz sporedne funkcije da se ocita u glavnoj.
Nisam bas siguran sta ti predstavlja problem. Ne znas kako napraviti fju koja ce odraditi nesto ili ne znas sta vratiti kao rezultat poziva te fje? Sto god ti nije jasno pitaj ovdje., pomoci ce vec neko.
Ovako, kada stavimo u main funkciju cout<<nekafunkcija, ovdje ce se ocitati linija return nesto; iz te sporedne funkcije ili?
A ako ne stavimo ovo cout, vec samo pozovemo funkciju tu iz main-a, onda moramo da stavimo cout<<nesto u sporednu funkciju?
cout<<nekafja(parametri) ispisuje na konzolu rezultat poziva nekefje(parametri)., ukoliko npr napises int broj=nekafja(neki_broj); rezultat poziva fje nekafja(neki_broj) ce se dodijeliti varijabli broj. Naravno ovdje moras paziti da fja nekafja vraca odgovarajuci tip podatka., ili barem tip podatka koji se moze konvertovati u tip int(u ovom primjeru). Najbolje bi bilo kad bi nabavio neku knjigu iz c++ i po njoj radio.
Jel netko ima ideju zašto ovo ne radi? U pitanju su linked liste. Pokušavam pomoć frendu ali kako smo si ja i C++ na "Vi", ovo je najbolje kaj sam uspio složit a da se ne zbrejka skroz
#include <iostream>
using namespace std;
struct cvor {
int podatak;
cvor *veza;
};
void ispisiElemente(struct cvor *ispis)
{
// ispisuje elemente niza
cvor *lista = ispis;
while (lista)
{
cout << "Pocetak ispisa";
cout << lista->podatak << "\r\n";
lista = lista->veza;
}
cout << endl;
}
int main()
{
cvor *glava = NULL;
cvor *novi = NULL;
int i = 0;
do
{
// dodaje na pocetak
cin >> i;
cvor *novi;
novi = new cvor;
novi->podatak = i;
novi->veza = glava;
glava = novi;
}
while (i != 0);
ispisiElemente(novi);
do
{
// dodava na kraj
cin >> i;
cvor *novi = new cvor;
novi->podatak = i;
novi->veza = NULL;
}
while(i != 0);
ispisiElemente(novi);
return 0;
}
Ugl, zadatak je ubacit elemente na početak liste dok korisnik ne upiše nulu pa to ispisati i onda ubaciti elemente na kraj liste opet dok korisnik ne upiše 0 pa to ispisati. Ovaj program ne ispisuje ništa
. Što sam u*ebo?
Jel netko ima ideju zašto ovo ne radi? U pitanju su linked liste. Pokušavam pomoć frendu ali kako smo si ja i C++ na "Vi", ovo je najbolje kaj sam uspio složit a da se ne zbrejka skroz
Block scope.
http://pic.dhe.ibm.com/infocenter/comphelp/v121v141/index.jsp?topic=%2Fcom.ibm.xlc121.aix.doc%2Flanguage_ref%2Fcplr013.html
"If the declarator or type specifier that declares the identifier appears inside a block or within the list of parameter declarations in a function definition, the identifier has block scope, which terminates at the end of the associated block. If the declarator or type specifier that declares the identifier appears within the list of parameter declarations in a function prototype (not part of a function definition), the identifier has function prototype scope, which terminates at the end of the function declarator. If an identifier designates two different entities in the same name space, the scopes might overlap. If so, the scope of one entity (the inner scope) will be a strict subset of the scope of the other entity (the outer scope). Within the inner scope, the identifier designates the entity declared in the inner scope; the entity declared in the outer scope is hidden (and not visible) within the inner scope."
cvor 'novi' ti je deklariran u bloku funkcije main i inicijaliziran na NULL, te je potom ponovno deklariran unutar bloka while petlje. Kada while petlja završi scope mu isto završava, pa se sada identifikator 'novi' ponovno odnosi na prvotno deklariranu varijablu sa tim imenom, te ponovno ima svoju originalnu vrijednost - NULL. Ne daj da te identičan naziv varijabli zavara, radi se o dvije različite varijable sa istim identifikatorom (nazivom).
Ukratko izbaci deklaracije varijabli iz petlje (ne općenito, nego u ovom konkretnom slučaju).
Jesi možda nešto ovakvo imao na umu?
#include <iostream>
using namespace std;
struct cvor
{
int podatak;
cvor *veza;
};
void ispisiElemente(struct cvor *ispis)
{
// ispisuje elemente niza
for ( ; ispis; ispis = ispis->veza)
{
cout << "Pocetak ispisa ";
cout << ispis->podatak << "\r\n";
}
cout << endl;
}
int main()
{
cvor *glava = NULL;
cvor *novi = NULL;
cvor *lista = NULL;
int i = 0;
do
{
// dodaje na pocetak
cin >> i;
if (i != 0)
{
novi = new cvor;
novi->podatak = i;
novi->veza = glava;
glava = novi;
}
}
while (i != 0);
// zabiljezimo pocetak liste i premotamo na kraj
for (lista = glava; glava && glava->veza; glava = glava->veza) {};
do
{
// dodava na kraj
cin >> i;
if (i != 0)
{
novi = new cvor;
novi->podatak = i;
novi->veza = NULL;
if (glava)
glava->veza = novi;
else
lista = novi;
glava = novi;
}
}
while (i != 0);
ispisiElemente(lista);
return 0;
}
dio (pot.h) i (pot.cpp) moram doraditi , nesto mi ne ide.
u pot.h trebam unijeti prevzeti konstruktor, navadni konstruktor, koji su upotrjebljeni u glavnem programu te destruktora, set i get dekleraciju prekrivanja operatora za ispis.
--u pot.cpp trebamo dekleraciju prevzetog, navadneg konstruktora , destruktora i izvedbu prekrivanja operatora za ispis
--- treba jos u razred Pot ubaciti metodu int dolzina() koja bi izracunala put kada bismo putovali ravnim linijama. to izracunamo tako sto prvo izracunamo razliku u vertikalnoj smer(deltaD = razlika zemljepisnih dolžin) i horizontalni smeri (deltaS = razlika zemljepisnih širin). Obe razliki izrazite u zemljepisnih sekundaamaini ubacite ih u formulu
razdalja_v_km = sqrt(9.75 * deltaD^2 + 4.58 * deltaS^2)/100
#include <iostream>
using namespace std;
int main() {
char slovo;
cout << "Unesite slovo: ";
cin >> slovo;
cout << slovo << endl;
slovo |= 0x20;
cout << slovo << endl;
return 0;
}
Jel mi moze netko pojasniti gornji program? Tj. ovaj dio gdje se konkretno veliko slovo pretvara u malo: " slovo |= 0x2'; "
Nije 0x2 nego 0x20, to su dva različita broja.
Riječ je o bitovnoj OR operaciji.
http://www.cprogramming.com/tutorial/bitwise_operators.html
Recimo da je korisnik upisao veliko slovo 'A'
Ako pogledašASCII tabelu, vidjet ćeš da je ASCII kod za veliko slovo 'A' 65 (0x41 heksadecimalno)
65 pisano binarno je 01000001
0x20 je 32 decimalno, i 00100000 binarno
Sada vršimo OR operaciju na ta dva broja i dobijemo:
01000001
or 00100000
--------
01100001
Binarni broj 01100001 je 97 decimalno, a to je ASCII kod za malo slovo 'a'.
#include <iostream>
using namespace std;
int main() {
char slovo;
cout << "Unesite slovo: ";
cin >> slovo;
cout << slovo << endl;
slovo |= 0x20;
cout << slovo << endl;
return 0;
}
Jel mi moze netko pojasniti gornji program? Tj. ovaj dio gdje se konkretno veliko slovo pretvara u malo: " slovo |= 0x2'; "
slovo |= 0x20;
je isto što i:
slovo = slovo | 0x20;
Naredba | znači OR.
Pravilo za or glasi: Ako je barem jedna od ulaznih vrijednosti 1 onda je izlazna vrijednost 1.
O konkretnom slučaju heksdekadski 0x20 je binarno 00100000. Sva slova koja uneseš su u ascii formatu, stoga uzmimo za primjer slovo veliko A koje je ascii 65, binarno zapisano: 01000001.
01000001 OR
00100000
-------------
01100001 što je rezultat 97, a u ascii tablici to je malo slovo a.
kako da prosljedim programu argumente? koristim CodeBlocks i idem ovako ------ Project ------ Programs arguments
ali nista se ne pokrene, uopce ne reagira kao da nisam na nista kliknuo?
kako da prosljedim programu argumente? koristim CodeBlocks i idem ovako ------ Project ------ Programs arguments
ali nista se ne pokrene, uopce ne reagira kao da nisam na nista kliknuo?
Pa čitaj što ti statusbar kaže:
Set execution parameters for the targers of this project.
Dakle trebaš imati postavljen projekt da bi to funkcioniralo. Općenito za sve stvari u "project" meniju moraš imati postavljen projekt.
kako da prosljedim programu argumente? koristim CodeBlocks i idem ovako ------ Project ------ Programs arguments
ali nista se ne pokrene, uopce ne reagira kao da nisam na nista kliknuo?
Pa čitaj što ti statusbar kaže:
Set execution parameters for the targers of this project.
Dakle trebaš imati postavljen projekt da bi to funkcioniralo. Općenito za sve stvari u "project" meniju moraš imati postavljen projekt.
problem je sto se nije nista ispisalo u statusbaru, dakle kao sto sam rekao uopce nije reagiralo kao da uopce ne kliknem.
uglavnom, hvala sad cu probati. :)
problem je sto se nije nista ispisalo u statusbaru
Ispiše, ispiše, kada prijeđeš mišem preko nekog itema u meniju...
Moze mi neko objasniti zasto se ovo ne smije napisati:
int x=5;
cout << x++<< ++x;
Kako mislis ne smije? Sto ne bi smio, sasvim validan kod. tj nema gresaka hehe.
Kako mislis ne smije? Sto ne bi smio, sasvim validan kod. tj nema gresaka hehe.
E onda ne znam ko koga pravi budalom, jer nas uce da je to nevalidan kod, a ja ne kontam zasto, a greska neka sigurno nije bila. U pripremnim testovima imamo takva 2 zadatka za dvije grupe. U oba je rjesenje ??? - sto znaci da se to ne moze tako napisati. Moram cekati 5 dana da bi upitao. :S