Vous êtes sur la page 1sur 9

MC102 Algoritmos e Programac

ao de Computadores
2o semestre de 2013 Turmas Coordenadas
2a Prova (19/11/2013)

Nome:
RA:

Turma:

Questao
1
2
3
4
Total

Valor
2,5
2,5
2,5
2,5
10,0

Nota

Instru
c
oes
1. A durac
ao da prova e de 100 minutos.
2. Nao e permitida consulta a qualquer material.
3. Somente ser
ao consideradas respostas nos espacos indicados.
4. Use o verso das folhas apenas como rascunho.
5. Celulares, pagers, calculadoras e demais dispositivos eletronicos devem permanecer desligados
durante toda a prova.
6. Nenhum aluno ser
a autorizado a deixar a sala de prova antes que tenham decorridos 60 minutos desde o seu incio.
7. Todo aluno que deixar a sala de prova dever
a entreg
a-la em definitivo.
8. Todos os c
odigos devem ser escritos em linguagem C.
9. Nas quest
oes que solicitam que seja completada uma funcao cujo esboco ja e fornecido, cada
retangulo em branco dever
a conter uma u
nica express
ao, ou entao, um u
nico comando
simples em linguagem C, conforme o contexto.
10. Nas quest
oes onde s
ao solicitados codigos em C a clareza do programa sera um fator bastante
relevante para a avaliac
ao. Considere fortemente tambem a possibilidade de adicionar
coment
arios ao seu c
odigo para que ele fique mais legvel.

Noite

1. Foi visto na disciplina MC102 que a linguagem C admite diferentes formas de passagem de
parametros para func
oes.
No programa esbocado abaixo, cada um dos smbolos , ,
e
devem ser substitudos por
expressoes, conforme mostrado a seguir:

%U

% : 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
ao P no programa principal sera P(a,&b). Ja o cabecalho da funcao torna-se
P(int x, int *y).
Observe atentamente o c
odigo e perceba que a e b sao vari
aves globais. Suponha que o valor lido
para a na entrada seja o u
ltimo dgito do seu RA (i.e., o dgito das unidades). Alem disso, suponha
que o valor lido para b na entrada seja o pen
ultimo dgito do seu RA (i.e., o dgito 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 par
ametros utilizados. Note que cada entrada da tabela deve conter duas respostas
correspondendo aos valores das vari
aveis a e b, respectivamente.
/* programa da questao 1 */
#include <stdio.h>
/* declaracao das variaveis globais */
int a, b;
/* procedimento P */
void P ( int
, int
){
=
* a + b;
=
* b + a;
}

U P
P U

/* 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

&a

?x

&b

?y

&a

?x

&b

?y

a:

b:

2. Deseja-se implementar uma func


ao em C cujo objetivo e determinar se em uma matriz bidimensional existe uma linha e uma coluna indexadas pelo mesmo n
umero e cuja soma dos seus elementos
e identica. Os par
ametros de entrada da funcao sao, na ordem:
1. a: a matriz (dimens
ao m
axima 20 20);
2. m: o n
umero de linhas da matriz;
3. n: o n
umero de colunas da matriz;
4. r: uma vari
avel que retornar
a o ndice I tal que a soma dos elementos da linha I e da coluna
I sao identicas ou, caso n
ao exista uma linha e coluna com essa propriedade, retornar
a o
valor 1. Existindo mais de uma linha e coluna com a propriedade procurada, r dever
a ter
o menor valor possvel.
O valor de retorno da func
ao ser
a 1 (UM) caso exista a linha e a coluna, com mesmo ndice,
satisfazendo `
a propriedade procurada e 0 (ZERO) caso contrario.
Note que os ndices das linhas e colunas comecam em 0 (ZERO).
A ttulo de exemplo, considere as duas matrizes 3 4 (m = 3, n = 4) abaixo. Na matriz `a esquerda,
o retorno da func
ao ser
a 0 (ZERO) enquanto a variavel r retornara o valor 1, uma vez que a soma
dos elementos de uma linha e uma coluna de mesmo ndice sempre sao diferentes (note que neste
caso os ndices s
ao sempre menores que 3 pois o ndice maximo de uma linha e 2). Na matriz `
a
direita, o valor de retorno ser
a 1 (UM) e a variavel 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 2

1 1 3 0
0 5 0 0

1 0 0 0

0 2 0 0
0 0 3 1

Agora, seguindo as instruc


oes contidas na folha de rosto, preencha os retangulos em branco de
modo a completar corretamente o c
odigo da funcao.
Fique atento aos coment
arios e `
a indentacao do programa para entender a logica 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 */
; i++) {

for (i = 0 ; 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 usuario deve cadastrar uma senha.
Por razoes de seguranca, para uma senha ser aceita, e necessario que ela satisfaca `as seguintes
regras:
1. a senha deve ser uma cadeia de caracteres contendo no mnimo 8 e no maximo 10 caracteres.
2. a senha s
o deve conter letras, que podem ser tanto min
usculas quanto mai
usculas, e dgitos
de 0 (ZERO) a 9.
3. a quantidade de dgitos presentes na senha deve ser no mnimo 3 e no maximo de 5.
4. a senha deve conter pelo menos 3 letras mai
usculas.
5. as letras mai
usculas n
ao podem ocorrer todas em posicoes consecutivas na senha (ou seja,
pelo menos entre duas letras mai
usculas deve existir um ou mais dgitos ou letras min
usculas).
O programa mostrado na pr
oxima p
agina ja implementa as regras de 1 a 4. Leia atentamente
este codigo, dando especial atenc
ao aos comentarios pois eles ajudam bastante no entendimento da
logica do programa.
Observe que o programa se utiliza das informacoes da tabela ASCII para a codificacao de caracteres.
Caso voce julgue conveniente, faca 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 (mai
uscula) e codificada pelo
decimal 76.
Use o espaco da p
agina que se segue ao programa para escrever um codigo em C que implemente a
funcao 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 c
odigo da func
ao da questao 3.
int UltimaRegra(char s[],int tam) {

} /* FIM DA FUNCAO */

4. Escreva o c
odigo da func
ao QPrimos cujo cabecalho e dado o qual, recebendo como parametro
de entrada um n
umero inteiro n no intervalo (fechado) [0, 2147483647], retorna a quantidade de
dgitos em n que s
ao n
umeros primos (nota: um n
umero inteiro d e primo se ele for maior ou
igual a 2 e os seus u
nicos divisores s
ao 1 e o pr
oprio d).
Exemplo: se n = 1220305, QPrimos deve retornar 4.
Importante: a sua func
ao deve usar recursividade, caso contrario sua resposta sera considerada
errada.
int QPrimos(int n) { /* USE RECURSAO ! */

} /* FIM DA FUNCAO QPrimos */

Vous aimerez peut-être aussi