Da li mi netko moze odgovoriti zasto program za invertiranje stringe vraca umjesto stringe brojeve i znakove? koje su najcesce greske? Unaprijed hvala na odgovorima!
Rekurzivne funkcije
- poruka: 22
- |
- čitano: 4.633
- |
- moderatori:
Lazarus Long, XXX-Man, vincimus
- +/- sve poruke
- ravni prikaz
- starije poruke gore
Zvuči kao da ispisuješ neinicijalizirane varijable ili pointere umjesto vrijednosti, ali može biti svašta, teško je reći bez koda...
Daj kod, pa ćemo onda vidjeti kuda i kako!
evo koda! nije c, ali sve je to vise-manje isto.
function cambio (Parola : String; I: integer) return string is
Riverso : String (Parola'Range);
begin
if (I>Parola'Last) then
return Riverso;
else
Riverso (Riverso'Last - I + Parola'First) := Parola (I);
return Cambio (Parola,I+1);
end if;
end cambio;
ovo je cijeli kod..
with Ada.Text_IO;
use Ada.Text_IO;
with Ada.Integer_Text_IO;
use Ada.Integer_Text_IO;
procedure Ritroso5 is
X: String(1..50);
Lung:Integer;
function cambio (Parola : String; I: integer) return string is
Riverso : String (Parola'Range);
begin
if (I>Parola'Last) then
return Riverso;
else
Riverso (Riverso'Last - I + Parola'First) := Parola (I);
return Cambio (Parola,I+1);
end if;
end cambio;
begin
Put_Line ("Inserisci una stringa!");
Get_LIne(X,lung);
Put_Line (cambio (X(1..Lung),1));
end Ritroso5;
Pascal?, neznam Pascal, da je C-like ili Basic pomogao bi ti, a ovako..., to ti zna @mbaksa, on je dobar sa Pascalom.
Nije Pascal,. to je Ada.. ajme cijeli dan to pokusavam rijesiti. Kad rjesavam bez rekurzije, funkcionira. ne mogu uopce skuziti u cemu je problem.. :-(
Da li moraš to raditi u Adi ili svojevoljno radiš u Adi.
a moram bas u adi i bez koristenja pokazivaca.. i mora biti rekurzivno..
A neznam nikoga da zna Adu, a da ima profil na ovom forumu, možda se varam?
Da, ali nije bitno u cemu programiras, logika je ista..
Da, ali nije bitno u cemu programiras, logika je ista..
Da, ali je teško u neprepoznatljivom kodu vidjeti logiku programa.
ovo je cijeli kod..
...
Put_Line ("Inserisci una stringa!");
Get_LIne(X,lung);
Put_Line (cambio (X(1..Lung),1));
end Ritroso5;
Probaj staviti malo "i" unutar Get_Line ?
Ako nije bitan jezik, nego logika programiranja, možda ovo pomogne
(BTW. ne znam Adu, talijanski još i manje)
#include<iostream>
#include<string>
using namespace std;
void RekurzijaObrnutaRijec(string rijec, string& obrnutaRijec, int duljinaStringa)
{
if (duljinaStringa == 0) return; // kad ova varijabla postane 0 - rekurzija se prekida
obrnutaRijec += rijec[duljinaStringa - 1]; // novi string nadovezujemo sa indexsom trenutne duljine starog stringa
RekurzijaObrnutaRijec(rijec, obrnutaRijec, duljinaStringa -= 1); // funkcija se poziva rekurzivno i svakim pozivom
} // se smanjuje varijabla duljinaStringa
int main()
{
string rijec = "prvasica uci Adu";
string obrnutaRijec = "";
RekurzijaObrnutaRijec(rijec, obrnutaRijec, rijec.length());
cout << obrnutaRijec << endl;
}
Ovaj algoritam ispunjava uvjete zadatka, radi rekurzivno, nema pokazivača ni referenci, a barata sa samo jednim char nizom.
(ako se može preslikati u Adu, trebao bi raditi - nije toliko bitna sintaksa - koliko algoritam - pa bi se trebalo moći preslikati u Adu)
Praktički, umjesto iteracija petlje pozivamo funkciju i vršimo zamjenu komparativnih pozicija niza po istom obrascu kao u iteraciji.
#include<iostream>
#include<string>
using namespace std;
void RekurzijaObrnutaRijec(char rijec[], int duljinaStringa, int pozicija)
{
if (duljinaStringa < 2) return; // nemamo što raditi
char pom;
pom = rijec[pozicija];
rijec[pozicija] = rijec[duljinaStringa - pozicija -1]; // mjenjamo pozicije u char nizu da dobijemo obrnuti niz
rijec[duljinaStringa - pozicija - 1] = pom;
if (duljinaStringa/2 == pozicija+1) return; // bitan je ovaj uvjet za prekid rekurzije, kad se ispuni - rekurzija staje
RekurzijaObrnutaRijec(rijec, duljinaStringa, pozicija += 1); // funkcija se poziva rekurzivno i svakim pozivom
// povećava se vrijednost pozicije
}
int main()
{
char rijec[] = "Prvasica uci Adu";
int pozicija = 0, duljinaStringa = 0;
for(int i = 0; rijec[i] != '\0'; i++)
{
duljinaStringa++;
}
RekurzijaObrnutaRijec(rijec, duljinaStringa, pozicija);
cout<< rijec << endl;
}
Last, but not least
Evo primjera punokrvne rekurzije koja vraćanjem na stogu radi konkatenaciju stringa da bi se dobio obrnuti redosljed:
(sistem ogledala - na vrhu stoga počinje se od praznog stringa i spuštanjem dolje se vrši nadovezivanje , po sistemu slovoNaTrenutnomStogu + dotadašnjiZbirSlovaSaPrijeđenihStogova)
#include<iostream>
#include<string>
using namespace std;
string RekurzijaObrnutaRijec(string rijec, int duljinaStringa)
{
if (duljinaStringa == 0) return ""; // kad se rekurzija prekine, vraćanje na stogovima polazi od praznog stoga
return rijec[duljinaStringa ] + RekurzijaObrnutaRijec(rijec, duljinaStringa -= 1);
} // na stogu se ostavljaju slova u obrnutom redosljedu, kad rekurzija vraća ide konkatenacija po
// sistemu slovo na stogu + dotadašnja riječ
int main()
{
string rijec = "Prvasica uci Adu";
string obrnuto = RekurzijaObrnutaRijec(rijec, rijec.length());
cout<< obrnuto << endl;
return 0;
}
@Floki,
pa ako si se vec toliko "napalio" na rekurziju sta ne napravis neki primjer pisan u Ada-i
@Floki,
pa ako si se vec toliko "napalio" na rekurziju sta ne napravis neki primjer pisan u Ada-i
Ne znam tu Adu
što bi rekurzija u njoj trebala ići drukčije?
@Floki,
pa ako si se vec toliko "napalio" na rekurziju sta ne napravis neki primjer pisan u Ada-i
Ne znam tu Adu
Pa bas to i mislim reci, uzmi si 20 min da smislis kako napraviti star u Ada-i,
logika je potpuno ista, ovako bar nesto novo naucis.
Koliko se sjećam, ona barata sa C++, a brzo i kuži
pretvorit će ona alogoritam iz C++ u Ada-u, pogotovo onaj zadnji
nema potrebe da ja brljam po nečem u čem nisam radio
a pravo da ti kažem, ne volim taj kod koji me podsjeća na basic-ovski
btw. a mislim da njoj nije problem sintaksa Ada-e, nego algoritam koji rekurzivno invertira niz
Koliko se sjećam, ona barata sa C++, a brzo i kuži
pretvorit će ona alogoritam iz C++ u Ada-u, pogotovo onaj zadnji
nema potrebe da ja brljam po nečem u čem nisam radio
Ma eto mislio sam da ce te mozda zanimati probati nesto novo pa sam
predlozio... nevermind
Kakva ti je točno greška? Na prvi pogled, rekurzija mi se čini ok iako je više riječ o zakamufliranoj petlji nego pravoj rekurziji.
Sumnjiva mi je ova naredba: Put_Line (cambio (X(1..Lung),1)); Da X(1..Lung) možda ne stvara novi, nasumično inicijalizirani string? Ja bi napisao ovako: Put_Line (cambio (X,1)); Ako je to pak način za izvlačenje podstringa, onda problem leži negdje drugdje. Također, u programu koji si navela ne vidim da se igdje poziva ona procedura.