Prévia do material em texto
INF01202 – ALGORITMOS E PROGRAMAÇÃO
Prof. Marcelo Walter – Prova 1 24/09/2014
NOME:_____________________GABARITO______________________________________
Para todos os programas, omita os cabeçalhos de bibliotecas e utilize identação para melhorar a
legibilidade dos programas.
1ª questão – (1,5 pontos)
Seja o programa a seguir (propositalmente sem comentários e identação). Apresente a saída em tela gerada
pela execução do mesmo.
#include <stdio.h>
#define TAM 6
int main()
{
int v[]={-1,1,0,-2,2,3};
int i,j, a=2, b=10;
for(i=0;i<TAM;i++)
{
if (v[i] > 0)
{
j=v[i];
while(j>0)
{
printf("%d\n", a * b);
a++;
b--;
j--;
}
}
}
return 0;
}
// Prova 1 - 2014/2 questao 1
// Interpretacao de Programas
// Marcelo Walter
#include <stdio.h>
#define TAM 6
int main()
{
int v[]={-1,1,0,-2,2,3};
int i,j;
int a=2, b=10;
for(i=0;i<TAM;i++){
if (v[i] > 0){
j=v[i];
while(j>0){
printf("%d\n", a * b);
a++;
b--;
j--;
}
}
}
return 0;
}
Saída em tela:
20
27
32
35
36
35
2ª questão – (3 pontos)
Foi feita uma pesquisa para determinar o perfil dos alunos que ingressaram na Ciência da Computação na
UFRGS num determinado semestre. Escreva um programa que:
1. Leia inicialmente o número total de alunos (n>0, faça validação) que prestaram vestibular para
Ciência da Computação no semestre;
2. Leia, em seguida num laço, um número indeterminado de informações sobre os alunos que
passaram no vestibular. Para cada aluno o programa deve ler o sexo do aluno ('m' para masculino e 'f'
para feminino) e o número de vezes que este aluno prestou vestibular. A última linha, que não entrará nos
cálculos, contém no lugar do sexo a letra ‘x’ (minúsculo). Este é o "sinal" para parar de ler dados.
Determine e imprima ao final da entrada de dados:
• a porcentagem de alunos que passaram no vestibular
• a porcentagem de alunos do sexo masculino que passaram no vestibular
• a porcentagem de alunos, independente de sexo, que prestou vestibular 3 ou mais vezes no período
OBS: Você não deve usar vetores nesta questão.
// Prova 1 - 2014/2 questao 2
// Marcelo Walter
#include <stdio.h>
#include <ctype.h>
int main()
{
int n, nm=0, nf=0, nvezes=0, v;
char sexo;
do{
printf("Entre com o total de alunos: ");
scanf("%d", &n);
if (n<=0) printf("Valor deve ser positivo e diferente de zero!\n");
}while (n<=0);
do{
printf("Entre com o sexo do aluno: ");
scanf(" %c", &sexo);
sexo = tolower(sexo);
switch(tolower(sexo)){
case 'm': printf("Entre com o nro de vezes do vestibular: ");
scanf("%d", &v);
if (v >= 3) nvezes++;
nm++;
break;
case 'f': printf("Entre com o nro de vezes do vestibular: ");
scanf("%d", &v);
if (v >= 3) nvezes++;
nf++;
break;
case 'x': break;
default: printf("Codigo invalido!\n");
}
}while (sexo != 'x');
// dados de saida
if (nm > 0 || nf > 0){
printf("Porc. de alunos que passaram no vestibular: %5.2f\n",
((float)(nm+nf)/n)*100 );
printf("Porc. de alunos do sexo masculino que passaram no vestibular: %5.2f\n",
((float)nm/(nm+nf))*100 );
printf("Porcentagem de alunos que prestaram vestibular 3 ou mais vezes: %5.2f\n",
((float)nvezes/(nm+nf))*100 );
}
return 0;
}
3ª questão – (2,5 pontos) Uma conta corrente bancária é composta por um código com 6 dígitos, além de um
dígito verificador (dv). Para se certificar de que um código de agência foi digitado corretamente, é feita a
comparação do dígito verificador (dv) por um outro dígito calculado (dc). O cálculo do dc é feito nos
algarismos do código da conta correspondente multiplicando-se os algarismos do código pelos números
primos (1, 2, 3, 5, 7 e 11) e o resto da divisão desta soma por 9, como mostrado abaixo:
a) Código da conta digitado = 250126 , dígito verificador digitado (dv = 7)
b) Soma dos produtos dos algarismos do código da agência pelos números primos:
sp = 2*1 + 5*2 + 0*3 + 1*5 + 2*7 + 6*11 = 97
c) Dígito verificador calculado (dc = resto da divisão de sp por 9) = 7
d) Como o dígito verificador dv é igual ao dígito calculado (dc) conclui-se que a conta foi digitada
corretamente.
Fazer um programa com 2 vetores: um para o código da conta (cc) e outro para os números primos (np),
conforme os passos abaixo:
a) declarar o vetor np com os números primos 1, 2, 3, 5, 7 e 11;
b) ler os algarismos do código da conta para o vetor cc e o dígito verificador dv do código da conta;
c) calcular o dígito verificador calculado, dc;
d) se dv ≠ dc, emitir mensagem de erro e encerrar o processamento;
e) se o código da conta foi digitado corretamente, imprimir o mesmo e a mensagem “Digitado
corretamente”.
// Prova 1 - 2014/2 questao 3
// Marcelo Walter - UFRGS
#include <stdio.h>
#define TAM 6
int main()
{
int cc[TAM], np[TAM]={1,2,3,5,7,11};
int dv=0, dc=0, i, sp=0;
printf("Entre com o codigo da conta: ");
for(i=0;i<TAM;i++)
scanf("%d", &cc[i]);
printf("Entre com o digito verificador: ");
scanf("%d", &dc);
for(i=0;i<TAM;i++)
sp += cc[i]*np[i];
printf("sp = %d\n", sp);
dv = sp % 9;
if (dc==dv) printf("Foram digitados corretamente!\n");
else printf("Digito errado!\n");
return 0;
}
4ª questão – (3 pontos)
Uma empresa de ônibus MW tem saídas diárias de Porto Alegre para outras cidades do Brasil, conforme
tabela abaixo:
Código Destino Tarifa
11 Florianópolis R$ 95.70
23 Uruguaiana R$ 112.20
55 Caxias do Sul R$ 45.55
62 Rio de Janeiro R$ 136.89
Faça um programa que exiba na tela a lista de destinos disponíveis com o valor da passagem e, em
seguida, receba como entrada o código do destino escolhido e a quantia em dinheiro recebida do
passageiro. Se o dinheiro recebido for insuficiente, imprima uma mensagem de erro; caso contrário,
calcule o troco e imprima na tela o destino escolhido, o valor da passagem e o valor do troco. O valor
digitado para o código de destino deve ser um dos valores válidos acima ou 99 para sair do programa.
// Prof. Marcelo Walter
// Prova 1 - questao 4 - 2014/2
#include <stdio.h>
#include <string.h>
#define NUM 4
int main()
{
int codigo[NUM]={11,23,55,62};
char cidades[NUM][20]={"Florianopolis", "Uruguaiana", "Caxias do Sul", "Rio de Janeiro"};
float precos[NUM] = {95.7, 112.2, 45.55, 136.89}, valor;
int i, op, cod, ind;
do{
printf("===== Codigos e Cidades ======\n");
for(i=0;i<NUM;i++)
printf("Cod = %d: %s passagem: R$%3.2f\n", codigo[i], cidades[i], precos[i]);
printf("==================================\n");
printf("Entre com o codigo de destino (99 para encerrar):\n");
scanf("%d", &cod);
switch(cod){
case 11: ind=0;
break;
case 23: ind=1;
break;
case 55: ind=2;
break;
case 62: ind=3;
break;
case 99: ind=-1;
printf("Programa encerrado!\n");
break;
default: ind=-1;
printf("Codigo destino invalido!\n");
}if (ind != -1){
printf("Entre com o valor: ");
scanf("%f", &valor);
if (valor>precos[ind]){
printf("Passagem comprada para %s com valor %3.2f com troco %3.2f\n\n",
cidades[ind], precos[ind], valor-precos[ind]);
}
else printf("Valor insuficiente para passagem!\n");
}
}while (cod != 99);
return 0;
}