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

There is no spoon*

2011.03.05. 17:20 nb

Három kisbajnokság annak, aki először megírja külső változó(k) nélkül az előző poszt alábbi függvényét: 

void
kiir (BINFA_PTR elem)
{
  if (elem != NULL)
    {
      ++melyseg;
      if (melyseg > max_melyseg)
	max_melyseg = melyseg;
      kiir (elem->jobb_egy);
      // ez a postorder bejáráshoz képest
      // 1-el nagyobb mélység, ezért -1
      for (int i = 0; i < melyseg; ++i)
	printf ("---");
      printf ("%c(%d)\n", elem->ertek < 2 ? '0' + elem->ertek : elem->ertek,
	      melyseg-1);
      kiir (elem->bal_nulla);
      --melyseg;
    }
} 

(Itt ugye külső a melyseg és a max_melyseg.) Az új fgv. ez legyen: int kiir_r(BINFA_PTR elem, int melyseg) többet nem segítek :) A két függvénynek (kiir, kiir_r) természetesen ugyanazt kell adnia ugyanazon mintákra: maximális mélységre és ugyanazt a fát kell kiprintelniük!

*: http://www.imsdb.com/scripts/Matrix,-The.html

23 komment

A bejegyzés trackback címe:

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

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.

tkolok 2011.03.22. 13:41:17

A kisbajnokság megoldása során egy ilyen hibaüzenetre "leltem" ennél a feladatnál!
Nem tudod Norbi, hogy mi lehet a probléma?

/tmp/cc0FkhdM.o: In function `main':
kisbajnoksag.c:(.text+0x241): undefined reference to `sqrt'
kisbajnoksag.c:(.text+0x259): undefined reference to `sqrt'
collect2: ld returned 1 exit status

tkolok 2011.03.22. 13:52:59

Erre a problémára már megtaláltam a megoldást, de viszont most lenne egy olyan, hogy nem tudok rájönni, hogy a program meddig is olvas!:)

nb · http://fersml.blog.hu 2011.03.22. 14:30:36

@tkolok: -ml (matek könyvtár "hozzálinkelése")

nb · http://fersml.blog.hu 2011.03.22. 14:31:18

erre gondolsz?

while (read (0, (void *) &b, 1))

tkolok 2011.03.22. 14:47:44

@nb: Igen erre gondoltam!:) De megoldottuk, úgy, hogy X-ig olvasson, nem tudom, hogy ez probléma-e?!

nb · http://fersml.blog.hu 2011.03.22. 14:51:16

man 2 read:

"On success, the number of bytes read is returned (zero indicates end of file),"

tehát addig olvas, amig van mit :)

tkolok 2011.03.22. 17:10:54

Készen van a kód külső változók nélkül, hova küldjem ezt el Norbi, vagy esetleg posztoljam valahova?

tkolok 2011.03.22. 17:34:57

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

typedef struct binfa
{
int ertek;
struct binfa *bal_nulla;
struct binfa *jobb_egy;

} BINFA, *BINFA_PTR;

BINFA_PTR
uj_elem ()
{
BINFA_PTR p;

if ((p = (BINFA_PTR) malloc (sizeof (BINFA))) == NULL)
{
perror ("memoria");
exit (EXIT_FAILURE);
}
return p;
}

extern int kiir (BINFA_PTR elem, int mely);
extern void ratlag (BINFA_PTR elem);
extern void rszoras (BINFA_PTR elem);
extern void szabadit (BINFA_PTR elem);

double sqrt2(double x)
{ double gyok;
double epsilon = 1e-10;

if(x<0) return -1; // legyen ez a hiba, lehet finomabban is...

gyok = x/2;
while(gyok * gyok < x-epsilon || gyok * gyok > x+epsilon)
gyok = (gyok + x/gyok)/2;

return gyok;
}

int
main (int argc, char **argv)
{
char b;

BINFA_PTR gyoker = uj_elem ();
gyoker->ertek = '/';
gyoker->bal_nulla = gyoker->jobb_egy = NULL;
BINFA_PTR fa = gyoker;

while (read (0, (void *) &b, 1))
{
// write (1, &b, 1);
//if (b=='X') break;
if (b == '0')
{
if (fa->bal_nulla == NULL)
{
fa->bal_nulla = uj_elem ();
fa->bal_nulla->ertek = 0;
fa->bal_nulla->bal_nulla = 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 = fa->jobb_egy->jobb_egy = NULL;
fa = gyoker;
}
else
{
fa = fa->jobb_egy;
}
}
}

printf ("\n");

extern int max_melyseg, atlagosszeg, melyseg, atlagdb;
extern double szorasosszeg, atlag;
max_melyseg=kiir (gyoker, 0);
//if (melyseg>max_melyseg) max_melyseg=melyseg;

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

/* Átlagos ághossz kiszámítása */
atlagosszeg = 0;
melyseg = 0;
atlagdb = 0;
ratlag (gyoker);
// atlag = atlagosszeg / atlagdb;
// (int) / (int) "elromlik", ezért casoljuk
// K&R tudatlansági védelem miatt a sok () :)
atlag = ((double)atlagosszeg) / atlagdb;

/* Ághosszak szórásának kiszámítása */
atlagosszeg = 0;
melyseg = 0;
atlagdb = 0;
szorasosszeg = 0.0;

rszoras (gyoker);

double szoras = 0.0;

if (atlagdb - 1 > 0)
szoras = sqrt2( szorasosszeg / (atlagdb - 1));
else
szoras = sqrt2 (szorasosszeg);

printf ("altag=%f\nszoras=%f\n", atlag, szoras);

szabadit (gyoker);
return 0;
}

// a Javacska ONE projekt Hetedik Szem/TudatSzamitas.java mintajara
// sourceforge.net/projects/javacska/
// az atlag() hivasakor is inicializalni kell oket, a
// a rekurziv bejaras hasznalja
int atlagosszeg = 0, melyseg = 0, atlagdb = 0;

void
ratlag (BINFA_PTR fa)
{

if (fa != NULL)
{
++melyseg;
ratlag (fa->jobb_egy);
ratlag (fa->bal_nulla);
--melyseg;

if (fa->jobb_egy == NULL && fa->bal_nulla == NULL)
{

++atlagdb;
atlagosszeg += melyseg;

}

}

}

// a Javacska ONE projekt Hetedik Szem/TudatSzamitas.java mintajara
// sourceforge.net/projects/javacska/
// az atlag() hivasakor is inicializalni kell oket, a
// a rekurziv bejaras hasznalja
double szorasosszeg = 0.0, atlag = 0.0;

void
rszoras (BINFA_PTR fa)
{

if (fa != NULL)
{
++melyseg;
rszoras (fa->jobb_egy);
rszoras (fa->bal_nulla);
--melyseg;

if (fa->jobb_egy == NULL && fa->bal_nulla == NULL)
{

++atlagdb;
szorasosszeg += ((melyseg - atlag) * (melyseg - atlag));

}

}

}

//static int melyseg = 0;
int max_melyseg = 0;

int
kiir (BINFA_PTR elem, int mely)
{
int i, x_melyseg, bal=0, jobb=0;
if (elem != NULL)
{
++mely;
if (mely > x_melyseg)
x_melyseg=mely;
jobb=kiir (elem->jobb_egy, mely);
// ez a postorder bejáráshoz képest
// 1-el nagyobb mélység, ezért -1
for (i = 0; i < mely; ++i) {
printf ("---"); }
printf ("%c(%d)\n", elem->ertek < 2 ? '0' + elem->ertek : elem->ertek,
mely-1);
bal=kiir (elem->bal_nulla, mely);
--mely;
if (bal>jobb) jobb=bal;
}else jobb=mely;
return jobb;

}

void
szabadit (BINFA_PTR elem)
{
if (elem != NULL)
{
szabadit (elem->jobb_egy);
szabadit (elem->bal_nulla);
free (elem);
}
}
A linket mindjárt küldöm!

tkolok 2011.03.22. 17:52:28

data.hu/get/3641163/kisbajnoksag.rar
A két program futtatási eredményéről egy kép, azért megy X-ig a program,hogy össze lehessen hasonlítani az eredményt, hogy ugyan az-e.

nb · http://fersml.blog.hu 2011.03.23. 14:21:14

@tkolok: jó a kép, de a teljes inputra hasonlítsuk! Nyomd ki fájlba a kimenetet és a végét nézzük meg! Vagy mi a gond a 2. kromoszómával, mint inputtal?

Minek kell az sqrt2-es móka? Ez nem világos nekem.

tkolok 2011.03.23. 20:06:52

01111001001001000111 Kromoszóma utáni futási eredmény, kiírva egy txt file-ba.
Ezt lefényképezve:
data.hu/get/3645811/kisbajnoksag.jpg
Nincs gond a 2. Kromoszómával, az sqrt2-t csak azért használtam mert futtatásnál hibát jelzett az sqrt-re, így pedig nem.:)
Köszönöm a segítségeket, remélem így már jó lesz a kód!:)

nb · http://fersml.blog.hu 2011.03.23. 20:15:47

@tkolok: milyen hiba? Mi van a képen? A 2. kromóra nem sokkal nagyobb fának kéne lennie?

tkolok 2011.03.23. 20:28:15

@nb: Lehet félreértettem a dolgot, a Kromoszóma alatt én a 01111001001001000111 bináris számsort értettem, a program ezt a futási eredményt adta, a kódon nem változtattam, csak a (külső változókon), a futási eredmény így ugyan az lett mint az eredeti programban. A képen ennek a bináris számsornak van a feldolgozása.
Az sqrt-nél adott hiba:

/tmp/cc24OSQj.o: In function `main':
kisbajnoksag_mod3.c:(.text+0x309): undefined reference to `sqrt'
kisbajnoksag_mod3.c:(.text+0x321): undefined reference to `sqrt'

nb · http://fersml.blog.hu 2011.03.23. 22:19:23

@tkolok: sqrt kapcsán csak annyi, hogy -lm (library math hozzászerkesztése a progidhoz... illene tudni a 6. labor után :(

a humán genom 2. kromója (hs_alt_Hs_Celera_chr2.fa) a ebbe a posztban van egy kód, ami átteszi binárisba és kiveszi a 0xa-ket belőle: progpater.blog.hu/2011/03/05/labormeres_otthon_avagy_hogyan_dolgozok_fel_egy_pedat

hs_alt_Hs_Celera_chr2.fa:
ftp://ftp.ncbi.nlm.nih.gov/genomes/H_sapiens/CHR_02/hs_alt_Hs_Celera_chr2.fa.gz

Rankerz 2011.03.23. 22:19:31

@tkolok: -lm opcióval fordítsd vagy a math headert include old (math.h) és jó lesz azt hiszem.

tkolok 2011.03.23. 23:32:20

Igen, most már működik a (gyökvonás nagyszerűen, szóval sikerült megoldani a problémát) ezt is köszönöm Szépen!:)
Még annyi kérdésem lenne, hogy mit kell még módosítsak pontosan a programon, hogy megkapjam érte a 3 trófeát?:):D
Mert már úgy bekavarodtam, hogy nem teljesen tudom, mit is kell átírni:)
Előre is köszönöm a választ:)

nb · http://fersml.blog.hu 2011.03.24. 13:31:44

@tkolok: a programon remélhetőleg semmit, a 2 változatot (a globálist használó/nem használó) kell lefuttatni a 2. kromóból átalakított 0,1-ekre és összehasonlítani amit a végén kiír: mélység, szórás, átlag.

tkolok 2011.03.25. 16:12:46

Átalakítottam a dump progit a 2.kromóra, így lett egy file 0,1-ekkel, majd az itt található
(progpater.blog.hu/2011/03/05/labormeres_otthon_avagy_hogyan_dolgozok_fel_egy_pedat)
parancsokkal futtattam a kódot.
A végeredményről egy fénykép ezen a linken található:
data.hu/get/3651495/kisbajnok.rar
Bal oldalt találhatók a terminálba beírt parancsok, jobb oldalt a file-ok, kicsit nagynak tűnnek, de hát..., illetve futás végeredmény...:D

Remélem Norbi ezekre a dolgokra gondoltál, hogy hiányoznak, és immár remélem megvan a Trófeám.
Elnézést az ügyetlenkedés miatt:$, és Köszönöm a segítséget.:)

nb · http://fersml.blog.hu 2011.03.25. 20:17:16

@tkolok: komoly munkának látszik, de még annyit kérdeznék, hogy itt egy kimenetet látok, ez a globális nélküli vagy a sima? Mert az lenne az igazán meggyőző, hogy ha mindkét változatot futtatnád és a két eredmény megegyezne.

tkolok 2011.03.25. 21:12:53

Ez a Globális változó nélküli program, amit már átírtam. Szóval ahol már külső változók nélküli a program.

nb · http://fersml.blog.hu 2011.03.26. 15:39:42

@tkolok: OK, de betennéd a másikat is, hiszen azzal összevetve ez Neked egy természetes önellenőrzés.

tkolok 2011.03.27. 21:09:28

Természetesen megcsináltam úgy is. Elnézést a késői válasz miatt, nem voltam gépközelben.:)
data.hu/get/3659867/kisbajnoksag.rar

További Szép Estét!:)
süti beállítások módosítása