Departamento de Ciência da Computação - IME - USP

MAC2166 Introdução à Computação

Prova 1


QUESTÃO 1

  Simule a execução do programa abaixo, destacando a saída do programa. A saída do programa é tudo que aparece na tela durante a execução do programa.
#include <stdio.h>

int main()
{
  int x,y, conta;

  printf("Digite o digito final do seu Numero USP: ");
  scanf("%d", &x);
  
  printf("Primeiro x= %d \n", x);
  y = 2*x + 1;
  
  conta = 1;
  printf("Primeiro y= %d \n", y);

  while (conta < 6 && (x <= 5 || y > 3)) 
    {
      printf("conta= %d\n", conta);
      if (x%2 == 0) 
	{
	  x = x/2; 
	  y = y-5;
	  printf("* x= %d\n", x);
	} 
      else 
	{
	  x = 3*x + 1; 
          y = y + 3;
	  printf("x= %d\n", x);
	}
      printf("y= %d\n", y);
      conta = conta + 1;
    }
	
  printf("Ultimo x= %d\n", x);
  printf("Ultimo y= %d\n", y);
  return 0;
} 

SOLUÇÃO
A resposta depende do último dígito do seu número USP, ou seja, depende do resto da divisão do seu número USP por 10. Teste com o seu no. USP e compare a resposta.

(0) nusp%10 == 0. Veja um exemplo abaixo.

Digite o digito final do seu Numero USP: 0
Primeiro x= 0 
Primeiro y= 1 
conta= 1
* x= 0
y= -4
conta= 2
* x= 0
y= -9
conta= 3
* x= 0
y= -14
conta= 4
* x= 0
y= -19
conta= 5
* x= 0
y= -24
Ultimo x= 0
Ultimo y= -24

(1) nusp%10 == 1. Veja um exemplo abaixo.

Digite o digito final do seu Numero USP: 1
Primeiro x= 1 
Primeiro y= 3 
conta= 1
x= 4
y= 6
conta= 2
* x= 2
y= 1
conta= 3
* x= 1
y= -4
conta= 4
x= 4
y= -1
conta= 5
* x= 2
y= -6
Ultimo x= 2
Ultimo y= -6

(2) nusp%10 == 2. Veja um exemplo abaixo.

Digite o digito final do seu Numero USP: 2
Primeiro x= 2 
Primeiro y= 5 
conta= 1
* x= 1
y= 0
conta= 2
x= 4
y= 3
conta= 3
* x= 2
y= -2
conta= 4
* x= 1
y= -7
conta= 5
x= 4
y= -4
Ultimo x= 4
Ultimo y= -4

(3) nusp%10 == 3. Veja um exemplo abaixo.

Digite o digito final do seu Numero USP: 3
Primeiro x= 3 
Primeiro y= 7 
conta= 1
x= 10
y= 10
conta= 2
* x= 5
y= 5
conta= 3
x= 16
y= 8
conta= 4
* x= 8
y= 3
Ultimo x= 8
Ultimo y= 3

(4) nusp%10 == 4. Veja um exemplo abaixo.

Digite o digito final do seu Numero USP: 4
Primeiro x= 4 
Primeiro y= 9 
conta= 1
* x= 2
y= 4
conta= 2
* x= 1
y= -1
conta= 3
x= 4
y= 2
conta= 4
* x= 2
y= -3
conta= 5
* x= 1
y= -8
Ultimo x= 1
Ultimo y= -8

(5) nusp%10 == 5. Veja um exemplo abaixo.

Digite o digito final do seu Numero USP: 5
Primeiro x= 5 
Primeiro y= 11 
conta= 1
x= 16
y= 14
conta= 2
* x= 8
y= 9
conta= 3
* x= 4
y= 4
conta= 4
* x= 2
y= -1
conta= 5
* x= 1
y= -6
Ultimo x= 1
Ultimo y= -6

(6) nusp%10 == 6. Veja um exemplo abaixo.

Digite o digito final do seu Numero USP: 6
Primeiro x= 6 
Primeiro y= 13 
conta= 1
* x= 3
y= 8
conta= 2
x= 10
y= 11
conta= 3
* x= 5
y= 6
conta= 4
x= 16
y= 9
conta= 5
* x= 8
y= 4
Ultimo x= 8
Ultimo y= 4

(7) nusp%10 == 7. Veja um exemplo abaixo.

Digite o digito final do seu Numero USP: 7
Primeiro x= 7 
Primeiro y= 15 
conta= 1
x= 22
y= 18
conta= 2
* x= 11
y= 13
conta= 3
x= 34
y= 16
conta= 4
* x= 17
y= 11
conta= 5
x= 52
y= 14
Ultimo x= 52
Ultimo y= 14

(8) nusp%10 == 8. Veja um exemplo abaixo.

Digite o digito final do seu Numero USP: 8
Primeiro x= 8 
Primeiro y= 17 
conta= 1
* x= 4
y= 12
conta= 2
* x= 2
y= 7
conta= 3
* x= 1
y= 2
conta= 4
x= 4
y= 5
conta= 5
* x= 2
y= 0
Ultimo x= 2
Ultimo y= 0

(9) nusp%10 == 9. Veja um exemplo abaixo.

Digite o digito final do seu Numero USP: 9
Primeiro x= 9 
Primeiro y= 19 
conta= 1
x= 28
y= 22
conta= 2
* x= 14
y= 17
conta= 3
* x= 7
y= 12
conta= 4
x= 22
y= 15
conta= 5
* x= 11
y= 10
Ultimo x= 11
Ultimo y= 10

 

QUESTÃO 2

      Os seguintes trechos de programa têm como objetivo verificar se um dado n > 1 é primo. No final, a variável eprimo deve ter valor TRUE se n for primo e FALSE em caso contrário. Indique se o trecho está correto ou incorreto. Para cada trecho indicado como incorreto, dê um valor de n para o qual a resposta é incorreta.

  (a)                                                    Correto ( )  Incorreto (X)
  eprimo = TRUE;                                         Justificativa:
  divisor = 2;                                              Quando n é primo, 
  while (divisor <= n/2 || eprimo == TRUE) {                o programa pára com divisor==n+1 
    if (n % divisor == 0)                                   e eprimo==FALSE. Teste com n==2. 
      eprimo = FALSE; 
    divisor++;
  }
  (b)                                                    Correto (X)  Incorreto ( )
  eprimo = TRUE;                                         Hmmm. Êta código feio. . . 
  divisor = 2;                                           Alterna indicador dentro   
  while (divisor <= n/2 && eprimo == TRUE) {             do laço. . .
    if (n % divisor == 0) 
      eprimo = FALSE; 
    else 
      eprimo = TRUE;
    divisor++;
  }
  (c)                                                    Correto (X)  Incorreto ( )   
  eprimo = TRUE;     
  for (divisor = 2; divisor < n; divisor++)
    if (n % divisor == 0) 
      eprimo = FALSE; 
  (d)                                                    Correto ( )  Incorreto (X) 
  eprimo = FALSE;                                        Justificativa: Bem errado.
  for (divisor = 2; divisor < n; divisor++)                Resposta errada se n==2 ou 
    if (n % divisor != 0)                                  n é composto.
      eprimo = TRUE;                                       
  (e)                                                    Correto ( )  Incorreto (X)
  eprimo = TRUE;                                         Justificativa: 
  for (divisor = 1; divisor <= n/2 && eprimo == TRUE; divisor++)  Diz que todo número n>=2 
    if (n % divisor == 0)                                         não é primo. 
      eprimo = FALSE;                                             Note que divisor começa
                                                                  com 1.
                                                                  Assim, a resposta é
                                                                  errada sempre
                                                                  que n é primo

QUESTÃO 3

      Um número é palíndromo se é igual quando lido de trás para frente ou de frente para trás. Por exemplo, 25952, 55 e 6 são palíndromos e 19192 e 3434 não são palíndromos.

      Escreva um programa em C que leia uma sequência de números inteiros positivos, terminada por zero, e verifica quantos são palíndromos. Suponha que o dígito 0 não aparece em nenhum número da sequência. Exemplos de três possíveis execuções do programa:
  Digite um numero: 5
  Digite um numero: 525
  Digite um numero: 5225
  Digite um numero: 526
  Digite um numero: 59
  Digite um numero: 0
  3 numeros sao palindromos.
  
  Digite um numero: 5
  Digite um numero: 151
  Digite um numero: 212
  Digite um numero: 0
  3 numeros sao palindromos.

  
  
  Digite um numero: 15651
  Digite um numero: 0
  1 numeros sao palindromos.



  
  

SOLUÇÃO

/*
 * Solucao 1: Verifica se cada numero da sequencia e' palindromo comparando
 *            o primeiro e o ultimo digitos e "descascndo" o numero.
 */
#include <stdio.h>

#define SIM 1
#define NAO 0

int main()
{
  int numero;            /* usado para ler os numeros da sequencia */
  int primeiro, ultimo;  /* primeiro e ultimo digitos de numero       */
  int pot10;             /* maior potencia de 10 menor ou igual a numero */
  int palindromo;        /* indica se o numero e' palindromo */
  int cont;              /* contador de palindromos  */

  /* 1 leia o primeiro numero da sequencia */
  printf("Digite um numero: ");
  scanf("%d", &numero);

  /* 2 inicialize o contador de palindromos */
  cont = 0;

  /* 3 leia cada numero da sequencia e decida se eh palindromo */
  while (numero != 0) 
    {
      /* 3.1 determine a maior potencia de 10 menor ou igual a  num */
      pot10 = 1;
      while (pot10 <= numero)
        {
	   pot10 = pot10*10;
        }
      pot10 = pot10/10;
      
      /* 3.2 decida se numero e' palindromo */
      palindromo = SIM;
      while (numero > 10 && palindromo == SIM)
	{
	  /* compare o primeiro e ultimo digito de numero */ 
	  ultimo   = numero % 10;
	  primeiro = numero / pot10;
	  if (primeiro != ultimo) 
	    {
	      palindromo = NAO;
	    }
	  
	  /* arranque o primeiro e ultimo digito de numero */
	  numero = numero % pot10;
	  numero = numero / 10;
	  
	  /* atualize pot10 */
	  pot10 = pot10 / 100;
	}

     
      /* 3.3 atualize o contador de palincromos */
      if (palindromo == SIM)
	{
	  cont = cont + 1;
	}

      /* 3.4 leia o proximo numero da sequencia */
      printf("Digite um numero: ");
      scanf("%d", &numero);
    }

  /* 4 imprima o numero de palindromos */   
  printf("%d numeros da sequencia sao palindromos.\n\n", cont);

  return 0;
}


/*
 * Solucao 2: verifica se um numero e' palindromo comparando com o seu reverso
 *           
 */
#include <stdio.h>

#define SIM 1
#define NAO 0

int main()
{
  int numero;     /* usado para ler os numeros da sequencia   */
  int numreverso; /* armazena numero com seus digitos na ordem reversa */
  int aux;        /* variavel auxiliar usada para "reverter" numero */
  int digito;     /* usada para "pegar" cada digito de numero  */
  int cont;       /* contador de palindromos  */

  /* 1 leia o primeiro numero da sequencia */
  printf("Digite um numero: ");
  scanf("%d", &numero);

  /* 2 inicialize o contador de palindromos */
  cont = 0;

  /* 3 leia cada numero da sequencia e decida se eh palindromo */
  while (numero != 0) 
    {
      /* 3.1 armazene o reverso de numero em numreverso */
      numreverso = 0;
      aux = numero;
      while (aux > 0)
        {
          digito = aux%10; /* ultimo digito de aux */
          numreverso = numreverso*10 + digito;
          aux = aux/10;    /* remove o digito de aux */
        }

      /* 3.2 verifique se numero e' palindromo */
      if (numero == numreverso)
	{
	  cont = cont + 1;
	}

      /* 3.3 leia o proximo numero da sequencia */
      printf("Digite um numero: ");
      scanf("%d", &numero);
    }

  /* 4 imprima o numero de palindromos */   
  printf("%d numeros da sequencia sao palindromos.\n", cont);

  return 0;
}


/*
 * Solucao 3: colocaremos aqui qualquer solução que virmos e que 
 *            seja essencialmente diferente das anteriores.
 */

QUESTÃO 4

      Dizemos que uma sequência de números inteiros é alternante se:

  1. o primeiro é estritamente menor que o segundo, o segundo é estritamente maior que o terceiro, etc., ou seja, cada inteiro de ordem ímpar é estritamente menor que o imediatamente seguinte e cada inteiro de ordem par é estritamente maior que o imediatamente seguinte; ou
  2. (2) o primeiro é estritamente maior que o segundo, o segundo é estritamente menor que o terceiro, etc., ou seja, cada inteiro de ordem ímpar é estritamente maior que o imediatamente seguinte e cada inteiro de ordem par é estritamente menor que o imediatamente seguinte.
Por exemplo:

      Escreva um programa em C que leia um número inteiro n ≥ 2 e uma seqüência de n números inteiros e imprima uma mensagem indicando se a seqüência é ou não alternante.

SOLUÇÃO

/*
 * Solucao 1: Solucao arroz-com-feijao.
 */
#include <stdio.h>

#define SIM 1
#define NAO 0

int main()
{
  int n;             /* numero de elementos da sequencia        */
  int i;             /* contador de numeros lidos da sequencia  */
  int ultimo;        /* ultimo numero lido da sequencia         */
  int penultimo;     /* penultimo numero lido  sequencia        */
  int antepenultimo; /* antepenultimo numero lido  sequencia    */ 
  int alternante;    /* indica se a sequencia e' alternante     */

  /* 1 leia o numero de elementos da seqyencia  */
  printf("Digite o numero de elementos da sequencia: ");
  scanf("%d",&n);

  /* 2 leia o primeiro numero da sequencia  */
  printf("Digite o 1o. numero da sequencia: ");
  scanf("%d", &antepenultimo);

  /* 3 leia o segundo numero da sequencia  */
  printf("Digite o 2o. numero da sequencia: ");
  scanf("%d", &penultimo);

  /* 4 inicialize a variavel indicadora  */
  if (penultimo == antepenultimo)
    {
      alternante = NAO;
    }
  else
    {
      alternante = SIM;
    }

  /* 5 verifique se a sequencia e' alternante  */ 
  for (i = 2; i < n; i++)
    {
      /* 5.1 leia o proximo numero da sequencia  */
      printf("Digite o %do. numero da sequencia: ", i+1);
      scanf("%d", &ultimo);

      /* 5.2 verifique se a sequencia _nao_ e alternante  */
      if (  (antepenultimo <= penultimo && penultimo <= ultimo) 
	 || (antepenultimo >= penultimo && penultimo >= ultimo)  )
        {
	  alternante = NAO;
        }      

      /* 5.3 atualize s variaveis para a proxima iteracao  */
      antepenultimo = penultimo;
      penultimo = ultimo;
    }

  /* 6 escreva a resposta  */
  if (alternante == SIM)
    {
      printf("A sequencia e' alternante.\n\n");
    }
  else
    {
      printf("A sequencia nao e' alternate.\n\n");
    }

  return 0;
}


/*
 * Solucao 2: identica a solucao 1 
 *           
 */
#include <stdio.h>

#define SIM 1
#define NAO 0

int main()
{
  int n;             /* numero de elementos da sequencia       */
  int i;             /* contador de numeros lidos da sequencia */
  int ultimo;        /* ultimo numero lido da sequencia        */
  int penultimo;     /* penultimo numero lido  sequencia       */
  int antepenultimo; /* antepenultimo numero lido  sequencia   */ 
  int alternante;    /* indica se a sequencia e' alternante    */

  /* 1 leia o numero de elementos da seqyencia */
  printf("Digite o numero de elementos da sequencia: ");
  scanf("%d",&n);

  /* 2 leia o primeiro numero da sequencia */
  printf("Digite o 1o. numero da sequencia: ");
  scanf("%d", &antepenultimo);

  /* 3 leia o segundo numero da sequencia */
  printf("Digite o 2o. numero da sequencia: ");
  scanf("%d", &penultimo);

  /* 4 inicialize a variavel indicadora */
  if (penultimo == antepenultimo)
    {
      alternante = NAO;
    }
  else
    {
      alternante = SIM;
    }

  /* 5 verifique se a sequencia e' alternante */ 
  for (i = 2; i < n; i++)
    {
      /* 5.1 leia o proximo numero da sequencia */
      printf("Digite o %do. numero da sequencia: ", i+1);
      scanf("%d", &ultimo);

      /* 5.2 verifique se a sequencia _nao_ e alternante */
      if ((penultimo-antepenultimo)*(ultimo-penultimo) >= 0) 
        {
	  alternante = NAO;
        }      

      /* 5.3 atualize s variaveis para a proxima iteracao */
      antepenultimo = penultimo;
      penultimo = ultimo;
    }

  /* 6 escreva a resposta */
  if (alternante == SIM)
    {
      printf("A sequencia e' alternante.\n\n");
    }
  else
    {
      printf("A sequencia nao e' alternate.\n\n");
    }

  return 0;
}


/*
 * Solucao 3: colocaremos aqui qualquer solução que virmos e que 
 *            seja essencialmente diferente das anteriores.
 */

 

 

 


Last modified: Wed Apr 1 09:47:53 BRT 2009