现在的位置: 首页 > 设计导读 > 正文

【K&R C语言】第3章 控制流

2011年04月13日 设计导读 ⁄ 共 984字 ⁄ 字号 暂无评论

包含了选择结构和循环结构

3.3 else if 语句 【A 折半查找 binsearch】
3.4 switch 语句 
   【B 统计各个数字、空白符以及所有其它字符出现的次数  2nd 】
3.5 while 循环与 for 循环
    【C 函数 atoi 字符串->整型数 2nd】
    【希尔排序 shellsort】
    【D 倒置字符串 reverse】
3.6 do while 循环 
    【E itoa 将数字n转换为字符串并保持到 s 中】
3.7 break 语句与 continue 语句
    【F trim函数:删除字符串尾部的空格符、制表符与换行符】

3.3 else-if语句 【折半查找 binsearch】

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
/* 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 */
}

3.4 switch语句
【统计各个数字、空白符以及所有其它字符出现的次数 2nd 】

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include <stdio.h>
 
int main(int argc, char *argv[])
{
    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;
}

3.5 whil循环与for循环
【函数 atoi 字符串->整型数 2nd】

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#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++) 
        ;
    sign = (s[i] == '-') ? -1 : 1;
    if (s[i] == '+' || s[i] == '-') 
        i++;
    for (n = 0; isdigit(s[i]); i++)
        n = 10 * n + (s[i] - '0');
    return sign * n;
}

【希尔排序 shellsort】

1
2
3
4
5
6
7
8
9
10
11
12
void shellsort(int v[], int n)
{
    int gap, i, j, temp;
 
    for (gap = n/2; gap > 0; gap /= 2)
        for (i = gap; i < n; i++)
            for (j=i-gap; j>=0 && v[j]>v[j+gap]; j-=gap) {
                temp = v[j];
                v[j] = v[j+gap];
                v[j+gap] = temp;
            }
}

【倒置字符串 reverse】

1
2
3
4
5
6
7
8
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;
    }
}

3.6 do-while循环 【itoa 将数字n转换为字符串并保持到 s 中】

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
/* itoa: convert n to characters in s */
void itoa(int n, char s[])
{
    int i = 0, sign;
 
    if ((sign = n) < 0) 
        n = -n;
 
   do { /* generate digits in reverse order */
        s[i++] = n % 10 + '0'; /* get next digit */
    } while ((n /= 10) > 0); /* delete it */
 
    if (sign < 0)
        s[i++] = '-';
    s[i] = '\0';
    reverse(s);
}

3.7 break语句与continue语句【trim函数:删除字符串尾部的空格符、制表符与换行符】

1
2
3
4
5
6
7
8
9
10
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;
}

可以使用 isspace 来简化条件判断

1
2
3
4
5
6
7
8
9
10
int trim(char s[])
{
    int n;
 
    for (n = strlen(s)-1; n >= 0; n--)
        if (isspace(s[n]))
            break;
    s[n+1] = '\0';
    return n;
}

抱歉!评论已关闭.