Оператори за управление - 1

Chapter 3 - Control Flow
3.1 Statements and Blocks
3.2 If-Else
3.3 Else-If
3.4 Switch

Оператори и блокове

If-Else

Операторът if се състои от 2 части - условие и тяло. if е съставен оператор.

Пример:

if (area < 0)
   printf("%s\n", "Error: Negative area.");

Когато условието е вярно, се изпълнява тялото на оператора.
Ако условието е нарушено (не е вярно), се изпълнява следващия оператор (след оператора if).
Тялото на if може да бъде друг оператор или блок.
Блок е група от оператори, оградени с къдрави (големи) скоби {}.
Пример:

if (area < 0) 
{  
printf("%s\n", "Error: Negative area.");

   return 1;
}

Четене на числа.

scanf("%f", &area);

Пример:
Въвежда се число и ако то е положително, се отпечатва корен квадратен от числото.

Операторът if/else се състои от условие и две алтернативи. if/else е съставен оператор.
-- Ако условието е вярно (true) се изпълнява първата алтернатива.
-- Ако условието не е вярно (false), се изпълнява втората алтернатива.

if (area >= 0)
   printf("%s %4.2f\n", The side length is", sqrt(area));
else
  
printf("%s\n", "Error: Negative area.");

Пример:
Въвежда се число и ако то е положително, се отпечатва корен квадратен от числото, ако не - съобщение за грешка.

Операторът if/else е по-добър избор в сравнение с две допълващи се условия:

if (area >= 0) /* complementary conditions */
  
printf("%s %4.2f\n", The side length is", sqrt(area));
if (area < 0) /* complementary conditions */
  
printf("%s\n", "Error: Negative area.");


Else-If

if (expression)
    statement

else if (expression)
    statement

else if (expression)
    statement

else if (expression)
    statement

else
    statement

Програмиране на алтернативи (избор на един от няколко варианта).
Пример:
Да се намери стойността (в долари) на купчина американски монети (1 penny = 1 цент, 1 nickel = 5 цента, 1 dime = 10 цента, 1 quarter = 25 цента). Купчината съдържа еднакви монети.

ifelse.c

В някои случаи редът на алтернативите е важен.
Пример:
Да се напише програма програма, която показва описание на вероятното въздействие на земетресение въз основа на магнитуда му по скалата на Рихтер.
Псевдокод:


   if (richter >= 8)                    "Most structures fall"
   if (richter >= 7 and richter < 8)    "Many buildings destroyed"
   if (richter >= 6 and richter < 7)    "Many buildings considerably damaged, some collapse"
   if (richter >= 4.5 and richter < 6)  "Damage to poorly constructed buildings"
   if (richter >= 3.5 and richter < 4.5) "Felt by many people, no destruction"
   if (richter >= 0 and richter < 3.5)  "Generally not felt by people"
  
Вложени условни оператори.
Пример:
Задача за определяне на годишен данък в САЩ.
За несемейни
Ако облагаемата сума е над но не повече от данъкът е върху сумата над
0 21400 15% 0
21450 51900 3217.50 + 28% 21450
51900 - 11743.50 + 31% 51900

За семейни
Ако облагаемата сума е над но не повече от данъкът е върху сумата над
0 35800 15% 0
35800 86500 5370.00 + 28% 35800
86500 - 19566.00 + 31% 86500



Двоично търсене.

/* binsearch: find x in v[0] <= v[1] <= ... <= v[n-1] */

int binsearch(int x, int v[], int n)

{
    int low, high, mid;
    low = 0;
    high = n - 1;
    while (low <= high) {
        mid = (low+high)/2;
        if (x < v[mid])

            high = mid + 1;
        else if (x > v[mid])

            low = mid + 1;
        else    /* found match */
            return mid;
    }
    return -1; /* no match */
}


search.c

Switch

Синтаксис:
    switch (expression) {
        case const-expr: statements
        case const-expr: statements
        default: statements

           }

Пример:
Да се намери стойността (в долари) на купчина американски монети (1 penny = 1 цент, 1 nickel = 5 цента, 1 dime = 10 цента, 1 quarter = 25 цента). Купчината съдържа еднакви монети.

switch.c

Пример:
Да се преброят цифрите, разделителите и другите знаци в текстов файл (напр. текста на програмата).

ebook - The C Programming Language Ritchie & kernighan -.doc #include <stdio.h>

int main() /* count digits, white space, others */
{

    int c, i, nwhite, nother, ndigit[10];
    nwhite = nother = 0;
    for (i = 0; i < 10; i++)

        ndigit[i] = 0;
    while ((c = getchar()) != EOF) {
        switch (c) {
            case '0': case '1': case '2': case '3': case '4': case '5':
            case '6': case '7': case '8': case '9':

                ndigit[c-'0']++;
                break;
            case ' ':
            case '\n':
            case '\t':
                nwhite++;
                break;
            default:
                nother++;
                break;
        }

    }
    printf("digits =");
    for (i = 0; i < 10; i++)
        printf(" %d", ndigit[i]);
    printf(", white space = %d, other = %d\n",
           nwhite, nother);
    return 0;
}


Exercise 3-2.
Write a function escape(s,t) that converts characters like newline and tab into visible escape sequences like \n and \t as it copies the string t to s. Use a switch. Write a function for the other direction as well, converting escape sequences into the real characters.