Anonymní profil DoDo – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Anonymní profil DoDo – Programujte.comAnonymní profil DoDo – Programujte.com

 

Příspěvky odeslané z IP adresy 213.192.4.–

PHP › 100% SEO RS
8. 11. 2009   #118677

To mango : tak třeba drupal má pěkně zpracovanou podporu SEO - když víš jaké moduly sehnat. Např. nodewords, xml sitemap, pathauto, global redirect apod :)

Podle mě je lepší se podívat po RS co ti vyhovují a pak si vybrat ten co má lepší podporu SEO.

C / C++ › Pole v C
8. 11. 2009   #118667

??

C / C++ › Pole v C
6. 11. 2009   #118564



for (y = 2;y <= e;y++){
for (x = 1;x < e;x++){
if(((eras[x]%y) == 0) && (eras[x] != y)){
eras[x] = 0;
}
}
}


Nevi nekdo prosim jak by sel upravit vnitřní cyklus(3krtac=i), aby se v nem uz nemuseli testovat dalsi podminky?

C / C++ › Pole v C
1. 11. 2009   #118335

Tomu nejak nerozumim jak by to melo byt napsano...

C / C++ › Pole v C
1. 11. 2009   #118291



int sito[100] = {0};
int i, j;


for(i=2; i<100; i++) {

if(sito[i]== 0) {

for(j=i*i; j<100; j+=i) {

sito[j] = 1;
}
}

printf("%d ", sito[i]);

}
}


Jak to mam jeste prosim upravit aby se misto nul a jednicek vypsali primo ty prvocisla?

C / C++ › Pole v C
1. 11. 2009   #118274

Díky za ten první, akorát šlo by tam ještě nějak vložit aby se po vypsani tech N prvku pole naplnilo nulami a pote se zase naplnilo prvky N v opacnem poradi a vypsalo?U toho sita jsem dumal a dumal, ale vubec netusim jak na to, jak by to melo vypadat...

C / C++ › Pole v C
30. 10. 2009   #118121

A u toho Sita nevim jak napsat aby se ty nasobky cisla vymazali a prvocislo se ulozilo do pole...

C / C++ › Pole v C
30. 10. 2009   #118120

Tak u ty jednicky mam



#include<stdlib.h>

int main()
{
int i, e, k;
int pole[10];
int eras[100];

//* Obrácené pole *//
for (i = 0;i < 10;i++){
pole[i] = i+1;
printf("%d, ", pole[i]);
}

ale nevim jak to udelat dal aby v dalsi podmince prvni prvek z pole puvodniho byl posledni a druhy predposledni atd...

C / C++ › Pole v C
30. 10. 2009   #118116

Prosim o pomoc s ukolem, neco jsem sestavil, ale nevim jak by to melo kompletne vypadat...



1.V programu deklarujte jednorozměrné pole, naplněte ho čísly a vypište hodnoty čísel v tomto poli na obrazovku. Poté obraťte pořadí čísel v tomto poli (tj. první bude původně poslední číslo, druhé původně předposlední atd.) a hodnoty ve změněném poi vypište na obrazovku.
Není dovoleno použití druhého pole, ani znovunaplnění pole hodnotami v opačném pořadí. Část zdrojového kódu, která zaměňuje pořadí prvků v poli, musí být zcela nezávislá na tom, jakými hodnotami bylo pole původně naplněno.

2.V jazyku C vytvořte program, který pomocí algoritmu Eratosthenova síta určí a vypíše všechna prvočísla menší než číslo 100.
1. Vytvoříme pole všech čísel od 2 do požadovaného maximálního zkoumaného čísla.
2. Procházíme pole, dokud nenajdeme nevyškrtnuté číslo. Toto číslo je prvočíslem, můžeme jej proto vypsat na obrazovku.
3. Vyškrtáme z pole všechny násobky právě nalezeného prvočísla (např. změnou hodnoty na 0).
4. Pokračujeme krokem 2, dokud zbývají nějaká nevyškrtnutá čísla.

Murmand
Java › User32 - sejmutí aktivní apl…
14. 8. 2009   #114500

Zdravím,
mám menší problém. Moc rád bych sejmul název aplikace, která je zrovna aktivní, tzn. používám ji.
Pomocí jNative jsem příkazem

User32.GetWindowText(User32.GetForegroundWindow())

získal titulek aktivního okna. Má to nevýhodu, že když šmíruju stránky ve firefoxu, tak mi to s pomocí timeru vyhazuje následující výsledky
Seznam – Najdu tam, co nezn¶m - Mozilla Firefox

Nov¶ t¶ma v sekci Java - Mozilla Firefox
Total Commander ...
....

to že nezvládá diakritiku mě netrápí, ale já bych rád název aplikace, ne header. Tzn. že místo uvedeného bych radši
firefox.exe

firefox.exe
totalcmd.exe
...

Přes
User32.GetWindowThreadProcessId(User32.GetForegroundWindow())

jsem dokázal získat akorát číselné ID aplikace, ale to jméne nejsem schopný vydolovat.

Děkuji za pomoc

Murmand
Java › serializace
13. 8. 2009   #114433

Vyřešeno, problém byl v tom, že i když jsem Serializable naiplementoval do naprosto všeho, pořád to bylo pod swingem, což mi mohl dojít... bylo potřeba to lupnout mimo View :o)

Murmand
Java › serializace
13. 8. 2009   #114430

Dokonce ani takto to nefunguje a hází to pořád stejnou chybu...

        try {

ObjectOutput out = new ObjectOutputStream(new FileOutputStream(System.getProperty("user.dir")+ "\\upominky.dat"));
out.writeObject((upominka) seznamUpominek.get(0));
out.close();
} catch (IOException e) {
System.out.println("Chyba při zápisu souboru : "+e);
}

Murmand
Java › serializace
13. 8. 2009   #114428

Zdavím,
mám podobný problém. Mám třídu

        public class upominka implements Serializable {

private int priorita;
private String text;

private upominka(int pr,String t) {
priorita = pr;
text = t;
}

public int vypisPr() {
return priorita;
}

public String vypisT() {
return text;
}
}

která je podtřídou
public class SnadFinalView extends FrameView

v hlavní třídě (SnadFinaView) mám následující Array list, včetně vložení nějakých dvou hodnot
public ArrayList<upominka> seznamUpominek = new ArrayList<upominka>();


seznamUpominek.add(new upominka(1,"bagr"));
seznamUpominek.add(new upominka(5,"koko"));

Hodnoty jsou vloženy správně, jdou vypsat. Když se ale snažím celý ArrayList serializovat pomocí kódu
        FileOutputStream fileOut = new FileOutputStream(System.getProperty("user.dir")+ "\\upominky.dat"); 

ObjectOutputStream out = new ObjectOutputStream(fileOut);
out.writeObject(seznamUpominek);
out.close();

háže mi to
SEVERE: null

java.io.NotSerializableException: snadfinal.SnadFinalView

Bez těch 4 řádků serializace to šlape v pořádku. Když jsem zkoušel implementovat Serializable na SnadFinalView, tak chyba byla pořád stejná.
Už opravdu nevím co s tím. Děkuji za jakoukoliv pomoc...

DoDo
Java › JButtonBar a následná změna…
8. 7. 2009   #111611

Zdravíčko,
V Javě teprve začínám, ale moc rád bych vyřešil jeden triviální problém, který nejsem schopný vykoumat.
Přes komponentu L2FProd http://www.l2fprod.com/common/ bych rád využil JButtonBar pro krásné a přehledné menu, jako můžete například vidět zde http://journal.mycom.co.jp/articles/2006/10/05/l2fprod/images/001a.jpg (ve FireFoxu v Nástroje -> Možnosti taky využíváno). Údajně se to dělá tak, že se přes JButtonBar zaznamená změna stisknutého tlačítka a posléze pomocí CardLayoutu se mění obsah panelu. Nedokážu to ale napsat. Jde to i nějak jednodušeji? Popřípadě jak to zrealizovat pomocí zmíněné nápovědy?
V javě jsem žádnou desktopovou aplikaci ještě nepsal, tudíž je pro mě Swing trošku španělská vesnice a přestože jsem si prošel a naučil se všechny dostupné tutoriály na netu, které jsem vygooglil a našel na ofic stránkách produktů, tak s tímto nehnu.
Děkuji moc za pomoc.
DoDo.

Delphi › File name-přípony
17. 6. 2009   #110671

Vyřešeno,dík za poštouchnutí:)

Delphi › File name-přípony
17. 6. 2009   #110663

jo...nebo:)ale jak potom"odečíst" to .xyz aby z toho bylo neco.txt ??

Delphi › File name-přípony
17. 6. 2009   #110657

Dobrý den,potřeboval bych poradit s takovým problémem.Mám hotový program pro kompresi a dekompresi.Chci aby když nahraji soubor ke kompresi např.novy.txt tak mu program přiřadí novou příponu(to je bez problémů) ale potom při dekompresi aby z té nové přípony udělal tu původní.
Příklad:Novy.txt>Novy.xyz>Novy.txt

Jak uložit do Novy.xyz jeho původní příponu,abych při dekompresi dostal původní soubor s původní příponou?

Díky za každý tip.

Delphi › Práce do školy
27. 5. 2009   #101839

Nejsem zrovna odborník na programování,sám mám velké potíže:)ale ten program vypadá zajímavě:)Rozjela si to už nějak?Funguje to?

Delphi › RLE
25. 5. 2009   #101740

Našel jsem tady nějaké popisy jak naprogramovat kompresní metodu RLE v delphi,ale jsem docela začátečník a pořád tam mám nějaké problémy...prostě zkouším různé varianty...Najde se někdo,kdo by mi mohl nějak pomoct?Děkuji předem

Var: stary,novy : file;
buffer : array[0..2048]of byte;
Precteno,Zapsano : integer;
i,j : byte;

begin
Reset(Stary, 1);
AssignFile(Novy,Edit1.text+'.txt');
Rewrite(Novy, 1);
Precteno:=1;

while not eof(stary) do;
i:=1;
begin
BlockRead(Stary, Buffer, SizeOf(Buffer), Precteno);
if (Buffer[i]=Buffer[i+1])and(Buffer[i+1]=Buffer[i+2]) then
begin
inc(i);
BlockWrite(Novy,Buffer[i],i);
end
else
Blockwrite(Novy,Buffer[i],Precteno)
end;

// BlockWrite(Novy, Buffer[i], Precteno, Zapsano);
CloseFile(Novy);

CloseFile(Stary);



Application.MessageBox('Komprese byla úspěšně provedena','Ok',mb_Ok or mb_IconInformation);
end;
end;

Fuckin
C / C++ › Cteni a nasledne ukladani do…
28. 4. 2009   #100136

mam nasledujici problem, potrebuji do druheho souboru ulozit tolik radku textu, kolik je v jinem souboru radku

 // v tomto cyklu je problem, provede se tolikrat kolik 

// je tam pismen, jenomze ja to potrebuju tolikrat kolik je tam radku
do {
if (feof(fr)) break;
else {
getc(fr);
fprintf(soubor,"%s\n",nejaky libovolny text");
}
} while (1);



V tom cyklu je problem, nevim jak poskakovat s kurzorem po radcich a ne po pismenech :)..diky za radu

hlawis
Offtopic › Vydělávání přes internet
4. 7. 2008   #78774

!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!Urcite vyzkousejte Adoost - Registrace zde http://www.adoost.com/sk/signup/Hlawis. Je to dobrá nová klikacka od ceskych a slovenskych autorů, na které se dají vydělat slušné peníze!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

Registrace je zase podobná jako u jiných klikaček.

Při přihlašování je tu místo kontrolního kódu kontrolní příklad, je tam např. 4+3, takže napíšete 7

Po přihlášení kliknete na ''Download sufbar'' a surfbar si stáhnete, ten pak normálně spustíte a klikáte na reklamy, když surfbat minimalizujete, tak se odpočítávání do konce reklamy pozastaví, při maximalizování se opět spustí.

Jestli vám surfbar nepůjde spustit, musíte si stáhnout Net framework 3.5 tady

C / C++ › dokumentace v ANSI C
24. 6. 2008   #77870

Dobrý den, chtěla bych nekoho z Vás strašně moc poprosit, jestli by mi nepomohl s dokumentací k programu převod z ar. c. na rimska.c. Nemam tušení, jak má ta dokumentace vypadat. Prosím, pomohl by mi s tím někdo? Moc děkuji http://leteckaposta.cz/uploaded/303307441

C / C++ › dynamická matice
18. 6. 2008   #77306

ahojte, muzete mi prosim nekdo z Vas pomoci s ukolem dynamicka matice, jejiz zadani zni: Vytvořte program ve kterém budete moci za běhu programu zadávat rozměry matice a alokovat a uvolňovat pro ní pamět z paměťové haldy (memory heap) pomocí funkcí malloc a free. Problem je v tom, ze pouzivam operatory z C++, a i kdyz jsem operatory new a delete prepsal pomoci operatoru malloc a free, porad mi to nejede. Diky moc za rady.

#include "stdafx.h"
#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
#include<time.h>

void menu(void);

void con(void);
void minus(int);
void plus(int);

void udelej(void);
void napln(void);
void vypis(int);
void pridej(void);
void smaz(void);

void pocet(void);

typedef struct bunka
{
int h;
struct bunka *a;
} BUNKA;


int rad=0, slo=0, go=1, x=1, y=1, g;
int **mat1,*mat2;
BUNKA *pole, *p, *n;

int main(void)
{
system("cls");

printf("\n\n Tvorba dynamickeho pole");
printf("\n #######################\n\n\n");

do
{
menu();
}while(go);
if(pole!=NULL) delete pole;
return 1;
}

void menu(void)
{ char q;

printf("\n\n\n Menu - vyber akci");
printf("\n vytvoreni dyn. pole ... [1]");
printf("\n vygenerovani hodnot ... [2]");
printf("\n cteni pole ... [3]");
printf("\n pridani pole ... [4]");
printf("\n smazani pole ... [5]");
printf("\n konec programu ... [Esc]");

q=getch();
switch(q)
{
case '1':udelej();break;
case '2':napln();break;
case '3':vypis(2);break;
case '4':pridej();break;
case '5':smaz();break;
case 27:go=0;{delete pole; break;}
default:printf("\n\n neplatna volba \n\n");
}
}

void con(void)
{
int i;
if(pole!=NULL) delete pole;
pole=new BUNKA;
pole->a=NULL;
pole->h=0;
}

void minus(int q)
{
int i,k;
BUNKA *pom;
k=1;
p=pole;

while(p->a!=NULL)
{
if(k==(q-1))pom=p;
if(k==q)break;
k++;
p=p->a;
}
pom->a=p->a;
delete p;
}

void plus(int q)
{
int i,j,k;

p=pole;

k=1;
while(p->a!=NULL)
{
if(k==q)break;
k++;
p=p->a;
}
n=new BUNKA;
n->h=0;
n->a=p->a;
p->a=n;
}

void udelej(void)
{
int i,j=0;
int q;

printf("\n\n napiste, kolik bunek ma dane pole obsahovat: ");
scanf("%i",&q);

con();
for(i=1; i!=q; i++){plus(q); j++;}
printf("\n\n hotovo");
}

void pocet(void)
{
int i=0;
p=pole;
printf("\n");
while(p!=NULL)
{
i++;
printf("%i. h=%i p=%i a=%i \n",i,p->h,p,p->a);
p=p->a;
}

system("pause");
}

void pridej(void)
{
int q;

printf("\n\n napiste, za kterou bunku se ma vytvorit nova: ");
scanf("%i",&q);
plus(q);
printf("\n bunka byla pridana s nulovou hodnotou.");
}

void smaz(void)
{
int q;

printf("\n\n napiste, kterou bunku si prejete smazat: ");
scanf("%i",&q);
minus(q);
printf("\n bunka byla smazana.");

}

void napln(void)
{
p=pole;
srand((unsigned)time(NULL));
while((p!=NULL))
{
p->h=(rand()%98)+1;
p=p->a;
}
printf("\n\n hotovo");
}

void vypis(int q)
{
p=pole;
printf("\n\n\n Hodnoty pole jsou:\n ");
while(p!=NULL)
{

printf("%2i; ",p->h);
p=p->a;
}
}

C / C++ › Pomoc při práci s ukazateli
6. 4. 2008   #70677

ahojte,

muzete mi prosim nekdo poradit ohledne techto otazek? dekuji

kdyz mam kod:

int c[]={1,2,3,0};

int *uk=c+1;
while (*uk!=0) printf("%d, ", *uk++);

co mi tento kod vypise na obrazovku?

co provede nasleduji kod?
char *p="Test"; 

char* konec=p+length(p);
while (*p++=1 && p<konec);


Editoval midin: Příště dávej zdrojáky do tagu code.

Gonzo
Delphi › Inicializace dvojrozměrného…
6. 4. 2008   #70675

Zdravím všechny,
našel jsem někde "správný" tvar inicializace vícerozměrného pole, vypadalo to nějak takto:
var
MyArray : array[0..2,0..3] of Integer =
(
(10,20,30),
(1,2,3),
(0,1,0),
(1,2,1)
);

Ale tento způsob prostě nefunguje. Ví někdo, jaká má být správná syntax?
Díky moc za pomoc

gonzales

Dox
C / C++ › Problém s kalkulačkou
16. 3. 2008   #68871

Delam si takovou jednoduchou kalkulacku. Chci aby fungovala á la Kalkulačka Windows. Tzn po stisku tlacitka operatoru, mi zustanou cisla v edit box, smazou se az po druhem kliknuti na jakekoliv tlacitko nebo stisknuti klavesy cislice.
Chtel jsem to resit pomoci promenne BOOL clear, pokud jeji hodnota bude TRUE, pak po stisku leveho tlacitka mysi se text v edit boxu smaze.
Jenomze pri kliknuti na jednotlive tlacitka se zprava WM_LBUTTONDOWN asi vubec neposila :) Posle se pouze pokud kliknu v nejake oblasti okna a ne na tlacitka.

Jak tohle resit aniz bych nemusel pridat podminku



if(clear==true) {
SetWindowText(GetDlgItem(hWnd, IDC_EDIT), TEXT(""));
clear = false;
}

Ke kazdemu tlacitku ?



INT_PTR CALLBACK DialogProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{

switch (uMsg)
{
case WM_INITDIALOG:
SetClassLongPtr(hWnd, GCLP_HICONSM, (LONG_PTR)LoadIcon(g_hInst, MAKEINTRESOURCE(IDI_ICON1)));

break;

case WM_LBUTTONDOWN:
if(clear==true) {
SetWindowText(GetDlgItem(hWnd, IDC_EDIT), TEXT(""));
clear = false;
}
break;

case WM_COMMAND:
switch (LOWORD(wParam))
{
case BT_C:
SetWindowText(GetDlgItem(hWnd, IDC_EDIT), TEXT(""));
number = 0;
buffer = 0;
break;


case BT_PLUS:
GetWindowText(GetDlgItem(hWnd, IDC_EDIT), TchText, 200);

tstrtoc_s(TchText, lstrlen(TchText), ChText);
buffer = atof(ChText); //nahrati cisel do promenne buffer
operation = 1; //nastaveni operace scitani
//SetWindowText(GetDlgItem(hWnd, IDC_EDIT), TEXT(""));
clear = true;
break;

case BT_MINUS:
GetWindowText(GetDlgItem(hWnd, IDC_EDIT), TchText, 200);

tstrtoc_s(TchText, lstrlen(TchText), ChText);
buffer = atof(ChText); //nahrati cisel do promenne buffer
operation = 2; //nastaveni operace scitani
//SetWindowText(GetDlgItem(hWnd, IDC_EDIT), TEXT(""));
clear = true;
break;

case BT_EQUALS: //tlacitko =
GetWindowText(GetDlgItem(hWnd, IDC_EDIT), TchText, 200);

tstrtoc_s(TchText, lstrlen(TchText), ChText);
number = atof(ChText);

switch(operation)
{
case 1:
number = buffer + number;
sprintf_s(ChText, "%f", number);
cstrtot_s(ChText, sizeof(ChText), TchText);

SetWindowText(GetDlgItem(hWnd, IDC_EDIT), TchText);

break;
case 2:
number = buffer - number;
sprintf_s(ChText, "%f", number);
cstrtot_s(ChText, sizeof(ChText), TchText);

SetWindowText(GetDlgItem(hWnd, IDC_EDIT), TchText);

break;
}

break;

case BT_0:
GetWindowText(GetDlgItem(hWnd, IDC_EDIT), TchText, 200);
lstrcat(TchText, TEXT("0")); //prida znak k TCHAR TchText
SetWindowText(GetDlgItem(hWnd, IDC_EDIT), TchText);
break;
case BT_1:
GetWindowText(GetDlgItem(hWnd, IDC_EDIT), TchText, 200);
lstrcat(TchText, TEXT("1")); //prida znak k TCHAR TchText
SetWindowText(GetDlgItem(hWnd, IDC_EDIT), TchText);
break;

//atd...jednotliva tlacitka cisel

case WM_DESTROY:
PostQuitMessage(0);
break;

}
break;
}
return FALSE;
}


btw Jaky je rozdil mezi tlacitkem C a CE ? :)

Pascal › Pomoc...vysvetlit zadani
11. 1. 2008   #61935

To huck: Nic proti Tobe, ale ten dotycny pan inzenyr sice ma vysokou skolu, mozna prosel ruznymi kurzy programovani, ale co se tyce Pascalu, o tom prehled moc nema. Mam kamose, ktery studuje VS v Brne, od prvaku je ve vyvojovem tymu univerzity, a kdyz si cetl ta zadani od dotycneho, neveril svym ocim doslova a do pismene. Nektera zadani projektu jsou zadana tak, ze jedna vec popira druhou. Neni to mysleno jen na zadani projektu, ale i na ostatni ukoly.

Pascal › Ukol v Pascalu
17. 12. 2007   #58803

DIKY MOC, uz to frci jak ma!!!

Pascal › Ukol v Pascalu
16. 12. 2007   #58721

Nevite mi jeste pomoct s timto ukolem: vytvořte algoritmus pro vyhodnocování aritmetických výrazů, které jsou zapsány v notaci postfix.
Nemusíte přitom vyhodnocovat víceznakové operandy (stačí hodnoty od 0..9).

tady je sablona pro jazyk C:
//Vyhodnocování Postfixových výrazù
//Varianta s vyuzitim zasobniku (staticke pole float)

#include <stdio.h>
#include <conio.h>

////////////////////////////////////
// Zasobnik
struct tStack
{
float data[100]; //data ulozena v zasobniku
int top; //index vrcholu zasobniku
};

//inicializace
void StackInit(tStack& s)
{
s.top = -1; //-1 = zasobnik je prazdny
}

//test na prázdnost zásobníku
bool StackEmpty(tStack& s)
{
//chybí !!!
}

//pøeètení vrcholu zásobníku
float Top(tStack& s)
{
//chybí !!!
}

//pøeètení a odstranìní vrcholu zásobníku
float Pop(tStack& s)
{
//chybí !!!
}


//vlo�ení dat do zásobníku
void Push(tStack& s, float d)
{
//chybí !!!
}

//vraci pocet prvku v zasobniku
int Count(tStack& s)
{
return s.top+1;
}


/////////////////////////////////////////////////////////////////////

int main()
{
int znak;
tStack zasobnik;
StackInit(zasobnik);

printf("\nVyhodnocovani Postfixovych vyrazu");
printf("\n\nZadej vyraz: ");
while(1)
{
znak = getche();
if( znak >= '0' && znak <= '9' )
Push(zasobnik, (float)(znak-'0') );
//úkol



if( znak == 13 ) //kod klavesy Enter
break;
}


printf("\n\nLibovolnou klavesou ukoncete program");
getch();
return 0;
}

Pascal › Ukol v Pascalu
16. 12. 2007   #58710

Zde je hotovy program, ale opet mi tam neco nefrci.

program ADThashimplicitni;

{$APPTYPE CONSOLE}

uses
SysUtils;
const IHTMaxSize=17;
type
tIKey = string[10]; { typ klíče}
tIData = real; { typ obsahu}
tIStatus = (FREE,FULL,BLIND); { stav poloky v TRP s impl.z.s. }

{ Datová poloka TRP s implicitně řetězenými synonymy }
tIHTItem = record
Key:tIKey; { klíč }
Data:tIData; { obsah }
Status:tIStatus; { stav poloky }
end;

{ TRP s implicitně zřetězenými synonymy. }
tIHTable = array [1..IHTMaxSize] of tIHTItem;

procedure HTInit (var Table:tIHTable);
var i:integer;
begin
for I := 1 to IHTMaxSize do Table[i].status:=Free;
end;

function IRozptyl (var Key:tIKey) : integer;
var
i: integer;
vysledek : integer;
begin
vysledek:=1;
for i:=1 to length(Key) do
vysledek:=vysledek+ord(Key[i]);
IRozptyl := (vysledek mod IHTMaxSize+1);
end;

function IRozptyl2 (var Key:tIKey) : integer;
var
i: integer;
vysledek : integer;
begin
vysledek:=1;
for i:=1 to length(Key) do
vysledek := vysledek+ord(Key[i])+1;
IRozptyl2 := (vysledek mod (IHTMaxSize-1))+1;
end;

procedure HTInsert (var Table:tIHTable; key:tIKey; data:tIData);
var index,i,p:integer;
begin
index:=Irozptyl(key);
p:=Irozptyl2(key);
i:=index;
while Table[i].status<>Free do begin
if Table[i].Key=key then
begin
Table[i].Data:=data;
exit;
end;
if table[i].Status=blind then begin
Table[i].key:=key;
table[i].data:=data;
table[i].status:=Full;
exit;
end;
i:=(i+p);
if i>(IHTmaxsize+1) then begin
i:=(i mod IHTmaxsize);
if i=index then begin writeln('zasobnik je plny'); exit; end;
end;
end;

Table[i].key:=key;
table[i].data:=data;
table[i].status:=Full;
end;

function IHTSearch (var Table:tIHTable; Key:tIKey; var Index:integer) : boolean;
var ind,i,p:integer;
begin
ind:=Irozptyl(key);
p:=Irozptyl2(key);
i:=ind;
while Table[i].status<>free do begin
if Table[i].Key=key then
begin
index:=i;
IHTsearch:=true;
exit;
end;
i:=(i+p);
if i>(IHTmaxsize+1) then begin
i:=(i mod IHTmaxsize);
if i=ind then begin writeln('nenalezeno'); IHTsearch:=false; exit; end;
end;
end;
end;

function IHTRead (var Table:tIHTable; Key:tIKey; var OutData:tIData) : boolean;
var ind,i,p:integer;
begin
ind:=Irozptyl(key);
p:=Irozptyl2(key);
i:=ind;
while Table[i].status<>Free do begin
if Table[i].Key=key then
begin
OutData:=Table[i].Data;
IHTread:=true;
exit;
end;
i:=(i+p);
if i>(IHTmaxsize+1) then begin
i:=(i mod IHTmaxsize);
if i=ind then begin writeln('nenalezeno'); IHTread:=false; exit; end;
end;
end;
end;

procedure IHTDelete (var Table:tIHTable; Key:tIKey);
var ind,i,p:integer;
begin
ind:=Irozptyl(key);
p:=Irozptyl2(key);
i:=ind;
while Table[i].status<>Free do begin
if Table[i].Key=key then
begin
Table[i].Key:='';
Table[i].Status:=Blind;
exit;
end;
i:=(i+p);
if i>(IHTmaxsize+1) then begin
i:=(i mod IHTmaxsize);
if i=ind then begin exit; end;
end;
end;
end;

procedure Print (var Table:tIHTable);
var i:integer;
status:string;
begin
for I := 1 to IHTmaxsize do begin
Writeln('pozice: ',i);
Writeln('key=',Table[i].key);
writeln('data=',Table[i].data:8:3);
if Table[i].Status=free then Status:='free';
if Table[i].Status=full then Status:='full';
if Table[i].Status=blind then Status:='blind';
writeln('status=',Status);
end;

end;

var
index:integer;
c:char;
HashT:tIHTable;
data:tIData;
key:tIKey;
b:boolean;
begin
c:='m';
repeat
case c of
'm':begin writeln(' ***ADT hash tabulka explicitne zretezenymi synonymi***');
writeln;
writeln('Zadejte i pro inicializaci seznamu.');
writeln('Zadejte v pro vlozeni prvku do seznamu.');
writeln('Zadejte h pro hledani dat podle klice.');
writeln('Zadejte r pro vypsani dat podle klice.');
writeln('Zadejte d pro mazani dat.');
writeln('Zadejte o pro vypsani hash tabulky.');
writeln('Zadejte m pro menu.');
writeln('Zadejte k pro ukonceni pgmu.');
end;
'i':begin HTinit(HashT); writeln('Seznam inicializovan.'); end;
'v':begin writeln('Zadejte data urcena k vlozeni.'); readln(data);
write('Zadejte podle jakeho klice se maji data ulozit.');
repeat writeln(', musí byt 10ti mistny.'); readln(key);
until (length(key)=10);
HTInsert(HashT,key,data);
end;
'h':begin write('Zadejte podle jakeho klice se maji data hledat.');
repeat writeln(', musí byt 10ti mistny.'); readln(key);
until (length(key)=10);
b:=IHTsearch(hashT,key,index);
if b=true then begin
writeln('Podle klice ',key);
writeln('Na pozici: ',index);
writeln('Byla nalezena data: ',hashT[index].Data:8:3)
end else writeln('Nenalezeno podle klice: ',key);
end;
'r':begin write('Zadejte podle jakeho klice se maji data hledat.');
repeat writeln(', musí byt 10ti mistny.'); readln(key);
until (length(key)=10);
b:=IHTread(hashT,key,data);
if b=true then begin
writeln('Podle klice ',key);
writeln('Byla nalezena data: ',Data:8:3)
end else writeln('Nenalezeno podle klice: ',key);
end;
'd':begin write('Zadejte podle jakeho klice se maji data smazat.');
repeat writeln(', musí byt 10ti mistny.'); readln(key);
until (length(key)=10);
IHTdelete(hashT,key);
end;
'o':begin print(hashT); end;
else begin writeln('Nespravny znak.'); end;
end;
writeln;
writeln('Zvolte moznost,kterou chcete provest.');
readln(c);
until (c='k');
end.

Pascal › Ukol v Pascalu
16. 12. 2007   #58709

Osobne to radeji nekomentuji, zvlaste jeho osobu. Jeste jedna chutovka, zde je jeji zadani:

Hash tabulka s implicitně zřetězenými synonymy.

U tabulky s implicitně zřetězenými synonymy je součástí každé položky tabulky informace o využití položky - Status, která v případě volné položky nabývá hodnoty FREE. Pokud položka tabulky obsahuje platná data, nabývá Status hodnoty FULL. Položka tabulky se může nacházet ještě ve třetím stavu, BLIND. Do tohoto stavu se dostane v okamžiku, kdy obsah položky zrušíme (IHTDelete). Pokud bychom v tomto případě nastavili stav FREE, mohli bychom přerušit implicitní zřetězení synonym, protože položka ve stavu FREE říká, že se zde dosud nikdo nepokusil dané synonymum zapsat, a že tedy neexistuje žádné synonymum o kousek dál. Položka ve stavu BLIND tedy například funkci IHTSearch dává najevo, že se má pokračovat v hledání.

Datové typy jsou definovány následovně:

type
tIKey = string[10]; { typ klíče (například čárový kód zboží) }
tIData = real; { typ obsahu (například cena zboží) }
tIStatus = (FREE,FULL,BLIND); { stav položky v TRP s impl. z. s. }

{ Datová položka TRP s implicitně řetězenými synonymy }
tIHTItem = record
Key : tIKey; { klíč }
Data : tIData; { obsah }
Status : tIStatus; { stav položky }
end;

{ TRP s implicitně zřetězenými synonymy. }
tIHTable = array [1..IHTMaxSize] of tIHTItem;

V tomto úkolu se jedná o variantu hash tabulky se dvěmi rozptylovacími funkcemi, jejichž implementace bude např. následující:

function IRozptyl (var Key:tIKey) : integer;
var
i : integer;
Result : integer;
begin
Result:=1;
for i:=1 to length(Key) do Result:=Result+ord(Key[i]);
IRozptyl := (Result mod IHTSize)+1;
end;


function IRozptyl2 (var Key:tIKey) : integer;
var
i : integer;
Result : integer;
begin
Result:=1;
for i:=1 to length(Key) do
Result := Result+ord(Key[i])+1;
IRozptyl2 := (Result mod (IHTSize-1))+1;
end;


IRozptyl je rozptylovací funkce, jejímž úkolem je zpracovat zadaný klíč a přidělit mu index v rozmezí 1..HTSize. V ideálním případě by mělo dojít k rovnoměrnému rozptýlení těchto klíčů po celé tabulce.

IRozptyl2 je rozptylovací funkce pro výpočet inkrementu - jejím úkolem je zpracovat zadaný klíč a přidělit mu hodnotu v intervalu 1..IHTSize-1.

U všech procedur využívejte jako první rozptylovou funkci IRozptyl. Druhá rozptylovací funkce, IRozptyl2, se používá pro výpočet inkrementu (přírůstku) v případě, že položka s indexem Rozptyl je již obsazena.

Pozor! Počet prvků tabulky (konstanta IHTSize) musí být prvočíslo!

Implementujte následující metody:

procedure IHTInit (var Table:tIHTable);
Inicializace tabulky s implicitně zřetězenými synonymy.
procedure IHTInsert (var Table:tIHTable; Key:tIKey; Data:tIData);
Tato procedura vkládá do tabulky Table položku s klíčem Key a s daty Data. Protože jde o vyhledávací tabulku, nemůže být prvek se stejným klíčem uložen v tabulce více než jedenkrát. Pokud se vkládá prvek, jehož klíč se již v tabulce nachází, aktualizujte jeho datovou část.
Pro určení počátku implicitně zřetězeného seznamu synonym použijte rozptylovací funkci IRozptyl, pro výpočet přírůstku (používaného pokud je položka na indexu IDisperse již obsazena) použijte funkci IRozptyl2.
Tabulku implementujte tak, aby mohla být zcela obsazena (může v ní být uloženo IHTSize prvků). Posunujeme-li se v poli s přírůstkem 1, pak po indexu IHTSize následuje index 1. Položku lze uložit do záznamu, který je ve stavu FREE nebo BLIND.
Pokud je tabulka plná, volejte při pokusu o další vkládání funkci ErrorInsert. Při implementaci NEVYUŽÍVEJTE funkci IHTSearch.
function IHTSearch (var Table:tIHTable; Key:tIKey; var Index:integer) : boolean;
TRP s implicitně zřetězenými synonymy s dvojí rozptylovací funkcí. Vyhledání prvku v TRP Table podle zadaného klíče Key. Pokud je daný prvek nalezen, vrací se funkční hodnota TRUE a proměnná Index obsahuje index vyhledaného prvku. Pokud prvek nalezen není, vrací se hodnota FALSE a proměnná Index nabývá nedefinované hodnoty. Při vyhledávání mohou nastat v zásadě dvě situace, při kterých ihned ukončíme(neúspěšné) vyhledávání: narazili jsme na položku ve stavu FREE nebo jsme již zkontrolovali všechny prvky tabulky. V ostatních případech musíme testovat, zda se jedná o hledanou položku, či nikoliv. Pro tento účel použijte níže definovanou funkci IsFound, která vrací hodnotu true v případě, kdy na zadané pozici leží platný prvek, jehož klíč se shoduje se zadaným klíčem. Vedlejším efektem této funkce je zvýšení globálního počítadla IHTcmpcnt, které při ukončení funkce IHTSearch vlastně udává, kolik porovnání jsme potřebovali k vyhledání (úspěšnému, či neúspěšnému) prvku s daným klíčem. Hodnotu IHTcmpcnt NENASTAVUJTE SAMI a ani tuto proměnnou jinak
nevyužívejte - chovejte se k ní, jako kdyby neexistovala. Využívá se při statistickém vyhodnocování úspěšnosti vyhledávání.
Poznámka: parametr Index byl přidán z důvodu možné využitelnosti dalšími procedurami. Pokud by prvořadým cílem byla abstraktnost datového typu TRP, pak by tento parametr nebyl vhodný, protože uživateli odhaluje způsob implementace tabulky a umožňuje nekorektní zásahy do její struktury (tj. zásahy, kdy nejsou využity navržené procedury pro přístup k tabulce).
function IHTRead (var Table:tIHTable; Key:tIKey; var OutData:tIData) : boolean;
Tato funkce zjišťuje hodnotu datové části položky zadané klíčem. Pokud je položka nalezena, vrací funkce hodnotu TRUE a prostřednictvím parametru OutData se předá hodnota datové části nalezené položky. Pokud položka nalezena nebyla, vrací se funkční hodnota FALSE a hodnota OutData není definována. Využijte dříve vytvořenou funkci IHTSearch.
procedure IHTDelete (var Table:tIHTable; Key:tIKey);
Tato procedura vyjme položku s klíčem Key a s daty Data z tabulky Table. Prakticky to znamená, že uvolňovanou položku uvedeme do stavu BLIND. Pokud položka s uvedeným klíčem neexistuje, dělejte, jako kdyby se nic nestalo (tj. nedělejte nic).

Pascal › Ukol v Pascalu
16. 12. 2007   #58699

Da se rict, ze to mam skoro hotove, akorat mi tam neco haze chybu a nemuzu ji opravit.

program ADThash;

{$APPTYPE CONSOLE}

uses
SysUtils;

const HTSize=17;
type
tKey=string[10];
tData=real;
tHTukPrvek=^tHTPrvek;
tHTPrvek=record
key:tKey;
data:tdata;
ukDalsi:tHTukPrvek;
end;
tHTable=array [0..HTSize] of tHTukPrvek;

procedure HTInit (var Table: tHTable);
var q:integer;
begin
q:=0;
repeat begin Table[q]:=nil;
q:=q+1; end; until q=HTSize+1;
end;

function Rozptyl (var Key:tKey) : integer;
var i : integer;
Vysledek : integer;
begin
Vysledek:=1;
for i:=1 to length(Key) do
begin
Vysledek:=Vysledek+ord(Key[i]);
end;
Rozptyl := (vysledek mod HTSize)+1;
end;


Procedure HTInsert (var Table:tHTable;key:tKey; data:tData);
function rovnost (var pomUk:tHTukPrvek; key:tKey; data:tData):boolean;
var a:integer;
begin
if pomUk<>nil then begin
if pomUk^.key<>key then
rovnost(pomUk.ukDalsi,key,data)
else begin pomUk.data:=data; rovnost:=True; a:=0; end;
end;
if a<>0 then rovnost:=false;
end;

var index:integer;
pomUk:tHTukPrvek;
p:boolean;
begin
index:=rozptyl(key);
pomUk:=Table[index];
if pomUk<>nil then
begin
p:=rovnost(pomUk,key,data);
if p=true then exit;
while pomUk<>nil do
pomUk:=pomUk^.ukDalsi;
end;
if pomUk=nil then new(pomUk);
pomUk^.key:=Key;
pomUk^.data:=data;
pomUk^.ukDalsi:=nil;
Table[index]:=pomUk;

end;

function HTSearch (var Table:tHTable; Key:tKey; var ukPrvek:tHTukPrvek) : boolean;
var pomUk:tHTukPrvek;
begin
pomUk:=Table[Rozptyl (key)];
while pomUk<>nil do begin
if pomUk^.key=key then begin
ukPrvek:=pomUk;
HTSearch:=true;
exit;
end;
pomUk:=pomUk^.ukDalsi;
end; {while}
HTSearch:=false;
ukPrvek:=nil;
end;

procedure HTDelete (var Table:tHTable; Key:tKey);
var pomUk, ukPredchozi:tHTukPrvek;
index:integer;
begin
index:=Rozptyl(key);
pomUk:=Table[Rozptyl (key)];
ukPredchozi:=pomuk;
while pomUk<>nil do begin
if pomUk^.key=Key then begin
if pomUk=ukPredchozi then
Table[index]:=pomUk^.ukdalsi
else
ukPredchozi^.ukDalsi:=pomUk^.ukDalsi;
dispose(pomUk);
exit;
end;
ukPredchozi:=pomUk;
pomUk:=pomUk^.ukDalsi;
end; {while}
end;

function HTRead (var Table:tHTable; Key:tKey; var data:tData) : boolean;
var pomUk:tHTukPrvek;
begin
pomUk:=Table[Rozptyl(key)];
while pomUk<>nil do begin
if pomUk^.key=key then begin
data:=pomUk.data;
HTread:=true;
exit;
end;
pomUk:=pomUk^.ukDalsi;
end; {while}
HTread:=false;
end;

procedure HTDeleteTable (var Table:tHTable);
Procedure smaz(var Prvek:tHTukPrvek);
begin
while Prvek<>nil do begin
smaz(prvek.ukDalsi);
Prvek:=nil;
end;
end;
var i:integer;
begin
i:=0;
while i<>(HTsize+1) do begin
smaz(Table[i]);
Table[i]:=nil;
i:=i+1;
end; {while}
end;

Procedure print(var t:tHtable);
var
i:integer;
pomUk:tHTukPrvek;
begin
for I := 0 to HTSize do begin
pomUk:=t[i];
if pomUk<>nil then begin
while PomUk<>nil do begin
Writeln('key=',pomUk^.key);
writeln('data=',pomUk^.data:8:3);
pomUk:=pomUk^.ukDalsi;
end;
end;
end;
end;
var
c:char;
HashT:tHTable;
data:real;
key:tKey;
hledany:tHTukPrvek;
b:boolean;
begin
c:='m';
repeat
case c of
'm':begin writeln(' ***ADT hash tabulka explicitne zretezenymi synonymi***');
writeln('Zadejte i pro inicializaci seznamu');
writeln('Zadejte v pro vlozeni prvku do seznamu');
writeln('Zadejte o pro vypsani hash tabulky');
writeln('Zadejte h pro hledani podle klice');
writeln('Zadejte r pro nactení dat podle klice');
Writeln('Zadejte d pro smazani prvku podle klice');
Writeln('Zadejte x pro smazani cele hash tabulky');
writeln('Zadejte m pro menu');
writeln('Zadejte k pro konec');
end;
'i':begin HTinit(HashT); writeln('Seznam inicializovan.'); end;
'v':begin writeln('Zadejte data urcena k vlozeni.'); readln(data);
write('Zadejte podle jakeho klice se maji data ulozit.');
repeat writeln(', musí byt 10ti mistny'); readln(key);
until (length(key)=10);
HTInsert(HashT,key,data);
end;
'o':begin print(hashT); end;
'h':begin write('Zadejte podle jakeho klice se maji data hledat.');
repeat writeln(', musí byt 10ti mistny.'); readln(key);
until (length(key)=10);
b:=HTsearch(hashT,key,hledany);
if b=true then begin
writeln('Podle klice ',key);
writeln('Byla nalezena data: ',hledany.data:8:3)
end else writeln('Nenalezeno podle klice: ',key);
end;
'r':begin write('Zadejte podle jakeho klice se maji data hledat.');
repeat writeln(', musí byt 10ti mistny.'); readln(key);
until (length(key)=10);
b:=HTRead(hashT,key,data);
if b=true then begin
writeln('Podle klice ',key);
writeln('Byla nalezena data: ',data:8:3)
end else writeln('Nenalezeno podle klice: ',key);
end;
'd':begin write('Zadejte podle jakeho klice se maji data mazat.');
repeat writeln(', musí byt 10ti mistny.'); readln(key);
until (length(key)=10);
HTdelete(hashT,key);
end;
'x':begin HTDeleteTable(hashT); writeln('Vse bylo smazano.'); end;
else begin writeln('Nespravny znak.'); end;
end;
writeln;
writeln('Zvolte moznost, kterou chcete provest.');
readln(c);
until (c='k');
end.

Pascal › Ukol v Pascalu
16. 12. 2007   #58670

Ahojte,

nevite mi prosim nekdo poradit s timto ukolem. Vytvořte ADT Hash tabulka explicitně zřetězenými synonymy, která bude poskytovat následující metody:

procedure HTInit (var Table : tHTable); - Inicializace tabulky s explicitně zřetězenými synonymy.
function HTSearch (var Table : tHTable; Key : tKey; var ukPrvek:tUkPrvek) : boolean; - Vyhledání prvku v TRP Table podle zadaného klíče Key. Pokud je daný prvek nalezen, vrací se funkční hodnota TRUE a ukazatel ItemPtr ukazuje na vyhledaný prvek. Pokud prvek nalezen není, vrací se hodnota FALSE a ukazatel ItemPtr nabývá hodnoty nil. Poznámka: parametr ukPrvek byl přidán z důvodu možné využitelnosti dalšími procedurami - správnější by bylo předávat z funkce pouze najdené data a hodnotu bool, protože ukazatel odhaluje uživateli "vnitřnosti" implementace tohoto ADT.
procedure HTInsert (var Table:tHTable; Key:tKey; Data:tData); - Tato procedura vkládá do tabulky Table položku s klíčem Key a s daty Data. Protože jde o vyhledávací tabulku, nemůže být prvek se stejným klíčem uložen v tabulce více než jedenkrát. Pokud se vkládá prvek, jehož klíč se již v tabulce nachází, aktualizujte jeho datovou část. Využijte dříve vytvořenou funkci ExpSearch. Při vkládání nového prvku do seznamu synonym použijte co nejefektivnější způsob.
function HTRead (var Table:tHTable; Key:tKey; var OutData:tData) : boolean; - Tato funkce zjišťuje hodnotu datové části položky zadané klíčem. Pokud je položka nalezena, vrací funkce hodnotu TRUE a prostřednictvím parametru OutData se předá hodnota datové části nalezené položky. Pokud položka nalezena nebyla, vrací se funkční hodnota FALSE a hodnota OutData není definována.
procedure HTDelete (var Table:tHTable; Key:tKey); - Tato procedura vyjme položku s klíčem Key a s daty Data z tabulky Table. Uvolněnou položku korektně zrušte. Pokud položka s uvedeným klíčem neexistuje, dělejte, jako kdyby se nic nestalo (tj. nedělejte nic).
procedure HTDeleteTable (var Table:tHTable); - Tato procedura zruší všechny položky tabulky, korektně uvolní prostor, který tyto položky zabíraly, a uvede tabulku do počátečního stavu.
Typy jsou definovány takto:

tKey = string[10]; { typ klíče (například čárový kód zboží) }
tData = real; { typ obsahu (například cena zboží) }

{ Datová položka TRP s explicitně řetězenými synonymy }
tHTukPrvek = ^tHTPrvek;

tHTPrvek = record
Key : tKey; { klíč }
Data : tData; { obsah }
Next : tHTukPrvek; { ukazatel na další synonymum }
end;

{ TRP s explicitně zřetězenými synonymy. }
tHTable = array [1..HTSize] of tHTukPrvek;


Pascal › Množina s libovolnou kardin…
24. 10. 2007   #52574

Ahojte, nevite prosim nekdo, jak se poprat s timto ukolem. Ja bych ho dokazala vyresit, ale jinak nez nam byla stanovena kriteria.

Podstata problému: Protože Pascal umožňuje zpracovávat množiny s omezenou kardinalitou (např. u typu set of BYTE je to max. 256 prvků), je vaším úkolem toto omezení obejít pomocí definice abstraktního datového typu "tSet", který budete v Pascalu implementovat jako pole několika množin "set of byte". V jazyce C, kde typ množina není obsažen vůbec, budete používat pole prvků typu unsigned char.

K práci s datovým typem tSet nadefinujte a implementujte následující metody:

procedure CreateSet(var M: tSet); - vytvoří novou množinu M s kardinalitou K prvků, kde K je konstanta
procedure ClearSet (var M : tSet); - z M se stane prázdná množina
procedure AddSet (var M : tSet; n : integer); - Přidá do množiny M prvek n. Pokud dojde k chybě (prvek nemůže být součástí množiny), nedělá procedura nic.
procedure DelSet (var M : tSet; n : integer); - ubere z množiny M prvek n. Pokud dojde k chybě (prvek nemůže být součástí množiny), nedělá procedura nic.
function InSet (M : tSet; n : integer) : boolean; - vrátí True, pokud se prvek n v množině M nachází. Vrátí False, pokud se prvek n v množině M nenachází nebo pokud prvek být v množině nemůže.
procedure DiffSet (var M1 : tSet; M2 : tSet); - rozdíl množin M1 a M2 (tj. výsledek obsahuje prvky množiny M1, které se nenacházejí v M2). Výsledek se vrací v M1.
function EquSet (M1 : tSet; M2 : tSet) : boolean; - Test množin M1 a M2 na rovnost.
procedure UnionSet (var M1 : tSet; M2 : tSet); - provede sjednocení množin M1 a M2, výsledek uloží do M1
procedure IntersectSet (var M1 : tSet; M2 : tSet); - provede průnik množin M1 a M2, výsledek uloží do M1

 

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý