Ir para o conteúdo
Dexter's Lab

Comparação de vetores

Mensagens Recomendadas

Dexter's Lab

Boas,

sou aluno em programação. Comecei há 3 meses, portanto, ainda tenho muita pedra que partir. Mas estou a treinar para o próximo período escolar.

Este é o meu primeiro tópico e pretendo contar com este fórum e com o vosso conhecimento para evoluir neste âmbito que me apaixona.

O exercício talvez vos seja simples mas não estou a conseguir colocá-lo em prática:

"23) Faça um programa que leia 3 números inteiros e imprima uma (e apenas uma) das seguintes mensagens:

 Todos os números são iguais;

 Todos os números são diferentes;

 Apenas dois números são iguais."

Originalmente seria para ser feito em "if's" mas pretendo fazer com lógica de vetores porque com "if's" não existe fundamentalmente aquele jogo lógico importante para um programador que estou certo que boa parte de vós possui e que pretendo também alcançar.

A minha dúvida passa essencialmente por saber como posso colocar esse vetor a auto-comparar os seus números, ou mesmo criando um outro vetor-espelho que caso encontrasse mais que um valor semelhante no seu antecedor que alteraria os printfs respetivos. Não tenho, contudo, conhecimento nem experiência suficiente para conseguir resolver isto sem um empurrão mesmo que tenha pesquisado sobre e que tenha matutado horas com.

Se me pudessem dar um empurrão nesta questão, agradecer-vos-ia imenso.

Desde já agradeço antecipadamente a atenção prestada.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

lógica de vectores ? não existe tal coisa ...

o que pretendes referenciar com tal afirmação ?

o que se poderia usar era ferramentas matemáticas como a variância e/ou o desvio padrão.

mas para um problema destes o melhor é mesmo usar os if's


IRC : sim, é algo que ainda existe >> #p@p

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
pmg

O mais que podes fazer é calcular um "valor especial" baseando-te no facto de que as expressoes condicionais, em C, tem valor 0 ou 1.

Nota que isto nao é mais do que ifs disfarcados.

#include <stdio.h>

static int valorespecial(int v[3]) {
 int t;
 t = (v[0] == v[1]) + (v[1] == v[2]);
 return t ? t : (v[0] == v[2]);
}

void printmessage(int arr[3]) {
 static const char *msg[] = {"all different",
                             "only two equal",
                             "all three equal"};
 printf("%s\n", msg[valorespecial(arr)]);
}

int main(void) {
 int numbers[3];

 numbers[0] = 1; numbers[1] = 2; numbers[2] = 3; /* diferentes */
 printmessage(numbers);

 numbers[0] = 1; numbers[1] = 1; numbers[2] = 3; /* 2 primeiros iguais */
 printmessage(numbers);

 numbers[0] = 1; numbers[1] = 2; numbers[2] = 1; /* 2 das pontas iguais */
 printmessage(numbers);

 numbers[0] = 1; numbers[1] = 3; numbers[2] = 3; /* 2 ultimos iguais */
 printmessage(numbers);

 numbers[0] = 1; numbers[1] = 1; numbers[2] = 1; /* tudo igual */
 printmessage(numbers);

 return 0;
}


What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Dexter's Lab

lógica de vectores ? não existe tal coisa ...

o que pretendes referenciar com tal afirmação ?

o que se poderia usar era ferramentas matemáticas como a variância e/ou o desvio padrão.

mas para um problema destes o melhor é mesmo usar os if's

Obrigado pela resposta.

"Lógica de vetores" no sentido de controlar muito bem vetores, maleando-os, quase que brincando com eles. Ter um à-vontade com vetores que se pode fazer qualquer coisa facilmente do que lhes respeite. Um bom programador possui esta capacidade.

Eu quero fazer o exercício com vetor, não com if's, pois isso sei fazer. Fazer um programa que à partida já se o sabe fazer não trás evolução nem aprendizagem. Além disso aquele limite de 3 poderia ser 100 ou 200, e eu não iria fazer duzentos if's por duzentos ou's/e's. Por isso tenho que saber trabalhar com vetores, para poder dominar bem essas técnicas. É esse o meu objetivo e espero que compreendas o meu ponto.

Tenho a certeza que existe uma lógica que consegue comparar quantos valores o vetor tem repetidos. Já vi umas na net, inclusive, mas não consegui interpretar o porquê de serem assim. Por isso estou a pedir a vossa ajuda.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Dexter's Lab

ok, então um empurrãozinho para a solução para um vector N elementos = ordena o vector

Muito obrigado. Finalmente e graças à vossa ajuda consegui resolver.

Eis o código:

#include <stdio.h>

void vet();
void verifvet();

int main(void)
{
FILE *teste3;
char txt[200];

teste3 = fopen ("teste3.txt","r");
fgets (txt,sizeof(txt),teste3);
fclose (teste3);

printf ("%s\n\n",txt);

vet();

getche();
return 0;
}


void vet()
{
int vetor[3], cont, conta, aux=0;

for (cont=1; cont<4; cont++)
{
printf("Digite %do valor: ", cont); scanf("%d",&vetor[cont]);
}

for (cont=1; cont<4; cont++)
{
for (conta=cont+1; conta<5; conta++)
{
if (vetor[cont] == vetor[conta])
{
aux+=1;
}
}
}

if (aux>0 && aux<3) { printf ("%d numero(s) diferente(s)!", aux); }
else if (aux == 3) { printf("Todos os %d valores sao iguais!", aux); }
else if (aux == 0) { printf("Nenhum valor e igual!"); }
}

Gostaria, já agora, também de te peguntar, Pmg, de que se trata a seguinte função que está presente no teu código:

void printmessage(int arr[3]) {
 static const char *msg[] = {"all different",
                             "only two equal",
                             "all three equal"};
 printf("%s\n", msg[valorespecial(arr)]);
}

Achei muito interessante e gostaria de saber a mecânica e o que posso estudar sobre C para aprender sobre esse trecho.

Muito obrigado e bom ano a todos.

Editado por pmg
geshi

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

chegaste a testar o código ?

isso tem vário problemas, de acesso a elementos do vector/array

1º - os índices do vector/array começa em 0

2º - estas constantemente a aceder elementos que não existem no vector/array

se declaras um array com 3 elementos, só existem os índices 0, 1 e 2

não sei porque razão estás a ler um ficheiro no início da aplicação

etc, etc ...

o código que te foi apresentado pelo @pmg e não eu, é uma função que dado um índice do array de mensagens, apresenta essa mensagem na consola


IRC : sim, é algo que ainda existe >> #p@p

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
pmg

Gostaria, já agora, também de te peguntar, Pmg, de que se trata a seguinte função que está presente no teu código:

void printmessage(int arr[3]) {
 static const char *msg[] = {"all different",
                             "only two equal",
                             "all three equal"};
 printf("%s\n", msg[valorespecial(arr)]);
}

Achei muito interessante e gostaria de saber a mecânica e o que posso estudar sobre C para aprender sobre esse trecho.

Ora bem ... ha duas coisas a funcionar nessa funcao.

Primeiro o argumento arr. Esse mesmo argumento é usado na chamada a funcao valorespecial(). Esta funcao devolve 0 ou 1 ou 2 consoante os elementos do arr sejam todos diferentes ou tenham um par igual ou sejam todos iguais.

Depois ha a impressao dum dos elementos do array msg: pode ser o primeiro (msg[0]) ou o segundo ou o terceiro.

A maneira que eu construi o array e a maneira que a funcao valorespecial() funciona conjugam-se para o efeito desejado: imprimir uma descricao do codigo 0, 1, ou 2 sobre os valores repetidos no array recebido inicialmente.


What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Dexter's Lab

chegaste a testar o código ?

isso tem vário problemas, de acesso a elementos do vector/array

1º - os índices do vector/array começa em 0

2º - estas constantemente a aceder elementos que não existem no vector/array

se declaras um array com 3 elementos, só existem os índices 0, 1 e 2

não sei porque razão estás a ler um ficheiro no início da aplicação

etc, etc ...

o código que te foi apresenta do pelo @pmg e não eu, é uma função que dado um índice do array de mensagens, apresenta essa mensagem na consola

Viva. Desde já, um bom ano. Achei que fosse melhor começar pelo 1 para poder usar o seu numero para receber os valores no printf. Ou seja, sendo que ele tem 3 valores, começando no 1 e incrementa até que seja um valor menor que quatro; serão o 1,2,3. Entao quando ele pede o valor no printf pede assim: "digite %d(1 ou 2 ou 3, dependendo da volta)º valor: ".

O ficheiro que tou a colocar no inicio é o enunciado do exercicio. Em vez de o transcrever. E assim vou aprendendo sobre ponteiros e sobre aquelas funções.

HappyHippyHippo, obrigado pelas dicas. Se tiveres mais críticas a fazer pedia-te que as indicasses. Comecei há pouco tempo e tenho pouca experiência. Todas as críticas serão muito consideradas.

Pmg, vou estudar essa função e o teu código juntamente com a tua explicação. Muito obrigado.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

Achei que fosse melhor começar pelo 1 para poder usar o seu numero para receber os valores no printf. Ou seja, sendo que ele tem 3 valores, começando no 1 e incrementa até que seja um valor menor que quatro; serão o 1,2,3. Entao quando ele pede o valor no printf pede assim: "digite %d(1 ou 2 ou 3, dependendo da volta)º valor: ".

pois, mas não deixa de ser um problema sério, e é algo que tens de ser alterado

vou dar uma olhada mais profunda no teu código:

int vetor[3]; // array com 3 elementos (índices 0, 1 e 2)

// ...

for (cont=1; cont<4; cont++) // estás a iterar os valores 1, 2 e 3, mas 3 não faz parte do array
{
 printf("Digite %do valor: ", cont);
 scanf("%d",&vetor[cont]); // quando a variável "cont" tiver o valor de 3, terás problemas ...
}

for (cont=1; cont<4; cont++) // estás a iterar os valores 1, 2 e 3, mas 3 não faz parte do array
{
 for (conta=cont+1; conta<5; conta++) // estás a iterar os valores 2, 3 e 4 ?????
 {
   if (vetor[cont] == vetor[conta])
   {
     aux+=1;
   }
 }
}

vou dar uns toques no teu código para veres as correcções que deveriam ser feitas :


// declaração do valor de elementos do array
// isto por é mais simples teres este tipo de valores separados do código
// desta forma, o código ganha duas vantagens
// - é fácil alterar um parâmetros (em vez de teres alterar em todo o código
// - obriga-te a criar código adaptável a condições diferentes (que acredita, te ajudará imenso)
#define MAX 3

int main()
{
 int vetor[MAX]; // array com MAX elementos (já sabes que são 3)

// ...

 for (cont=0; cont<MAX; cont++) // ciclo que itera os valores 0, 1 e 2
 {
   printf("Digite %do valor: ", cont + 1); // como vês, não existe dificuldade em converter o 0 em 1, 1 em 2 e 2 em 3
   scanf("%d", &vetor[cont]);
 }

 // solução para um array de 3 elementos
 // caso o array tiver mais do que três, o problema terá de ser reformulado assim como a solução
 for (cont=0; cont<MAX; cont++) // ciclo que itera todos os elementos do array
 {
   for (conta=cont+1; conta<MAX; conta++) // ciclo que itera todos os elementos depois do elemento na posição "cont"
   {
     if (vetor[cont] == vetor[conta])
     {
       aux+=1;
     }
   }
 }

// ...
}

Editado por HappyHippyHippo

IRC : sim, é algo que ainda existe >> #p@p

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Dexter's Lab

HHHippo, ficou perfeito.

De facto são alguns erros lógicos que acho que pertencem a muitos/todos os principiantes. Felizmente pude contar com a tua ajuda e paciência para aprender mais e retificar o código. Essas dicas foram mesmo muito boas e a ajuda foi excelente. Muito obrigado pelos teus conhecimentos.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.