HTML

Programozó Páternoszter

Ez a Programozó Páternoszter (PP) blogja, a programozásról szól. Aktualitása, hogy a Debreceni Egyetem Informatikai Kara Magasszintű programozási nyelvek 1-2, C++ esattanulmányok, Java esettanulmányok című kurzusainak blogja is egyben.

A vadászat

A Debreceni Egyetem Programozói Évkönyve: az UDPROG projekt. A szakmai fórumunk a Facebook-en. Az új előadások a prezin.
A régi előadások:
Prog1:
1. C bevezetés
2. C tárgyalás
3. C befejezés
4. C a gyakorlatban
5. C++ bevezetés
6. C++ tárgyalás
7. C++ befejezés
8. C++ a gyakorlatban
9. Java platform bevezetés
10. Kvantuminformatikai alg. bev.
Prog2:
1. Java bevezetés
2. Java tárgyalás
3. Java befejezés
4. Java a gyakorlatban
5. Software Engineering bev.
6. Java EE bevezetés
7. AspectJ bevezetés
8. BPMN-BPEL SOA programozás
9. C++ haladó
10. Tensorflow

Kövess engem!

Friss topikok

Linkblog

Tükröm, tükröm, mondd meg nékem, ki bukik meg e vidéken?

2011.05.08. 11:05 nb

Közeleg az írásbeli vizsga, milyen kérdésekre számítsunk? Íme néhány, nyilván a teljesség igénye nélkül :) Természetesen ezt a posztot arra is felhasználom, hogy belőjjük a kérdések erejét, tehát lehet kommentelni, hogy milyen témákat szeretnénk, esetleg konkrét jó feladatokat is lehet javasolni. Bevallom a Linux kerneles kérdést ide most kicsit provokatívnak szántam :) De lássuk, első nekifutásra milyen kérdéseket dobtam össze:

Ne feledd: a vizsgákon bármi (papíralapú, számítógép vagy akármi) használható, csak beszélni tilos. (Az írásbeli erősen gyakorlati orientációjú, a szóbeli "emberközelibb"

2011. május 11: mivel a vizsgával kapcsolatos szabályozást (hivatali és technikai) okokból erősen felpuhítottuk, így a jegymegajánló feladatait itt megkezdem nehezíteni, bevettem egy Java platformos témakört is... ennek kapcsán érdemes belepillantani a korábbi Oprendszer2 vizsga feladatai közé, onnan másoltam csak ki a feladatokat :)


Kérdések az informatikai kultúra témakörből

Középiskolai informatika tanár vagy, biteztetnéd a tanulóidat, az alábbi példát adod Nekik.
Az alma azonosítójú 2 bájtos számban komplementáld a 2., 5.,  és a 10. bitet!
alma | 0x0424
alma & !0x0424
alma & ~0x00F1 (mert 2+5+10= 17 = 16+1, azaz hexában F1)
alma & ~0x0011 (mert 2+5+10= 17, hexában 11)
alma & ~(0x0424)
alma ^ 0x0424
(help: lásd például 8. ea. ismétlő laborkártya)


Védésed programját az én GNU GPL v3 forrásomat tovább fejlesztve ráépülő munkaként készíted el.
Munkádat kiadhatod:
BSD licenc alatt
csak ugyanazzal, a GNU GPL-el adhatod ki (akkor is, ha más GNU GPL v3 kompatibilis licenccel rendelkező részt is belevettél akár)
BSD vagy GNU GPL licenc alatt
egyáltalán nem adhatod ki, hiszen egyértelműen szerepel benne: Copyright (C) 2011, Bátfai Norbert, nbatfai@inf.unideb.hu
csak a szerző írásos engedélyével adhatod ki, használni természetesen használhatod
csak iskolai projektben használhatod
(help: védések a laborokon)

C-ben a paraméterátadás
a paraméterek fordított sorrendben kerülnek a verembe így a verem tetején az első paraméter lesz, az alján az utolsó, a hívott állítja vissza a vermet
a paraméterek fordított sorrendben kerülnek a verembe így a verem tetején az első paraméter lesz, az alján az utolsó, a hívó állítja vissza a vermet, mert ő tudja mennyit push-olt
a paraméterek fordított sorrendben kerülnek a verembe így a verem tetején az utolsó paraméter lesz, az alján az első, a hívó állítja vissza a vermet, mert ő tudja mennyit push-olt
a paraméterek fordított sorrendben kerülnek a verembe így a verem tetején az utolsó paraméter lesz, az alján az első, a hívott állítja vissza a vermet

(help: ea. fólia vagy direktben)

Kérdések a C programozás témakörből

Bevezetés az informatikába tanár vagy, biteztetnéd a hallgatóidat, az alábbi példát adod Nekik.



Az a azonosítójú int típusú számban (az alma) 2., 5.,  és a 10. bitje
komplementálódik
magasra állítódik
le sem fordul, mert C-ben lehetetlen bináris konstans literálokat megadni...
de meg lehet, mert van ilyen GCC kiterjesztés, nullázz a a kérdéses biteket
az összes bitet nullázza, mert a ~ a kettes komplemens operátor
az összes bitet nullázza, mert a ! egy operandusú operátorral kellett volna az egyes komplemenst előállítani (C-ben ez felel meg a hullámnak)
az előző mindkét válasz igaz (tehát nullázza és ~ az egyes, ! a kettes komplemens operátor)
(help: lásd például 8. ea. ismétlő laborkártya)


Hatáskör kérdés, mit ír ki?

le sem fordul, mert csak a blokk elején lehet deklaráció
le sem fordul, mert nem deklarálhatod újra
a GCC-vel -std=c99 parancssori kapcsolóval lefordul, 55-öt ír ki
a GCC-vel -std=c99 parancssori kapcsolóval lefordul, 5-öt ír ki
lyuk lesz a hatáskörben, ezért 55-öt ír ki
a GCC-vel -std=c++0x parancssori kapcsolóval lefordul, 55-öt ír ki
nem lehet lyuk a hatáskörben, ezért 5-öt ír ki
(help: lásd például 2. ea.)


Statikus belső inicializálása, mit ír ki?

le sem fordul, mert statikust csak az összes függvényen kívül lehet megadni
le sem fordul, mert az fgv azonosító nevű föggvénynek nincs formális paraméterlistája
statikus belsőt nem lehet a függvényben inicializálni, így fordítási hiba
statikus belsőt lehet a függvényben inicializálni, de csak valamelyik kapott paraméterrel (ami hiányzik, így fordítási hiba)
3
0, 1, 2, 3 (vessző nélkül, külön sorokba)
4
5
(help: lásd például 2. ea. laborkártya, II/33)
Függvénymutató, mit ír ki?


0, a felüldefiniálás miatt
0, a túlterhelés miatt
az első és a második is igaz
le sem fordul, mert függvényt nem adhatunk értékül, csak a címét (hiányzik az & operátor)
42, 0 (vessző nélkül, külön sorokba)
42
0-t, mert típusegyeztetés van
(help: lásd például 8. ea. ismétlő laborkártya)

Tárkezelés


a 4 printf-ből az első és a harmadik ugyanazt írja ki:1.000000
a 4 printf-ből az első és a harmadik ugyanazt írja ki:0.750000, az utolsó pedig érvénytelen hivatkozás miatt NULL-t
mind a 4 printf ugyanazt írja ki
csak a 2., 3., 4. printf írja ki ugyanazt
a 4 printf-ből az első, a második és a harmadik ugyanazt írja ki, a negyedik mást
nem fordul le (és semmilyen kapcsolóval sem, syntax error-os)
segfault-os lesz a q miatt

(help: klasszikus laborkártyáink egyike, pici értékadással fűszerezve, lásd a 2 ea.)

Kernel hacker vagy, mit ír ki?
2.6.23-nál elmentél szabadságra, visszajöttél 2.6.37-re, veszed elő a korábbi kernel modulod:

simán megy, a kernel előre mindig kompatibilis
simán megy, a kernel visszafelé mindig kompatibilis
nem fordul le, mert a PCB-ben már nincs sleep_avg tag
nem fordul le, mert a tasks nincs deklarálva
nem fordul le, mert a printf el van írva (azaz szintaktikai hiba miatt)
nem fordul le, mert a tasks és a current nincs deklarálva

(help: http://progpater.blog.hu/2011/02/19/a_fajlleirok_kicsi_egesz_szamok_nem_mondod)

 

Kérdések a C++ programozás témakörből

Referencia típus, mit ír ki?

le sem fordul, mert egy egy C program
a g++ nem tudja lefordítani, mert C program, a gcc meg azért nem, mert C-ben nincs referencia típus
a sekély másolás miatt 6 6 6
a mély másolás miatt 5 5 6
5 aztán egy előre nem tudható szám (memóriacím) aztán ez a szám +4, mert az int típus 4 bájtos
5 aztán egy előre nem tudható szám (memóriacím) aztán ez a szám +az int típus mérete bájtokban az adott rendszeren
(help: lásd például 5., 6. ea. laborkártya)

A hagyományos kódszervezésnél gyakori #ifndef OSZTALYNEV mire használatos tipikusan?

megnézi, hogy az osztályhierarchiában foglal-e az osztálynév, ha nem, akkor inklúdolja a definíciót
ha a header már be van inklúdolva, akkor a makró már definiált lesz, így csak egyszer inklúdálódik a definíció
ha az OSZTALYNEV nem definiált az osztályhierarchiában, akkor fordítási hibával leáll
hiba, a helyes #pragma OSZTALYNEV a hagyományos kódszervezésben
C++-ban tilos az előfeldolgozás, a const-ot kell használni 
C++-ban kerülendő az előfeldolgozás, a const-ot ajánlott használni

(help: lásd azon példákat, ahol a hagyományos kódszervezést követtük: a PolarGen-től a Qt-s példákon át a... :)

Az  std::fstream f ("f", std::ios_base::out); sor
a Linux PCB-ben a processzhez megnyitott fájlok tömbjének indexe becsomagolva egy fstream osztályba
deklaráció és megnyitás is egyben
f egy magas szintű fájlleíró (FILE *)
f egy alacsony szintű fájlleíró (int)
fordítási hiba forrása
futási idejű hiba forrása

(help: ezt minden C++-ben védő tudja, mert használta :)

Öröklődés


a Liskov elv miatt: ahol Szulo lehet, ott lehet leszármazottja is, azaz semmi gond az fgv függvénnyel
nem fordul le, csak ha típuskényszerítjük a paraméterként átadott Gyermek-et Szulo-re
a Gyerek osztálybeli átadása ősét várónak nem probléma (Liskov elv), de a Szulo nem hívhatja a Gyermek új módszerét, ezért nem fordul le
fordítási hiba, mert sérül a Liskov elv a main függvényben
fordítási hiba, mert sérül a Liskov elv az fgv függvényben
futási idejű hibával leáll, mert sérül a Liskov elv

(help: a 7/14 pontosan erről szól, mármint a helyes válaszról :)

Kérdések a Java platform témakörből

Milyen mintázattal kezdődnek a Java bájtkódok?

11001010111111101011101010111110
11001010111111101100101011111110
00000000000000001111111111111111
C000A000F000E000B000A000B000E000
C111A111F111E111B111A111B111E111
11001010111111101100101011111110

 

Java SE bájtkódot Windows alatt elkészítve (javac) a class fájt Linux alá átmásolva futni (java) fog?

Természetesen, ez a bájtkód hordozhatósága.
Nem, csak olyan rendszeren fut (bemenete a JVM-nek) a class, ahol fordítottuk.
Csak a Linux alatti megy a Windowson is, fordítva nem.
A Java forrást Linux alatt újra kell fordítani, mert a Java hordozhetó, nem a .class fájlok!
 Csak, ha natívban cygwin2linux kapcsolóval fordítjuk

Csak java.lang csomag alatti Java SE osztályokat tartalmazó Java program (bájtkód) futni fog a Javás mobilokon és a webszerverben is?

Természetesen, ez a bájtkód hordozhatósága.
Csak a webszerverben, mert az is Java SE.
Linux alatt igen, más rendszereken ez a lehetőség nem támogatott.
Linux alatt, ha a gcj-vel natívban fordítunk.
Természetesen, sőt még LEGO robotokon is a jeJOS JVM-el!
Természetesen, sőt még LEGO robotokon is a jeJOS JVM-el és az Android Javás Google mobilokon is!
Nem fog futni.

A leJOS viselkedés API implementációjában a lejos.robotics.subsumption.Arbitrator-nak

a motorvezérlő szálobjektumokat kell átadni.
viselkedés interfészeket implementáló objektumok tömbjét kell átadni.
az érzékelő figyelő szálobjektumokat kell átadni.
a motorvezérlő és az érzékelő figyelő szálobjektumokat kell átadni.
a motorvezérlő és az érzékelő figyelő szálobjektumok tömbjét kell átadni.

Jó ötlet-e EJB alkalmazásunkban a hatékonyabb működés, azaz a párhuzamos végrehajtás támogatására szálakat létrehozni?

Igen, mindenképpen.
Nem, csakis Stateless Session Bean-ek esetén.
Nem, ez tervezési hiba lenne, mert a végrehajtási szálak az adott rendszerhez kötődnek.
Igen, de csak Stateless Session Bean-ek esetén.

 

 

25 komment

Címkék: linux c kernel gcc cpp c g írásbeli vizsga bináris literál sleep avg referencia típus sekély másolás mély másolás

A bejegyzés trackback címe:

https://progpater.blog.hu/api/trackback/id/tr462886783

Kommentek:

A hozzászólások a vonatkozó jogszabályok  értelmében felhasználói tartalomnak minősülnek, értük a szolgáltatás technikai  üzemeltetője semmilyen felelősséget nem vállal, azokat nem ellenőrzi. Kifogás esetén forduljon a blog szerkesztőjéhez. Részletek a  Felhasználási feltételekben és az adatvédelmi tájékoztatóban.

sz.tamas90 2011.05.09. 13:45:51

4. kérdés: le sem fordul, mert csak a blokk elején lehet deklaráció
5.kérdés:4
6.kérdés:42

nb · http://fersml.blog.hu 2011.05.09. 19:44:09

@sz.tamas90:

> 4. kérdés: le sem fordul, mert csak a blokk

miért? pl. std=c99-el sokszor fordítottunk olyat, ahol "igény szerint" deklaráltunk... -> kipróbáltad?

> elején lehet deklaráció
> 5.kérdés:4

szerintem nem logikus a tipped, hiszen ha már belső, miért ne lehetne inicializálni ott? Itt arra a (laborkártyán is szereplő) finomságra akartam rákérdezni, hogy az =0 megzavarja-e a hallgatót... -> kipróbáltad?

> 6.kérdés:42

hajlok rá, persze, de -> kipróbáltad? :)

sz.tamas 2011.05.09. 23:01:54

@nb: 4.kérdés: le sem fordul, mert nem deklarálhatod újra-jobban átnézve ez a jó válasz :)
5.kérdés: kipróbáltam, begépelte, lefuttattam és 4 lett az eredmény :)
6.kérdés: szintúgy begépelve, lefuttatva és 42 az eredmény

Veyron007 2011.05.10. 08:35:05

Védésed programját az én GNU GPL v3 forrásomat tovább fejlesztve ráépülő munkaként készíted el.
--> csak ugyanazzal, a GNU GPL-el adhatod ki (akkor is, ha más GNU GPL v3 kompatibilis licenccel rendelkező részt is belevettél akár)

Bevezetés az informatikába tanár vagy, biteztetnéd a hallgatóidat, az alábbi példát adod Nekik.
-->komplementálódik

Hatáskör kérdés, mit ír ki?
-->le sem fordul, mert nem deklarálhatod újra

Statikus belső inicializálása, mit ír ki?
-->4

Függvénymutató, mit ír ki?
-->42

Kernel hacker vagy, mit ír ki?
-->nem fordul le, mert a PCB-ben már nincs sleep_avg tag

Referencia típus, mit ír ki?
-->sekély másolás miatt 6 6 6

Veyron007 2011.05.10. 08:39:46

Az alma azonosítójú 2 bájtos számban komplementáld a 2., 5., és a 10. bitet!

Két helyes válasz:
alma & ~(0x0424)
alma & ~0x0424

converter 2011.05.10. 11:56:35

40% C 30% C++ laborkártya jellegű feladat hármas - négyes érdemjegyért, 20% elméleti kérdés + 10% komolyabb feladat négyes - ötösért szerintem a többség számára emészthető lenne. Én a magam részéről a bitezős feladatokat hanyagolnám, de kinek hogy... a GNU GPL, hatáskör, statikus, mutató, referencia feladatok korrektnek tűnnek.

nb · http://fersml.blog.hu 2011.05.12. 20:25:51

@converter: korrekt a koncepciód, az írásbeli vizsga készítése előtt majd átolvasom, de jelen pillanatban a jövő heti "vizsga" jegymegajánlóvá fokozása miatt inkább kicsit nehezítenem kellett rajta. Bár ma hallottam egy olyan tippet, hogy helyes válasz N pont, hibás válasz 0 pont, ha nem nyúl hozzá a hallgató 1 pont... hogy el lehessen kerülni a "karácsonyfa-xelő kalandorokat" :)

A %-os bontás így túl direkt, előre csak az 5%-ot dolgozom majd bele az írásbelik értékelésébe (a jegymegajánlóra ez nem vonatkozik)

A kérdések száma persze lehet valami hasonló %-os:
nagyobbik zöme C
kisebbik zöme C++
vékony szelet informatikai kult
ugyancsak vékony Java platform

De régebben pl. oprendszerből az tipikus volt, hgy kisebb témakörök és lehet jelezni, hogy a hallgató melyikben nem akar "indulni"... még meggondolom, pl.: oprendszer 1: www.inf.unideb.hu/~nbatfai/os/DEIK_MIPPOS_2008tavasz_BN_Betavizsga.pdf

kovdog 2011.05.12. 22:40:52

Kérdés: -Az előadáson nem az hangzott el, hogy a jegymegajánlóra is vonatkozik a +5%, ha az illető eléri a kettes szintet, akkor onnan jön a plusz 5?
-Mennyi idő lesz a vizsga? a) 60perc b)90 perc c)120perc?
-Javaslat: az egész Java témakört nem lehetne kihagyni? --> elég lenne szerintem ezzel a két nyelvvel is megbírkózni !

nb · http://fersml.blog.hu 2011.05.13. 10:46:19

@kovdog: ellenkezőleg, a jegymegajánlón nincs 5%, az az írásbeli vizsgákon van: progpater.blog.hu/2011/05/11/don_t_forget_to_breathe

de egyébként is keverednek Nálad a dolgok, mert az írásbeli vizsgákon (nem a jegymegajánlón) az kapja a 5%-ot, aki látogatta az órákat, a kettestől jobbság a +1+2+3 jegy inkrementátorok használhatóságához kell.

Kb. 100 perc lesz, feladatok számát majd hétvégén tudom megmondani.

Javából nem kérek nyelvi dolgokat nyilván, csak a platformmal kapcsolatosakat. Nem érzem, hogy kölönösebben vissza kéne fogni magam, hiszen most a jegymegajánlóról beszélünk, nem a sztenderd vizsgáról. (A Java platform mégis könnyebb, mint a kernal hacking, nem :)

Logos 2011.05.30. 16:46:45

Helló!

Lenne egy kérdésem:

A függvénymutatónál miért fordul le a forrás? Mert csináltunk egy FGV típust, ami intet vár, de mi double-t adunk neki a printf-nél (param). Hogy van ez?

Logos 2011.05.30. 18:04:36

Valamint:

Mit jelent az, hogy:
- biteket magasra állít
- hulláz

(A jegymegajánlónál voltak)

Köszi

Logos 2011.05.30. 18:18:21

Még egy: :)

Ha a main-t így deklarálom:

int main (void) az ugyanaz, mint int main () ?

Logos 2011.05.30. 18:31:22

És ha például:

static int stat = -100;

int fgv () {

static int stat = 0;
return ++stat;

}

Ez miért nem számít újradeklarálásnak?

nb · http://fersml.blog.hu 2011.05.30. 18:51:52

@Logos: ilyesmi példa-mutáns volt a jegymegajánlón is: www.inf.unideb.hu/~nbatfai/jegymeg_utolagWebre.pdf

www.freeweb.hu/kr-c/files/04.html -ből a "4.6. A statikus változók" és a "4.9. Változók inicializálása" segít a válaszban?

nb · http://fersml.blog.hu 2011.05.30. 18:58:00

@Logos: a fgv. formális paraméterlistás kérdése kapcsán C-ben vagy C++-ban kérdezed? :)

nehogy.fw.hu/wp-content/uploads/Prog1_1.pdf / 47. fólia kapcsolódó kérdését kipróbáltad?

Logos 2011.05.31. 14:58:36

@nb: C++ -ban ugyanaz, C-ben pedig a void nem engedi meg a paraméterek átadását?

Kipróbáltam, g++ -al le sem fordul, gcc-vel igen (de, ha leveszem a kommentet a második void2 elől, akkor gcc-vel sem)

Logos 2011.05.31. 15:03:30

@nb: A statikus változókat és az inicializálást elolvastam, de nem sokat segített...
Annyit értek, hogy a statikus változó a program teljes élettartama alatt megmarad, és ha függvényen belül deklaráljuk, akkor más függvények nem férhetnek hozzá (hiába tűnik globálisnak).

Logos 2011.05.31. 15:07:03

A jegymegajánló példáján viszont van egy globális stat néven és egy lokális a függvényen belül ugyancsak stat néven. így nem deklaráljuk kétszer?

nb · http://fersml.blog.hu 2011.06.02. 09:35:19

@Logos:

C-ben a fgv(üres lista), azaz fgv() olyan fgv.-t jelöl, amit tetszőleges számú paraméterrel lehet hívni

C++-ban a fgv(üres lista), azaz fgv() ez a fgv.-t jelöli: fgv(void)

(aki az elejéhez ezt is forgatja: ez a Pici prog jegyzetben hiányosan van pl., mert a ...-os, a vaarg-os témánál vett konstrukciót említik csak)

de tegyél egy villámgyors próbát:

#include <stdio.h>

int
fgv ()
{
return 42;
}

int
main (void)
{

printf ("%d\n", fgv (1, 2, 3, 4, 5));
return 0;
}

[norbi@sgu C]$ gcc -Wall uresparamlist.c -o uresparamlist
[norbi@sgu C]$ ./uresparamlist
42

nb · http://fersml.blog.hu 2011.06.02. 09:37:16

@nb: ja a Pici jegyzetben az említett rész a 97. o. De ez a téma a kurzus BME-s tankönyvének első oldala, a 3. oldal!

nb · http://fersml.blog.hu 2011.06.02. 19:16:57

@Logos: itt az a jó módszer, ha a jegymegajánló szóban forgó példájába beteszed a jelen poszt 4. kérdésének kiíratását vagy valami hasonlót, ami szépen kiírja, hogy mi a kérdezett magasra és alacsonyra állítás (ami egyébként is az, amit intuíciusan elvársz: 1-re a magas, 0-ra az alacsonyra állítás azoknak a biteknek, amiket a maszk meghatároz).

vlacka 2011.06.04. 15:37:33

Üdv Tanár Úr.

A csoporttársaimmal értekeztem, és ők is úgy gondolják, hogy a kernel hackeres feladat nem mindenkinek fekszik(nehezített jegymegajánlón volt).
Szóval C és C++ témák valószínűleg több embernek fekszene.

A hétfői vizsgán hasonló típusú feladatok várhatóak, mint amit ebben a posztban kiírt tanár úr?

nb · http://fersml.blog.hu 2011.06.04. 18:45:37

@vlacka: már az ebben a posztban kitett példákra is igaz volt, hogy a jegymegajánló az itt bedobott kódokat variálja zömében: progpater.blog.hu/2011/05/18/linus_torvalds_nem_volt_a_jegymegajanlon

ugyanezzel a heurisztikával fogtam neki ma a hétfői feladatbázis összeállításának és örömmel szivárogtathatom, hogy készen vannak :) Nekem tetszik, de kicsit későn írtok, így azért van benne Linux kernel hacking :) De nézzétek meg, akinek van egy Linuxa, az azonnal tudja hekkelni ezeket az egyszerű modulokat: progpater.blog.hu/2011/02/19/a_fajlleirok_kicsi_egesz_szamok_nem_mondod
süti beállítások módosítása