Buscar

Introdução à Programação - Poli - P1 - em C - 2004

Prévia do material em texto

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
	Prova 1
	QUESTÃO 1
	QUESTÃO 2
	QUESTÃO 3

Continue navegando