MAC 2166 Introdução à Computação para Engenharia


PROVA 1

QUESTÃO 1.

Simule a execução do programa abaixo, destacando a sua saída. A saída do programa consiste de tudo que resulta dos comandos printf.

#include <stdio.h>
int main()
{
  int a, b, c, d, nusp;

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

  d = nusp % 10;
  a = 15;
  b = 10 * (4 + 3 * (d % 2));
  c = (5 / 2) * (9 - nusp % 5);

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

  if (c > a && c <= b)
     printf("Perfeito.\n");
  else
     printf("Otimo.\n");

  while (a % b > 0) {
     c = a;
     a = b;
     b = c % b;
     printf("a=%d b=%d c=%d \n", a, b, c);
  }

  return 0;
}

SOLUÇÃO.

A resposta depende, essencialmente, do último dígito do número USP. Teste com o seu no. USP e compare a resposta.

(0) último dígito do número USP == 0

Entre com o seu no. USP: 1230
nusp = 1230
a=15 b=40 c=18 
Perfeito.
a=40 b=15 c=15 
a=15 b=10 c=40 
a=10 b=5 c=15 

(1) último dígito do número USP == 1

Entre com o seu no. USP: 1231
nusp = 1231
a=15 b=70 c=16 
Perfeito.
a=70 b=15 c=15 
a=15 b=10 c=70 
a=10 b=5 c=15 


(2) último dígito do número USP == 2

Entre com o seu no. USP: 1232   
nusp = 1232
a=15 b=40 c=14 
Otimo.
a=40 b=15 c=15 
a=15 b=10 c=40 
a=10 b=5 c=15 


(3) último dígito do número USP == 3

Entre com o seu no. USP: 1233
nusp = 1233
a=15 b=70 c=12 
Otimo.
a=70 b=15 c=15 
a=15 b=10 c=70 
a=10 b=5 c=15 


(4) último dígito do número USP == 4

Entre com o seu no. USP: 1234
nusp = 1234
a=15 b=40 c=10 
Otimo.
a=40 b=15 c=15 
a=15 b=10 c=40 
a=10 b=5 c=15 


(5) último dígito do número USP == 5

Entre com o seu no. USP: 1235
nusp = 1235
a=15 b=70 c=18 
Perfeito.
a=70 b=15 c=15 
a=15 b=10 c=70 
a=10 b=5 c=15 


(6) último dígito do número USP == 6

Entre com o seu no. USP: 1236
nusp = 1236
a=15 b=40 c=16 
Perfeito.
a=40 b=15 c=15 
a=15 b=10 c=40 
a=10 b=5 c=15 

(7) último dígito do número USP == 7

Entre com o seu no. USP: 1237
nusp = 1237
a=15 b=70 c=14 
Otimo.
a=70 b=15 c=15 
a=15 b=10 c=70 
a=10 b=5 c=15 


(8) último dígito do número USP == 8

Entre com o seu no. USP: 1238
nusp = 1238
a=15 b=40 c=12 
Otimo.
a=40 b=15 c=15 
a=15 b=10 c=40 
a=10 b=5 c=15 


(9) último dígito do número USP == 9

Entre com o seu no. USP: 1239
nusp = 1239
a=15 b=70 c=10 
Otimo.
a=70 b=15 c=15 
a=15 b=10 c=70 
a=10 b=5 c=15 


QUESTÃO 2.

Os trechos de programa abaixo pretendem determinar a raiz quadrada inteira de um inteiro n > 0, que é definido como o maior inteiro r tal que r2 <= n. Exemplo: raiz quadrada inteira de 10 é 3, de 21 é 4 e de 25 é 5.

Considere que todas as variáveis que aparecem no programa estão declaradas como int. Indique se o trecho está correto (C) ou incorreto (I). Para os trechos incorretos, apresente um valor de n para o qual a saída do programa (o printf) é incorreta. Nesta questão, para cada resposta errada será descontado 0.25 pontos de uma resposta correta. Respostas em branco não serão consideradas erradas.

  scanf("%d", &n);
  r = 0;
  while (r*r < n) r++;
  printf("A raiz inteira de %d e': %d\n", n, r);

                    C [___]     I [_X_] -> Saída: A raiz inteira de _10_ e': _4_

Comentário: para n==10 o resultado é r==4, deveria ser r==3. Funciona para quadrados perfeitos (números da forma k2 para algum k), por exemplo, para n==9 o trecho determina que r==3.

  scanf("%d", &n);
  menor = 1;
  for (r = 0; menor == 1; r++)
    if (r*r > n) menor = 0;
  printf("A raiz inteira de %d e': %d\n", n, r-2);

                    C [_X_]     I [___] -> Saída: A raiz inteira de ___ e': ___

Comentário: note que quando o comando for pára logo após incrementar r (através do comando r++) e que nesse momento vale que (r-1)*(r-1) > n e (r-2)*(r-2) <= n. Note ainda que o trecho imprime, corretamente, r-2.

  scanf("%d", &n);
  r = 0;
  menor = 1;
  while (menor == 1) {
    if (r*r >= n) menor = 0;
    r++;
  }
  printf("A raiz inteira de %d e': %d\n", n, r-1);


                    C [___]     I [_X_] -> Saída: A raiz inteira de _10_ e': _4_

Comentário: para n==10 o trecho acima imprime 4, deveria ser 3. Funciona para quadrados perfeitos (números da forma k2 para algum k), por exemplo, para n==9 o trecho determina que r==3.

  scanf("%d", &n);
  r = n;
  while (r*r > n) r++;
  printf("A raiz inteira de %d e': %d\n", n, r);

                    C [___]     I [_X_] -> Saída: A raiz inteira de ___ e': ___

Comentário: incorreto, looping infinito.

  scanf("%d", &n);
  for (r = n; r*r > n; r--);
  printf("A raiz inteira de %d e': %d\n", n, r);  

                    C [_X_]     I [___] -> Saída: A raiz inteira de ___ e': ___

Comentário: note que quando o comando for pára vale que r*r <= n e (r+1)*(r+1) > n. Logo, r é a raiz quadrada inteira de n.


QUESTÃO 3

Escreva um programa em C que, dado um inteiro n > 0 e uma seqüência de n números inteiros, imprime o maior e o menor elemento da seqüência.

Exemplos:

Para n == 4 e a seqüência

       12       3        7       49   

o seu programa de imprimr

       Maior = 49  e  Menor = 3

Para n == 4 e a seqüência

      -12      -3       -7      -49
o seu programa deve imprimir
       Maior = -3  e  Menor = -49

Para n = 1 e a seqüência

        5
o seu programa deve imprimir
       Maior = 5   e  Menor = 5

SOLUÇÃO.

/*
 * VERSÃO 1: usa o comando while.
 */

#include <stdio.h>

int main()
{
  int n;      /* numero de elementos a serem lidos */
  int numero; /* usado para ler os elementos da sequencia */
  int maior;  /* maior elemento lido */
  int menor;  /* menor elemento lido */

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

  printf("Digite um elemento da sequencia: ");
  scanf("%d", &menor);
  n--;
  maior = menor;

  while (n > 0) 
    {
      printf("Digite um elemento da sequencia: ");
      scanf("%d", &numero);
      n--;
      if (numero < menor)
	{
	  menor = numero;
	}
      if (numero > maior) 
	{
	  maior = numero;
	}
    }
  
  printf("Maior = %d  e  Menor = %d\n.", maior, menor);

  return 0;
}

/*
 * VERSÃO 2: identica a versão 1, usa o comando while e if-else.
 */

#include <stdio.h>

int main()
{
  int n;      /* numero de elementos a serem lidos */
  int numero; /* usado para ler os elementos da sequencia */
  int maior;  /* maior elemento lido */
  int menor;  /* menor elemento lido */

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

  printf("Digite um elemento da sequencia: ");
  scanf("%d", &menor);
  n--;
  maior = menor;

  while (n > 0) 
    {
      printf("Digite um elemento da sequencia: ");
      scanf("%d", &numero);
      n--;
      if (numero < menor)
	{
	  menor = numero;
	}
      else if (numero > maior) 
	{
	  maior = numero;
	}
    }
  
  printf("Maior = %d  e  Menor = %d\n.", maior, menor);

  return 0;
}

/*
 * VERSÃO 3: Usa o comando for e um contador de numeros lidos.
 */

#include <stdio.h>

int main()
{
  int n;      /* numero de elementos na sequencia */
  int i;      /* numero de elementos lidos */ 
  int numero; /* usado para ler os elementos da sequencia */
  int maior;  /* maior elemento lido */
  int menor;  /* menor elemento lido */

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

  printf("Digite o 1o. elemento da sequencia: ");
  scanf("%d", &menor);
  maior = menor;

  for (i = 1; i < n; i++)
    {
      printf("Digite o %do. elemento da sequencia: ", i+1);
      scanf("%d", &numero);
      if (numero < menor) menor = numero;
      if (numero > maior) maior = numero;
    }
  
  printf("Maior = %d  e  Menor = %d\n.", maior, menor);

  return 0;
}

/*
 * VERSÃO 4: identica a versao 3, usa o comando for e if-else
 */

#include <stdio.h>

int main()
{
  int n;      /* numero de elementos na sequencia */
  int i;      /* numero de elementos lidos */ 
  int numero; /* usado para ler os elementos da sequencia */
  int maior;  /* maior elemento lido */
  int menor;  /* menor elemento lido */

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

  printf("Digite o 1o. elemento da sequencia: ");
  scanf("%d", &menor);
  maior = menor;

  for (i = 1; i < n; i++)
    {
      printf("Digite o %do. elemento da sequencia: ", i+1);
      scanf("%d", &numero);
      if (numero < menor)
        menor = numero;
      else if (numero > maior)
        maior = numero;
    }
  
  printf("Maior = %d  e  Menor = %d\n.", maior, menor);

  return 0;
}


QUESTÃO 4

Um caixa de banco tem somente notas de a e b reais para fornecer aos seus clientes. Quando um cliente chega com um cheque no valor de c reais, o caixa precisa fazer umas contas para decidir se é ou não possível descontar o cheque.

Escreva um programa em C que resolva o problema do caixa de banco: dados inteiros positivos a, b, c, o seu programa imprime um número de notas de a reais e um número de notas de b reais, totalizando c reais, ou imprime um mensagem dizendo que não é possível descontar o cheque.

Observação: Para certos valores de a, b e c, o problema pode ter mais de uma resposta.

Exemplos:

Para a==5, b==3 e c==11 seu programa deve imprimir

 
     1 nota(s) de 5 e 2 nota(s) de 3

Para a==3, b==5 e c==30 seu programa deve imprimir uma das respostas abaixo:

   10 nota(s) de 3 e 0 nota(s) de 5
    5 nota(s) de 3 e 3 nota(s) de 5
    0 nota(s) de 3 e 6 nota(s) de 5

Para a==5, b==3 e c==7 seu programa deve imprimir

    Nao e' possivel descontar o cheque

Para a==4, b==6 e c=121 seu programa deve imprimir

    Nao e' possivel descontar o cheque

SOLUÇÃO

/*
 * VERSÃO 1.
 */
#include <stdio.h>
#define VERD 1
#define FALSO 0

int main() {
  int a, b, c, 
    achou, /* achou o numero de notas de a e b */
    na, /* quantidade de notas de a usadas para descontar o cheque */
    nb; /* quantidade de notas de b usadas para descontar o cheque */

  printf("Digite os valores de a, b e c: ");
  scanf("%d %d %d", &a, &b, &c);

  achou = FALSO; 
  for (na = 0; na*a <= c && achou == FALSO; na++) { /* tentar todos os possiveis valores de na */
    for (nb = 0; na*a + nb*b < c; nb++);  /* com na fixo, vamos tentar todos os valores de nb */
    if (na*a + nb*b == c)
      achou = VERD;
    else
      nb = 0;
  }

  if (achou == VERD)
    printf("%d notas de %d e %d notas de %d\n", na-1, a, nb, b);
  else
    printf("Nao e' possivel descontar o cheque.\n");

  return 0;
}


/*
 * VERSÃO 2. Neste versao o programa para (return 0) logo apos imprimir
 *           uma possivel solucao.
 *         
 */

#include  <stdio.h>

int main() {
  int a, b, c,
    na, /* quantidade de notas de a para descontar o cheque */
    nb; /* quantidade de notas de b para descontar o cheque */

  printf("Digite os valores de a, b e c: ");
  scanf("%d %d %d", &a, &b, &c);

  for (na = 0; na*a <= c; na++) { /* tentar todos os possiveis valores de na */
    if ((c - na*a)%b == 0) { /* o que falta da' para ser dado em notas de b? */
      nb = (c - na*a)/b;
      printf("%d notas de %d e %d notas de %d\n", na, a, nb, b);
      return 0;
    }
  }

  printf("Nao e' possivel descontar o cheque.\n");

  return 0;
}

/*
 * VERSÃO 3. 
 */

#include <stdio.h>

int main() {
  int a, b, c,
    na, /* quantidade de notas de a para descontar o cheque */
    nb; /* quantidade de notas de b para descontar o cheque */

  printf("Digite os valores de a, b e c: ");
  scanf("%d %d %d", &a, &b, &c);

  na = 0; 
  nb = 0;
  while (na*a + nb*b < c) { /* vamos tentar tentar todos os valores de na */
    /* com na fixo, vamos tentar todos os valores de nb */s
    for (nb = 0; na*a + nb*b < c; nb++); 
    if (na*a + nb*b > c) {
       na++;
       nb = 0;
    }
    /* else achamos os valores de na e nb e o while vai terminar */
  }

  if (na*a + nb*b == c)
    printf("%d notas de %d e %d notas de %d\n", na, a, nb, b);
  else 
    printf("Nao e' possivel descontar o cheque.\n");

  return 0;
}

/*
 * VERSÃO 4. Identica a versao 2. Da' para perceber isto? 
 */

#include  <stdio.h>

int main()
{
  int a, b, c; 
  int  nb; /* quantidade de notas de b usadas para descontar o cheque */
  
  printf("Digite os valores de a, b e c: ");
  scanf("%d %d %d", &a, &b, &c);

  nb = 0;  
  while (c > 0 && c % a != 0) 
    {
      c  = c  - b;
      nb = nb + 1;
    }
  
  if (c >= 0)
    printf("%d notas de %d e %d notas de %d\n", c/a, a, nb, b);
  else
    printf("Nao e' possivel descontar o cheque.\n");

  return 0;
}

/*
 * VERSÃO 5. Identica as versoes 2 e 4. Usa o comando for e o 
 *           programa para (return 0) logo apos imprimir uma 
 *           possivel solucao.
 */

#include  <stdio.h>

int main()
{
  int a, b, c; 
  int  nb; /* quantidade de notas de b usadas para descontar o cheque */
  
  printf("Digite os valores de a, b e c: ");
  scanf("%d %d %d", &a, &b, &c);

  nb = 0; 
  while (c >= 0)
    {
      if (c % a == 0) 
	{
	  printf("%d notas de %d e %d notas de %d\n", c/a, a, nb, b);
          return 0;
	}
      c  = c  - b;
      nb = nb + 1;
    }
  
  printf("Nao e' possivel descontar o cheque.\n");
  return 0;
}



Last modified: Mon Apr 14 13:24:11 EST 2003