【C】Declarações de ramificação e loop

Índice

【1】O que é uma declaração?

【2】Instrução da filial (estrutura de seleção)

【2.1】 declaração if

【2.1.1】Estrutura gramatical

【2.1.2】Deixe em branco, else

【2.1.3】Comparação de formas de escrita

【2.1.4】Prática

【2.2】 instrução de troca

【3.2.1】Estrutura gramatical

【3.2.2】interrupção na instrução switch

【3.2.3】cláusula padrão

【3.2.4】Prática

【3】Declaração de loop

【3.1】 loop while

【3.1.1】Formato gramatical

【3.1.2】instrução while

【3.1.3】continue na instrução while

【3.1.4】Prática

【3.2】para loop

【3.2.1】Formato gramatical

【3.2.2】instrução while

【3.2.3】continue na instrução while

【3.2.4】Variáveis ​​de controle de loop da instrução for

【3.2.5】Algumas variações do loop for

【3.3】fazer loop while

【3.3.1】Formato gramatical

【3.3.2】quebrar a instrução do while

【3.3.3】continue na instrução do while

【3.4】Exercícios abrangentes

【4】Meio algoritmo de busca

【5】 declaração ir para


【1】O que é uma declaração?

As instruções C podem ser divididas nas cinco categorias a seguir:

  • declaração de expressão

  • instrução de chamada de função

  • declaração de controle

  • declaração composta

  • declaração vazia

Este artigo é sobre instruções de controle.

        As instruções de controle são usadas para controlar o fluxo de execução do programa para implementar vários métodos estruturais do programa. Elas são compostas por definidores de instruções específicas. Existem nove tipos de instruções de controle na linguagem C.

Pode ser dividido nas três categorias a seguir:

  • As declarações de julgamento condicional também são chamadas de instruções de ramificação: instruções if e instruções switch.

  • Instruções de execução de loop: instrução do while, instrução while, instrução for.

  • Instruções Turn: instrução break, instrução goto, instrução continue, instrução return.

【2】Instrução da filial (estrutura de seleção)

        Se você estudar muito, consiga uma boa oferta durante o recrutamento escolar e alcance o topo da sua vida. Se não estudar, a formatura significa desemprego e venda de batata doce em casa. Esta é a escolha!

【2.1】 declaração if

【2.1.1】Estrutura gramatical

Qual é a estrutura gramatical da instrução if?

// 语法结构:No.1
if(表达式)
	语句;
// 语法结构:No.2
if(表达式)
	语句1;
else
	语句2;

// 语法结构:No.3 多分支
if(表达式1)
语句1;
else if(表达式2)
	语句2;
else
	语句3;

【Código de exemplo】

// No.1 代码
#include <stdio.h>

int main() {
	int age = 0;
	scanf("%d", &age);
	if (age < 18)
		printf("未成年!\n");

	return 0;
}
// No.2 代码
#include <stdio.h>

int main(int argc, char** argv) {
	int age = 0;
	scanf("%d", &age);

	if (age < 18)
		printf("未成年!\n");
	else {
		printf("成年!\n");
	}
		
	return 0;
}
// No.3 代码
#include <stdio.h>

int main(int argc, char** argv) {
	int age = 0;
	scanf("%d", &age);


	if (age < 18) {
		printf("少年\n");
	}  
	else if (age >= 18 && age < 30) {
		printf("青年\n");
	}  
	else if (age >= 30 && age < 50) {
		printf("中年\n");
	}  
	else if (age >= 50 && age < 80) {
		printf("老年\n");
	}  
	else {
		printf("老寿星\n");
	}

	return 0;
}

Explique: Se o resultado da expressão for verdadeiro, a instrução é executada. Na linguagem C, 0 significa falso e diferente de 0 significa verdadeiro .

Como devemos usar blocos de código se várias instruções devem ser executadas se a condição for verdadeira.

#include <stdio.h>
int main()
{
	if (表达式)
	{
		语句列表1;
	}
	else
	{
		语句列表2;
	}
	return 0;
}

O par de {} aqui é um bloco de código.

【2.1.2】Deixe em branco, else

Quando você escreve este código:

#include <stdio.h>
int main()
{
	int a = 0;
	int b = 2;
	if (a == 1)
		if (b == 2)
			printf("hehe\n");
		else
			printf("haha\n");
	return 0;
}

Após a modificação: correspondência de else: else corresponde ao if mais próximo.

//适当的使用{}可以使代码的逻辑更加清楚。
//代码风格很重要
#include <stdio.h>
int main()
{
	int a = 0;
	int b = 2;
	if (a == 1)
	{
		if (b == 2)
		{
			printf("hehe\n");
		}
	}
	else
	{
		printf("haha\n");
	}
	return 0;
}

【2.1.3】Comparação de formas de escrita

Entre os seguintes códigos: o Código 2 e o Código 4 são melhores, com lógica mais clara e menos sujeitos a erros.

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

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

【2.1.4】Prática

[Código de exercício] Determine se um número é ímpar.

#include <stdio.h>

// 判断一个数是否为奇数 
int main(int argc, char** argv) {
	int val = 0;
	scanf("%d", &val);

	if (val % 2 == 0)
		printf("偶数!\n");
	else
		printf("奇数!\n");
}

[Código de exercício] Produza números ímpares entre 1-100

#include <stdio.h>

int main(int argc, char** argv) {
	int num = 1;

	while (num <= 100) {
		if(num % 2 == 0)
			printf("%d->偶数!\n", num);
		else
			printf("%d->奇数!\n", num);
		num++;
	}
	return 0;
}

【2.2】 instrução de troca

【3.2.1】Estrutura gramatical

A instrução switch também é uma instrução de ramificação e é frequentemente usada em situações com várias ramificações.

【por exemplo】

  • Entrada 1, saída segunda-feira

  • Entrada 2, saída terça-feira

  • Entrada 3, saída quarta-feira

  • Entrada 4, saída quinta-feira

  • Digite 5 e saia sexta-feira

  • Digite 6 e saia sábado

  • Digite 7 e saia domingo

Então eu não escrevi como se...else if...else if. A forma é muito complicada, então temos que ter uma forma gramatical diferente.

Esta é a instrução switch.

switch(整型表达式)
{
	语句项(是一些case语句);
}

case 整形常量表达式:
	语句;

【3.2.2】interrupção na instrução switch

Na instrução switch, não podemos implementar diretamente o branch, somente usando break podemos alcançar o branch real.

【Exemplo de código】

int main(int argc, char** argv) {
	int day = 1;

	switch (day) {
		case 1:
			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;
	}
	return 0;
}

Às vezes, nossas necessidades mudam:

  • Entrada 1-5, a saída é "dia da semana";

  • Digite 6-7 e digite "fim de semana";

Portanto, nosso código deve ser implementado assim:

#include <stdio.h>

int main(int argc, char** argv) {
	int day = 0;

	switch (day)
	{
		case 1:
		case 2:
		case 3:
		case 4:
		case 5:
			printf("weekday\n");
			break;
		case 6:
		case 7:
			printf("weekend\n");
			break;
	}
	
	return 0;
}

        O efeito real da instrução break  é dividir a lista de instruções em diferentes partes de ramificação.

[Bons hábitos de programação]

        Adicione uma instrução break após a última instrução case (o motivo para escrever isso é evitar esquecer de adicionar uma instrução break após a última instrução case).

【3.2.3】cláusula padrão

        E se o valor da expressão não corresponder ao valor de nenhuma tag case? Na verdade, não é nada, a estrutura é apenas que todas as instruções são ignoradas. O programa não será encerrado e nenhum erro será relatado, pois esta situação não é considerada um erro em C. Mas e se você não quiser ignorar valores de expressões que não correspondem a todas as tags? Você pode adicionar uma cláusula padrão à lista de instruções e colocar o seguinte rótulodefault:

        Escreva em qualquer lugar onde um rótulo de caso possa aparecer. Quando o valor da expressão switch não corresponder aos valores de todos os rótulos de caso, a instrução após a cláusula padrão será executada. Portanto, apenas uma cláusula padrão pode aparecer em cada instrução switch. Mas ela pode aparecer em qualquer lugar da lista de instruções, e o fluxo de instruções executará a cláusula padrão como um rótulo de caso.

[Bons hábitos de programação]

        É um bom hábito colocar uma cláusula padrão em cada instrução switch, talvez até mesmo um break no final.

#include <stdio.h>

int main(int argc, char** argv) {
	int day = 0;

	switch (day)
	{
		case 1:
		case 2:
		case 3:
		case 4:
		case 5:
			printf("weekday\n");
			break;
		case 6:
		case 7:
			printf("weekend\n");
			break;
		default:
			printf("day的值不在1-7范围内!");
	}
	
	return 0;
}

【3.2.4】Prática

#include <stdio.h>
int main()
{
	int n = 1;				
	int m = 2;					// n=1, m=2
	switch (n)
	{
	case 1:
		m++;					// n=1, m=3			
	case 2:
		n++;					// n=2, m=3		
	case 3:
		switch (n)				// n=2, m=3		
		{//switch允许嵌套使用
		case 1:
			n++;
		case 2:
			m++;				
			n++;				// n=3, m=4		
			break;
		}
	case 4:
		m++;					// n=3, m=5		
		break;
	default:
		break;
	}
    
	printf("m = %d, n = %d\n", m, n);		// 打印结果m=5, n=3
	return 0;
}

【3】Declaração de loop

【3.1】 loop while

【3.1.1】Formato gramatical

        A linguagem C nos apresenta: a instrução while, que pode implementar loops.

while(表达式)
	循环语句;

O fluxo de execução da instrução while:

[Exemplo de código] Imprima os números de 1 a 10 na tela.

#include <stdio.h>

int main(int argc, char** argv) {
	int iVal = 0;

	while (iVal < 10) {
		printf("%d ", iVal + 1);
		iVal++;
	}

	return 0;
}

// 打印结果:1 2 3 4 5 6 7 8 9 10

O código acima me ajudou a entender a sintaxe básica da instrução while, então vamos aprender mais sobre ela:

【3.1.2】instrução while

#include <stdio.h>

int main(int argc, char** argv) {
	int iVal = 0;

	while (iVal < 10) {
		if (iVal == 5) {
			break;
		}

		printf("%d ", iVal + 1);
		iVal = iVal + 1;
	}
}

// 打印结果:1 2 3 4 5  (后面就结束了)

[Resumo] O papel do break no loop while : Na verdade, enquanto o break for encontrado no loop, todos os loops subsequentes serão interrompidos e o loop será encerrado diretamente. Portanto: break in while é usado para encerrar o loop permanentemente .

【3.1.3】continue na instrução while

#include <stdio.h>

int main(int argc, char** argv) {
	int iVal = 0;

	while (iVal < 10) {
		if (iVal == 5) {
			continue;
		}

		printf("%d ", iVal + 1);
		iVal = iVal + 1;
	}
}

// 打印结果:1 2 3 4 5 (后面就死循环了)

[Resumo] A função de continue no loop while é : continue é usado para encerrar este loop, ou seja, o código após continue neste loop não será executado novamente, mas irá diretamente para a parte de julgamento da instrução while. Faça o julgamento de entrada para o próximo ciclo .

【3.1.4】Prática

[Introdução da função]

int getchar ( void );
/*
	描述:
		从stdin中获取字符
	返回值:
		如果成功,则返回所读取的字符(提升为int值)。
		返回类型为int,以适应特殊值EOF(-1),它表示失败。
		如果标准输入位于文件末尾,则该函数返回EOF并设置stdin的EOF(-1)指示器(feof)。
*/	
	
int putchar ( int character );
/*
	描述:
		将字符写入标准输出,将字符写入标准输出(stdout)。
	参数:
		要读取的字符变量。
	返回值:
		如果发生写错误,则返回EOF并设置错误指示器(error)。
*/
//代码1
#include <stdio.h>
int main()
{
	int ch = 0;
	while ((ch = getchar()) != EOF)
		putchar(ch);
	return 0;
}
// 这里的代码适当的修改是可以用来清理缓冲区的。

//代码2
#include <stdio.h>
int main()
{
	char ch = '\0';
	while ((ch = getchar()) != EOF)
	{
		if (ch < ‘0’ || ch > ‘9’)
			continue;
		putchar(ch);
	}
	return 0;
}
//这个代码的作用是:只打印数字字符,跳过其他字符的。

【3.2】para loop

Já conhecemos o loop while, mas por que precisamos de um loop for?

【3.2.1】Formato gramatical

for(表达式1; 表达式2; 表达式3)
	循环语句;

/*
解释:
	表达式1:表达式1为初始化部分,用于初始化循环变量的。
	表达式2:表达式2为条件判断部分,用于判断循环时候终止。
	表达式3:表达式3为调整部分,用于循环条件的调整。
*/

O processo de execução da instrução for:

[Código de exemplo] Use um loop for para imprimir os números de 1 a 10 na tela.

int main(int argc, char** argv) {
	for (int i = 0; i < 10; i++) {
		printf("%d ", i + 1);
	}
}

Agora vamos comparar o loop for e o loop while:

#include <stdio.h>

int main(int argc, char** argv) {
	int i = 0;

	//实现相同的功能,使用while
	i = 1;//初始化部分
	while (i <= 10)//判断部分
	{
		printf("hehe\n");
		i = i + 1;//调整部分
	}
	//实现相同的功能,使用while
	for (i = 1; i <= 10; i++)
	{
		printf("hehe\n");
	}
}

        Pode-se descobrir que ainda existem três condições necessárias para o loop no loop while, mas devido a questões de estilo, as três partes provavelmente se desviarão muito, por isso não é centralizado e conveniente o suficiente para encontrar modificações. Portanto, o estilo do loop for é superior; o loop for também é usado com mais frequência.

【3.2.2】instrução while

        Descobrimos que break e continue também podem aparecer no loop for, e seu significado é o mesmo do loop while.

//代码1
#include <stdio.h>
int main()
{
	int i = 0;
	for (i = 1; i <= 10; i++)
	{
		if (i == 5)
			break;
		printf("%d ", i);
	}
	return 0;
}

【3.2.3】continue na instrução while

        Descobrimos que break e continue também podem aparecer no loop for, e seu significado é o mesmo do loop while.

//代码2
#include <stdio.h>
int main()
{
	int i = 0;
	for (i = 1; i <= 10; i++)
	{
		if (i == 5)
			continue;
		printf("%d ", i);
	}
	return 0;
}

【3.2.4】Variáveis ​​de controle de loop da instrução for

【Sugestões】 :

  • Variáveis ​​de loop não podem ser modificadas dentro do corpo do loop for para evitar que o loop for perca o controle.

  • Recomenda-se que o valor da variável de controle de loop da instrução for seja escrito no formato "front closed and then open range".

int i = 0;
//前闭后开的写法
for(i=0; i<10; i++)
{}
//两边都是闭区间
for(i=0; i<=9; i++)
{}

【3.2.5】Algumas variações do loop for

#include <stdio.h>

int main()
{
	//代码1
	for (;;)
	{
		printf("hehe\n");
	}
	//for循环中的初始化部分,判断部分,调整部分是可以省略的,但是不建议初学时省略,容易导致问题。
	
	//代码2
	int i = 0;
	int j = 0;
	//这里打印多少个hehe?
	for (i = 0; i < 10; i++)
	{
		for (j = 0; j < 10; j++)
		{
			printf("hehe\n");
		}
	}

	//代码3
	int i = 0;
	int j = 0;
	//如果省略掉初始化部分,这里打印多少个hehe?
	for (; i < 10; i++)
	{
		for (; j < 10; j++)
		{
			printf("hehe\n");
		}
	}

	//代码4-使用多余一个变量控制循环
	int x, y;
	for (x = 0, y = 0; x < 2 && y < 5; ++x, y++)
	{
		printf("hehe\n");
	}
	return 0;
}

【3.3】fazer loop while

【3.3.1】Formato gramatical

do
	循环语句;
while(表达式);

O fluxo de execução da instrução do while:

【Exemplo de código】

#include <stdio.h>

int main(int argc, char** argv) {
	int i = 10;
	do {
	
		printf("%d\n", i);
	
	} while (i < 10);

	return 0;
}

【3.3.2】quebrar a instrução do while

#include <stdio.h>

int main()
{
	int i = 10;
	do
	{
		if (5 == i)
			break;
		printf("%d\n", i);
	} while (i < 10);
	return 0;
}

【3.3.3】continue na instrução do while

#include <stdio.h>

int main()
{
	int i = 10;
	do
	{
		if (5 == i)
			continue;
		printf("%d\n", i);
	} while (i < 10);
	return 0;
}

【3.4】Exercícios abrangentes

[Exercício 1] Calcule o fatorial de n.

#include <stdio.h>

int main(int argc, char** argv) {
	// 接收要计算的乘积.
	int n = 0;
	scanf("%d", &n);

	// 计算
	int result = 1;
	for (int i = 1; i <= n; i++) {
		result *= i;
	}
	// 打印
	printf("%d\n", result);

	return 0;
}

【Exercício 2】Calcule 1!+2!+3!+……+10!

int main(int argc, char** argv) {
	// 接收要计算的乘积.
	int n = 0;
	scanf("%d", &n);

	int result = 0;
	int ret = 1;
	for (int i = 1; i <= n; i++) {
		ret = ret * i;

		result = result + ret;
	}
	// 打印
	printf("%d\n", result);
}

[Exercício 3] Encontre um número específico n em uma matriz ordenada.

#include <stdio.h>

int main(int argc, char** argv) {
	int buffer[] = { 1,2,3,4,5,6,7,8,9,10 };
	int size = sizeof(buffer) / sizeof(int);

	// 要查找的值
	int k = 4;
	// 暴力循环查找
	int i = 0;
	for (i = 0; i < size; i++) {
		if (k == buffer[i]) {
			printf("找到了->要找的值为%d\n", i);
			break;
		}
	}

	// 没有找到的话,说明遍历的一圈。
	if (i == size) {
		printf("没有找到\n");
	}

	return 0;
}

[Exercício 4] Escreva um código para demonstrar que vários caracteres se movem de ambas as extremidades e convergem para o meio.

#include <stdio.h>
#include <windows.h>

int main(int argc, char** argv) {
	char arr1[] = "welcome to lesson!!!!";
	char arr2[] = "#####################";

	int leftSub = 0;
	int rightSub = sizeof(arr1) / sizeof(arr1[0]) - 1;

	printf("%s\n", arr2);
	Sleep(1000);
	while (leftSub <= rightSub) {
		arr2[leftSub] = arr1[leftSub];
		arr2[rightSub] = arr1[rightSub];
		printf("%s\n", arr2);

		Sleep(1000);	// Sleep() 系统休眠, 头文件包含<windows.h>
		leftSub++;
		rightSub--;
	}
	return 0;
}

[Exercício 5] Escreva o código para simular o cenário de login do usuário e só pode efetuar login três vezes. (Você só pode inserir a senha três vezes. Se a senha estiver correta, você será solicitado a fazer login. Se inserir a senha errada três vezes, você sairá do programa.

#include <stdio.h>
#include <string.h>

int main(int argc, char** argv) {
	char user[] = "shaxiang";
	char password[20] = { 0 };

	int i = 0;
	for (i = 0; i < 3; i++) {
		printf("请输入密码:> ");
		scanf("%s", password);

		if (strcmp(password, "shaxiang") == 0) {
			printf("登陆成功!\n");
			break;
		}
		else
		{
			printf("密码错误!\n");
		}
	}

	if (i >= 3) {
		printf("密码错误3次,没有机会了!\n");
	}

	return 0;
}

[Exercício 6] Implementação do jogo de adivinhação de números

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

void Menu() {
	printf("********************************\n");
	printf("*********    1、play    ********\n");
	printf("*********    0、exit    ********\n");
	printf("********************************\n");
}

void Game() {
	// 用户输入猜到的数字
	int num = rand() % 100 + 1;
	printf("随机数生成成功:请输入猜想的数组:> \n");
	
	int in = 0;
	while (1) {
		scanf("%d", &in);

		if (in > num) {
			printf("猜大了!\n");
		}
		else if (in < num) {
			printf("猜小了!\n");
		}
		else
		{
			printf("恭喜你猜对了!\n");
			break;
		}
	}
}

int main(int argc, char** argv) {
	int in = 0;

	do {
		Menu();
		printf("是否继续猜数字>: ");
		scanf("%d", &in);
		switch (in) {
		case 1:
			// 生成随机数种子
			srand((unsigned int)time(NULL));
			Game();
			break;
		case 0:
			printf("已退出!\n");
			break;
		default:
			printf("错误选择,请重新选择!\n");
		}
	} while (in);
}

【4】Meio algoritmo de busca

[Imagem]

#include <stdio.h>

int main(int argc, char** argv) {
	int buffer[] = { 1,2,3,4,5,6,7,8,9,10 };
	// 要查找的值
	int findK = 4;
	
	// 二分查找
	int leftSub = 0;
	int rightSub = sizeof(buffer) / sizeof(int) - 1;
	
	while (leftSub <= rightSub) {
		int mid = (leftSub + rightSub) / 2;
		if (findK < buffer[mid]) {
			rightSub = mid - 1;
		}
		else if (findK > buffer[mid]) {
			leftSub = mid + 1;
		}
		else
		{
			printf("找到了->[%d]下标为[%d]\n", findK, mid);
			break;
		}
	}

	if (leftSub > rightSub) {
		printf("未找到[%d]的下标!", findK);
	}

	return 0;
}

【5】 declaração ir para

        A linguagem C fornece instruções goto que podem ser abusadas à vontade e rótulos para marcar saltos. Teoricamente, instruções goto não são necessárias. Na prática, é fácil escrever código sem instruções goto. No entanto, em alguns casos, instruções goto ainda são necessárias. O uso mais comum é encerrar o processamento de algumas estruturas profundamente aninhadas.

Por exemplo: saltar de duas ou mais camadas de loops ao mesmo tempo. Usar break neste caso de loops multicamadas não atingirá o objetivo. Só pode sair do loop mais interno para o loop do nível anterior.

Os cenários para os quais a linguagem goto é realmente adequada são os seguintes:

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

A seguir está um exemplo de uso de uma instrução goto e, em seguida, substituição da instrução goto por uma implementação de loop:

#include <stdio.h>
#include <windows.h>
int main()
{
	system("shutdown -s -t 60");
	char input[10] = { 0 };
	
again:
	printf("电脑将在1分钟内关机,如果输入:我是猪,就取消关机!\n请输入:>");
	scanf("%s", input);

	if (0 == strcmp(input, "我是猪")) {
		system("shutdown -a");
	}
	else {
		goto again;
	}

	return 0;
}

E se as instruções goto não forem aplicáveis, você poderá usar loops:

#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
int main_24()
{
	char input[10] = { 0 };
	system("shutdown -s -t 60");
	while (1)
	{
		printf("电脑将在1分钟内关机,如果输入:我是猪,就取消关机!\n请输入:>");
		scanf("%s", input);
		if (0 == strcmp(input, "我是猪"))
		{
			system("shutdown -a");
			break;
		}
	}
	return 0;
}

Enciclopédia shutdown_Baidu (baidu.com)

Acho que você gosta

Origin blog.csdn.net/lx473774000/article/details/131524663
Recomendado
Clasificación