 |
www.elektronik.si Forum o elektrotehniki in računalništvu
|
Poglej prejšnjo temo :: Poglej naslednjo temo |
Avtor |
Sporočilo |
Marcelito Neznanec

Pridružen-a: Ned 25 Dec 2005 16:04 Prispevkov: 1 Aktiv.: 0.00
|
Objavljeno: Ned Dec 25, 2005 4:08 pm Naslov sporočila: c++ |
|
|
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 |
|
 |
Sokrat Član


Pridružen-a: Čet 25 Avg 2005 11:00 Prispevkov: 5584 Aktiv.: 23.56
|
Objavljeno: Ned Dec 25, 2005 5:09 pm Naslov sporočila: |
|
|
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 |
|
 |
tejko Član

Pridružen-a: Pet 11 Feb 2005 12:57 Prispevkov: 108 Aktiv.: 0.46 Kraj: Pragersko
|
Objavljeno: Ned Dec 25, 2005 6:13 pm Naslov sporočila: |
|
|
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 |
|
 |
Sokrat Član


Pridružen-a: Čet 25 Avg 2005 11:00 Prispevkov: 5584 Aktiv.: 23.56
|
Objavljeno: Pon Dec 26, 2005 2:25 am Naslov sporočila: |
|
|
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 |
|
 |
tejko Član

Pridružen-a: Pet 11 Feb 2005 12:57 Prispevkov: 108 Aktiv.: 0.46 Kraj: Pragersko
|
Objavljeno: Pon Dec 26, 2005 8:45 am Naslov sporočila: |
|
|
FERI - Fakulteta za elektrotehniko, računalništvo in informatiko. 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 |
|
 |
KRAPman Član

Pridružen-a: Sre 23 Nov 2005 14:35 Prispevkov: 115 Aktiv.: 0.49 Kraj: Maribor
|
Objavljeno: Sre Dec 28, 2005 12:15 am Naslov sporočila: |
|
|
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 )
Lp
Opis: |
|
Velikost datoteke: |
34.24 KB |
Pogledana: |
40 krat |

|
|
|
Nazaj na vrh |
|
 |
NeoTO Član


Pridružen-a: Pon 28 Mar 2005 19:19 Prispevkov: 2752 Aktiv.: 11.61 Kraj: Trzic
|
Objavljeno: Sre Dec 28, 2005 9:13 am Naslov sporočila: |
|
|
Za začasno shranjevanje ti je dovolj ena spremenljivka za eno polje, drugega že itak imaš na originalnem mestu!
|
|
Nazaj na vrh |
|
 |
KRAPman Član

Pridružen-a: Sre 23 Nov 2005 14:35 Prispevkov: 115 Aktiv.: 0.49 Kraj: Maribor
|
Objavljeno: Pet Dec 30, 2005 10:33 pm Naslov sporočila: |
|
|
Da NeoTO še boljše
|
|
Nazaj na vrh |
|
 |
pero Član

Pridružen-a: Sob 02 Avg 2003 10:03 Prispevkov: 145 Aktiv.: 0.61 Kraj: Sevnica
|
Objavljeno: Sob Dec 31, 2005 3:36 pm Naslov sporočila: |
|
|
@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 |
|
 |
NeoTO Član


Pridružen-a: Pon 28 Mar 2005 19:19 Prispevkov: 2752 Aktiv.: 11.61 Kraj: Trzic
|
Objavljeno: Sob Dec 31, 2005 3:50 pm Naslov sporočila: |
|
|
Č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 |
|
 |
KRAPman Član

Pridružen-a: Sre 23 Nov 2005 14:35 Prispevkov: 115 Aktiv.: 0.49 Kraj: Maribor
|
Objavljeno: Ned Jan 01, 2006 6:59 am Naslov sporočila: |
|
|
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 .
Lp
|
|
Nazaj na vrh |
|
 |
|
|
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
|