Programiranje

Programiranje u C++-u - pitanja i odgovori

Nikolacurak uto 12.3.2019 21:15

Dan, u školi smo učili funkcije i nakon 2. sata obrađivanja funkcija profesor nam je pokazao 2 vrste sintakse za funckiju, te postavio domaci da otkrijemo kad koju treba koristiti i koje prednosti ima,istrazivao sam po googleu i youtube ali ne uspjesno... Moze pomoc?

Nikolacurak čet 14.3.2019 13:58

Moguce da je to... 1 vrsta je bila kad se pozove funkcija pa ide int main pa definicija funkcije a 2 vrsta odmah definicija funkcije pa int main pa unutar njega poziv funkcije. Koja je razlika ova 2 nacina i kad se koristi jedan a kad drugi

CyberK čet 14.3.2019 16:26

"Forward deklaracija", mozes googlat za vise. Moras ili potpuno definirat funkciju prije koristenja u source fileu ili barem deklarirat prototype a definirat tijelo kasnije.

Nuzna je ako imas "vezane rekurzivne" funkcije tipa A zove B i B zove A. Osim toga je vise stvar preferenci. Prednost fwd deklaracije je da ne moras brinut oko poretka funkcija.

Graco12 pon 1.4.2019 21:43

Pozdrav!

 

Trebao bih pomoć oko ovog zadatka: Ulaz: prirodan broj N, Izlaz: Zbroj svih neparnih potencija broja 2 kojima su eksponenti od 0 do N. Pritom se nesmije koristiti cmath biblioteka.

Ja sam to ovako zamislio, ali program mi iz nekog razloga ne izbacuje rezultat:

 

#include <iostream>
using namespace std;

int main()
{
    int N;
   int a = 2;
   int b = 0;
   
   cout << "Broj N: ";
   cin >> N;
   
   while(N < 0 && N > 32)
   {
      cout << "Neispravan unos! Unesite prirodan broj: ";
      cin >> N;
   }
   
   while(N > 0 && N < 32)
   {
      for(int i = 1; i <= N; i++)
      {
         a = a * a;
         
         if((i%2) != 0)
         {
            b += a;
         }
      }   
   }
   
   cout << "Zbroj je = " << b << endl;
   
   system("pause");
   return 0;
}

wAlpha pon 1.4.2019 22:16

while(N > 0 && N < 32)

 

Jer imaš beskonačnu petlju, ovaj uvjet je uvijek istinit. Ovako nabrzinu, nešto u ovom stilu:

 

int sum = 0;

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

   int a = 1;

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

     a *= a;

   if(a%2 != 0)

     sum += a;

}

Mr.ddevil pon 1.4.2019 22:23

#include <iostream>
using namespace std;

int power(int x,int y){
  int result = 1;
  for (int i=0; i<y; i++){
    result *= x;
  }
  return result;
}


int main()
{
  int N;
  int a = 2;
  int suma = 0;

  cout << "Broj N: ";
  cin >> N;

  while(N < 0){
    cout << "Neispravan unos! Unesite prirodan broj: ";
    cin >> N;
  }
  while(N > 32){
    cout << "Neispravan unos! Unesite broj manji od 32: ";
    cin >> N;
  }

  for (int i=1;i<=N;i++){
    if(i%2 == 0){
     continue;
    }
    suma += power(a, i);
  }

  cout << "Zbroj je = " << suma << endl;

  return 0;

}

 

EDIT: Ovo sam napisao u hodu, mislim da si na ovo ciljao, kada ti ne daju da koristiš pow() iz math.h, napiši fino svoju funkciju ;)

Graco12 pon 1.4.2019 22:44

@wAlpha Da, probao sam sad na taj način, ali mi ne izbacuje točan rezultat (kada je N = 6, na izlazu bi trebao biti 42). Osim ako nisam negdje napravio grešku:

#include <iostream>
using namespace std;


int main()
{
    int N;
   int a = 1;
   int b = 0;
   
   cout << "Broj N: ";
   cin >> N;
   
   while(N < 0 && N > 32)
   {
      cout << "Neispravan unos! Unesite prirodan broj: ";
      cin >> N;
   }
   
   for(int j = 0; j <= N; j++)
   {
      for(int i = 1; i <= j; i++)
      {
         a = a * a;
         
         if((a%2) != 0)
         {
            b += a;
         }
      }   
   }
   
   cout << "Zbroj je = " << b << endl;
   
   system("pause");
   return 0;
}

 

 

@Mr.ddevil Rado bih ja to tako, ali na faksu idemo postupno s gradivom naprijed i nažalost smijemo koristiti u kodu samo ono što smo dosad radili (do while petlja zadnje), tako da nemam ni tu mogućnost da napišem svoju funkciju (barem za sada). :)

Mr.ddevil pon 1.4.2019 23:05

Ako za N=6 rezultat mora biti 42, onda ti moje rješenje paše, ali nije mi jasno što provjeravaš ovim uvjetom:

 

"while(N < 0 && N > 32)"

 

Ovo ti znači N manji od nula i n veći od 32, vraća true samo ako su oba uvjeta ispunjena 

Graco12 pon 1.4.2019 23:40

Btw Evo uspio sam doći do rješenja koje mi odgovara:

 

#include <iostream>
using namespace std;

int main()
{
   int N;
   int a = 1;
   int b = 2;
   int c = 0;
   
   cout << "Broj N: ";
   cin >> N;
   
   while(N < 0 || N > 32)
   {
      cout << "Neispravan unos! Unesite prirodan broj: ";
      cin >> N;
   }
   
   for(int i = 1; i <= N; i++)
   {
      a = a * b;
      if((i%2!=0))
      {
         c += a;
      }
   }
   
   cout << "Zbroj je = " << c << endl;
   
   system("pause");
   return 0;
}

Dex.pwn čet 11.4.2019 23:19

Pozdrav,

Jel mi možete pomoći oko izrade funkcije koja bi radila sljedeće:

- Funkcija bi trebala usporediti prošlu vrijednost(prije nego što se vrijednost spremila) sa sadašnjom(iz RAMa). U toj usporedbi se treba vidjeti koji su bajtovi promjenjeni.

 

andrijam pet 12.4.2019 08:58

Kako misliš iz RAM-a? U programiranju postoji samo stack i heap. Misliš iz heapa? Preko pointera? Programiraš na windowsima? Možeš koristiti globalnu varijablu ili static varijablu za spremanje stare varijable i XOR operaciju za provjeru promjene bitova/baytova.  AND koristiš za provjeru svakog pojedinačnog bita.

Dex.pwn pet 12.4.2019 10:04

U pitanju je Arduino. Dakle u EEPROM spremam bajtove(osam bita). Ako želim 32 bitnu varijablu spremit u EEPROM moram ju odvojiti na 4 bajta. Znači moram četiri puta spremiti kako bi vrijednost u EEPROMu bila ispravna. A sad želim napravit funkciju koja bi usporedila prošlu vrijednost (prije spremanja) i sadašnju te spremiti samo bajtove koji su promijenjeni.
Npr ako je vrijednost prije spremanja bila 10, a sada je 200, trebao bi spremiti samo zadnji bajt (4. bajt ako se gleda s lijeva na desno).
Predpostavljam da do 255 se mijenja samo zadnji bajt, od 255 do 65535 se mijenja sami zadnja dva

ihush pet 12.4.2019 11:07

-loša ideja, pogrešna.. ne možeš tako uštedjeti vrijeme-cikluse, naprotiv, .. imao bi dio koda koji konstantno usproava rad besmislenim traženjem izuzetka da bi uštedio koji byte u takvom izuzetku.. a podatak moraš učitati da bi mogao usporediti.. ne isplati se, čak ni s eepromom.

Dex.pwn pet 12.4.2019 15:47

Svakih 10-15 sekundi treba zapisati cca 10 varijabli (5 32b 5 64b varijable).
Svako zapisivanje bajta uzme cca 5ms(zbog eeproma) koje mi zamrzne MCU. To zapisivanje ću prebaciti na pagewrite no želim dodatno ubrzati pojedinačno zapisivanje kako bi čuvao eeprom

ihush pet 12.4.2019 15:56

pogrešan pristup.. sve pripremiš pa onda zapišeš (može i backup prije..), koristit kao sekvencijalne memorije, ne kao ram.. jer je to eeprom (sporo). Zato se u nromalnom radu i ne koriste romovi nego se kopiraju u ram itd..

tj KISS kaže, što manje čačkanja eeproma, ako je moguće skoro nikad.. za pristup-korištenje koristiti bilo što drugo, sd/flash/ssd... ili ram ako ga ima dovoljno, jer eeprom nije ram.