Exercício 1
Comentário: (digite uma frase para facilitar a busca)
Considere o Exercício 2 da Aula 1 (quando ainda não tínhamos escrito nem o primeiro programa!):
Dada uma lista com a nota de cada aluno da classe na prova de Geografia, determine o número de alunos cuja nota foi igual ou superior à média da turma.
Sabemos fazer um programa para calcular a média das notas. Mas como verificar quantos alunos têm nota igual ou acima da média? Ao ler cada nota, ainda não sabemos o valor da média para comparar, e depois de calcular a média não temos mais acesso às notas lidas para comparar! Poderíamos pensar em armazenar as notas em variáveis, mas se a lista tiver 1000 notas não vai ser prático declarar 1000 variáveis.
Ou seja: com os comandos que conhecemos até agora, não conseguimos resolver esse problema.
Seria necessário:
E a opção (2) acima é o que o uso de vetores nos proporciona.
Um vetor é uma é uma coleção de valores que podem ser acessados individualmente, com um mesmo nome de variável. A figura abaixo mostra, esquematicamente, um vetor de nome notas com cinco elementos:
A cada elemento do vetor é associado um número: o índice do elemento. A figura abaixo mostra, para o vetor notas, os elementos e os índices associados:
O índice do primeiro elemento do vetor é sempre 0. No vetor notas mostrado na figura
O acesso a um valor do vetor é feito usando o nome do vetor e, entre colchetes, o índice do elemento desejado. Por exemplo, para acessar o elemento de índice 2 do vetor notas (cujo valor é 5) usamos
notas[2]
Podemos usar qualquer elemento do vetor como se fosse uma variável simples. Assim, para escrever na saída uma linha com o valor do elemento de índice 2 do vetor notas, usamos o comando
printf("%d\n", notas[2]);
Esse comando escreve o valor 5 na saída.
Elementos do vetor podem ser usados em expressões:
x = notas[0]+notas[2];
Após esse comando, a variável x armazena o valor 12 (7+5).
Podemos também atribuir um novo valor a um elemento do vetor com um comando de atribuição:
notas[0] = 9;
E podemos ainda atribuir um novo valor a um elemento do vetor com um comando de leitura:
scanf("%d","notas[0]");
Após esse comando, o vetor notas armazena os elementos 9,8,5,8,10.
Para declarar uma variável de tipo vetor, inicializamos a variável com um "vetor vazio", indicado por um "abre colchete" e um "fecha colchete" consecutivos ([]). Ou seja, para declarar uma variável de nome notas, de tipo vetor, usamos:
var notas=[];
Essa declaração cria um vetor de nome notas vazio, ou seja, sem nenhum elemento.
Para criar um novo elemento de um vetor, basta atribuir um valor a um elemento de índice ainda inexistente. Por exemplo,
var notas=[]; // declara e cria um vetor vazio notas[0] = 10; // cria o elemento de índice 0, com valor 10 notas[1] = 7; // cria o elemento de índice 1, com valor 7 scanf("%d", "notas[2]"); // lê um valor inteiro da entrada e // cria o elemento de índice 2 com o valor lido
Por exemplo, podemos criar um vetor de dez elementos, lendo os valores da entrada:
var i, // um contador notas=[]; // declara e cria um vetor vazio for (i=0; i<10; i++) scanf("%d", "notas[i]"); // lê um valor para o vetor
Os elementos de um vetor podem ser de qualquer tipo, como número, cadeia de caracteres ou booleano.
Vejam um exemplo de vetor com elementos de diferentes tipos:
var misto=[]; misto[0] = 123; misto[1] = “X”; misto[2] = “Saci Pererê”; misto[3] = misto[1]===“X”; printf(“%d\n”, misto[0]); printf(“%s\n”, misto[1]); printf(“%s\n”, misto[2]); printf(“%s\n”, misto[3]);
Na saída, serão escritas as linhas
123 X Saci Pererê true
Note que para escrever um valor booleano usamos o especificador %s na cadeia formatadora do comando printf.
A professora de Geografia fez uma lista com a nota da prova de cada aluno da turma. Ela precisa de um programa de computador para calcular a média das notas da turma e determinar quantos alunos tiveram nota igual ou superior à média.
A entrada consiste de duas linhas. A primeira linha contém um número inteiro N que indica o número de alunos da turma. A segunda linha descreve as notas dos alunos. Ela contém N números Xi, indicando a nota de cada aluno.
Seu programa deve escrever duas linhas na saída. A primeira linha deve conter apenas um número com precisão de uma casa decimal, a média da turma. A segunda linha deve conter apenas um inteiro, o número de alunos que tiveram nota igual ou superior à média.
Entrada
5 10.0 9.0 7.0 9.0 10.0 |
Saída
9.0 4 |
Entrada
2 5.6 5.6 |
Saída
5.6 2 |
Entrada
4 10.0 1.4 3.6 1.0 |
Saída
4.0 1 |
Na festa junina da escola foi organizado um sorteio de prêmios, usando o número do tíquete da entrada para a festa. Havia muitos prêmios, e a diretora foi sorteando os números dos tíquetes ganhadores de um em um, anotando os números sorteados em uma lista. Os prêmios de valor mais baixo foram sorteados primeiro, de forma que o último número sorteado ganhou o grande prêmio.
A diretora agora quer divulgar a lista dos números dos tíquetes dos ganhadores na página da escola na internet. Mas ela precisa inverter a lista, colocando o último sorteado em primeiro lugar, o penúltimo sorteado em segundo lugar, e assim por diante.
A entrada consiste de duas linhas. A primeira linha contém um número inteiro N que indica o número de tíquetes. A segunda linha descreve os tíquetes na ordem em que foram sorteados. Ela contém N números inteiros Xi, indicando os números dos tíquetes sorteados.
Seu programa deve escrever uma linha na saída, contendo a lista de números sorteados, na ordem inversa em que foram sorteados. Os números devem ser separados por um único espaço em branco (atenção e cuidado: não deve haver outros espaços em branco além dos que separam os números sorteados; em particular, não pode haver um espaço antes do primeiro número ou após o último número da lista).
Entrada
5 10 20 30 40 50 |
Saída
50 40 30 20 10 |
Entrada
2 1000 99 |
Saída
99 1000 |
A escola está realizando uma cerimônia de premiação para os melhores colocados da OBI. A Diretora copiou da página da OBI na Internet os melhores classificados da escola, que lista os competidores em ordem, do melhor classificado para o menos bem classificado. Mas a diretora decidiu que o melhor é chamar os competidores ao palco na ordem invertida da classificação dada na página. Ou seja, ela quer chamar ao palco inicialmente os menos bem classificados, e assim chamar por último o melhor classificado.
A cerimônia já está começando, e a diretora está aflita. Você pode ajudá-la?
A entrada consiste de duas linhas. A primeira linha contém um número inteiro N que indica o número de competidores. A segunda linha descreve os nomes dos competidores. Ela contém N nomes Xi, indicando os nomes dos competidores, em ordem de classificação, do melhor classificado para o menos bem classificado.
Seu programa deve escrever uma linha na saída, contendo a lista de competidores, na ordem inversa de classificação, do menos bem classificado para o melhor classificado. Os nomes devem ser separados por um único espaço em branco (atenção e cuidado: não deve haver outros espaços em branco além dos que separam os nomes; em particular, não pode haver um espaço antes do primeiro nome ou após o último nome da lista).
Entrada
5 Fatima Alberto Pedro Katia Eva |
Saída
Eva Katia Alberto Fatima |
Entrada
2 Henrique Isabela |
Saída
Isabela Henrique |
Uma sequência palíndrome é uma sequência que é a mesma se lida do início para o final ou do final para o início. Por exemplo, as sequências X, X e A, B, C, B, A são palíndromes, mas as sequências X, Y e A, B, B não são.
Dada uma sequência de letras, você deve escrever um programa para determinar se a sequência é palíndrome.
A entrada consiste de duas linhas. A primeira linha contém um número inteiro N que indica o número de letras da sequência. A segunda linha descreve a sequência, e contém N letras Li, separadas entre si por um espaço em branco.
Seu programa deve escrever uma linha na saída, contendo apenas o caractere S se a sequência dada é palíndrome, ou o caractere N caso contrário.
Entrada
A B C B A |
Saída
S |
Entrada
X Y |
Saída
N |
Entrada
Z A A Z |
Saída
S |
Um número palíndrome é um número inteiro positivo, sem zeros à esquerda, que é o mesmo se lido da esquerda para a direita ou da direita para a esquerda. Por exemplo, os números 11 e 65256 são palíndromes, mas os números 10 e 123 não são.
Dado um número inteiro, você deve escrever um programa para determinar se o número é um palíndrome.
A entrada consiste de uma única linha, que contém um único número inteiro N.
Seu programa deve escrever uma linha na saída, contendo apenas o caractere S se o número dado é um palíndrome, ou o caractere N caso contrário.
Entrada
1234321 |
Saída
S |
Entrada
11111112 |
Saída
N |
Entrada
99 |
Saída
S |
Nesta seção você encontra exemplos de soluções para os exercícios. Mas antes de ver a solução para um exercício tente resolvê-lo, criando a sua própria solução.
Solução do Exercício 1// Solução para o exercício 1, Aula 14 // Média ou Melhor // Autor: Ricardo Anido var N, // número de alunos i, // contador para repetição notas=[], // as notas dos alunos soma, // soma das notas, para calcular a média media, // média da turma acima; // número de alunos acima da média scanf("%d", "N"); // comprimento da lista soma = 0; // inicializa soma das notas for (i=0; i<N; i++) { scanf("%f", "notas[i]"); // lê uma nota soma = soma + notas[i]; // acumula em soma } media = soma/N; // calcula a média acima = 0; // inicializa número de alunos acima da média for (i=0; i<N; i++) { // percorre novamente as notas if (notas[i] >= media) acima++; // mais uma nota maior ou igual à média } //escreve o resultado printf("%.1f\n%d\n", media, acima);
Solução do Exercício 2
// Solução para o exercício 2, Aula 14 // Sorteio de prêmios // Autor: Ricardo Anido var N, // número de alunos i, // contador para repetição tiquete=[]; // números dos tíquetes scanf("%d", "N"); // comprimento da lista for (i=0; i<N; i++) { scanf("%d", "tiquete[i]"); // lê um número de tíquete } // escreve o resultado, tomando o cuidado de não // colocar um espaço em branco a mais na linha for (i=N-1; i>0; i--) { // percorre o vetor, do último lido para o segundo lido printf("%d ", tiquete[i]); // escreve número de tiquetes, // seguido de espaço em branco } // por último, escreve o primeiro sorteado, seguido de final-de-linha printf("%d\n", tiquete[0]);
Solução do Exercício 3
// Solução para o exercício 3, Aula 14 // Os últimos serão os primeiros // Autor: Ricardo Anido var N, // número de alunos i, // contador para repetição nomes=[]; // nomes dos alunos scanf("%d", "N"); // comprimento da lista // vamos ler a lista e guardar no vetor nomes for (i=0; i<N; i++) { scanf("%s", "nomes[i]"); // lê um nome } // escreve o resultado, tomando o cuidado de não // colocar um espaço em branco a mais na última linha for (i=N-1; i>0; i--) // percorre o vetor, do último lido para o segundo lido printf("%s ", nomes[i]); // escreve nome, seguido de espaço em branco // escreve nome do último colocado, lido em primeiro lugar, seguido de final-de-linha printf("%s\n", nomes[0]);
Solução do Exercício 4
// Solução para o exercício 4, Aula 14 // Sequência palíndrome // Autor: Ricardo Anido var N, // o número dado i, // contador para repetição seq=[]; // letras da sequência scanf("%d", "N"); // lê o número de letras for (i=0; i<N; i++) scanf("%s", "seq[i]"); // lê a sequência j=0; i=N-1; // vamos percorrer o vetor comparando o elemento i com o elemento j while (j <= i) { if (seq[i]!=seq[j]) break; j++; i--; // avança j e retrocede i } // escreve o resultado // se é i menor ou igual a j, ocorreu um break, e a resposta é N // caso contrário, a sequência é palíndrome if (j<=i) printf("N\n"); else printf("S\n");
Solução do Exercício 5
// Solução para o exercício 5, Aula 14 // Número Palíndrome // Autor: Ricardo Anido var N, // o número dado i, // contador para repetição digitos=[]; // dígitos do número scanf("%d", "N"); // lê o número // vamos inicialmente construir um vetor com os dígitos do número N i=0; while (N > 0) { digitos[i] = Math.floor(N % 10); // um dígito do número N = Math.floor(N/10); i++; } // ao final do while, i tem o número de dígitos do número N i--; // i agora tem o índice do último elemento do vetor j=0; // vamos percorrer o vetor comparando o elemento i com o elemento j while (j <= i) { if (digitos[i]!=digitos[j]) break; j++; i--; } // escreve o resultado // se é i menor ou igual a j, ocorreu um break, e a resposta é N // caso contrário, o número é palíndrome if (j <= i) printf("N\n"); else printf("S\n");