包含了选择结构和循环结构
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; } |