www.elektronik.si Seznam forumov www.elektronik.si
Forum o elektrotehniki in računalništvu
 
 PomočPomoč  IščiIšči  Seznam članovSeznam članov  SkupineSkupine  StatisticsStatistika  AlbumAlbum  DatotekeFilemanager DokumentacijaDocDB LinksPovezave   Registriraj seRegistriraj se 
  PravilaPravila  LinksBolha  PriponkePriponke  KoledarKoledar  ZapiskiZapiski Tvoj profilTvoj profil Prijava za pregled zasebnih sporočilPrijava za pregled zasebnih sporočil PrijavaPrijava 

c++

 
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> MS Windows razprave
Poglej prejšnjo temo :: Poglej naslednjo temo  
Avtor Sporočilo
Marcelito
Neznanec
Neznanec



Pridružen-a: Ned 25 Dec 2005 16:04
Prispevkov: 1
Aktiv.: 0.00

PrispevekObjavljeno: Ned Dec 25, 2005 4:08 pm    Naslov sporočila:  c++ Odgovori s citatom

morda ta tema ni za tukaj ampak vseeno...jaz imam težavo pri pisanju naslednjega programa:


Napišite funkcijiji za premikanje bitov 256 bitnih celih števil v levo in desno. Funkciji sprejmeta število shranjeno v polju in v binarni obliki ter število, ki določa za koliko mest želimo bite premakniti. Dodatno napišite še funkcijo za izpis binarnih števil in main funkcijo, v kateri omogočite uporabniku vpis binarnega števila in števila mest premikanja bitov. Na koncu program izpiše rezultata funkcij premikanja.



ne vem kako bi se lotil in če bi mi hoto kdo pomagat se mu najlepše zahvaljujem


lp
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
Sokrat
Član
Član



Pridružen-a: Čet 25 Avg 2005 11:00
Prispevkov: 5584
Aktiv.: 23.56

PrispevekObjavljeno: Ned Dec 25, 2005 5:09 pm    Naslov sporočila:   Odgovori s citatom

Zakaj C++ za nekaj, kar je cisto elementarni C ? Vas predavatelj je zanic.

Ker je naloga nenatancno zastavljena, vsebuje spodnji program nekaj predpostavk:
- pomik je dobesedno pomik (shift) z dopolnjevanjem s prednastavljeno vrednostjo v praznih mestih, ne rotacija (to je enostavno popraviti, ce je misljena rotacija)
- pomik <= 255, sicer operacije sploh ne bi izvajal
- v opisu pise, da funkcija "sprejme" polje kot parameter; to je precej potratno (kazalec nanj bi se razumel, ne pa ravno celega polja), zato je polje namenoma globalno ... ce zeli predavatelj res tako neumnost, jo lahko enostavno dodas sam (typedef za polje in dodas spremenljivko tega tipa med parametre)

Koda:

boolean polje[256];

#define LEVO 1
#define DESNO 2

#define PRAZNO 0 /* ali 1 po zelji */

void rotacija(unsigned char pomik, char smer)
{
unsigned char c;

if ((smer != LEVO) && (smer != DESNO)) return;

for (c = 0; c <= 255; c++)
switch (smer) of {
LEVO:
if (c >= pomik)
polje[c] = polje[c - pomik]
else
polje[c] = PRAZNO;
break;

DESNO:
if (c <= (255 - pomik))
polje[c] = polje[c + pomik]
else
polje[c] = PRAZNO;
break;
}

return;
}


Nekaj takega, upam, da se nisem kje zatipkal.

Robne pogoje in pomik ob izvajanju preveri sam. Izpis je samo ena zanka, ki gre cez celo polje in za vsako 0 izpise 0, za vsako 1 pa 1 ... to bos menda znal sam narediti, sicer si zgresil solo. Vpis stevila je pa tako raztegljiv pojem (vpis brez preverjanja ali s preverjanjem vnosa, v kaksni obliki, itd.), da je vse skupaj samo potrata casa, sploh ker vas predavatelj sili v C++, za katerega (v mnozici dialektov) obstaja cel kup knjiznic komponent, ki tovrstnem zajem omogocajo brez vrstice napisane kode.
Nazaj na vrh
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo
tejko
Član
Član



Pridružen-a: Pet 11 Feb 2005 12:57
Prispevkov: 108
Aktiv.: 0.46
Kraj: Pragersko

PrispevekObjavljeno: Ned Dec 25, 2005 6:13 pm    Naslov sporočila:   Odgovori s citatom

Sokrat, popolnoma se strinjam s tabo, vendar mislim, da naloga le ni tako napačno zastavljena! Vem, da je naloga iz FERI-ja v MB in sicer za prvi letnik. Nalogo bi res da bilo možno narediti v C-ju, v C++ pa že za to obstajajo knjižnice, vendar je po mojem bistvo te naloge razumevanje C++ ter osnovnih operacij nad biti.
_________________
Vseh čarov čar, ELEKTRIČAR!!
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
Sokrat
Član
Član



Pridružen-a: Čet 25 Avg 2005 11:00
Prispevkov: 5584
Aktiv.: 23.56

PrispevekObjavljeno: Pon Dec 26, 2005 2:25 am    Naslov sporočila:   Odgovori s citatom

Aha, MB ... Kakorkoli ze, 'osnovne operacije nad biti' so C in gotovo ne C++. Mislim, da prevajalniki, ki jih predstavljajo nase solske ustanove (M$ sranje), ne poznajo 256-bitnih celih stevil nad katerimi bi lahko operacije nad biti (bitni pomik v tem primeru) dejansko izvajal, zato je primer (po mojem mnenju - kaj pa jaz vem konec koncev, nisem hodil v MB sole pa tudi racunalnicar nisem po izobrazbi) zelo slab. Ce bi bila ideja narediti optimalni algoritem za pomik, bi uporabil manj neucinkoviti memcpy, ampak potem ga (spet) ne bi pisal v C++, ampak najbrz v assemblerju, odvisno od arhitekture pac.

Zankasto kopiranje s preverjanjem pozicije (ali usterza pomiku) v vsaki iteraciji je dalec od optimalne resitve, je pa tudi naloga nenavadno zastavljena (256-bitnih stevil nad katerimi imas namen zganjati operacije ne bos sel pakirati v tako strukturo). Je samo nekoliko bolj pregledno in bo (hopefully) nekoga spodbudilo k lastnemu razmisljanju o boljsih resitvah.

Sam vidim primer bolj kot zahtevo, da dijaki dojamejo abstraktni koncept relativnih odmikov, ki pride prav kasneje ob uporabi bolj kompleksnih (vecdimenzionalnih) struktur in kazalcev, npr. DSP, in se ne ukvarjajo zgolj s fiksnimi odmiki. Vsekakor gre za snov za 1. letnik srednje sole (ko sem se jaz hodil v eno, na zalost spet ne v racunalnisko solo ...) oz. koncne razrede osnovne sole, brez katere nima clovek kaj praskati pri programiranju - ce nekomu abstraktni koncepti ne lezijo, je grdo zgresil smer ... tako kot doticni predavatelj.

Ce bi bilo bistvo te naloge uporaba C++, potem bi bil vmesniski del (2/3 zahtev) narejen z visokonivojskimi komponentami, ki so od nabora knjiznic do drugega razlicne - MFC, Borlandove, itd. - in bi bil enostavno sestavljanje LEGO-kock; to zna poceti mularija in ni nobeno programiranje. Cloveku, ki delcek o pomiku naredi v C++ bolj ucinkovito (hitreje izvajajoce ali pa bolj elegantno), kot bi bila resitev s kopiranjem bloka (memcpy) in masovno postavitvijo preostalih bitov (bzero) v Cju, pa sam castim pivo; po potrebi posljem denar po posti, ce je srecni dobitnik doma predalec. Ponudba velja 24 ur od trenutka objave (1:49 AM, 26. 12. 2005; ja, ura na forumu je narobe nastavljena). Veselo resevanje domace naloge ...
Nazaj na vrh
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo
tejko
Član
Član



Pridružen-a: Pet 11 Feb 2005 12:57
Prispevkov: 108
Aktiv.: 0.46
Kraj: Pragersko

PrispevekObjavljeno: Pon Dec 26, 2005 8:45 am    Naslov sporočila:   Odgovori s citatom

FERI - Fakulteta za elektrotehniko, računalništvo in informatiko. Smile Naloga je za prvi letnik faksa, smer elektrtehnika! Sam sem pred leti reševal podobne naloge in sem prepričan, da sem ravno tu dobil znanja, ki jih danes s pridom uporabljam!
LP Matej

_________________
Vseh čarov čar, ELEKTRIČAR!!
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
KRAPman
Član
Član



Pridružen-a: Sre 23 Nov 2005 14:35
Prispevkov: 115
Aktiv.: 0.49
Kraj: Maribor

PrispevekObjavljeno: Sre Dec 28, 2005 12:15 am    Naslov sporočila:   Odgovori s citatom

Hmm, če moraš pomakniti cifre recimo v levo(skozi carry), brez rotiranja : "odrežeš" cifre, ki so še ostale v polju, torej zadnjih n-števil(jih recimo shraniš v temp. polje[n]), nato nalepiš nazaj v prvotno polje, vendar tokrat na začetek. Ostalim indexom pripišeš vrednost 0. Z rotiranje je podobno : narediš spremenljivko ROTIRAJ_V_LEVO, ki pride v funkcijo kot argument, jo pomnožiš po modulu (torej ROTIRAJ_V_LEVO = ROTIRAJ_V_LEVO%256), saj se rotiranje v tvojem primeru po 256 mestih vrne na prvotno mesto (če torej dovoliš vstavljanje argumenta ki je večji kot 256). Ukrepaš podobno kot v prvem primeru, le da tokrat uporabiš 2 temp. polja velikost n in m (n+m = 256). Ta 2 polja nato samo zamenjaš v prvotnem 256mestnem polju. Poglej prilogo!
( Če že res moreš narediti z polji Very Happy )
Lp



rotiranje.JPG
 Opis:
 Velikost datoteke:  34.24 KB
 Pogledana:  40 krat

rotiranje.JPG


Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
NeoTO
Član
Član



Pridružen-a: Pon 28 Mar 2005 19:19
Prispevkov: 2752
Aktiv.: 11.61
Kraj: Trzic

PrispevekObjavljeno: Sre Dec 28, 2005 9:13 am    Naslov sporočila:   Odgovori s citatom

Za začasno shranjevanje ti je dovolj ena spremenljivka za eno polje, drugega že itak imaš na originalnem mestu!
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo MSN Messenger - naslov
KRAPman
Član
Član



Pridružen-a: Sre 23 Nov 2005 14:35
Prispevkov: 115
Aktiv.: 0.49
Kraj: Maribor

PrispevekObjavljeno: Pet Dec 30, 2005 10:33 pm    Naslov sporočila:   Odgovori s citatom

Da NeoTO še boljše Wink
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
pero
Član
Član



Pridružen-a: Sob 02 Avg 2003 10:03
Prispevkov: 145
Aktiv.: 0.61
Kraj: Sevnica

PrispevekObjavljeno: Sob Dec 31, 2005 3:36 pm    Naslov sporočila:   Odgovori s citatom

@Sokrat pomiri se malo, naloga je sicto na mestu, ker je treba delat z 256 bitnimi števili (ki v osnovi niso podprta), že z 64bitnimi je večinoma problem.

Koda:

class CBigNumber()
{
public:
    CBigNumber( const unsigned char *pNumber, int iLength )
    {
        memcpy( caNumber, pNumber, iLength/8 + 1 );
    };
    void shitf( int iNumber)
    {
        for( int i=0;i<iNumber;i++){
            shiftone();
        }
    };
private:
    void shiftone(){
        for( int i=0; i < sizeof( caNumber;i++ ){
              caNumber[i]<<=1;
              caNumber[i] |= ((caNumber[i+1] & 128)>>7);
        }
    };
    unsigned char caNumber[256/8];
};



neki tazga, da se C++ ponuca.

V soli se itak nikol ne dela optimalno, ampak tako da se kaj noucis.

lp,
Pero

ps.: pa imejte se radi in ne šimfajte
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo Obišči avtorjevo spletno stran
NeoTO
Član
Član



Pridružen-a: Pon 28 Mar 2005 19:19
Prispevkov: 2752
Aktiv.: 11.61
Kraj: Trzic

PrispevekObjavljeno: Sob Dec 31, 2005 3:50 pm    Naslov sporočila:   Odgovori s citatom

Če shiftaš za n mest:
Najprej odrežeš n%8 bitov vsem bajtom, zašiftaš byte za n/8 mest, nato še bite v bytih za n%8 mest, zatem pa še vsem bytom prišteješ prej odrezanih n bitov in imaš.
Po mojem bi bilo tole hitreje kot shiftanje celotne skupine bajtov za n mest, vsakič po 1 pomik.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo MSN Messenger - naslov
KRAPman
Član
Član



Pridružen-a: Sre 23 Nov 2005 14:35
Prispevkov: 115
Aktiv.: 0.49
Kraj: Maribor

PrispevekObjavljeno: Ned Jan 01, 2006 6:59 am    Naslov sporočila:   Odgovori s citatom

pero je napisal/a:
@Sokrat pomiri se malo, naloga je sicto na mestu, ker je treba delat z 256 bitnimi števili (ki v osnovi niso podprta), že z 64bitnimi je večinoma problem.


Saj v polje gre 256 bitov, al ne? 256 enic ali ničel, če prav razumem. Saj 1 in 0 lahko v polje vpisuješ kot za sebe stoječa številka (recimo polje[i] je ena enica ali ena ničla), pri operaciji seštevanje, množenje, itd. pa je čist simpl izvest, samo pač še rabiš eno spremenljivko, ki ti carry out prenaša.
Al je tukaj mišljeno kako drugače 256 bitov?


Aja pa BTW se opravičujem, če sem kakšno čisto neumno ven povedal, je že ura dosti pa se mi mal že blede Confused .

Lp
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
Pokaži sporočila:   
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> MS Windows razprave Časovni pas GMT + 2 uri, srednjeevropski - poletni čas
Stran 1 od 1

 
Pojdi na:  
Ne, ne moreš dodajati novih tem v tem forumu
Ne, ne moreš odgovarjati na teme v tem forumu
Ne, ne moreš urejati svojih prispevkov v tem forumu
Ne, ne moreš brisati svojih prispevkov v tem forumu
Ne ne moreš glasovati v anketi v tem forumu
Ne, ne moreš pripeti datotek v tem forumu
Ne, ne moreš povleči datotek v tem forumu

Uptime: 497 dni


Powered by phpBB © 2001, 2005 phpBB Group