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
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.
0
b.
2
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.
0
b.
1
c.
2
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.
Não foi feito nenhum comentário até agora.
Fechar esta janela