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 a, b, c, d, nusp;
  
  printf("Digite o seu no. USP: ");

  scanf("%d", &nusp); /* nesta linha use o seu numero USP */

  printf("nusp = %d\n", nusp);

  a = nusp % 10;
  b = (9 - a)*2 + 1;

  if (a < 5) 
    c = b/2;
  else 
    c = 9 - b/2;

  printf("a=%d b=%d c=%d\n", a, b, c);

  d = 14 - c;

  while (c > 0 || c + d > 1) {
    if (c == 1 && d == 2) {
      a = c;
      b = 0;
    }
    else {
      a = c;
      b = d;
    }
    d = a/2;
    c = b/2;
    printf("a=%d b=%d c=%d d=%d\n", a, b, c, d);
  }

  return 0;
}

SOLUÇÃO
A resposta 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 seu no. USP: 1234560
nusp = 1234560
a=0 b=19 c=9
a=9 b=5 c=2 d=4
a=2 b=4 c=2 d=1
a=2 b=1 c=0 d=1

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

Digite o seu no. USP: 1234561
nusp = 1234561
a=1 b=17 c=8
a=8 b=6 c=3 d=4
a=3 b=4 c=2 d=1
a=2 b=1 c=0 d=1

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

Digite o seu no. USP: 1234562
nusp = 1234562
a=2 b=15 c=7
a=7 b=7 c=3 d=3
a=3 b=3 c=1 d=1
a=1 b=1 c=0 d=0

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

Digite o seu no. USP: 1234563
nusp = 1234563
a=3 b=13 c=6
a=6 b=8 c=4 d=3
a=4 b=3 c=1 d=2
a=1 b=0 c=0 d=0

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

Digite o seu no. USP: 1234564
nusp = 1234564
a=4 b=11 c=5
a=5 b=9 c=4 d=2
a=4 b=2 c=1 d=2
a=1 b=0 c=0 d=0

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

Digite o seu no. USP: 1234565
nusp = 1234565
a=5 b=9 c=5
a=5 b=9 c=4 d=2
a=4 b=2 c=1 d=2
a=1 b=0 c=0 d=0

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

Digite o seu no. USP: 1234566
nusp = 1234566
a=6 b=7 c=6
a=6 b=8 c=4 d=3
a=4 b=3 c=1 d=2
a=1 b=0 c=0 d=0

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

Digite o seu no. USP: 1234567
nusp = 1234567
a=7 b=5 c=7
a=7 b=7 c=3 d=3
a=3 b=3 c=1 d=1
a=1 b=1 c=0 d=0

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

Digite o seu no. USP: 12345678
nusp = 12345678
a=8 b=3 c=8
a=8 b=6 c=3 d=4
a=3 b=4 c=2 d=1
a=2 b=1 c=0 d=1

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

Digite o seu no. USP: 1234569
nusp = 1234569
a=9 b=1 c=9
a=9 b=5 c=2 d=4
a=2 b=4 c=2 d=1
a=2 b=1 c=0 d=1

 

QUESTÃO 2

      Escreva um programa em C que dados um número inteiro n, n > 0, e uma seqüência de n números inteiros, determina quantos segmentos de números iguais consecutivos compõem essa seqüência.

Exemplos:

SOLUÇÃO

/*
 * Solucao 1: Solucao curta e simples.
 */
#include <stdio.h>

int main()
{
  int n,          /* numero de elementos da sequencia              */
      i,          /* contador de numeros lidos da sequencia        */
      atual,      /* numero da sequencia                           */
      anterior,   /* numero anterior da sequencia                  */
      seg_iguais; /* quantidade de segmentos de numeros iguais a   */ 

  printf("Digite o numero de elementos da sequencia: ");
  scanf("%d",&n);

  printf("Digite uma sequencia com %d numeros inteiros: ", n);

  /* inicializacoes */
  scanf("%d", &anterior);   /* anterior comeca com o primeiro da sequencia */
  seg_iguais = 1;           /* inicialmente temos um segmento              */

  for (i = 1; i < n; i++)
    {
      /* examine próximo número da sequencia */
      scanf("%d", &atual);

      /* comecou um novo segmento de numeros iguais? */
      if (atual != anterior)
        {
          seg_iguais = seg_iguais + 1; 
          anterior = atual;
        }
    }

  printf("Quantidade de segmentos de numeros iguais da sequencia = %d\n", seg_iguais);

  return 0;
}


/*
 * Solucao 2: identica a solucao 1 com 'while' no lugar de 'for'
 *           
 */
#include <stdio.h>

int main()
{
  int n,          /* numero de elementos da sequencia              */
      i,          /* contador de numeros lidos da sequencia        */
      atual,      /* numero da sequencia                           */
      anterior,   /* numero anterior da sequencia                  */
      seg_iguais; /* quantidade de segmentos de numeros iguais a   */ 

  printf("Digite o numero de elementos da sequencia: ");
  scanf("%d",&n);

  printf("Digite uma sequencia com %d numeros inteiros: ", n);

  /* inicializacoes */
  scanf("%d", &anterior);   /* anterior comeca com o primeiro da sequencia */
  seg_iguais = 1;           /* inicialmente temos um segmento              */

  i = 1;
  while (i < n)
    {
      /* examine próximo número da sequencia */
      scanf("%d", &atual);
      i = i + 1;

      /* comecou um novo segmento de numeros iguais? */
      if (atual != anterior)
        {
          seg_iguais = seg_iguais + 1; 
          anterior = atual;
        }
    }

  printf("Quantidade de segmentos de numeros iguais da sequencia = %d\n", seg_iguais);

  return 0;
}


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

QUESTÃO 3

      Dizemos que um número n pode ser quebrado nos números n1 e n2 se n pode ser escrito da forma n1n2, isto é, concatenado-se n1 com n2.

      Escreva um programa em C que, dados três inteiros positivos n, n1 e n2, verifica se n pode ser quebrado em n1 e n2.

      Suponha que o dígito 0 não aparece em nenhum dos números dados.

  Exemplos:

SOLUÇÃO
/*
 * Solucao 1: Solucao curta e simples.
 *
 */
#include <stdio.h>

int main()
{
  int n;   
  int n1;
  int n2;
  int pot10; 

  printf("Digite n, n1 e n2: ");
  scanf("%d %d %d", &n, &n1, &n2);

  /* determine a menor potencia de 10 maior que n2 */
  pot10 = 1;
  while (pot10 <= n2)
    {     
      pot10 = pot10 * 10;
    }

  /* verifique se n eh quebrado */
  if (n == n1*pot10 + n2)
    {
      printf("%d eh quebrado em %d e %d (%d==%d%d).\n", n, n1, n2, n, n1, n2); 
    }
  else
    {
      printf("%d nao eh quebrado em %d e %d (%d!=%d%d).\n", n, n1, n2, n, n1, n2); 
    }


  return 0;
}




/*
 * Solucao 2: solucao anterior sem as chaves superfluas.
 *          
 */
#include <stdio.h>

int main()
{
  int n;   
  int n1;
  int n2;
  int pot10; 

  printf("Digite n, n1 e n2: ");
  scanf("%d %d %d", &n, &n1, &n2);

  /* determine a menor potencia de 10 maior que n2 */
  pot10 = 1;
  while (pot10 <= n2)
      pot10 = pot10 * 10;

  /* verifique se n eh quebrado */
  if (n == n1*pot10 + n2)
      printf("%d eh quebrado em %d e %d (%d==%d%d).\n", n, n1, n2, n, n1, n2); 
  else
      printf("%d nao eh quebrado em %d e %d (%d!=%d%d).\n", n, n1, n2, n, n1, n2); 

  return 0;
}



/*
 * Solucao 3: solucao anterior com 'for' no lugar de 'while'
 *            
 */
#include <stdio.h>

int main()
{
  int n;   
  int n1;
  int n2;
  int pot10; 

  printf("Digite n, n1 e n2: ");
  scanf("%d %d %d", &n, &n1, &n2);

  /* determine a menor potencia de 10 maior que n2 */
  for (pot10=1; pot10 <= n2; pot10*=10);


  /* verifique se n eh quebrado */
  if (n == n1*pot10 + n2)
      printf("%d eh quebrado em %d e %d (%d==%d%d).\n", n, n1, n2, n, n1, n2); 
  else
      printf("%d nao eh quebrado em %d e %d (%d!=%d%d).\n", n, n1, n2, n, n1, n2); 

  return 0;
}


/*
 * Solucao 4: colocaremos aqui qualquer solução que virmos e que 
 *            seja essencialmente diferente da anterior.
 */

 

 

 


Last modified: Wed Apr 1 09:44:58 BRT 2009