Programação Usando a Linguagem C

 

Fluxo de Controle

 

·       Os comandos de fluxo de controle especificam a ordem em que a computação é realizada.

 

 

Comandos e Blocos

 

·       Uma expressão torna-se um comando quando seguida pelo símbolo ";". Exemplo:

 

       x = 0; i++; printf(...);

 

·       O símbolo ";" é um terminador de comandos e não um separador.

·       O conjunto { } agrupa declarações e comandos num bloco (comando composto), considerado como um único comando.

·       Variáveis podem ser declaradas dentro de qualquer bloco.

 

Expressões lógicas e relacionais

·       As expressões usadas em comandos de decisão e repetição são constituídas de operadores lógicos e/ou relacionais, portanto, são expressões lógicas e/ou relacionais.

·       Toda expressão relacional e lógica produz como resultado 0 (falso) ou 1 (verdadeiro).

·       Os operadores relacionais são:

 

    > >= < <=

 

·       Os operadores de igualdade são:

 

       == !=

 

·       Os operadores lógicos são:

 

    &&(and) ||(or) !(not)

 

·       Exemplo:

 

       10 > 5 && !(10 < 9) || 3 <= 4

 

·       O resultado da expressão acima é verdadeiro.

 

·       Precedência entre os operadores:

 

mais alta =>

Operadores aritméticos

 

!

 

==  !=

 

>  >=  <  <=

 

&&

mais baixa =>

||

 

·       Como nas expressões aritméticas, é possível usar parênteses para mudar a ordem natural de avaliação de uma expressão lógica. Por exemplo:

 

!0 && 0 ||

!(0 && 0) || 0

é falso

é verdadeiro

          

Comandos  de decisão: if-else

 

·       O comando if-else é usado para expressar decisões (executar testes condicionais) no programa.

·       Observe o programa abaixo:

 

/*

     UFCG/CCT/DSC - Introducao a Programacao

     Este programa determina o maior de um grupo de 3 valores inteiros

     Versao 1.0

*/

 

#include <stdio.h>

#include <conio.h>

 

void main() {

     /*declaracao de variaveis*/

     int valor1, valor2, valor3;

     const char prompt[] = "\nDigite 3 valores inteiros para localizar o maior\n(separe os valores com espaco): ";

 

     clrscr();/*comando para limpar a tela*/

 

     /*entrada de dados*/

     printf("%s", prompt);

     scanf("%d %d %d", &valor1, &valor2, &valor3);

 

     /*processamento*/

     if (valor1 > valor2) {

         if (valor1 > valor3) {

              printf("O maior valor entre %d %d %d => %d", valor1, valor2, valor3, valor1);

         } else {

              printf("O maior valor entre %d %d %d => %d", valor1, valor2, valor3, valor3);

         }

     } else {

         if (valor2 > valor3) {

              printf("O maior valor entre %d %d %d => %d", valor1, valor2, valor3, valor2);

         } else {

              printf("O maior valor entre %d %d %d => %d", valor1, valor2, valor3, valor3);

         }

     }

}

 

·       Forma geral do comando if-else:

 

       if (expressão) {

           comando1; /*bloco VERDADE*/

       } else {

           comando2; /*bloco FALSO*/

       }

 

·       Onde, expressão é uma expressão lógica.

·       Uma expressão é verdadeira quando seu valor é diferente de zero, nesse caso, executa-se o bloco VERDADE;

·       Por outro lado, uma expressão é tida como falsa quando seu valor é igual a zero, nesse caso, executa-se o bloco FALSO.

·       É melhor usar:

 

       if (expressão)

 

ao invés de:

 

       if (expressão != 0)

 

·       O else é sempre associado ao último if sem else (if mais interno).

·       Exemplo:

 

    if (n > 0)            if (n > 0)

       if (a > b)   ó           if (a > b)

           z = a;                z = a;

       else              else

           z = b;            z = b;

                        

·       Para evitar ambigüidades, use sempre os parênteses!

·       Uma versão melhorada do programa para encontrar o maior valor, apresentado acima:

 

/*

     UFCG/CCT/DSC - Introducao a Programacao

     Este programa determina o maior de um grupo de 3 valores inteiros

     Versao 2.0

*/

 

#include <stdio.h>

#include <limits.h>

#include <conio.h>

 

void main() {

     /*declaracao de variaveis*/

     int valor1, valor2, valor3, maior;

     const char prompt[] = "\nDigite 3 valores inteiros para localizar o maior\n(separe os valores com espaco): ";

 

     /*INT_MIN: constante pre-definida da linguagem, equivale ao valor minino de "int"*/

     maior = INT_MIN;

 

     clrscr();/*comando para limpar a tela*/

 

     /*entrada de dados*/

     printf("%s", prompt);

     scanf("%d %d %d", &valor1, &valor2, &valor3);

 

     /*processamento*/

     if (valor1 > maior) {

         maior = valor1;

     }

     if (valor2 > maior) {

         maior = valor2;

     }

     if (valor3 > maior) {

         maior = valor3;

     }

 

     /*saida de dados*/

     printf("O maior valor entre %d %d %d => %d", valor1, valor2, valor3, maior);

}

 

·       A versão anterior do programa pode ainda ser melhorada para encontrar o maior valor de três:

 

/*

     UFCG/CCT/DSC - Introducao a Programacao

     Este programa determina o maior de um grupo de 3 valores inteiros

     Versao 3.0

*/

 

#include <stdio.h>

#include <conio.h>

 

void main() {

     /*declaracao de variaveis*/

     int valor1, valor2, valor3, maior;

     const char prompt[] = "\nDigite 3 valores inteiros para localizar o maior\n(separe os valores com espaco): ";

 

     clrscr();/*comando para limpar a tela*/

 

     /*entrada de dados*/

     printf("%s", prompt);

     scanf("%d %d %d", &valor1, &valor2, &valor3);

 

     /* considera o primeiro valor como o maior valor até então e reduz um teste */

     maior = valor1;

 

     /*processamento*/

     if (valor2 > maior) {

         maior = valor2;

     }

     if (valor3 > maior) {

         maior = valor3;

     }

 

     /*saida de dados*/

     printf("O maior valor entre %d %d %d => %d", valor1, valor2, valor3, maior);

}

 

Comandos de decisão: else-if

 

·       A construção a seguir é a forma mais genérica de se escrever uma decisão múltipla:

 

       if (expressão1) {

           comando1;

       } else if (expressão2) {

           comando2;

       } else if (expressão3) {

           comando3;

       } else {

           comando4;

       }

 

·       O exemplo a seguir imprime por extenso dígitos decimais através de uma decisão múltipla:

 

/*

     UFCG/CCT/DSC - Introducao a Programacao

     Este programa escreve dígitos por extenso

     Versão 1.0

*/

 

#include <stdio.h>

#include <conio.

void main() {

     /*declaracao de variaveis*/

     int digito;

 

     clrscr();/*comando para limpar a tela*/

 

     /*entrada de dados*/

     printf("Informe o dígito decimal:\n");

     scanf("%d", &digito);

 

     printf(“\n\nO digito informado foi ”);

     if (digito == 0) {

         printf(“zero\n”);

     } else if (digito == 1) {

         printf(“um\n”);

     } else if (digito == 2) {

         printf(“dois\n”);

     } else if (digito == 3) {

         printf(“três\n”);

     } else if (digito == 4) {

         printf(“quatro\n”);

     } else if (digito == 5) {

         printf(“cinco\n”);

     } else if (digito == 6) {

         printf(“seis\n”);

     } else if (digito == 7) {

         printf(“sete\n”);

     } else if (digito == 8) {

         printf(“oito\n”);

     } else if (digito == 9 {

         printf(“nove\n”);

     } else {

         printf(“Digito inválido!\n”);

     }

}

 

O comando switch

 

·       O comando switch é uma estrutura de decisão múltipla.

·       Funcionalidade: verifica se o valor da expressão coincide com um dentre vários valores inteiros constantes, desviando o fluxo de execução de acordo com o resultado.

·       Observe o programa abaixo:

·       O comando break causa uma saída imediata do switch (pode ser utilizado também em comandos de repetição).

·       Forma geral do comando switch:

 

       switch (expressão-inteira) {

           case expressão-inteira-constante:

               comandos;

           case expressão-inteira-constante:

               comandos;

           . . .

           default:

               comandos;

       }

·       Exemplo de uso do comando switch:

 

/*

     UFCG/CCT/DSC - Introducao a Programacao

     Este programa escreve dígitos por extenso

     Versão 2.0

*/

 

#include <stdio.h>

#include <conio.h>

 

void main() {

     /*declaracao de variaveis*/

     int digito;

 

     clrscr();/*comando para limpar a tela*/

 

     /*entrada de dados*/

     printf("Informe o dígito decimal:\n");

     scanf("%d", &digito);

 

     printf(“\n\nO digito informado foi “);

     switch(digito) {

         case 0:

              printf(“zero\n”);

              break;

         case 1:

              printf(“um\n”);

              break;

         case 2:

              printf(“dois\n”);

              break;

         case 3:

              printf(“três\n”);

              break;

         case 4:

              printf(“quatro\n”);

              break;

         case 5:

              printf(“cinco\n”);

              break;

         case 6:

              printf(“seis\n”);

              break;

         case 7:

              printf(“sete\n”);

              break;

         case 8:

              printf(“oito\n”);

              break;

         case 9:

              printf(“nove\n);

         default:

              printf(“Digito inválido!\n”);

     }

}

 

          

Comandos de repetição: while, for

 

 

/*

     UFCG/CCT/DSC - Introducao a Programacao/2001.1

     Este programa determina o maior de um grupo de N valores inteiros

     Versao 4.0

 

*/

 

#include <stdio.h>

#include <conio.h>

#include <limits.h>

 

void main() {

     /*declaracao de variaveis*/

     int valor, maior;

     char resposta;

 

     const char prompt[] = "\nDigite um valor inteiro de cada vez para localizar o maior:";

     const char prompt2[] = "\nOutro valor?\n(tecle \'s\' para sim e \'n\' para terminar): ";

 

     clrscr(); /*comando para limpar a tela*/

 

     /*INT_MIN: constante pre-definida da linguagem, equivale ao valor minino de "int"*/

     maior = INT_MIN;

     resposta = 's'; /* inicializa obrigando o primeiro a ser digitado */

 

 

     /*processamento*/

     while (resposta == 's') {

         printf ("%s", prompt);

         scanf("%d", &valor);

         if (valor > maior) {

              maior = valor;

         }

         printf("%s", prompt2);

         scanf(“\n%c”, &resposta);

     }

 

     /*saida de dados*/

     printf ("\nMaior valor digitado => %d", maior);

}

 

 

       while (expressão) {

           comandos;

       }

 

·       Note que, o bloco de comandos do while será repetido até que o resultado da avaliação de expressão  seja diferente de zero.

·       Representação de um laço infinito com o comando while:

      

       while(1) {

           comandos;

       }

 

·       Outra versão do programa para encontrar o maior valor:

 

/*

     UFCG/CCT/DSC - Introducao a Programacao/2001.1

     Este programa determina o maior de um grupo de 3 valores inteiros

     Versao 4.0

*/

 

#include <stdio.h>

#include <limits.h>

 

void main() {

     /*declaracao de variaveis*/

     int valor, maior, i;

     const char prompt[] = "\nEntrada dos 10 valores inteiros para localizar o maior...";

     const char prompt2[] = "\nInforme um valor: ";

 

     /*INT_MIN: constante pre-definida da linguagem, equivale ao valor minino de "int"*/

     maior = INT_MIN;

 

     clrscr();/*comando para limpar a tela*/

 

     /*processamento*/

     printf ("%s", prompt);

     for (i = 0; i < 10; i++) {

         printf("%s", prompt2);

         scanf("%d", &valor);

         if (valor > maior)

              maior = valor;

     }

 

     /*saida de dados*/

     printf("\nMaior valor digitado => %d", maior);

}

 

·       Forma geral do comando for:

 

       for(expr-1; expr-2; expr-3){

           comandos;

       }

 

·       Onde:

·       expr-1 => inicialização da variável de controle;

·       expr-2 => teste sobre a variável de controle;

·       expr-3 => atualização (incremento/decremento) do valor da variável de controle.

 

·       Qualquer expressão do comando for pode estar ausente.

·       Outro ponto importante: se a expr-2 estiver ausente o seu valor será considerado VERDADE (diferente de zero).

·       Representação de um laço infinito com o comando for:

 

       for (;;) {

           comandos;

       }

 

·       É possível representar o comando for através do comando while:

      

       expr-1;

       while (expr-2) {

           comandos;

           expr-3;

       }

 

·       O comando for é claramente preferível ao comando while quando há inicializações e reinicializações.

·       Além disso, utiliza-se o comando for quando o número de repetições é conhecido; e o comando while, caso contrário.

·       O operador "," é freqüentemente usado no comando for. Seu efeito é fazer com que várias expressões sejam avaliadas da esquerda para a direita.

 

O comando do-while

 

·       O comando do-while é semelhante ao comando while, sendo que, o teste (avaliação da expressão) acontece no final da execução do seu bloco de comandos.

·       Forma geral do comando do-while:

 

       do {

           comando;

       } while (expressão);

 

Comandos break e continue

 

·       O break permite a saída antecipada do laço ou switch.

·       Um break faz com que o laço (ou switch) mais interno seja terminado imediatamente.

·       O comando continue inicia a próxima iteração do laço.

·       Dentro do while e do do-while, o continue desvia para o teste; dentro do for, desvia para a execução da próxima reinicialização (expr-3).

 

Programas para discutir em sala:

1 – Série de Fibonacci (código)

2 – Divisores de um número N (código)

3 – Números primos (código)

4 – Calculadora (código)


Versão Word (.doc) do material acima.