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

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

Hvala ti puno, sve sam shvatio ! Tek sad vidim koje sam gluposti pitao {#}

 
0 0 hvala 0
9 godina
neaktivan
offline
Programiranje u C++-u - pitanja i odgovori

Novo pitanje : Zasto se ovdje koristi #define N 20. Zasto se odmah ne upise umjesto N 20?

 

/* program ucitava 20 realnih brojeva i ispisuje koliko od njih

  ima decimalni dio u rasponu 1) 0.00 - 0.24  2) 0.25 - 0.49

  3) 0.50 - 0.74  4) 0.75 - 0.99 */

 

#include <stdio.h>

#include <math.h>

#define N 20

 

int main()

{

   float broj[N], dd;

   int br1 = 0, br2 = 0, br3 = 0, br4 = 0, i;

 

printf("Unesi %d realnih brojeva:\n", N);

   for(i = 0; i < N; i++)

     scanf("%f", &broj[i]);


 
0 0 hvala 0
14 godina
neaktivan
offline
Re: Programiranje u C++-u - pitanja i odgovori
Budhala kaže...

Novo pitanje : Zasto se ovdje koristi #define N 20. Zasto se odmah ne upise umjesto N 20?

 

/* program ucitava 20 realnih brojeva i ispisuje koliko od njih

  ima decimalni dio u rasponu 1) 0.00 - 0.24  2) 0.25 - 0.49

  3) 0.50 - 0.74  4) 0.75 - 0.99 */

 

#include <stdio.h>

#include <math.h>

#define N 20

 

int main()

{

   float broj[N], dd;

   int br1 = 0, br2 = 0, br3 = 0, br4 = 0, i;

 

printf("Unesi %d realnih brojeva:\n", N);

   for(i = 0; i < N; i++)

     scanf("%f", &broj[i]);

 

Onaj tko je napisao ovaj snippet , stavio je definiciju N-a bez posebnog valjanog razloga.

Drugim riječima , moglo je biti :

 

unsigned int N = 20; 

const unsigned int N = 20;

...

...

...

 

Dakle , proizvoljno je odobrano definirati N kroz  #define N 20

 

P.S (ovako napisan kod je C-like tako da eventualno bi odgovor mogao biti  -- iz navike -- (više je ovaj način C-ovski) no kako je pitano u sekciji C++ pitanja , i dalje je krajnji odgovor - proizvoljno)

moje aplikacije na play-u : https://play.google.com/store/search?q=nik02droid
Poruka je uređivana zadnji put pon 1.9.2014 13:20 (nik_02).
9 godina
neaktivan
offline
Re: Programiranje u C++-u - pitanja i odgovori

Aha, tako sam i mislio. Hvala :)

 

Moze netko pomoci sa ovim zadatkom? (Obecajem posljedni put da trazim nesto)

 

1. Napisi program koji unosi znakove sve dok svaki samoglasnik nije unesen barem po jedan put. Nakon toga za svaki  samoglasnik ispisati koliko je puta unesen, ne vodeći računa radi li se o velikom ili o malom slovu.

 

Ja sam poceo ovako :

 

#include<stdio.h>

int main ()

{

   char znak[100], i , j,  brA = 0, brE = 0, brI = 0, brO = 0, brU = 0;

 

   printf("Unesi znakove");

   for(i = 0; i < 100; i++)

   scanf("%c", &znak[i]);

 

Sad tu treba obrada

 

ovaj dio "bez obzira je li malo ili veliko slovo" ide ovako :

 

// malo/veliko slovo

for(j = 0; j <= i; j++)

   {

     switch(znak[j])

     {

       case 'A':

       case 'a':         

       {

         brA++;

         break;

       }

       case 'E':

       case 'e':         

       {

         brE++;

         break;

       }

       case 'I':

       case 'i':         

       {

         brI++;

         break;

       }

       case 'O':

       case 'o':         

       {

         brO++;

         break;

       }

       case 'U':

       case 'u':         

       {

         brU++;

         break;

       }                   

     }    

 

 for(j = 0; j <= i; j++)

   {

     switch(znak[j])

     {

       case 'A':

       case 'a':         

       {

         brA++;

         break;

       }

       case 'E':

       case 'e':         

       {

         brE++;

         break;

       }

       case 'I':

       case 'i':         

       {

         brI++;

         break;

       }

       case 'O':

       case 'o':         

       {

         brO++;

         break;

       }

       case 'U':

       case 'u':         

       {

         brU++;

         break;

       }                   

     }    

   }

 

   // ispis rezultata

   printf("Samoglasnik A unesen je %d puta.\n", brA);

   printf("Samoglasnik E unesen je %d puta.\n", brE);

   printf("Samoglasnik I unesen je %d puta.\n", brI);

   printf("Samoglasnik O unesen je %d puta.\n", brO);

   printf("Samoglasnik U unesen je %d puta.\n", brU);

 

   // kraj

   char z;

   fflush(stdin);

   z = getchar();

   return 0;

}

 

 

Dalje??

Poruka je uređivana zadnji put pon 1.9.2014 14:11 (Budhala).
14 godina
neaktivan
offline
Re: Programiranje u C++-u - pitanja i odgovori
Budhala kaže...

Aha, tako sam i mislio. Hvala :)

 

Moze netko pomoci sa ovim zadatkom? (Obecajem posljedni put da trazim nesto)

 

1. Napisi program koji unosi znakove sve dok svaki samoglasnik nije unesen barem po jedan put. Nakon toga za svaki  samoglasnik ispisati koliko je puta unesen, ne vodeći računa radi li se o velikom ili o malom slovu.

---

 

Ovaj se zadatak može riješiti na bezbroj načina.

Ti si nešto počeo u C stilu no probaj se prebaciti mentalno na C++ što bi značilo za početak-> forsiraj klase gdje god stigneš.

Naravno da je C odličan jezik i nije bez vraga i dan danas na TIOBE ljestvici čini mi se prvi no C++ je kralj jer u njemu možeš pisati ovako kako si počeo i na sasvim drugi (lakši , razumljiviji i brži način).

Pošto je ovo sekcija C++ pitanja , napravio sam ti shodno tome 95% riješenja bar da se dodirnu klase (onih 5% fali da program odradi i za velika slova a to zamoljavam tebe da dodaš{#}).

Malo prouči kod , ako što nije jasno a pretpostavljam da neće biti  pitaj pa se nadam ako  neću biti online da ćeveć netko odgovoriti traženo.

 

U kratko :

koristimo dvije klase kako bi si olakšali život i manipulaciju podacima

forsiramo C++11 style iako je već pomalo blesavo to naglašavati pošto nam je pred vratima novi standard C++14 (male izmjene no računa se kako novi)

upotreba std::algorithm i std::vector ponovo kako bi si olakšali život.

 

Ugodno kodiranje želim dalje !

 

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

//==========================//
bool program_finish {false};
//==========================//

class Samoglasnik
{
public:
    Samoglasnik(char c) : m_c(c) {}
    void raise();
    char sign();
    unsigned amount();

private:
    char m_c;
    unsigned m_n {0};
};

void Samoglasnik::
raise()
{
    ++m_n;
}

char Samoglasnik::
sign()
{
    return m_c;
}

unsigned Samoglasnik::
amount()
{
    return m_n;
}



class Samoglasnici
{
public:

    bool process(char c);
    void log();

private:
    bool isOver();

    vector<Samoglasnik> m_d
    {
        Samoglasnik('a'),
        Samoglasnik('e'),
        Samoglasnik('i'),
        Samoglasnik('o'),
        Samoglasnik('u')
    };

};

bool Samoglasnici::
isOver()
{
    for(auto x : m_d)
    {
        if(x.amount() == 0)
            return false;
    }

    return true;
}

bool Samoglasnici::
process(char c)
{
    auto ret = find_if(m_d.begin(),m_d.end(), [&,c](Samoglasnik s)
    {
        return (s.sign() == c);
    });

    ptrdiff_t ptrdiff = ret - m_d.end();
    if(ptrdiff != 0)
    {
        ret->raise();
    }

    return isOver();
}


void Samoglasnici::
log()
{
    for(auto x : m_d)
        cout<< "\nsamoglasnik " << x.sign() << " se pojavljuje " << x.amount() << " puta";

}


void
mainLoop(Samoglasnici& data)
{
    while ( ! program_finish)
    {
        cout<< "unesi jedan znak : ";
        char c;
        cin>> c;
        program_finish = data.process(c);
    }
}


int main()
{
    Samoglasnici data;
    mainLoop(data);

    data.log();



    cout << "\n\nexiting..." << endl;
    return 0;
}

moje aplikacije na play-u : https://play.google.com/store/search?q=nik02droid
Poruka je uređivana zadnji put pon 1.9.2014 22:04 (nik_02).
12 godina
neaktivan
offline
Re: Programiranje u C++-u - pitanja i odgovori

Nema potrebe za ovakvo što pisati vlastite klase kad u standardnoj biblioteci postoje već gotove tj. umjesto vektora koristi mapu i problem rješen puno brže i jednostavnije. Ili klasični C pristup preko statičkog polja: brojac[slovo]++.

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

Nema potrebe za ovakvo što pisati vlastite klase kad u standardnoj biblioteci postoje već gotove tj. umjesto vektora koristi mapu i problem rješen puno brže i jednostavnije. Ili klasični C pristup preko statičkog polja: brojac[slovo]++.

kasno palim ali ako nekom treba kod:

http://ideone.com/kUT4oD

 

nije mi se dalo zafrkavati sa lowercajsanjem...

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

Trebam pomoć, kako napisati program koji pretvara broj iz običnog binarnog (znači nije binarni na decimale) u dekadski? 

Ja sam napisao ovo, ali znam da mi je tu gdje računa c greška (to sam dodao u program da mi ispisuje c). Ovo sam dodao neke ispise da vidim kak je gdje stanje, no meni na kraju treba ako unesem npr 1111 ispisati 15.

Treba biti pisano tako s for petljom, jer smo to radili na satu, ne smije biti nikakvih funkcija itd. 
Znači trebam to rješiti školski, samo s for, jednostavnim grananjem i while.
 
#include <iostream>

#include <cstdlib>

using namespace std;

int main(){

 

int bi;

int a=0,b=1,c=1;

cin >> bi;

while (bi / 10>=0.1){

 if (bi%10==1 || bi/10==0.1){

 for(int i=1;i<=b;i++){

 c=c*i;}  /*tu je ocito greska, kako popraviti?*/

 a=a+c;

 bi=bi-1;

 bi=bi/10;

 }

else {bi=bi/10;}

 

 b++;

 c=0;

 cout << bi<<endl; /* ovo sam pisao da vidim dal mi uopce pokrati zadnju znamenku*/

}

cout << endl <<"rez: "<< a;

return 0;

}

All rights reserved. Copyright (c) by Dipl. Pješak 2014.
Moj PC  
0 0 hvala 0
14 godina
offline
Re: Programiranje u C++-u - pitanja i odgovori
Diplomirani pješak kaže...

Trebam pomoć, kako napisati program koji pretvara broj iz običnog binarnog (znači nije binarni na decimale) u dekadski? 

Ja sam napisao ovo, ali znam da mi je tu gdje računa c greška (to sam dodao u program da mi ispisuje c). Ovo sam dodao neke ispise da vidim kak je gdje stanje, no meni na kraju treba ako unesem npr 1111 ispisati 15.

Treba biti pisano tako s for petljom, jer smo to radili na satu, ne smije biti nikakvih funkcija itd. 
Znači trebam to rješiti školski, samo s for, jednostavnim grananjem i while.
 
#include <iostream>

#include <cstdlib>

using namespace std;

int main(){

 

int bi;

int a=0,b=1,c=1;

cin >> bi;

while (bi / 10>=0.1){

 if (bi%10==1 || bi/10==0.1){

 for(int i=1;i<=b;i++){

 c=c*i;}  /*tu je ocito greska, kako popraviti?*/

 a=a+c;

 bi=bi-1;

 bi=bi/10;

 }

else {bi=bi/10;}

 

 b++;

 c=0;

 cout << bi<<endl; /* ovo sam pisao da vidim dal mi uopce pokrati zadnju znamenku*/

}

cout << endl <<"rez: "<< a;

return 0;

}

Prije svega, dijeljenje bi/10 je cjelobrojno dijeljnje sto znaci da tim dijeljnjem neces nikada dobiti 0.1 tj. 1/10 nije jednako 0.1 vec 0. Da bi to popravio stavi 10.0 umjesto 10. Kad napises 10.0 onda je to tipa double (ili float, nisam potpuno siguran) pa ce i dijeljenje rezultirati double tipom. (1/10.0 = 0.1).

Ovo: for(int i=1;i<=b;i++){ c=c*i;} ti nema smisla jer ti for petlja tu pratkicki neradi nista. U svakoj iteraciji ti vrijednost od c prebrises novom vrijednosti i na kraju ce c biti jednako c = b*c. To si mogao odmah napisati. No to opet nema smisla, pa taj dio mozemo izbrisati. Zatim umjesto c= 0 trebamo napisati c = c*2 i kod ce ti normalno raditi:

#include <iostream>
#include <cstdlib>

using namespace std;

int main()
{
    int bi;
    int a=0,b=1,c=1;
    cin >> bi;

    while (bi / 10.>=0.1)
    {
        if (bi%10==1 || bi/10==0.1)
        {
            a=a+c;
            bi=bi-1;
            bi=bi/10;
        }
        else
        {
            bi=bi/10.;
        }
        b++;
        c= c*2;
        cout << bi<<endl; /* ovo sam pisao da vidim dal mi uopce pokrati zadnju znamenku*/
    }
    cout << endl <<"rez: "<< a;
    return 0;

}

 

Evo ti malo jednostavniji nacin:

#include <iostream>

using namespace std;

int main()
{
    int bi;
    cin >> bi;

    int rez = 0;
    while(bi > 0){
        rez = 2*rez + bi%2;
        bi /= 10;
    }
    cout << rez << endl;
}

 

Poruka je uređivana zadnji put čet 18.9.2014 20:42 (captain_soap_McTawish).
12 godina
neaktivan
offline
Programiranje u C++-u - pitanja i odgovori

 

Ovaj kod ne radi ispravno, za unos 1110 ispisuje 7? 

 #include <iostream>

 


using namespace std;

int main()
{
    int bi;
    cin >> bi;

    int rez = 0;
    while(bi > 0){
        rez = 2*rez + bi%2;
        bi /= 10;
    }
    cout << rez << endl;
}

All rights reserved. Copyright (c) by Dipl. Pješak 2014.
Moj PC  
0 0 hvala 0
12 godina
neaktivan
offline
Re: Programiranje u C++-u - pitanja i odgovori
Diplomirani pješak kaže...

 

        rez = 2*rez + bi%2;

Ovdje ti je greška, za zadnju znamenku moraš tražiti ostatak dijeljenja s 10, a ne s 2. 

EDIT: Vidim da i ne radi ovako u svim slučajevima. Ovako bi trebalo izgledati točno rješenje koristeći istu logiku:

 

#include <iostream>

using namespace std;

 

int main(void)

{

   int bin,potencija=1,dec=0,znamenka;

   cin>>bin;

   while(bin>0) {

       znamenka=bin%10;

       dec+=potencija*znamenka;

       potencija=potencija*2;

       bin=bin/10;}

cout<<dec;

}

Poruka je uređivana zadnji put čet 18.9.2014 20:31 (ICT Sith).
11 godina
offline
Re: Programiranje u C++-u - pitanja i odgovori
captain_soap_McTawish kaže...
Ovo: for(int i=1;i<=b;i++){ c=c*i;} ti nema smisla jer ti for petlja tu pratkicki neradi nista. U svakoj iteraciji ti vrijednost od c prebrises novom vrijednosti i na kraju ce c biti jednako c = b*c. To si mogao odmah napisati. No to opet nema smisla, pa taj dio mozemo izbrisati. Zatim umjesto c= 0 trebamo napisati c = c*2 i kod ce ti normalno raditi:

Slazem s s ostatkom posta, ali ne i da ta petlja ne radi nista - racuna b! (faktorijel) i nije mogao samo odmah napisat c=c*b (tj. c=b jer c=1 na pocetku). Zasto mu treba b! je drugo pitanje, ono sto zeli je 2^b. Moze se njegov program popravit i s manje izmjena i ostavljanjem petlje:

while (bi > 0){
 if (bi%10==1){
     for(int i=1;i<=b;i++) { c *= 2; } 
    a=a+c;
    bi=bi-1;
    bi=bi/10;
 }
 else {bi=bi/10;}
 b++;
 c=1;
}


Jedino sto je neefikasno...

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

Hvala na brzim odgovorima! To što nije efikasno sad uopće nije bitno:D

All rights reserved. Copyright (c) by Dipl. Pješak 2014.
Moj PC  
0 0 hvala 0
14 godina
offline
Re: Programiranje u C++-u - pitanja i odgovori
Diplomirani pješak kaže...

 

Ovaj kod ne radi ispravno, za unos 1110 ispisuje 7? 

 

ICT Sith kaže...

 

Ovdje ti je greška, za zadnju znamenku moraš tražiti ostatak dijeljenja s 10, a ne s 2. 

EDIT: Vidim da i ne radi ovako u svim slučajevima. Ovako bi trebalo izgledati točno rješenje koristeći istu logiku:

#

CyberK kaže...
captain_soap_McTawish kaže...
Ovo: for(int i=1;i<=b;i++){ c=c*i;} ti nema smisla jer ti for petlja tu pratkicki neradi nista. U svakoj iteraciji ti vrijednost od c prebrises novom vrijednosti i na kraju ce c biti jednako c = b*c. To si mogao odmah napisati. No to opet nema smisla, pa taj dio mozemo izbrisati. Zatim umjesto c= 0 trebamo napisati c = c*2 i kod ce ti normalno raditi:

Slazem s s ostatkom posta, ali ne i da ta petlja ne radi nista - racuna b! (faktorijel) i nije mogao samo odmah napisat c=c*b (tj. c=b jer c=1 na pocetku). Zasto mu treba b! je drugo pitanje, ono sto zeli je 2^b. Moze se njegov program popravit i s manje izmjena i ostavljanjem petlje:

Hvala na ispravkama. Nisam bas spavao posljednjih dana pa napisem svakakve gluposti.{#}

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

Ma nisi toliko ni fulao, šteka jedino sa nulama, koncept je ok, onda samo prepraviti na mastematičku formulu, ali metoda izlučivanja znamenki je dobar koncept. I modulo 2 si ispravno upotrijebio, ne stoje kritike.

 

 

#include <iostream>

using namespace std;

int main()
{
    int bi;
    cin >> bi;

    int rez = 0, brojac = -1;
    while (bi > 0){
       rez += (bi % 2) * pow(2, ++brojac);
       bi /= 10;
    }
    cout << rez << endl;
}

 

Ili bez pow

 

#include <iostream>

using namespace std;

int main()
{
    int bi;
    cin >> bi;

    int rez = 0, brojac = 1;
    while (bi > 0){
       rez += (bi % 2) * brojac;
       brojac *= 2;
       bi /= 10;
    }
    cout << rez << endl;
}

Poruka je uređivana zadnji put čet 18.9.2014 22:00 (Floki).
 
2 0 hvala 0
14 godina
neaktivan
offline
Re: Programiranje u C++-u - pitanja i odgovori
Diplomirani pješak kaže...

Trebam pomoć, kako napisati program koji pretvara broj iz običnog binarnog (znači nije binarni na decimale) u dekadski? 

 

Smatram da je Floki dao odgovor na traženo tako da moj post ne bi bio direktan odgovor na tvoje pitanje već ostalima koje zanima podsjetnik na C++11 feature koji u 1 liniji koda obavlja zadaću.

Tebe sam dakle citirao samo da se vidi gore navedeno pitanje.

 

#include <iostream>

#include <string>

using namespace std;

 

int main()

{   

   string s_bin; 

   cin>> s_bin;    

   cout << "decimal :  " << stoi (s_bin,nullptr,2) << endl; 

 

 

   return 0;

}

moje aplikacije na play-u : https://play.google.com/store/search?q=nik02droid
16 godina
neaktivan
offline
Programiranje u C++-u - pitanja i odgovori

Nisam to prije vidio, baš zgodno, u jednoj liniji koda. Inače ja bi to osobno riješio tako da bi potencirao preko bitovnog operatora pomaka i postupak sveo na izlučivanje znamenki, ali, sumnjam da to rade u školi, pa nisam htio. Pow bih izbjegao, bitovni operatotri su brži, a u stvari, osim izlučivanja znamenki bila bi samo jedna linja koda.

 

 

Poruka je uređivana zadnji put ned 21.9.2014 17:32 (Floki).
 
0 0 hvala 0
11 godina
neaktivan
offline
Programiranje u C++-u - pitanja i odgovori

Možemo i pomoću rekurzije: 

#include <iostream>

using namespace std;

 

int rf(int bin, int b){

  if (bin <= 0) return 0;

  return (bin % 10) * pow(2.0, b) + rf(bin / 10, b+1);

}

int main(){

  int binarni;

  cin >> binarni;

  cout << binarni << " to dec " << rf(binarni, 0);

 

system("pause>null");

return 0;

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

Zašto uopće izlučivati znamenke? Odnosno, zašto početnu vrijednost unositi kao integer? Zar ne bi bilo pametnije binarni broj tretirati kao string? Manje je nakaradno i može se zapravo i unijeti proizvoljno velik broj. 264 je 18446744073709551616 što znači da čak i u 64 bitni integer možemo nagurati samo 20 znamenki. A to nam daje kapacitet samo za binarno upisane brojeve do 220-1, odnosno do 104857510 jer je to 111111111111111111112. Malo filozofiram jer vjerojatno nitko neće tako duge kifle od brojeva unositi u zadatku, ali zašto odmah ne učiti učenike da razmišljaju o tim stvarima unaprijed?

 

#include <stdio.h>

int main()
{
    char binarniBroj[] = "00000000000000000000010001001011"; //1099 decimalno
    unsigned int decimalniBroj = 0;

    for (int n = 31; n >= 0; n--)
    {
        if (binarniBroj[n] == '1')
            decimalniBroj += 1ul << (31 - n);
    }

    printf("%d\n", decimalniBroj);

    return 0;
}

 

Eto. Ne'š ti posla... uz par preinaka moguće učiniti kôd puno generalnijim.

 

EDIT:

kao posebna perverzija eto i alternativan pristup

for (int n = 31; n >= 0; n--)
    decimalniBroj += (binarniBroj[n] & 0x1) << (31 - n);

 

A C program is like a fast dance on a newly waxed dance floor by people carrying razors.
Poruka je uređivana zadnji put ned 21.9.2014 19:30 (rustweaver).
16 godina
neaktivan
offline
Programiranje u C++-u - pitanja i odgovori

Pa onda to malo poopći, a ne tako kobasice od brojeva u stringu pisati.

 

#include <stdio.h>
#include <string.h>

int main()
{
    char binarniBroj[] = "101";
    unsigned int decimalniBroj = 0;
    int duljina = strlen(binarniBroj);

    for (int n = 0; n <duljina ; n++)
    {
      
          decimalniBroj += (binarniBroj[n]-48) << (duljina-n-1);
    }

    printf("%d\n", decimalniBroj);

    return 0;
}

 

Poruka je uređivana zadnji put ned 21.9.2014 21:53 (Floki).
 
1 0 hvala 0
14 godina
neaktivan
offline
Re: Programiranje u C++-u - pitanja i odgovori
Floki kaže...

Pa onda to malo popći, a ne tako kobasice od brojeva u stringu pisati.

Pa kad mi je pola toga hardkodirano... da nisam toliko lijen bio bih pametniji :D

A C program is like a fast dance on a newly waxed dance floor by people carrying razors.
16 godina
neaktivan
offline
Re: Programiranje u C++-u - pitanja i odgovori
Floki kaže...

Pa onda to malo poopći, a ne tako kobasice od brojeva u stringu pisati.

 

#include <stdio.h>
#include <string.h>

int main()
{
    char binarniBroj[] = "101";
    unsigned int decimalniBroj = 0;
    int duljina = strlen(binarniBroj);

    for (int n = 0; n <duljina ; n++)
    {
      
          decimalniBroj += (binarniBroj[n]-48) << (duljina-n-1);
    }

    printf("%d\n", decimalniBroj);

    return 0;
}

 

  ovaj kod je "los" jer bi za shift za vise od 31 trebao baciti error... ili barem dodaj assert, ovako imas samo UB. :D 

http://msdn.microsoft.com/en-us/library/336xbhcz.aspx 

unsigned int int4 = int1 << 32; // C4293: '<<' : shift count negative or too big, undefined behavior

 

isprike na formatiranju, genijalni forum neda normalni paste

14 godina
neaktivan
offline
Re: Programiranje u C++-u - pitanja i odgovori
Zoidberg kaže...
unsigned int int4 = int1 << 32; // C4293: '<<' : shift count negative or too big, undefined behavior

GCC na x86, očekivano za to iskoristi SAL, ali ispljune i upozorenje: "warning: left shift count >= width of type [enabled by default]"

 

#include <stdio.h>

int main()
{
    int n;
    scanf("%d", &n);
    return (n << 32);   
}

 

_main:
    pushl   %ebp
    movl    %esp, %ebp
    andl    $-16, %esp
    subl    $32, %esp
    call    ___main
    leal    28(%esp), %eax
    movl    %eax, 4(%esp)
    movl    $LC0, (%esp)
    call    _scanf
    movl    28(%esp), %eax
    movb    $32, %cl
    sall    %cl, %eax
    leave
    ret

 

Ukratko što se dogodi jest kada shiftaš vrijednost za više mjesta nego što je registar širok, dogodi se jedno veliko ništa. Što je, bar s moje strane, očekivan rezultat na x86 iako C standard tu ne definira što se točno treba dogoditi. MSVC vjerojatno radi istu stvar...

 

Mislim da su takve provjere kontraproduktivne u ovom slučaju. Cilj je prenijeti originalnu misao kako bi se shvatio princip algoritma, a ne ju zakomplicirati kojekakvim provjerama koje pokrivaju neuobičajene slučajeve. Ima tu još mogućih neobičnih stanja koja dovode do netočnih rezultata, recimo što se dogodi kad se u stringu nalaze znakovi koji nisu '0' i '1'? Možeš reći ali on je upisao samo 0 i 1, ali isto tako možeš onda reći i da je upisao string od samo tri znaka, pa neće sigurno koristiti shift za više od 31 mjesta.

 

Ako profesor baš inzistira na točnosti sa svakakvim inputom, onda neka si sve te ekstra provjere učenici sami implementiraju, pa ne može se baš sve za njih napraviti a oni samo da sjede na rukama. :P

A C program is like a fast dance on a newly waxed dance floor by people carrying razors.
Poruka je uređivana zadnji put pon 22.9.2014 19:40 (rustweaver).
12 godina
neaktivan
offline
Re: Programiranje u C++-u - pitanja i odgovori
Zoidberg kaže...

ovaj kod je "los" jer bi za shift za vise od 31 trebao baciti error... ili barem dodaj assert, ovako imas samo UB. :D 

http://msdn.microsoft.com/en-us/library/336xbhcz.aspx 

unsigned int int4 = int1 << 32; // C4293: '<<' : shift count negative or too big, undefined behavior

Postoji i long long tip (8 bajtova - 64bita), a neki prevoditelji to podržavaju i ovako:

 

__int8
__int16
__int32
__int64

Poruka je uređivana zadnji put pon 22.9.2014 19:58 (TracerCPP).
16 godina
neaktivan
offline
Re: Programiranje u C++-u - pitanja i odgovori
Zoidberg kaže...
Floki kaže...

Pa onda to malo poopći, a ne tako kobasice od brojeva u stringu pisati.

 

#include <stdio.h>
#include <string.h>

int main()
{
    char binarniBroj[] = "101";
    unsigned int decimalniBroj = 0;
    int duljina = strlen(binarniBroj);

    for (int n = 0; n <duljina ; n++)
    {
      
          decimalniBroj += (binarniBroj[n]-48) << (duljina-n-1);
    }

    printf("%d\n", decimalniBroj);

    return 0;
}

 

  ovaj kod je "los" jer bi za shift za vise od 31 trebao baciti error... ili barem dodaj assert, ovako imas samo UB. :D 

http://msdn.microsoft.com/en-us/library/336xbhcz.aspx 

unsigned int int4 = int1 << 32; // C4293: '<<' : shift count negative or too big, undefined behavior

 

isprike na formatiranju, genijalni forum neda normalni paste

 

Iskreno, nisam se toga ni sjetio, mada kod takvog tipa školskih zadataka obično stoji nekakav uvjet tipa 1<=n<=31, pa je zbilja rijetko vidjeti da se pišu iznimke, assertovi, čak i if uvjeti. Ali, u pravu si, kod produkcijskog koda treba sve mogućnosti uzeti u obzir i tu sam dosta pažljiviji, ovdje bi stavio samo if i ušao u petlju ili poslao obavijest da binarni broj ima više od 32 znamenke.

Da stvar bude još bolja, VS mi za ovaj kod kad prijeđem 31 pomak ne daje upozorenje, a za pomak kakav si ti napisao dobijem upozorenje.

 

 

Inače kod mene radi _int64, kako je Tracer stavio, ne trebam pisati long long, sizeof operator mi daje 8 bajtova, što će reći 64 mjesta.

Poruka je uređivana zadnji put sri 24.9.2014 22:06 (Floki).
16 godina
neaktivan
offline
Re: Programiranje u C++-u - pitanja i odgovori
TracerCPP kaže...
Zoidberg kaže...

ovaj kod je "los" jer bi za shift za vise od 31 trebao baciti error... ili barem dodaj assert, ovako imas samo UB. :D 

http://msdn.microsoft.com/en-us/library/336xbhcz.aspx 

unsigned int int4 = int1 << 32; // C4293: '<<' : shift count negative or too big, undefined behavior

Postoji i long long tip (8 bajtova - 64bita), a neki prevoditelji to podržavaju i ovako:

 

__int8
__int16
__int32
__int64

standardni tipovi su int8_t, unt64_t ... iako dosta firmi je pametno odlucilo da je to gadno pisati pa imaju to typedefano na to minus _t sufix. :)

 

@floki kompajer ti ne daje upozorenje jer bi morao izvrsavati program tokom compile timea da vidi da li ces ikad doci u situaciju da shiftas za preko 31...

mozda bi ti ubsan tu mogao pomoci, ali ja osobno nikad to nisam probao:

http://blog.llvm.org/2013/04/testing-libc-with-fsanitizeundefined.html

 

 

Poruka je uređivana zadnji put ned 28.9.2014 12:15 (Zoidberg).
9 godina
neaktivan
offline
Programiranje u C++-u - pitanja i odgovori

Bok! Imam jedno pitanje za vas. Može li se pisati C++ program u Notepad? Molim odgovor!!{#}

I am the Living Death.I am coding your hard disk now. Your FAT is destroyed and his copy is only in memory. If you set power off,all your data will be lost. R.I.P DOS!
Moj PC  
0 0 hvala 0
16 godina
neaktivan
offline
Re: Programiranje u C++-u - pitanja i odgovori
Flexan22 kaže...

Bok! Imam jedno pitanje za vas. Može li se pisati C++ program u Notepad? Molim odgovor!!{#}

Moze u bilo kakvom tekstualnom editoru. Vazno je da imas uz tekstualni editor i kompajler koji ce ti taj kod prevesti u strojni kod spreman za izvrsavanje na racunalu.

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

Bok! Imam jedno pitanje za vas. Može li se pisati C++ program u Notepad? Molim odgovor!!{#}

Da se nadovežem na domagoja. Programski kod je običan tekst. IDE-i samo bojaju sintaksu kako bi ti taj tekst bio pregledniji. U konačnici kad se .cpp datoteka spremi nema nikakve razlike između npr. notepada i Visual Studia (u to se možeš i sam uvjeriti, otvori u notepadu .cpp datoteke spremljene u Visual Studiu i vidi ima li nešto posebno vezano uz njih).

 

No zato ne možeš pisati C++ programe u Wordu, jer .doc, .docx, i .rtf datoteke nisu čisti tekst, nego sadrže kontrolne kodove i/ili dodatne tagove za atribute teksta. Odnosno, da budem precizniji, ti možeš nakucati programski kod bez problema u wordu, ali kompajler neće razumjeti datoteku koju je word proizveo, kompajler razumije samo čisti tekst, bez kodova za formatiranje teksta.

A C program is like a fast dance on a newly waxed dance floor by people carrying razors.
13 godina
neaktivan
offline
Re: Programiranje u c++-u- pitanja i odgovori

Pozdrav...imam pitanje.

U ovom primjeru koda:

cout<<"Unesite prvu stranicu"<<endl;

vrijeme_pocetak();

cin>>tstr1;

cout<<"Unesite drugu stranicu"<<endl;

cin>>tstr2;

cout<<"Unesite trecu stranicu"<<endl;

cin>>tstr3;

if(tstr1>tstr2)

{

if(tstr1>tstr3)

{

najveca=tstr1;

manja1=tstr2;

manja2=tstr3;

}

else

{

najveca=tstr3;

manja1=tstr1;

manja2=tstr2;

}

}

else

{

if(tstr2>tstr3)

{

najveca=tstr2;

manja1=tstr1;

manja2=tstr2;

}

else

{

najveca=tstr3;

manja1=tstr1;

manja2=tstr2;

}

}

if((najveca>=(manja1+manja2))||((tstr1<=0)||(tstr2<=0)||(tstr3<=0)))

{

cout<<"unijeli ste krive podatke"<<endl;

break;

}

rezultattrokuta=povrsina(tstr1,tstr2,tstr3);

int vrijeme=vrijeme_proteklo();

cout << "Trebalo vam je " << vrijeme << " tisucinki sekunde!" << endl;

cout <<"rezultat je "<< rezultattrokuta <<endl;

break;

 

Iz nekog razloga,varijabla vrijeme postane negativna.Ne mislim da se radi o overflowu,nego ona bi npr. trebala biti 400 a ona postane -400.

 

Šta se tu događa,kako to popraviti?

Vječni izazivač na gostujućem terenu.Moj blog:http://thebluedrag.blogspot.com/ Svi smo mi jedna velika obitelj sa prezimenom Čovječanstvo
E-mail:
Lozinka:
 
vrh stranice