C语言的程序流程控制

目录

顺序控制

分支控制

if-else(单分支)

求二次元方程是否有解

if-else(多分支)

嵌套分支

switch分支结构

细节讨论

switch和if的比较

for循环控制

注意事项和细节说明

练习题

While循环控制

do-while循环控制

多重循环控制

跳转控制语句-break

跳转控制语句-continue

跳转控制语句

循环控制练习

调和级数相加

顺序控制

程序从上到下逐行地执行,中间没有任何判断和跳转

分支控制

if-else(单分支)

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

void main() {

	int x = 4;
	int y = 1;
	if (x > 2) {
		if (y > 1) {
			printf("x+y=%d", x + y);
		}
		printf("我爱中华");
	}
	else {
		printf("x is =%d", x);
	}
	getchar();//我爱中华
}

求二次元方程是否有解

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<math.h>

//求的是二次元方程是否有解
void main() {
	double a = 0;
	double b = 0;
	double c = 0;
	printf("请输入a的值:");
	scanf("%lf", &a);
	printf("请输入b的值:");
	scanf("%lf", &b);
	printf("请输入c的值:");
	scanf("%lf", &c);

	double z = b * b - 4 * a * c;

	double x1 = 0;
	double x2 = 0;

	if (z >= 0) {
		x1 = -b + sqrt(z) / 2 * a;
		x2 = -b - sqrt(z) / 2 * a;
		printf("方程的两个解分别为:%.lf,%.lf", x1, x2);
	}
	else {
		printf("方程无解");
	}
	getchar();
	getchar();
}

if-else(多分支)

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>

void main() {
	double score = 0.0;
	printf("请输入小明的C二级考试成绩:");
	scanf("%lf", &score);

	if (score == 100) {
		printf("奖励一台宝马");
	}
	else if (score>80&&score<100){
		printf("奖励一部苹果手机");
	}
	else if (score >= 60 && score <= 80) {
		printf("奖励一个ipad");
	}
	else {
		printf("什么奖励都没有");
	}
	getchar();//得到的回车
	getchar();//控制台暂停
}

嵌套分支

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>

//参加百米运动会,如果用时8秒以内进入决赛,否则提示淘汰。并且根据性别提示进入男子组或女子组。
void main() {
	double time = 0.0;
	char gender = ' ';

	printf("请输入百米运动会成绩(s):");
	scanf("%lf", &time);

	if (time < 8) {
		printf("请输入同学性别(m/f):");
		scanf("%c", &gender);//接收到上次回车
		scanf("%c", &gender);
		
		if (gender == 'f') {
			printf("进入女子组决赛");
		}
		else {
			printf("进入男子组决赛");
		}
	}
	else {
		printf("淘汰");
	}

	getchar();
	getchar();
}

switch分支结构

细节讨论

  • switch语句中的表达式是一个常量表达式,必须是一个整数(char、short、int、long)或枚举类型
  • case子句中的值必须是常量,而不能是变量
  • default子句是可选的,当没有匹配的case时,执行default
  • break语句用来执行完一个case分支后使程序跳出switch语句块
  • 如果没有写break,会执行下一个case语句块,直到遇到break或者执行到switch结尾,这个现象称为穿透
double score = 0.0;
printf("请输入学生成绩(满分100分):");
scanf("%lf", &score);

switch ((int)(score / 60)) {
case 0:
	printf("不合格");
	break;
case 1:
	printf("合格");
	break;
default:
	printf("输入成绩有误");
		
}

switch和if的比较

  • 如果判断的具体数值不多,而且符合整型、枚举类型,此时建议使用switch语句
  • 对区间判断,对结果为真假的判断,使用if

for循环控制

注意事项和细节说明

  • 循环条件是返回一个表示真假的表达式
  • for(;循环判断条件;)中的初始化和变量迭代可以不写
  • 循环初始值可以有多条初始化语句,但要求类型一样,并且中间用逗号隔开,循环变量迭代也可以有多条变量迭代语句,中间用逗号隔开

练习题

#include<stdio.h>

void main() {
	//打印1-100之间所有是9的倍数的整数的个数及总和
	int count = 0;
	int sum = 0;
	for (int i = 1; i <= 100; i++) {
		if (i % 9 == 0) {
			count++;
			sum += i;
		}
	}
	printf("1-100之间是9的倍数的整数有%d个,\n",count);
	printf("1-100之间是9的倍数的整数总和是%d,", sum);

	int j = 0;
	printf("请输入一个整数:");
	scanf("%d", &j);

	for (int i = 0; i <= j; i++) {
		printf("\n %d + %d = %d", i, j - i, j);
	}
	getchar();
}

While循环控制

#include <stdio.h>
#include <string.h>
void main() {

    //不断输入姓名,直到输入 "exit" 为止[使用while完成]
	//分析
	//1. 需要接受用户的输入,字符串[字符数组]
	//2. 提示: <string.h> 有一个strcmp 函数,判断两个字符串是否相同
	// int strcmp(const char *str1, const char *str2) // 返回0 表示相等,非0表示不相等

	char name[10] = "";
	
	while( strcmp(name,"exit") != 0) { // exit  = > 0 != 0
		printf("\n请输入名字");
		scanf("%s", name); // 这里不需要 加 &name, 因为 数组的名称就是地址
		printf("\n你输入的名字是=%s", name);
	}
	printf("退出while");
	getchar(); //过滤 回车
	getchar(); // 暂停控制台
}

do-while循环控制

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>

void main() {

    //打印1-100的和
	int i = 0;
	int j = 100;
	int sum = 0;
	do {
		sum += i;
		i++;
	} while (i <= j);

	printf("1-%d的和为:%d", j, sum);*/

	//统计1-200之间能被5整除但不能被3整除的个数
	int count = 0;
	int j = 200;//区间的最大值
	int i = 1;
	do {
		if (i % 5 == 0 && i % 3 != 0) {
			count++;
	}
	i++;
	}while (i <= j);
	printf("1-200之间能被5整除但不能被3整除的个数:%d个", count);

	//如果老公同意老婆购物,则老婆将一直购物;
	//直到老公说不同意为止[printf("老婆问:我可以继续购物吗?y/n")]

	char answer = ' ';
	do {
		printf("老婆问:我可以继续购物吗?(y/n)\t");
		scanf("%c", &answer); // 获取用户输入
		getchar(); //过滤掉 回车符
	} while (answer == 'y');//严格大小写

	printf("老婆终于退出购物~~~~");
	getchar();
}

多重循环控制

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>

void main() {
	//统计3个班成绩情况,每个班有5名同学,求出各个班的平均分和所有班级的平均分[学生的成绩从键盘输入]。

	//1. 各个班的平均分
	//2. 所有班级的平均分, 得到所有班级的总分 allClassTotalScore
	//3. 定义变量表示 班级个数 classNum , 定义变量表示 学生个数 stuNum
	//4. 定义变量 classTotalScore 每个班级总分
	//5. 定义变量 score , 接收学生成绩
	//6. 使用两层for循环

	int classNum = 3;
	int stuNum = 5;
	double score = 0.0;
	double classTotalScore = 0.0;
	double allClassTotalScore = 0.0;
	int count = 0;//每班不及格人数
	int count1 = 0;//全部班不及格人数
	int i = 0;
	int j = 0;

	//每次给一个班级输出成绩时,需要清零
	classTotalScore = 0.0;
	for (int i = 1; i <= classNum; i++) {
		count = 0;
		for (int j = 1; j <= stuNum; j++) {
			printf("请输入第%d个班的第%d个的同学的成绩:", i, j);
			scanf("%lf", &score);
			if (score < 60) {
				count++;
			}
			classTotalScore += score;
		}
		count1 += count;
		allClassTotalScore += classTotalScore;
		printf("第%d个班的总成绩为%.2lf,平均分为%.2lf\n", i, classTotalScore, classTotalScore / stuNum);
		printf("第%d个班不及格的人数为%d\n", i, count);
	}
	printf("全部班级学生的总成绩为%.2lf,平均分数为%.2lf\n", allClassTotalScore, classTotalScore / stuNum * classNum);
	printf("全部班不及格的人数为%d",count1);
	getchar();
	getchar();
}

跳转控制语句-break

  • break语句用于终止某个语句块的执行,一般使用在switch或者循环中
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<time.h>

void main() {

	//int i;
	//for(i = 0; i < 10; i++) {
	//	if(i == 3) { 
	//		break; //当执行到break 时,就会退出for循环
	//	}
	//	printf("i=%d\n", i); // 0 - 9
	//}

	//100以内的数求和,求出当和第一次大于20的当前数
	/*int i = 1;
	int sum = 0;
	for (i = 0; i < 100; i++) {
		sum += i;
		if (sum > 20) {
			break;
		}
	}
	printf("i=%d\n", i);*/

	//实现登录验证,有三次机会,如果用户名为”张无忌” ,密码”888”提示登录成功,
	//否则提示还有几次机会,请使用for 循环完成

	//分析
	//1. 首先要定义一个变量,保存登录的机会(次数) chance
	//2. 定义两个字符数组,接收 用户名和密码
	//3. 使用for循环+break , 如果登录成功,就提前退出

	//int chance = 3;
	//int loginCount = 3;//登录次数
	//char name[10] = " ";
	//char pwd[10] = "";
	//int i;//循环变量
	//for (int i = 1; i <= loginCount; i++) {
	//	printf("请输入用户名:");
	//	scanf("%s", name);

	//	printf("请输入密码:");
	//	scanf("%s", pwd);

	//	//判断字符串相等使用strcmp
	//	if (strcmp("张无忌", name) == 0 && strcmp("888", pwd) == 0) {
	//		printf("\n登陆成功!");
	//		break;
	//	}
	//	else {
	//		//机会次数-1
	//		chance--;
	//		printf("你还有%d次登陆机会\n", chance);
	//	}
	//	
	//}
	//getchar();
	//getchar();

	//出现随机数97的次数
	//int num = rand() % n + a
	//a是起始值,n-1+a是终止值,n是整数的范围
	
	//srand((unsigned)time(NULL));
	int i;
	for (i = 1; i < 1000; i++) {//生成1000个随机数
		int num = rand() % 100 + 1;
		printf("num=%d\t%d\n", num,i);

		if (num == 97) {
			break;
		}

	}
	printf("出现随机数97需要的次数为%d", i);

}

跳转控制语句-continue

  • continue语句用于结束本次循环,继续执行下一次循环
  • continue语句,只能配合使用循环语言使用,不能单独和switch/if使用
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>

void main() {
	//从键盘读入个数不确定的整数,并判断读入的正数和负数的个数,
	//输入为0时结束程序【使用for循环 ,break, continue完成】 【positive 正数,negative】

	//1. 定义变量 positive 保存正数的个数
	//2. 定义变量 negative 保存负数的个数

	//3. 使用for + break + continue

	int positive = 0;
	int negative = 0;

	int num = 0;//接收从控制台输入的数

	for (; ;){//死循环,永远不退出
		printf("请输入数字:");
		scanf("%d", &num);

		if (num == 0) {
			break;//跳出for
		}

		if (num > 0) {
			positive++;
			continue;
		}

		negative++;
	}
	printf("正数有%d个\n",positive);
	printf("负数有%d个\n", negative);

	getchar();

	//某人有100000元, 每经过一次路口,需要交费, 规则如下:
	//当现金>50000时,每次交5%
	//当现金<=50000时,每次交1000
	//编程计算该人可以经过多少次路口,使用 while break方式完成
	//小于1000时,就不能再过路口了

	double money = 1000;
	int count = 0;

	while (1) {
		if (money < 1000) {
			break;
		}

		if (money > 50000) {
			money = money * 0.95;
			count++;
			continue;
		}
		else if(money<=50000){
			money = money - 1000;
			count++;
		}
	}
	printf("该人一共能经过%d次路口.剩余%d元", count,money);
	getchar();
}

跳转控制语句

  • C语言的goto语句可以无条件地转移到程序中指定的行
  • goto语句通常与条件语句配合使用。可以来实现条件转移,跳出循环体等功能
#include<stdio.h>

void main() {

	//定义标签

	printf("start\n");
	goto label1;
	printf("ok1\n");
	printf("ok2\n");
	label1://下边就是对label标签的定义
	printf("ok3\n");
	printf("ok4\n");

	getchar();
}

循环控制练习

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>

void main() {
	/*int num = 0;

	printf("请输入一个整数:");
	scanf("%d", &num);

	if (num > 0) {
		printf("该数大于0");
	}
	else if (num < 0) {
		printf("该数小于0");
	}
	else {
		printf("该数等于0");
	}
	getchar();*/

	//判断一个年份是否是闰年
	int year = 0;
	printf("请输入一个年份:");
	scanf("%d", &year);

	if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0) {
		printf("%d年是闰年", year);
	}
	else {
		printf("%d年是平年", year);
	}
	getchar();

	//判断一个整数是否是水仙花数
	int num;
	printf("请输入一个整数:");
	scanf("%d", &num);
	int a = num / 100;//百位
	int b = num % 100 / 10;//十位
	int c = num % 10;//个位

	if (num = a * a * a + b * b * b + c * c * c) {
		printf("%d是水仙花数", num);
	}
	else {
		printf("%d不是水仙花数", num);
	}

	int m = 0, n = 3;
	if (m > 0) {
		if (n > 2) {
			printf("A");
		}
		else {
			printf("B");
		}
	}
	
	//保存用户名和密码,判断用户名是否为“张三”,密码是否为1234
	char name[10] = "";
	char pwd[10] = "";
	printf("请输入用户名:");
	scanf("%s", name);
	printf("请输入密码:");
	scanf("%s", pwd);

	if (strcmp("张三", name) == 0 && strcmp("1234", pwd) == 0) {
		printf("登陆成功");
	}
	else {
		printf("登陆失败");
	}

	//根据输入的月份和年份,求出该月的天数
	int year;
	int month;
	printf("请输入当前的年份:");
	scanf("%d", &year);
	printf("请输入当前的月份:");
	scanf("%d", &month);

	if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0) {
		if (month == 2) {
			printf("当前月份为29天");
		}
	}
	else {
		if (month == 2) {
			printf("当前月份为28天");
		}
	}

	if (month == 1 || month == 3 || month == 5 || month == 7 || month == 8 || month == 10 || month == 12) {
		printf("当前月份为31天");
	}
	if (month == 4 || month == 6 || month == 9 || month == 11) {
		printf("当前月份为30天");
	}
	
}

调和级数相加

//求出1-1/2+……-1/100的和
double sum = 0.0;
int i;
for (i = 1; i <= 100; i++) {
	if (i % 2 != 0) {
		sum += 1.0 / i;
	}
	else {
		sum -= 1.0 / i;
	}

	sum += 1.0 / i;
}
printf("调和级数的和为%.6f", sum);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值