Universidade Federal do Rio de Janeiro Centro de Ciências Matemáticas e da Natureza Instituto de Matemática Departamento de Ciência da Computação Computação para Informática - Prof. Adriano Joaquim dm Oliveira Cruz Segunda Prova - 04 de dezembro de 2006 Nome: Assinatura: 1 Questões de Múltipla Escolha Nesta parte da prova você deve resolver 10 questões de múltipla escolha. Escolha uma das cinco opções oferecidas em cada uma das questões. Observe que cada uma das questões vale 0,5 ponto. Não deixe nenhuma resposta sem marcação. 1 a Questão: Considere o seguinte programa: int d [6] = 10, 33, 47, 13, 22, 55; int i, m1, m2 ; for (i =0; i <5; i ++) i f (d[i] > d[i +1]) m1 = d[i ]; m2 = d [0]; for (i =0; i <6; i ++) i f (d[i] > m2 ) m2 = d[i ]; printf ("%d %d ", m1, m2 ); (a) 47 47 (b) 55 55 (c) 55 47 (d) 47 55 (e) 10 55 1
2 a Questão: Considere o seguinte programa: #include < string.h > char pm ( char c) i f (c >= 'A ' && c <= 'Z ') return c - 'A ' + 'a '; return c; int main (void ) char * texto = " Esta e uma pequena frase."; char *v = " aeiou "; int i = 0, j, c = 0; while ( texto [i ]) for (j = 0; j < strlen (v ); j ++ ) i f ( pm ( texto [i ]) == v[j ]) c ++; break; i ++; printf ("%d\n", c ); (a) 13 (b) 10 (c) 11 (d) 12 (e) 25 3 a Questão: Considere o seguinte programa: 1 2 #include < stdlib.h > 3 4 5 char * p1, p2 ; 6 7 p2 = malloc ( sizeof (char )); 8 p1 = p2 ; 9 * p2 = 'c '; 10 printf ("%c", * p1 ); 11 12 13 2
O gcc indicou um erro durante a compilação deste trecho de programa. Para corrigi-lo o que deve ser feito? (a) Faltou incluir uma linha após a linha 8 para alocar memória para o ponteiro p1. (b) Faltou indicar quantos caracteres o ponteiro p2 irá apontar na linha 8. (c) Incluir p2 no comando printf na linha 12. (d) Faltou colocar um asterisco antes de p2 na linha 5. (e) Nenhuma das respostas anteriores. 4 a Questão: Considere o seguinte programa: #include < string.h > int i, j; char nome [80], c; gets ( nome ); for (i =0, j= strlen ( nome ) -1; i < strlen ( nome ); i ++, j - -) c = nome [i ]; nome [i] = nome [j ]; nome [j ]= c; puts ( nome ); O que será impresso caso a cadeia de caracteres fornecida seja 87654321? (a) 87654321 (b) 43218765 (c) 18726354 (d) 67891234 (e) 12345678 5 a Questão: Considere o seguinte programa: int i, j; for (i =1; i <=5; i ++) for (j =0; j <5; j ++) i f ( j < i) printf ("%d", j ); printf ("\n" ); 3
O que será impresso por este programa? (a) 1 (b) 00000 (c) 0 (d) 01234 (e) 12345 12 11111 01 0123 1234 123 22222 012 012 123 1234 33333 0123 01 12 12345 44444 01234 0 1 6 a Questão: Considere o seguinte programa: #define TAM 8 typedef struct _PILHA int pilha [ TAM ]; int topo ; PILHA ; void inserepilha ( int valor, PILHA * p) Inserir dois comandos aqui PILHA p; p. topo = -1; inserepilha (10, &p ); inserepilha (20, &p ); printf ("%d %d\n", p. pilha [0], p. pilha [1]); Quais dois comandos devem ser incluídos no trecho indicado na listagem para que os valores 10 e 20 sejam impressos pelo programa? (a) pilha[topo] = valor; topo++; (b) topo++; pilha[topo] = valor; (c) p.topo++; p.pilha[p.topo] = valor; (d) p->pilha[p->topo] = valor; p->topo++; (e) p->topo++; p->pilha[p->topo] = valor; 4
7 a Questão: Considere o seguinte programa: int umavariavel = 10; void Funcao () umavariavel ++; void OutraFuncao ( int v) v ++; int umavariavel = 5; printf ("%d, ", umavariavel ); Funcao (); printf ("%d, ", umavariavel ); OutraFuncao ( umavariavel ); printf ("%d, ", umavariavel ); MaisUmaFuncao (& umavariavel ); printf ("%d, ", umavariavel ); void MaisUmaFuncao ( int * c) printf ("%d, ", umavariavel ); *c += 1; (a) 5, 5, 6, 10, 7, (b) 5, 5, 5, 11, 6, (c) 5, 6, 7, 10, 8, (d) 5, 5, 5, 10, 6, (e) 5, 5, 6, 11, 6, 8 a Questão: Considere o seguinte programa: #include < string.h > char * nome = " computacao "; char *p, *q; p = nome ; q = p + strlen ( nome ) - 1; while (p < q ) printf ("%c %c;", *p, *q ); p ++; q - -; 5
(a) c o;m p;u t;a c;a o; (b) c o;o a;m c;p a;u t; (c) c t;o a;m c;p a;u o; (d) u o;p a;m c;o a;c t; (e) u t;p a;m c;o a;c a; 9 a Questão: Considere o seguinte programa: int matriz [5][5]; int i, j; FILE * pa ; char * nomearquivo = " dados. txt "; i f (!( pa = fopen ( nomearquivo, "r" ))) return 1; for (i =0; i <5 ; i ++) for (j =0; j <5 ; j ++) fscanf (pa, "%d", & matriz [i ][ j ]); for (i =0; i <5; i ++) printf ("%d ", matriz [i ][ i ]); for (i =0; i <5; i ++) printf ("%d ", matriz [i ][4 - i ]); for (i =0; i <5; i ++ ) printf ("%d ", matriz [i ][ i /2]); Este programa se chama teste6.exe. Para executá-lo, o usuário digitou a seguinte linha de comando: teste6 informatica 3 7 (a) forma (b) orma (c) ormat (d) inf (e) informa 6
10 a Questão: Considere o seguinte programa: int matriz [5][5]; int i, j; FILE * pa ; char * nomearquivo = " dados. txt "; i f (!( pa = fopen ( nomearquivo, "r" ))) return 1; for (i =0; i <5 ; i ++) for (j =0; j <5 ; j ++) fscanf (pa, "%d", & matriz [i ][ j ]); for (i =0; i <5; i ++) printf ("%d ", matriz [i ][ i ]); for (i =0; i <5; i ++) printf ("%d ", matriz [i ][4 - i ]); for (i =0; i <5; i ++ ) printf ("%d ", matriz [i ][ i /2]); Este arquivo leu o seguinte arquivo de dados: 1 2 3 4 5 10 20 30 40 50 100 200 300 400 500 1000 2000 3000 4000 5000 10000 20000 30000 40000 50000 (a) 1 2 3 4 5 ; 1 20 300 4000 50000 ; 5 40 300 2000 10000 ; (b) 1 20 300 4000 50000 ; 5 4 30 300 2000; 3 30 300 3000 30000 ; (c) 1 20 300 4000 50000 ; 5 40 300 2000 10000 ; 1 10 200 2000 30000 ; (d) 1 10 100 1000 10000 ; 1 20 300 4000 50000 ; 1 1 200 2000 30000 ; (e) 1 20 300 4000 50000 ; 5 40 300 2000 10000 ; 1 10 200 1000 20000 ; 7
2 Programas Nesta seção você deverá escrever 2 programas. Cada um dos problemas vale 2.5 pontos. 1 a Problema: A maioria dos fãs de palavras cruzadas estão acostumados com anagramas, que são grupos de palavras com as mesmas letras, mas em ordem diferentes. Por exemplo: Poti, Tipo; ViDA, DiVa; AmoRA, aroma. Algumas palavras, todavia, não têm este atributo, não importa como você rearrange as letras não é possível formar outra palavra válida. Estas palavras são chamadas de ananagramas. Escreva um programa que leia uma série de pares de palavras e diga os pares que formam anagramas. Observe que palavras com uma única letra são por denições anagramas já que elas não podem ser arranjadas. Dica: Observe que anagramas são formados pelo mesmo conjunto de letras e, portanto, a freqüência de cada uma das letras é igual nas duas palavras. Entrada A entrada consiste de uma série de linhas com pares de palavras. Nenhuma palavra terá mais do que 20 caracteres que podem ser maiúsculas e/ou minúsculas. Espaços podem aparecer livremente em torno das palavras, mas pelo menos um espaço aparece entre as palavras. Observar que palavras que contém as mesmas letras mesmo que de caixas diferentes são consideradas anagramas. Por exemplo: vida e diva. A entrada termina por uma linha com dois caracteres # #, separados por pelo menos um espaço. Saída A saída consistirá de uma série de linhas informando se as palavras lidas são anagramas. Exemplo da Entrada: voo Ovo Hoje jeho pito TiPO dia noite # # Exemplo Saída: Anagramas Anagramas Anagramas Nao anagramas 8
Solução do programa 1 9
2 a Problema: Considere a estrutura denida abaixo que armazena informações sobre um robot andando em um mundo plano com origem (0,0) no canto superior esquerdo. typedef struct robot int posx, posy ; /* posicao atual do robot */ int passos ; /* passos dado pelo robot desde o início */ ROBOT ; O robot anda de acordo com ordens dada por um jogador através do teclado. O mundo é um quadrado de tamanho igual a 80 por 80, ou seja o robot não pode ir para coordenadas negativas nem maiores que 79. Uma ordem que faça o robot se mover para fora destes limites faz com que ele que parado no mesmo lugar. O membro da estrutura ROBOT chamado passos armazena quantos passos o robot realmente andou, portanto somente ordens que o façam andar aumentam o número de passos. Escreva um programa que obedeça as ordens dadas por um usuário. Uma ordem é dada pelo jogador através de caracteres que podem ser letras maiúsculas ou minúsculas. As seguintes ordens são possíveis: N: Anda na direção norte; S: Anda na direção sul; L: Anda na direção leste; O: Anda na direção oeste; Entrada A entrada consiste de várias linhas de caracteres contendo o conjunto de ordens que o robot deve obedecer. Para cada linha lida considerar que o robot começa na posição (39,39) do mundo. Nenhum conjunto pode ter mais de 80 caracteres. Os caracteres podem ser letras maiúsculas ou minúsculas. O programa termina quando um vetor de tamanho zero for lido. Saída A saída é a posição onde o robot está no momento e quantos passos ele andou. Exemplo da Entrada: NLSo SSSS NNnNNnN o vvvv vzfsn Exemplo Saída: x = 39, y = 39, passos = 4 x = 39, y = 43, passos = 4 x = 39, y = 32, passos = 7 x = 38, y = 39, passos = 1 x = 39, y = 39, passos = 0 x = 39, y = 39, passos = 2 10
Solução do programa 2 11