2016. július 28., csütörtök

Algoritmus

ÖSSZEGZÉS 1
M..N-ig a számok összege
BE: M,N egész számok
KI: S egész szám, az összeg
Előfeltétel: M<=N

Algoritmus
Be: M,N
S:=0
Ciklus i:=M..N
s:=s+i
Ciklus vége
Ki: S
  
ÖSSZEGZÉS 2
N elemű tömb elemeinek összege
BE: A[N] N elemű tömb
KI: S, az összeg
Előfeltétel: N>=1

Algoritmus
Be: A[N]
S:=0
Ciklus i:=1..N
s:=s+A[i]
Ciklus vége
Ki: S

FAKTORIÁLIS
N! 1..N-ig a számok szorzata
BE: N, egész szám
KI: S, a számok faktoriálisa
Előfeltétel: N>=1

Algoritmus
Be: N
S:=1
Ciklus i:=1..N
s:=s*i
Ciklus vége
Ki: S
  
MEGSZÁMLÁLÁS 1
T tulajdonságú elemek darabszáma
BE: M,N egész számok
KI: DB, a T tulajdonságú elemek száma
Előfeltétel: N>=1

Algoritmus
Be: M,N
DB:=1
Ciklus i:=M..N
ha i T tulajdonságú akkor DB:=DB+1
Ciklus vége
Ki: DB

MEGSZÁMLÁLÁS 2
N elemű tömb T tulajdonságú elemeinek száma
BE: A[N] N elemű tömb
KI: DB, T tulajdonságú elemek száma
Előfeltétel: N>=1

Algoritmus
Be: A[N]
DB:=0
Ciklus i:=1..N
ha A[i] T tulajdonságú, akkor DB:=DB+1
Ciklus vége
Ki: DB
  
MAXIMUM KIVÁLASZTÁS
N elemű tömb legnagyobb eleme
BE: A[N] N elemű tömb
KI: MAX, a legnagyobb elem
Előfeltétel: N>=1

Algoritmus
Be: A[N]
MAX:=A[1]
Ciklus i:=2..N
ha A[i]>MAX akkor MAX:=A[i]
Ciklus vége
Ki: MAX

Az IP cím szerepe

Az IP-cím olyan egyedi hálózati azonosító, amelyet az Internet Protocol segítségével kommunikáló számítógépek egymás azonosítására használnak. Minden, az internetre kapcsolt számítógépnek van IP-címe. A gép IP-címe rendszeresen változhat, ami különösen a lakossági internetszolgáltatón keresztül kapcsolódó otthoni számítógépekre jellemző. Az IP-címek 32 biten ábrázolt egész számok, amelyeket hagyományosan négy darab egybájtos, azaz 0 és 255 közé eső, ponttal elválasztott számmal írunk le a könnyebb olvashatóság miatt.
Az internetet használó számítógépek minden tranzakció során (például egy weboldal megjelenítésekor) megadják IP-címüket, ami révén elvileg be lehet azonosítani az adott gép helyét és tulajdonosát, illetve egy adott géppel végzett tevékenységekről sok információt lehet gyűjteni. A gyakorlatban a számítógépek jelentős része az internetszolgáltatójától rendszeresen új IP-címet kap, így azonosítása csak a szolgáltató együttműködésével lehetséges, aki csak rendőri megkeresésre és más jól meghatározott esetekben adhatja ki.

Miért kell az IP címünket elrejteni

Az internet NEM ad anonimitást, mivel az IP címet alapból nem lehet elrejteni, mert a TCP/IP protokoll része. Az IP cím az internetes társadalomban az egyik legértékesebb információ, mert segítségével a teljes internetes tevékenységünk lenyomozható. Így az IP cím nem kívánt nyilvánossága elsődleges célponttá tehet bennünket.
Számtalan otthoni és munkahelyi számítógépben van olyan illegálisan bejuttatott program, amely lehetővé teszi azt, hogy a gép felhasználójának tudta és beleegyezése nélkül a hálózat felől bárki beléphessen a számítógépébe és ott adatokat töröljön, módosítson, információkat, jelszavakat stb. lopjon a gépből, kompromittáló anyagokat töltsön fel a gépre, vagy akár lehetetlenné tegye a számítógép további működését.
Ezen illegális (és bárki által használható) "kapuk" rendkívül veszélyesek. Néhány példa arra, hogy mekkora kárt lehet okozni a segítségükkel:
  • A gépben tárolt jelszavak, hozzáférési kódok ellopása
  • Billentyűzetleütés-figyelő segítségével a fenti információk azon részének megszerzése, amit a felhasználó nem a számítógépében, hanem például fejben tart
  • Bizalmas (céges) információk ellopása
  • A számítógépen lévő adatok észrevétlen módosítása
  • Különböző adatok és illegális (törvénybe ütköző) információk észrevétlen feltöltése a gép tulajdonosának kompromittálása céljából
Az IP címünk elárulásával a számítógépünket támadók eszköztárát jelentősen kiszélesítjük és sokkal egyszerűbbé válik számukra az információhoz jutás.

Az anonim proxyk

Az IP cím elrejtése nem egyszerű feladat. Ha csak böngészés közben kívánjuk álcázni magunkat, akkor nem kell mást tennünk, mint a böngészőnk hálózati beállításainál a proxyhoz beírni a kiválasztott anonim proxy IP címét és portszámát és már netez-hetünk is elvileg titokban. Ebben az esetben ugyanis az ellenállomás csak a proxy IP címét látja, a kiinduló IP címet nem. Fontos ugyanakkor, hogy anonim proxy üzemeltető láthatja az IP-t igen. Ha akarja, minden áthaladó információt naplózhat, így adott esetben jelszavakat, e-mail címeket is megszerezheti a gépünkről.
Egy jó anonim proxy megtalálása a kulcsa az IP cím elrejtésének. Keresgélhetünk weboldalakon keresztül (pl. google-ba beírjuk, hogy anonim proxy, de használhatunk kifejezetten erre a feladatra kifejlesztett ingyenes vagy fizetett programokat.
A proxy-knál a legnagyobb problémát általában a sebesség jelenti. Az ingyenes szerverekre pillanatok alatt rengeteg felhasználó csatlakozik, ami nagyon lekorlátozza a használhatóságot. Az anonim proxy kiválasztásnál ügyeljünk arra, hogy a Last Good Check idő ne legyen túl hosszú, az Uptime-ja %-ban minél magasabb legyen, és ping esetén jó rövid legyen a válaszideje.
Az ingyenes proxyk közül hiába választunk ki ugyanis egy viszonylag gyorsat, ez csak addig lesz elfogadható sebességű, amíg mások is meg nem találják (és ez viszonylag gyorsan meg szokott történni). A lelassult forgalom rákényszeríti a felhasználókat egy rajzáshoz hasonló rendszeres vándorlásra. Hiába várjuk ugyanis, hogy majd elmennek a többiek, és majd jobb lesz, ők is erre várnak. Aztán szinte egyszerre unja meg mindenki, és megy át máshová.

Egyéb módszerek

Ennél jóval biztosabb módja a rejtőzésnek a proxy láncolás. Ebben az esetben a felhasználó csatlakozik az egyik proxyra, amit arra utasít, hogy egy másik proxyn keresztül érjen el egy harmadikat, és az a harmadik van közvetlen kapcsolatban a webhellyel. A proxy láncolás nagy hátránya, hogy a lánc átviteli sebességét mindig a legszűkebb keresztmetszet határozza meg.
Az anonim proxy-nál biztonságosabb az úgynevezett distorting proxy. Ez a fajta proxy nem csak hogy nem adja tovább az IP címedet, de szándékosan hamis IP-t szolgáltat a http fejlécben.
 
 

A TOR projekt

A TOR projekt olyan ingyenes rendszer, amely szinte tökéletesen elrejti a valódi használók IP címét. A projekt fejlesztés alatt van és sebessége attól függ, hogy hány felhasználó ad a sávszélességéből a rendszer számára.

Hide My IP

Manapság a legnépszerűbb program a Hide My IP. A program az IP cseréli viszonylag jó hatékonysággal. A program tényleg láthatatlanná tesz, vagyis egy proxy szerveren keresztül hamis ip-címet mutat a meglátogatott szervereknek, ami arra jó, hogy újra be tudjunk menni egy oldalra, ahonnan kitiltottak, vagy úgy küldjünk emaileket, blogkommenteket, fórumhozzászólásokat, hogy azokat ne lehessen ip alapján lenyomozni
 

A C++ alapjai

                              
A C++-t Bjarne Stroustroup fejlesztette ki a C nyelv kibõvítéseként az objektum-orientált paradigmával.
Kezdõknek nem ajánlott,de ez az írás a legkönnyebb,amit csak találhatsz és a legeredményre vezetõbb.
A továbbképzés a C++ reference angol nyelvû oldalon,a grafikához az OpenGL,grafikai nyelv.
Ajánlott fordítók:Dev C++ 4.9.9.2 vagy 5.0.0.4.
Bocs a nyelvtani hibákért,de kb.1 óra alatt írtam ezt le(plusz dev c++-szal fordítottam html-re).
1.Alapok
1.1 Hello World!

#include <stdio.h>
#inlclude <conio.h>
main(){
printf("Hello World");
getch();
}

#include-beágyazott fájlok(stdio-printf,conio-szöveges,getch());
printf()-kiiratás
getch()-egy karakter megadását várja
main()-a c++ programok fõtörzse

1.2Beolvasás:
scanf()-ez tipusosan olvas
Pl.:

#include <stdio.h>
#include <conio.h>
main(){int d;
printf("Irj be egy számot:");
scanf("%d",&d);
printf("A szám:%d",d);
getch();
}

%d-integer tipusú számváltozó
scanf("%változótipus",&változó)
-a kiiratas is hasonló

1.3Tipusos olvasás,kiírás:

%c-karakter
%s-karaktertömb
%d,i-egész szám(int,long,short)
%e,f,g-lebegõpontos(double,float)
%E-exponenciális függvényhez
%p-pointerhez

1.4Változótipusok
A változó nevében csak az angol ABC betûi, a számok és a _  jel lehet
Pl.:
valtozo_1-helyes
valtozo*1-helytelen
const-konstans változó,változhatatlan;Pl.: const int x=5;
Számok:
int=integer-integrált tipus,kb. 11 jegyû számokat kezel +,-;létezik unsigned,vagyis elõjelnélküli verziója
long-hosszú;
long long-hosszabb(20 jegy fölött)
double-lebegõpontos(helyezhetsz bele egész számot)
float-lebegõpontos
A számváltozók határait próbálgasd,jó a gyakorláshoz
char-karakter
string-szöveg

1.5Megjegyzések
//egy soros
/*
t0bb soros
*/

1.6Tömbök
Példa:
vátozótipus tömbnév[elemekszáma];
Pl.:
#include <stdio.h>
#include <conio.h>
main(){int tombnev[1];               //két eleme van(0,1,2 stb.)
printf("Irj be egy számot:");
scanf("%d",&tombnev[0]);          //1. elem bekérése
printf("A szám:%d",tombnev[0]);         //1. elem kiírása
getch();
}
Bekéri majd kiírja a tömb elsõ elemét

Pl2.:
#include <stdio.h>
#include <conio.h>
int tombnev[2];               //3 eleme van
main(){
printf("Irj be egy számot:");
scanf("%d\n%d\n%d",&tombnev[0],&tombnev[1],&tombnev[2]);          //1. három elem bekérése
printf("A szám:%d\t%d\t%d",tombnev[0],tombnev[1],tombnev[2]);         //elemek kiírása
getch();
}
\t-tabulátor utána
\n-új sorba utána

1.7Ciklusok
1.7.1Elõltesztelõs

while(feltétel){
utasítások;
};

Pl.:
#include <stdio.h>
#include <conio.h>
main(){int i;
while(i!=5){
i=i+1;
};
getch();
}

!=-nem egyenlõ
addig számol,ameddig i nem egyenlõ 5-tel
1.7.2Hátultesztelõs ciklus
do{
utasítások:
}while(feltétel);
Ugyanaz,mint az elõltesztelõs,csak ebben az utasítás mindenképpen végrehajtódik.
1.7.3Számláló ciklus
for(kezdeti érték;feltétel;módosítás){
utasítás;
};
Pl.:
#include <stdio.h>
#inlclude <conio.h>
main(){
for(int i=1;i<=10;i++){
printf("Hello World");};
getch();
}
Kiírja a Hello World-öt 10-szer
<=-kisebb vagy egyenlõ
i++-növelés
1.7.4Switch(kapcsoló)
switch(változóneve){
case(1. érték):  utasítás;break;
case(2. érték):  utasítás;break;
default: utasítás ;break;
};
break helyett continue=folytatás
default-alapértelmezett parancs
csak számérték mehet zárójelbe, a karakter két ' jel közé:
PL.:
case 'c':ut.;break;
Elágazás-if(ha)-a feltétel teljesülésébõl kifolyólag teljesülnek a parancsok:
if(feltétel){parancsok;} else if(2. feltétel){2. parancs}...if(n f.){n ut.;};
1.8Mûveletek
Aritmetika:
+  -plusz
-   -mínusz
*   -szorzás
/   -osztás
%  -moduló,meghatározza az osztás nem egész részét
Pl.:
int a=5;
int b=10;
int c=a+b;
c=10;
Logikai:
&&-és
||-vagy
!-nem,tagadás
Bitmûveletek:
&-és
|-vagy
^-kizáró vagy
!= nem egyenlõ
<<-eltolás balra
>>-eltolás jobbra
~-egyes komplemens
Összehasonlítás
<-kisebb,mint
>-nagyobb,mint

1.9Matematikai(math.h include-dal)
sqrt-négyzetgyök
sqr-négyzet
exp-exponenciális,e a x-ediken
Pl.:
double x=exp(5);
sin,cos,tan-trigonometriai:double x=sin(0.5);
sinh,cosh,tanh-a hiperbolikus értékük
atan2  -  double z=atan2(1,2);-1/2 arkusz tangense
frexp-double x=frexp(&x,&y);az ldexp ugyanígy
pow-hatvány- int x=pow(2,5);  //2 az 5.-en
ceil-kerekítés fel;int x=ceil(5.5);
floor-kerekítés le

Complex számok(complex.h-val)
complex szám készítése:
#include <stdio.h>
#inlclude <conio.h>
#include <math.h>
#include <complex.h>
main(){
complex<double> mycomplex(5.5,2.560);   //complex készítése
printf("Complex:%g",real(mycomplex));     
getch();
}
realon kívül lehet:
conj,abs,arg,polar,imag;


2.0  Struct,enum
enum-felsorolás
Pl.:

enum color{blue,red,green};
color[0]=blue;

struct-struktúra
Pl.:
struct{
int x;
int y;
}hello;
hello.x=5;

A Union:

union{
int a;
struct{
int b;
}hello1;}hello2;
hello2.a=5;  //a külsõ(uniós)
hello.1.b=10;  //belsõ struktúrás

2.1Az OOP(Objektum-orientált programozás) alapjai 
Az OOp egy új paradigma,amely a természetes,valóságos gondolkodást támogatja.
Kisebb bemutató:
class-az osztály;használata :

class valami{
public:
int x;
int y;
};
valami deklaralas; //ez a valami osztály deklarálása,nem magyarázat
deklaralas.x=5;
deklaralas.y=10;

public-az osztály tartalmának a tulajdonsága(ez publikus),lehet:
protected-védett
private-magán(alapértelmezett)

Konstruktor és destruktor:

class valami{
int x;
inty y;
valami(int newx,int newy); //konstruktor deklarálása
~valami()void; // destruktor deklarálása
};
valami::valami(int newx=5,int newy=10){  //konstruktor definíciója
x=newx;
y=newy;
}
valami::~valami(){    //destruktor definíciója(nem szükséges mindig)
delete [] x;  // az x változó törlése
};
Öröklés:
Új osztály nyitása egy elõzõ osztály gyermekeként:
Pl.:class gyermekosztalyneve:apjaé(,anyjaé is,ha kell){...};

Fontos összetevõ még a polimorfizmus(többrétûség):egy osztályon belü több azonos nevû függvény is lehet.

2.2Konverterek

itoa-integer stringgé
Pl.:
int x=5;
int szammod=10; //decimélis számrendszer,(2-36-ig)
char y[3];
itoa(x,y,szammod);

atol-string longba:
char x[2];
x[0]='a';
long y=atol(x[0]);
egyéb stringbõli:
atof-lebegõpontosba
atoi-integerbe

ecvt,fcvt,gcvt-double stringbe
char x[5]=ecvt(double értéke,int meddig,int decimális_határ,int sign);

gcvt(ajánlottabb):
gcvt(double doublerteke,int hanyszamot,karaktervaltozoneve);

toupper:nagybetûbe a stringet:
toupper(stringnev);
toascii(stringnev); //ascii-ba

strlwr(stringnev);  // a stringben lévõ nagybetûket kicsire cseréli

strcmp(char x,char y); //összehasonlítsa az elsõt a másodikkal

strcat(char x,const char y);  //az elsõ stringet a másodikba fûzi

copy(&char[0],&char[100],&char2[0]);// az elsõ string elsõ karakterétõl a 100.-ig
a másodikba másolja az 1. elemétõl

2.3Makrók
va:
va_list
va_start
va_arg
va_end
Pl.:
(Összeadja a számokat)
int summa(int n,...)
{
int sum=0;
va_list list;
va_start(list,n);
sum=sum+va_arg(list);
va_end (list);
return sum;
};


IS:

isalpha:alpha-e Pl.:
int x=isalpha(int condition);
egyéb:
isalphanum-        alphanumerikus-e
isascii-  ascii-e
iscntrl-  controll-e
isspace-  space-e
isdel...
isdigit-  szám-e
isxdigit-  hexadecimális szám-e

2.3A rendezés
A rendezés terén a legegyszerûbb és egyben legcélszerûbb a quicksort a tömben lévõ elemek
sorba állítására:

#include <stdio.h>
#include <conio.h>
#include <algorithm>  //az algoritmus include f'ájlt kell használni
main(){
int tomb[6]={2,6,7,5,8,4};  
int compare(const void *,const void *){ //a compare mód definiálása
return *(int*)a-*(int*)b;
};
qsort(tomb,6,sizeof(int),compare); //vagyis:(tombnev,int elemekszama,sizeof(valtozotipus),compare);
getch();
}

2.4 Az iostream elõnyei
#include <iostream>
main(){
int a=5;
int b;
int tomb[10];
cout<<"Hello"<<endl;   //kiiratás
cin>>b;  //beolvasás
int c=a+b;
cout<<c<<endl;
cin.getline(tomb,10); // vagyis: cin.getline(tombnev,hanyat) - karaktertömbök könnyed beolvasására
cin.get(); //rendszer pause
}
/*
Több a c++ reference oldalán
*/

2.5 A string.h
Egy string:
string mystring("Hello");
több stringgel:

string mystring("Hello");
string mystring1("Chao");
string mystring2("Hi");
string mystring3=mystring+mystring1+mystring2;

2.6 A permutáció
Számok,karakterek elhelyezkedésének indexsora. 
Ird be:
#include <stdio.h>
#include <iostream>
#include <algorithm> //legszükségesebb include
#include <conio.h>
main(){
int myints[3]={1,2,3,4};
int d=1;
printf("Négy szám permutációja:");
do{
cout<<d<<". "<<myints[0]<<myints[1]<<myints[2]<<myints[3]<<endl;
}while(next_permutation(myints,myints+4));
getch();
}


2.7 Fájlkezelés:
Könnyítõpéldák(így egészben nem feltétlen mûködik,de a kódokat ajánlott külön tanulmányozni!):
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
main(){int x,i=5;
char tomb[5];
FILE * File;   // File nevû belsõ fájlnév létrehozása
File=fopen("text.txt","w"); // text.txt létrehozása,ha nincs,megnyitása,ha van
/*
File=fopen("fájlnév kiterjesztéssel","mód*");  *módok: w=írásra;r=olvasásra;
a=hozzáfûzésre és olvasásra;a+=hozzáfûzésre és írásra;
*/
if(File!=NULL){
fputs("Hello World!",File); //szöveget helyez a fájlba
fprintf(File,"%d",i);  //Fájlba ír típusosan:fprintf(BelsoFile,"valtozotipus",valtozo);
fscanf(File,"%d",x);  //beolvasás a fájlból:egy x,integer típusú értéket;
fgets(tomb,5,File);  //karakterek,vagy számok megadása a fájlból
}
getch();
}

Az fread fájlból olvasás használata:
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
main(){
FILE * File;
long lsize=ftell(File);
size_t result;
char buffer[10];
buffer=(char*)calloc(10,sizeof(char)); //calloc:memóriafoglalás a char változóhoz
fseek(File,0,SEEK_END);
rewind(File);
result=fread(buffer,1,lsize,File);
getch();
}
2.8 Mutatók vagy pointerek
A pointerek szám típusú változók,melyek egy változó memóriában foglalt címét jelzi.Nagyon fontosak a programozásban,a c++ ereje.
Egyszerû pointer:  int valtozo;
int *pointer=&valtozo;

Referenciatípus:(a változó referenciája,a pointerrel szemben csak egyszer adható neki érték)
int valtozo;
int &referenciatipus=valtozo;

Pointeres referenciatípus:
int *pointer;
int *&referenciapointer=&pointer;

New típus:
double *ujcim;
ujcim=new double;
*ujcim=5.5;

Pointerre mutató pointer:
Egyszerû,csak elé kell tenni mégegy csillagot:
int valtozo;
int *pointer=&valtozo;
int *pointerremutatopointer=&pointer
int *pointerremutatopointerremutatopointer=&pointerremutatopointer

Azt hiszem ennyi elég lesz az alapszinthez.A továbbiakban látogasd meg a c++ reference
oldalát és keresgess benne.Ajánlom a for ciklus használatának gyakorlását,mivel annak
elsajátítása könnyedén haladó és magasabb szintre emeli a gyakorlót és erõs eszköz is lehet.


Írjunk puzzle-t php segítségével, legyen kirakandó egy kép

<?php
      include("config.php");
?>
<html>
<head>
<title>Puzzle - php</title>
<script language="JavaScript" type="text/javascript" src="puzzle.js"></script>
</head>
<body>
<center>
<h1>

<form name="puzzle" action="" method="POST">
<font size="3"><a href="http://gorbem.hu">gorbem.hu</a> &nbsp;</font>
<input type="submit" name="alap" value="Alap"/> &nbsp;
<u>Puzzle</u> &nbsp;
<input type="submit" name="kever" value="Kever"/>
<font size="3"><a href="http://www.gmsoft.uw.hu">gmsoft.uw.hu</a></font>
</form>
</h1>
<?php

if (( !isset($_POST['alap']) &&  !isset($_POST['kever']) && !isset($_POST['csere']) ) || ( isset($_POST['alap']) )){
      print "<img src=\"0.JPG\" width=\"492\" height=\"368\">\n";
}


function onscreen(){
      $k = 0;
      $ered = mysql_query("SELECT * FROM Puzzle");
      print "<table border=\"1\" bordercolor=\"white\" cellpadding=\"0\" cellspacing=\"0\" >\n";
      while ($sora = mysql_fetch_object($ered)){
            $k++;
            if ( ($k==1) || ($k==5) || ($k==9) || ($k==13) ){print "<tr>";}
            print "<td><img src=\"$sora->KNev\" width=\"123\" height=\"92\"></td>";
            if ( ($k==4) || ($k==8) || ($k==12) || ($k==16) ){print "</tr>";}
      }
      print "</table>";
}

function cserel($a,$b){
      $ered = mysql_query("SELECT * FROM Puzzle WHERE id='$a'");
      $sora = mysql_fetch_object($ered); $p = $sora->KNev;
      $ered = mysql_query("SELECT * FROM Puzzle WHERE id='$b'");
      $sora = mysql_fetch_object($ered); $q = $sora->KNev;
      mysql_query("UPDATE Puzzle SET KNev='$q' WHERE id='$a'");
      mysql_query("UPDATE Puzzle SET KNev='$p' WHERE id='$b'");
}

function vizsgal(){
      $kesz = true;
      $ered = mysql_query("SELECT * FROM Puzzle");
      while ($sora = mysql_fetch_object($ered)){
            $n = $sora->id;
            $n = $n+0;
            $knev = $sora->KNev;
            $k = substr($knev,0,2)+0;
            if ( $n !== $k ){$kesz = false;}
      }
      return $kesz;
}

if ( isset($_POST['kever']) ){
      for ($i=0; $i<100; $i++){
            cserel(rand(1,16),rand(1,16));
      }
      onscreen();
}

if ( isset($_POST['csere']) ){
      $a = 0;
      $b = 0;
      for ($i=1; $i<=16; $i++){   
            $l = "ch";
            $m = $l.$i;
            if ( isset($_POST[$m]) ){
                  if ( $a==0 ){
                        $a = $i;
                  }
                  else $b = $i;
            }
      }
      cserel($a,$b);
      if ( vizsgal() ){
            print "<img src=\"0.JPG\" width=\"492\" height=\"368\">\n";
      }
      else onscreen();
}

print "<form name=\"csere\" action=\"\" method=\"POST\" >\n";
print "<table border=\"1\" cellpadding=\"0\" cellspacing=\"0\" >\n";
for ($i=1; $i<=4; $i++){
      print "<tr>\n";
            for ($j=1; $j<=4; $j++){
                  print "<td align=\"center\">"; $k = 4*($i-1)+$j;
                  print "<input type=\"checkbox\" name=\"ch$k\" onclick=\"Kuld()\"/></td>\n";
            }
      print "</tr>\n";
}
print "</table>\n";
print "<input type=\"hidden\" type=\"submit\" name=\"csere\" value=\"\"/>\n";
print "</form>\n";

?>
</center>
</body>
</html>