Keresés


Toplista

Toplista
  • betöltés...

Magántanár kereső

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!

Algoritmus

669
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
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.

#include <iostream>
#include <sstream>
#include <cmath>
#include <vector>

using namespace std;

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

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

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: 7 éve
2

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: 7 éve
0