Notas da linguagem C: instrução de loop

contente

1. while loop

1.1 Sintaxe

1.2 break e continue na declaração while

1.2.1 O papel do break no loop while:

1.2.2 O papel de continue no loop while:

2. para loop

2.1 Sintaxe

2.1 quebrar e continuar no loop for

2.2 A variável de controle de loop da instrução for

2.3 Algumas variantes de loops for

3. faça... while loop

3.1 Sintaxe

3.2 Recursos da instrução do

3.3 quebrar e continuar no loop do while

Suplemento: Como usar a instrução goto

Perguntas do exercício:

Exercício 1: Calcule o fatorial de n

Exercício 2: Calcule 1!+2!+3!+...+10!

Exercício 3: Encontre um número específico n em uma matriz ordenada. (pesquisa binária)

Exercício 4*: Escreva um código que demonstre vários caracteres movendo-se das extremidades para convergir para o meio.

Exercício 5: Escreva o código para simular o cenário de login do usuário, podendo efetuar login apenas três vezes. (Apenas três senhas podem ser inseridas. Se a senha estiver correta, ele avisará que o login foi bem-sucedido. Se a senha for digitada incorretamente três vezes, o programa será encerrado.

Exercício 6***: Jogo de adivinhação de números - 1. O computador gera aleatoriamente um número 2. O jogador adivinha o número (o valor de retorno só pode ser um palpite grande, um palpite pequeno e um palpite correto) até que o palpite esteja correto


1. while loop

1.1 Sintaxe

instrução de loop while(expressão);

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

1.2 break e continue na declaração while

1.2.1 O papel do break no loop while:

Desde que seja encontrado break no loop, todos os loops subsequentes são interrompidos e o loop é encerrado diretamente.

O break in while é usado para encerrar permanentemente o loop.

#include <stdio.h>
int main()
{
     int i = 1;
     while(i<=10)
     {
         if(i == 5)
             break;
         printf("%d ", i);
         i = i+1;
     }
     return 0;  //1 2 3 4 当i == 5时循环结束
}

1.2.2 O papel 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, mas pulará diretamente para a parte de julgamento da instrução while. O julgamento de entrada do próximo ciclo é realizado .

Tal como:

#include <stdio.h>
int main()
{
     int i = 1;
     while(i<=10)
     {
         if(i == 5)
             continue;
         printf("%d ", i);
         i = i+1;
     }
     return 0;  //1 2 3 4 但陷入死循环,因为i始终等于5
}

Exercício 1:

//代码什么意思?
//代码1
#include <stdio.h>
int main()
{
    int ch = 0;        //此处用的int需要重视下方的解释
    while ((ch = getchar()) != EOF)  
        putchar(ch);
    return 0;
}//输入字符则打印字符,直到键盘输入 Ctrl Z 结束循环

Notas: getchar( ): Obtém um caractere (valor de código ASCII correspondente) do teclado, int getchar(void);

           Nota: O caractere obtido por getchar é na verdade o valor do código ASCII obtido , e EOF é essencialmente -1, onde ch pode ser igual a EOF (-1), e o tipo char não pode armazenar -1, então é definido aqui com int CH

           putchar(): imprime um caractere na tela

           EOF - fim do arquivo: o sinal do final do arquivo (Nota: o código acima não é para digitar "EOF" para encerrar o loop, mas para digitar Ctrl Z )

*Exercício 2 (atenção principal): Analise por que o código a seguir não funciona conforme o esperado e aprenda como limpar o buffer

#include <stdio.h>
int main()
{
    int ch = 0;
	char password[20] = {0};

	printf("请输入密码:>");
	scanf("%s", password);

	printf("请确认(Y/N):>");
	ch = getchar();

	if('Y' == ch)
	{
		printf("确认成功\n");
	}
	else
	{
		printf("放弃确认\n");
	}

	return 0;
}

Os resultados são os seguintes:

Análise : A função scanf e a função getchar são ambas funções para obter dados do teclado (não diretamente), de fato, existe um buffer de entrada entre a função e o teclado . Quando o programa executa esta função, a função verificará se há dados no buffer de entrada. Se houver, eles serão retirados diretamente . Caso contrário, os dados de entrada do teclado serão necessários para entrar no buffer de entrada, e a função vai tirar os dados.

Quando o usuário digita 123+Enter (\n) no teclado, "123\n" entra no buffer de entrada, quando a função scanf pega os dados, apenas "123" é retirado e '\ n' permanece na entrada área de buffer , quando o programa executa para ch == getchar(), getchar não esperará pela entrada do usuário, mas receberá diretamente "\n" no buffer , por causa de '\n'! ='Y', então o resultado acima é causado.

Como modificar o código?

Método preliminar: Antes do programa executar para ch == getchar(), use um getchar para remover o '\n' no buffer de entrada

#include <stdio.h>
int main()
{
    int ch = 0;
	char password[20] = {0};

	printf("请输入密码:>");
	scanf("%s", password);
    //处理\n
    getchar();

	printf("请确认(Y/N):>");
	ch = getchar();

	if('Y' == ch)
	{
		printf("确认成功\n");
	}
	else
	{
		printf("放弃确认\n");
	}

	return 0;
}

Mas a situação real pode ser muito mais complicada do que o exemplo acima, por exemplo, ao inserir "123456 abcdef", ocorrerá um erro.

O motivo do erro é: quando o scanf lê a string para o espaço, ele pensa que acabou, apenas 123456 é retirado e o "abcdef" restante ainda está no buffer, como lidar com isso?

A resposta é a seguinte:

#include <stdio.h>
int main()
{
    int ch = 0;
	char password[20] = {0};

	printf("请输入密码:>");
	scanf("%s", password);

    //处理缓冲区多余的字符
    while(getchar() != '\n')
    {
        ;                     //当getchar()没有读取到'\n'时,该循环会让getchar()不停的读取
    }
	printf("请确认(Y/N):>");
	ch = getchar();

	if('Y' == ch)
	{
		printf("确认成功\n");
	}
	else
	{
		printf("放弃确认\n");
	}

	return 0;
}

*Exercício 3:

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

2. para loop

2.1 Sintaxe

for(expressão1; expressão2; expressão3) instrução de loop;

Expressão 1 Expressão 1 é a parte de inicialização, que é usada para inicializar a variável de loop.

Expressão 2 A expressão 2 é a parte de julgamento condicional, que é usada para julgar o término do loop.

Expressão 3 A Expressão 3 é uma parte de ajuste para ajuste das condições do loop.

Agora vamos comparar o loop for e o loop while:

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

//实现相同的功能,使用for
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 ao problema de estilo, é provável que as três partes se desviem para longe, de modo que a pesquisa e a modificação não sejam concentradas e convenientes o suficiente.

Portanto, o estilo do loop for é melhor, e a frequência do loop for também é a mais alta .

2.1 quebrar e continuar no loop for

Break e continue também podem aparecer em loops for, e seus significados são os mesmos dos loops while.

Mas ainda há algumas diferenças:

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

2.2 A variável de controle de loop da instrução for

Bons hábitos de programação :

1. A variável de loop não pode ser modificada no corpo do loop for para evitar que o loop for perca o controle.

2. Recomenda-se que o valor da variável de controle de loop da instrução for seja escrito no método de escrita "front closed and then open interval ".

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

2.3 Algumas variantes de loops for

#include <stdio.h>
int main()
{
     //代码1
     for(;;)
     {
         printf("hehe\n");
     }
    //for循环中的初始化部分,判断部分,调整部分是可以省略的,但是不建议初学时省略,容易导致问
题
    
    //代码2
    int i = 0;
    int j = 0;
    //这里打印多少个hehe?                             //100
    for(i=0; i<10; i++)
   {
        for(j=0; j<10; j++)
       {
           printf("hehe\n");
       }
   }
    
    //代码3
    int i = 0;
    int j = 0;
    //如果省略掉初始化部分,这里打印多少个hehe?         //10
    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;
}

 Questões de entrevista:

//请问循环要循环多少次?  0次
#include <stdio.h>
int main()
{
 int i = 0;
 int k = 0;
 for(i =0,k=0; k=0; i++,k++)
        k++;
 return 0;
}

Quando a declaração de julgamento é k = 0, 0 é atribuído a k, o resultado da expressão é 0 e 0 é falso, então o loop não é executado

3. faça... while loop

3.1 Sintaxe

Faz

        instrução de loop;

enquanto(expressão);

3.2 Recursos da instrução do

O loop é executado pelo menos uma vez e os cenários de uso são limitados, portanto, não é usado com muita frequência.

3.3 quebrar e continuar no loop do while

#include <stdio.h>
int main()
{
     int i = 1;
    
     do
     {
            if(5 == i)
                break;
            printf("%d\n", i);
            i++;
     }while(i <= 10);
    
     return 0;
}                                   // 1 2 3 4 程序结束
#include <stdio.h>
int main()
{
     int i = 1;
    
     do
     {
            if(5 == i)
                continue;
            printf("%d\n", i);
            i++;
     }while(i <= 10);
    
     return 0;                     // 1 2 3 4 程序未结束,陷入死循环
}

Suplemento: Como usar a instrução goto

A linguagem C fornece instruções goto e rótulos que marcam saltos que podem ser abusados ​​à vontade.

Teoricamente, a instrução goto é desnecessária. Na prática, é fácil escrever código sem a instrução goto.

A instrução goto é fácil de confundir a lógica do código

Mas em alguns casos a instrução goto ainda é útil, o uso mais comum é encerrar o processamento do programa em algumas estruturas profundamente aninhadas.

Por exemplo: salte de duas ou mais camadas de loops de cada vez.

O uso de break neste caso de loop multicamada não atingirá o objetivo. Ele só pode sair do loop mais interno para o loop anterior.

Os cenários em que a instrução goto é realmente adequada são os seguintes:

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

Como: um procedimento de desligamento

Com a declaração goto:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main()
{
    char input[10] = {0};
    system("shutdown -s -t 60");
again:
    printf("电脑将在1分钟内关机,如果输入:我是猪,就取消关机!\n请输入:>");
    scanf("%s", input);
    if(0 == strcmp(input, "我是猪"))
   {
        system("shutdown -a");
   }
    else
   {
        goto again;
   }
    return 0;
}
//shutdown -a 取消关机
//shutdown -s -t 时间(秒) 设置关机倒计时
//system需要<stdlib.h>,strcmp需要头文件<string.h>

Sem a instrução goto:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main()
{
    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;
}

Perguntas do exercício:

Exercício 1: Calcule o fatorial de n

#include <stdio.h>
int main()
{
     int n = 0;
	 int i = 1;
	 int ret = 1;
	 
	 scanf("%d", &n);
	 
	 for (i = 1;i <= n; i++)
	 {
		 ret *= i;
	 }
	 printf("%d\n", ret); 
}

Exercício 2: Calcule 1!+2!+3!+...+10!

Código um:

#include <stdio.h>
int main()
{
     int j = 1;
	 int i = 1;
	 int ret = 1;
	 int sum = 0;
	 
	 for (j = 1;j <= 10; j++)
	 {
        ret = 1;    //最关键的一步,每次内层循环结束让ret回到初始值1
		for (i = 1;i <= j; i++)
		{
			 ret *= i;
		}
		sum += ret;
	 }

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

*Código otimizado :

#include <stdio.h>
int main()
{
     int j = 1;
	 int ret = 1;
	 int sum = 0;
	 
	 for (j = 1;j <= 10; j++)
	 {
			 ret *= j;
		     sum += ret;
	 }

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

Exercício 3: Encontre um número específico n em uma matriz ordenada. (pesquisa binária)

//实现在主函数内:
int main()
{
 int arr[] = {1,2,3,4,5,6,7,8,9,10};
 int left = 0;
 int right = sizeof(arr)/sizeof(arr[0])-1;  //重点
 int key = 7;
 int mid = 0;
 while(left<=right)
 {
     mid = (left+right)/2;
     if(arr[mid]>key)
     {
         right = mid-1;
     }
     else if(arr[mid] < key)
     {
         left = mid+1;
     }
     else
         break;
 }
 if(left <= right)
     printf("找到了,下标是%d\n", mid);
 else
     printf("找不到\n");
}

Exercício 4*: Escreva um código que demonstre vários caracteres movendo-se das extremidades para convergir para o meio.

#include <stdio.h>
int main()
{
    char arr1[] = "welcome to bit!!!!!";
    char arr2[] = "###################";
    int left = 0;
    int right = strlen(arr1)-1;   //strlen()用于计算字符串长度
    
    while(left<=right)
    {   
        arr2[left] = arr1[left];
        arr2[right] = arr1[right];
        printf("%s\n", arr2);
        Sleep(1000);             //停顿1000ms
        system("cls");           //清空屏幕 需要头文件#include <windows.h>
        left++;
        right--;
    }
    printf("%s\n", arr2);
    return 0;
}

Exercício 5: Escreva o código para simular o cenário de login do usuário, podendo efetuar login apenas três vezes. (Apenas três senhas podem ser inseridas. Se a senha estiver correta, ele avisará que o login foi bem-sucedido. Se a senha for digitada incorretamente três vezes, o programa será encerrado.

#include <stdio.h>
#include <string.h>
int main()
{
	int i = 0;
	//假设正确密码是"123456"
	char password[20] = {0};
	for(i = 0; i < 3; i++)
	{
		printf("请输入密码:>");
		scanf("%s", password);
		//判断密码的正确性 - 比较2个字符串的大小关系
		//strcmp - 用于比较字符串的大小关系,库函数,所需要的头文件是:string.h
		if(strcmp(password,"123456")==0)
		{
			printf("密码正确\n");
			break;
		}
		else
		{
			printf("密码错误,请重新输入\n");
		}
	}
    if(3 == i)
    {
        printf("三次密码错误,退出程序\n");
    }
	return 0;
}

Nota : A função strcmp, abreviação de string compare, compara duas strings e retorna um inteiro com base no resultado da comparação. A forma básica é strcmp(str1, str2), se str1=str2, retorna zero; se str1str2, retorna um número positivo. Para funções de biblioteca, o arquivo de cabeçalho necessário é: string.h

Exercício 6***: Jogo de adivinhação de números - 1. O computador gera aleatoriamente um número 2. O jogador adivinha o número (o valor de retorno só pode ser um palpite grande, um palpite pequeno e um palpite correto) até que o palpite esteja correto

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

void game()
{
	//1.生成随机数 1-100之间的随机数 所以让rand()对100取模再+1

	//C语言中有一个生成随机数的函数 - rand() (但每一轮生成的随机数是相同的) 
	//需要头文件<stdlib.h>
	//调用rand()前,需要使用srand()设置一个随机的起点
	//()内为时刻发生变化的数字 - 电脑上的时间一直在变化 =》时间戳=》time函数
	//time 获取系统时间,需要头文件<time.h> 此处想使用向time函数中传入一个空指针即可

	int guess = 0;
	int ret = rand()%100+1;
	printf("%d\n", ret);
	    
	//2.猜数字
	while(1)
	{
		printf("请猜数字:>");
		scanf("%d",&guess);
		if (guess > ret)
		{
			printf("猜大了\n");
		}
		else if (guess < ret)
		{
			printf("猜小了\n");
		}
		else
		{
			printf("恭喜你,猜对了!\n");
			break;
		}
	}
}

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

int main()
{
	int input = 0;
	srand((unsigned int)time(NULL)); 
	do
	{
		//1.打印一个菜单
		menu();
		printf("请选择:>");
		scanf("%d", &input);
		switch (input)
		{
			case 1:
				//游戏的逻辑
				game(); //猜数字游戏的代码
				break;
			case 0:
				printf("退出游戏\n");
				break;
			default:
				printf("选择错误,重新选择!\n");
				break;
		}
	}while(input);
	return 0;
}

Notas: 1. Para executar o primeiro jogo, escolha do while loop

           2. A função de gerar números aleatórios - rand() requer o arquivo de cabeçalho <stdlib.h> int rand(void) mas os números aleatórios gerados em cada rodada são os mesmos, então antes de chamar rand(), você precisa usar srand () para definir um O ponto inicial aleatório srand() é também a função da biblioteca precisa do arquivo de cabeçalho <stdlib.h>  void srand(unsigned int seed)   Eu quero colocar o número que muda no momento entre parênteses - o tempo no computador fica mudando = "timestamp =" A função da função time() é obter a hora do sistema, o arquivo de cabeçalho <time.h> é necessário, e não vou entrar em detalhes. Aqui, quero passar um ponteiro nulo para a função de tempo.

           3. Coloque srand((unsigned int)time(NULL)); na função principal

           4. Para gerar um número aleatório entre 1-100, deixe que rand() pegue o módulo de 100 e depois +1
 

Acho que você gosta

Origin blog.csdn.net/m0_62934529/article/details/123158560
Recomendado
Clasificación