详解C语言中for循环与while循环的用法

目录
  • 一、单层for循环
  • 二、for循环与if选择的嵌套
  • 三、多层for循环的嵌套
  • 四、while循环
  • 五、总结

一、单层for循环

引例:C语言实现求1到10的和(用for循环实现)

#include <stdio.h>

int main()
{
	int i, sum = 0;

	for (i = 1; i <= 10; i++)
		sum = sum + i;

	printf("sum = %d\n", sum);

	return 0;
}

单层for循环执行的顺序:

第一次循环先执行语句①,执行完语句①执行语句②,如果语句②成立则执行语句④,执行完语句④执行语句③,执行完语句③标志着第一次循环结束;第二次循环先执行语句②,如果语句②成立则执行语句④,执行完语句④执行语句③,执行完语句③标志着第二次循环执行结束,随后循环中语句的执行顺序与第二次循环一致。如果在循环过程中语句②不成立,则整个循环就结束了。直到整个循环结束后才会执行语句⑤,因为,for语句与if语句所能控制的范围相同,只能控制其接下来的第一条语句,言下之意是,语句⑤并不在for循环的内部。需要注意的是,语句①仅在第一次循环中执行,在其它循环过程中不执行。换句话说,语句①只会在整个循环过程中执行一次。语句①的作用其实是给变量进行初始化,所以它仅参与了第一次循环。还有值得注意的是,初学时容易在for (①; ②; ③)后加分号,这个情况我已经在《C语言if语句中常见的问题》这篇文章中的空语句问题中详细叙述了其中的道理,并且在for语句中依然适用,有兴趣的话可以一看。

练习

C语言实现求1到10中奇数的和

#include <stdio.h>

int main()
{
	int i, sum = 0;

	for (i = 1; i <= 10; i = i +2)
		sum = sum + i;

	printf("sum = %d\n", sum);

	return 0;
}

C语言实现求1+1/2+1/3+…+1/99+1/100

初学时的错误代码:

#include <stdio.h>

int main()
{
	int i;
	float sum = 0; // 考虑到和是小数,所以定义sum为float类型

	for (i = 1; i <= 100; i++)
		sum = sum + 1/i;

	printf("sum = %f\n", sum); // float类型的变量用%f输出

	return 0;
}

错误原因:没有考虑到1/i的数据类型。在C语言中,整型除以整型得到的结果只有整数位。例如,16/3 = 5。上述程序中i是整型变量,所以1/i也是整型,故从i大于等于2时,1/i的值永远为0。

因此需要将1/i的值想办法变为浮点数才可以实现想要的功能。C语言规定,只要被除数与除数其中的一个为浮点数,则商为浮点数。故解决的办法有两种,第一种是将1/i写为1.0/i,第二种是将整型变量i强制类型转化为float类型,正确的代码如下:

#include <stdio.h>

int main()
{
	int i;
	float sum = 0;

	for (i = 1; i <= 100; i++)
		sum = sum + 1.0/i;// 或 sum = sum + 1/(float)(i);

	printf("sum = %f\n", sum);

	return 0;
}

思考1:如果将上述代码中的sum = sum + 1/(float)(i);改为sum = sum + (float)(1/i);后能否正确输出sum的值?

思考2:能否将i直接定义为浮点型变量?

答案是不能,因为浮点型数据是以IEEE754标准来存储的,但IEEE754标准无法确保精确存储每一个浮点数,例如,6.234在存储过程中很可能存的不是6.234而是6.23399999,这是IEEE754标准的缺陷。所以即便在该程序中将i定义为浮点型变量后输出的结果是正确的,也不能确保在其他程序中依然正确,因为i不一定是准确的数字。需要注意的是,我们一般不会把循环中不断发生更新的变量定义为浮点型变量,因为浮点型数据存储过程属于非精确存储。

二、for循环与if选择的嵌套

引例:C语言实现求1到100之间所有可以被3整除的数字之和

#include <stdio.h>

int main()
{
	int i, sum = 0;

	for (i = 1; i <= 100; i++)
	{
		if (i % 3 == 0)
			sum = sum + i;
	}

	printf("sum = %d\n", sum);

	return 0;
}

思考:下面的程序输出结果是什么?

#include <stdio.h>

int main()
{
	int i, sum = 0;

	for (i = 1; i <= 12; i++)
	{
		if (i % 3 == 0)
			sum = sum + i;
		printf("sum = %d\n", sum);
	}

	return 0;
}

练习(以下题目均要求使用for循环和if选择的嵌套来完成)

编写C语言程序求1到100之间的奇数之和

#include <stdio.h>

int main()
{
	int i;
	int sum = 0;

	for (i = 1; i <= 100; i++)
	{
		if (i % 2 == 1)
			sum += i;
	}

	printf("奇数之和为%d\n", sum);

	return 0;
}

编写C语言程序求1到100之间的奇数的个数

#include <stdio.h>

int main()
{
	int i;
	int count = 0;

	for (i = 1; i <= 100; i++)
	{
		if (i % 2 == 1)
			count++;
	}

	printf("个数为%d\n", count);

	return 0;
}

编写C语言程序求1到100之间的奇数的平均值

#include <stdio.h>

int main()
{
	int i;
	int count = 0;
	int sum = 0;
	float average; // 考虑到平均值可能带有小数位,所以将平均值定义为float类型

	for (i = 1; i <= 100; i++)
	{
		if (i % 2 == 1)
		{
			count++;
			sum += i;
		}
	}

	average = 1.0 * sum / count; //也可以运用强制类型转换写成average = (float)(sum)/count;
	printf("平均数为%f\n", average);

	return 0;
}

编写C语言程序求1到100之间的奇数之和与1到100之间的偶数之和

#include <stdio.h>

int main()
{
	int i;
	int sum1 = 0; // 奇数和
	int sum2 = 0; // 偶数和

	for (i = 1; i <= 100; i++)
	{
		if (i % 2 == 1)
			sum1 += i;
		else
			sum2 += i;
	}

	printf("奇数之和为%d,偶数之和为%d\n", sum1, sum2);

	return 0;
}

三、多层for循环的嵌套

多层for循环执行的顺序:

第一次循环先执行语句①,执行完语句①执行语句②,如果语句②成立则跳入内部循环执行语句④,执行完语句④执行语句⑤,如果语句⑤成立则执行语句⑦,执行完语句⑦执行语句⑥,执行完语句⑥执行语句⑤,如果如果语句⑤不成立,则标志着内部循环执行完毕,接下来跳出内部循环执行语句③,执行完语句③标志着第一次整个循环结束;第二次循环先执行语句②,如果语句②成立,则再次跳入内部循环执行语句④,以此类推;如果语句②不成立,整个循环就结束了。由于⑧不属于任何一个for循环内部的语句,所以要在整个循环执行完毕后才会执行语句⑧。

换个方式:

因为for语句与if语句所能控制的范围相同,只能控制其接下来的第一条语句,所以语句⑦属于内部for循环,而语句⑦与内部的for循环语句构成的语句整体是一个语句,也就是上图中的绿色方框部分,这个整体语句又是外层for循环内部的第一个语句,所以,外层for循环所控制的语句就是绿色方框部分,而外层for循环完整的结构就是上图中的橙色方框部分。所以按照for循环的大体执行顺序,首先会执行语句①,执行完语句①执行语句②,如果语句②成立则会执行绿色方框部分,绿色方框部分是单层for循环,所以执行过程按照单层for循环的执行循序执行,当内部的绿色方框部分执行完毕后,则会执行语句③,语句③执行完标志着整体一次循环结束,下一次循环又从判断语句②是否成立开始,如果成立,则执行绿色方框部分;如果不成立,则整个循环结束。整个循环结束后才会执行语句⑧,因为语句⑧并不属于这两层for循环中的任何一层。

思考1:下面的for循环的执行顺序是什么样的?

思考2:下面的for循环的执行顺序是什么样的?

思考3:下面的for循环的执行顺序是什么样的?

思考4:下面的程序输出结果是什么?

#include <stdio.h>

int main()
{
	int i, j;

	for (i = 0; i <3; i++)
		for (j = 2; j < 5; j++)
			printf("AAAA\n");
		printf("BBBB\n");

	return 0;
}

思考5:下面的程序输出结果是什么?

#include <stdio.h>

int main()
{
	int i, j;

	for (i = 0; i <3; i++)
		printf("AAAA\n");
		for (j = 2; j < 5; j++)
			printf("BBBB\n");
		printf("CCCC\n");

	return 0;
}

思考6:下面的程序输出结果是什么?

#include <stdio.h>

int main()
{
	int i, j;

	for (i = 0; i <3; i++)
	{
		printf("AAAA\n");
		for (j = 2; j < 5; j++)
			printf("BBBB\n");
		printf("CCCC\n");
	}

	return 0;
}

四、while循环

引例:C语言实现求1到10的和(用while循环实现)

#include <stdio.h>

int main()
{
	int i, sum = 0;

	i = 1;
	while (i <= 10)
	{
		sum += i;
		i++;
	}

	printf("sum = %d\n", sum);

	return 0;
}

对比:C语言实现求1到10的和(用for循环实现)

#include <stdio.h>

int main()
{
	int i, sum = 0;

	for (i = 1; i <= 10; i++)
		sum = sum + i;

	printf("sum = %d\n", sum);

	return 0;
}

while循环与for循环的相互转换:

从上述两个程序可知,while循环和for循环可以进行互相转换,言下之意是,所有能用for循环实现的功能,就可以用while循环实现,反之同理。但是,while循环和for循环在写法上有一定的差别。

五、总结

循环结构在学习编程中起到至关重要的作用,几乎每个有用的程序中都有循环结构的身影,循环结构是我们以后编程中的重中之重,掌握其执行顺序是理解程序的不二法门.

以上就是详解C语言中for循环与while循环的用法的详细内容,更多关于C语言 for while循环的资料请关注我们其它相关文章!

(0)

相关推荐

  • C语言示例讲解do while循环语句的用法

    目录 1.do while()循环-先执行后判断 2.do while中的break以及continue 3.练习 4.猜数字游戏 1.do while()循环-先执行后判断 do语句的语法 do    循环语句;while(表达式); 此处的循环语句可能不是一条语句,而是一段代码. 示例:利用do while循环实现打印1-10 #include <stdio.h> int main() { int i = 1; do { printf("%d ",i); i++; }

  • C语言示例讲解for循环的用法

    目录 1.循环语句for的语法 2.for循环中的break以及continue 3.for语句的循环变量控制的一些建议 4.for循环的变种 5.题目 1.循环语句for的语法 for (表达式1;表达式2;表达式3)    循环; 其中,表达式1是初始化:表达式2是判断:表达式3是调整. 示例:用for循环打印1-10. int main() { int i = 0; for (i = 1; i < 11; i++) printf("%d ",i); return 0; }

  • C语言示例讲解while循环语句的用法

    目录 1.while语句结构 2.代码示例 在学习和回顾该知识前,已经掌握了if语句的结构和用法. if (条件)    语句; 当条件满足的情况下,if结构中的语句执行,且只执行一次:条件不满足则不执行.但是生活中常常需要将一件事情完成很多次,这时候就要用到while语句来实现循环了. 1.while语句结构 while (表达式)    循环语句; 例子:利用循环结构打印1-10 #include <stdio.h> int main() { int i = 0; while(i <

  • 从头学习C语言之for语句和循环嵌套

    目录 for语句: 前言: 注意事项: 语句形式: 执行顺序: 示例: 循环嵌套: 语句形式: 流程图: 示例: 总结 for语句: 前言: 循环的基本结构离不开三个基本动作: 初始化计数器 循环条件 更新计数器 int count=0; while(count<10) { printf("fishc!\n); count=count+1; 注意事项: 1.C99允许再for语句的表达式1中定义变量(在for循环里定义的变量出了循环就不能用了), 如:for(int i=0;i<10

  • C语言 while for do while循环体详解用法

    while循环 表达式: while(表达式) { 循环语句: } while 语句执行流程图: 例子: 打印1-10的数字 #include <stdio.h> int main() { int i = 1; while(i<=10) { printf("%d ", i); i +=1; } return 0; } 注意 ①在while中遇到break,终止整个循环 ②continue ,跳过本次循环continue后边的代码,直接去while循环的判断部分,进行下

  • C语言菜鸟基础教程之for循环

    先看程序: #include <stdio.h> int main() { for(int i = 0; i < 5; i++) { printf("i = %d\n", i); } printf("Loop ended!\n"); return 0; } 运行结果: i = 0 i = 1 i = 2 i = 3 i = 4 Loop ended! for循环的语句结构为: for(表达式1; 表达式2; 表达式3) {     语句; } 其执

  • c语言for、while和do-while循环之间的区别

    for,while,do-while区别 循环结构 1.初始化变量:for循环当中定义的初始化变量,只有自己才能用:while和do-while循环,初始化变量本来就在外面,所以外面也照样可以使用.2.执行次数:for循环和while循环是(先判断后执行),但是do-while循环是(先执行后判断).3.使用的普遍性不同:绝大多数情况下,三种循环可以来回转换.但是凡是次数确定.范围确定的情况,使用for循环. 详细例子如下:编程计算1+2+3+……+100a.用for循环 #include <s

  • 详解C语言中for循环与while循环的用法

    目录 一.单层for循环 二.for循环与if选择的嵌套 三.多层for循环的嵌套 四.while循环 五.总结 一.单层for循环 引例:C语言实现求1到10的和(用for循环实现) #include <stdio.h> int main() { int i, sum = 0; for (i = 1; i <= 10; i++) sum = sum + i; printf("sum = %d\n", sum); return 0; } 单层for循环执行的顺序: 第

  • 详解C语言中freopen()函数和fclose()函数的用法

    C语言freopen()函数:打开文件函数,并获得文件句柄 头文件: #include <stdio.h> 定义函数: FILE * freopen(const char * path, const char * mode, FILE * stream); 函数说明: 参数 path 字符串包含欲打开的文件路径及文件名. 参数mode 请参考fopen()说明.. 参数stream 为已打开的文件指针. Freopen()会将原stream 所打开的文件流关闭, 然后打开参数path 的文件.

  • 详解C语言中index()函数和rindex()函数的用法

    C语言index()函数:查找字符串并返回首次出现的位置 相关函数:rindex, srechr, strrchr 头文件:#include <string.h> 定义函数: char * index(const char *s, int c); 函数说明:index()用来找出参数s 字符串中第一个出现的参数c 地址,然后将该字符出现的地址返回.字符串结束字符(NULL)也视为字符串一部分. 返回值:如果找到指定的字符则返回该字符所在地址,否则返回0. 范例 #include <str

  • 详解C语言中telldir()函数和seekdir()函数的用法

    C语言telldir()函数:取得目录流的读取位置 头文件: #include <dirent.h> 定义函数: off_t telldir(DIR *dir); 函数说明:telldir()返回参数dir 目录流目前的读取位置. 此返回值代表距离目录文件开头的偏移量返回值返回下个读取位置, 有错误发生时返回-1. 错误代码:EBADF 参数dir 为无效的目录流. 范例 #include <sys/types.h> #include <dirent.h> #inclu

  • 详解Go语言中for循环,break和continue的使用

    目录 基本语法 有始有终的条件循环 带条件的循环 无限循环 数组循环 使用计数器循环 利用range循环 Map循环 string的遍历 Break和Continue 基本语法 和C语言同源的语法格式,有始有终的循环,for init; condition; post { } 带条件的while循环,for condition { } 无限循环,for { } 有始有终的条件循环 sum := 0 for i := 0; i < 10; i++ { sum = sum + i } 注意:i变量在

  • 详解C语言中return与exit的区别

    详解C语言中return与exit的区别 1,exit用于在程序运行的过程中随时结束程序,exit的参数是返回给OS的.main函数结束时也会隐式地调用exit函数.exit函数运行时首先会执行由atexit()函数登记的函数,然后会做一些自身的清理工作,同时刷新所有输出流.关闭所有打开的流并且关闭通过标准I/O函数tmpfile()创建的临时文件.exit是结束一个进程,它将删除进程使用的内存空间,同时把错误信息返回父进程,而return是返回函数值并退出函数 2,return是语言级别的,它

  • 详解 Go 语言中 Map 类型和 Slice 类型的传递

    Map 类型 先看例子 m1: func main() { m := make(map[int]int) mdMap(m) fmt.Println(m) } func mdMap(m map[int]int) { m[1] = 100 m[2] = 200 } 结果是 map[2:200 1:100] 我们再修改如下 m2: func main() { var m map[int]int mdMap(m) fmt.Println(m) } func mdMap(m map[int]int) {

  • 详解C语言中Char型指针数组与字符数组的区别

    详解C语言中Char型指针数组与字符数组的区别 1.char 类型的指针数组:每个元素都指向一个字符串,指向可以改变 char *name[3] = { "abc", "def", "gbk" }; for(int i = 0 ; i < strlen(name); i ++){ printf("%s\n", *(name+i)); //printf("%s\n", name[i]); } //指向改

  • 详解Go语言中for range的"坑"

    前言 Go 中的for range组合可以和方便的实现对一个数组或切片进行遍历,但是在某些情况下使用for range时很可能就会被"坑",下面用一段代码来模拟下: func main() { arr1 := []int{1, 2, 3} arr2 := make([]*int, len(arr1)) for i, v := range arr1 { arr2[i] = &v } for _, v := range arr2 { fmt.Println(*v) } } 代码解析

  • 详解Golang语言中的interface

    interface是一组method签名的组合,interface可以被任意对象实现,一个对象也可以实现多个interface.任意类型都实现了空interface(也就是包含0个method的interface),空interface可以存储任意类型的值.interface定义了一组方法,如果某个对象实现了某个接口的所有方法,则此对象就实现了此接口. go version go1.12 package main import ( "fmt" ) // 定义struct type Hu

随机推荐