Como comparar os elementos de uma array c

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

solução!

Oi André, blz,

Bacana, esse algorítimo dá pra aplicar aqui tbm, mas ele irá antes, ter que verificar se estão corretos ou não, ou seja, se estão ordenados ou não, pois se estiver correto, ele nem faz a organização ou ordenamento e informa que já está correto, dae o grande problema aqui é comparar os valores do array pra ver se estão organizados ou não, se o valor posterior é menor que o anterior, ou ainda comparar o próprio array passado e ver se ele está organizado, ou pode ser que ele compare o array passado com o array já ordenado e verifique se o array passado já está ordenado ou não.

Eu estava pesquisando mais sobre o bubble sort e descobri que o ruby já tem um método sort que já faz o ordenamento igual ao seu método, é o método .sort que organiza os valores em ordem crescente.

Todo caso eu consegui comparar de forma direta o próprio array antes e depois de organizados. Fiz da seguinte forma:

array=[5, 4, 1, 2, 3] #array=[5, 4, 3, 2, 1] if array != array.sort.reverse p array puts "A lista não está organizada, deseja organizar?" sim = gets.strip if sim array = array.sort.reverse p array end else puts "A lista já está organizada" end

Nesse caso ele conseguiu comparar diretamente o array verificando a igualdade, deu certo, agradeço a ajuda André, se todo caso você tiver uma maneira de comparar os valores dentro do array um a um me passe tbm, exemplo array e array.sort.reverse 5 = 5? 4 = 4? 3 = 1? 2 =2? 1=3? ou seja, percorrer todo os dois arrays comparando um elemento com o elemento do outro. vlw

Pessoal, tenho um algorítmo que realiza a comparação de expressões regulares, dando uma introdução a análise sintática em C. Mas estou tendo problemas no momento da comparação pois os valores esperados não são retornados. Na verdade, as coisas não são comparadas corretamente e o retorno é nulo.

#include <stdio.h> #include <stdlib.h> #include <string.h> #include <stdbool.h> static char *expressoes[] = {"print", "open", "close"}; static char *acao[] = {"imprime um valor.", "abre um requerimento.", "fecha um requerimento."}; int verificar_expressao(char*); char *retorna_acao(int); int main(){ printf("Analisador de Expressões\n"); while(true){ printf(">> "); char *palavra; scanf(palavra); int valor = verificar_expressao(palavra); char *desc = retorna_acao(valor); printf("Expressão: "); printf(expressoes[valor]); printf(" -> "); printf(desc); printf("\n"); printf("---------------------------\n"); } return 0; } int verificar_expressao(char *palavra){ int k; int i; for(i = 0;i < sizeof(expressoes)/sizeof(expressoes[0]);i++){ if(expressoes[i] == palavra){ k = i; break; }else{ continue; } } return k; } char *retorna_acao(int i){ return acao[i]; }

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.

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

Tem alguns problemas no seu código:

  • char palavra[4]="arroz"; O espaço reservado não joga com o tamanho guardado

  • for(i=1;i<=len_palavra;i++) Este for está com <= em vez de < apenas

  • if (letra[0] == palavra[i]) lacuna[i] == letra[0]; Dentro do if está a comparar com == em vez de atribuir o valor.

Para alem disso está a ler uma letra com gets como se fosse uma string e depois nas comparações usa apenas o primeiro caretere. Simplifique e use apenas um char.

Também não tem o critério de fim que deveria ser quando ambas as strings são iguais.

Acertando tudo isso ficaria assim:

int main () { int i,len_palavra; char lacuna[20]="_"; char letra; //apenas char char palavra[]="arroz"; //sem tamanho especificado setlocale(LC_ALL,"PORTUGUESE"); len_palavra = strlen(palavra); for(i=1; i<len_palavra; i++) //apenas com < lacuna[i]='_'; while (strcmp(palavra,lacuna) != 0) //strcmp para saber quando termina { system("cls"); printf("\t\t%s\n",lacuna); printf("\nDigite uma letra: "); scanf("%c",&letra); //scanf com %c em vez de gets for(i=0; i<len_palavra; i++) { if (letra == palavra[i]) lacuna[i] = letra; //atribuição em vez de comparação } } printf("\t\t%s\n",lacuna); //adicionei este printf para ver o estado final do jogo return 0; }

Veja o exemplo no Ideone

Note que utilizei a função strcmp para comparar as palavras, que retorna 0 quando são iguais.