Introdução
- 4904
- 1190
- Leroy Lebsack
Você já foi exposto a uma pequena parte do que é o controle de fluxo em nossa parte anterior, a saber, a seção sobre operadores relacionais. Ao começar a escrever programas mais complexos, você sentirá a necessidade de controlar o ordem em que seu programa executa várias partes.
O controle de fluxo está presente na maioria das linguagens de programação de uma forma ou de outra, e o que você está prestes a ler aqui é essencial para escrever programas C.
se/else/else se
Essa parte do controle de fluxo é provavelmente o mais intuitivo e mais simples, embora você possa cair facilmente para o lado sombrio e começar a escrever código ininteligível com IFS. A ideia é simples: se (condicional_is_true) do_something; else do_something_else; . Portanto, é tudo sobre lógica, lógica binária que é, na qual uma expressão pode ter dois valores: verdadeiro ou falso. Se você usou C ou Java, está usado com o BOOL Datatype. Uma variável bool pode ser verdadeira ou apenas falsa em um determinado momento. Mas C, embora não tenha o tipo de dados BOOL, facilita a lidar com a lógica binária, como você verá.
Digamos que você queira contar ao usuário do seu programa, se ele estiver velho ou não, dependendo da idade dele. Não é muito útil e possivelmente ofensivo, mas por uma questão de ilustrar nosso ponto, isso fará. Portanto, a idéia principal é: se a idade inserida estiver acima de um limiar, então dizemos ao usuário que ele é velho. Caso contrário, dizemos a ele/ela, ele/ela ainda é jovem e florescendo. O código para esse programa seria assim:
#include #Define limite 50 int main () int Age; printf ("Olá, digite sua idade!\ n "); scanf ("%d ", & idade); se(idade < LIMIT) printf("Your age is %d.\n", age); printf("Quite young, I say.\n"); outro se(idade == limite) printf ("Você diz que sua idade é %d.\ n ", idade); printf (" quase lá.\ n "); outro printf ("Então sua idade é %d, huh?\ n ", idade); printf (" Geezer.\ n "); retornar 0;
Este programa não é claramente sem uso prático, mas há elementos que nos ajudarão a expressar nosso ponto de vista e ilustrar alguns novos elementos. Por exemplo, você verá que definimos um constante Limite nomeado (é recomendável capitalizar suas constantes) com um valor de 50, que é o limiar que falamos acima. Em seguida, você notará que C não usa 'então' após a expressão IF como o Bourne Shell, por exemplo. Por fim, escrevemos este programa como este porque podemos ilustrar outro conceito importante: blocos. Um bloco é uma série de instruções que pertencem juntas, unidas por aparelhos. Lembre -se de que, se você usar mais, se puder omitir o final, dependendo da situação.
Então, nosso primeiro bloco diz: “Se a idade for menor que os 50 anos, imprimir 'sua idade é $ idade' e Imprima 'muito jovem, eu digo'. Quando você começa a ler o código de outras pessoas, você notará que os blocos são muito usados em C, e recomendamos que você os use sempre que precisar deles e, às vezes, mesmo quando não, para tornar seu código mais acessível para meros mortais. O que se entendeu por "mesmo quando você não"? Bem, C permite que você ninho se e as coisas podem ir para o sul com muita facilidade e criar bugs que serão difíceis de rastrear, ou seu código pode se tornar uma bagunça para ler por outras pessoas e até você, por isso, se você planeja realmente usar ses aninhados e Não posso viver sem eles, recomendamos que você abuse o uso de aparelhos para clareza. Existem muitas situações em que o lógico e o operador podem salvar você e tornar seu código mais legível. Considere o seguinte exemplo:
INT número = 3; se ((número> 2) && (número < 4)) printf ("number is three"); /* Isso poderia ter sido escrito assim:*/ INT número = 3; se (número> 2) se (número < 4) printf ("number is three");
Novamente, este é um exemplo simples, mas acho que você conseguiu o ponto. Use qualquer método necessário e lembre -se de que '&&' nem sempre é um substituto para o IFS aninhado, mas se você precisar de estruturas excessivamente complicadas, provavelmente precisará repensar a lógica do seu programa.
enquanto e para
Com esta seção do nosso artigo, apresentamos outro conceito essencial de programação C: Loops. Um loop permite repetir uma certa instrução ou bloco, dependendo de uma condição, ou seja, execute algo até que alguma condição mude seu valor de verdade de verdadeiro para falso. Como você pode ver, esse conceito está relacionado a instruções condicionais e elas podem ser usadas juntas, se necessário.
enquanto
O conceito teórico de whin é 'while (expressão_is_true) execute_something;' . A cada iteração, a expressão em reavaliada e, se ainda for verdade, as instruções são/são executadas novamente, até que a expressão contra a qual testem se torne falsa. A partir daqui, podemos inferir que, se queremos escrever um loop infinito usando enquanto podemos escrever
enquanto(1) do_stuff (); do_more_stuff ();
Como dissemos, C não tem uma palavra-chave BOOL, mas você pode fazer algo para superar isso: você pode compilar seus programas para aderir à edição C99 do padrão (-std = c99 como um sinalizador do GCC), que permitirá você acessa o tipo de dados _bool, você pode usar o STDBOOL.h que define 1 como verdadeiro e 0 como falso ou você pode definir verdadeiro e falso com instruções de pré -processador. Que método você acha que funcionaria melhor e por quê? Como você reescreveria o trenó de código acima, considerando o que foi dito acima?
Enfim, vamos continuar com um exemplo completo e funcionando. Digamos que queremos produzir alguma mensagem na tela 5 vezes. Falaremos sobre o mesmo exemplo mais tarde usando, mas por enquanto vamos ver como fazer isso enquanto.
#include int main () int i; i = 5; enquanto(eu != 0) printf ("Olá!\ n "); i--; retornar 0;
Então, enquanto executa as instruções entre seus aparelhos até 'eu != 0 'Avalia como falsa, é quando eu igual a zero, então ele para. Para que este loop funcione, precisamos diminuir i a cada passe, até que atinja zero.
Exercício
Agora, considerando o seguinte projeto de controle de fluxo à sua direita, modifique o código acima para se conformar. Você acha esses designs úteis?
[DICA]: Leia até o final do artigo, você pode encontrar algumas dicas úteis lá.
para
Um loop escrito com for é mais compacto e organizado, mas faz a mesma coisa de um loop de tempo: avaliar uma expressão e executar algo se a expressão for verdadeira. Isso significa que há situações em que as instruções podem não ser executadas, se a condição for falsa desde o início. Você verá por um capricho por que isso é importante. Usar para Vs, enquanto é uma questão de situação, hábito e preferência pessoal, então não há realmente nada que um possa fazer e o outro não.
A para loop tem três partes: inicialização, loop, incremento/decréscimo. É importante saber que qualquer parte dos três pode ser omitida, mas os semicolons, como você verá, devem permanecer. Então, um loop infinito com para para ficar assim:
para(;;) faça alguma coisa(); do_something_else ();
Agora, desde que você já tenha declarado como um número inteiro, mas não definido, como você escreveria o código que produz “Olá!”Cinco vezes usando um loop para loop? É muito fácil quando você olha com cuidado, então tente evitar o Google ou outras fontes de inspiração. A sensação que você terá quando terá resolvido isso por si mesmo é quase nada.
interruptor/caixa
Se você deseja usar um programa interativo e percebe que, em um ponto, terá que lidar com várias opções, escolhido de uma lista de constantes, então o Switch é o que você precisa. Essa situação é frequentemente encontrada ao escrever aplicativos interativos, onde você usará diálogos como este: “Se você quiser fazer isso, pressione isso; Se você precisar disso, pressione isso "e assim por diante. Por exemplo, mostraremos um programa que mostra um valor inteiro que você apresenta em hexadecimal ou octal, dependendo da sua escolha.
#include int main () char option; número int; printf ("Por favor, insira o número que deseja convertido.\ n "); /*Por favor, abstenha -se de usar gets () por causa de seu * inseguro "Recursos" */ scanf ("%i", & número); printf ("Que tipo de conversão você precisa?\ n "); printf (" pressione 'o' para octal e 'x' para hexadecimal.\ n "); enquanto((opção = getchar ()) != Eof && (opção = getchar ()) != '\ n') trocar(opção) caso 'O': printf ("O número em octal é 0%O.\ n ", número); quebrar; caso 'x': printf ("O número em hexadecimal é 0x%x.\ n ", número); quebrar; padrão: printf ("opção não válida.\ n "); quebrar; retornar 0;
Agora vamos dissecar o programa e ver o que e como ele faz as coisas. Uma coisa recentemente apresentada aqui é a função getchar (), conforme definido em stdio.h . É usado aqui para obter um caractere único Da entrada do usuário e depois escreva o personagem para uma variável. Poderíamos ter usado opção = getchar () uma vez, antes de lá, mas escrevemos o código como esse para enfatizar como você pode usá -lo. Deixaremos você descobrir por que verificamos o EOF e o personagem Newline, e recomendamos que você tente ver o que acontece se você omitir essas verificações. A sintaxe de uma declaração de interruptor é bastante simples e auto-explicativa, então seremos muito breves.
Usamos o intervalo; Em todos os casos, porque, caso contrário, o loop continuaria para a próxima tag (as tags são escritas antes do cólon). O padrão: tag não é obrigatório, mas é útil fazer algo no caso de outras tags correspondem aos dados existentes e também é considerado uma boa prática de programação. Como outro exercício, recomendamos que você tente reescrever nosso código abaixo usando scanf () em vez de getchar () e ver como vai. Será que vai dar certo?
fazer enquanto
Dissemos anteriormente que, enquanto e para avaliar primeiro e executar depois, então há chances de que as instruções nunca sejam executadas. Haverá situações em que você deseja o reverso exato, e é aqui que você/enquanto entrará no estágio. O fluxo lógico é invertido, em comparação com o tempo, como em (algo) enquanto (condicional_is_true). Então a avaliação é feita depois A execução, que garante pelo menos uma rodada antes do compilador perceber que a condição é falsa (ou não).
Vamos ver como seria um loop infinito com fazer/while:
fazer printf ("Olá!\ n "); enquanto(1);
Você pode simplesmente tentar verificar como o fluxo passa simplesmente substituindo 1 por 0 no código acima e ver o que acontece: o programa imprimirá 'Olá!'Uma vez, antes de perceber que a expressão do tempo é avaliada como falsa. Faça/enquanto as construções geralmente são menos usadas que seus colegas, mas você verá que existem situações em que eles facilitam sua vida. Você pode dar um exemplo?
quebre, continue e goto
Já “nos conhecemos” quebra antes, e isso pode ser simplesmente descrito como o método de sair de um loop de outras maneiras além do padrão. Você pode usá -lo com loops ou trocar de construção, em vez de continuar, o que realmente não faz sentido em um interruptor. Vamos deixar para você escrever algum código onde a quebra e continue são usados e úteis, e continuaremos com um dos "inimigos" do programador C: Goto. Comecei a programar com o BASIC e ainda tremei quando me lembro do uso de Goto lá e, embora C também, seu uso não é recomendado em qualquer caso, talvez exceto por alguns programas relacionados ao sistema. Não é recomendado porque, com o Goto, você pode facilmente transformar seu trabalho em código de espaguete, ou seja, código muito difícil de ler e depurar porque o leitor é forçado a "pular" para várias seções do código para entendê -lo. Mas por uma questão de completude, eis como funciona. Você declara um rótulo, depois atribui algumas instruções a ele e então pode usá -lo em diferentes partes do seu código. Geralmente você pode se safar de uma função personalizada em vez disso, então use Goto apenas quando tudo mais falhar.
se(error_unknown) Vá para erro; /*[…]*/ erro: printf ("erro genérico!.\ n ");
Agora, sempre que você tem um erro não tratado/desconhecido, você pode usar a etiqueta do erro para imprimir essa mensagem muito útil. Novamente, evite goto como a praga. É mais fácil do que você imagina se acostumar e criar um mau hábito de escrever código de espaguete. Não podemos enfatizar isso o suficiente.
Conclusão
Desde que você leia esta parte com cuidado e tentou resolver os desafios que apresentamos, agora você deu outro passo na terra da programação C. Tente ler e escrever o máximo de código possível, e não tenha medo de perguntar se algo der errado.
Aqui está o que você pode esperar a seguir:
- EU. C Desenvolvimento no Linux - Introdução
- Ii. Comparação entre C e outras linguagens de programação
- Iii. Tipos, operadores, variáveis
- 4. Controle de fluxo
- V. Funções
- Vi. Ponteiros e matrizes
- Vii. Estruturas
- Viii. E/S básico
- Ix. Estilo de codificação e recomendações
- X. Construindo um programa
- XI. Embalagem para Debian e Fedora
- Xii. Obtendo um pacote nos repositórios oficiais do Debian
Tutoriais do Linux relacionados:
- Coisas para instalar no Ubuntu 20.04
- Uma introdução à automação, ferramentas e técnicas do Linux
- Coisas para fazer depois de instalar o Ubuntu 20.04 fossa focal linux
- Bash Script: Operadores
- Coisas para instalar no Ubuntu 22.04
- Mint 20: Melhor que o Ubuntu e o Microsoft Windows?
- Mastering Bash Script Loops
- Ubuntu 20.04 Guia
- Coisas para fazer depois de instalar o Ubuntu 22.04 Jellyfish…
- Sistema Linux Hung? Como escapar para a linha de comando e…