Ha szívesen korrepetálnál, hozd létre magántanár profilodat itt.
Ha diák vagy és korrepetálásra van szükséged, akkor regisztrálj be és írd meg itt, hogy milyen tantárgyban!
Olvasson be egy n (n≥1) természetes számot, és írja ki az n páros számjegyeinek
megduplázásával kapott számot, vagy -1-et, ha nincs egyetlen páros számjegye sem.
Írjon pszeudokód algoritmust a fenti feladat megoldására.
Magyarázza meg a leírt algoritmusban előforduló összes változó szerepét,
és sorolja fel a leírt feladat bemeneti, illetve kimeneti adatait.
Jelenleg 1 felhasználó nézi ezt a kérdést.
0
Felsőoktatás / Informatika
Válaszok
4
Epic Username
válasza
Sajnos pszeudo kódban nem tudom olyan könnyen megfogalmazni, de megírtam a programot C++ nyelven és arra az esetre, ha te magad nem ismernéd ezt a programozási nyelvet, írtam mellé magyarázó szöveget, hogy a program melyik része mit csinál.
void megduplaz(int a)
{
stringstream ss; /// szöveggé alakítom a számot, hogy
string s; /// aztán karakterenként("számjegyenként")
ss << a; /// dolgozhassak vele tovább
ss >> s;
vector<int> v; /// a szöveget karakterenként visszalakítom
for(size_t i=0; i<s.size(); i++) /// számmokká, amikkel feltöltök egy táblázatot
{ /// a táblázat tehát a megadott szám
char c; /// számjegyeit tartalmazza sorrendben
c=s[i];
stringstream ss;
int b;
ss << c;
ss >> b;
v.push_back(b);
}
int odd=0; /// számjegyenként ellenőrzöm, hogy azok páratlanok-e
for(size_t i=0; i<v.size(); i++) /// ha igen, akkor a számláló értéke eggyel nő
{ /// ha a számláló értéke annyi, ahány számjegyem van,
if(v[i]%2!=0) /// akkor kiír -1-et
{
odd+=1;
}
}
if(odd==v.size())
{
cout<<-1<<endl;
}
else /// ha nem, akkor a páros számjegyeket megduplázza
{ /// és minden számjegyet kiír
for(size_t i=0;i <v.size(); i++)
{
if(v[i]%2==0)
{
v[i]=v[i]*2;
}
cout<<v[i];
}
}
}
int main()
{
int a; /// beolvasok a konzolról egy természetes számot
cin>>a;
megduplaz(a); /// meghívom a függvényt, ami eldönti, hogy mit írjon ki a kozolra
return 0;
}
Nem vagyok róla meggyőződve, hogy ez a legegyszerűbb lehetséges megoldás, de az biztos, hogy működik. Remélem, hogy ez alapján sikerül megírnod az algoritmus pszeudo kódját.
2
Még nem érkezett komment!
bongolo{ }
megoldása
beolvas n
ha n < 1 akkor
kiír "nem jó szám"
vége
nn = 0 // nn-ben keletkezik az új szám, duplázott párosakkal, de megfordítva
nincspáros = igaz
mialatt n > 0
// megjegyzés: mod és div a maradék és a hányados operátorok
sz = n mod 10 // utolsó számjegy
n = n div 10 // a szám többi része az utolsó számjegy nélkül
ha sz mod 2 == 0 akkor // ha páros
nn = nn * 100 + sz * 11 // kétszer lesz benne sz
nincspáros = hamis
egyébként
nn = nn * 10 + sz
ha nincspáros == igaz akkor
kiír -1
vége
// nn-ben fordított sorrendben vannak a számjegyek, fordítsuk vissza
szám = 0 // ebben gyűlik a végleges szám
mialatt nn > 0
sz = nn mod 10
nn = nn div 10
szám = szám * 10 + sz
// szám most már jó:
kiír szám
2
ksdjfskjdn:
Ezzel viszont az a probléma, hogy ha olyan számot olvasok be, ami tartalmazza a 0-t, akkor azt nem duplázza meg.
9 éve0
bongolo:
Dehogynem. Annak is 0 a modulója.
9 éve0
bongolo:
sz*11 olyankor 0 lesz, de az nem baj, mert nn*100 két nullát jelent a szám végén.
9 éve0
bongolo{ }
válasza
Másik, rövidebb megoldás, ha tanultatok rekurziót:
függvény megdupláz(x):
ha x == 0 akkor
visszaad 0
sz = x mod 10 // utolsó számjegy
e = x div 10 // az eleje az utolsó számjegy nélkül (ha egyjegyű szám, akkor 0)
d = megdupláz(e) // az elejében lévő párosakat megduplázzuk
ha sz mod 2 == 0 akkor
visszaad d*100 + sz*11 // sz páros, megduplázzuk
egyébként
visszaad d*10 + sz // sz páratlan, csak 1-szer tesszük bele
program Duplázás:
beolvas n
ha n < 1 akkor
kiír "nem jó szám"
vége
egyébként
nn = megdupláz(n)
// ha egyetlen páros sem volt, nincs duplázva semmi, maradt az eredeti szám:
ha nn == n akkor
kiír -1
egyébként
kiír nn
vége
Módosítva: 9 éve
2
Még nem érkezett komment!
Hipocentrum
válasza
A feladatodban ugye a számok karakterré változtatása a nehéz. Pszeudo kódban nincs unit, amit meghívsz, és lekezeli a konvertálást, neked kell kitalálni.
A ":=" jelenti "legyen egyenlő"-t.
Változók
i,j :egész (ciklusváltozó);
n :egész (bekérendő szám);
s :szöveg;
m,db,e :egész (segédváltozók);
g :végeredmény;
program indul;
m:=1;
db:=0;
ismétel
ki ("add meg az n-t: ");
be(n);
amíg n<1;
amíg (n/m)>=1 ismétel
m:=10*m;
db:=db+1;
ciklus vége;
e:=n;
i:=1;
amíg i<=db ismétel
amikor egészrész(e/10db-i) = /////case - switch vezérlési szerkezet
0:s:=s+"0";
1:s:=s+"1";
2:s:=s+"2";
3:s:=s+"3";
4:s:=s+"4";
5:s:=s+"5";
6:s:=s+"6";
7:s:=s+"7";
8:s:=s+"8";
9:s:=s+"9";
összetett elágazás vége;
e:=e-10abs(i-db);
i:=i+1;
ciklus vége;
j:=1;
amíg j<=hossz(s) ismétel
ha s[j]="6" akkor
i:=hossz(s)+1;
amíg i>j ismétel
s[i]:=s[i-1];
i:=i-1;
ciklus vége;
s[j]:=1;
s[j+1]:=2;
elágazás vége;
ha s[j]="8" akkor
i:=hossz(s)+1;
amíg i>j ismétel
s[i]:=s[i-1];
i:=i-1;
ciklus vége;
s[j]:=1;
s[j+1]:=6;
elágazás vége;
j:=j+1;
ciklus vége;
/////ha szám típusban (mondjuk az elől deklarált g változóban) kell kiíratni, akkor újra számmá konvertáljuk:
i:=0;
amíg i<=hossz(s) ismétel
amikor s[i] =
"0":g:=10*g;
"1":g:=g+1*10hossz(s)-i;
"2":g:=g+2*10hossz(s)-i;
"3":g:=g+3*10hossz(s)-i;
"4":g:=g+4*10hossz(s)-i;
"5":g:=g+5*10hossz(s)-i;
"6":g:=g+6*10hossz(s)-i;
"7":g:=g+7*10hossz(s)-i;
"8":g:=g+8*10hossz(s)-i;
"9":g:=g+9*10hossz(s)-i;
összetett elágazás vége;
i:=i+1;
ciklus vége;
program vége;
Módosítva: 9 éve
0
Hipocentrum:
bocs hogy tagolatlan, a szóközöket nem írja ki az eHázi
9 éve0