Como comparar o indice de um vetor

Continuando nosso curso de programação com a linguagem C, talvez você já tenha sentido a necessidade de retornar mais de um valor em sua função. Contudo, como já vimos em nosso curso de programação, uma função retorna apenas um valor.

Porém, é possível resolver isso utilizando ponteiros. Na aula de hoje aprenderemos como criar um procedimento para encontrar o maior e o menor elemento de um vetor com ponteiros.

A ideia é bem simples. Ao invés de retornar os valores encontrados, iremos passar como parâmetro para o procedimento o endereço de duas variáveis inteiras, uma para receber o menor e outra para receber o maior elemento. Dessa forma, teremos os valores sem a necessidade de retorno. Assim, a assinatura do procedimento fica assim:

// assinatura do procedimento void maiorMenor(int *vet, int tam, int *menor, int *maior)

Perceba que o procedimento precisa de quatro parâmetros: o endereço do vetor; o tamanho do vetor; e dois ponteiros para receber os valores procurados.

Como o conteúdo da região de memória apontada pelos ponteiros pode ter lixo de memória, vamos então atribuir o primeiro elemento do vetor às duas variáveis. Dessa forma a busca será feita a partir do segundo elemento do vetor.

// o conteúdo dos ponteiros menor e maior é alterado para o primeiro elemento do vetor *menor = *vet; *maior = *vet;

Agora, precisamos percorrer o vetor a partir do índice 1 e, para cada elemento, comparar com o conteúdo apontado pelos ponteiros menor e maior e trocando quando for necessário.

for(i = 1; i < tam; i++){ if(*menor > *(vet + i)) *menor = *(vet + i); if(*maior < *(vet + i)) *maior = *(vet + i); }

Código completo em C

/* Aula 192: Exercício 1 1) Escreva um procedimento que receba um vetor inteiro, seu tamanho e os endereços de duas variáveis inteiras, menor e maior, salve nestas variáveis o menor e o maior valor do vetor. Código escrito por Wagner Gaspar Maior de 2021 */ void maiorMenor(int *vet, int tam, int *menor, int *maior){ int i; *menor = *vet; *maior = *vet; for(i = 1; i < tam; i++){ if(*menor > *(vet + i)) *menor = *(vet + i); if(*maior < *(vet + i)) *maior = *(vet + i); } } int main(){ int menor, maior, v[10] = {45,89,69,23,14,75,2,45,100,58}; printf("Menor: %d\tMaior: %d\n", menor, maior); maiorMenor(v, 10, &menor, &maior); printf("Menor: %d\tMaior: %d\n", menor, maior); return 0; }

  • Todas as Novidades
  • Regras
  • Equipe
  • Líderes
  • Todas as Novidades
  • Regras
  • Equipe
  • Líderes

Um vetor (array) é uma coleção de variáveis que são acessadas com um número índice. Vetores na linguagem C++, na qual o Arduino é baseado, podem ser complicados, mas usar vetores simples é relativamente fácil.

Todos os métodos abaixo são formas válidas de criar (declarar) um vetor.

int meusInts[6]; int meusPinos[] = {2, 4, 8, 3, 6}; int meusValSens[6] = {2, 4, -8, 3, 2}; char mensagem[6] = "hello";

Você pode declarar um vetor sem inicializá-lo, como em meusInts. Em meusPinos, nós declaramos um vetor sem explicitamente escolher um tamanho. O compilador conta os elementos e cria um vetor de tamanho apropriado.

Finalmente você pode inicializar e também especificar o tamanho do vetor, como em meusValSens. Note que quando declarar um vetor do tipo char, um elemento a mais que sua inicialização é requerido, para armazenar o caractere null necessário.

Vetores são indexados a partir de 0, isto é, referindo-se a inicialização dos vetores acima, o primeiro elemento do vetor está no índice 0, então

meusValSens[0] == 2, meusValSens[1] == 4, e assim por diante.

Isso também significa que em um vetor com dez elementos, o índice nove é o último elemento. Então:

int meuVetor[10] = {9, 3, 2, 4, 3, 2, 7, 8, 9, 11}; // meuVetor[9] contém 11 // meuVetor[10] é inválido e contém informação aleatória (endereço de memória fora do vetor)

Por esse motivo, você deve ser cuidadoso ao acessar vetores. Acessar um elemento depois do final de um vetor (usar um índice maior que o tamanho declarado - 1) é ler de uma parte da memória que pode estar em uso para outros propósitos. Ler desses locais provavelmente não vai fazer mais que retornar dados inválidos. Escrever em locais aleatórios da memória é definitivamente uma má ideia e pode frequentemente levar a péssimos resultados como crashes ou mal funcionamento do programa. Isso pode também ser um bug difícil de encontrar.

Diferentemente de BASIC ou JAVA, o compilador C++ não faz checagem para confirmar se o acesso a um elemento está dentro dos limites do tamanho declarado do vetor.

Vetores são frequentemente manipulados dentro de loops for, onde o contador do loop é usado como o índice para cada elemento. Por exemplo, para imprimir os elementos de um vetor através da porta serial, você pode fazer algo do tipo:

for (byte i = 0; i < 5; i = i + 1) { Serial.println(meusPinos[i]); }

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

Tenho dois vetores, exemplo:

A = [ABCDEFGHIJKLMNOPQ]
B = [ABCDEFGHIJKLMNOPQRSTUVWXYZ]

Preciso compara elemento por elemento do vetor A de forma que quando ache o mesmo elemento no vetor B ele ande 9 posições para trás. Exemplo: Pego elemento ‘L’ do vetor A e encontro no vetor B, quando encontrar ele andará 9 casas para trás e passará a valer então ‘C’ pois é o valor encontrado 9 posições para trás no vetor B.

Os vetores são do tipo CHAR.

vc sabe usar um laço for? se sim, qual a dificuldade?

o que acontece se vc procurar A ou B ?

1 curtida

for (char i=0; i<a.length; i++) { for (char j=0; j<b.length; j++) { if (a.equals(b)); } }

Fiz dessa forma, consegui listar os elementos iguais dos dois vetores. Agora preciso que quando encontre o elemento igual no Vetor B ele ande 9 posiçoes para trás, e me mostre a letra encontrada 9 posições atrás.

if a.equals b?

cara iso não faz o menor sentido.

vc tem a[i] e b[j]

Tem alguma ideia como eu faria para comparar os elementos de um vetor e exibir os iguaias para o usuário?

amigo é o ‘enunciado’ do problema que eu não entendi.

por exemplo se vc encontrar algo no começo do array como vc andaria 9 casas pra traz?

me da um exemplo melhor do que vc quer. de repente com arrays menores. vc colocou 2 arrays com praticamente os mesmos dados na mesma ordem então eu não consigo ver como isso seria dificil.

isso é tipo uma cifra/codificação?

1 curtida

Sim é uma codificação. Como no exemplo acima:

O vetor A seria um código interceptado do inimigo. O vetor B seria o alfabeto utilizado para codificar que também foi interceptado do inimigo.

Através de um exemplo mais simples:

Então temos o vetor A contendo L e o programa tem q buscar a mesma letra no L no Vetor B, assim que achar a letra L no vetor B ele apresentaria para o usuário a letra que está 9 casas para trás do alfabeto do vetor B:

A = [L]
B = [_A_BCDEFGHL]

Ou seja, se ele está procurando L no vetor B e encontrou então ele andaria para trás nos elementos: LHGFEDCBA assim ele apresentaria a letra A para o usuário, conforme ordem dos vetores do exemplo.

1 curtida

for(int i =0; i < tamanho_A; i++){ for(int j =0; j < tamanho_B; j++){ if ( A[i] == B[j]) { /* ACHEI A[i] na posicao j */ aqui ó: B[j -9]; } } }

agora me explica se for assim

A = [a,b ] B = [a,b,c,d,e,f,g,h,i,j]

a esta em B[0]

subtrai 9 e da negativo

comofas?

2 curtidas

Isso é cifra de cesar… Logo, se o numero chegar ao negativo, ele vai para a ultima letra e continua voltando até o ponto final.

exemplo:

A = [ABCDEFGHIJKLMNOPQ]
B = [ABCDEFGHIJKLMNOPQRSTUVWXYZ]

Ai se for B[0], voltando 9 casas daria ‘R’.

Talvez não seja a melhor solução, mas voce pode pegar uma condição

int k = 9; for(int i =0; i < tamanho_A; i++){ for(int j =0; j < tamanho_B; j++){ if ( A[i] == B[j]) { /* ACHEI A[i] na posicao j */ if (j < 9){ j = 25; /* 25 é o total de letras do alfabeto -1 (por começar do 0 */ k = 9 - j; } aqui ó: B[j -k]; } } }

2 curtidas

Humm agora faz sentido

Nesse exemplo eu nao alteraria k

Deixa k sendo 9 pra sempre

Se o índice for negativo ai faz a matematica no indice de B

K = 9 … Indice = j - K if ( Indice negativo ) Indice += numero_letras;

B[ Indice ]

1 curtida

É isso mesmo Sérgio. Poderia ajudar em como eu faria se no vetor A tivesse alguns caracteres especias.

Ex: A = [AB#CD%E&]

No caso esses valores nao obedeceriam a regra aplicada aos caracteres Alfabéticos, pois eles ja teriam um valor pré-definido.

Ex: # = V % = U

& = B

em vez de fazer o mesmo processo que os demais , esses caracteres apenas iriam apresentar o valor pré-definido para o usuário.

Pensei em fazer usando switch case mas não consegui aplicar a sua lógica.