文档章节

C程序设计语言--第三章:控制流

fzyz_sb
 fzyz_sb
发布于 2013/09/28 11:24
字数 1036
阅读 64
收藏 0

3.1 语句与程序块

在C语言中,分号是语句结束符.用一对花括号把一组声明和语句括在一起就构成了一个符合语句(也叫程序块).但必须注意一点是:复合语句实际上等价于单条语句,它们并没有局部作用域.即以下例子中程序输出的是3而不是2:

#include <stdio.h>

int main(void)
{
	int i = 2;
	if ( 1 ){
		i = 3;
	}
	printf("%d\n", i );

	return 0;
}

习题3-1:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int binsearch(int x, int v[], int n)
{
	int		low = 0;
	int		high = n - 1;
	int		mid = (low + high) / 2;

	while (low <= high && x != v[mid]) {
		if (x < v[mid]) {
			high = mid - 1;
		}
		else {
			low = mid + 1;
		}
		mid = (low + high) / 2;
	}

	return (x == v[mid]) ? mid : -1;
}

int main(void) 
{
	int arr[10];
	int i = 0;
	for ( i = 0; i < 10; i++ ){
		arr[ i ] = i;
	}
	printf("%d\n", binsearch( 4, arr, 10 ) );

	return 0;
}



程序输出:

习题3-2:

#include <stdio.h>

void escape( char *s, char *t )
{
	while ( '\0' != *t ){
		switch( *t ){
			case '\n':
				*s++ = '\\';
				*s++ = 'n';
				break;
			case '\t':
				*s++ = '\\';
				*s++ = 't';
				break;
			default:
				*s++ = *t;
		}
		t++;
	}
	*s = '\0';
}

int main(void)
{
	char s[128];
	char t[] = "hello\nworld\ti love this world\n";
	escape( s, t );
	printf("%s\n", s );

	return 0;
}
程序输出:

3.5 while循环与for循环

一个atoi函数:

#include <ctype.h>

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;
}
逗号表达式的使用:以下函数倒置字符串s:
#include <string.h>

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-3:

#include <stdio.h>
#include <ctype.h>

void expand( char *s1, char *s2 )
{
	char ch;
	char *tempS2 = s2;
	while ( '\0' != *( s1 + 3 ) ){
		//为了程序的易读性,将两个if判断句分开:实际上虽然可以将头两个if合并起来,但是不推荐.
		if ( isalnum( *s1 ) && '-' == *( s1 + 1 ) && isalnum( *( s1 + 2 ) ) ){
			if ( ( isupper( *s1 ) && isupper( *( s1 + 2 ) ) ) ||
				( islower( *s1 ) && islower( *( s1 + 2 ) ) ) ||
				( isdigit( *s1 ) && isdigit( *( s1 + 2 ) ) ) ){
				if ( *s1 < *( s1 + 2 ) ){
					for ( ch = *s1; ch <= *( s1 + 2 ); ch++ ){
						*s2++ = ch;
					}
				}
				else{
					for ( ch = *s1; ch >= *( s1 + 2 ); ch-- ){
						*s2++ = ch;
					}
				}
				s1 += 3;
			}
			else{
				*s2++ = *s1++;
			}
		}
		else{
			*s2++ = *s1++;
		}
	}
	while ( '\0' != *s1 ){
		*s2++ = *s1++;
	}
	*s2 = '\0';
}

int main(void)
{
	char s2[128];
	char s1[] = "-a-z0-9a-ZA-z-aA-Z,.!@#$%^&*()_+";
	expand( s1, s2 );
	printf("%s\n", s2 );

	return 0;
}
程序输出:

3-6 do-while循环

用于至少处理一次的清空下:

一个itoa的函数:

void itoa( int n, char s[] )
{
	int i, sign;

	if ( ( sign = n ) < 0 ){
		n = -n;
	}
	i = 0;
	do{
		s[ i++ ] = n % 10 - '0';
	}while ( ( n /= 10 ) > 0 );

	if ( sign < 0 ){
		s[ i++ ] = '\0';
	}
	s[ i ] = '\0';
	reverse( s );
}
习题3-4:

之所以不能处理最大负数的情况是因为:当你把它转为整数进行处理的时候,已经溢出了.

#include <stdio.h>
#include <limits.h>

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;
	}
}

void itoa( int n, char s[] )
{
	int i, sign;
	int isMIN = 0;
	if ( n == -n ){
		n += 1;//对最大的负数进行特殊处理
		isMIN = 1;
	}
	if ( ( sign = n ) < 0 ){
		n = -n;
	}
	i = 0;
	if ( isMIN ){
		s[ i++ ] = n % 10 + 1 + '0';
		n /= 10;
	}
	do {
		s[ i++ ] = n % 10 + '0';
	}while ( ( n /= 10 ) > 0 );
	
	if ( sign < 0 ){
		s[ i++ ] = '-';
	}
	s[ i ] = '\0';
	reverse( s );
}

int main(void)
{
	char s[128];
	itoa( 123456, s );
	printf("%s\n", s );
	itoa( -123456, s );
	printf("%s\n", s );
	itoa( INT_MAX, s );
	printf("%s\n", s );
	itoa( INT_MIN, s );
	printf("%s\n", s );

	return 0;
}
程序输出:

习题3-5:

此程序并为考虑溢出的问题:

#include <stdio.h>

void reverse( char *s )
{
	char *temp = s;
	while ( '\0' != *temp ){
		temp++;
	}
	temp--;
	while ( temp > s ){
		char ch = *temp;
		*temp-- = *s;
		*s++ = ch;
	}
}

void itob( int n, char *s, int b )
{
	int sign;
	char *temp = s;
	if ( ( sign = n ) < 0 ){
		n = -n;
	}
	do{
		*s++ = n % b + '0';
	}while ( ( n /= b ) );
	
	if ( sign < 0 ){
		*s++ = '-';
	}
	*s = '\0';
	s = temp;

	reverse( s );
}

int main(void)
{
	char s[128];
	itob( 12345, s, 16 );
	printf("%s\n", s );

	return 0;
}
程序输出:

习题3-6:

#include <stdio.h>
#include <limits.h>
#include <string.h>

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;
	}
}

void itoa( int n, char s[], int length )
{
	int i, sign;
	int isMIN = 0;
	if ( n == -n ){
		n += 1;//对最大的负数进行特殊处理
		isMIN = 1;
	}
	if ( ( sign = n ) < 0 ){
		n = -n;
	}
	i = 0;
	if ( isMIN ){
		s[ i++ ] = n % 10 + 1 + '0';
		n /= 10;
	}
	do {
		s[ i++ ] = n % 10 + '0';
	}while ( ( n /= 10 ) > 0 );

	if ( sign < 0 ){
		s[ i++ ] = '-';
	}
	while ( length > i ){
		s[ i++ ] = ' ';
	}
	s[ i ] = '\0';

	reverse( s );
}

int main(void)
{
	char s[128];
	itoa( 123456, s, 5 );
	printf("%s\n", s );
	itoa( -123456, s, 10 );
	printf("%s\n", s );
	itoa( INT_MAX, s, 15 );
	printf("%s\n", s );
	itoa( INT_MIN, s, 20 );
	printf("%s\n", s );

	return 0;
}
程序输出:


© 著作权归作者所有

共有 人打赏支持
fzyz_sb
粉丝 408
博文 209
码字总数 447144
作品 0
武汉
程序员
开源书籍-JavaScript 编程精解

《JavaScript 编程精解》(Eloquent JavaScript)第三版,是由马尔奇·哈弗贝克(Marlin Haverbeke)JavaScript程序员编写的JS入门书籍,Marlin Haverbeke通晓多种编程语言,在Web开发方面积累...

marsdream
06/04
0
0
业余爱好者的C程序设计学习之路

我学习和工作的方向都是化工,和 IT 专业一点边都不搭,属于程序设计爱好者一类。坚持了很多年了,谈谈我的认识。 一、为什么是C 汇编太难,直接下手会吓死宝宝的。 basic 不能考虑,因为“对...

四彩
2016/02/04
107
2
考研-专业课-c语言

为了我家娘子,猪猪臭 本人计划考研:报考学校北京工业大学--计算机 专业课编号985:教材为C语言程序设计案例教程和严蔚敏的数据结构那本 我知道 本书是没有答案的 下面的全都是 自己写的 并在...

20111564
2014/10/16
0
0
学习苹果Swift语言的一些在线资源(2014年9月10日更新)

Swift是苹果为OS X和iOS平台引入的一种新的程序设计语言,这种程序设计语言已经激发了开发者社区的大量关注。仅仅几天之内,在Stack Overflow网站上提出的关于Swift的问题已经有500多个,在G...

tyou
2015/08/11
0
0
JavaScript 编程精解 中文第三版 零、前言

零、前言 原文:Introduction 译者:飞龙 协议:CC BY-NC-SA 4.0 自豪地采用谷歌翻译 部分参考了《JavaScript 编程精解(第 2 版)》 We think we are creating the system for our own purp...

ApacheCN_飞龙
06/01
0
0

没有更多内容

加载失败,请刷新页面

加载更多

【大福利】极客时间专栏返现二维码大汇总

我已经购买了如下专栏,大家通过我的二维码你可以获得一定额度的返现! 然后,再给大家来个福利,只要你通过我的二维码购买,并且关注了【飞鱼说编程】公众号,可以加我微信或者私聊我,我再...

飞鱼说编程
今天
1
0
Spring5对比Spring3.2源码之容器的基本实现

最近看了《Spring源码深度解析》,该书是基于Spring3.2版本的,其中关于第二章容器的基本实现部分,目前spring5的实现方式已有较大改变。 Spring3.2的实现: public void testSimpleLoad(){...

Ilike_Java
今天
1
0
【王阳明心学语录】-001

1.“破山中贼易,破心中贼难。” 2.“夫万事万物之理不外于吾心。” 3.“心即理也。”“心外无理,心外无物,心外无事。” 4.“人心之得其正者即道心;道心之失其正者即人心。” 5.“无...

卯金刀GG
今天
2
0
OSChina 周三乱弹 —— 我们无法成为野兽

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @ _刚刚好: 霸王洗发水这波很骚 手机党少年们想听歌,请使劲儿戳(这里) hahahahahahh @嘻酱:居然忘了喝水。 让你喝可乐的话, 你准忘不了...

小小编辑
今天
10
0
vm GC 日志 配置及查看

-XX:+PrintGCDetails 打印 gc 日志 -XX:+PrintTenuringDistribution 监控晋升分布 -XX:+PrintGCTimeStamps 包含时间戳 -XX:+printGCDateStamps 包含时间 -Xloggc:<filename> 可以将数据保存为......

Canaan_
昨天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部