pomoc s kontrolou algoritmu

Programovacie jazyky, rady, poradňa...
measter
Medium Expert
Medium Expert
Príspevky: 80
Registrovaný: 13 júl 2008, 19:51

pomoc s kontrolou algoritmu

Príspevok od používateľa measter »

Zdravim chcel by som Vas poprosit ci mi niekto moze pomoct s jednym algorimom mal by obratit hodnoty x1,..xn nejako som ho napisal a chcem vediet ci by to tak fungovalo tak ako ma a ak nie tak co by som mal zmenit alebo dopisat pripadne ak ma niekto iny napad ako by sa to dalo spravit.
dakujem

isiel som na to tak, ze ak zadavam cisla napr X1 X2 X3 X4 X5
4 1 3 5 2 =15
tak na vystupe by malo byt X5 X4 X3 X2 X1
2 5 3 1 4
no a urobil som to tak ze ked sictam vsetky cisla dostanem S potom scitam vsetky cisla az na posledne to som oznacil ako P t.j Xn-1 a ked odcitam S-P tak dostanem vysledok V a takto to budem odcitavat
15-13=2
13-8=5
8-5=3
5-4=1

Kód: Vybrať všetko

prem N,S,P,V,i : celociselne;
     X[100] : pole celych cisel;

zaciatok
       vstup(N);
       S<-0;
       P<-0;
       pre i<-1 po N rob
           vstup (X[i]);
           S<-S+X[i];
           P<-P+X[i-1];
       *pre;
       pre i>=0 rob
           V<-S-P;
           S<-P;
           P<-P-X[i];
           i<-i-1;
       vystup(V);
       *pre;       
koniec
DeaDMAn_X
Medium Expert
Medium Expert
Príspevky: 94
Registrovaný: 06 apr 2009, 14:38

Príspevok od používateľa DeaDMAn_X »

da sa to aj tak,malo by to fungovat...dalsia moznost je nahadzat to do pola a potom jednoducho vypisat pole od zadu(len by bolo potrebne poznat aj pocet cisel)...ak nepoznas pocet tak sa da pouzit namiesto pola zasobnik(stack)
audiotrack
VIP
VIP
Používateľov profilový obrázok
Príspevky: 25958
Registrovaný: 09 sep 2005, 18:39
Kontaktovať používateľa:

Príspevok od používateľa audiotrack »

algoritmus je dobrý, ale máš ho zle zapísaný. Konkrétne P<-P+X[i-1]; je vadné, lebo by ti hodilo outOfBound výnimku. Stačí to aspoň ošetriť p odmienkou: ak i>1 potom P<-P+X[i-1]; . A ešte by sa to dalo zoptimalizovať čo sa týka pamäťovej zložitosti
measter
Medium Expert
Medium Expert
Príspevky: 80
Registrovaný: 13 júl 2008, 19:51

Príspevok od používateľa measter »

oki dakujem dopisal som tam to co si mi napisal mam este jeden dotaz, ze ci i< -i-1;je to na konci nemam presunut vyssie ako som to naznacil na zaciatok toho cyklu

Kód: Vybrať všetko

prem N,S,P,V,i : celociselne;
     X[100] : pole celych cisel;

zaciatok
       vstup(N);
       S<-0;
       P<-0;
       pre i<-1 po N rob
           vstup (X[i]);
           S<-S+X[i];
           if i>1 tak          //tu je ta zmena
           P<-P+X[i-1];
       *pre;
       pre i>=0 rob
           i<-i-1;     //presunut na tuto poziciu
           V<-S-P;               
           S<-P;                  
           P<-P-X[i];            
           i<-i-1;    // toto 
       vystup(V);
       *pre;       
koniec
audiotrack
VIP
VIP
Používateľov profilový obrázok
Príspevky: 25958
Registrovaný: 09 sep 2005, 18:39
Kontaktovať používateľa:

Príspevok od používateľa audiotrack »

bol som v škole, takže ten druhý cyklus som trošku prehliadol. Máš pravdu, ten riadok bude tam hore, no ešte sú tam dve chyby:
1) pre i>=0 rob bude iba pre i>0 rob lebo vstupy máš číslované od X[1] a nie X[0]. Zase by si pristupoval na neplatné ("nulté") miesto v pamäti
2) po skončení prvého cyklu bude i rovné N+1, takže medzi tými dvoma cyklami ho treba buď dekrementovať (i<-i-1) alebo nastaviť na N (i<-N)
measter
Medium Expert
Medium Expert
Príspevky: 80
Registrovaný: 13 júl 2008, 19:51

Príspevok od používateľa measter »

aha oki dik dopisem si to tam a mam este otazku tento algoritmus asi nebude fungovat ak nejaka hodnota alebo hodnoty by boli zaporne cisla?
audiotrack
VIP
VIP
Používateľov profilový obrázok
Príspevky: 25958
Registrovaný: 09 sep 2005, 18:39
Kontaktovať používateľa:

Príspevok od používateľa audiotrack »

bude fungovať aj tak
measter
Medium Expert
Medium Expert
Príspevky: 80
Registrovaný: 13 júl 2008, 19:51

Príspevok od používateľa measter »

2) po skončení prvého cyklu bude i rovné N+1, takže medzi tými dvoma cyklami ho treba buď dekrementovať (i<-i-1) alebo nastaviť na N (i<-N)
ak sa mozem spytat preco bude po skonceni prveho cyklu i rovne N+1 a bude ho treba raz dekrementovat mozes mi to vysvetlit bo kukam na to a netusim
audiotrack
VIP
VIP
Používateľov profilový obrázok
Príspevky: 25958
Registrovaný: 09 sep 2005, 18:39
Kontaktovať používateľa:

Príspevok od používateľa audiotrack »

keď je i = N-2 tak sa vykoná cyklus a i sa zvýši o jedna na N-1
keď je i = N-1 tak sa vykoná cyklus a i sa zvýši o jedna na N
keď je i = N tak sa vykoná cyklus a i sa zvýši o jedna na N+1
keď je i = N+1 tak sa cyklus už nevykoná a v i ostane N+1
measter
Medium Expert
Medium Expert
Príspevky: 80
Registrovaný: 13 júl 2008, 19:51

Príspevok od používateľa measter »

aha tak dakujem Ti za pomoc s algoritmom :)

//autoeditácia príspevku ( 26 Nov 2009, 16:15 )
Zdravim chcem Vas poprosit o kontrolu druheho algoritmu ci je dane prirodzene cislo prvocislo no isiel som na to tak ze ak je dane cislo prvocislo tak ma max 2 delitele a to je 1 a to dane cislo takze ak nieje prvocislo tak sa da celociselne bez zvysku delit viac ako dva krat alebo ak ma niekto iny napad ako by sa to dalo urobit tu je alogoritumus je spravne napisany?

Kód: Vybrať všetko

prem N,S,C,i : celociselne;
     
zaciatok
       vstup(N);
       S<-0;
       V<-0;
       pre i<-0 po N rob 
	   i=i+1;
		if N%i=0 tak
	   	S<-S+1;
       *pre;
	if S>2 tak
	   C<-0;
	   Vystup(C);
	else
	   C<-1;
	   vystup(C);
koniec		
		
       
BX
Addict
Addict
Používateľov profilový obrázok
Príspevky: 4572
Registrovaný: 10 jan 2008, 15:30

Príspevok od používateľa BX »

to i=i+1 tam je zbytcone. Moze ist cyklus "pre i rovne jednej do..." a bude po probleme s delenim nulou.
Tiez ta premenna V neviem na co je .
Ale inak je to dobre :)

Kód: Vybrať všetko

prem N,S,C,i : celociselne;
     
zaciatok
       vstup(N);
       S<-0;
       pre i<-1 po N rob 
		if N%i=0 tak
	   	S<-S+1;
       *pre;
	if S>2 tak
	   C<-0;
	else
	   C<-1;

   vystup(C)
koniec		
		
       
[/quote]
audiotrack
VIP
VIP
Používateľov profilový obrázok
Príspevky: 25958
Registrovaný: 09 sep 2005, 18:39
Kontaktovať používateľa:

Príspevok od používateľa audiotrack »

stačí ísť od 2 (lebo jednotkou je delitelné každé) po odmocninu(N) a hľadám aspoň jedného delitela. Po jeho nájdení môžem cyklus už breaknúť a nemusím prechádzať ďalej
measter
Medium Expert
Medium Expert
Príspevky: 80
Registrovaný: 13 júl 2008, 19:51

Príspevok od používateľa measter »

oki dakujem :)

//autoeditácia príspevku ( 26 Nov 2009, 19:39 )
K tomu prvemu algoritmu co je v uvode na obratenie poradia som spravil vyvojovi diagram je dobre nakresleni? mozte sa na to kuknut dakujem
Obrázok
jogin
Light Expert
Light Expert
Príspevky: 54
Registrovaný: 26 dec 2006, 21:39
Bydlisko: Banska Bysrtica

Algoritmud

Príspevok od používateľa jogin »

toto je algoritmus. PRE DANU KONECNU POSTUPNOST RIESTE ALGORITMICKY PRESUN JEJ MAX. NA KONIEC
Potrebujem poradit ci je to dobre..PLS
Dakujem...


NAVRH ALGORITMU

Kód: Vybrať všetko

Algoritmus Max;	
Prem  i, j, c, max, d: celé čísla;
          A[100] b[100] : pole celých čísel

 Začiatok
             Vstup (N) ; 
              d=2;
         pre i = 1 po N rob
                vstup (a [i]);
                max = a[1];
        pre i = 2 po N rob	
         ak a [i]> max  potom max = a[i]
                                                 c = I;
	
             b[1] = max;	
        pre j = 1 po N rob
          ak j <> c tak  b[d] = a[j]
                                   d = d+1;
        pre i = 1 po N rob	
         výstup (b[i]);
koniec.
audiotrack
VIP
VIP
Používateľov profilový obrázok
Príspevky: 25958
Registrovaný: 09 sep 2005, 18:39
Kontaktovať používateľa:

Príspevok od používateľa audiotrack »

ty presúvaš maximum na začiatok, a máš tam jednu chybu:

jeden if ti chýba uzvaretý (potom by sa do ifu zobral iba prvý príkaz:

Kód: Vybrať všetko

ak a [i]> max  potom max = a[i]
                                                 c = I; 
bude

Kód: Vybrať všetko

ak a [i]> max  potom 
    max = a[i]
    c = i; 
*ak
ak deklaruješ premennú ako malé i, nepoužívaj ju inde ako velké i (taktiež vidno v tejto časti kodu čo som ukazoval)
jogin
Light Expert
Light Expert
Príspevky: 54
Registrovaný: 26 dec 2006, 21:39
Bydlisko: Banska Bysrtica

Príspevok od používateľa jogin »

audiotrack napísal:ty presúvaš maximum na začiatok, a máš tam jednu chybu:

jeden if ti chýba uzvaretý (potom by sa do ifu zobral iba prvý príkaz:

Kód: Vybrať všetko

ak a [i]> max  potom max = a[i]
                                                 c = I; 
bude

Kód: Vybrať všetko

ak a [i]> max  potom 
    max = a[i]
    c = i; 
*ak
ak deklaruješ premennú ako malé i, nepoužívaj ju inde ako velké i (taktiež vidno v tejto časti kodu čo som ukazoval)
Dakujem ti velmi pekne..Teraz by to mohlo teoreticky fungovat???
Skontroloval by si mi aj vyvojovy diagram??
Dakujem...
audiotrack
VIP
VIP
Používateľov profilový obrázok
Príspevky: 25958
Registrovaný: 09 sep 2005, 18:39
Kontaktovať používateľa:

Príspevok od používateľa audiotrack »

ak ho sem dáš, tak to zkontrolujem :)
Napísať odpoveď