Programiranje u C++-u - pitanja i odgovori izdvojena tema

poruka: 7.285
|
čitano: 1.702.889
|
moderatori: Lazarus Long, XXX-Man, vincimus
+/- sve poruke
ravni prikaz
starije poruke gore
17 godina
offline
Programiranje u C++-u - pitanja i odgovori

Varijabli se može pristupiti na dva načina:

1. imenom - prevoditelj zna adresu

2. adresom - odnosno posebnom varijablom zvanom pokazivač koja sadrži adresu varijable tipa pokazivača

 

Što se tiče korisnosti pokazivača, dovoljno je vidjeti moj primjer odozgo, nizove kao argumente funkcije proslijeđujemo pokazivačem, a uz to koristimo u funkciji aritmetiku pokazivača. Uz to, mnoge funkcije u C/C++ vraćaju pokazivač, pa ih hoćeš nećeš, moraš znati, a primjer je i ova funkcija strstr(), uz to, alociranje dinamičkih objekata vraća pokazivač na taj objekt.

 

#include <iostream>
#include <cstdio>
using namespace::std;


int broj(char *str1, char *str2);


int main(){
   
    char str1[31] = "stostrukost";
    char str2[11] = "st";
    cout << broj(str1, str2);
}

int broj(char *str1, char *str2){

    int br = 0;
    while (str1 = strstr(str1, str2))
    {
       br++;
       str1 += 1;
    }
    return br;
}

 

Poruka je uređivana zadnji put čet 8.5.2014 22:38 (Floki).
 
0 0 hvala 0
12 godina
neaktivan
offline
Programiranje u C++-u - pitanja i odgovori

Zapeo sam na jednom zadatku radi se o strukturama, znači ima strukturu Menu koja sadrži string MenuItem i int MenuPrice. Zadatak je kada pokrenem program da mi se pokaze Menu restorana i da ja kao gost mogu odabrati više stvari iz menija koje će mi se poslije pokazati koje sam odabrao i cijena pojedinog i na kraju toga račun mog cjelokupnog menija.

 

Problem mi je kako da napravim odabir iz strukture Menu za pojedini item neka su oni indeksirani od 1-8.

 

Menu:

 

1 Plain Egg ....... $1.45

2 Bacon and Egg..... $2.45

3 Muffin ..... $0.99

4 French Toast ..... $1.99

5 Fruit Basket ..... $2.49

6 Cereal ..... $0.69

7 Coffee ..... $0.50

8 Tea ..... $0.75 

 

A ovo dolje je moj odabir:

 

Bacon and Egg ..... $2.45

Muffin .... $0.99

Coffee ..... $0.50

Tax ...... $0.20

Amount Due ...... $4.14

 

Problem mi je da neznam kako da poveže stvari sa menija sa mojim odabirom? I da mi nakon toga program izbaci račun (poput ovog boldanog u tekstu). Nadam se da shvaćate šta želim pitati, hvala.

 
0 0 hvala 0
15 godina
neaktivan
offline
Re: Programiranje u C++-u - pitanja i odgovori

Znači imaš polje struktura koje ti predstavlja meni. Indeksi u tom polju odgovaraju pojedinim itemima iz menija (recimo plain egg bi imao indeks 0, bacon and egg 1, itd...).

 

Ispišeš pred korisnika taj meni, nakon čega on u petlji utipkava brojeve onoga što želi naručiti. Postaviš petlju tako da nekakav poseban broj znači kraj upisa (recimo broj 0).

 

Te brojeve pohranjuješ u nekakvo polje, te kada korisnik napokon izađe iz petlje (odabrao je sve što je htio) ostane ti polje u kojemu se nalazi njegov odabir. Dalje s tim radiš što hoćeš...

To understand what recursion is, you must first understand recursion.
11 godina
neaktivan
offline
Re: Programiranje u c++-u- pitanja i odgovori

Tražim naredbu koja bi napravila pauzu recimo 30sec

umjesto da napišem 

system ("PAUSE ");

 

probao sam ovako 

 

system ("sleep 30s "); i slično ali ne pomaže. 

 

Totalni sam amater kod programiranja ali ono radim si jednu skriptu u c++ pa želim da to nekako riješim :D Hvala unapred

 

Googlao sam i bez uspjeha. 

16 godina
neaktivan
offline
Re: Programiranje u c++-u- pitanja i odgovori
Markić7 kaže...

Tražim naredbu koja bi napravila pauzu recimo 30sec

umjesto da napišem 

system ("PAUSE ");

 

probao sam ovako 

 

system ("sleep 30s "); i slično ali ne pomaže. 

 

Totalni sam amater kod programiranja ali ono radim si jednu skriptu u c++ pa želim da to nekako riješim :D Hvala unapred

 

Googlao sam i bez uspjeha. 

 milisekunde mijenjaj u sekunde ili već po potrebi.

iz cijelog koda je jedino bitno da thread možeš štopati u c11 standardu i baratiti njime ili njima kao što koristiš lakoćom

cout<< "hello bug";

 

 

/*************************/
/*/  ---CPP11 ISO---    /*/
/*/                     /*/
/*/  dodaj ako ti nije  /*/
/*/  vec defaultno      /*/
/*/  pri kompilaciji    /*/
/*/  -std=c++11         /*/
/*************************/


#include <iostream>
#include <thread>
#include <chrono>
using namespace std;
using namespace std::chrono;
typedef unsigned int uint32;
 
class Timer {
    public:
    void begin();
    void end();
  
    private:
    high_resolution_clock::time_point m_times[2];
  
  
};
void Timer::begin()
{
    m_times[0] = high_resolution_clock::now();
}

void Timer::end()
{
    m_times[1] = high_resolution_clock::now();
    duration<double> time_span = duration_cast<duration<double>>(m_times[1] - m_times[0]);
  
    cout << "pauza je trajala " << time_span.count() << " milisekundi.";
}
 

/* -------------------------------------------------------- */
/**
 * ovo je okosnica a timer je tu samo da vidis
 * vizualno kako imamo sleep od 0.5 sekundi
 **/
inline void sleep__(uint32 ms)
{
    this_thread::sleep_for(std::chrono::milliseconds(ms));
}
/* -------------------------------------------------------- */

int main()
{
   Timer timer;
 
   timer.begin();
 
   sleep__(500);  // pauziramo pola sekunde
 
   timer.end();
 
 
   return 0;
}

moje aplikacije na play-u : https://play.google.com/store/search?q=nik02droid
Poruka je uređivana zadnji put pet 9.5.2014 23:03 (nik_02).
17 godina
neaktivan
offline
Re: Programiranje u c++-u- pitanja i odgovori
Markić7 kaže...
...

Totalni sam amater kod programiranja ali ono radim si jednu skriptu u c++ pa želim da to nekako riješim :D Hvala unapred

...

Skripte se rade u za to predvidenim skriptnim jezicima (bash, Python, Perl, i dr.), vjeruj mi, ako je posao takve naravi, skriptni jezici su pravi put, bit ce ti puno lakse.

Perhaps today IS a good day to die. PREPARE FOR RAMMING SPEED!
16 godina
neaktivan
offline
Re: Programiranje u C++-u - pitanja i odgovori
Xyloto kaže...

Zapeo sam na jednom zadatku radi se o strukturama, znači ima strukturu Menu koja sadrži string MenuItem i int MenuPrice. Zadatak je kada pokrenem program da mi se pokaze Menu restorana i da ja kao gost mogu odabrati više stvari iz menija koje će mi se poslije pokazati koje sam odabrao i cijena pojedinog i na kraju toga račun mog cjelokupnog menija.

 

Problem mi je kako da napravim odabir iz strukture Menu za pojedini item neka su oni indeksirani od 1-8.

 

Menu:

 

1 Plain Egg ....... $1.45

2 Bacon and Egg..... $2.45

3 Muffin ..... $0.99

4 French Toast ..... $1.99

5 Fruit Basket ..... $2.49

6 Cereal ..... $0.69

7 Coffee ..... $0.50

8 Tea ..... $0.75 

 

A ovo dolje je moj odabir:

 

Bacon and Egg ..... $2.45

Muffin .... $0.99

Coffee ..... $0.50

Tax ...... $0.20

Amount Due ...... $4.14

 

Problem mi je da neznam kako da poveže stvari sa menija sa mojim odabirom? I da mi nakon toga program izbaci račun (poput ovog boldanog u tekstu). Nadam se da shvaćate šta želim pitati, hvala.

 

 

Probaj ovako:

 

https://ideone.com/7p3yRh

 

 

/*************************/
/*/  ---CPP11 ISO---    /*/
/*/                     /*/
/*/  dodaj ako ti nije  /*/
/*/  vec defaultno      /*/
/*/  pri kompilaciji    /*/
/*/  -std=c++11         /*/
/*************************/

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;
typedef unsigned int uint;

#define NOT_IN_ORDER 0xff  // definiraj ono sto ne pase
                           // vidi nize i bit ce jasnije


// struct Menu nosi osnovne podatke
struct Menu
{
    Menu(string menuItem , float menuPrice);

    string MenuItem;
    float MenuPrice;

};

Menu::Menu(string menuItem , float menuPrice)
    : MenuItem(menuItem) , MenuPrice(menuPrice)
{
}


// u klasi Restaurant rijesavamo cijeli zadatak
class Restaurant
{
public:
    Restaurant();

    // serve i display su dostupni
    // ostalo nema potrebe biti public
    // jer samo Restaurant interno
    // barata onime sto je pod private
    void serve();
    void display();


private:
    vector<Menu> m_menus
    {
        // c++11 dopusta iniciranje u samoj klasi
        // iskoristit cemo to upravo sad
        Menu("Plain_Egg",1.45),
        Menu("Bacon_and_Egg",2.45),
        Menu("Muffin",0.99),
        Menu("French_Toast",1.45),
        Menu("Fruit_Basket",2.49),
        Menu("Cereal",0.69),
        Menu("Coffee",0.50),
        Menu("Tea",0.75)
    };

    // ovime vrsimo provjeru unesenog MenuItem-a
    uint processWhat(string what);

    // u order punimo index odnosno offsete m_menus-a
    // vidi nize da bude jasnije
    vector<uint> order;

};

Restaurant::Restaurant()
{
    cout<< "u ponudi restauranta imamo :\n\n";

    // c++11 auto je dobra stvar koja ubrzava code
    // dakle iskoristimo ga
    for(auto x : m_menus)
        cout<< x.MenuItem << " " << x.MenuPrice << endl;
}


void Restaurant::serve()
{
    cout<< "\nchoose menu\n\n";

    string terminateString = "done";
    string what = "";

    while(what != terminateString)
    {
        cin>> what;

        uint offset = processWhat(what);
        if(offset != NOT_IN_ORDER)
        {
            // ukoliko je narudzba jednaka posojecem menu
            // u order stavljamo offset iz m_menus-a
            // vidi jos nize
            order.push_back(offset);
            cout<< "OK , another one or type done for exit\n";
            }
        else
            cout<< "not in order , try again or type done for exit\n";

    }

    display();
}


uint Restaurant::processWhat(string what)
{
    vector<Menu>::iterator it = find_if(m_menus.begin(),m_menus.end(), [&] (Menu a)
    {   //c++11 lambda
        return (a.MenuItem == what);
    }
                                       );
    // ukoliko menu koji je user upisao postoji
    // njegov offset u m_menus-u dobijes pointer aritmetikom
    // it - m_menus.begin() a ukoliko menu ne postoji vrati define s vrha price
    return (it == m_menus.end() ? NOT_IN_ORDER : (it - m_menus.begin()));
}


void Restaurant::display()
{
    // na kraju ispis svega
    float price = 0;

    cout<< "\nNARUDZBA SADRZI :\n";
    for(auto x : order)
    {
        cout<< m_menus[x].MenuItem << endl;
        price += m_menus[x].MenuPrice;
    }

    cout<< "\n\n\nTOTAL : " << price << "$\nDODJITE NAM OPET\n\n";
}



int main()
{
    Restaurant BUG_RESTAURANT;
    BUG_RESTAURANT.serve();


    // pozdrav i sretno
    return 0;
}

 

 

moje aplikacije na play-u : https://play.google.com/store/search?q=nik02droid
Poruka je uređivana zadnji put sub 10.5.2014 1:49 (nik_02).
11 godina
neaktivan
offline
Programiranje u C++-u - pitanja i odgovori

Pozz svima.

 

Prodavnica ima pakovanja brasna od 10,15,20kg
Napisati program kako da se kupcu isporuci m kg brasna bez otvaranja vreca.
Sve mogucnosti.


Jel zna neko nacin na koji bi se moglo uraditi?

npr:ako zeli 30kg da mu isporuci dvije vrece po 15 kg,ako zeli 25kg da mu se isporuci vreca od 15 i vreca od 10.

 

LP

 
0 0 hvala 0
17 godina
neaktivan
offline
Re: Programiranje u C++-u - pitanja i odgovori

Evo ovako:

-ako ukupna kilaza zavrsava na nesto sto nije 0 ili 5, robu nije moguce isporucit bez otvaranja

-ako je ukupna kilaza manja od 10 robu nije moguce isporuciti

-ako ukupna kilaza zavrsava na 5, tada mozes koristit jednu vricu od 15kg i smanjit preostalu kilazu (vrica od 15 ce bit jedna ili nijedna) - skok na zadnju tocku

-nakon smanjenja kilaze, provjerit jeli preostala kilaza veca ili jednaka 20kg - ako je, povecat broj vrica od 20kg i smanjit preostalu kilazu - skok na zadnju tocku

-nakon smanjenja kilaze, a ukoliko prethodna tocka nije ispunjena, provjerit jeli preostala kilaza veca ili jednaka 10kg - ako je, povecat broj vrica od 10kg i smanjit preostalu kilazu (vrica od 10kg ce bit jedna ili nijedna) - skok na zadnju tocku

-ponavljat dok preostala kilaza ne dodje na 0kg. 

 

Poruka je uređivana zadnji put sub 10.5.2014 16:16 (wifi).
15 godina
online
Re: Programiranje u C++-u - pitanja i odgovori
volvofan kaže...

Pozz svima.

 

Prodavnica ima pakovanja brasna od 10,15,20kg
Napisati program kako da se kupcu isporuci m kg brasna bez otvaranja vreca.
Sve mogucnosti.


Jel zna neko nacin na koji bi se moglo uraditi?

npr:ako zeli 30kg da mu isporuci dvije vrece po 15 kg,ako zeli 25kg da mu se isporuci vreca od 15 i vreca od 10.

 

LP

Neka su a1, a2 i a3 redom brojevi vreca od 10, 15 i 25kg. Vrijedi:

10* a1 + 15*a2 + 25*a3 = m.

Po Bezoutovoj prosirenoj lemi, da bi postojali cijeli brojevi a1, a2 i a3 koji zadovoljavaju gornju jednakos, m mora biti visekratnih njihova najveceg zajednickog djelitelja, od 10, 15, 25, a to je 5, tj. m mora biti djeljiv sa 5. A s obzirom da a1, a2 i a3 ne mogu biti negativni, m mora biti veci od 5 ili jednak 0.

 

Ako je n = 0, slucaj je trivijalan, samo isporucimo 0 vreca.

 

Ako je n jednak 5, onda ocito tu kolicinu ne mozemo isporuciti.

 

Buduci da je m djeljiv sa 5, mozemo ga prikazati kao m = 5 m', gdje je m' bilo koji prirodni broj. Pa gornja jednakost postane:

2* a1 + 3*a2 + 5*a3 = m'.

Sada moramo dokazati da svaki prirodni broj m' mozemo prikazati kao zbroj brojeva 2, 3 i 5. Ako je m' paran, onda ga ocito mozemo prikazati pomocu 2. Ako je neparan onda vrijedi m = 2k+1. Ako je k > 1, onda m mozemo prikazati koresteci k-1 dvica, i jednom tricom: m = 2(k-1)+3. Ako je k jednak 1, onda je m' = 3, i mozemo ga prikazati pomocu 3.

 

Dakle, dokazali smo da svaki m djeljiv sa 5 i razlicit od 5. Vrijedi:

10* a1 + 15*a2 + 25*a3 = m

 

Zadatak trazi da ispisemo sve kombinacije brojeva a1, a2 i a3 koji zadovoljavaju gornju jednakost.

#include <iostream>
#include <vector>

using namespace std;


vector<int> kombinacija, vrece;

void printKombinacija(){
    for(int i = 0; i < (int) kombinacija.size(); i++)
        cout << kombinacija[i] << " ";
    cout << endl;
}

void pronadi(int ukupno, int vreca, int trazeno){
    if(ukupno > trazeno) return;
    else if(ukupno == trazeno){
        printKombinacija();   
    }
    else{
        for(int i = vreca; i < (int) vrece.size(); i++){
            kombinacija.push_back(vrece[i]);
            pronadi(ukupno+vrece[i], i, trazeno);
            kombinacija.pop_back();
        }
    }
}

int main(){
    vrece.push_back(10);
    vrece.push_back(15);
    vrece.push_back(25);

    int m;
    cin >> m;
    if(m%5 == 0 && m != 5)
        pronadi(0, 0, m);
    else
        cout << "Nema kombinacija." << endl;
    return 0;
}

 

U polju vrece nalaze se tipovi vreca koje imamo na raspolaganju(u ovom slucaju vrece od 10, 15 i 25 ), a u polju kombinacija nalazi se trenutna kombinacija vreca.

Rekurzija prima tri argumenta:

  • ukupno - koliko smo brasna dosad skupili
  • vreca - broj vrece do koje smo dosli, tj koju dodajemo
  • trazeno - trazena kolicina brasna

 

U svakom pozivu funkcije pronadi, onda prvo usporedi trazeno i dosad skupljeno brasno. Ako je kolicina dosad skupljenog brasna veca od trazenog, onda jednostavno jednosta izademo iz funkcije jer nema smisla dodavati vise vreca. Ako su te dvije vrijednosti jednake, onda ispisemo trenutno kombinaciju i izademo iz funkcije jer opet nema vise smisla dodavati brasno.

 

Ako je kolicina ukupnog brasna manja od trazenog, onda pokusavamo dodavati vrece. Vrece dodajemo tako da u polje kombinacije dodamo vrecu (kombinacija.push_back(vrece[i]);), onda pozovemo funkciju pronadi sa dodanom ukupnom vrijednosti: pronadi(ukupno+vrece[i], i, trazeno); . Kad taj poziv zavrsi sa izvodenjem, onda iz polja kombinacije izbrisemo vrecu (kombinacija.pop_back();) i dodajemo vrecu sljedeceg tipa. Da bismo ispisivali sve kombinacije, a ne varijacije( 10 25 10 i 10 10 25 su razlicite varijacije, no predstavljaju iste kombinacije), koristimo varijablu vreca koja pamti do koje smo vrece dosli. Pogledajmo sljedecu for petlju:
for(int i = vreca; i < (int) vrece.size(); i++){
            kombinacija.push_back(vrece[i]);
            pronadi(ukupno+vrece[i], i, trazeno);
            kombinacija.pop_back();
       

Ako je vrijednost varijable vreca jednaka 2, to znaci da su vrece prvog i nultog tipa vec dodane, i nema ih smisla vise dodavati i od tada dodajemo samo vrece drugog, treceg itd. tipa.

 

Ovaj gornji program ispisuje kombinacije vreca, tj. ako npr. imamo 5 vreca od 10 kg i 6 od 25 kg u nekoj kombinaciji, on ce ispisati 5 brojeva 10 i 6 brojeva 25 i preci u novi red. To nije prakticno, bilo bi bolje kada bi ispisivao samo broj potrebnih vreca odredenog tipa. Gornji se program u par izmjena moze modificirati da to ispisuje na taj nacin:

#include <iostream>
#include <vector>

using namespace std;


vector<int> kombinacija, vrece;

void printKombinacija(){
    for(int i = 0; i < (int) kombinacija.size(); i++)
        cout << kombinacija[i] << " vreca od " << vrece[i] << " kg." << endl;;
    cout << endl;
}

void pronadi(int ukupno, int vreca, int trazeno){
    if(ukupno > trazeno) return;
    else if(ukupno == trazeno){
        printKombinacija();   
    }
    else{
        for(int i = vreca; i < (int) vrece.size(); i++){
            kombinacija[i]++;
            pronadi(ukupno+vrece[i], i, trazeno);
            kombinacija[i]--;
        }
    }
}

int main(){
    vrece.push_back(10);
    vrece.push_back(15);
    vrece.push_back(25);
    kombinacija.resize(vrece.size(), 0);

    int m;
    cin >> m;
    if(m%5 == 0 && m != 5)
        pronadi(0, 0, m);
    else
        cout << "Nema kombinacija." << endl;
    return 0;
}

Ovdje u polju kombinacija, za svaki tip vrece pamtimo broj dodanih vreca.

 

U oba gronja programa mozemo linije:

if(m%5 == 0 && m != 5)
        pronadi(0, 0, m);
    else
        cout << "Nema kombinacija." << endl;

 

Zamijeniti sa:
pronadi(0, 0, m);Tada ce nam program opet ispisati sve kombinacije(osim u slucaju kada nema kombinacija nece ispisati: Nema kombinacija.) no u nekim bi slucajevima sprije radio, i onaj dio na pocetku u kojem analiziramo postojanje rjesenja nije potreban. I kad to uradimo onda na pocetku umjesto vreca:

vrece.push_back(10);
    vrece.push_back(15);
    vrece.push_back(25);

napisati bilo koje druge vrece: (1, 4, 17. itd)

Poruka je uređivana zadnji put ned 11.5.2014 13:51 (captain_soap_McTawish).
17 godina
neaktivan
offline
Re: Programiranje u C++-u - pitanja i odgovori

Nisam racuna da se daje gotovi kod, ali kad vec ide, onda i moja varijanta... 

 

 

#include <iostream>

 

using namespace std;

 

int main()

{

   int ukupno=0,n20=0,n15=0,n10=0;

   cout << "Unesi kg za isporuku:";

   cin >> ukupno;

   int ukupno2=ukupno;

   cout << "Uneseno kg:" <<ukupno<< endl; 

   do

   {

     if((ukupno%10)==5)

     {

       ukupno-=15;

       n15++;

     }

     else if((ukupno-20)>=0)

     {

       ukupno-=20;

       n20++;

     }

     else

     {

       ukupno-=10;

       n10++;

     }

   } while (ukupno!=0);

   cout<<"Za ukupno "<<ukupno2<<"kg koristeno je "<<n20<<" vrica od 20kg, "<<

   n15<<" vrica od 15kg, i "<<n10<<" vrica od 10kg."<<endl;

   return 0;

}

 

 

 

 

 

 

 

 

11 godina
neaktivan
offline
Programiranje u C++-u - pitanja i odgovori

captain i wifi hvala 

 
0 0 hvala 0
15 godina
online
Re: Programiranje u C++-u - pitanja i odgovori
wifi kaže...

Nisam racuna da se daje gotovi kod, ali kad vec ide, onda i moja varijanta... 

 

U zadatku pise da se ispisu sve mogucnosti. Tvoja ce varijanta ispisati samo jednu.

17 godina
neaktivan
offline
Re: Programiranje u C++-u - pitanja i odgovori
captain_soap_McTawish kaže...
wifi kaže...

Nisam racuna da se daje gotovi kod, ali kad vec ide, onda i moja varijanta... 

 

U zadatku pise da se ispisu sve mogucnosti. Tvoja ce varijanta ispisati samo jednu.

meni je promaka taj detalj, a tebi detalj da se radi o vrici od 20kg, a ne 25kg, ali to u tvom slucaju ne minja nista... 

16 godina
offline
Programiranje u C++-u - pitanja i odgovori

#include <fstream>

#include <iostream>

using namespace std;

 

int main ()

{

   int brClanova = 9;

   int polje[20] = {10,20,30,40,50,60,70,80,90}; //da li su nule pohranjene u ostalim pozicijama u polju, nakon ovih inic. brojeva? ili neki random brojevi?

   int *odrediste = polje + brClanova; //zasto kada bi ispisao vrijednost *odrediste dobivam broj 0? cout << *(odrediste);

   int noviBroj = 15; 

 

   while (*(--odrediste) > noviBroj)

   {

     if(odrediste < polje)

       break;

     *(odrediste + 1) = *odrediste;

   }

   *(odrediste + 1) = noviBroj;

   brClanova++;

 

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

     cout << polje[i] << " " ;

}

Ako moze neko objasnit komentare. Hvala.

Inace program umece broj 15 u listu brojeva tako da na kraju i dalje lista bude sortirana.

Windows Phone FTW
Moj PC  
0 0 hvala 0
12 godina
offline
Re: Programiranje u C++-u - pitanja i odgovori

Da, bit ce svi 0 - prema C99 specu ako polje nije cijelo inicijalizirano, ostatak ce bit inicijaliziran kao da je polje statickog trajanja, sto za int znaci svi elementi 0.

polje (+0) adresa prvog clana
polje +1 adresa drugog clana
polje +8 adresa devetog clana
polje +9 adresa desetog clana, koji je inicijaliziran na 0. Kako odrediste pokazuje na njega na pocetku, *odrediste je 0.

17 godina
offline
Programiranje u C++-u - pitanja i odgovori

Ajde, pošto sam imao upit na pp od drugog forumaša za sličnu stvar, da odgovorim i ja (inače pitanja se šalju ovdje, a ne na pp)

 

int  niz[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}

 

izraz (niz + 9) je aritmetika pokazivača i označava adresu elementa niz[9], a na toj adresi je deseti element niza, pošto je prvi element niza na adresi (niz + 0), odnosno na toj adresi se nalazi element niz[0].

Dakle, izrazima *(niz + 1) i niz[1] ćemo dohvatiti element 2, a izrazima *niz i niz[0] ćemo dohvatiti element 1.

 

 

btw. trebao si ispisati taj niz i vidjeti da od desetog do dvadesetog elememta inicijalizira 0.

 

U stvari, imaš još jedan bolji i brži pristup umjesto da ideš ispisivati niz. Ovi naši moderni IDE-ovi su tu da nam pomognu. pa zašto to ne iskoristiti. Ja mogu govoriti za VS jer njega koristim. Opališ breakpoint sa lijeve strane linije koda za varijablu koju hoćeš ispitati. Nakon toga stisneš F5, tj. u menu Debug - Start Debbuging. Kad se izvođenje programa na liniji gdje je break point zaustavi sa F11 ideš korak po korak tj. liniju po liniju koda i pratiš dva prozora Locals i Call Stack.

U prozoru Locals pratiš lokalne varijable u funkciji u kojoj se nalaziš i tu na tvom primjeru vidiš odmah da je od desetog do dvadesetog elementa za tvoj niz inicijalizacija izvršena sa 0. Prozor Call Stack ti govori o funkcijama koje su pozvane i koje su na stacku, što daje i pregled programa i način je učenja rekurzije uz kombinaciju sa prozorom Locals. Možeš probati npr. na ovoj gore Kapetanovoj rekurziji, koju je on btw. super napravio.

Poruka je uređivana zadnji put sri 14.5.2014 22:57 (Floki).
 
0 0 hvala 1
12 godina
offline
Re: Programiranje u C++-u - pitanja i odgovori
Floki kaže...
btw. trebao si ispisati taj niz i vidjeti da od desetog do dvadesetog elememta inicijalizira 0.

U stvari, imaš još jedan bolji i brži pristup umjesto da ideš ispisivati niz.

Da, to je znatno brzi nacin. Samo zakljucak da ako vidis nule da onda uvijek ima nul-inicijalizacije logicki ne slijedi - mozda su slucajno sad bile nule, ili jedan compiler to radi, drugi ne itd. Mozes formulirat hipotezu da je tocno, ako nije produkcijski kod to je ok, no jedini pouzdan nacin je provjerit spec.

To sam ja i napravio - da sam vidio garbage, znam da sigurno nema nul-inicijalizacije. Kad sam vidio sve nule, isao sam potrazit objasnjenje jel to bas uvijek mora biti tako...

12 godina
neaktivan
offline
Programiranje u C++-u - pitanja i odgovori

Pozz, radim po tutorijalu game programming u SDL-u na početku sam svega pa me zanima zašto se ne može ovdje koristiti obična main(void) funkcija nego tip funkcije kakav je u kodu s ova dva argumenta?

Zašto se pokazivači inicijaliziraju na nul vrijednost?

 

 

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

{ //The images

 SDL_Surface* hello = NULL;

 SDL_Surface* screen = NULL;

Poruka je uređivana zadnji put pet 16.5.2014 11:38 (Xyloto).
 
0 0 hvala 0
14 godina
neaktivan
offline
Re: Programiranje u C++-u - pitanja i odgovori

Možeš koristit obični int main (void). Ovaj oblik se koristi samo kada želiš omogućiti da program prima/čita parametre sa komandne linije.

15 godina
neaktivan
offline
Re: Programiranje u C++-u - pitanja i odgovori
Xyloto kaže...

Pozz, radim po tutorijalu game programming u SDL-u na početku sam svega pa me zanima zašto se ne može ovdje koristiti obična main(void) funkcija nego tip funkcije kakav je u kodu s ova dva argumenta?

Zato što SDL koristi vlastitu main funkciju, a tvoju main funkciju koju ti definiraš u programu preimenuje u SDL_main. Za to već koristi unaprijed definiran prototip, pa pokušaji da definiraš main funkciju bez parametara dovode do greške.

 

Dio iz sdl.h headera:

#define main    SDL_main

/** The prototype for the application's main() function */
extern C_LINKAGE int SDL_main(int argc, char *argv[]);

 

Xyloto kaže...

Zašto se pokazivači inicijaliziraju na nul vrijednost?

Zato što je to dobra praksa. Ako ih slučajno koristiš prije nego što im dodijeliš nekakvu važeću vrijednost, lakše je primijetiti nevažeću vrijednost ako je ona NULL nego ako je nekakav nasumični broj kojeg ne možeš lagano provjeriti je li važeća memorijska adresa ili nekakvo smeće.

 

U svakom slučaju radit će i bez incijalizacije, ovo ti je samo da lakše uhvatiš greške sa svoje strane.

 

A i neke funkcije iz biblioteka imaju detekciju NULL pokazivača pa ti fino vrate grešku umjesto da naprasno sruše program pokušavajući čitati/pisati na nevažeću adresu (mišljenja su ovdje podijeljena jer postoje zagovornici ideje da je bolje da se program jednostavno sruši, uz obrazloženje da je tako puno lakše primijetiti grešku, umjesto da program nastavi raditi ali u nekakvom netočnom stanju).

To understand what recursion is, you must first understand recursion.
16 godina
offline
Programiranje u C++-u - pitanja i odgovori

Zna neko nesto o povezanim listama? Imam ovaj zadatak ako neko zna rjesiti i objasniti. 

 

Napišite program u koji se iz datoteke myPlaylist.txt učitavaju svi 

podaci u dvostruko povezanu listu tako da su sortirani prema nazivu pjesme. 

Jedan zapis sastoji se od imena, izvođača i minuta te sekundi trajanja pjesme. 

Zapisi se učitavaju u dvostruko povezanu listu s lažnim čvorom. 

Nakon toga se iz liste brišu pjesme "You & I", "#SELFIE" i “Wiggle”. 

Na ekran se ispisuje ažurirana playlista u obrnutom poretku, a potom 

se dealocira zauzeta memorija.

 

LINK - myPlaylist datoteka.

 

Za sad imam samo ovo

#include <fstream>

#include <iostream>

#include <iomanip>

using namespace std;

 

struct art{

   char pjesma;

   char autor;

   char trajanje;

   art *next;

   art *prev;

};

 

int main ()

{

   art objekt[40];

   ifstream ulaz ("myPlaylist.txt");

   if (ulaz.is_open())

     cout << "Datoteka nije pronadena!\n\n";

   else

   {

     cout << "Datoteka je uspjesno otvorena!\n\n";

     ulaz >> objekt;

 

 

 

   }

   return 0;

}

Windows Phone FTW
Moj PC  
0 0 hvala 0
15 godina
neaktivan
offline
Re: Programiranje u C++-u - pitanja i odgovori
DommY kaže...

Zna neko nesto o povezanim listama? Imam ovaj zadatak ako neko zna rjesiti i objasniti. 

http://en.wikipedia.org/wiki/Linked_list

http://cslibrary.stanford.edu/103/LinkedListBasics.pdf

 

Čitaj. Ne vidim što se tu ima posebno za objašnjavati nije to nekakav misterij.

 

Kod jednostrukih lista svaka struktura u sebi sadrži pokazivač na slijedeću strukturu u nizu. A kod dvostruko vezanih lista svaka struktura sadrži pokazivače na prethodnu i na slijedeću strukturu u nizu. Jako jednostavno.

 

Vrati se sa konkretnim pitanjima, a ne traženjem rješenja cijelog zadatka. Zadatak je teška trivijalnost i sudeći po onome što si do sada rješavao trebao bi ga znati riješiti ko iz topa.

 

EDIT:

 

Ako još nisi skužio, za razumjevanje vezanih listi (i ne samo vezanih listi) moraš prvo razumjeti pokazivače. Kako mi je već lagano dosadilo objašnjavati što su to pokazivači, složio sam jednu grafiku koja vizualizira sadržaj jednog dijela radne memorije (u ovom slučaju stacka), za vrijeme izvođenja programa:

Riječ je o ovom trivijalnom programu koji ne radi ništa pametno:

 

int main()
{
    int a = 52;
    int *b = &a;
    char rijec[] = "Text";

    return 0;
}

 

Slika je preslika stvarnog stanja sa stvarnim adresama (no to se može razlikovati od računala do računala ovisno o kompajleru, procesoru, operacijskom sustavu...), i vizualizira nekoliko bitnih stvari:

 

  1. Razmještaj varijabli u memoriji.
  2. Kako je adresa neke varijable uvijek adresa prvog bajta te varijable u memoriji.
  3. 32 bitni cijeli broj zauzima 4 bajta u memoriji, jer je 32 / 8 = 4 (svaki bajt ima 8 bita).
  4. Što to zapravo znači kada se kaže da je vrijednost pokazivača memorijska adresa nečega u memoriji (u ovom slučaju vrijednost pokazivača 'b' je memorijska adresa varijable 'a').
  5. Pokazivač također, kao i svaka druga varijabla u memoriji, ima svoju adresu. Ona je u slučaju pokazivača 'b' : 0x22FF4C
  6. Polje 'rijec' je zapravo pokazivac na prvi char (bajt) iz tog polja. Također se vidi i kako su slova zapravo samo hrpa brojeva (ASCII kodovi), kao i null znak koji ima vrijednost 0 i označava kraj stringa.

 

Memorijske adrese su pisane heksadecimalno kako bi se lakše razlikovale od ostalih vrijednosti (iako je i dalje riječ o običnim cijelim brojevima, samo pisanim na drugačiji način). Također je i inače praksa pisati ih heksadecimalno jer su tako kompaktnije i lakše se čitaju (tracer je to već načeo na prethodnoj stranici).

 

Iz slike se lijepo vidi zašto je b == 0x22FF48, i zašto je *b == 52. Kada dereferenciramo pokazivač slijedimo tu plavu strelicu.

 

Eto to ti je brzinski uvod u pokazivače, kako bi lakše mogao probaviti materijale što sam ti nakačio o vezanim listama. Nadam se da će ovo bar malo razbiti nepotrebnu mistiku koja se stvara oko pokazivača.

To understand what recursion is, you must first understand recursion.
Poruka je uređivana zadnji put sub 17.5.2014 0:23 (rustweaver).
16 godina
offline
Programiranje u C++-u - pitanja i odgovori

Vratio bi se ja sa konkretnim pitanjima da znam rjesiti barem vecinu zadatka, ali ne znam bas. Nisam do sada radio s povezanim listama pa zato neznam. 

Najlakse mi je shvatiti kada vidim zadatak i kompletno rjesenje, onda lijepo uzmem papir i vidim sta se desava u svakoj liniji koda. Da imam bar primjer neki slican rjesen onda bi valjda mogao rijesiti ako ga razumijem. Pokazivace cini mi se da vise manje kuzim, vidit cemo, sad citam pazljivo post i linkove o listama. Do sada sam procitao neke materijale i nesto o listama u knjizi demistificirani c++ (Šribar). Hvala!

Windows Phone FTW
Moj PC  
0 0 hvala 0
17 godina
neaktivan
offline
Re: Programiranje u C++-u - pitanja i odgovori
DommY kaže...

Vratio bi se ja sa konkretnim pitanjima da znam rjesiti barem vecinu zadatka, ali ne znam bas. Nisam do sada radio s povezanim listama pa zato neznam. 

Najlakse mi je shvatiti kada vidim zadatak i kompletno rjesenje, onda lijepo uzmem papir i vidim sta se desava u svakoj liniji koda. Da imam bar primjer neki slican rjesen onda bi valjda mogao rijesiti ako ga razumijem. Pokazivace cini mi se da vise manje kuzim, vidit cemo, sad citam pazljivo post i linkove o listama. Do sada sam procitao neke materijale i nesto o listama u knjizi demistificirani c++ (Šribar). Hvala!

Drugi link koji ti je rustweaver dao zaista dobro objasnjava i pokazivace i povezane liste, sve s kodom koji je popracen crtezima i lijepo je sve obrazlozeno i napisano preko 26 stranica. Jako dobar link jer sam ga i ja koristio nekad prije za osvjeziti znanje o listama.

Garantirano ces imati sliku o listama - sto i kako - nakon proucavanja tog dokumenta. ;)

Perhaps today IS a good day to die. PREPARE FOR RAMMING SPEED!
15 godina
neaktivan
offline
Re: Programiranje u C++-u - pitanja i odgovori
DommY kaže...

Vratio bi se ja sa konkretnim pitanjima da znam rjesiti barem vecinu zadatka, ali ne znam bas. Nisam do sada radio s povezanim listama pa zato neznam. 

Počni polako, sa apsolutno što manje kompliciranja. Zašto misliš da moraš odmah riješiti cijeli zadatak?

 

Jel znaš složiti nekoliko struktura u lanac tako da tvore vezanu listu? To ti je prva stvar što trebaš znati napraviti, zanemari sada ovo sortiranje i čitanje iz datoteke.

 

Recimo da imaš ovakvu strukturu:

struct node
{
    int value;
    cvor *next;
};

 

Cilj ti je imati tri strukture od kojih će svaka imati dodijeljen po jedan broj za 'value' (recimo brojevi 1, 2, i 3), i čiji će pokazivač 'next' pokazivati na iduću strukturu u nizu (ili na NULL ako nema sljedeće strukture, odnosno ako je ova posljednja). To ti je jednostruko vezana lista.

 

Nju si možeš vizualizirati ovako:

 

Pretpostavljam da znaš napraviti pokazivač koji pokazuje na nešto (na strukturu u ovom slučaju), ako ne znaš onda ponovi pokazivače.

 

Ne moraš niti koristiti dinamičku alokaciju memorije za sada, jednostavno deklariraj tri strukture na stacku i ručno im dodjeli vrijednosti (koristiš & operator kako bi dohvatio adrese struktura) tako da na kraju tvore vezanu listu.

 

Zatim drugi korak, sada imaš ovakvu strukturu:

struct node
{
    int value;
    cvor *next;
    cvor *previous;
};

 

Ista stvar kao i u prethodnom slučaju, bez dinamičke alokacije memorije, samo što sada imaš pokazivač 'previous' koji bi trebao pokazivati na prethodnu strukturu u nizu (ili na NULL ako nema prethodne strukture, odnosno ako je ova prva). To ti je dvostruko vezana lista.

 

I onda posljednji korak, ne koristiti 3 strukture sa stacka kako bi ih spajao u listu, nego dinamički alocirati memoriju za prvu strukturu u nizu i za svaku sljedeću strukturu u nizu, nešto tipa:

 

node *root = new node;
root->next = new node;

 

I za kraj skužiti kako to možeš automatizirati kroz nekakvu petlju tako da možeš alocirati i nakačiti X struktura jednu na drugu bez puno tipkanja.

 

Kada to napraviš javi se pa ćemo vidjeti što još ne znaš a trebao bi znati. Polako idi kroz ovo i nemoj preskakati jer je važno da ti sve 'sjedne'.

To understand what recursion is, you must first understand recursion.
Poruka je uređivana zadnji put sub 17.5.2014 15:08 (rustweaver).
14 godina
neaktivan
offline
Re: Programiranje u C++-u - pitanja i odgovori
DommY kaže...

...Nisam do sada radio s povezanim listama pa zato neznam...

...zapravo koristiš ih svakodnevno, da ti malo vizualiziram povezane liste:

otvori file explorer i pogledaj npr disk C: , folderi i fileovi koji su prikazani su jedna lista, kad otvoriš folder prikaže ti drugu listu itd.

 

16 godina
offline
Re: Programiranje u C++-u - pitanja i odgovori
rustweaver kaže...

Jel znaš složiti nekoliko struktura u lanac tako da tvore vezanu listu? To ti je prva stvar što trebaš znati napraviti, zanemari sada ovo sortiranje i čitanje iz datoteke.

 

Recimo da imaš ovakvu strukturu:

struct node
{
    int value;
    cvor *next;
};

 

Cilj ti je imati tri strukture od kojih će svaka imati dodijeljen po jedan broj za 'value' (recimo brojevi 1, 2, i 3), i čiji će pokazivač 'next' pokazivati na iduću strukturu u nizu (ili na NULL ako nema sljedeće strukture, odnosno ako je ova posljednja). To ti je jednostruko vezana lista.

 

Nju si možeš vizualizirati ovako:

 

Pretpostavljam da znaš napraviti pokazivač koji pokazuje na nešto (na strukturu u ovom slučaju), ako ne znaš onda ponovi pokazivače.

 

Ne moraš niti koristiti dinamičku alokaciju memorije za sada, jednostavno deklariraj tri strukture na stacku i ručno im dodjeli vrijednosti (koristiš & operator kako bi dohvatio adrese struktura) tako da na kraju tvore vezanu listu.

Pokusavao sam nesto, jos sam na prvom dijelu i ne ide mi, uzas -.-

Cini mi se da je ovo moguce napraviti jednostavnije ali ja ne znam pa kompliciram. 

Reci mi da li sam na dobrom putu? I zasto mi baca gresku kada pokusavam povezati prvi cvor sa drugim (komentar dole)?

 

#include <iostream>

using namespace std;

 

struct cvor

{

   int value;

   cvor *next;

};

 

struct cvor2{

   int value2;

   cvor2 *next;

};

 

struct cvor3{

   int value3;

   cvor3 *next;

};

 

int main ()

{

   cvor *novipok;

   cvor2 *novipok2;

   cvor3 *novipok3;

 

   novipok = new cvor;

   novipok2 = new cvor2;

   novipok3 = new cvor3;

 

   novipok->value = 1;

   novipok->next = cvor2;  // GRESKA ********* zelim povezati prvi i drugi cvor, pokusao sam i novipok->next = &cvor2; ali isto baca gresku

 

   return 0;

}

 

Btw sta ti znaci ovo boldano u vezi stacka(stog?)? Jesam ja to napravio sa ove 3 strukture? 

EDIT: I zasto mi nece ispisat vrijednost iz prve strukture lud sam, zelim da mi ispise ovu jedinicu sto je upisana pa ni to nece. cout << cvor.value; To napisem i baci gresku. Ja sam se ocito izgubio u svemu.

Windows Phone FTW
Poruka je uređivana zadnji put sub 17.5.2014 19:00 (DommY).
14 godina
neaktivan
offline
Programiranje u C++-u - pitanja i odgovori

Prvo se moraš odlučiti kakvu listu radiš. Da li listu u obliku Stack-a, reda, dvostruko povezanu ili što već.

 

Pogledaj ovdje primjere:

http://web.math.pmf.unizg.hr/~gmuic/praki/pred9/pred9.html

http://grube.web.srk.fer.hr/marcupic/CTips/Liste.html

Moj PC  
2 0 hvala 1
15 godina
neaktivan
offline
Re: Programiranje u C++-u - pitanja i odgovori
DommY kaže...

Pokusavao sam nesto, jos sam na prvom dijelu i ne ide mi, uzas -.-

Cini mi se da je ovo moguce napraviti jednostavnije ali ja ne znam pa kompliciram. 

Reci mi da li sam na dobrom putu? I zasto mi baca gresku kada pokusavam povezati prvi cvor sa drugim (komentar dole)?

Ali se barem trudiš.

 

Dakle trebaš definirati samo jednu strukturu, ne treba ti cvor2 i cvor3.

struct cvor
{
    int value;
    node *next;
};

 

Zatim definiraš tri varijable tog tipa na stacku:

cvor a, b, c;

 

I onda ih pospajaš:

a.value = 1;
a.next = &b;
   
b.value = 2;
b.next = &c;
   
c.value = 3;
c.next = NULL;

 

Eto vidiš, jednostavno. a.next pokazuje na 'b', b.next pokazuje na 'c', a c.next pokazuje na NULL jer nema više struktura u nizu.

Kod jednostruko vezane liste bitan je samo next pokazivač, on je taj koji govori koja je iduća struktura u nizu, sve ostalo u strukturi je u pravilu payload, odnosno podatci koji se koriste za nešto drugo.

 

DommY kaže...
Btw sta ti znaci ovo boldano u vezi stacka(stog?)? Jesam ja to napravio sa ove 3 strukture? 

Varijable se mogu nalaziti na dvije različite memorijske lokacije: na takozvanoj stack memoriji koja se koristi za automatske varijable (to su u biti uglavnom sve varijable koje deklariraš unutar neke funkcije), i na heap memoriji koja se koristi za statičke varijable, globalne varijable, i varijable čiju si memoriju dinamički alocirao koristeći new ili malloc().

 

Ti si definirao tri različita strukturna tipa (cvor, cvor2, cvor3), umjesto da si definirao 3 varijable istog strukturnog tipa.

 

DommY kaže...
EDIT: I zasto mi nece ispisat vrijednost iz prve strukture lud sam, zelim da mi ispise ovu jedinicu sto je upisana pa ni to nece. cout << cvor.value; To napisem i baci gresku. Ja sam se ocito izgubio u svemu.

Ajde pogledaj svoj program i reci mi što točno 'cvor' imenuje?

 

cvor je takozvani tag strukture, odnosno on imenuje taj strukturni tip, to nije ime varijable. Prema tome što bi točno ispisao iz toga? Moraš shvatiti da je to kao nekakav nacrt, on trenutno ne postoji u memoriji, nego objašnjava kompajleru kako su stvari unutar te strukture raspoređene, koliko ih ima, itd...

 

Prvo moraš napraviti instancu tog strukturnog tipa u memoriji, i tek onda možeš ispisivati vrijednosti. Odnosno kompajler mora zauzeti mjesto u memoriji za taj tip i dodjeliti ga imenu koji je programer odabrao (prvi_cvor u ovom slučaju). Znači ovo može:

struct cvor
{
    int value;
    node *next;
};

cvor prvi_cvor;

cout << prvi_cvor.value;

 

Ovo ne može:

struct cvor
{
    int value;
    node *next;
};

cout << cvor.value;

 

Kužiš, to ti je slično kao da si napravio:

cout << int;

 

int je samo naziv tipa podatka koji govori kompajleru koliko je velik u memoriji (32 bita), kako se ponaša (cijeli broj), ali tek kad ti napraviš:

int a;

 

Kažeš kompajleru da zauzme mjesto u memoriji za novi cijeli broj, i njega neka nazove 'a'. Takvo ime se naziva identifikator. Gdje god ti dalje upotrijebiš identifikator 'a', koristit će se vrijednost iz memorije koja je dodjeljena tom identifikatoru.

 

Malo sam se zapetljao u objašnjenju nadam se da si skužio na što mislim.

To understand what recursion is, you must first understand recursion.
E-mail:
Lozinka:
 
vrh stranice