Hello Világ!
Minden programozási nyelvben írt első program a "Hello Világ" program, ez most sem legyen másképp.
Az alábbi kód üdvözli a környezetét standard outputon (Konzolon) és Windows-os ablakban (MessageBox)
is.
import System.Console;
import System.Windows.Forms.*;
public final class Program extends Object
{
/**
* statikus String konstans létrehozása
*/
public final static String HelloVilag= "Hello, Világ!";
/**
* futtatáskor ezt a fv-t futtatja a környezet
*/
public static void main(String[] args)
{
(new Program()).Run(args);
}
/**
* "Hello, Világ!" a standard kimeneten
*/
private void DefOutput()
{
System.Console.WriteLine("Kimenet a konzolon...\n");
Console.get_Out().WriteLine(HelloVilag);
System.Console.WriteLine("Nyomjon ENTER-t a folytatáshoz...\n");
Console.ReadLine();
}
/**
* a Program osztály Run fv-e, ami meghívásra kerül
*/
private void Run(System.String[] args)
{
// Konzol
this.DefOutput();
// Windows
WinOutput();
}
/**
* "Hello, Világ!" a Windows form kimeneten
*/
private void WinOutput()
{
System.Console.WriteLine("Kimenet a Windows
ablakon...");
// statikus adattag osztályszintű hivatkozása
MessageBox.Show(Program.HelloVilag, "MessageBox kimenet.");
System.Console.WriteLine("Nyomjon ENTER-t a folytatáshoz...\n");
Console.ReadLine();
}
}
Legfontosabb kulcsszavak
A honlap böngészése során megismerkedhettünk a legfontosabb kulcsszavakkal. A következő program
ezek egy-egy alkalmazását hivatott bemutatni. Megtalálhatóak benne a legegyszerűbb vezérlési
szerkezetek, alprogramok hívása, kivételek dobása, elkapása, láthatósági kulcsszavak stb..
import System.*;
public class Exercise
{
// osztály adattagja
// static kulcsszóra szükség van, mert a main is static és ott is használjuk
public static int number;
public static void main()
{
String customerName;
int temp;
String strNumber;
// Hátul tesztelő ciklus
do
{
// Menu
Console.Write(
"\n(1) Stringet szeretne beolvasni" +
"\n(2) Intet szeretne beolvasni" +
"\n(3) Kivételt szeretnék dobni" +
"\n(4) Ciklust szeretnék használni" +
"\n(5) Kilép\n");
Console.Write("\nAdjon meg egy opciót: ");
temp = Integer.parseInt(Console.ReadLine());
// switch vezérlési szerkezet
switch (temp)
{
// string beolvasása inputról
case 1:
Console.Write("Neve: ");
customerName = Console.ReadLine();
Console.WriteLine();
Console.Write("Neve: ");
Console.WriteLine(customerName);
break;
// integer beolvasása inputról
case 2:
Console.Write("Kérek egy természetes számot: ");
strNumber = Console.ReadLine();
number = Integer.parseInt(strNumber);
Console.WriteLine("Szám: " + number);
break;
// kivételkezelés
case 3:
// metódus hívása
kivételek();
break;
case 4:
Console.Write("\nMeddig szeretné kiíratni a számokat: ");
number = Integer.parseInt(Console.ReadLine());
// metódus hívása paraméterrel
ciklus(number);
break;
case 5:
Console.WriteLine("\nViszontlátásra!\n");
break;
default:
Console.Write("Nincs ilyen opció!\n");
continue; // vezérlés átadó kulcsszó
}
}
while(temp!=5);
}
// osztály metódusa public jogokkal
public static void kivetelek()
{
try
{
Console.Write("Hány éves vagy?: ");
number = Integer.parseInt(Console.ReadLine());
// elágazás vez. szerk.
if (number < 20) throw new NullPointerException();
else throw new IndexOutOfRangeException();
}
catch (NullPointerException e)
{
Console.Write("\nA kivétel, amit elkaptam: \n" + e);
}
catch (IndexOutOfRangeException e)
{
Console.Write("\nA kivétel, amit elkaptam: \n" + e);
}
finally // finally block!!!
{
Console.Write("\nA finally ág mindenképpen lefut\n");
}
}
// osztály metódusa private jogokkal
private static void ciklus(int top)
{
for (int i = 0; i < top; i++)
Console.Write(" " + i);
}
}
Egy összetettebb feladat
Most pedig egy összetettebb feladat megoldásán keresztül megmutatjuk, milyen egy Visual J# projekt.
A megoldandó feladat nem teljesen triviális, ámde látványos. Azaz a megoldás megértéséhez kissé
bele kell ásni magunkat a problémakörbe. Ez pedig a digitális képelemzés, és az éldetektálás.
Aki érdeklődik ez iránt, annak a Grafika sáv Bevezetés a digitális képelemzés c. előadást ajánlom.
Feladat:
Adott egy szürkeárnyalatos kép. Meg kell keresni a képen, hogy hol találhatóak benne élek.
Megoldás:
Prewitt féle gradiens alapú éldetektálás, és a pontos lokalizációhoz a nem maximális élek elnyomása.
Futtatási/fejlesztői környezet:
- .NET 2.0 keretrendszer
- Microsoft Visual Studio 2005
A programban több fejezetből is található példa. Néhány olyan példa, ami az előző példaprogramokban
nem fordult elő:
- Típusok, típuskonstrukciók: tömb
Többdimenziós tömb használata. Mivel a nyelvben nincsenek többdimenziós tömbök, ezért
tömbök tömbjét használjuk helyette:
// DigiKepElem.jsl
public class BmpDump {
...
// Egy raszteres kép pixeljeinek szürkeárnyalatát tartalmazza
public int[][] Pixel;
}
// DigiKepElem.jsl
// Gradiens orientáció mátrixából készít BmpDump-ot
// Valósakat tartalmazó mátrix átadása függvénynek
static public BmpDump OrientToBmpDump(double[][] Orient) {
...
}
- Objektum-orientált programozás:
A probléma megoldását több osztály elkészítésével oldottuk meg:
- Digikep_Form ami a System.Windows.Forms.Form-ból származik:
A grafikus felületet valósítja meg
- About ami a System.Windows.Forms.Form-ból származik:
A Súgó menü Névjegy menüpontjára felbukkanó Form
- BmpDump:
Egy raszteres kép szürkeárnyalatos pixeljeit tartalmazza. Biztosítja a kétirányú
konvertálást a .NET Bitmap osztálya felé
- FilterWindow:
Dobozszűrő értékeit és jellemzőit tartalmazza
- DigiKepElem:
A megoldás legfontosabb osztálya. Ez az osztály valósítja meg a képelemző
algoritmusokat. Az algoritmusok a BmpDump osztály objektumain hajtódnak végre.
- Szabványos könyvtárak:
A .NET keretrendszer könyvtárait használtuk a grafikus felület elkészítéséhez, a kivételekhez,
a matematikai számításokhoz.
// Form1.jsl
public class Digikep_Form extends System.Windows.Forms.Form {
...
}
// Form1.jsl
private void Megnyitas_ToolStripMenuItem_Click(Object sender, System.EventArgs e)
{
OpenFileDialog dlg = new OpenFileDialog();
...
String kepNev = dlg.get_FileName();
try {
eredeti_pictureBox.set_Image(new Bitmap(kepNev));
...
}
catch (Exception ex) {
String szov = "Nem sikerült megnyit a(z) " + kepNev + " fájlt.\n" + ex.get_Message();
MessageBox.Show(this, szov, "Hiba", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
...
}
// DigiKepElem.jsl
static public ArrayList Gradiens(BmpDump Pict, double p) {
...
orient[i][j] = System.Math.Atan2((double)fdx.Pixel[i][j], (double)fdy.Pixel[i][j]);
...
}
A teljes példaprogram és a Visual J# (Visual Studio 2005) project megtalálható a
programs alkönyvtárban a
Digikep.zip fájlban.
Egy másik összetett feladat
A következő linken található program bemutatja, hogyan lehet C#-os osztályokat,interfészeket és sablonokat felhasználni egy J# programban, továbbá mutat példát szálkezelésre és kivételkezelésre. A program Visual Studio 2005 alatt készült.
A példaprogram jól kommentezett, de ha nem elegendő az ottani segítség, akkor ezen nyelvleírás megfelelő részén taláhat bővebb információt.