C和指针---第四章:语句

4.1 空语句

空语句:本身只包含一个分号,适用的场合就是语法要求出现一条完整的语句,但并不需要它执行任何任务。

4.2 表达式语句

C语言中并没有专门的“赋值语句”,而是通过表达式语句进行的。

x = y + 3;
ch = getchar();
表达式语句单独存在也是合法的:
y + 3;
x++;
4.3 代码块

代码块就是位于一对花括号之内的可选的声明和语句列表,可以用于要求出现语句的地方,它允许你在语法要求只出现一条语句的地方使用多条语句(for循环内)。代码块还允许你把数据的声明非常靠近它所使用的地方。例如,下面的代码是非法的:

#include <stdio.h>

int main(void)
{
	int a = 5;
	printf("hello world\n");
	int b = 7;

	return 0;
}
而下面的代码则是合法的:
#include <stdio.h>

int main(void)
{
	int a = 5;
	printf("hello world\n");
	{
		int b = 7;
	}

	return 0;
}
4.5 while语句

4.5.1 break和continue语句

在while循环中可以使用break语句,用于永久终止循环。在执行break语句后,执行流下一条执行的语句就是循环正常结束后应该执行的那条语句。

在while循环中也可以使用continue语句,它用于永久终止当前的那次循环。在执行continue语句之后,执行流接下来就是重新测试表达式的值,决定是否继续执行循环。

这两条语句的任何一条如果出现于嵌套的循环内部,它只对最内层的循环起作用,无法影响到最外层循环的执行。

4.9 goto语句

原则:坚决不用goto语句

在多层嵌套的循环中,goto语句起到一定的作用:

while (){
	while (){
		while (){
			if (){
				goto quit;
			}
		}
	}
}
quit: ;
有两个方法来避免这种goto语句:

1. 使用状态标志,但麻烦的是在每个循环中状态标志都需要进行测试:

enum {EXIT, OK} status;
status = OK;
while (status == OK){
	while (status == OK){
		while (status == OK){
			if (){
				status = EXIT;
				break;
			}
		}
	}
}
2. 把所有的循环都放到一个单独的函数里,当灾难降临到最内层的循环时,你可以使用return语句离开这个函数。

习题:

1. 

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

int main(void)
{
	float number;
	float preNum = 1.0;
	float curNum = 1.0;
	scanf("%f", &number);
	printf("\nthe result is:\n");
	do{
		curNum = (preNum + number / preNum) / 2.0;
	}while ((fabs(curNum - preNum) > 0.00001) && (preNum = curNum));

	printf("%.4f", curNum);

	return 0;
}

备注:

1). 要用fabs而不是用abs对浮点型的数据进行求绝对值

2).必须让表达式执行一次,所以用到do...while循环。


2. 求质数的过程,不用非常高深的技术,这属于算法题。这里就简单的编写一下如何求质数即可。

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

#define UPPER 100
#define LOWER 1

int main(void)
{
	int i = 0;
	int j = 0;
	for ( i = LOWER; i < UPPER; i++ ){
		for ( j = i - 1; j > LOWER; j-- ){
			if (i % j == 0){
				break;
			}
		}
		if ( j == LOWER ){
			printf("%d ", i);
		}
	}

	return 0;
}
程序输出:

3. 

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

int isAng( float x, float y, float z ){
	if ( ( x + y < z ) || ( x + z < y ) || ( y + z < x ) ){
		return 0;
	}

	return 1;
}

int main(void)
{
	float x;
	float y;
	float z;
	printf("please enter three number:");
	scanf("%f%f%f", &x, &y, &z);
	if ( isAng( x, y, z ) ){
		if ( (x == y) || ( x == z ) || ( y == z ) ){
			printf("等腰三角形\n");
			if ( ( x == y ) && ( y == z ) ){
				printf("等边三角形\n");
			}
		}
		else{
			printf("普通三角形");
		}
	}

	return 0;
}

程序输出:

4. 以下代码是错误的,因为字符串常量无法被更改,先粘贴出来,做个对比:

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

void copy_n( char dst[], char src[], int n ){
	int len = strlen(src);
	int i = 0;
	if (n <= len){
		for ( i = 0; i < n; i++ ){
			dst[i] = src[i];
		}
		dst[i] = '\0';
	}
	else{
		for ( i = 0; i < len; i++ ){
			dst[i] = src[i];
		}
		while ( i < n ){
			dst[i] = '\0';
			i++;
		}
	}
}

int main(void)
{
	char *dst = "hello";
	char *src = "python";


	copy_n( dst, src, 6 );
	printf("%s\n", dst);

	copy_n( dst, src, 4 );
	printf("%s\n", dst);

	return 0;
}

因为字符串常量无法改变,所以只能用字符数组:

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

#define MAXLINE 128

void copy_n(char dst[], char src[], int n){
	int len = strlen(src);
	if ( n <= len ){
		while ( n-- ){
			*dst++ = *src++;
		}
		*dst = '\0';
	}
	else{
		while ( *dst++ = *src++ ){
			;
		}
		while ( len <= n ){
			*dst++ = '\0';
		}
	}
}

int main(void)
{
	char dst[MAXLINE];
	char src[MAXLINE];
	gets(src);

	copy_n(dst, src, 12);

	printf("%s", dst);

	return 0;
}
程序输入输出:

5. 没从文件进行读取,但原理一样:

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

#define MAXLINE 128

int main(void)
{
	char	preLine[MAXLINE];
	char	curLine[MAXLINE];
	int		isSame = 0;

	while (gets(preLine) != NULL){
		if (!strcmp(preLine, curLine)){
			isSame = 1;
		}
		else{
			if (isSame){
				printf("the same line:%s\n", curLine);
				isSame = 0;
			}
			strcpy(curLine, preLine);
		}
	}

	return 0;
}
程序输出:

6. 

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

#define MAXLINE 128

int substr(char dst[], char src[], int start, int len){
	int arrLen = strlen(src);
	int i = 0;
	if (start >= arrLen){
		return 0;
	}
	if (len + start >= arrLen){
		len = arrLen - start;
	}
	for ( i = 0; i < len; i++ ){
		dst[i] = src[start + i];
	}
	dst[i] = '\0';

	return i;
}

int main(void)
{
	char	dst[MAXLINE];
	char	src[MAXLINE] = {'a', 'b', 'c', 'd', 'e', '\0'};
	int		len = 0;
	len = substr( dst, src, 1 ,7 );
	printf("%s\n", dst);
	printf("%d", len);

	return 0;
}

程序输出:

7. 

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

#define MAXLINE 128

void deblank( char string[] ){
	char	temp[MAXLINE];
	int		len = strlen(string);
	int		isSpace = 0;
	int		i = 0;
	int		j = 0;
	for ( i = 0; i < len; i++ ){
		if ( ' ' == string[i] ){
			isSpace = 1;
			continue;
		}
		else{
			if ( 1 == isSpace ){
				isSpace = 0;
				temp[j++] = ' ';
			}
		}
		temp[j++] = string[i];
	}
	temp[j] = '\0';
	strcpy(string, temp);
}

int main(void)
{
	char string[MAXLINE];
	while (gets(string) != NULL){
		deblank(string);
		printf("%s\n", string);
	}

	return 0;
}

程序输入输出:


转载于:https://my.oschina.net/voler/blog/161326

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值