MAC2166  Introdução à Computação para a Engenharia

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 resulta dos comandos printf. Para efeito de correção só será considerada a saída do programa.
# include <stdio.h>

int main(){
  int nusp, m, n, i, j, soma, cont;

  printf ("Entre com seu no. USP: ");
  /* na linha abaixo use o numero USP */
  scanf ("%d", &nusp); 
  printf ("nusp = %d\n", nusp);

  m = nusp % 3 + 2;
  n = 6 - m;
  printf("m = %d, n = %d\n", m, n);

  soma = 0;
  cont = 1;
  i = 1;
  j = 1;
  while (i <= m){
    if (j <= n && cont < 4){
      cont = cont + 1;
      soma = soma + i*n;
      printf("i = %d, j = %d, soma = %d\n", i, j, soma);
      j = j + 1;
    }
    else {
      j = 1;
      i = i + 1;
    }
  }

  /* O ultimo valor a ser impresso e' o da variavel cont */
  printf("i = %d, j = %d, cont = %d\n", i, j, cont);

  return 0;
}

SOLUÇÃO
A resposta depende do resto da divisão do seu número USP por 3. Teste com o seu no. USP e compare a resposta.

(0) nusp % 3 == 0. Veja os exemplos abaixo.

    Entre com seu no. USP: 1234560
    nusp = 1234560
    m = 2, n = 4
    i = 1, j = 1, soma = 4
    i = 1, j = 2, soma = 8
    i = 1, j = 3, soma = 12
    i = 3, j = 1, cont = 4

    Entre com seu no. USP: 12
    nusp = 12
    m = 2, n = 4
    i = 1, j = 1, soma = 4
    i = 1, j = 2, soma = 8
    i = 1, j = 3, soma = 12
    i = 3, j = 1, cont = 4

    Entre com seu no. USP: 0
    nusp = 0
    m = 2, n = 4
    i = 1, j = 1, soma = 4
    i = 1, j = 2, soma = 8
    i = 1, j = 3, soma = 12
    i = 3, j = 1, cont = 4

(1) nusp % 3 == 1.

    Entre com seu no. USP: 1234561
    nusp = 1234561
    m = 3, n = 3
    i = 1, j = 1, soma = 3
    i = 1, j = 2, soma = 6
    i = 1, j = 3, soma = 9
    i = 4, j = 1, cont = 4

    Entre com seu no. USP: 13
    nusp = 13
    m = 3, n = 3
    i = 1, j = 1, soma = 3
    i = 1, j = 2, soma = 6
    i = 1, j = 3, soma = 9
    i = 4, j = 1, cont = 4

    Entre com seu no. USP: 1
    nusp = 1
    m = 3, n = 3
    i = 1, j = 1, soma = 3
    i = 1, j = 2, soma = 6
    i = 1, j = 3, soma = 9
    i = 4, j = 1, cont = 4

(2) nusp % 3 == 2.

    Entre com seu no. USP: 1234562
    nusp = 1234562
    m = 4, n = 2
    i = 1, j = 1, soma = 2
    i = 1, j = 2, soma = 4
    i = 2, j = 1, soma = 8
    i = 5, j = 1, cont = 4

    Entre com seu no. USP: 14
    nusp = 14
    m = 4, n = 2
    i = 1, j = 1, soma = 2
    i = 1, j = 2, soma = 4
    i = 2, j = 1, soma = 8
    i = 5, j = 1, cont = 4

    Entre com seu no. USP: 2
    nusp = 2
    m = 4, n = 2
    i = 1, j = 1, soma = 2
    i = 1, j = 2, soma = 4
    i = 2, j = 1, soma = 8
    i = 5, j = 1, cont = 4

QUESTÃO 2

  Escreva um programa que recebe um inteiro positivo \texttt{n} e imprime todos os inteiros entre 1 e n que são quadrados pares. Exemplo:
    Entre com um inteiro: 100
    Quadrados pares:
    4
    16
    36
    64
    100

SOLUÇÃO

/*
 * Solucao 1: Eta solucao bonita, curta e simples.
 */
#include <stdio.h>

int main()
{
  int n, k;

  printf("Digite valor de n: ");
  scanf("%d", &n);

  printf("Quadrados pares:\n");
  for (k = 2; k*k <= n; k=k+2)
    printf("%d\n", k*k);

  return 0;
}

/*
 * Solucao 2: solucao 1 com while no lugar do for
 */
#include <stdio.h>

int main()
{
  int n, k;

  printf("Digite valor de n: ");
  scanf("%d", &n);

  printf("Quadrados pares:\n");
  k = 2; 
  while (k*k <= n)
    {
      printf("%d\n", k*k);
      k = k + 2;
    }

  return 0;
}


/*
 * Solucao 3: solucao arroz com feijao
 *            
 */
#include <stdio.h>

int main()
{

  int n, k;

  printf("Digite valor de n: ");
  scanf("%d", &n);

  printf("Quadrados pares:\n");
  k = 1; 
  while (k*k <= n)
    {
      if ((k*k)%2 == 0)
        {
          printf("%d\n", k*k);
        }
      k = k + 1;
    }

  return 0;
}

/*
 * Solucao 4: identica a solucao 4, com uma variavel
 *          para guardar o candidato a quadrado par.            
 */
#include <stdio.h>

int main(){

  int n, k;
  int quadrado; /* guarda k*k */

  printf("Digite valor de n: ");
  scanf("%d", &n);

  printf("Quadrados pares:\n");
  k = 1; 
  quadrado = 1;
  while (quadrado <= n)
    {
      if (quadrado%2 == 0)
        {
          printf("%d\n", quadrado);
        }
      k = k + 1;
      quadrado = k*k;
    }

  return 0;
}

/*
 * Solucao 5: solucao com mais arroz e com mais feijao
 *
 */
#include <stdio.h>

int main(){

  int n, k;
  int quadrado; 

  printf("Digite valor de n: ");
  scanf("%d", &n);

  printf("Quadrados pares:\n");
  k = 1; 
  while (k <= n)
    {
      quadrado = k*k;
      if (quadrado%2 == 0 && quadrado <= n)
        {
          printf("%d\n", quadrado);
        }
      k = k + 1;
    }

  return 0;
}

/*
 * Solucao 6: identica a solucao 5, imprime uma 
 *       mensagem apropriada se n<4.
 *
 */
#include <stdio.h>

int main(){

  int n, k;
  int quadrado; 

  printf("Digite valor de n: ");
  scanf("%d", &n);

  if (n >= 4)
    {
      printf("Quadrados pares:\n");
      k = 1; 
      while (k <= n)
	{
	  quadrado = k*k;
	  if (quadrado%2 == 0 && quadrado <= n)
	    {
	      printf("%d\n", quadrado);
	    }
	  k = k + 1;
	}
    }
  else
    {
      printf("Nao ha quadrados pares entre 1 e %d.\n",n);
    }

  return 0;
}

QUESTÃO 3

  Escreva um programa que recebe dois inteiros positivos representando uma fração e imprime a fração irredutível correspondente. Exemplos:
    Entre com dois inteiros: 8 12
    Fracao irredutivel: 2/3

    Entre com dois inteiros: 21 7
    Fracao irredutivel: 3/1

    Entre com dois inteiros: 2 9
    Fracao irredutivel: 2/9

    Entre com dois inteiros: 3 3
    Fracao irredutivel: 1/1
SOLUÇÃO
/*
 * Solucao 1: Solucao curta e simples.
 *
 */
#include <stdio.h>

int main(){

  int m, n, k, mdc;

  printf("Entre com dois inteiros: ");
  scanf("%d %d", &m, &n);

  /* calcule mdc(m,n) */
  mdc = 1;
  for (k = 2; k <= m; k++)
    if (m % k == 0 && n % k == 0)
      mdc = k;

  printf("Fracao irredutivel: %d/%d\n", m/mdc, n/mdc);

  return 0;
}

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

int main()
{
  int m, n, k, mdc;

  printf("Entre com dois inteiros: ");
  scanf("%d %d", &m, &n);

  /* calcule mdc(m,n) */
  mdc = 1;
  k = 2;
  while (k <= m) 
    {
      if (m % k == 0 && n % k == 0)
	mdc = k;
      k++;
    }

  printf("Fracao irredutivel: %d/%d\n", m/mdc, n/mdc);
  return 0;
}

/*
 * Solucao 3: nesta solucao o calculo do mdc esta implicito.
 *            
 */
#include <stdio.h>

int main()
{
  int m, n, k;

  printf("Entre com dois inteiros: ");
  scanf("%d %d", &m, &n);

  k = 2;
  while (k <= m && k <= n) 
    {
      if (m % k == 0 && n % k == 0)
        {
          m = m / k;
          n = n / k;
        }
      else
        {
	  k++;
	}
    }

  printf("Fracao irredutivel: %d/%d\n", m, n);
  return 0;
}

/*
 * Solucao 4: identica a solucao 3, um pouco mais eficiente.
 *            
 */
#include <stdio.h>

int main()
{
  int m, n, k;
  int min;

  printf("Entre com dois inteiros: ");
  scanf("%d %d", &m, &n);

  if (m < n) 
    {
      min = m;
    }
  else
    {
      min = n;
    }

  /* nao ha divisor de m e n maior que min */
  k = 2;
  while (k <= min) 
    {
      if (m % k == 0 && n % k == 0)
        {
          m = m / k;
          n = n / k;
        }
      else
        {
	  k++;
	}
    }

  printf("Fracao irredutivel: %d/%d\n", m, n);
  return 0;
}

/*
 * Solucao 5: identica a solucao 2. Usa o algoritmo de
 *            Euclides.
 */
#include <stdio.h>

int main()
{
  int m, n, mdc;
  int numerador, denominador, resto; 
  
  printf("Entre com dois inteiros: ");
  scanf("%d %d", &m, &n);

  /* calcule mdc(m,n) usando o algoritmo de Euclides */
  numerador   = m;
  denominador = n;
  resto = numerador % denominador;
  while (resto != 0) 
    {
      numerador = denominador;
      denominador = resto;
      resto = numerador % denominador;
    }
  mdc = denominador;

  printf("Fracao irredutivel: %d/%d\n", m/mdc, n/mdc);
  return 0;
}

/*
 * Solucao 6: identica a solucao 5. Usa o do-while no
 *            lugar de while. 
 * OBS: muitas turmas nao viram o do-while:
 *
 *   do 
 *      {
 *        [...lista de comandos...];
 *      }
 *    while (condicao);
 *
 * e' equivalente a
 *    
 *    [...lista de comandos...];
 *    while (condicao)
 *      {
 *        [...lista de comandos...];
 *      }
 */
#include <stdio.h>

int main()
{
  int m, n, mdc;
  int numerador, denominador, resto; 
  
  printf("Entre com dois inteiros: ");
  scanf("%d %d", &m, &n);

  /* calcule mdc(m,n) usando o algoritmo de Euclides */
  numerador   = m;
  denominador = n;
  do 
    {
      resto = numerador % denominador;
      numerador = denominador;
      denominador = resto;
    }
  while (resto != 0);
  mdc = numerador;

  printf("Fracao irredutivel: %d/%d\n", m/mdc, n/mdc);
  return 0;
}

 

 

 


Last modified: Fri May 7 09:37:09 BRT 2004