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

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

Znao sam da je nešto prejednostavno, mislim da sam čak promjenio za najveci u long long al očito treba i za i... Hvala :D

http://myanimelist.net/profile/TheRunner
16 godina
neaktivan
offline
Re: Programiranje u C++-u - pitanja i odgovori
TheRunner kaže...

Znao sam da je nešto prejednostavno, mislim da sam čak promjenio za najveci u long long al očito treba i za i... Hvala :D

 Ne možeš to tako raditi, vrtiš cijeli interval što je nepotrebno i kod velikih brojeva presporo.

Ako u intervalu do kvadratnog korjena broja taj broj nema prim faktora, on je prim, a ako imaš prim faktore u tom intervalu, veći faktor izvan intervala izračunaš pomoću manjeg faktora iz intervala.

Ovdje je interval do kvadratnog korjena broja i sam velik, ali ipak dovoljno brzo se prijeđe i u najduljem slučaju kad je broj prim, što nije slučaj kod zadanog broja.

Poruka je uređivana zadnji put sri 25.3.2015 17:52 (Floki).
11 godina
offline
Re: Programiranje u C++-u - pitanja i odgovori

Nije samo to, vec i kad nadjes neki faktor, mozes podijelit s njima i srezat originalni broj. Njegov algoritam je kriminalno neefikasan, skoro doslovno, ja bih davao 3-6mj uvjetne kazne, cisto radi primjera :)

Taj program prakticki nece zavrsit. Nakon minute na 3.4GHz procesoru nije jos dosao ni do 300,000, a ima duplu petlju, dakle kvadratna ovisnost. Malo sam bacio grubu racunicu i kod mene bi trebalo oko 7.6 milijuna godina da program zavrsi. To svakako nije bilo ciljano rjesenje na tom Euler projekt zadatku.

 

Npr. ovo zavrsi u manje od sekunde:

long long broj = 600851475143;
long long najveci = broj;
long long faktor = 3;
long long korijenBroja = long long(sqrt(double(broj)));

while (broj>1 || faktor>korijenBroja)
{
    if (broj % faktor == 0)
    {
        najveci = faktor;
        while (broj % faktor == 0)
            broj /= faktor;
    }
    ++faktor;
}

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

Ja sam ovako napisao, i kad je prim sa 12 znamenki izbaci rezultat u trenu.

 

#include<iostream>

using namespace std;


int main() {
   long long broj = 600851475143, prim = 2;
   while (broj > 1 && prim * prim <= 600851475143)
   {
      if (broj % prim == 0)
         broj /= prim;
      else
         prim++;
   }
   if (broj > 1)
      cout << broj;
   else
      cout << prim;
   return 0;
}

Poruka je uređivana zadnji put sri 25.3.2015 20:25 (Floki).
 
1 0 hvala 0
15 godina
offline
Programiranje u C++-u - pitanja i odgovori

Pozdrav, imam jedno pitanje, ako mi netko može objasniti ovaj dio koda s markerom

nije mi jasno što bi trebalo biti ovo char *dolijepi, znam da se radi o funkciji, al ne kužim, čemu taj * ispred dolijepi

#include <iostream>
using namespace std;

char *dolijepi(const char *prvi, const char *drugi, char *spojeni) {
   spojeni = new char[80];         // lokalno polje znakova
   char *indeks = spojeni;
   while (*prvi)
      *(indeks++) = *(prvi++);
   while (*drugi)
      *(indeks++) = *(drugi++);
   *indeks = '\0';
   return spojeni;            // pogreška: pokazivač
                        // na lokalni objekt
}

int main() {
   char *pocetak = "Dobar ";
   char *kraj = "dan";
   char *zajedno = dolijepi(pocetak, kraj, spojeni);
   cout << zajedno << endl;

   char z;
   cin >> z;
   return 0;
}

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

Pozdrav, imam jedno pitanje, ako mi netko može objasniti ovaj dio koda s markerom

nije mi jasno što bi trebalo biti ovo char *dolijepi, znam da se radi o funkciji, al ne kužim, čemu taj * ispred dolijepi

#include <iostream>
using namespace std;

char *dolijepi(const char *prvi, const char *drugi, char *spojeni) {
   spojeni = new char[80];         // lokalno polje znakova
   char *indeks = spojeni;
   while (*prvi)
      *(indeks++) = *(prvi++);
   while (*drugi)
      *(indeks++) = *(drugi++);
   *indeks = '\0';
   return spojeni;            // pogreška: pokazivač
                        // na lokalni objekt
}

int main() {
   char *pocetak = "Dobar ";
   char *kraj = "dan";
   char *zajedno = dolijepi(pocetak, kraj, spojeni);
   cout << zajedno << endl;

   char z;
   cin >> z;
   return 0;
}

 Funkcija vraća char pokazivač na char niz, dakle, treći argument u funkciji je suvišan.

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

Kužim to nego jel onaj * ispred dolijepi služi samo kao pokazivač funkciji

da vraća taj string u main. Taj primjer ionako ne vrijedi jer se taj spojeni

uništi jer se radi o lokalnoj varijabli.

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

Kužim to nego jel onaj * ispred dolijepi služi samo kao pokazivač funkciji

da vraća taj string u main. Taj primjer ionako ne vrijedi jer se taj spojeni

uništi jer se radi o lokalnoj varijabli.

 Ne uništi se dok ga ti ne uništiš sa delete jer je dinamički alociran, od tud imaš zajedno, i on pokazuje na njega kad se funkcija izvrši.

Poruka je uređivana zadnji put sri 25.3.2015 21:18 (Floki).
15 godina
offline
Programiranje u C++-u - pitanja i odgovori

znači nebitno što se radi o funkciji i kao lokalnom objektu svaki put trebam stavit delete

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

znači nebitno što se radi o funkciji i kao lokalnom objektu svaki put trebam stavit delete

 Dealociraš niz koji si dinamički alocirao, nebitno kojim pokazivačem, bitno je da pokazuje na taj niz i da ga u funkciji možeš dohvatiti, bit funkcije i jest da ti vraća pokazivač na taj niz u funkciji iz koje ovu funkciju pozivaš.

Poruka je uređivana zadnji put sri 25.3.2015 21:39 (Floki).
15 godina
offline
Programiranje u C++-u - pitanja i odgovori

Koja je razilka izmedu ovoga i onoga gore, jos samo to me zanima?

char dolijepi (const char *prvi, const char *, char * spojeni=0)

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

Nije samo to, vec i kad nadjes neki faktor, mozes podijelit s njima i srezat originalni broj. Njegov algoritam je kriminalno neefikasan, skoro doslovno, ja bih davao 3-6mj uvjetne kazne, cisto radi primjera :)

Taj program prakticki nece zavrsit. Nakon minute na 3.4GHz procesoru nije jos dosao ni do 300,000, a ima duplu petlju, dakle kvadratna ovisnost. Malo sam bacio grubu racunicu i kod mene bi trebalo oko 7.6 milijuna godina da program zavrsi. To svakako nije bilo ciljano rjesenje na tom Euler projekt zadatku.

 

Npr. ovo zavrsi u manje od sekunde:

long long broj = 600851475143;
long long najveci = broj;
long long faktor = 3;
long long korijenBroja = long long(sqrt(double(broj)));

while (broj>1 || faktor>korijenBroja)
{
    if (broj % faktor == 0)
    {
        najveci = faktor;
        while (broj % faktor == 0)
            broj /= faktor;
    }
    ++faktor;
}

 Ovo bi trebalo ispraviti, vrijedi samo za slučaj kad broj ima prim faktore manje od njegovog kvadratnog korijena, što kod ovog broja jest slučaj.

faktor <= korijenBroja

A u tom slučaju imamo puni interval ako je broj prim, a ako su svi primovi u granici kvadratnog korijena, nepotrebno vrti do kvadratnog korijena. 

Dakle, ako petlju ne zaustavi broj, neka je zaustavi kvadratni korijen, a ako petlju zaustavi kvadratni korijen, znamo da iza tog intervala imamo samo jedan prim faktor, nebitno, broj sam ako je prim ili neki prim faktor tog broja.

Poruka je uređivana zadnji put pet 27.3.2015 20:52 (Floki).
11 godina
offline
Re: Programiranje u C++-u - pitanja i odgovori
Floki kaže...

 Ovo bi trebalo ispraviti, vrijedi samo za slučaj kad broj ima prim faktore manje od njegovog kvadratnog korijena, što kod ovog broja jest slučaj.

faktor <= korijenBroja

 Imas pravo. Uvjet bi trebao biti "broj>1 &&faktor<=korijenBroja". Kad sam testirao, nisam uopce imao taj uvjet nego sam ga bez provjere dodao kad sam pisao post... Ostatak je ista ideja kao i tvoj kod.

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

 Ovo bi trebalo ispraviti, vrijedi samo za slučaj kad broj ima prim faktore manje od njegovog kvadratnog korijena, što kod ovog broja jest slučaj.

faktor <= korijenBroja

 Imas pravo. Uvjet bi trebao biti "broj>1 &&faktor<=korijenBroja". Kad sam testirao, nisam uopce imao taj uvjet nego sam ga bez provjere dodao kad sam pisao post... Ostatak je ista ideja kao i tvoj kod.

 Bio sam našao jedan broj sa 12 znamenki koji je prim pomoću onih online kalkulatora, brzo je program izbacio taj broj kao faktor, čak i ako traže vremensko ograničenje, prolazi vjerojatno.

Valjda ne traže ništa više od ovoga na tom projektu, uzastopno dijeljenje sa faktorom, što si dobro naglasio, a ja zaboravio naglasiti i interval do kvadratnog korijena, kojeg uvodimo radi veličine broja.

Poruka je uređivana zadnji put pet 27.3.2015 19:14 (Floki).
11 godina
neaktivan
offline
Programiranje u C++-u - pitanja i odgovori

Pozz

 

Trebam pomoć u vezi završnog rada. Imam temu Mjerenje jačine zaporke - izrada programa u C/C++

Dakle radi se o Brute force programu koji ja treba napraviti. Ja znam što je Brute force i kako radi, ali ne znam

napisati program u C++. Googlao sam i našao nekoliko programa koji rade ono što meni treba, ali problem je u tome

što ih ja ne razumijem. Treba mi netko tko je to vec radio ili ima iskustva sa tim da mi objasni program.

Također bi bili korisni i izvori o Brute forcu.

 

Evo programa: 

 

http://textuploader.com/xldj


Ako netko ima jednostavniji program ili zna pojednostaviti ovaj bio bi mu zahvalan na pomoći.

Poruka je uređivana zadnji put pon 30.3.2015 10:41 (Darth Vader96).
 
0 0 hvala 0
10 godina
neaktivan
offline
Re: Programiranje u C++-u - pitanja i odgovori
Darth Vader96 kaže...

Pozz

 

Trebam pomoć u vezi završnog rada. Imam temu Mjerenje jačine zaporke - izrada programa u C/C++

Dakle radi se o Brute force programu koji ja treba napraviti. Ja znam što je Brute force i kako radi, ali ne znam

napisati program u C++. Googlao sam i našao nekoliko programa koji rade ono što meni treba, ali problem je u tome

što ih ja ne razumijem. Treba mi netko tko je to vec radio ili ima iskustva sa tim da mi objasni program.

Također bi bili korisni i izvori o Brute forcu.

 

Evo programa: 

 

http://textuploader.com/xldj


Ako netko ima jednostavniji program ili zna pojednostaviti ovaj bio bi mu zahvalan na pomoći.

Ako imas temu Mjerenje jačine zaporke onda ti ne treba brute force program, jer kao sto vidis u brute force-u postoje neka pravila, npr prvo krece sa samo malim slovima pa onda ukljucuje i velka pa brojeve itd... Sto znaci da tvoj program moze po tome principu mjeriti jacinu lozinke da gleda dali se sastoji od samo malih ili i velikih slova... 

 

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

Možda ste me krivo shvatili, ja moram napraviti brute force program i onda isprobavati određene lozinke i raditi 

izračune koliko treba za koji znak da se probije.

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

Pozz

 

Trebam pomoć u vezi završnog rada. Imam temu Mjerenje jačine zaporke - izrada programa u C/C++

Dakle radi se o Brute force programu koji ja treba napraviti. Ja znam što je Brute force i kako radi, ali ne znam

napisati program u C++. Googlao sam i našao nekoliko programa koji rade ono što meni treba, ali problem je u tome

što ih ja ne razumijem. Treba mi netko tko je to vec radio ili ima iskustva sa tim da mi objasni program.

Također bi bili korisni i izvori o Brute forcu.

 

Evo programa: 

 

http://textuploader.com/xldj


Ako netko ima jednostavniji program ili zna pojednostaviti ovaj bio bi mu zahvalan na pomoći.

 Brute force nije poseban algoritam nego opis algoritma koji iskušavanjem svih mogućih kombinacija dolazi do rješenja.

U ovom slučaju brute force nije nešto što bi rado napisao jer to znači uz testiranje sigurnosti šifre i razbijanje šifre, a to su već hackerska posla, tako da se čudim

postavljenom zadatku.

 

Poruka je uređivana zadnji put čet 2.4.2015 15:12 (Floki).
16 godina
neaktivan
offline
Re: Programiranje u C++-u - pitanja i odgovori
Floki kaže...

Brute force nije poseban algoritam nego opis algoritma koji iskušavanjem svih mogućih kombinacija dolazi do rješenja.

U ovom slučaju brute force nije nešto što bi rado napisao jer to znači uz testiranje sigurnosti šifre i razbijanje šifre, a to su već hackerska posla, tako da se čudim postavljenom zadatku.

...

Pentest.

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

Dali netko zna gdje mogu pronaći izvore na hrvatskom u Brute force-u i sigurnosti lozinki ?

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

Napisati C program koji u polje naziva brojevi sprema reference na M brojevnih nizova. Vrijednost M, te brojevni nizovi učitavajuse putem tipkovnice. Brojevni nizovi su varijabilne duljine i sadrže cjelobrojne vrijednosti. Prije unosa svakog niza korisnika se pita koliko će taj niz biti dugačak. Dinamički alocirati samo onoliko memorije koliko je potrebno za spremanje podataka.
Nakon učitavanja ispisati prvi niz i njegovu sumu korištenjem zapisa iz polja brojevi.

 

Može mala pomoć, kako da dohvatim vrijednosti 1. niza? Hvala.

 

int main()
{
int i, j, m, n, sumapniza=0;
int brojevi[]={0};
int *Ptbrojevi, *Ptniz;

do{
printf("Unesite broj referenci M brojevnih nizova u polju brojevi: ");
scanf_s("%d,", &m);
}while(m<=0);

Ptbrojevi=&brojevi[0];

for(i=0;i<m;i++)
{
printf("Unesite broj elemenata %d. niza: ", i+1);
scanf("%d", &n);
Ptniz=(int*) malloc(n*sizeof(int));
for(j=0;j<n;j++)
{
printf("Unesite %d. element %d. niza: ", j+1, i+1);
scanf("%d", Ptniz+j);
}
Ptbrojevi=Ptniz;
Ptbrojevi++;
}


free(Ptniz);
return 0;
}


EDIT: Riješeno!

Poruka je uređivana zadnji put sri 1.4.2015 11:30 (tonyx1209).
16 godina
neaktivan
offline
Re: Programiranje u C++-u - pitanja i odgovori
1domagoj1 kaže...
Floki kaže...

Brute force nije poseban algoritam nego opis algoritma koji iskušavanjem svih mogućih kombinacija dolazi do rješenja.

U ovom slučaju brute force nije nešto što bi rado napisao jer to znači uz testiranje sigurnosti šifre i razbijanje šifre, a to su već hackerska posla, tako da se čudim postavljenom zadatku.

...

Pentest.

 Još nisam vidio da je neki programer iz tog poduzeća na forumima pisao kod za te webcam keepere, koliko bi takav publike okupio, netko iz profesionalne znatiželje, a netko bome tko zna iz kakvih motiva 

 

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

Ima nekog da se malo bolje razumije u Qt? Lp

LoL(EUW): CRORenato NFSW: Remzi1996 WoT: I_play_alone
Moj PC  
0 0 hvala 0
16 godina
neaktivan
offline
Re: Programiranje u C++-u - pitanja i odgovori
Floki kaže...

Još nisam vidio da je neki programer iz tog poduzeća na forumima pisao kod za te webcam keepere, koliko bi takav publike okupio, netko iz profesionalne znatiželje, a netko bome tko zna iz kakvih motiva 

 

Ma znam sve, ali velim cini mi se da je rekao da mu to treba za zavrsni rad, pa vjerojatno je onda profesor imao na umu nesto kao pentest ili sl. ;)

Remzi kaže...

Ima nekog da se malo bolje razumije u Qt? Lp

Sto te muci?

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

Evo trebala bi mi mala pomoć oko  izmjene zadatka. Naime umjesto upisivanja niza brojeva, potrebno je da se ucitaju random brojevi i poredaju po vrijednosti.

To sam mislio napraviti pomocu rand() u for petlji i time(NULL), da se ne ponavljaju isti brojevi kod pokretanja, ali ne znam ucitati te random brojeve u memoriju!

Unaprijed hvala!!

#include <iostream>

using namespace std;

const int MAX=100;

void main()

{ int niz[MAX];

     int i,j,n, rb, pom;

   do

       {   cout<<"n=";

           cin>>n;}

   while ((n<1) || (n>100));

// unos niza brojeva

for ( i=1; i<=n; i++ )

       { cout<<"Unesite broj:";

             cin>>niz[i-1]; }

// algoritam sortiranja

for ( i=0; i<n-1; i++ )

{

   for ( j=i+1, rb=i; j<n; j++ )

       if (niz[j] < niz[rb]) rb=j;

         if (rb!=i)

         { pom=niz[i];

     niz[i]=niz[rb]; niz[rb]=pom; }

}  

// ispis sortiranog niza

cout<<endl<<"Sortirani niz:";

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

             cout<<niz[i]<<"\t";

   cout<<endl;

system("pause");

}

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

ja bi ispred stavia srand i postavia neku varijablu tipa r

int r =srand(), tako nešto

pa onda u petlji gdje upisuješ stavio n[i]=r;

Poruka je uređivana zadnji put ned 5.4.2015 13:54 (Makić).
Moj PC  
0 0 hvala 1
15 godina
offline
Programiranje u C++-u - pitanja i odgovori

Evo uspio, nije bio toliki problem :)

Ako nekom bude trebalo slucajno...

#include <iostream>
#include<iomanip>
#include<cstdlib>
using namespace std;
const int MAX=100;

void main()
{  
   srand(time(NULL));
   int niz[MAX];
      int i,j,n, rb, pom;
   do
       {   cout<<"Upisite koliko zelite brojeva ucitati!"<<endl;
         cout<<"n=";
            cin>>n;}
   while ((n<1) || (n>100));
// unos niza brojeva
 for ( i=1; i<=n; i++ )
       {  
         niz[i-1]=(float)rand()/RAND_MAX*100+1;
      }
 // algoritam sortiranja
 for ( i=0; i<n-1; i++ )
 {  
    for ( j=i+1, rb=i; j<n; j++ )
       if (niz[j] < niz[rb]) rb=j;
          if (rb!=i)
         { pom=niz[i];  
     niz[i]=niz[rb]; niz[rb]=pom; }
}  
// ispis sortiranog niza
cout<<endl<<"Sortirani niz : ";
   for ( i=0; i<n; i++ )  
             cout<<niz[i]<<" < ";
   cout<<endl;
   system("pause");
}

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

Jel moguće i kako deklarirat polje stringova? Primjerice za upis više imena...

...The South Will Rise Again... White -h- boys
Moj PC  
0 0 hvala 0
12 godina
offline
Re: Programiranje u C++-u - pitanja i odgovori
Coder256 kaže...

Jel moguće i kako deklarirat polje stringova? Primjerice za upis više imena...

C-string:

 

char arrStrings[10][50] // 10 stringova duljine 50 charova, statička alokacija
// dinamička alokacija uspomoć malloc-a, dimenzije mogu biti određene u run timeu
char **arrStrings = (char*)malloc(10 * sizeof(char*)); // obavezan cast u C++-u, malloc vraća void*
for(int i = 0; i < 10; ++i)
    arrStrings[i] = (char)malloc(50 * sizeof(char));
// dinamička alokacija uspomoć operatora new
char **arrStrings = new char*[10];
for(int i = 0; i < 10; ++i)
    arrStrings[i] = new char[50];

 

Uporabom STL-a (postoji još containera, naravno):

 

std::array<std::string, 10> arrStrings; // veličina poznata u compile timeu (u primjeru 10)
std::vector<std::string> vecStrings; // proizvoljna veličina

 

Ima još raznih kombinacija navedenih pristupa.

0100011001000001010100000010000000110100001000000100110001001001010001100100010100100001
Poruka je uređivana zadnji put ned 5.4.2015 22:36 (pr0n_addict).
12 godina
neaktivan
offline
Re: Programiranje u C++-u - pitanja i odgovori
Coder256 kaže...

Jel moguće i kako deklarirat polje stringova? Primjerice za upis više imena...

 

string ime[10]; // 10 imena

 

ili još bolje pomoću vektora jer se onda ne moraš brinuti o dinamičkoj alokaciji memorije

 

vector<string> ime;

 

pomoću metode push_back dodaješ jedan po jedan string i za njega se mjesto u vektoru automatski alocira.

 

E-mail:
Lozinka:
 
vrh stranice