文档章节

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

fzyz_sb
 fzyz_sb
发布于 2013/09/14 11:28
字数 1292
阅读 69
收藏 0

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

程序输入输出:


© 著作权归作者所有

共有 人打赏支持
fzyz_sb
粉丝 408
博文 209
码字总数 447144
作品 0
武汉
程序员
Modern Fortran Explained学习笔记4

第三章.表达式和赋值语句 今天继续从第三章开始学习,第三章主要讲了表达式和赋值语句,其中最主要的是数组的表达和指针等概念的使用。 需要特别注意的点其实不多,主要的东西都是自动实现的...

粗衣大布裹天涯
2017/10/30
0
0
入职学习(2)--一个程序员的成长史(22)

看了代是雄对这几个问题的回复之后,唐师傅叫代是雄先熟悉一下办公的电脑及一些办事流程,他要找一些资料作为培训计划中的材料。 代是雄先到公司的IT网站上去逛了一下,发现上面的东西相当的...

zhouzxi
2017/01/12
0
0
[编程语言]C陷阱与缺陷

内容摘要 作者以自己1985年在Bell实验室时发表的一篇论文为基础,结合自己的工作经验扩展成为这本对C程序员具有珍贵价值的经典著作。写作本书的出发点不是要批判C语言,而是要帮助C程序员绕过...

21gprs
2014/05/23
0
0
阅读《C陷阱与缺陷》的知识增量

看完《C陷阱与缺陷》,忍不住要重新翻一下,记录一下与自己的惯性思维不符合的地方。记录的是知识的增量,是这几天的流量,而不是存量。 这本书是在ASCI C/C89订制之前写的,有些地方有疏漏。...

modernizr
2014/08/11
368
2
阅读《C陷阱与缺陷》的知识增量

看完《C陷阱与缺陷》,忍不住要重新翻一下,记录一下与自己的惯性思维不符合的地方。记录的是知识的增量,是这几天的流量,而不是存量。 这本书是在ASCI C/C89订制之前写的,有些地方有疏漏。...

modernizr
2014/06/30
613
7

没有更多内容

加载失败,请刷新页面

加载更多

下一页

angular 解决其他电脑不能访问的问题。

ng serve --host 0.0.0.0 --disable-host-check

miaojiangmin
今天
1
0
优酷视频文件怎么转换格式

  以前在优酷上下载视频都只是在手机上观看,但随着科技的发展,对于视频的要求也逐渐增多,不再只是观看视频那么简单,在精彩的部分还会将其单独分割出来,然后进行视频剪辑,可以做出我们...

萤火的萤火
今天
0
0
数据结构:散列

在一个数据结构中查找key元素,用顺序查找、二分查找都需要经过一系列关键之比较才能查找到结果,平均查找长度与数据量有关,元素越多比较次数就越多。 如果根据元素的关键字就能知道元素的存...

京一
今天
0
0
Apache RocketMQ 正式开源分布式事务消息

近日,Apache RocketMQ 社区正式发布4.3版本。此次发布不仅包括提升性能,减少内存使用等原有特性增强,还修复了部分社区提出的若干问题,更重要的是该版本开源了社区最为关心的分布式事务消...

阿里云云栖社区
今天
30
0
使用JavaScript和MQTT开发物联网应用

如果说Java和C#哪个是最好的开发语言,无疑会挑起程序员之间的相互怒怼,那如果说JavaScript是动态性最好的语言,相信大家都不会有太大的争议。随着越来越多的硬件平台和开发板开始支持JavaS...

少年不搬砖老大徒伤悲
今天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部