Dexter's Lab Posted December 30, 2012 at 11:08 PM Report #489057 Posted December 30, 2012 at 11:08 PM 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.
HappyHippyHippo Posted December 30, 2012 at 11:34 PM Report #489062 Posted December 30, 2012 at 11:34 PM 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 Portugol Plus
pmg Posted December 30, 2012 at 11:47 PM Report #489064 Posted December 30, 2012 at 11:47 PM 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!
Dexter's Lab Posted December 30, 2012 at 11:50 PM Author Report #489065 Posted December 30, 2012 at 11:50 PM 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.
HappyHippyHippo Posted December 30, 2012 at 11:55 PM Report #489066 Posted December 30, 2012 at 11:55 PM ok, então um empurrãozinho para a solução para um vector N elementos = ordena o vector IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
Dexter's Lab Posted December 31, 2012 at 07:05 PM Author Report #489167 Posted December 31, 2012 at 07:05 PM (edited) 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. Edited December 31, 2012 at 07:35 PM by pmg geshi
HappyHippyHippo Posted December 31, 2012 at 07:13 PM Report #489168 Posted December 31, 2012 at 07:13 PM 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 Portugol Plus
pmg Posted December 31, 2012 at 07:40 PM Report #489172 Posted December 31, 2012 at 07:40 PM 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!
Dexter's Lab Posted January 1, 2013 at 12:26 PM Author Report #489184 Posted January 1, 2013 at 12:26 PM 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.
HappyHippyHippo Posted January 1, 2013 at 12:43 PM Report #489185 Posted January 1, 2013 at 12:43 PM (edited) 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; } } } // ... } Edited January 1, 2013 at 12:44 PM by HappyHippyHippo IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
Dexter's Lab Posted January 1, 2013 at 06:03 PM Author Report #489197 Posted January 1, 2013 at 06:03 PM 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.
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now