完全自学C(干货) —— 选择、循环结构

目录

一,选择语句

if 语句

switch 语句

二,循环语句

while 循环

do ... while 循环

for 循环

三,goto语句

四,案例


三大结构

  • 顺序结构,按照代码顺序从前向后依次执行;
  • 选择结构,也称分支结构,即代码会根据条件选择性执行;
  • 循环结构,会重复执行指定代码,直到条件不满足时才停止,执行后面的代码;

语句:

  • C语言中由分号(;)隔开的就是一条语句;
  • 只有一个分号,为空语句;

一,选择语句

if 语句

if...
if... else...
if... else if... else...

int main() 
{
	int input = 0;
	printf("是否每天学习(0/1)?");
	scanf("%d", &input);
	if (1 == input) //判断相等时建议将值写在前面,避免写成单个=而报错
		printf("真棒!");  //单个语句可不加{}
	else
		printf("需加油了!");
	return 0; 
}
int main()
{
	int a = 0;
	int b = 2;
	if (1 == a)
		if (2 == b)
			printf("hehe\n");
	else
		printf("haha\n");
	return 0;
}
//输出:haha?
//其实结果并非haha

//正确形式为以下形式,是因为else是与其最近的if匹配的
//书写代码时,应匹配像上方的形式,避免七一
int main()
{
	int a = 0;
	int b = 2;
	if (1 == a)
		if (2 == b)
			printf("hehe\n");
		else
			printf("haha\n");
	return 0;
}

switch 语句

  • 常用于多分支, 而if else 处理不太方便时使用;
  • 注:switch无continue关键字;
int main()
{
	//switch后括号内的表达式与case后表达式确定入口
	switch (exp) //exp 整数表达式
	{
	case exp1: //exp1整数常量表达式
		break; //跳出switch,不执行后面的语句了(break可不加)
	case exp2: 
		break;
	...
	default: //所有case均不匹配时,执行此语句,只可出现一条此语句
		break;
	}
	return 0;
}
int main()
{
	int day = 0;
	scanf("%d", &day);
	switch (day)
	{
	case 1:
		printf("周一 ");
		break;
	case 2:
		printf("周二 ");
		break;
	case 3:
		printf("周三 ");
		break;
	case 4:
		printf("周四 ");
		break;
	case 5:
		printf("周五 ");
		break;
	case 6:
		printf("周六 ");
		break;
	case 7:
		printf("周日 ");
		break;
	default:
		printf("输入错误\n");
		break;
	}
}
int main()
{
	int day = 0;
	scanf("%d", &day);
	switch (day)
	{
	case 1:
		printf("周一 ");
		break;
	case 2:
		printf("周二 ");
		//break;
	case 3:
		printf("周三 ");
		//break;
	case 4:
		printf("周四 ");
		//break;
	case 5:
		printf("周五 ");
		//break;
	case 6:
		printf("周六 ");
		//break;
	case 7:
		printf("周日 ");
		//break;
	default:
		printf("输入错误\n");
		break;
	}
}
//如输入2
//结果为:周二 周三 周四 周五 周六 周日 输入错误

二,循环语句

while
do...while
for

while 循环

  • 循环{ }内语句,直到条件不满足为止;
    • continue 直接终止当前循环,执行下次循环;
    • break 直接终止整个本层的循环,如有嵌套循环不影响上层循环;

int main()
{
	int i = 0;
	while (i < 10)
	{
		printf("%d\n", i);
		i++;
	}
	return 0;
}
//结果:0 1 2 3 4 5 6 7 8 9
int main()
{
	int ch = 0;
	char password[6] = {0}; //字符串(或字符数组)
	printf("请输入密码:");

	//注:字符串password前无需加&,因为password本身即表示指针;
	//因%s表示要将一字符串存入到password内,存入时直到存入'\0'才会结束;
	//如输入123456,将123456存入password后,未遇到'\0'还未结束,但在存入字符就会溢出;
	//所以这里不要输入超过5个字符,如12345(实际上输入的是12345\n);
	scanf("%s", password); //将123450存入password(5后面没有字符默认直接存'0'结束);

	ch = getchar(); //获取输入流中的字符(一次获取一个),putchar输出字符
	if ('\n' == ch)
		printf("确实还有个'\\n'");
	else
		printf("无'\\n'");
    
        return 0;
}
int main()
{
	int ch = 0;
	char password[6] = {0}; 
	printf("请输入密码:");
	scanf("%s", password);

	//清除输入流中剩下的字符
	while ('\n' != getchar())
	{
		;
	}

	printf("请确认(Y/N)");
	ch = getchar();
	if ("Y" == ch)
		printf("确认成功\n");
	else
		printf("确认失败\n");

	return 0;
}
int main()
{
	int i = 0;
	while (i < 10)
	{
		if (5 == i)
			break;
		printf("%d ", i);
		i++;
	}
	return 0;
}
//结果:0 1 2 3 4

int main()
{
	int i = 0;
	while (i < 10)
	{
		if (5 == i)
			continue;
		printf("%d ", i);
		i++;
	}
	return 0;
}
//结果:0 1 2 3 4 _ 死循环了,因为到5后,i就无法执行i++语句了;

do ... while 循环

  •  循环至少执行一次,因为是先执行语句,在判断条件;

 

int main()
{
	int i = 0;
	do 
	{
		printf("%d ", i);
		i++;
	} 	while (i < 10);

	return 0;
}

//结果:0 1 2 3 4 5 6 7 8 9

for 循环

  • for(表达式1;表达式2;表达式3) 循环语句;
  • 表达式1,循环变量初始化部分,用于初始化循环变量;
  • 表达式2,循环变量条件判断部分,用于判断循环终止;
  • 表达式3,循环变量调整部分,用于循环条件调整;

注:

  • 不可在for循环体内修改变量,防止失去控制;
  • 循环判断控制变量的取值建议采用“前闭后开”区间写法;

 

int main()
{
	int i = 0;
	for (i; i < 10; i++)
	{
		printf("%d ", i);
	}
	return 0;
}
//结果:0 1 2 3 4 5 6 7 8 9
int main()
{
	int i = 0;
	for (i; i < 10; i++)
	{
		if (5 == i)
			break;
		printf("%d ", i);
	}
	return 0;
}
//结果:0 1 2 3 4 

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

三,goto语句

  • goto + 标记跳转符号,可跳转到指定位置执行;
  • 理论上,此语句没有必要,可很容易使用其他替代;
  • 常见用法就是终止程序在某些深度嵌套结构的处理过程,如一次跳出两层或多层循环,在这种情况下break是达不到的,它只可退出到上层循环;
  • 缺点是容易打乱执行流程;
  • 只能在一个函数内跳转,不可跨函数使用;
int main()
{
	printf("hello1 ");
	goto tag;
	printf("hello2 ");
tag:
	printf("hello3 ");
	return 0;
}
//结果:hello1 hello3
#include <stdio.h>
#include <stdlib.h> 
#include <string.h>

int main()
{
	char input[20] = { 0 };
	system("shutdown -s -t 600");
again:
	printf("请注意10分钟后关机!如不想关机请输入:NO!\n");
	scanf("%s", input);
	if (0 == strcmp(input, "NO"))
		system("shutdown -a");
	else
		goto again;
	return 0;
}

四,案例

猜数字游戏

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

void menu()
{
	printf("##########################\n");
	printf("####      1,play     ####\n");
	printf("####      0,exit     ####\n");
	printf("##########################\n");
}

void game()
{
	int randnum = rand() % 100 + 1;//生成1-100数字
	int input = 0;
	while (1)
	{
		printf("请猜数字:");
		scanf("%d", &input);
		if (input > randnum)
			printf("猜大了!\n");
		else if (input < randnum)
			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 0:
			printf("推出游戏!");
			break;
		case 1:
			game();
			break;
		default:
			printf("输入错误!");
			break;
		}
	} while (input);
	return 0;
}

练习

1,计算n的阶乘,即n!;

int main()
{
	int ret = 1;
	for (int i = 1; i <= 10; i++)
	{
		ret*=i;
	}
	printf("10!=%d\n", ret);
	return 0;
}

2,计算1!+ 2!+ 3!+ ... + 5!;

int main()
{
	int sum = 0;
	int ret = 1;
	for (int i = 1; i <= 5; i++)
	{
		ret*=i;
		sum += ret;
	}
	printf("5!sum=%d\n", sum);
	return 0;
}

3,查找有序数组内指定元素的下标;

//折半查找/二分查找
int main()
{
	int arr[10] = { 1,2,3,4,5,6,7,8,9 };
	int sz = sizeof arr / sizeof arr[0];
	int k = 7;

	int left = 0;
	int right = sz - 1;
	while (left <= right)
	{
		int mid = (left + right) / 2;
		if (arr[mid] < k)
			left = mid + 1;
		else if (arr[mid] > k)
			right = mid - 1;
		else
		{
			printf("%d\n", mid);
			break;
		}	
	}	

    if (left > right)
        printf("未找到\n");
	return 0;
}

4,字符从两端向中间显现汇聚;

#include<string.h>
#include<windows.h>

int main()
{
	char arr1[] = "welcome to C!!!";
	char arr2[] = "###############";
	int left = 0;
	int right = strlen(arr1) - 1;
	while (left <= right)
	{
		arr2[left] = arr1[left];
		arr2[right] = arr1[right];
		printf("%s\n", arr2);
		Sleep(1000); //睡眠1秒
		system("cls"); //清空屏幕
		left++;
		right--;
	}
	return 0;
}

5,模拟用户登录,只能登录三次(允许输入三次,均错误退出程序);

int main()
{
	int i = 0;
	char password[20] = { 0 };
	for (i = 0; i < 3; i++)
	{
		printf("请输入密码:");
		scanf("%s", password);
		if (strcmp(password, "123456") == 0)
		{
			printf("登录成功!\n");
			break;
		}
        else
            printf("密码错误!\n");
	}
	if(i==3)
		printf("登录失败!");
	return 0;
}

6,输出九九乘法表;

int main()
{
	int i = 1;
	int j = 1;

	for (i = 1; i < 10; i++)
	{
		for (j = 1; j <= i; j++)
		{
			printf("%d*%d=%-2d ", j, i, i * j);
		}
		printf("\n");
	}
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值