Enviar um café pro programador

Pode me ajudar a transformar cafeína em código?

Apostila de C - Testes Condicionais (IF-ELSE e SWITCH-CASE), Laços (FOR e WHILE) e Operador Ternário (? :) (Lista 3)

Neste tutorial de nossa Apostila C Progressivo, iremos mostrar as questões da apostila de C da UFMG sobre os Testes Condicionais IF ELSE e SWITCH, Laços ou loopings WHILE e FOR e do Operador Ternário em C: <condição> ? <operação 1> : <operação 2> ;

Seja um programador profissional. Clique aqui e obtenha seu CERTIFICADO

Apostila de C da UFMG

Neste artigo de nosso curso, iremos mostrar todas as questões propostas na Lista 3 da Apostila de C da  UFMG, onde, inicialmente, você deve resolver os exercícios propostos e marcar as alternativas que achar correto.
Em seguida você deverá ver a nota que tirou.

Na segunda parte deste artigo, iremos resolver e analisar cada uma das questões propostas nessa lista da apostila, e vamos comentar bem os códigos dos exercícios.
A UFMG disponibiliza todo esse material de maneira gratuita e livre para estudo e divulgação, para saber mais:
Apostila de C da UFMG

Para você resolver as questões dessa lista da apostila, é necessário ter estudado os tutoriais da seção sobre Testes Condicionais e Laços.




Apostila de C - Exercícios sobre Testes e Laços (Lista 3)




1- if(num) ...;   é equivalente a    if(num!=0) ...; 
     
    a.  Verdadeiro
    b.  Falso

2- Qual o valor de x após a seguinte seqüência de comandos:
        a = 10;
        b = 20;
        x = 0;
        x = (b > a) ?  b : a;
     
    a. 
    b. 
    c.  10
    d.  20
    e.  40
    f.  Nenhuma das opções anteriores 

3- Qual o valor de x após a seqüência de comandos:
        a = 1;
        b = 2;
        c = 3;
        x = 0;
        x = a < b ? a < c ? a : c : b < c ? b : c;
 (DICA:  antes de tentar resolver, coloque parênteses na expressão acima, indicando a ordem de precedência dos operadores)
     
    a. 
    b. 
    c. 
    d.  3
    e.  Nenhuma das opções anteriores 

4- Os trechos de programa a seguir são equivalentes entre si, sob o ponto de vista do que é impresso:
        for (i = 0 ; i < 10; i++) printf("%d", i);
    e
        for (i = 0 ; i < 10; ++i) printf("%d", i);
     
    a.  Verdadeiro 
    b.  Falso 

5- O trecho de programa a seguir é
         switch(num)
        {
            case 1;
                        printf("O numero e 1 ");
                        break;
            case 2;
                        printf("O numero e 2 ");
                        break;
            default;
                        printf("O numero e diferente de 1 e 2");
                        break;
        }
     
    a.  Válido na linguagem C 
    b.  Não válido na linguagem C 

6- Sendo num uma variável inteira, o que imprime o trecho de código a seguir?
        num = 1;
        switch(num)
        {
            case 1:
                        printf("O numero e 1 ");
            case 2:
                        printf("O numero e 2 ");
            default:
                        printf("O numero e diferente de 1 e 2");
        }
 
     
    a.  O numero e 1 
    b.  O numero e 2
    c.  O numero e diferente de 1 e 2 
    d.  O numero e 1 O numero e 2 
    e.  O numero e 1 O numero e 2 O numero e diferente de 1 e 2

7-  Os dois blocos de código a seguir produzem o mesmo resultado:
        for( i = 0  ;  i < 3 ;  i++)
                for ( j =0 ; j < 3; j++)
                        printf("i+j = %d \n", i+j);
e
        for( i = 0 ,  j=0  ;  i < 3 ;  i++)
                for (   ;  j < 3 ;  j++)
                        printf("i+j = %d \n", i+j);
     
    a.  Verdadeiro 
    b.  Falso 

8- Qual a saída produzida pelo extrato de código a seguir:
        int x;
        for ( x = 35 ; x > 0 ; x/=3)
            printf("%d " , x) ;
     
    a.  35 11 3 1 
    b.  11 3 1 
    c.  11 3 1 0 
    d.  35 11 3   
    e.  Nenhuma das opções anteriores 

9- Os extratos de código a seguir são equivalentes entre si:
        int x = 10;
        while (--x > 9)
           {
              printf("%d", x);
           }
e
         int x = 10;
         do {
              printf("%d", x);
            } while(--x > 9);
     
    a.  Verdadeiro 
    b.  Falso 

10- Sendo i declarado e inicializado como:
        int i = 0;
        os seguintes extratos de código:
        while (i = 5)
        {
            printf("%d %d %d \n", i, i+2, i+4);
            i = 0;
        }
e
        if (i = 5) printf ("%d %d %d \n", i, i+2, i+4);
     
    a.  São idênticos sob o ponto de vista do que imprimem na tela
    b.  Não imprimem nada na tela 
    c.  Têm sintaxe errada 
    d.  Um deles imprime 5, 7 e 9 uma única vez e o outro entra em loop, imprimindo estes valores indefinidamente 
    e.  Nenhuma das opções anteriores 

11- A estrutura do switch abaixo é:
     switch (t)
     {
        case t < 10:
                    printf("Hoje ta' fazendo muito frio");
                    break;
        case t < 25:
                    printf("A temperatura está agradavel");
                    break;
        default:
                    printf("Hoje ta' quente pra chuchu");
     }
 
     
    a.  Válida na linguagem C
    b.  Não válida na linguagem C 

12- O laço for a seguir
   int i;
   for ( i = 0 ; i <= 5; i++ , printf("%d ", i));
 
     
    a.  Imprime 0 1 2 3 4 5 
    b.  Não funciona, pois tem sintaxe errada
    c.  Imprime 1 2 3 4 5 6
    d.  Imprime 1 2 3 4 5
    e.  Nenhuma das opções anteriores


Sua nota é: em um máximo de 100.

Apostila de C - Solução dos exercícios sobre Testes e Laços da lista 3

Questão 1:

Vamos analisar a primeira expressão: if(num)
A condição dela é simplesmente "num".
Se num=0 o resultado do if é FALSO.
Se num!=0 , o resultado do if é VERDADEIRO.

Agora a próxima expressão: if(num!=0)
Onde a condição do teste é "num!=0".
Se num=0, o resultado do if é FALSO.
Se num=!0, o resultado do if é VERDADEIRO.

Gabarito: a


Questão 2:

A expressão de x é: x = (b > a) ?  b : a;  
Ou seja, vamos atribuir um valor para x de acordo com a condição de teste.

O teste do operador ternário é: b > a
Como a=10 e b=20, o teste resulta em VERDADEIRO, logo x vai assumir o primeiro valor:
x = b = 20

Gabarito: d


Questão 3:

Temos a seguinte expressão: x = a < b ? a < c ? a : c : b < c ? b : c; 

Sabemos que o operador ternário é da seguinte forma:
teste condicional ? (opção 1, se o teste é TRUE) : (opção 2, se o teste é FALSE)

Vamos deixar a expressão de "x" igual a esta acima:
x = (a < b) ? (a < c ? a ) : ( c : b < c ? b : c ); 

Assim, nosso teste condicional é: a< b, que retorna TRUE
Logo, x = (a < c ? a) ; 

Ou seja, agora temos o teste: a < c
Que se for verdade, retorna "a". Se for falso, não retorna nada.
Como o teste é verdadeiro, x = a = 1

Gabarito: b

Questão 4:

Ambos exibem uma contagem de 0 até 9.

Gabarito: a


Questão 5:

O seguinte trecho de código:
printf("O numero e diferente de 1 e 2"); 
                        break; 


Deve pertencer a algum "case" ou ao "default", mas ele não faz parte de nenhum deles, são linhas 'soltas', não fazem sentido elas não pertencerem a nenhum elemento do switch.

Gabarito: b


Questão 6:


Quando colocamos um número dentro do switch ele vai procurar dentro dos cases existentes aquele número. Caso ele encontre, ele vai rodar o código a partir daquele case em diante, até encontrar um comando break, que dá a ordem de parar.

E caso não existe esse break, o que ocorre?
Ele vai continuar rodando tudo até o final.

No caso dessa questão da apostila, o "num" vale 1, e de cara o primeiro case é 1.
Então vai rodar tudo a partir dali. Ou seja, vai rodar o case 1, case 2 e o default.

Gabarito: e


Questão 7:

Esse tipo de exercício é interessante que se faça sem testar o código, apenas olhando e raciocinando.

Vamos lá, a diferença neste código está na inicialização da variável j.
No primeiro caso, quantas vezes ela é colocada com igual a 0?
A resposta é 3 vezes: quando i=0, quando i=1 e quando i=2
Ou seja, sempre que o laço for de cima inicia uma iteração, o for debaixo inicia com o valor j=0

Já no segundo caso não. A variável "j" recebe o valor 0 apenas no início de tudo.
No início, temos i=j=0, e depois o valor de j vai subindo: j=1,  j=2 e j=3
Depois é a vez de i=1, porém, o j vai continuar tendo valor 3, e não retorna a ser 0, como no primeiro caso.

Gabarito: b


Questão 8:


Inicialmente, x=35 ( e x>0), então ele é impresso: 35
Em seguida: x = x/3 = 11 (x é inteiro)
Como  x>0, então ele é impresso: 11

Em seguida: x = x/3 = 3
Como x>0, então ele é impresso: 3

Em seguida: x = x/3 = 1
Como x>0, ele é impresso: 1

Por fim: x = x/3 = 0
Como x<=0, ele não é mais impresso.

Gabarito: a


Questão 9:


Para resolver esta questão da apostila de C, precisamos saber o que significa: --x
Que nada mais é que uma operação de decremento de x. Ou seja, a primeira coisa que ocorre é um decremento de uma unidade (x = x-1).

Assim, no primeiro caso temos x=10 inicialmente.
Dentro do laço while vemos: --x
Logo, x é decrementado e agora x=9 e a seguinte condição é falsa: x > 9
Daí não ocorre nenhuma impressão na tela
(Se fosse x-- > 9, primeiro haveria o testo com x=10, e só depois do teste ocorreria o decremento).

No segundo caso temos um laço DO WHILE, ou seja, a primeira iteração SEMPRE OCORRE.
Então é impresso o valor de x, e só depois ocorre o laço while, igual ao exemplo passado.

Como no primeiro caso nada é impresso, e no segundo caso é, os dois códigos em C não são iguais.

Gabarito: b


Questão 10:

Nesta questão da apostila há uma pegadinha.
O seguinte código retorna sempre verdadeiro: i=5
Sim, não importa o valor de "i", esse comando vai sempre ser verdadeiro pois se trata de uma ATRIBUIÇÃO. Se fosse i==5 (que é uma COMPARAÇÃO), retornaria falso.
Logo, o primeiro código é sempre verdadeiro e há um loop infinito.

O mesmo ocorre no segundo caso, o if vai retornar TRUE, pois é uma atribuição e o código do IF vai ser rodado, porém só uma vez (pois IF é um teste condicional e não um laço/loop).

Gabarito: d


Questão 11:

O comando switch tem uma limitação: seus case devem conter valor, e nada mais.
Nada de teste, atribuição ou uma operação qualquer.
Ele deve conter números, valores.

No caso, os cases possuem testes, invalidando o código.

Gabarito: b

Questão 12:
Inicialmente temos i=0, e o teste para saber se i<=5
Sempre que for verdadeiro, é executado o código do for, que não faz absolutamente nada.

Após o "nada" ser feito, é realizada a operação pós-teste do laço for, que é o incremento e a impressão do valor de i.

Ou seja, o que esse código faz é: incrementa i, depois imprime.
Ele faz isso desde i=0 até i=5
Como i=0, o primeiro valor impresso é 1 (por antes o "i" é incrementado).
O valor de "i" vai crescendo até atingir 5, nesse ponto é incrementado e impresso 6.
Como i=6, a condição "i<=5" é falsa e termina o laço for, que exibe os números de 1 até 6.

Gabarito: c

Nenhum comentário: