Computação para Informática - Prof. Adriano Joaquim de Oliveira Cruz Primeira Prova - 29 de abril de 2009 Observações Iniciais: • Responda no caderno de respostas. • A prova é composta de seis questões. As quatro primeiras valem 1,5 cada uma e as duas últimas valem 2,0 pontos cada. • O formato da entrada e saı́da dos dados deve ser seguido exatamente como está indicado no enunciado de cada programa. 1o Problema: resposta. O que será impresso pelo programa mostrado na listagem 1. Justifique sua Listing 1: Programa do problema 1. #i ncl ude < stdio .h > i n t main ( void ) { int i; char j ; f o r ( i = 0; i < 26; i = i + 2) { f o r ( j = ’A ’; j <= ’Z ’ - i ; j ++) { printf ( " % c " , j ); } printf ( " \ n " ); } return 0; } 2o Problema: Escreva um programa que imprima os seguintes resultados: 0 11 222 3333 44444 555555 6666666 1 3o Problema: O que será impresso pelo programa mostrado na listagem 2 caso você digite a seguinte linha de texto: Prova de Computacao para Informatica. Justifique sua resposta. Listing 2: Programa do problema 3. #i ncl ude < stdio .h > i n t main ( void ) { i n t vogais , i ; char linha [80]; gets ( linha ); f o r ( i = 0 , vogais = 0; linha [ i ] != ’ \0 ’; i ++) { switch ( linha [ i ]) { cas e ’a ’: cas e ’e ’: cas e ’i ’: cas e ’o ’: cas e ’u ’: vogais ++; } } printf ( " Vogais = % d \ n " , vogais ); f o r ( i = 0 , vogais = 0; linha [ i ] != ’ \0 ’; i ++) { i f ( linha [ i ] >= ’a ’ && linha [ i ] <= ’u ’) { vogais ++; } } printf ( " Vogais = % d \ n " , vogais ); return 0; } 2 4o Problema: O que será impresso pelo programa 3, caso os números fornecidos sejam os seguintes: 3 5 1 4 2. Justifique sua resposta. Listing 3: Programa do problema 4. #i ncl ude < stdio .h > i n t main ( void ) { i n t v [5]; i n t i , temp ; f o r ( i = 0; i < 5; i ++) { scanf ( " % d " , & v [ i ]); } f o r ( i = 0; i < 4; i ++) { i f ( v [ i ] > v [ i +1]) { temp = v [ i ]; v [ i ] = v [ i +1]; v [ i +1] = temp ; } } f o r ( i = 4; i >= 0; i - -) { printf ( " % d " , v [ i ]); } return 0; } 3 5o Problema: Intercalando vetores Uma operação muito comum em computação é a intercalação de dois vetores que já estão ordenados. Considere um vetor A de tamanho N e outro B de tamanho M (N, M ≤ 1000). O vetor resultante C é contruı́do a partir dos dois originais e terá tamanho N + M . Considere por exemplo a tabela 1. A partir dos vetores (Tabela 1) A de 4 elementos e B de 3 elementos, construı́mos o vetor C com 7 elementos. Durante a criação da tabela C os elementos vão sendo retirados de A e B na ordem requerida. i = A[i] B[i] C[i] 0 1 2 1 1 3 3 2 2 6 5 3 3 7 4 5 6 3 5 6 7 Tabela 1: Vetores A, B e C. Tarefa A sua tarefa é escrever um programa que leia uma série de pares de vetores e os intercale e imprima o resultado. Entrada A entrada consiste de uma série de casos de teste. A primeira linha de um conjunto de teste contém dois números inteiros positivos (tamA, tamB ≥ 0) que indicam os tamanhos dos vetores A e B respectivamente. As tamA linhas seguintes contém os dados do vetor A. Em seguida vem tamB linhas contendo os dados do vetor B. O final da entrada é indicado por tamA = tamB = 0. Saı́da Para cada conjunto de teste da entrada seu programa deve produzir várias linhas. A primeira linha identifica o conjunto de teste, no formato ”Teste t”, onde t é numerado a partir de 1. As tamA + tamB linhas restantes contém os valores na ordem pedida. Uma linha em branco deve ser deixada após cada caso de teste. Exemplo de Entrada: 5 3 1 2 3 4 5 1 2 3 2 2 1 4 3 5 0 0 Saı́da para o Exemplo de Entrada Teste 1 1 1 2 2 3 3 4 5 Teste 2 1 3 4 5 4 6o Problema: Mudando as regras do jogo As corridas de automóveis em Pindorama, um paı́s ao sul do norte e ao norte do sul, perderam público nos últimos anos porque se tornaram muito chatas. Durante as corridas quase não ocorrem ultrapassagens e os pilotos quase que se tornaram passageiros nos carros de corrida. Para tentar modificar este quadro a Federação Pindoramiana de Automobilismo (FPA) decidiu alterar as regras de pontuação dos campeonatos. Até o ano passado o sistema de pontos funcionava do seguinte modo. Considere uma corrida em que M pilotos terminaram. O primeiro classificado recebia M pontos, o segundo classificado recebe M − 1 pontos, o terceiro M − 2 pontos e assim por diante. Por exemplo, em uma corrida com 5 classificados os pontos eram atribuı́dos da maneira mostrada na Tabela 2. No final do ano são somados os pontos de cada corrida e o campeão é o piloto com mais pontos. Classificação Pontos 1 5 2 4 3 3 4 2 5 1 Tabela 2: Pontos para os primeiros M = 5 classificados. Neste ano o sistema será diferente. Será campeão o piloto que conseguir o maior número de vitórias nas corridas. Os pontos das corridas serão usados somente como critério de desempate. Tarefa Você deve escrever um programa que, dadas as listas de resultados anuais da FPA, determine quem seria o campeão por pontos, como no critério tradicional, e por total de vitórias, como no critério novo. Observe que podem ocorrer casos em que mais de um piloto seja o campeão. Neste caso imprima todos os pilotos que atingiram o número maior de pontos e/ou de vitórias, não aplique nenhum critério de desempate. Entrada A entrada contém os resultados de vários anos. A primeira linha dos resultados de um ano contém dois inteiros. O primeiro inteiro N indicando o número de corridas do ano (1 < N ≤ 1000). O segundo M contém o número de classificados em cada corrida (2 ≤ M < 100). Os corredores são identificados por inteiros de 1 a 100. Observe que de ano para ano o número de classificados em cada corrida pode mudar. A segunda linha contém o ano do campeonato em que os dados foram obtidos. Cada uma das N linhas seguintes contém a classificação de uma corrida. A lista de classificação contém uma seqüência de M números inteiros listando os corredores em ordem de chegada, do primeiro para o último. O final dos dados é indicado por uma linha com N = M = 0. Assuma que cada lista de classificação contém M identificadores distintos. Saı́da A saı́da deve imprimir o ano em que o campeonato foi realizado. Em seguida deve vir o piloto campeão por pontos e o campeão por número de vitórias. Caso haja mais de um, informe os números em ordem crescente. Exemplo 5 Entrada 4 5 2000 20 33 25 32 99 33 25 32 99 20 25 32 99 20 33 32 99 20 33 25 3 6 2002 2 34 88 36 79 93 2 34 88 36 79 93 2 34 88 36 79 93 0 0 Saı́da Ano 2000 Campeao por Campeao por Campeao por Campeao por Campeao por pontos 32 vitorias 20 vitorias 25 vitorias 32 vitorias 33 Ano 2002 Campeao por pontos 2 Campeao por vitorias 2 6