» »

[C++] Dve malo težji nalogi

[C++] Dve malo težji nalogi

roli ::

Torej za nalogo smo pri pouku APJja dobili dve malo bolj tako nalogi. In nekako nimam pojma kako bi jih lahko naredil.

Torej najtežja - rešiti jo je potrebno z nekimi osnovnimi zankmi, kaki if. To je pa nekje to:
NAriši diagram poteka in napiši program, ki poišče vsa naravna števila med 1 in 10000, ki so enaka vsoti kubov svojih štev. eno od števil, ki ima zahtevano lastnost je npr.: 153: 153 = 1ˆ3 + 5ˆ3 + 3ˆ3

Za tole res nimam neke ideje kako jo rešit.

Ter druga:
Nariši diagram poteka in napiši program, ki vneseno število pretvori iz decimalnega v binarni številski sistem.

Tole mi je nekako jasno in mi uspe števila prav izpisat samo v napašnem vrstnem redu - torej treba je izpis obrnit.

Vsaka pomoč je dobrodošla!
http://www.r00li.com

BlueRunner ::

tc, tc, tc...

psevdokoda... prepiši v zahtevano obliko, pa bo

za vsak X od 1 do 10000:
  naj bo A = X
  naj bo V = 0
  dokler A > 0:
    naj bo V = V + ((A modulo 10) na tretjo potenco)
    naj bo A = A deljeno 10
  če V enako X:
    izpiši X


preberi število X
naj bo A = X
naj bo B = ""
dokler A > 0:
  če (A modulo 2) enako 0:
    naj bo B = "0" + B
  sicer:
    naj bo B = "1" + B
izpiši B


Prepisati psevdokodo v digram poteka in C++ program, bi pa moral sam narediti. Naj bo za konec semestra v delo vloženo vsaj nekaj tvojega znanja.

Zgodovina sprememb…

roli ::

Hvala lepa za tole!
Glede na to, da so to dve nalogi izmed triintridesetih bi lahko komot naredil tudi brez teh. Samo me je nekako zanimalo kako gre. Sicer mi drugi tipi nalog gredo edino tole preračunavanje števil je malo bolj zaj*** glede na to, da nisem ravno blesteč v matematiki. Ne vem no kjer je naloga za naredit kaj drugega že gre, ko enkrat pride do kakih korenov, kvadratov in kubov sem pa mrzel.

Sicer pa še koda, če koga zanima:
Prva naloga:
#include <iostream>
using namespace std;

int main() {
	
	int x = 1;
	int a, b;
	
	while (x < 10000)
	{
		a = x;
		b = 0;
		
		while (a > 0)
		{
			b = b + ((a % 10)*(a % 10)*(a % 10));
			a = a/10;
		}
		
		if (b == x)
		{
			cout << x << endl;
		}
		
		x++;
	}
	
	
	system ("pause");   
	return 0; 
}


Druga naloga:
#include <iostream>
#include <string>
using namespace std;

int main() {
	
	int vnos;
	string izpis = "";
	cout << "Vnesi stevilo za pretvorbo v binarni sistem: ";
	cin >> vnos;
	
	while (vnos > 0)
	{
		if (vnos %2 == 0)
		{
			izpis =  "0" + izpis;
		}
		else 
		{	
			izpis = "1" + izpis;
		}
		vnos = vnos /2;
	}
	cout << endl << izpis;
	
	
	system ("pause");   
	return 0; 
}


Tukajle ne vem, če si mislil na string ampak je bil nekje najbolj logičen za uporabit. Sicer se pa mi stringov še nismo učili tako, da jih naj nebi uporalbjal.
http://www.r00li.com

Zgodovina sprememb…

  • spremenil: roli ()

PaX_MaN ::

Tukajle ne vem, če si mislil na string ampak je bil nekje najbolj logičen za uporabit. Sicer se pa mi stringov še nismo učili tako, da jih naj nebi uporalbjal.

10^n + 10^(n+1) + 10^(n+2) +...; N = 0,1,2,... pa dobiš "dvojiški" zapis cifre. ;)

BlueRunner ::

Da. Niz, oziroma string, je optimalna izbira za takšen primer. Pretvorbo med številskimi sistemi namreč delaš od najmanj pomembe števke do najbolj pomembne - od desne proti levi. To pa je ravno obratno od tega, kar ljudje pričakujemo pri izpisu, zato jih ne moreš (enostavno) sprotno izpisovati, med samo zanko.

Lahko pa to narobe številko in poveš zakaj je obrnjena in kako bi to lahko z nizom rešil.


Za matematiko ti pa zelo toplo priporočam, da jo čim prej vzljubiš, če želiš nadaljevati v smeri programiranja ali tehniki v splošnem. Z njo dobiš bazično znanje in tudi disciplino za znanstven pristop, ki ti bo v naravoslovju vedno koristil.

Zgodovina sprememb…

BlueRunner ::

Tukajle ne vem, če si mislil na string ampak je bil nekje najbolj logičen za uporabit. Sicer se pa mi stringov še nismo učili tako, da jih naj nebi uporalbjal.

10^n + 10^(n+1) + 10^(n+2) +...; N = 0,1,2,... pa dobiš "dvojiški" zapis cifre. ;)


Ufff... to si ga pa zamočil... >:D

N = 0 in ne N = (0, ...)
Osnova pa ni 10 ampak 2.

Splošen zapis "vrednosti" števila v dvojiškem št. sistemu je.

a*2^0 + b*2^1 + c*2^2 + d*2^3 + e*2^4 + ... == ...edcba(2)

Iz formule pa seveda sledi tudi obraten postopek:
(a*2^0 + b*2^1 + c*2^2 + d*2^3 + e*2^4 + ...) / 2 = (b*2^0 + c*2^1 + d*2^2 + e*2^3 + ...) + a/2 => a/2 je ostanek, a je celoštevilski ostanek: pišem "a"
(b*2^0 + c*2^1 + d*2^2 + e*2^3 + ...) / 2 = (c*2^0 + d*2^1 + e*2^2 + ...) + b/2 => b/2 je ostanek, b je celoštevilski ostanek: pišem "ba"
(c*2^0 + d*2^1 + e*2^2 ...) / 2 = (d*2^0 + e*2^1 ...) + c/2 => c/2 je ostanek, c je celoštevilski ostanek: pišem "cba"
... in tako naprej ...

Če boš 11011100(2) zapisal v formulo 0*2^0 + 0*2^1 + 1*2^2 + 1*2^3 + ... + 1*2^7 in šel po postopku, boš videl, da boš znova sestavil zapis "11011101".

Enako pa velja tudi za vse ostale številske sisteme. Npr. 1210(3) = 0*3^0 + 1*3^1 + 2*3^2 + 1*3^3.

PaX_MaN ::

Mislil sem na tale del njegove kode:
if (vnos %2 == 0)
{
izpis = "0" + izpis;
}
else
{
izpis = "1" + izpis;
}

Če ne smejo uporabit stringa, da bi ga s-konkateniral, greš seštevat "enice". No, problem je, ker to dela samo za majhne cifre - če nimaš ravno "ta velke" inte (C++ ne poznam najbolje). Lahko pa to naredijo, še bolj elegantno, s poljem, pod pogojem, da so ga že jemali.

noraguta ::

eh bitmask nardiš pa je.
Pust' ot pobyedy k pobyedye vyedyot!

roli ::

Nah tudi polji še nismo imeli! Saj bom obdržal kar tale string. Sicer ga sam poznam in ga znam uporabljat samo učili se ga še nismo.


Za matematiko ti pa zelo toplo priporočam, da jo čim prej vzljubiš, če želiš nadaljevati v smeri programiranja ali tehniki v splošnem. Z njo dobiš bazično znanje in tudi disciplino za znanstven pristop, ki ti bo v naravoslovju vedno koristil.

Težka! Sicer želim nadaljevati tukaj ja samo nimam pojma koliko je tukaj matematike kaj. Verjetno ne ravno ogromno?
http://www.r00li.com

BlueRunner ::

Oh, to lahko narediš tudi s pomočjo logaritma. Ampak logaritme razlagati nekomu, ki mu matematika ne leži bi pa bilo IMHO že preveč hudo. Po osnovnem vprašanju (ŽAPŽJ) sem sklepal, da to verjetno spada v srednjo šolo, tako da v to nisem želel riniti. Če logaritmov ne poznaš, bo rešitev zelo težko zagovarjati kot lastno.

Za kompletnost pa lahko podam tudi ta algoritem:


preberi X
naj bo P = Pow(2, Floor(Log2(X)))
dokler P >= 1:
  naj bo M = X / P
  izpiši M
  naj bo X = X - M * P
  naj bo P = P / 2

BlueRunner ::

Težka! Sicer želim nadaljevati tukaj ja samo nimam pojma koliko je tukaj matematike kaj. Verjetno ne ravno ogromno?


Morda te bo presenetilo, vendar pa je tudi najenostavnejši algoritem matematičen izraz. Tudi če je napisan v C++. Matematika je namreč veliko več od geometrije in formul. Matematika je tudi pristop k iskanju rešitve. Programiranje pa ni nič drugega kot "pristop k iskanju rešitve".

Če se boš spomnil enega starega filma o fantku, ki se je želel naučiti borilnih veščin. Mojster pa ga ni učil udarcev, temveč mu je dal za pomivati tla. Na koncu pa se izkaže, da ga je s tem naučil načina gibanja, s čemer je tudi osvojil osnove borilnih veščin.

V primeru matematike, se jo ne učiš zato, da boš nekaj "računal", ampak zato, da se naučiš "matematičnega pristopa k iskanju rešitve". Ta je pri programiranju razlika med povprečnim in odličnim programerjem.

roli ::

Heh ja gre se za srednjo šolo ja.

Matematika je bolj tako meni - imam neke čudne skoke. Po ocenah vide od pet pa vse do 2 - čisto odvisno iz česa.

To, da je tudi nek osnoven algoritem matematičen izraz je kar smiselno. Sedaj za večino stvari mi je vedno uspelo pogruntati rešitev - pa naj se gre za take majcene naloge ali pa kaj bolj zakompliciranega. Tako, da morda upanje zame še ostaja:D.
http://www.r00li.com

BlueRunner ::

Upanje vedno obstaja... za ocene pa se ne sekiraj (preveč). Tudi jaz sem imel pri matematiki ocene v SŠ normalno porazdeljene od 1 do 5. Pa sem imel matematiko še vedno rad, jo imam še vedno rad in jo bom tudi vedno imel rad.

Ocene pa niso odvisne samo od RAZUMEVANJA, temveč še od celega kupa drugi stvari. Tukaj pa boš potreboval samo razumevanje in logiko razmišljanja. Kako dobro ti gre pa to, pa ocene nikoli ne pokažejo.

Je pa res, da te matematika nauči discipliniranega in usmerjenga razmišljanja. Slabo za družbo, dobro za delo ;)

whatever ::

ja, dokler se ne začneš resno ukvarjat s fraktali in teorijo kaosa še gre, pol se ti pa tak zmeša:))
Veliko jih je notri, še več jih je pa zunaj.
Bilijarde v šole! - Ivan Kramberger
Abnormal behaviour of abnormal brain makes me normal.

darkkk ::

Problem je, ker je srednješolska matematika samo računčkanje in (skoraj) nič razmišljanja(mogoče kaka naloga iz geometrije). Stopnja težavnosti je potem le še količina nalog, ki jih je potrebno rešiti na testu v omejenem času.

BlueRunner ::

Uf... déjà vu. Na to temo sem že imel debato. Nekje vmes pa mislim, da se mi je zapisalo, da je veliko odvisno od dobrega predavatelja/profesorja.

roli ::

Čisto tako še ena bolj zanimiva stvarca. Danes sem dobil še par nalog in med drugimi tudi tole:
Izpiši prvih x praštevil. Za lažje razumevanje sem si izbral, da je x 10. Torej tukaj je delujoča koda. Zanima me samo kaki so bolj enostavni načini za računanje tega!

#include <iostream>
using namespace std;

int main()
{
	bool konec = false;
	int stevec = 0;
	
	for (int i = 2; ; i++)
	{
		for (int j = 2; j <= i; j++)
		{
			if ((i%j == 0) && (j != i))
			{
				konec = true;
			}
			
		}
		
		if (konec == false)
		{
			cout << i << endl;
			stevec++;
		}
		konec = false;
		
		if (stevec == 10)
		{
			break;
		}

	}
	
	return 0;
	system("PAUSE");
}
http://www.r00li.com


Vredno ogleda ...

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

NUJNO!Algoritmi C++

Oddelek: Pomoč in nasveti
211865 (1127) DOOM_er
»

programiranje krožek(pomoč)

Oddelek: Pomoč in nasveti
442601 (1589) Marat
»

C++ program

Oddelek: Programiranje
171202 (997) klmen
»

c++ naloge

Oddelek: Programiranje
92785 (2409) l0g1t3ch
»

C++ naloge

Oddelek: Programiranje
163232 (2761) kitarist

Več podobnih tem