Computação para Informática - Prof. Adriano Joaquim de Oliveira Cruz Segunda Prova - 23a de junho de 2008 Nome: Assinatura: 1 a Questão: (2.0 pontos) Números Aleatórios Escreva um programa que gere N números aleatórios todos diferentes entre si. O valor N deve ser pedido ao usuário. Os números gerados devem ser gravados em um arquivo do tipo texto de nome fornecido pelo usuário. Abaixo está um exemplo de um programa que gera um número aleatório. #include<time.h> Listing 1: Programa do problema 1. int main (void) int i; srand(time(null)); i = rand(); printf("%d\n", i); 1
2 a Questão: (2.0 pontos) O programa 2 lê os dados de quatro quadrados e imprime os dados do quadrado que tem a maior área. Complete os pedaços que faltam. Assuma que os quatro quadrados têm áreas diferentes. typedef struct _PONTO int x, y; PONTO; typedef struct _QUADRADO PONTO origem; int largura, altura; QUADRADO; PONTO LePonto(void) /* complete aqui */ QUADRADO LeQuadrado( void) /* mais código aqui */ int Area(QUADRADO q) /* aqui também */ void ImprimeQuadrado( QUADRADO q) /* mais codigo */ int main (void) int quadrado, i, maiorarea; QUADRADO q[4]; Listing 2: Programa do problema 1(Quadrados). for (i = 0; i < 4; i++) q[i] = LeQuadrado(); quadrado = 0; maiorarea = Area(q[0]); for (i = 1; i < 4; i++) if (Area(q[i]) > maiorarea) maiorarea = Area(q[i]); quadrado = i; ImprimeQuadrado( q[ quadrado]); 2
3 a Questão: (1.0 ponto) O programa mostrado na listagem 3 foi salvo como argvc.c e compilado com o seguinte comando: gcc -o argvc argvc.c -Wall O programa imprimiu o seguinte resultado: 1 2 3 4 5 Qual foi o comando digitado pelo usuário para executar este programa. Explique a sua resposta. Listing 3: Programa do problema 1(argc argv). int main (int argc, char **argv) int i, a, b, c; if (argc < 5) printf("ola\n"); return 1; for (i = 1; i < argc; i = i + 2) c = argv[i][0]; switch (c) case i : sscanf(argv[i+1], "%d", &a); break; case f : sscanf(argv[i+1], "%d", &b); break; for (i = a; i < b; i++) printf("%d ", i); printf("\n"); 3
4 a Questão: (1.0 ponto) O que o programa 4 imprime caso os valores fornecidos sejam: 1 2 3 4 5 6 7 8 9-1 Justifique sua resposta. #define MAXN 10 Listing 4: Programa do problema 1. int f(int *m) if (*m < 0) else return *m + f(m + 1); int main (void) int m[maxn], i, x; for (i = 0; i < MAXN; i++) printf("%d? ", i); scanf("%d",&m[i]); x = f(m); printf("%d\n", x); 4
5 a Questão: (2.0 pontos) Aspas em TEX TEXé uma linguagem para formatação de textos desenvolvida por Donald Knuth. O texto desta prova foi formatado usando-se TEX. Esta linguagem, da mesma maneira que HTML, insere instruções de formatação no texto para produzir, desejavelmente, um documento bonito. Documentos bonitos devem usar e para produzir aspas ao invés de " (aspas duplas), que é o caracter normalmente disponível no teclado. O problema é que teclados normalmente têm uma única ` (aspas simples da esquerda ou acento agudo) e uma única (aspas simples pela direita ou apóstrofo). Em TEX é possível digitar dois acentos agudos (` ` ) para criar e dois apóstrofos ( ) para criar. O problema é que a maioria dos textos usam " para produzir aspas duplas. Por exemplo, se o arquivo texto original contiver a frase "Ser ou n~ao ser,"disse o poeta, "eis a quest~ao." então a saída do processamento do program TEX não ficará um texto bonito porque sairá assim Ser ou não ser, disse o poeta, eis a questão. Para que o resultado seja bonito é necessário que o arquivo contenha ` ` Ser ou n~ao ser, disse o poeta, ` ` eis a quest~ao. Tarefa Escreva um programa que converta texto contendo aspas duplas (") em texto com as modificações necessárias para que ele se transforme em texto bonito. Portanto, as aspas duplas (") devem ser substituídas por ` ` quando abrem uma citação e por quando fecham. Observe que os problemas de citações dentro de citações não existem. Sempre o primeiro " deve ser substituído por ` ` e o próximo por. Entrada A entrada é um texto espalhado por diversas linhas. O texto todo contém um número par de ". A entrada termina quando uma linha vazia for lida. Saída A saída é o texto com as modificações pedidas. Exemplo Exemplo de Entrada: "Ser ou n~ao ser", disse o poeta, "esta é a quest~ao". O Programador piadista respondeu: "Eu devo discordar. ` C ou n~ao ` C, esta é a quest~ao!" Saída para o Exemplo da Entrada ` ` Ser ou n~ao ser, disse o poeta, ` ` esta é a quest~ao. O Programador piadista respondeu: ` ` Eu devo discordar. C ou n~ao C, esta é a quest~ao! 5
6 a Questão: (2.0 pontos) Mapa do Tesouro Um arqueólogo descobriu um mapa do tesouro codificado de uma estranha maneira. O mapa está representado por uma matriz retangular cheia de caracteres. Após muita pesquisa o aventureiro descobriu o significado das letras. O mapa é como se fosse um tabuleiro de xadrez e o aventureiro deve andar uma casa de cada vez. A direção da próxima casa para onde ele deve ir é dada pela letra da casa onde ele está no momento. A figura 1 mostra as direções para onde o aventureiro deve andar e as letras correspondentes. Por exemplo, caso a casa onde estou contenha a letra C o aventureiro deve andar uma casa para a direita. A jornada termina quando ele chegar na casa com a letra T. Sempre há uma casa com esta letra no mapa. Caso o aventureiro tente segur um caminho diferente do indicado ele irá morrer. O aventureiro também descobriu no mapa as coordenadas da casa por onde ele deve começar sua jornada. H A B (0,0) (0,1) G C (1,0) F E D (3,3) Figura 1: Letras e direções e sistema de coordenadas Tarefa A sua tarefa é escrever um programa que leia o número de linhas e colunas do mapa, as coordenadas iniciais da caçada ao tesouro e em seguida o mapa. O programa deve imprimir as casas percorridas pelo aventureiro até o mapa. Entrada A entrada é composta pelos seguintes dados. Primeira linha contém dois inteiros com o número de linhas (linhas) e de colunas (colunas) do mapa. Segunda linha contém dois inteiros com as coordenadas iniciais (iini, jini) da caçada. Em seguida são fornecidas (linhas) linhas cada uma com colunas caracteres com as instruções. Saída Na saída o programa deve imprimir as coordenadas de todas as casas por onde passou e as coordenadas do local onde está o tesouro. Restrições O tamanho máximo de linhas e colunas é desconhecido. Use ponteiros. Exemplo 6
Exemplo de Entrada: 6 6 4 2 aaaaaa fdfggb aecdhb tgcbah abbdef bcdefg Saída para o Exemplo da Entrada Estou em i = 4 j = 2 Estou em i = 3 j = 3 Estou em i = 2 j = 4 Estou em i = 1 j = 3 Estou em i = 1 j = 2 Estou em i = 2 j = 1 Estou em i = 3 j = 1 Estou em i = 3 j = 0 Achei o tesouro em i = 3, j = 0 7