Buscar

2 Prova de MC102 2ºsemestre de 2013

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 3, do total de 9 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 6, do total de 9 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 9, do total de 9 páginas

Prévia do material em texto

MC102 – Algoritmos e Programac¸a˜o de Computadores
2o semestre de 2013 – Turmas Coordenadas
2a Prova (19/11/2013)
Nome:
RA: Turma:
Questa˜o Valor Nota
1 2,5
2 2,5
3 2,5
4 2,5
Total 10,0
Instruc¸o˜es
1. A durac¸a˜o da prova e´ de 100 minutos.
2. Na˜o e´ permitida consulta a qualquer material.
3. Somente sera˜o consideradas respostas nos espac¸os indicados.
4. Use o verso das folhas apenas como rascunho.
5. Celulares, pagers, calculadoras e demais dispositivos eletroˆnicos devem permanecer desligados
durante toda a prova.
6. Nenhum aluno sera´ autorizado a deixar a sala de prova antes que tenham decor-
ridos 60 minutos desde o seu in´ıcio.
7. Todo aluno que deixar a sala de prova devera´ entrega´-la em definitivo.
8. Todos os co´digos devem ser escritos em linguagem C.
9. Nas questo˜es que solicitam que seja completada uma func¸a˜o cujo esboc¸o ja´ e´ fornecido, cada
retaˆngulo em branco devera´ conter uma u´nica expressa˜o, ou enta˜o, um u´nico comando
simples em linguagem C, conforme o contexto.
10. Nas questo˜es onde sa˜o solicitados co´digos em C a clareza do programa sera´ um fator bastante
relevante para a avaliac¸a˜o. Considere fortemente tambe´m a possibilidade de adicionar
comenta´rios ao seu co´digo para que ele fique mais leg´ıvel.
Noite
1. Foi visto na disciplina MC102 que a linguagem C admite diferentes formas de passagem de
paraˆmetros para func¸o˜es.
No programa esboc¸ado abaixo, cada um dos s´ımbolos
%
,
U
,
 
e
P
devem ser substitu´ıdos por
expresso˜es, conforme mostrado a seguir:
%
: “a” ou “&a”
U
: “x” ou “?x”
 
: “b” ou “&b”
P
: “y” ou “?y”
Por exemplo, quando
%
= “a”,
U
= “x”,
 
= “&b” e
P
= “?y”, a linha correspondente a`
chamada da func¸a˜o P no programa principal sera´ P(a,&b). Ja´ o cabec¸alho da func¸a˜o torna-se
P(int x, int *y).
Observe atentamente o co´digo e perceba que a e b sa˜o varia´ves globais. Suponha que o valor lido
para a na entrada seja o u´ltimo d´ıgito do seu RA (i.e., o d´ıgito das unidades). Ale´m disso, suponha
que o valor lido para b na entrada seja o penu´ltimo d´ıgito do seu RA (i.e., o d´ıgito das dezenas).
Preencha o quadro abaixo com os valores de a e b lidos na entrada.
a: b:
Agora, indique na tabela a seguir os resultados que seriam impressos conforme os mecanismos de
passagem de paraˆmetros utilizados. Note que cada entrada da tabela deve conter duas respostas
correspondendo aos valores das varia´veis a e b, respectivamente.
/* programa da questao 1 */
#include <stdio.h>
/* declaracao das variaveis globais */
int a, b;
/* procedimento P */
void P ( int
U
, int
P
) {
U
=
P
* a + b;
P
=
U
* b + a;
}
/* inicio do programa principal */
int main() {
/* ler ultimo e penultimo digitos do RA */
scanf(“%d”, &a);
scanf(“%d”, &b);
/* executar o procedimento P */
P(
%
,
 
);
/* imprime os valores de a e b */
printf(“a: %d b: %d\n”, a, b);
return 0;
}
% U P
a: b:
a x b y
&a ?x b y
a x &b ?y
&a ?x &b ?y
2. Deseja-se implementar uma func¸a˜o em C cujo objetivo e´ determinar se em uma matriz bidimen-
sional existe uma linha e uma coluna indexadas pelo mesmo nu´mero e cuja soma dos seus elementos
e´ ideˆntica. Os paraˆmetros de entrada da func¸a˜o sa˜o, na ordem:
1. a: a matriz (dimensa˜o ma´xima 20× 20);
2. m: o nu´mero de linhas da matriz;
3. n: o nu´mero de colunas da matriz;
4. r: uma varia´vel que retornara´ o ı´ndice I tal que a soma dos elementos da linha I e da coluna
I sa˜o ideˆnticas ou, caso na˜o exista uma linha e coluna com essa propriedade, retornara´ o
valor −1. Existindo mais de uma linha e coluna com a propriedade procurada, r devera´ ter
o menor valor poss´ıvel.
O valor de retorno da func¸a˜o sera´ 1 (UM) caso exista a linha e a coluna, com mesmo ı´ndice,
satisfazendo a` propriedade procurada e 0 (ZERO) caso contra´rio.
Note que os ı´ndices das linhas e colunas comec¸am em 0 (ZERO).
A t´ıtulo de exemplo, considere as duas matrizes 3×4 (m = 3, n = 4) abaixo. Na matriz a` esquerda,
o retorno da func¸a˜o sera´ 0 (ZERO) enquanto a varia´vel r retornara´ o valor −1, uma vez que a soma
dos elementos de uma linha e uma coluna de mesmo ı´ndice sempre sa˜o diferentes (note que neste
caso os ı´ndices sa˜o sempre menores que 3 pois o ı´ndice ma´ximo de uma linha e´ 2). Na matriz a`
direita, o valor de retorno sera´ 1 (UM) e a varia´vel r retornara´ 0 (ZERO) uma vez que a soma da
linha e da coluna de ı´ndice I e´ o mesmo tanto para I = 0 quanto para I = 1.
 2 0 1 21 1 3 0
0 5 0 0

 1 0 0 00 2 0 0
0 0 3 1

Agora, seguindo as instruc¸o˜es contidas na folha de rosto, preencha os retaˆngulos em branco de
modo a completar corretamente o co´digo da func¸a˜o.
Fique atento aos comenta´rios e a` indentac¸a˜o do programa para entender a lo´gica do mesmo.
/* N: se existe um indice I tal que a soma dos elementos tanto da linha quanto da coluna I sao iguais,
retorna 1 com o parametro r igual ao indice I. Caso contrario, retorna 0 com o parametro r igual
a −1. */
int N(int a[20][20], int m, int n, int *r) {
/* variaveis locais */
int i, k, mindim=m; /* mindim: menor dimensao da matriz */
int somalin, somacol; /* soma dos elementos na linha e na coluna, respectivamente */
/* encontra a menor dimensao da matriz */
if (mindim > n) mindim = n;
/* verifica se existe linha e coluna de mesmo indice com a mesma soma de elementos */
for (i = 0 ; i < ; i++) {
somalin = 0;
/* calcula soma na linha */
for(k = 0 ; k < m ; k++) ;
somacol = 0;
/* calcula soma na coluna */
for(k = 0 ; k < n ; k++) ;
if ( ) {
;
return 1;
}
} /* fim do for externo */
;
return 0;
} /* fim da funcao N */
3. Suponha que para ter acesso a um determinado sistema, um usua´rio deve cadastrar uma senha.
Por razo˜es de seguranc¸a, para uma senha ser aceita, e´ necessa´rio que ela satisfac¸a a`s seguintes
regras:
1. a senha deve ser uma cadeia de caracteres contendo no mı´nimo 8 e no ma´ximo 10 caracteres.
2. a senha so´ deve conter letras, que podem ser tanto minu´sculas quanto maiu´sculas, e d´ıgitos
de 0 (ZERO) a 9.
3. a quantidade de d´ıgitos presentes na senha deve ser no mı´nimo 3 e no ma´ximo de 5.
4. a senha deve conter pelo menos 3 letras maiu´sculas.
5. as letras maiu´sculas na˜o podem ocorrer todas em posic¸o˜es consecutivas na senha (ou seja,
pelo menos entre duas letras maiu´sculas deve existir um ou mais d´ıgitos ou letras minu´sculas).
O programa mostrado na pro´xima pa´gina ja´ implementa as regras de 1 a 4. Leia atentamente
este co´digo, dando especial atenc¸a˜o aos comenta´rios pois eles ajudam bastante no entendimento da
lo´gica do programa.
Observe que o programa se utiliza das informac¸o˜es da tabela ASCII para a codificac¸a˜o de caracteres.
Caso voceˆ julgue conveniente, fac¸a uso da tabela ASCII mostrada na u´ltima folha da prova. A tabela
esta´ dividida em 4 grupos de 3 colunas. O caracter da coluna char em um deste grupos e´ codificado
pelo decimal correspondente na coluna dec. Por exemplo, a letra “L” (maiu´scula) e´ codificada pelo
decimal 76.
Use o espac¸o da pa´gina que se segue ao programa para escrever um co´digo em C que implemente a
func¸a˜o UltimaRegra que verifica a regra 5 descrita acima.
#include<stdio.h>
int UltimaRegra(char s[],int tam); /* prototipo da funcao a ser codificada */
int main() {
char senha[11]; int tam=0, i;
/* quantidade de digitos, letras maiusculas e minusculas, respectivamente */
int qd=0, qm=0, qM=0;
scanf("%s",senha); /* le a senha com pelo menos um caractere */
while (senha[tam] != ’\0’) tam++; /* calcula tamanho da senha */
if ( (tam < 8) || (tam > 10) ) { /* testa Regra 1 */
printf("tamanho da senha invalido (%d)\n",tam);
return 1;
}
/* conta quantidade de digitos, letras maiusculas e minusculas */
for (i=0; i<tam;i++) {
/* digitos de 0 a 9 ===> 48 <= codigo ASCII <= 57 */
if ( (senha[i]>47) && (senha[i]<58) ) qd++;
/* letra maiuscula ===> 65 <= codigo ASCII <= 90 */
if ( (senha[i]>64) && (senha[i]<91) ) qM++;
/* letra minuscula ===> 97 <= codigo ASCII <= 122 */
if ( (senha[i]>96) && (senha[i]<123) ) qm++;
}
if ( qM+qm+qd < tam ) { /* testa Regra 2 */
printf("senha contem caracteres invalidos (%d)\n",tam-qM-qd-qm);
return 2;
}
if ( (qd<3) || (qd>5) ) { /*testa Regra 3 */
printf("quantidade de numeros invalida (%d)\n",qd);
return 3;
}
if ( qM < 3 ) { /* testa Regra 4 */
printf("quantidade de letras maiusculas invalida (%d)\n",qM);
return 4;
}
if (!UltimaRegra(senha,tam)) { /* testa Ultima Regra */
printf("Ultima Regra nao satisfeita.\n");
return 5;
}
printf("senha valida (%s)\n",senha);
return 0;
}
Escreva abaixo o co´digo da func¸a˜o da questa˜o 3.
int UltimaRegra(char s[],int tam) {
} /* FIM DA FUNCAO */
4. Escreva o co´digo da func¸a˜o QPrimos cujo cabec¸alho e´ dado o qual, recebendo como paraˆmetro
de entrada um nu´mero inteiro n no intervalo (fechado) [0, 2147483647], retorna a quantidade de
d´ıgitos em n que sa˜o nu´meros primos (nota: um nu´mero inteiro d e´ primo se ele for maior ou
igual a 2 e os seus u´nicos divisores sa˜o 1 e o pro´prio d).
Exemplo: se n = 1220305, QPrimos deve retornar 4.
Importante: a sua func¸a˜o deve usar recursividade, caso contra´rio sua resposta sera´ considerada
errada.
int QPrimos(int n) { /* USE RECURSAO ! */
} /* FIM DA FUNCAO QPrimos */

Outros materiais