contente
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.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.3 quebrar e continuar no loop do while
Suplemento: Como usar a instrução goto
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)
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