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

A tizedik (tizenegyedik) labor

2011.04.17. 14:49 nb

Laborvezetőknek

Szerdáig továbbra is a (logikailag) első hat előadás laborkártyái közül válogatva kérdezzük végig a hallgatóságot!  Arra külön figyeljünk, hogy aki nem tudott egy kártyát, az mindenképpen kapjon a következő laboron is! Innentől a laborokon a fő feladat a hallgatók egyéni védése, de ahogy az idő engedi, illetve az önállóan vadászók számára lejjebb a szokásos módon kínáljuk a tematikát.

Hallgatóknak

Nagyon hatékony előre készülni a laborra, sokan és sok trófeát szereznek így! Viszont immár a főtéma: szezonja van a teljesítés egyik szükséges feltétele megvédésének. A C++ megoldás választását javaslom! Ezt támogatandó egy minimális (de a beszámoló szempontjából teljes) felkommentezett változat elérhető korábbi Együtt támadjuk meg című posztunkban. Ugyanitt találjátok a "mintát", amire lehet tesztelni a saját megoldásokat.

Tematika

Az alábbi témák legtöbbjét próbáljuk lefedni a "10/11" gyakorlaton:

BN laborján

  • Ha bérkinek kérdése van (a közelgő védése kapcsán is persze) a Együtt támadjuk meg forrásával kapcsolatban, azt válaszoljuk meg.
  • Tegyük lehetővé, hogy a felépített LZW fának ne kelljen explicite a szabadit() üzenetet küldeni, hogy a szabad tárban allokált területeket felszabadítsuk (első kettőnek 1 trófea; tk. a fa destruktorába tegyük a szabadítás megfelelő hívását)!
  • "Kivételkezeléssel" javítsuk a kódot az állománykezelés tekintetében: egy trófeáért az első két hallgató észreveheti, ha a bemenő fájl nem létezik:
    nbatfai@hallg:~$ g++ z3a2.cpp -o z3a2
    nbatfai@hallg:~$ ./z3a2 z3a2.cp -o kimenet
    z3a2.cp nem letezik...
    Usage: lzwtree in_file -o out_fil
    sima if és adjunk vissza -3 értéket az oprendszernek (help: B&L 86. o.).
  • már nem az elején vagyunk, az ide-oda történő "bit-tologatást" egyszerűsítsük:
        while (beFile.read ((char *) &b, sizeof (unsigned char))) {
    	// egyszerűen a korábbi d.c kódját bemásoljuk
    	// laboron többször lerajzoltuk ezt a bit-tologatást: 
    	// a b-ben lévő bájt bitjeit egyenként megnézzük
            for (int i = 0; i < 8; ++i)
            {
    	    // maszkolunk eddig..., most már simán írjuk az if fejébe a legmagasabb helyiértékű bit vizsgálatát
    	    // csupa 0 lesz benne a végén pedig a vizsgált 0 vagy 1, az if megmondja melyik:
                if (b & 0x80)
    		// ha a vizsgált bit 1, akkor az '1' betűt nyomjuk az LZW fa objektumunkba
                    binFa << '1';
                else
    		// különben meg a '0' betűt:
                    binFa << '0';
                b <<= 1;
            }
    
        }
    

 

26 komment

Címkék: labor

A bejegyzés trackback címe:

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

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.

Logos 2011.04.19. 08:28:38

/* Varga Gábor - beadandó */

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <math.h>

int melyseg = 0, max_melyseg = 0, atlagosszeg = 0, atlagdarab = 0;
double szoras = 0.0, szorasosszeg = 0.0, atlag = 0.0;

typedef struct binfa
{
int ertek;
struct binfa *bal_nulla;
struct binfa *jobb_egy;
}
BINFA, *BINFA_MUTATO;

BINFA_MUTATO uj_elem ()
{
BINFA_MUTATO mutato;

if ((mutato = (BINFA_MUTATO) malloc (sizeof (BINFA))) == NULL)
{
perror ("Nincs eleg memoria.\n");
exit (EXIT_FAILURE);
}

return mutato;
}

extern void kiir (BINFA_MUTATO elem, FILE *fp_kimeneti);
extern void szabadit (BINFA_MUTATO elem);
extern void atlagot_szamol (BINFA_MUTATO elem);
extern void szorast_szamol (BINFA_MUTATO elem);

/*
=====================
BINFA ÉPÍTÉSE
=====================
*/

int binaris_fa_rajzol (char *kimeneti_fajl)
{
char buffer;
FILE *fp_binaris;
FILE *fp_kimeneti;

BINFA_MUTATO gyoker = uj_elem ();
gyoker -> ertek = '/';
BINFA_MUTATO fa = gyoker;

gyoker -> bal_nulla = NULL;
gyoker -> jobb_egy = NULL;

fp_binaris = fopen ("binaris_fajl", "r");
fp_kimeneti = fopen (kimeneti_fajl, "w");

if (fp_kimeneti == NULL)
{
printf ("Nem sikerult letrehozni a kimeneti fajlt.\n");
return 1;
}

while (!feof (fp_binaris))
{
buffer = fgetc (fp_binaris);

if (buffer == '0')
{
if (fa -> bal_nulla == NULL)
{
fa -> bal_nulla = uj_elem ();
fa -> bal_nulla -> ertek = 0;
fa -> bal_nulla -> bal_nulla = NULL;
fa -> bal_nulla -> jobb_egy = NULL;
fa = gyoker;
}
else
fa = fa -> bal_nulla;
}
else
{
if (fa -> jobb_egy == NULL)
{
fa -> jobb_egy = uj_elem ();
fa -> jobb_egy -> ertek = 1;
fa -> jobb_egy -> bal_nulla = NULL;
fa -> jobb_egy -> jobb_egy = NULL;
fa = gyoker;
}
else
fa = fa -> jobb_egy;
}
}

fputs ("\n", fp_kimeneti);
kiir (gyoker, fp_kimeneti);

melyseg = atlagosszeg = atlagdarab = 0;

/* ÁTLAG */
atlagot_szamol (gyoker);
atlag = ((double) atlagosszeg) / atlagdarab;

melyseg = atlagosszeg = atlagdarab = 0;
szorasosszeg = 0.0;

/* SZÓRÁS */
szorast_szamol (gyoker);

if (atlagdarab - 1 > 0)
szoras = sqrt (szorasosszeg / (atlagdarab - 1));
else
szoras = sqrt (szorasosszeg);

fputs ("\n", fp_kimeneti);

fprintf (fp_kimeneti, "melyseg = %d\n", max_melyseg - 1);

fprintf (fp_kimeneti, "atlag = %f\n", atlag);

fprintf (fp_kimeneti, "szoras = %f\n", szoras);

szabadit (gyoker);

fclose (fp_binaris);
fclose (fp_kimeneti);

return 0;
}

/*
=====================
BINFA KIÍRATÁSA
=====================
*/

void kiir (BINFA_MUTATO elem, FILE *fp_kimeneti)
{
if (elem != NULL)
{
int i;

++melyseg;

if (max_melyseg < melyseg)
max_melyseg = melyseg;

kiir (elem -> jobb_egy, fp_kimeneti);

for (i = 0; i < melyseg; ++i)
fputs ("---", fp_kimeneti);

if (elem -> ertek < 2)
fprintf (fp_kimeneti, "%c (%d)\n", ('0' + elem -> ertek), melyseg - 1);
else
fprintf (fp_kimeneti, "%c (%d)\n", (elem -> ertek), melyseg - 1);

kiir (elem -> bal_nulla, fp_kimeneti);

--melyseg;
}
}

/*
=====================
MEMÓRIA FELSZABADÍTÁS
=====================
*/

void szabadit (BINFA_MUTATO elem)
{
if (elem != NULL)
{
szabadit (elem -> jobb_egy);
szabadit (elem -> bal_nulla);
free (elem);
}
}

/*
=====================
ÁTLAG ÉS SZÓRÁS
=====================
*/

void atlagot_szamol (BINFA_MUTATO elem)
{
if (elem != NULL)
{
++melyseg;
atlagot_szamol (elem -> bal_nulla);
atlagot_szamol (elem -> jobb_egy);
--melyseg;

if (elem -> bal_nulla == NULL && elem -> jobb_egy == NULL)
{
++atlagdarab;
atlagosszeg += melyseg;
}
}
}

void szorast_szamol (BINFA_MUTATO elem)
{
if (elem != NULL)
{
++melyseg;
szorast_szamol (elem -> bal_nulla);
szorast_szamol (elem -> jobb_egy);
--melyseg;

if (elem -> bal_nulla == NULL && elem -> jobb_egy == NULL)
{
++atlagdarab;
szorasosszeg += ((melyseg - atlag) * (melyseg - atlag));
}
}
}

/*
=====================
BITEKRE BONTÁS
=====================
*/

int bitekre_bont (char *bemeneti_fajl)
{
int i, egy_e;
int mennyit_olvas_index = 0, mennyit_olvas = 10 * 1024 * 1024;
unsigned char buffer;

FILE *fp_bemeneti;
FILE *fp_binaris;

fp_bemeneti = fopen (bemeneti_fajl, "r");
fp_binaris = fopen ("binaris_fajl", "w");

if (fp_bemeneti == NULL)
{
printf("Nem sikerult megnyitni a bemeneti fajlt.\n");
return 1;
}

while (!feof (fp_bemeneti))
{
buffer = fgetc (fp_bemeneti);

for (i = 0; i < 8; ++i)
{
egy_e = buffer & 0x80;

if ((egy_e >> 7) == 1)
fputc ('1', fp_binaris);
else
fputc ('0', fp_binaris);

buffer <<= 1;
}

if (++mennyit_olvas_index == mennyit_olvas)
break;
}

fclose (fp_bemeneti);
fclose (fp_binaris);

return 0;
}

/*
=====================
MAIN
=====================
*/

int main (int argc, char *argv[])
{
if ((argc != 4) || (argv[2][0] != '-') || (argv[2][1] != 'o') || (argv[2][2] != '\0'))
{
printf ("Hasznalat: %s \"bemeneti fajl\" -o \"kimeneti fajl\"\n", argv[0]);
return 1;
}

bitekre_bont (argv[1]);
binaris_fa_rajzol (argv[3]);

return 0;
}

Logos 2011.04.19. 08:57:23

Az forrást az eredeti z.c-ből és d.c-ből (progpater.blog.hu/2011/02/19/gyonyor_a_tomor),
valamint az
aktualis z.c -ből (progpater.blog.hu/2011/03/05/labormeres_otthon_avagy_hogyan_dolgozok_fel_egy_pedat)
vettem és azt egészítettem ki.

Logos 2011.04.19. 09:11:15

A main felett a két sort:
if (++mennyit_olvas_index == mennyit_olvas)
break;
ki kell kommentelni, ha csak a 10 megás fájlt kell feldolgozni.

Logos 2011.04.21. 08:48:16

Újra kipróbáltam, kivettem a forrásból a 10 megát olvasó részt, tehát a teljes bemeneti fájlt beolvassa, de még így is vannak eltérések és nem tudom, mi a hiba. Kérem, valaki segítsen mert így esélyem sincs megvédeni a programot.

melyseg = 408
atlag = 57.124355
szoras = 9.451429

Itt a 10 megás fájl pontos mérete (amit a mutáns d.c-vel csináltam): 10485760

nb · http://fersml.blog.hu 2011.04.21. 09:19:37

@Logos: a méret OK:
-rw-rw-r--. 1 norbi norbi 10485760 ápr 14 18.42 C/tcag/hs_alt_Hs_Celera_chr2.fa.10mega

1. a poszt C progiját ráengeded az inputodra, mit kapsz?

2. ha a Te és a poszt kódja a 3. tizedesben mutatja a különbséget, akkor ha összeveted a forrást, találsz olyan eltérést, ami okozhatja?

és is ezeket csinálnám, de ha elküldöd a forrásod, belepillantok. Mert nem könnyű összevetni, ha a C-t csinálod, mert az nincs a bináris inputra kitéve.

Logos 2011.04.21. 18:09:47

@nb: a poszt z.c -je működik, valamint a c++ -os verzió is jó. A forrásom itt van ezen a poszton (fent). Az első dolog amire gondoltam, az hogy a változókat a program elején globálisan deklaráltam, de azokat is átírtam úgy, ahogy a blogon van és még így sem működik rendesen.

Painkiller19910110 2011.04.22. 10:36:46

Lenne egy olyan kérdésem a Tanár Úrhoz, hogy megoldható e hogy ne én legyek a 200. aki átírva a függvényneveket az önét küldi vissza. Ez alatt azt értem hogy lehet e más témába beadni programot mint teljesítés feltétele?

nb · http://fersml.blog.hu 2011.04.22. 10:49:55

@Painkiller19910110: az olyan esetekben, amikor csak néhány nevet kell átírni, sokszor az is a célom. Sőt sok olyan van, ahol még át sem kellett írni. De van bőven olyan is (tipikusan a magas pontszámosak) ahol semmi kódot nem adtam segítségül (de várható oda is segítség, ha az előadás odáig jut).

Ars poeticám, hogy a hallgató lásson pár mintát és azt replikálják, prog1 esetén ezt nem érzem didaktikai szempontból problémásnak.

"Saját" feladatokat is el tudok fogadni, ha előre egyeztetjük és tudok belőle olyan változatot kiírni, amit egyrészt megfelelőnek találok a tematika szempontjából, másrészt nyilvánosan mindenki számára esély van az elkészítésére (mert ugye verseny van "hegylakó" szabállyal stb.)

Tőled mintha viszont még várnék BB-s feladatokat, nem?

Painkiller19910110 2011.04.22. 13:05:06

@nb: A BB-s feladatokat már nem csinálom.
Saját készítésű beadandóban meg abban gondolkoztam hogy nem feltétlen a sablon dumppel megoldani a bitekké átalakítást, illetve nem bináris fa építése hanem valamilyen más fajtájú készítése. A dumpolást Hash függvénnyel megoldani stb...
Ezeken még morfondírozom..

sency 2011.04.23. 17:35:59

Valaki legyen szíves segítsen belerakni a destruktort. ("BN laborján" második feladat.) Küzdök vele, de nem akar sikerülni.
Köszi!

kecske20 2011.04.23. 19:26:24

@sency:

LZWBinFa (): fa(&gyoker) {} <-- ez a konstruktor, a program elején van. Ez után kell írni a destruktort. Ez így néz ki:
~LZWBinFa () {}

A 2 {} jel közé kell írni, mit akarsz csinálni. Jelen esetben a szabadítást, tehát:
szabadit (gyoker.egyesGyermek());
szabadit (gyoker.nullasGyermek());

A MAIN-ből is ki lehet venni a szabadit()-t, mivel nincs rá már szükségünk, a destruktor mostmár megcsinálja nekünk (binFa.szabadit (); erről van szó). Bárhova lehetne írni a class LZWBinFa public részén belül, de célszerű a konstruktor után írni. Így égyértelmű és biztos.

nb · http://fersml.blog.hu 2011.04.23. 20:27:14

@Logos: első pillantásra:

buffer = fgetc (fp_binaris);

nem kéne, ez intet ad vissza, casolni fog... legyen alacsony szintem egy bájt beolvasása, ami eddig tetszett: open/read és int állományleíró (már volt ilyen védés is)

Hajdugabi 2011.04.24. 14:48:56

Én a második feladat megoldását szeretném megkérdezni, mert lemaradtam róla órán!
Köszönöm szépen!

Hajdugabi 2011.04.24. 15:25:10

@Hajdugabi: Bocsánat rosszul írtam: "Kivételkezeléssel" javítsuk a kódot az állománykezelés tekintetében: egy trófeáért az első két hallgató észreveheti, ha a bemenő fájl nem létezik" Erre lennék kíváncsi!
Köszönöm

phloriaN 2011.04.25. 15:36:46

"Kivételkezeléssel" javítsuk a kódot az állománykezelés tekintetében: egy trófeáért az első két hallgató észreveheti, ha a bemenő fájl nem létezik:

noob.hu/2011/04/25/Screenshot-3.png

Hajdugabi 2011.04.25. 19:45:56

Köszönöm szépen a segítséget, de le tudnád kicsit részletesebben írni, h hogy oldottad meg, mert nekem az ifstreamet ismeretlen változónak tekinti pedig includolva van az iostream és az fstrem is!
köszi

Logos 2011.04.25. 20:11:45

@nb: Igen, otthon próbáltam: észrevettem, hogy a beolvasásnál van a hiba, de nem tudok más alternatívát. Részletesebben ki tudná fejteni, hogy alacsony szinten hogyan olvassak (read-del)? Laboron láttam Joe forrásánál, hogy ő is úgy valósította meg. De "sima" read-del csak stdin-ről stdout-ról, vagy stderr-ről tudok olvasni. Vagy valamit rosszul tudok?

Logos 2011.04.25. 20:13:51

Próbáltam még az fread-del is, de ott nem tudom mire való az nmemb.

phloriaN 2011.05.02. 20:21:21

Érdeklődni szeretnék hogy mi a helyzet ezzel a feladattal?

...
"Kivételkezeléssel" javítsuk a kódot az állománykezelés tekintetében: egy trófeáért az első két hallgató észreveheti, ha a bemenő fájl nem létezik:
noob.hu/2011/04/25/Screenshot-3.png
...

Rajtam kivül még senki se küldte be, de pontot még nem kaptam érte.

nb · http://fersml.blog.hu 2011.05.03. 15:39:15

@phloriaN: most dolgozom fel a kommenteket, ezt mintha már beírtam volna...

phloriaN 2011.05.03. 17:57:48

Egy jóideje 18 pontom volt. Azután beküldtem ezt valamint a lefotózott kurzustérképet így most jól mutatja a doboz a pontjaimat. Köszönöm a korrigálást és elnézést a türelmetlenkedésért.
süti beállítások módosítása