<<c程序设计语言>>第三章 程序控制流
来源:互联网 发布:淘宝商城女装大码 编辑:程序博客网 时间:2024/05/16 23:33
3.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 /* 找到了匹配的值 */
return mid;
}
return -1; /* 没有查到*/
}
s w i t c h语句是一种多路判定语句,它根据表达式是否与若干常量整数值中的某一个匹配来相
应地执行有关的分支动作。
switch ( 表达式) {
case 常量表达式: 语句序列
case 常量表达式: 语句序列
default: 语句序列
s w i t c h语句最常用的方法是使用b r e a k语句与r e t u r n语句。为了防止直接进入下一个情形,最好在每个情形后以break结尾。
{
int i, j;
for (i = 0, j = 0; s[i] != '\0'; i++) {
switch (s[i]) {
case '\n':
t[j++] = '\\';
t[j++] = 'n';
break;
case '\t':
t[j++] = '\\';
t[j++] = 't';
break;
default:
t[j++] = s[i];
break;
}
}
t[j] = '\0';
}
void escape2(char s[], char t[])
{
int i, j;
for (i = 0, j = 0; s[i] != '\0'; j++) {
switch (s[i]) {
case '\\':
if (s[i+1] == 'n') {
t[j] = '\n';
i += 2;
}
else if (s[i+1] == 't') {
t[j] = '\t';
i += 2;
}
else {
t[j] = s[i];
i++;
}
default:
t[j] = s[i++];
break;
}
}
}
void expand(char s1[], char s2[])
{
int i, j, k;
i = j = 0;
while (s1[i] != '\0') {
if (s1[i] == '-' && 0 < i && s1[i+1] != '\0' &&
s1[i-1] != '-' && s1[i+1] != '-') {
j--; // avoid duplicate letter
for (k = s1[i-1]; k <= s1[i+1]; k++, j++)
s2[j] = k;
i += 2;
} else {
s2[j++] = s1[i++];
}
}
s2[j] = '\0';
}
main()
{
char s1[] = "-a-b-hAbC-G0-8---";
char s2[100];
expand(s1, s2);
printf("before expand:%s\nafter expand: %s\n", s1, s2);
}
如果表达式1与表达式3 被省略了,那么它退化成了w h i l e循环语句。
如果用于测试的表达式2 不存在,那么就认为表达式2 的值永远是真的,从而,f o r循环语句
for ( ; ; ) {
…
}
就是一个“无限”循环语句,这种语句要用其他手段(如b r e a k语句或r e t u r n语句)才能终止执行。
例子:atoi 函数的实现,将字符转化为数字,除去前面的空白字符,处理+ - 操作,
#include <ctype.h>
/* atoi:将s转换成整数;第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;
}
shell排序:
/* shellsort:以递增顺序对v[0]、v[1]、……、v[n-1] 进行排序*/
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;
}
}
}
将整型转化为字符串itoa的实现:
void itoa ( int n, char s[ ] );
{
int i, sign;
if ( ( sign = n ) < 0 ) /* 记录符号 */
n = -n; /* 使n成为正数 */
i = 0;
do { /* 以反序生成数字 */
s[i++] = n % 10 + '0'; /* 取下一个数字 */
} while ( (n /= 10) > 0); /* 删除该数字 */
if (sign < 0)
s[i++] = '-';
s[i] = '\0';
reverse(s);
}
因为即使n为0也要至少把一个字符放到数组 s中,所以在这里有必要使用 d o - w h i l e语句,至
少使用d o - w h i l e语句要方便一些。
atof 将字符串转化为浮点数 比如123.45 ---与atoi相比,在小数点.之后开始记录小数点位数pow*=10.0
/* 把字符串s转换成相应的双精度浮点数 */
double atof( char s[ ])
{
double val, power;
int i, sign;
for ( i = 0; isspace(s[i]); i++ ) /* 跳过空白 */
;
sign = (s[i] == '-' ) ? -1 : 1;
if ( s[i] == '+' || s[i] == '-' )
i++;
for (val = 0.0; isdigit(s[i]); i++)
val = 10.0 * val +(s[i] -'0' );
if (s [i] ] = = '.')
i++;
for ( power = 1.0; isdigit(s[i]); i++) {
val = 10.0 * val +(s[i] -'0' );
power *= 10.0;
}
return sign * val / power;
}
void itoa(int n, char s[])
{
int i, sign;
sign = n;
i = 0;
do {
s[i++] = abs(n % 10) + '0';
} while ((n /= 10) != 0);
if (sign < 0)
s[i++] = '-';
s[i] = '\0';
//reverse(s);
}
main()
{
char s[20];
itoa(10, s);
printf("%s\n", s);
itoa(-128, s);
printf("%s\n", s);
}
#include "reverse.c"
#define abs(x) (x) < 0 ? -(x) : (x)
void itob(int n, char s[], int b)
{
int i, x, sign;
sign = n;
i = 0;
do {
x = abs(n % b);
if (x >= 10)
s[i++] = (x - 10) + 'A';
else
s[i++] = x + '0';
} while ((n /= b) != 0);
if (sign < 0)
s[i++] = '-';
s[i] = '\0';
reverse(s);
}
main()
{
char s[20];
itob(29, s, 2);
printf("%s\n", s);
itob(-257, s, 16);
printf("%s\n", s);
}
能用于循环语句,不能用于 s w i t c h语句。如果某个 c o n t i n u e语句位于s w i t c h语句中,而后者又位
于循环语句中,那么该c o n t i n u e语句用于控制下一次循环。
可能要把测试反过来,或嵌入另一层循环,而这又会使程序的嵌套更深。
for ( ⋯ )
for ( ⋯ ) {
⋯
if (disaster)
goto error;
}
⋯
error:
清理操作
如果错误处理比较重要并且在好几个地方都会出现错误,那么使用这种组织就比较灵活方便。
标号的形式与变量名字相同,其后要跟一个冒号。标号可以用在任何语句的前面,但要与
相应的g o t o语句位于同一函数中。标号的作用域是整个函数
法是:
for (i = 0; i < n; i++)
for (j = 0; j < m; j++)
if (a[i] == b[j])
第3章 控 制 流计计 53
下载
goto found;
/* 没有找到相同元素 */
⋯
found:
/* 取一个满足a[i] ==b[j]的元素 */
⋯
所有带有g o t o语句的程序代码都可以改写成不包含 g o t o语句的程序,但这可能需要以增加一
些额外的重复测试或变量为代价。例如,可将这个判定数组元素是否相同的程序段改写成如下
形式:
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)
/* 取一个满足a[i-1] ==b[j-1]的元素 */
⋯
else
/* 没有找到相同元素 */
⋯
除了以上介绍的几个程序段外,依赖于 g o t o语句的程序段一般都比不使用 g o t o语句的程序段
难以理解与维护。虽然不特别强调这一点,但我们还是建议尽可能减少 g o t o语句的使用。
- <<c程序设计语言>>第三章 程序控制流
- 《C程序设计语言》 第三章 控制流
- 【C程序设计语言】第三章-控制流 | 练习
- 【C程序设计语言】第三章-笔记
- 读书笔记:C程序设计语言,第三章:控制流( 课后题全解)
- 【书中示例】-《C程序设计语言》第三章:控制流
- C程序设计语言(K&R)第三章学习笔记
- 第三章 VB程序设计语言基础
- 第三章 VB程序设计语言基础
- 《C程序设计语言》书籍内容学习第三弹
- C++程序设计语言--第三章:标准库概览
- 程序控制流
- 程序控制流
- 《C程序设计语言》读书笔记第二章
- 【C程序设计语言】第二章 - 笔记
- Oracle学习笔记(第三章) PLSQL程序控制结构
- Java笔记 第三章Java语言程序控制语句
- thinking in java 阅读笔记 第三章 程序控制流程
- 编程写作人员的好帮手 - Evernote 5.4(印象笔记) 中文绿色版
- 第三方控件DevExpress学习笔记
- hdu4882ZCC Loves Codefires(贪心)
- 【eclipse插件开发实战】Eclipse插件开发3——OSGi、RCP
- Telerik RadTreeView全选、取消全选、部分选中
- <<c程序设计语言>>第三章 程序控制流
- .net中return关键字的认识误区
- 前段时间百度也提醒站长,使用GoDaddy的DNS解析服务器
- 36_查询手机号码归属地&外部数据库的引入
- HDOJ 题目2899 Strange fuction(数学 导数)
- 编程之美读书笔记-第二章
- Android实现翻页效果
- 阿迪斯s
- cocos2dx3.0读取tilemap对象层信息