C, PHP, VB, .NET

Дневникът на Филип Петров


* Оператори if-else, switch, цикли

Публикувано на 13 септември 2009 в раздел ПИК3 Java.

При операторите if-else и switch, както и при циклите for, while и do-while няма никакви изненади спрямо езика за програмиране C. Синтаксисът при Java е абсолютно аналогичен. Нов е само последният цикъл (т.8), на когото ще обърнем повече внимание. Ще демонстрираме директно с примери без да обясняваме детайлно функционалността на операторите и циклите.

1. Конструкция if-else: решава уравнението ax+b=0:

    int a=2, b=3;
    if (a!=0) System.out.format("x = %d\n",(-b/a));
    else{
      if (b == 0) System.out.format("%s", "Any x is a solution");
      else System.out.format("%s", "There is no solution");
    }

2. Оператор switch: показва ден от месеца спрямо подадено число:

    int month = 3;
    switch (month) {
      case 1:  System.out.format("%s", "January\n");
               break;
      case 2:  System.out.format("%s", "February\n");
               break;
      case 3:  System.out.format("%s", "March\n");
               break;
      case 4:  System.out.format("%s", "April\n");
               break;
      case 5:  System.out.format("%s", "May\n");
               break;
      case 6:  System.out.format("%s", "June\n");
               break;
      case 7:  System.out.format("%s", "July\n");
               break;
      case 8:  System.out.format("%s", "August\n");
               break;
      case 9:  System.out.format("%s", "September\n");
               break;
      case 10: System.out.format("%s", "October\n");
               break;
      case 11: System.out.format("%s", "November\n");
               break;
      case 12: System.out.format("%s", "December\n");
               break;
      default: System.out.format("%s", "Invalid month.\n");
    }

3. Цикъл while: намира НОД по алгоритъма на Евклид:

    int A = 28;
    int B = 48;
    System.out.format("NOD(%d,%d) = ", A,B);
    while (A != B){
      if (A > B)  A = (A-B);
      else  B = (B-A);
    }
    System.out.format("%d",A);
  }

4. Цикъл do-while: изчислява n!:

    int n = 6;
    System.out.format("n = %d =>",n);
    long factorial = 1L;
    do {
      factorial *= (long)n;
      n--;
    }while (n > 0);
    System.out.format("n! = %d\n",factorial);

5. Цикъл for: извежда четните числа от масив:

    int[] array = {2,5,12,4,3,13,18,-5,-4,8};
    for (int i=0; i<array.length; i++){
      if (array[i]%2 == 0) System.out.format("%d ",array[i]);
    }
    System.out.format("\n");

6. Оператор break: търси дали в масив е налично поне веднъж числото 13:

    int[] array = {2,5,12,4,3,13,18,-5,-4,8};
    boolean found = false;
    int search = 13;
    System.out.format("Searching for %d",search);
    for (int i=0; i<array.length; i++){
      if (array[i] == search){
        found = true;
        break;
      }
      System.out.format("%d... ", array[i]);
    }
    if (found) System.out.format("FOUND >>> %d <<< FOUND!",search);
    else System.out.format("sorry, no %d in the array",search);

7. Оператор continue: сумира всички нечетни числа на масив:

    int[] array = {2,5,12,4,3,13,18,-5,-4,8};
    long sum = 0L;
    for (int i=0; i<array.length; i++){
      if (array[i]%2 == 0) continue;

      sum += (long)array[i];
    }
    System.out.format("Sum of odd numbers = %d\n",sum);

8. Цикъл for-each: това е друг вид запис на цикъл for. Синтаксисът е следния:

   <тип>[] array = {стойности};
   for (<тип> var : array) {
       оператори;
   }

Този запис е (почти) аналогичен на следния:

   <тип>[] array = {стойности};
   for (int i=0; i<array.length; i++) {
      <тип> var = array[i]
      оператори;
   }

Foreach е изключително удобен когато обхождаме масиви само за четене. Ето пример за цикъл, който отпечатва елементите на масив на екрана:

    int[] array = {2,5,12,4,3,13,18,-5,-4,8};
    for (int el : array){
      System.out.format("%d ",el);
    }
    System.out.format("\n");

Имайте предвид, че на променливата „el“ се предава копие на елемент от масива, а тя не е указател към елемента. Това означава, че ако променяте el в тялото на цикъла оригиналния масив НЕ се променя. Именно затова отбелязахме специално, че foreach се използва само за четене. Затова и възможностите на for-each са доста по-ограничени от тези на пълния запис на for. Въпреки това той прави кода доста по-компактен и по-лесно четим. Насърчаваме използването на този цикъл когато е нужно съставянето на кратки алгоритми при четене на масив.

9. Вложени цикли и контрол над изпълнението: когато правим вложени цикли, то в Java ни е предоставена една допълнителна възможност за оператор break. Можем да прекъсваме не само текущия цикъл (в тялото на който се изпълнява оператор break), но и външен цикъл. Нека разгледаме следния пример: имаме двумерен масив с числа. Търсим числото 13 вътре в масива:

    int[][] array = {
                     {2,5,12,4},
                     {3,13,18,-5},
                     {12,8,-4,8}
                    };
    boolean found = false;
    int search = 13;
    System.out.format("Searching for %d\n",search);
    int i,j=0;
    for (i=0; i<array.length; i++){
      for (j=0; j<array[i].length; j++){
        if (array[i][j] == search){
          System.out.format("Found! >>> %d <<< Found!",search);
          found = true;
          break;
        }
        System.out.format("%d... ",array[i][j]);
      }
      System.out.format("\n");
    }
    if (!found) System.out.format("%d not found", search);

Резултат:

Searching for 13
2... 5... 12... 4...
3... Found! >>> 13 <<< Found!
12... 8... -4... 8...

Виждаме, че програмата не се прекрати при намиране на числото 13. Прекрати се само вътрешният цикъл, т.е. пропуснахме две колони. Ако искаме да прекратим търсенето въобще, т.е. да спрем изпълнението както на външния цикъл, така и на вътрешния цикъл, то използваме следния „трик“:

    int[][] array = {
                     {2,5,12,4},
                     {3,13,18,-5},
                     {12,8,-4,8}
                    };
    boolean found = false;
    int search = 13;
    System.out.format("Searching for %d\n",search);
    int i,j=0;
    outerfor:
    for (i=0; i<array.length; i++){
      innerfor:
      for (j=0; j<array[i].length; j++){
        if (array[i][j] == search){
          System.out.format("Found! >>> %d <<< Found!\n",search);
          found = true;
          break outerfor;
        }
        System.out.format("%d... ",array[i][j]);
      }
      System.out.format("\n");
    }
    if (!found) System.out.format("%d not found\n", search);

Ако искаме да направим двата примера еквивалентни, то бихме сменили „break outerfor“ с „break innerfor“ или просто „break“. Така дефинирани „outerfor“ и „innerfor“ наричаме „етикети„. Аналогично етикети могат да се използват при оператор continue.

 



Добави коментар

Адресът на електронната поща няма да се публикува


*