您的当前位置:首页正文

03分支和循环

来源:九壹网

分支语句

if…else语句

int main()
{
	int a = 0;
	int b = 2;
	if (a == 1)
	{
		if (b == 2)
			printf("hehe\n");
	}
	else
		printf("haha\n");

	//if (a == 1)
	//	if (b == 2)
	//		printf("hehe\n");
	//	else //else和最近的未匹配的if进行匹配,与缩进位置无关
	//		printf("haha\n");
	return 0;
}

int main()
{
	int age = 10;
	if (age < 18)
		printf("未成年\n");
	else if (age >= 18 && age < 28)
		printf("青年\n");
	else if (age >= 28 && age < 50)
		printf("壮年\n");
	else
		printf("老年\n");

	//if(18 <= age < 28) //error:18 <= age等价于 0,0 < 28永远为真!

	//if (age < 18)
	//	printf("未成年\n");
	//else
	//	printf("成年\n");

	return 0;
}

if书写形式对比

//代码1
if(condition){
    return x;
}
return y;

//代码2
if(condition)
{
    return x;
}
else 
{
    return y;
}

//代码3
int num = 4;
if (num = 5) //= 赋值   == 判断相等
{
    printf("hehe\n");
}

//代码4
int num = 4;
if (5 == num) 
{
    printf("hehe\n");
}

练习

//1.判断一个数是否为奇数
int main()
{
	int num;
	scanf("%d", &num);
	if (num % 2 != 0)
		printf("%d是奇数!\n", num);
	else
		printf("%d不是奇数!\n", num);
	return 0;
}


//2.输出1-100之间的奇数
int main()
{
	for (int num = 1; num < 101; num++)
	{
		if (num % 2 != 0)
			printf("%d ", num);
	}
	return 0;
}


//3.以下程序的打印结果是?
int main()
{
	int i = 0;
	for (i = 0; i < 10; i++)
	{
		if (i = 5)
			printf("%d ", i); //死循环的打印5
	}
	return 0;
}


//4.求a b c中最大的数
int main()
{
	int a=0,b=0, c=0;
	scanf("%d %d %d", &a, &b, &c);
	if (a > b)
	{
		int tmp = a;
		a = b;
		b = tmp;
	}
	if (b > c)
	{
		int tmp = b;
		b = c;
		c = tmp;
	}
	//如果是三个数排序,就要加上以下代码
	//if (a > b)
	//{
	//	int tmp = a;
	//	a = b;
	//	b = tmp;
	//}
	printf("%d\n", c);
	return 0;
}

switch语句

//int main()
//{
//	int day = 0;
//	scanf("%d", &day);
	switch (day) 
	{
	case 1: 
	case 2:
	case 3:
	case 4:
	case 5:
		printf("工作日\n");
		break;
	case 6:
	case 7:
		printf("休息日\n");
		break;
	default:
		printf("输入错误\n");
		break;
	}

//	//switch (day)  //这个括号里面只能是整型表达式
//	//{
//	//case 1: //case 后面只能是整型常量表达式
//	//	printf("星期一\n");
//	//	break;
//	//case 2:
//	//	printf("星期二\n");
//	//	break;
//	//case 3:
//	//	printf("星期三\n");
//	//	break;
//	//case 4:
//	//	printf("星期四\n");
//	//	break;
//	//case 5:
//	//	printf("星期五\n");
//	//	break;
//	//case 6:
//	//	printf("星期六\n");
//	//	break;
//	//case 7:
//	//	printf("星期日\n");
//	//	break;
//	//}
//
//	//switch (day)  
//	//{
//	//case 1: 
//	//	printf("星期一\n");
//	//case 2:
//	//	printf("星期二\n");
//	//case 3:
//	//	printf("星期三\n");
//	//case 4:
//	//	printf("星期四\n");
//	//case 5:
//	//	printf("星期五\n");
//	//case 6:
//	//	printf("星期六\n");
//	//case 7:
//	//	printf("星期日\n");
//	//}

	//if (1 == day)
	//	printf("星期一\n");
	//if (2 == day)
	//	printf("星期二\n");
	//if (1 == day)
	//	printf("星期三\n");
	//if (1 == day)
	//	printf("星期四\n");
	...
//	return 0;
//}

练习

//1.以下程序的打印结果是?
int main()
{
	int n = 1;
	int m = 2;
	switch(n) //n=1
	{
	case 1:
		m++; //m=3
	case 2:
		n++; //n=2
	case 3:
		switch (n)
		{
		case 1: //不执行
			n++;
		case 2: 
			m++; //m=4
			n++; //n=3
			break;
		}
	case 4: 
		m++; //m=5
		break;
	default:
		break;
	}
	printf("m = %d,n = %d\n", m, n); //m=5,n=3
	return 0;
}


//2.以下程序的打印结果是?
int func(int a)
{
	int b;
	switch (a)
	{
		case 1:b = 30;
		case 2:b = 20;
		case 3:b = 16;
		default:b = 0;
	}
	return b;
}

int main()
{
	int ans=func(1);
	printf("%d\n", ans); //0
	return 0;
}


//3.以下程序的返回结果是?
int func(int a)
{
	int b;
	switch (a)
	{
		case 1:b = 30;
		case 2:b = 20;
		case 3:b = 16;
		default:b = 0;
	}
	return b; //0
}


//4.以下程序的打印结果是?
int main()
{
	int x = 3;
	int y = 3;
	switch (x % 2) {
	case 1:
		switch (y)
		{
		case 0:
			printf("first");
		case 1:
			printf("second");
			break;
		default:
			printf("hello");
		}
	case 2:
		printf("third");
	}
	return 0;  //hellothird
}

循环语句

while语句

int main()
{
	int i = 0;
	while (i < 10)
	{
		i++;
		if (i == 5)
			continue;
		printf("%d ", i); //1 2 3 4 6 7 8 9 10 
	}

	//int i = 1;
	
	//while (i < 11)
	//{
	//	if (i == 5)
	//		continue;
	//	printf("%d ", i); //1 2 3 4 死循环
	//	i++;
	//}

	//while (i < 11)
	//{
	//	if (i == 5)
	//		break;
	//	printf("%d ", i); //1 2 3 4 
	//	i++;
	//}

	//while (i<11)
	//{
	//	printf("%d ", i);
	//	i++;
	//}
	
	//while (1) //死循环
	//	printf("hehe\n");

	return 0;
}

总结:continue在while循环中的作用是:

getchar()

//代码1
int main()
{
	int ch = 0;
	//ctrl + z - ch获取到EOF
	//EOF - end of file - 值为-1
	while ((ch = getchar()) != EOF)
	{
		putchar(ch);
	}

	//int ch=getchar();
	//putchar(ch);
	//printf("%c\n", ch);
	return 0;
}

//代码2
int main()
{
	int ret = 0;
	int ch = 0;
	char password[20] = { 0 };
	printf("请输入密码:");
	scanf("%s", password);//请输入密码,并存放在password数组中
	//缓冲区还剩余一个'\n'
	//读取一个'\n'
	while ((ch = getchar()) != '\n')
	{
		;
	}
	printf("请确认(Y/N):>");
	ret = getchar();//Y/N
	if (ret == 'Y')
	{
		printf("确定成功\n");
	}
	else
	{
		printf("放弃确认\n");
	}

	//printf("%d\n", '\n'); //10
	return 0;
}

//代码3
int main()
{
	int ch = 0;
	while ((ch=getchar())!=EOF)
	{
		if (ch < '0' || ch>'9')
			continue;
		putchar(ch);
	}
	return 0;
}

输入缓冲区:

练习

//1.以下程序的输出结果是?
int main()
{
	int i = 0;
	for (i = 0; i<10; i++)
	{
		if (i = 5)
			printf("%d ", i); //死循环的打印5
	}
	return 0;
}


//2.求两个数的最大公约数和最小公倍数
Min(int x, int y)
{
	return x < y ? x : y;
}

Max(int x, int y)
{
	return x > y ? x : y;
}

int main()
{
	int a = 0;
	int b = 0;
	int yue = 0;
	int bei = 0;
	int min = 0;
	int max = 0;
	int pos = 1;
	scanf("%d%d", &a, &b);
	min = Min(a, b);
	max = Max(a, b);
	//求最大公约数
	while (pos <= min) 
	{
		if (a % pos == 0 && b % pos == 0)
			yue = pos;
		pos++;
	}
	pos = max;
	//求最小公倍数
	while(max<=a*b)
	{
		if (pos % a == 0 && pos % b == 0) {
			bei = pos;
			break;
		}
		pos++;
	}
	printf("%d %d\n",yue,bei);
	return 0;
}


//3.打印1000年到2000年之间的闰年
int main()
{
	for (int year = 1000; year <= 2000; year++)
	{
		if (year % 400 == 0 || (year % 4 == 0 && year % 100 != 0))
			printf("%d ",year);
	}
	return 0;
}


//4.打印n以内的素数
int isPrime(int num)
{
	for (int i = 2; i < num; i++)
	{
		if (num % i == 0) 
			return 0;
	}
	return 1;
}

int main()
{
	int n = 0;
	scanf("%d", &n);
	for (int i = 2; i <= n; i++)
	{
		if (isPrime(i))
			printf("%d\n", i);
	}
	return 0;
}


//5.输入三个数,并从大到小输出。
int main()
{
	//解法1
	int a = 0;
	int b = 0;
	int c = 0;
	scanf("%d %d %d", &a, &b, &c);
	if (a > b)
	{
		int tmp = a;
		a = b;
		b = tmp;
	}
	if (b > c)
	{
		int tmp = b;
		b = c;
		c = tmp;
	}
	if (a > b)
	{
		int tmp = a;
		a = b;
		b = tmp;
	}
	printf("%d %d %d\n", a,b,c);


	//int arr[3] = { 0 };
	//for (int i = 0; i < 3; i++)
	//{
	//	scanf("%d", &arr[i]);
	//}

	解法2:冒泡排序
	//for (int i = 3; i >= 2; i--)
	//	for (int j = 1; j < i; j++)
	//	{
	//		if (arr[j - 1] > arr[j]) {
	//			int tmp = arr[j];
	//			arr[j] = arr[j - 1];
	//			arr[j - 1] = tmp;
	//		}
	//	}

	//for (int i = 2; i >= 0; i--)
	//{
	//	printf("%d ", arr[i]);
	//}
	return 0;
}

for语句

int main()
{
	int i = 0;
	//    初始化     判断    调整
	for (int i = 1; i <= 10; i++)
	{
		if (i == 5)
			//break; //1 2 3 4
			continue; //1 2 3 4 6 7 8 9 10
		printf("%d ", i);
	}
	return 0;
}

//变种1
int main()
{
	//for循环的初始化,调整、判断都可以省略
	//但是for循环的判断部分被省略,那判断条件就是:恒为真
	for (;;) // 死循环
	{
		printf("hehe\n");
	}
	return 0;
}

int main()
{
	int i = 0;
	int j = 0;
	for (; i < 10; i++)
	{
		//第二次外循环开始后,内循环中的j仍未10,故不打印 hehe
		for (; j < 10; j++) 
		{
			printf("hehe\n"); //打印10个hehe
		}
	}

	//for (int i = 0; i < 10; i++)
	//{
	//	for (int j = 0; j < 10; j++)
	//	{
	//		printf("hehe\n"); //打印100个hehe
	//	}
	//}
	return 0;
}

//变种2
int main()
{
	int x, y;
	for (x = 0, y = 0; x < 2 && y < 5; x++, y++)
	{
		printf("hehe\n"); //打印两个 hehe
	}
	return 0;
}

for循环与while循环对比:

一些建议:

  1. 不可在for循环体内修改循环变量,防止for循环失去控制。
  2. 建议for语句的循环控制变量的取值采用“前闭后开区间”写法。
//2.
int main()
{
	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
	for (int i = 0; i < 10; i++)
	{
		printf("%d ", arr[i]);
	}
	return 0;
}

//1.
//int main()
//{
//	int i = 0;
//	for (int  i = 0; i < 10; i++)
//	{
//		if (i = 5)
//			printf("haha\n");
//		printf("hehe\n");
//	}
//	return 0;
//}

练习

//1.请问以下循环要循环多少次?
int main()
{
	int i = 0;
	int k = 0;
	for (i = 0, k = 0; k = 0; i++, k++) //k=0为假,循环零次
		k++; 
	return 0;
}

do…while语句

int main()
{
	int i = 1;
	do
	{
		if (i == 5)
			break;
			//continue; //1 2 3 4 死循环
		printf("%d ", i);
		i++;
	}
	while (i <= 10);
	return 0;
}

练习

//1.计算n的阶乘
int main()
{
	int n = 0;
	int ret = 1;
	scanf("%d", &n);
	for (int i = 1; i <= n; i++)
	{
		ret *= i;
	}
	printf("%d\n", ret);
	return 0;
}


//2.计算1!+2!+ ...n!
int main()
{
	int n = 0;
	int num = 1;
	int ret = 0;

	scanf("%d", &n);
	for (int i = 1; i <= n; i++)
	{
		num *= i;
		ret += num;
	}
	printf("%d\n", ret);
	return 0;
}


//3.在有序数组中寻找指定元素
//二分查找
int main()
{
	int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
	int k = 7;
	int sz = sizeof(arr) / sizeof(arr[0]); //计算元素个数
	int lt = 0;
	int rt = sz;
	while (lt <= rt)
	{
		int mid = (lt + rt) / 2;
		if (arr[mid] == k)
		{
			printf("找到了,下标为: %d\n", mid);
			break;
		}
		else if (arr[mid] < k)
		{
			lt = mid + 1;
		}
		else
		{
			rt = mid - 1;
		}
	}
	if (lt > rt)
		printf("找不到\n");
	return 0;
}

//顺序查找
//int main()
//{
//	int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
//	int k = 7;
//	//写一个代码,在arr数组(有序的)中找到7
//	int sz = sizeof(arr) / sizeof(arr[0]);
//	for (int i = 0; i < sz; i++)
//	{
//		if (k == arr[i])
//		{
//			printf("找到了,下标是:%d\n", i);
//			break;
//		}
//		if (i == sz)
//			printf("找不到\n");
//	}
//	return 0;
//}


//4.编写代码,演示多个字符从两端向中间汇聚显示
//考点:数组拷贝
#include<string.h>
#include<windows.h>
#include<stdlib.h>

int main()
{
	//welcome to aoligei!!!
	//#####################
	//w###################!
	//we#################!!
	//wel###############!!!
	//...
	//welcome to aoligei!!!
	//
	//char arr[]="abc";
	//[a b c \0]
	// 0 1 2 3
	//4-2
	char arr1[] = "welcome to aoligei!!!";
	char arr2[] = "#####################";
	int left = 0;
	//int right = sizeof(arr1) / sizeof(arr1[0]) - 1; //err
	//int right = sizeof(arr1) / sizeof(arr1[0]) - 2;
	int right = strlen(arr1)-1;
	
	while (left<=right)
	{
		arr2[left] = arr1[left];
		arr2[right] = arr1[right];
		printf("%s\n", arr2);
		//休息一秒
		Sleep(1000);
		system("cls");//执行系统命令的一个函数 - cls - 清空屏幕
		left++;
		right--;
	}
    printf("%s\n", arr2);
	return 0;
}


//5.模拟用户登录情景,并且只能登录三次。
//(只允许输入三次密码,如果密码正确则提示登录成功,
//如果三次均输入错误,则退出程序。)
//考点:比较字符串是否相等 - strcmp
#include<string.h>

int main()
{
	char password[20] = { 0 };
	for (int i = 0; i < 3; i++)
	{
		printf("请输入密码:");
		scanf("%s", password);
		//if (password == "123456") //== 不能用来比较两个字符串是否相等
		//strcmp中比较的两个字符串若相等,则返回0
		if (strcmp(password, "123456") == 0) 
		{
			printf("登录成功\n");
			break;
		}
		if (i == 2)
			printf("登录失败!\n");
	}
	return 0;
}


//6.以下程序的输出结果是?
int main()
{
	int a = 0, b = 0;
	for (a = 1, b = 1; a <= 100; a++)
	{
		if (b >= 20) break;
		if (b % 3 == 1)
		{
			b = b + 3;
			continue;
		}
		b = b - 5;
	}
	printf("%d\n", a); //8
	return 0;
}


//7. 1到 100 的所有整数中出现多少个数字9
int main()
{
	int count = 0;
	for (int i = 1; i <= 100; i++)
	{
		int num = i;
		while (num != 0)
		{
			if (num % 10 == 9)
				count++;
			num /= 10;
		}
	}
	printf("%d\n", count);
	return 0;
}


//8.计算1/1-1/2+1/3-1/4+1/5 …… + 1/99 - 1/100 的值,打印出结果
int main()
{
	double sum = 0.0;
	int flag = 1;
	for (int i = 1; i <= 100; i++)
	{
		sum += flag * 1.0 / i;
		flag = -flag;
	}
	//注意这里的输出格式是 %lf
	printf("%lf\n", sum); //0.688172
	return 0;
}


//9.求10 个整数中最大值
#define N 10 

int main()
{
	int arr[N] = { 0 }; //这里使用宏定义来为数组开辟空间
	int max = 0;
	for (int i = 0; i < 10; i++)
	{
		scanf("%d", &arr[i]);
		if (arr[i] > max) {
			max = arr[i];
		}
	}
	printf("%d\n", max);
	return 0;
}


//10.在屏幕上输出9*9乘法口诀表
int main()
{
	for (int i = 1; i <= 9; i++)
	{
		for (int j = i; j <= 9; j++) //注意:这里的j从i开始!
		{
			printf("%d * %d = %d\t", i, j, i * j);
		}
		printf("\n");
	}
	return 0;
}

猜数字游戏

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

//11.猜数字游戏
//11.1电脑会生成一个随机数
//11.2猜数字

void menu()
{
	printf("*********************************\n");
	printf("****     1.play    0.exit    ****\n");
	printf("*********************************\n");
}

//RAND_MAX 0-32767

void game()
{
	//1.生成一个随机数
	int ret = 0;
	int guess = 0;//接收猜的数字
	int count = 0;//记录猜数字的次数
	//拿时间戳来设置随机数的生成起始点
	//time_t time(time_t * timer)
	//time_t
	//ret = rand(); //生成 0-32767 之间的随机数
	ret = rand() % 100 + 1;//生成 1-100 之间的随机数
	//printf("%d\n",ret);
	//2.猜数字
	while (1)
	{
		printf("请猜数字:");
		scanf("%d", &guess);
		if (guess > ret)
		{
			printf("猜大了!\n");
			count++;
			if (count > 2)
				printf("能不能不要下几把拆!\n");
		}
		else if (guess < ret)
		{
			printf("猜小了!\n");
			count++;
			if (count > 2)
				printf("您怎么回事?不会猜?\n");
		}
		else
		{
			printf("额,终于猜对了。。。\n");
			break;
		}
	}
}

int main()
{
	int input = 0;
	srand((unsigned int)time(NULL));
	do
	{
		menu();
		printf("请选择:");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			game(); //猜数字游戏
			break;
		case 0:
			printf("退出游戏\n");
			break;
		default:
			printf("选择错误\n");
			break;
		}
	} while (input);
	return 0;
}

goto语句

C语言中提供了可以随意滥用的goto语句和标记跳转的标号。

从理论上goto语句是没有必要的,但是某些场合下goto语句还是用得着的,最常见的用法就是终止程序在某些深度嵌套的结构的处理过程,例如一次跳出两层或多层循环。

这种情况使用break是达不到目的的。它只能从最内层循环退出到上一层的循环。

for(...)
    for(...)
    {
        for(...)
        {
            if(disaster)
                goto error;
        }
    }
	...
error:
	if(disaster)
        //处理错误情况

关机小程序

//关机小程序
#include<string.h>

int main()
{
	char input[20] = { 0 };
	//shutdown -s -t 60
	//system() - 执行系统命令的
	system("shutdown -s -t 60");
	while (1)
	{
		printf("请注意,您的电脑将在1分钟内关机,如果输入:【我是猪】,就取消关机\n请输入:");
		scanf("%s", input);
		if (strcmp(input, "我是猪") == 0)//比较两个字符串 - strcmp() -相等则返回0
		{
			system("shutdown -a");
			break;
		}
	}
	return 0;
}

//int main()
//{
//	char input[20] = { 0 };
//	//shutdown -s -t 60
//	//system() - 执行系统命令的
//	system("shutdown -s -t 60");
//again:
//	printf("请注意,您的电脑将在1分钟内关机,如果输入:【我是猪】,就取消关机\n请输入:");
//	scanf("%s", input);
//	if (strcmp(input, "我是猪") == 0)//比较两个字符串 - strcmp() -相等则返回0
//	{
//		system("shutdown -a");
//	}
//	else
//	{
//		goto again;
//	}
//	return 0;
//}

因篇幅问题不能全部显示,请点此查看更多更全内容

Top