Оператори за управление - 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