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

Chapter 3 - Control Flow
3.5 Loops - While and For
3.6 Loops - Do-While
3.7 Break and Continue
3.8 Goto and labels

Цикли - While и For

ebook - The C Programming Language Ritchie & kernighan -.doc while (expression)
statement


Пример:
Внасяме 10000 лв. в банкова сметка с 5% год. лихва при месечно олихвяване. След колко години сумата в сметката ще се удвои?

ebook - The C Programming Language Ritchie & kernighan -.doc for (expr1; expr2; expr3)
    statement

е еквивалентно на
expr1;
while (expr2) {
    statement
    expr3;
}


Пример:
Пресмятане на функцията факториел: n! = 1.2.3.4...n

Превръщане на низ от цифри в число.
#include <ctype.h>
/* atoi: convert s to integer; version 2 */
int atoi(char s[])

{
    int i, n, sign;
    for (i = 0; isspace(s[i]); i++)    /* skip white space */ ;
    sign = (s[i] == '-') ? -1 : 1;
    if (s[i] == '+' || s[i] == '-')    /* skip sign */
        i++;
    for (n = 0; isdigit(s[i]); i++)
        n = 10 * n + (s[i] - '0');

    return sign * n;
   }


Обръщане на низ на място.
#include <string.h>
/* reverse: reverse string s in place */
void reverse(char s[])
{
    int c, i, j;
    for (i = 0, j = strlen(s)-1; i < j; i++, j--) {
        c = s[i];

        s[i] = s[j];
        s[j] = c;
    }

}


rev.c

Цикли - Do-While

do
    statement
while (expression);


Превръщане на число в низ от цифри.
/* itoa: convert n to characters in s */
void itoa(int n, char s[])

{
    int i, sign;
    if ((sign = n) < 0) /* record sign */
        n = -n;         /* make n positive */
    i = 0;
    do {                 /* generate digits in reverse order */
        s[i++]=n%10+'0'; /* get next digit */
    }
    while ((n /= 10) > 0);

    if (sign < 0)
        s[i++] = '-';
    s[i] = '\0';
    reverse(s);
}


itoa2.c

Exercise 3-6. Write a version of itoa that accepts three arguments instead of two. The third argument is a minimum field width; the converted number must be padded with blanks on the left if necessary to make it wide enough.

Break и Continue

/* trim: remove trailing blanks, tabs, newlines */
int trim(char s[])
{
    int n;
    for (n = strlen(s)-1; n >= 0; n--)
        if (s[n] != ' ' && s[n] != '\t' && s[n] != '\n')
               break;
    s[n+1] = '\0';
    return n;
}


trim.c

Goto и етикети

Пример:
Търсене на общ елемент на два масива.

Решение с goto
for (i = 0; i < n; i++)
    for (j = 0; j < m; j++)

        if (a[i] == b[j])
                goto found;
/* didn't find any common element */
...
found:

/* got one: a[i] == b[j] */
...


Решение без goto
found = 0;
for (i = 0; i < n && !found; i++)
    for (j = 0; j < m && !found; j++)
        if (a[i] == b[j])

            found = 1;
if (found)
/* got one: a[i-1] == b[j-1] */
    ...

else
/* didn't find any common element */
    ...


goto.c