» »

Problemi pri C++ programiranju...

Problemi pri C++ programiranju...

Poletnik ::

Zacel sem studirat racunalnistvo a prej sm hodil na gimnazijo, tak da mam zdej male probleme z c++.
A mi lahka kdo pomaga kok naj napisem program ki mi bo nasel in izpisal iz poljubnega naravnega stevila vse delitelje. In pa program ki mi bo poljubno stevilo razstavil na prafaktorje. Hvala za pomoc... oz prosim za pomoc.

jeti51 ::

Namig: naštudiraj matematični postopek, kako ugotoviš, ali je neko število delitelj drugega števila.
Namig 2: ugotovi, kako bi z rešitvijo iz zgornje točke ugotovil vse delitelje nekega števila.
Namig 3: Ne zgovarjaj se, da si hodil na gimnazijo in poskusi narediti čimveč sam. Če že pri takih enostavnih primerih sprašuješ, kaj bo šele potem.
Namig 4: Pri programiranju gre za to, da si izmisliš en postopek, kako priti do rezultata. Rešuj manjše podprobleme in jih potem uporabi pri rešitvi celotnega problema. Ko imaš enkrat postopek zamišljen, kode ni tako zelo napisati. Če se ti pa tam zatakne (pri pretvarjanju algoritma v kodo), ti bomo pa že pomagali. :) Ampak algoritma (postopka) se boš moral domisliti sam, ni težko, verjemi.
Namig 5: ko boš rešil prvi problem, se loti drugega, ti bo verjetno lažje.

Zgodovina sprememb…

  • spremenil: jeti51 ()

NoUse4AName ::

kam si hodil nima nobene veze, programiranja te ne more noben naucit, to se moras sam. Lahko te naucijo samo sintakse, kateri ukazi so in kako se uporabljajo.

freserovski ::

izračun in izpis vsoto vrste S = 1/1! + 1/2! + 1/3! + 1/4! + 1/5! + ... za n členov (n vpiše uporabnik)
to pomeni izračun vsote vrste 1/n!, kar pomeni fakulteta od števila n

#include
void main (){
int x;
double suma;
cout<< "vpisite n";
cin>>x;
while (x==1){
x--;
suma+=1/(x);
}
cout<< suma ;
}

Tako sem jaz to naredil, zaj pa ne vem, kako bi vključil tole formulo not An=(An-1)/n, tako, da če ma kdo kaj več znanja, kot jaz.... se priporočam;)
Problemi so, problemi bodo! Kurc jih gleda!!

Zgodovina sprememb…

Paramedic ::

No, pol bom pa js namesto poletnika vprašu bolj podrobno:
kako naredit tisti if stavek, ki izloči števila, ki niso praštevila.
recimo (zdej bom kr po pascalovsko):

for x:=sp to zg do
begin
b:=true;
for y:=1 to x do
begin
(* if (p[x]div y > 1) and (p[x] div y < x)
then b:=false;
*) end;
if b
then vs:=p[x]+vs
end;
problem je med (* in *)
p[x] so števila, ki jih preverjamo ali so pra- .
y je delitelj, da ugotovimo koliko je rezultat deljenja.
(js se tut mal s tem ukvarjam, ampak v javi :D)
End transmission.

jeti51 ::

Zapomni si zadnji člen, prištet k vsoti.
Naslednji člen dobiš tako, da ga pomnožiš z 1/n.
To prišteješ vsoti.
Povečaš n, greš na začetek zanke.
Iz zanke pa greš, ko si prištel n-ti člen.

Se pravi, na začetku maš n=1,clen=1, vsota=0. Pristejes to k vsoti.
Povecas n za 1.
V novi iteraciji izracunas clen *= 1/n, se pravi, clen postane 1/2.
Pristejes to k vsoti.
Povecas n za 1 (n je sedaj 3).
Naslednji clen je spet clen *= 1/n, se pravi 1/2 * 1/3 = 1/6 (=1/3!)
In to pristejes k vsoti...
povecas n...
...
...
...
Na zacetku nekega obhoda ugotovis, da je n vecji kot vpisano stevilo, prenehas s postopkom, saj si ze pristel n clenov.

Na dolgo sem napisal tako, da bos lazje razumel algoritem. Zdaj pa napiši kodo. ;)

jeti51 ::

Za praštevila: praštevilo ima za delitelja le sebe in 1. Vsa druga števila so deljiva z nekim številom. Se pravi, da imaš število n. Najti moraš neko število, ki ga deli. Če ga ne najdeš, je n praštevilo. Pač pogledaš vsa števila od 2 do sqrt(n) in če nobeno izmed njih ne deli števila n (n%stevilo != 0 za vsak "stevilo"), potem je stevilo n prastevilo. To je še najbolj enostaven postopek.

Zgodovina sprememb…

  • spremenil: jeti51 ()

ACenterMedia ::

Eh jst tud hodim v gim (2. letnik), pa lahk probate to Super poštar (3D) - 1. predstavitev
Drugače pa polejte na: www.acentermedia.gajba.net

Sem naredil enih par igerc v C++ :D
www.ACenterMedia.tk

Paramedic ::

Mal sm spremenu, ampak neki še manjka:

for y:=2 to trunc(sqrt(x)) do
begin
if (p[x]mod y = 0) //če je naše št. deljivo z y
then b:=false; //potem to ni praštevilo (yeah,right!)
end;
if b
then vs:=p[x]+vs

Torej, z if stavkom mam probleme, kakorkoli premislim, se mi ne izide :(.
b:=false pomeni, da p[x] ni praštevilo. Hvala.
End transmission.

rasta ::

@Paramedic:
Če prav razumem tvojo kodo, imaš en array p števil in vsa, ki so praštevila, sešteješ (spremenljivka vs).
Zakaj potem koreniš indeks x in ne p[x]?
Pa trunc(sqrt(x)) računaš v vsakem loopu zanke? Slišal za optimizacijo?

@Cobra
izračun in izpis vsoto vrste S = 1/1! + 1/2! + 1/3! + 1/4! + 1/5! + ... za n členov (n vpiše uporabnik)
to pomeni izračun vsote vrste 1/n!, kar pomeni fakulteta od števila n

function fakulteta(n){
if (n>1) {
return fakulteta(n-1)*n;
} else return n;
}

/* ... */
for(i=n,i<=1,i--){
suma += 1/fakulteta(n);
}



> Tako sem jaz to naredil, zaj pa ne vem, kako bi vključil tole formulo not An=(An-1)/n, tako, da če ma kdo kaj več znanja, kot jaz.... se
priporočam

S to formulo verjetno misliš an+1=(an-1)/n, ker drugače dobiš, da je an=1/(1-n).
Uporabiš čisto preprosto rekruzijo (primer funkcije fakulteta zgoraj).

Zgodovina sprememb…

  • spremenil: rasta ()

Poletnik ::

No nazaj k mojmu problemu. Sej algoritem ze skapiram: pri deljenju mora bit ostanek 0, sam ne vem kok naj potem te delitelje izpisem, s katerim ukazom?

freserovski ::

rasta: a se bi dalo tisto, kar si ti napisal rešit brez stavka if? Ker jaz sem sprobaval rešit to nalogo, pa še vedno ne gre, običajno vsoto n števil znam izračunat, tega pa ne znam skupaj spravit:\
Problemi so, problemi bodo! Kurc jih gleda!!

Paramedic ::

No, js (zahvale gredo tudi Spucek-u ;)) sm napisu ta praštevila zdej tko, da sm štel koliko deliteljev ima posamezno število, pol pa dal: če je število deliteljev=2, potem je to število praštevilo in ga prišteje k vsoti.
Ni ravno vrh optimizacije, ampak za začetek (v javi) je dost :).
Kako je pa s tem: če dam izpis od ena do kamorkoli, pol se šteje 2 kot praštevilo (kar na nek način je ).
End transmission.

freserovski ::

hja, tebi je pa ratalo, meni še pa vedno ne, se vidi, da mi manjkajo osnove :'( , če še kdo lahko pomaga kako.....
Problemi so, problemi bodo! Kurc jih gleda!!

rasta ::

@Cobra: a se bi dalo tisto, kar si ti napisal rešit brez stavka if?
To misliš if stavek v funkciji? Ne, ker bi dobil neskončno rekruzijo in računalnik bi se verjetno obesil.
Lahko pa namesto rekruzije uporabiš iteracijo:
for(i=n,i<=1,i--){
int fakult = 1;
for(j=n,i<=1,i--) fakult *= j;
suma += 1/fakult;
}

NoUse4AName ::

joj no, daj idi si kupit neko knjigo o programiranju, ne pa da take stvari sprasujes. Mene bi blo sram

freserovski ::

ajaj :'( , se vedno mi ne dela
Jaz sem si to zamislil na nekako tak način, to je vsota vrste, to znam naredit, samo ne vem, kako bi namesto tistega x-a vključil not, da bi izračunal fakulteto

#include
void main (){
int x,stevec;
double vsota=0;
cout<< "vpisite x";
cin>>x;
for(stevec=1;stevec<=x;stevec++ )
vsota+=1/((double)stevec) ;
cout << "vsota je " << vsota ; }
Problemi so, problemi bodo! Kurc jih gleda!!

Zgodovina sprememb…

OwcA ::

Za a(n) = 1/n! bi bilo potrebno napisati nekaj v smislu:


#include < iostream >
using namespace std;

double factorial(unsigned int n);

int main()
{
cout << "Vpišite x:" << endl;
unsigned int x = 0;
cin >> x;
unsigned int n = 1;
double sum = 0;
while (n<=x)
{
sum += 1/factorial(n++);
}
cout << "Vsota je enaka " << sum << endl;
return 0;
}



funkcije factorial() nisem šel pisati, saj ti je rasta že napisal dve mogoči implementaciji. Sam priporočam tisto s for zanko, saj je optimalnejša (poleg tega se velja, če hočeš pisati "lepo" kodo, rekurzijam izogibat).

Zgodovina sprememb…

  • spremenilo: OwcA ()

freserovski ::

ja, to že, toda kako to funkcijo vključim v ta program, to mi dela probleme, ker ne vem kod in kam-kompas :))
Problemi so, problemi bodo! Kurc jih gleda!!

freserovski ::

a mi lahko kdo pomaga, če le zna, ker se z tem matram že celi teden8-O :'(
Problemi so, problemi bodo! Kurc jih gleda!!

OwcA ::

Tole dodaj v mojo kodo po koncu main(), nakar si sposodi ali kupi kako knjigo o osnovah programiranja in jo temelito preberi.

double factorial(unsigned int n)
{
double rv = 1;
for (unsigned int i = n; i > 1; i--)
{
rv *= i;
}
return rv;
}

rasta ::

Sploh ne razumem kaj te bega? Pol to, kar smo gor napisal dela ali ne dela?

freserovski ::

verjetno bi delalo, ja, če bi znal pravilno vključit funkcijo za izračun fakultete v program.
owca: sem tvoje probal, pa ne dela ravno, hja, knjiga za začetnike bo prišla prav.... a kdo ve za kako kvalitetno knjigo?

lp
Problemi so, problemi bodo! Kurc jih gleda!!

rasta ::

> verjetno bi delalo, ja, če bi znal pravilno vključit funkcijo za izračun fakultete v program.
Kodo iz zadnjega in predzadnjega posta Owce napišeš eno za drugo (uporabil je forward declaration), lahko pa deklaracijo funkcije factorial pred main() zamenjaš s samo implementacijo. To bi moglo delat, probal pa nisem (nobenega compailerja pri roki do vikenda).

Pa funkcija fractorial bi bila lahko unsigned int, ker so fakultete itak lahko samo naravna števila (pa ni bitn, ampak če se gremo optimizacijo ...).

freserovski ::

bol ste zakomplicirali kot je možno:\ Tak to pride čisto enostavno :

//program, ki sešteje vrsto vsote, v imenovalcu so fakultete
#include
void main (){
//deklaracija sprmenljivk
int i=1,x,c=1;
double vsota=0.0;
//vpisi stevilo clenov, ki jih zelis izracunat
cout<< "vpisite x";
cin>>x;
//while zanka, za izracun
while (i<=x) {
c=c*i ;
vsota+=1/((double)c) ;
i++;

}
cout << "vsota je:" << " " << vsota << endl;
}
Problemi so, problemi bodo! Kurc jih gleda!!

OwcA ::

rasta: factorial() je double za to, da deluje do 170!, če bi uporabil unsigned long bi delovalo le do 4294967295 (Intel C++ Compiler 6.0), za večje vrednosti bi prihajalo do overflow-a.

OwcA ::

Cobra: ko boš imel nekaj več izkušenj z programiranjem, boš spoznal, da je tvoja rešitev zakomplicirana, saj je precej bolj nepregledna. In ko smo že pri nepreglednosti, bolje je deklarirati in incializirati vsako spremenljivko posebaj (torej v svoji vrsti).

freserovski ::

helow, spet jaz :)

a ma doma mogoče kaki source file od tega, kako se kakšen lik nariše, bilokaki, ker mora nekaj naredit in še nikol nisem, sploh ne vem kje bi začel...., npr lik kot je ta, lahko je tudi samo kvadrat z zunanjimi stranicami in diagonalo, da vsaj vidim kako to gre

*
* *
* *
*********
* *
* *
* *
**********

hmm, še tu se ga ne da narisat, no, ga bom kar opisal, gre za pravokotnik z diagonalama in na vrhu tudi strehica, ali pa lahko je tudi bilokaki lik, samo, da vidim primer kako se to naredi, pa lahko omogoča tudi koliko znakov je v višino, kolko v dolžino, sem iskal na netu, pa nisem nič našel
Problemi so, problemi bodo! Kurc jih gleda!!

Zgodovina sprememb…

teac ::

Zdaj ne vem, kak lik je to natančno, ampak, če moreš narisat samo tega zgornjega, to sploh ni problem. Pač, za vsako vrstico uporabiš svojo for zanko (jaz sem naredil, da lahko liku spreminjaš velikost glede na prvo vrstico v liku (tam, kjer je zdaj samo ena zvezdica) in glede na to vrstico se spreminjajo potem vse vrstice.
Zdaj, če to ni to, povej, ker potem te nisem najboljše razumel.


#include < iostream.h >

void izrisi (int n)
{
for (int i=1; i <= n; i++)
cout << "*" ;
cout << endl;
for (i=1; i <= n+1; i++)
cout << "*";
cout << endl;
for (i=1; i <= n+1; i++)
cout << "*";
cout << endl;
for (i=1; i <= n+8; i++)
cout << "*";
cout << endl;
for (i=1; i <= n+1; i++)
cout << "*";
cout << endl;
for (i=1; i <= n+1; i++)
cout << "*";
cout << endl;
for (i=1; i <= n+9; i++)
cout << "*";
cout << endl;}
void main()
{
int n;
cout << "Vpisi velikost: ";
cin >> n;
izrisi(n);
}

Zgodovina sprememb…

  • spremenilo: teac ()

freserovski ::

ne, lik ni isti, kot je zgoraj narisan, al pa ga meni ne prikaže prav, spodaj je pravokotnik, zgoraj pa strehica
Problemi so, problemi bodo! Kurc jih gleda!!

freserovski ::

*
***
*****
*******
**********
**********
**********

lik je nekaj podobnega temu, samo brez notranjih zvezdic, so samo zunanje-ogrodje in z diagonalama v pravokotniku :\

joj, ne vem no, še tu ga ne gre narisat tako kot je treba, ga na polovici prepreže 8-O ajd, lik je tak, kot ta, samo date še zraven na levi strani istega, isto, kot, da bi po vertikali zrcalili :)
Problemi so, problemi bodo! Kurc jih gleda!!

Zgodovina sprememb…

rasta ::

     *
   *   *
 *       *
***********
*         *
*         *
*         *
***********

______________
Za risanje takih likov narediš samo eno zanko za število vrstic in potem za vsako vrstico izračunaš število presledkov in zvezdic, ki jih mora izpisati.

freserovski ::

samo pol ne morš spreminjat velikost lika :'(
Problemi so, problemi bodo! Kurc jih gleda!!

teac ::

Ok, spodaj maš to nalogo rešeno, vendar ne moreš spreminjat velikost lika -oz. lahko, vendar ne izrise prav(to boš pač moral sam sprogramirat ;) )

Aja...prav dela samo za velikost 11 (tolko kot je zvezdic v ravni najdaljši vrstici)


#include < iostream.h >
#include < iomanip.h >

void izrisi (int n)
{
cout << setw(n-5) << "*" << endl;
cout << setw(n-7) << "*" << setw(n-7) << "*" << endl;
cout << setw(n-9) << "*" << setw(n-3) << "*" << endl;

for (int i=1; i<=n; i++)
cout << "*";
cout << endl;
int j=1;
do
{
cout << "*";
for (i=1; i<=n-2; i++)
cout << " ";
cout << "*" << endl;

j++;
}while(j<=3);

for (i=1; i<=n; i++)
cout << "*";
cout << endl;
}
void main()
{
int n;
cout << "Vpisi velikost : ";
cin >> n;
izrisi(n);
}

Zgodovina sprememb…

  • spremenilo: teac ()

rasta ::

> samo pol ne morš spreminjat velikost lika
Seveda lahko. Najprej izračunaš koliko vrstic bo zasedel lik velikosti x, potem pa še v vsaki vrstici za presledke in zvezdice.
Mogoče bi bilo smiselno zanko za vrstice razbiti na dve (trikotnik in kvadrat).

teac ::

Velikost lika gre spreminjat, vendar moreš število zvezdic v vrstici kjerje največ zvezdic vpisat liho število.

George ::

To smo mi zj na vlko delal in sem kr dobr podkovan v risanju likov. :)
//We are the Borg. You will be assimilated. Resistance is futile.


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

NUJNO!Algoritmi C++

Oddelek: Pomoč in nasveti
211974 (1236) DOOM_er
»

vsota vrste

Oddelek: Programiranje
102109 (1853) PaX_MaN
»

[Naloga][C++] vsota vrste

Oddelek: Programiranje
71965 (1805) bozjak
»

Java problemček

Oddelek: Programiranje
51442 (1364) pajac
»

Izračun fakultete...

Oddelek: Programiranje
134489 (4223) jeti

Več podobnih tem