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

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

Pozdrav,

 

imam problem kod ovog programa. U knjizi Demistificirani c++ (poglavlje: privremeni objekti) je zadan ovaj primjer:

 

class Vektor{
    friend void ZbrojiVektore(Vektor &a, Vektor &b, Vektor &rez);
private:
    double ax, ay;
public:
    Vektor(double x = 0, double y = 0):ax(x), ay(y){};
    double dajX(){return ax;};
    double dayY(){return ay;};
    void Postavi_xy (double x, double y){ax = x; ay = y;};
};

void ZbrojiVektore(Vektor &a, Vektor &b, Vektor &rez){
    rez.ax = a.ax + b.ax;
    rez.ay = a.ay + b.ay;
}

int main(){
      
    Vektor c;
   
    ZbrojiVektore(Vektor(3,4), Vektor(1,2), c);

 

U funkciji ZbrojiVektore imamo 2 privremena objekta. ax iz prvog objekta se zbraja sa ax iz drugog objekta te se rezultat sprema u objekt c. Isto tako i za ay.

Primjer je identično prepisan ali javlja grešku kod poziva funkcije: invalid initialization of non-const reference of type 'Vektor&' from an rvalue of type 'Vektor'

 

Moj PC  
0 0 hvala 0
16 godina
offline
Programiranje u C++-u - pitanja i odgovori

Kod mene u VS 2010 radi, dakle vjerojatno koristiš Dev C++ i on ne zna za defaultne parametre u konstruktoru. 

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

Niti C++ Builder ovo gore ne dopušta:

 

Reference initialized with 'Vektor', needs lvalue of type 'Vektor'. Type mismatch in parameter 'a' (wanted 'Vektor &', got 'Vektor')

 

S druge strane ako mu se predaju statički objekti inicijalizirani gornjim konstruktorima ili ako su parametri funkcije ZbrojiVektore konstantne reference onda radi (osim pristup privatnim članovima što se može riješiti pomoću friend).

 

Očito je da prevoditelj više ne dopušta programeru da mijenja privremeni objekt jer to u ovom slučaju niti nema smisla i može samo uzrokovati grešku (privremeni objekti iz funkcije main više ne postoje nakon poziva funkcije). Uostalom, privremeni objektni i jesu to - privremeni objekti koji postoje tek u određenom trenutku, a najčešće kao povratna vrijednost operatora;

 

Kompleksni operator + (Kompleksni Z1, Kompleksni Z2){
    return Kompleksni(Z1.re + Z2.re, Z1.im + Z2.im);
}

 

Drugim riječima, prototip tvoje funkcije bi trebao biti ovakav:

 

void ZbrojiVektore(Vektor a, Vektor b, Vektor &rez);

 

jer nema nikakvog smisla niti potrebe koristiti reference za ulazne parametre a i b, već tek za onaj koji sprema rezultat.

Kada lajavci laju onda završe ovako: http://i471.photobucket.com/albums/rr77/toropreto/2012-07-0813_30_07.gif
Poruka je uređivana zadnji put čet 26.9.2013 12:29 (TracerCPP).
Moj PC  
1 0 hvala 1
16 godina
offline
Programiranje u C++-u - pitanja i odgovori

U pravu si, probao sam u Dev C++ i ne prolazi sa referencom na privremene objekte, a bez referenci je OK.

U VS 2010 i VS 2012 bez problema prolazi sa referencama na privremene objekte.

 
1 0 hvala 0
11 godina
offline
Re: Programiranje u C++-u - pitanja i odgovori
TracerCPP kaže...
 ili ako su parametri funkcije ZbrojiVektore konstantne reference onda radi (osim pristup privatnim članovima što se može riješiti pomoću friend)

 

Jesam ja isto mutav, a lijepo piše: invalid initialization of non-const reference of type 'Vektor&' from an rvalue of type 'Vektor'

 

Hvala.

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

Može još malo pomoći za početnika? 

Zadatak je također iz knjige Demistificirani C++ (str. 104). Prvo je dan primjer koda čijim izvršavanjem se dobije tablica množenja do 10.

 

#include <iostream>
#include <iomanip>

using namespace std;
int main() {
  for (int redak = 1; redak <= 10; ++redak) {
   for (int stupac = 1; stupac <= 10; ++stupac)
    cout << setw(5) << redak * stupac;
   cout << endl;
  }
return 0;

 

Zadatak glasi: Modificirajte kod tako da se ispišu samo članovi u gornjem desnom trokutu. Uputa: unutar vanjske petlje smjestite dvije petlje po stupcima, s time da prva treba ispisivati odgovarajući broj praznina, a druga tražene brojeve.

 

Iako je dana uputa nisam uspio dobiti taj gornji desni trokut.

 

Hala unaprijed.

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

 

 

1 #include <iostream>
2 #include <iomanip>
3
4 using namespace std;
5 int main() {
6  for (int redak = 1; redak <= 10; ++redak) {
7   for (int stupac = 1; stupac <= 10; ++stupac)
8   cout << setw(5) << redak * stupac;
9   cout << endl;
10  }
11 return 0;
12 } 

 

 Uputa: unutar vanjske petlje smjestite dvije petlje po stupcima, s time da prva treba ispisivati odgovarajući broj praznina, a druga tražene brojeve.

Ne razumim zašto forsiraju petlje ovdje....

 

8. i 9, red zamjeni sa

if (redak > stupac) cout << "\t"; // (redak >= stupac) -> ako hoćeš isključiti dijagonalu iz ispisa

else cout << redak * stupac << "\t";

You can patch technical vulnerabilities as they evolve, but there is no patch for stupidity, or rather gullibility. - Kevin Mitnick
16 godina
offline
Programiranje u C++-u - pitanja i odgovori

Vjerojatno zato jer je to poglavlje o petljama u Demistificiranom, pa je zadatak tako koncipiran da provjeri usvojenu teoriju o petljama.

 

Dakle, vanjska petlja ispisuje retke, a dvije unutarnje stupce. Prva unutarna i druga unutarnja se nadovezuju u ispisu jednog retka.

Pošto nam traže gornju dijagonalu, tehnika ispisa je ova:

Prva unutarnja petlja ispisuje za jedan razmak više po svakom retku od [0, 9] razmaka od prvog do desetog retka, a druga unutarnja

petlja se u svakom retku nadoveže na prvu ispisujući vrijednosti do uključno desete kolone. Kad se prođe jedan redak sa dvije unutarnje

petlje ide se u sljedeći redak.

 

 


#include <iostream>
using namespace std;


int main()
{
    int stupac;
    for (int red = 1; red <= 10; red++)
    {
       for (stupac = 1; stupac < red; stupac++)
          cout<< "\t";
       for (; stupac <= 10; stupac++)
          cout<< red * stupac << "\t";
       cout<< endl;
    }
    return 0;
}

Poruka je uređivana zadnji put pon 30.9.2013 15:33 (Floki).
 
0 0 hvala 0
16 godina
neaktivan
offline
Programiranje u C++-u - pitanja i odgovori

Može li mi netko obajsniti zašto postoji sum = 0; u djelu koda kojega sam naznačio. sve ostalo mi je jasno.

 

 

 

#include <stdio.h>

 

int main()

{

  int m, n, p, q, c, d, k, sum = 0;

  int first[10][10], second[10][10], multiply[10][10];

 

  printf("Enter the number of rows and columns of first matrix\n");

  scanf("%d%d", &m, &n);

  printf("Enter the elements of first matrix\n");

 

  for (  c = 0 ; c < m ; c++ )

   for ( d = 0 ; d < n ; d++ )

    scanf("%d", &first[c][d]);

 

  printf("Enter the number of rows and columns of second matrix\n");

  scanf("%d%d", &p, &q);

 

  if ( n != p )

   printf("Matrices with entered orders can't be multiplied with each other.\n");

  else

  {

   printf("Enter the elements of second matrix\n");

 

   for ( c = 0 ; c < p ; c++ )

    for ( d = 0 ; d < q ; d++ )

     scanf("%d", &second[c][d]);

 

   for ( c = 0 ; c < m ; c++ )

   {

    for ( d = 0 ; d < q ; d++ )

    {

     for ( k = 0 ; k < p ; k++ )

     {

      sum = sum + first[c][k]*second[k][d];

     }

 

     multiply[c][d] = sum;

     sum = 0;            // ZAŠTO TO MORA TU BITI?

    }

   }

 

   printf("Product of entered matrices:-\n");

 

   for ( c = 0 ; c < m ; c++ )

   {

    for ( d = 0 ; d < q ; d++ )

     printf("%d\t", multiply[c][d]);

 

    printf("\n");

   }

  }

 

  return 0;

}

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

U pravilu ta incijalizacija se treba nalaziti prije petlje, a ne poslije nje. Međutim, kako na početku programa si deklarirao i inicijalizirao sum = 0 onda će i ovako raditi, ali ovaj način svakako izbjegavati.

Kada lajavci laju onda završe ovako: http://i471.photobucket.com/albums/rr77/toropreto/2012-07-0813_30_07.gif
16 godina
neaktivan
offline
Re: Programiranje u C++-u - pitanja i odgovori
TracerCPP kaže...

U pravilu ta incijalizacija se treba nalaziti prije petlje, a ne poslije nje. Međutim, kako na početku programa si deklarirao i inicijalizirao sum = 0 onda će i ovako raditi, ali ovaj način svakako izbjegavati.

Problem mi je u tome što kada maknem taj sum = 0; kod polja a ostavim onaj već gore deklariran i inicijaliziran program mi daje potpuno drugačija rješenja kod odabiranja identičnih vrijednosti za pomnožit.

13 godina
neaktivan
offline
Re: Programiranje u C++-u - pitanja i odgovori

Već sam ti napisao gdje taj sum = 0 mora biti.

Kada lajavci laju onda završe ovako: http://i471.photobucket.com/albums/rr77/toropreto/2012-07-0813_30_07.gif
16 godina
neaktivan
offline
Re: Programiranje u C++-u - pitanja i odgovori
TracerCPP kaže...

Već sam ti napisao gdje taj sum = 0 mora biti.

aha, ok hvala skužio sam što si mislio :)

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

pozdrav dali bi mi ko mogao napravit pascalov trokut u c++ , ja bi samo trebao unjet broj redaka i da između dva broja budu dva taba

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

pozdrav dali bi mi ko mogao napravit pascalov trokut u c++ , ja bi samo trebao unjet broj redaka i da između dva broja budu dva taba

Valjda receno po tri-cetiri puta na svakoj stranici, ne, ako sam ne probas i ne stavis kod gdje si zapeo i sto ti nije jasno, ne.

Perhaps today IS a good day to die. PREPARE FOR RAMMING SPEED!
13 godina
neaktivan
offline
Programiranje u C++-u - pitanja i odgovori

Pozdrav

ako mi mozete reci zato ugasi odam cmd prozor te mi ne kaze da pritisne bilo koju tipku

 

#include <stdio.h>

int main()
{
    printf("oooooooOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOoooooooooooooooo");

    return 0;
}

 

Hvala!

Moj PC  
0 0 hvala 0
16 godina
offline
Re: Programiranje u C++-u - pitanja i odgovori
Zodiak kaže...

Pozdrav

ako mi mozete reci zato ugasi odam cmd prozor te mi ne kaze da pritisne bilo koju tipku

 

...

Zato sto to automatski radi Code::Blocks za tebe. Ti ocito onda njega ne koristis. Dodaj getchar(); na kraj i onda ti se nece prozor odmah ugasiti.

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

Pozdrav

ako mi mozete reci zato ugasi odam cmd prozor te mi ne kaze da pritisne bilo koju tipku

Zato što se program završio. Zašto bi ti prozor i dalje ostao otvoren? Ostane li ti browserov prozor otvoren nakon što klikneš na 'x' gore desno?

 

Ako želiš da se prozor ne zatvori jednostavno sredi program tako da se ne izvrši do kraja bez tvoje intervencije.

What Andy giveth, Bill taketh away.
11 godina
neaktivan
offline
Programiranje u C++-u - pitanja i odgovori

Šta je vector u c++? Za što se koristi i šta on predstavlja?

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

Šta je vector u c++? Za što se koristi i šta on predstavlja?

Spremnik slican polju koji moze dinamicki mijenjati velicinu.

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

Pozdrav

ako mi mozete reci zato ugasi odam cmd prozor te mi ne kaze da pritisne bilo koju tipku

 

...

Zato sto to automatski radi Code::Blocks za tebe. Ti ocito onda njega ne koristis. Dodaj getchar(); na kraj i onda ti se nece prozor odmah ugasiti.

funkcija getcher() mi ne pomaze kada napravim da moram unositi na zaslonu vrijednosti za varijable jer nakon 2. ENTERA ugasi se program

skuzio sam da kada stavim 5 getchar() morem  stisnut 5 puta ENTER :)

 

mogoli jos kako zadrzat program upaljenim da

sta je taj code:bloks ?

 

Hvala!

Poruka je uređivana zadnji put pon 7.10.2013 23:12 (Zodiak).
16 godina
offline
Re: Programiranje u C++-u - pitanja i odgovori
Zodiak kaže...

funkcija getcher() mi ne pomaze kada napravim da moram unositi na zaslonu vrijednosti za varijable jer nakon 2. ENTERA ugasi se program

skuzio sam da kada stavim 5 getchar() morem  stisnut 5 puta ENTER :)

 

mogoli jos kako zadrzat program upaljenim da

sta je taj code:bloks ?

 

Hvala!

Kako ne, getchar() samo stavis na kraj programa, prije return 0. getchar() je u biti funkcija koja ceka da uneses neki character.

Code::Blocks je IDE iliti integrirano razvojno okruzenje.

Perhaps today IS a good day to die. PREPARE FOR RAMMING SPEED!
13 godina
neaktivan
offline
Programiranje u C++-u - pitanja i odgovori

sto znaci ovaj F na kraju p=2000.0F 

#include<stdio.h>
#include<math.h>

int main()
{
    float p=2000.0F,V;
    float m;
    V=10;
    m=p*V;
    printf("\n Masa=%f kg",m);
    getchar();
    getchar();
    return 0;
}

Moj PC  
0 0 hvala 0
16 godina
offline
Programiranje u C++-u - pitanja i odgovori

To ti je oznaka za float literal konstantu

 

100.505F   float broj

100.505f   float broj

100.505    double broj

 

 

Dakle, jesi li ovdje mogao bez oznake F. Naravno jesi, osim što bi onda float varijabli pridružio double literal konstantu, odnosno castao bi u niži raspon brojeva, dobio upozorenje o mogućem gubitku podataka i to je to.

Poruka je uređivana zadnji put uto 8.10.2013 17:04 (Floki).
 
0 0 hvala 0
16 godina
offline
Re: Programiranje u C++-u - pitanja i odgovori
Floki kaže...
Dakle, jesi li ovdje mogao bez oznake F. Naravno jesi, osim što bi onda float varijabli pridružio double literal konstantu, odnosno castao bi u niži raspon brojeva, dobio upozorenje o mogućem gubitku podataka i to je to.

Obrnuto, double ima vecu preciznost od floata.

Perhaps today IS a good day to die. PREPARE FOR RAMMING SPEED!
16 godina
offline
Re: Programiranje u C++-u - pitanja i odgovori
1domagoj1 kaže...
Floki kaže...
Dakle, jesi li ovdje mogao bez oznake F. Naravno jesi, osim što bi onda float varijabli pridružio double literal konstantu, odnosno castao bi u niži raspon brojeva, dobio upozorenje o mogućem gubitku podataka i to je to.

Obrnuto, double ima vecu preciznost od floata.

 

 

float broj = 100.505

 

pa da, to sam i rekao, cast u niži raspon. Ovdje imamo cast double u float.

Poruka je uređivana zadnji put uto 8.10.2013 17:19 (Floki).
16 godina
offline
Re: Programiranje u C++-u - pitanja i odgovori
Floki kaže...

float broj = 100.505

 

pa da, to sam i rekao, cast u niži raspon. Ovdje imamo cast double u float.

Joj sry, krivo sam te skuzio. Zanemari.

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

float broj = 100.505

 

pa da, to sam i rekao, cast u niži raspon. Ovdje imamo cast double u float.

Joj sry, krivo sam te skuzio. Zanemari.

Ma sve 5, lako za to, mali nesporazum{#}

 

Inače ja u stvari samo i koristim double, float sam potpuno izbacio. Baš radi preciznosti, a onda i konzistentnosti. 

A i pisanje literala je tako postavljeno, za napisati double ne treba posebna oznaka.

Poruka je uređivana zadnji put uto 8.10.2013 17:32 (Floki).
14 godina
neaktivan
offline
Re: Programiranje u C++-u - pitanja i odgovori
Zodiak kaže...

Pozdrav

ako mi mozete reci zato ugasi odam cmd prozor te mi ne kaze da pritisne bilo koju tipku

 

#include <stdio.h>

int main()
{
    printf("oooooooOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOoooooooooooooooo");

    return 0;
}

 

Hvala!

napisi System("PAUSE"); prije return 0;

Poruka je uređivana zadnji put sri 9.10.2013 14:45 (NiGHT_RiDER92).
15 godina
offline
Re: Programiranje u C++-u - pitanja i odgovori
Imam instaliran code blocks 12.11 program te u njemu pokusavam pokrenuti jedan jednostavan program. Kada ga napisem, pokusam ga pokrenuti tako da kliknem na "build and run", medutim program se ne pokrece a ispod koda se ispise da code blocks nemoze pronaci/pokrenuti compiler i nakon toga nista se dalje ne desava. Sta bi ja trebao taj compiler instalirati ili? Hvala !
Windows Phone FTW
E-mail:
Lozinka:
 
vrh stranice