Vezérlési szerkezetek


ciklusok használata

1. variáció (Vez.java): elöltesztelő ciklus használata

...
i=1;
while(i<=n) {
 ...
 i=i+1;
 }
...

public class Vez {
public static void main(String[] args) {
  int i=1,j=2,n=15;

  System.out.println("******************************");
  System.out.println("Az elso "+n+
                     " paros szam kiirasa:");
  while(i<=n) {
   System.out.println(i+". paros szam: "+j);
   j=j+2;
   i=i+1;
   }
  System.out.println("******************************");
  }
 }
 

2. variáció (VezV1.java): hátultesztelő ciklus használata

...
i=1;
do {
 ...
 i=i+1;
 } while(i<=n);
...

public class VezV1 {
public static void main(String[] args) {
  int i=1,j=3,n=15;

  System.out.println("Az elso "+n+
  " harommal oszthato szam kiirasa:");
  do {
   System.out.println(i+". szam: "+j);
   j+=3;
   i+=1;
   } while(i<=n);
  }
 }

3. variáció (VezV2.java): rögzített lépésszámú ciklus használata

...
for(i=1;i<=n;i++) {
 ...
 }
...

public class VezV2 {
public static void main(String[] args) {
  int i,j=2,n=16;

  System.out.println("2 elso "+n+
  " hatvanyanak kiirasa:");
  for(i=1;i<=n;i++) {
   System.out.println("2^"+i+" = "+j);
   j*=2;
   }
  }
 }


elágazások használata

1. variáció (Vez1.java): egyirányú elágazás használata

Feladat: vizsgáljuk meg, hogy megadtunk-e parancssori paramétereket? Ha nem, adjunk hibaüzenetet. Ha igen, írassuk ki mindegyiket!

...
if(...) {
 ...
 }
...

public class Vez1 {
public static void main(String[] args) {
  if(args.length==0) {
   System.out.println("keves parameter!");
   System.exit(1);
   }
  System.out.println("a parancssori parameterek:");
  for(int i=0;i<args.length;i++) {
   System.out.println("\t"+i+". parameter: "+args[i]);
   }
  }
 }

A System.exit(...); utasítás azonnal befejezi a program futását.
Paraméterként egy (tetszőleges) egész szám adható meg, ezt hibakódként értelmezhetjük (de ezt a kódot sehol sem használjuk fel).

2. variáció (Vez1V1.java): az előző példa kétirányú elágazással

...
if(...) {
 ...
 }
else {
 ...
 }
...

public class Vez1V1 {
public static void main(String[] args) {
  if(args.length==0) {
    System.out.println("keves parameter!");
    System.exit(1);
    }
  else {
    System.out.println("parameterek szama: "+args.length);
    }
  System.out.println("a parancssori parameterek:");
  for(int i=0;i<args.length;i++) {
    System.out.println("\t"+i+". parameter: "+args[i]);
    }
  }
}


egymásba ágyazott kétirányú elágazások használata

1. variáció (Karakter.java): karakterek jellemzőinek kiírása

Feladat: adjunk meg egy karaktert parancssori paraméterként, és írassuk ki a legfontosabb jellemzőit!

...
if(...) {
 ...
 }
else if(...) {
 ...
 }
else if(...) {
 ...
 }
else {
 ...
 }
...

public class Karakter {
public static void jellemzok(char c) {
  String s;
  if(c<(char)32) s="vezerlo karakter";
  else if('0'<=c && c<='9') s="szamjegy";
  else if('A'<=c && c<='Z') s="angol nagybetu";
  else if('a'<=c && c<='z') s="angol kisbetu";
  else if(c>(char)127) s="valoszinuleg ekezetes betu";
  else s="egyeb karakter";
  System.out.println("A beirt karakter: "+c);
  System.out.println("A beirt karakter kodja: "+(int)c);
  System.out.println("A beirt karakter tipusa: "+s);
  }
public static void main(String[] args) {
  if(args.length==0) {
   System.out.println("keves parameter!");
   System.exit(1);
   }
  char c=args[0].charAt(0);
  jellemzok(c);
  }
}

Figyeljük meg, hogy a jellemzok(...) eljárásban az if(...), else if(...) és else elágazások után csak egy utasítás áll.
Ilyenkor az utasításblokk kezdetét és végét jelző kapcsos zárójelek ( { ... } ) elhagyhatóak.


Kiegészítő anyag

2. variáció (Vez2V1.java): másodfokú egyenlet megoldása

public class Vez2V1 {
public static double masodfoku(double a,double b,double c,double x) {
 return a*x*x + b*x + c;
 }
public static void main(String[] args) {
 if(args.length<3) {
  System.out.println("keves parameter!");
  System.exit(1);
  }
 if(args.length>3) {
  System.out.println("sok parameter!");
  System.exit(2);
  }
 double a=Double.parseDouble(args[0]);
 double b=Double.parseDouble(args[1]);
 double c=Double.parseDouble(args[2]);
 if(a==0) {
  System.out.println("nem masodfoku az egyenlet!");
  System.exit(3);
  }
 double d=b*b-4.0*a*c; //diszkrimináns!
 if(d<0) {
  System.out.println("nincs valos megoldas");
  }
 else if(d==0) {
  double x=-0.5*b/a;
  System.out.println("egy valos megoldas van");
  System.out.println("x == "+x);
  System.out.println("a*x^2 + b*x + c == "+masodfoku(a,b,c,x));
  }
 else {
  double x1,x2;
  x1=0.5*(-b+Math.sqrt(d))/a;
  x2=0.5*(-b-Math.sqrt(d))/a;
  System.out.println("ket valos megoldas van");
  System.out.println("x1 == "+x1);
  System.out.println("a*x1^2 + b*x1 + c == "+masodfoku(a,b,c,x1));
  System.out.println("x2 == "+x2);
  System.out.println("a*x2^2 + b*x2 + c == "+masodfoku(a,b,c,x2));
  }
 }
}

Kiegészítő anyag vége


többirányú elágazás használata

1. variáció (Vez3.java): többirányú elágazás egy egész számérték alapján

Feladat: olvassunk be parancssori paraméterként egy számot, és értelmezzük osztályzatként! Írassuk ki az osztályzatot szöveges formában!

...
switch(j) {
 case 1:...;break;
 case 2:...;break;
 ...
 default: ...;
 }
...

public class Vez3 {
 public static void main(String[] args) {
  if(args.length<1) {
   System.out.println("keves parameter!");
   System.exit(1);
   }
  String s;
  int j=Integer.parseInt(args[0]);
  switch(j) {
   case 1:s="elegtelen";break;
   case 2:s="elegseges";break;
   case 3:s="kozepes";break;
   case 4:s="jo";break;
   case 5:s="jeles";break;
   default:s="???";
   }
  System.out.println("a megadott jegy: "+j+" ("+s+")");
  }
 }


kivételkezelés

1. variáció (Vez4.java): a konverziós hibáknak és az indexek túlcsordulásának a kezelése

...
try {
 ...
 }
catch(ArrayIndexOutOfBoundsException e) {
 ...
 }
catch(NumberFormatException e) {
 ...
 }
catch(Exception e) {
 ...
 }
...

public class Vez4 {
 public static void main(String[] args) {
  try {
   String s;
   int j=Integer.parseInt(args[0]);
   switch(j) {
    case 1:s="elegtelen";break;
    case 2:s="elegseges";break;
    case 3:s="kozepes";break;
    case 4:s="jo";break;
    case 5:s="jeles";break;
    default:s="???";
    }
   System.out.println("a megadott jegy: "+j+" ("+s+")");
   }
  catch(ArrayIndexOutOfBoundsException e) {
   System.out.println("keves parameter!");
   }
  catch(NumberFormatException e) {
   System.out.println("szamot kell megadni!");
   }
  catch(Exception e) {
   System.out.println("mas hiba???"+e);
   }
  }
 }

2. variáció (Vez4V1.java): az előző példa megoldása úgy, hogy csak a kivételhez vezető utasítás(ok) vannak a kivételkezelő blokkban

public class Vez4V1 {
 public static void main(String[] args) {
  String s;
  int j=0; //kezdőértékadás a try blokk előtt
  try {
   j=Integer.parseInt(args[0]);
   }
  catch(NumberFormatException e) {
   System.out.println("szamot kell megadni!");
   System.exit(1);
   }
  catch(ArrayIndexOutOfBoundsException e) {
   System.out.println("keves parameter!");
   System.exit(2);
   }
  catch(Exception e) {
   System.out.println("mas hiba???"+e);
   System.exit(3);
   }
  switch(j) {
   case 1:s="elegtelen";break;
   case 2:s="elegseges";break;
   case 3:s="kozepes";break;
   case 4:s="jo";break;
   case 5:s="jeles";break;
   default:s="???";
   }
  System.out.println("a megadott jegy: "+j+" ("+s+")");
  }
 }



Feladatok:

(1) Adjon meg parancssori paraméterként egy egész számot, és tárolja el az n nevű (int típusú) változóban. Ha hiba lép fel, írassa ki a hibára vonatkozó információkat és lépjen ki a programból. Írassa ki az alábbi két sorozat első n elemét egymás mellett, táblázatos formában, az elemek sorszámának kiíratásával együtt, valahogy így:
 

Sorszam Elso sorozat Masodik sorozat
1 5 3
2 7 9
3 9 27
4 11 81
... ... ...

(2) Adjon meg parancssori paraméterként egy egész számot, és tárolja el az n nevű (int típusú) változóban. Ha hiba lép fel, írassa ki a hibára vonatkozó információkat és lépjen ki a programból. Ezután n tárolt értékétől függően írasson ki egy szót:

(3) Az előző feladatot oldja meg egy függvény elkészítésével, amely egy paraméterként megadott számhoz a (2) feladatban megadott szavakat rendeli hozzá!


Boda István, 2013. november 4.