Jump to content
Debbugger

Retornar 3 floats para a função main

Recommended Posts

Debbugger

Boas.Sou iniciante no mundo da programação e estou a fazer um programa que recebe os valores do lado de um triangulo introduzido pelo utilizador e indica se estes podem formar um triangulo e que tipo de triangulo.

Para isso defini 3 funções uma para ler os valores introduzidos , outra para verificar o tipo de triangulo e outra ainda para verificar se os valores podem formar um triangulo.(nao sei se e maneira mais facil de resolver o problema mas e assim que tenho de fazer)

Depois quando corro o programa ele fica preso na leitura do primeiro cateto e depois de introduzir tres vezes , o programa mostra todas as condições dos if's que tinha definido, dizendo por exemplo que o triangulo e isosceles e escaleno,etc..

Eu penso que o problema está na forma como eu faço o retorno dos valores dos lados para a main e para isso defini a seguinte função :

float ler_comprimento(){

float cateto_1,cateto_2,hipotenusa;

  printf("Introduza o cateto1 :\n");

  scanf("%f",&cateto_1);

  return cateto_1;

  printf("Introduza o cateto 2:\n");

  scanf("%f",&cateto_2);

  return cateto_2; 

  printf("Introduza a hipotenusa:\n");

  scanf("%f",hipotenusa");

return hipotenusa;

}

Depois na main faço umas atribuições do genero

void main(void){

float cateto_1,cateto_2,hipotenusa;

cateto_1=ler_num();

cateto_2=ler_num();

hipotenusa=ler_num();

......

Alguém me podia dar uma ajuda, acerca da forma como devo retornar aqueles 3 valores para a main?

Obrigado.Cumprimentos

Share this post


Link to post
Share on other sites
Localhost

Ponteiros. Passas o endereço das variáveis à função e alteras o seu valor directamente memória.


here since 2009

Share this post


Link to post
Share on other sites
Debbugger

E como é que eu faço isso?Não há outra forma de contornar o problema?É que eu ainda não falei em ponteiros nas aulas.

Cumprimentos

Share this post


Link to post
Share on other sites
Localhost

Há. Declaras as variáveis como variáveis globais e assim já as podes aceder a partir de qualquer função.

Repara que quando o programa executa o return a função termina logo aí, portanto não será executada mais nenhuma instrução.


here since 2009

Share this post


Link to post
Share on other sites
Debbugger

A espiga é que o meu prof disse que não queria variaveis globais no programa, só locais.Ele falou em qualquer coisa como fazer várias  chamadas a esta função na main...Outra soulução obvia mas um bocado estupida era definir 3 funções separadamante sendo que  cada uma para lia um cateto e a hipotenusa e depois retornava isso para a main.

Cumprimentos

Share this post


Link to post
Share on other sites
Localhost

O teu professor quer inventar um bocado.. tão típico que me deixa triste.. não vais aprender nada com isso mas pronto.

Podes enviar para a função um argumento extra que te vai indicar o que queres retornar. Por exemplo, se mandares para a função o valor 1 ele retorna o primeiro cateto, se mandares o valor 2 ela retorna o segundo cateto e se enviares o valor 3 ela retorna a hipotenusa.


here since 2009

Share this post


Link to post
Share on other sites
Baderous

O teu professor quer inventar um bocado.. tão típico que me deixa triste.. não vais aprender nada com isso mas pronto.

Por acaso não quer inventar nada, é bem possível fazer isto sem usar apontadores, basta que a função ler_comprimento declare uma variável auxiliar do tipo float, leia um valor desse tipo e o retorne. Como vai ser atribuído a cada cateto, estes recebem o valor lido de cada vez:

#include <stdio.h>

float ler_comprimento() {
        float aux;
        printf("Introduza o valor: ");
        scanf("%f",&aux);
        return aux;
}

int main(void) {
        float cateto1, cateto2, hipotenusa;
        cateto1 = ler_comprimento();
        cateto2 = ler_comprimento();
        hipotenusa = ler_comprimento();
        printf("Cateto 1: %f\nCateto 2: %f\nHipotenusa: %f\n",cateto1,cateto2,hipotenusa);
        return 0;
}

Share this post


Link to post
Share on other sites
Debbugger

Não percebi muito bem este trecho de código.o Baderous disse"basta que a função ler_comprimento declare uma variável auxiliar do tipo float, leia um valor desse tipo e o retorne. Como vai ser atribuído a cada cateto, estes recebem o valor lido de cada vez", mas assim não é retornado apenas um valor para a main?E não percebi muito bem a função dessa variavel aux...O utilizador insere o valor e este é armezado na variavel aux e depois é feito o retorno da aux.Mas em que isto difere da solução inicial?

Obrigado.Cumprimentos

Share this post


Link to post
Share on other sites
Baderous

A descrição que deste de "fazer várias chamadas a esta função na main" e usar apenas variáveis locais (dicas dadas pelo teu professor) resulta na solução que te apresentei. Agora se queres mais do que isso, então aí já é capaz de ser preciso apontadores ou algo do género.

Share this post


Link to post
Share on other sites
Xpirito

Já agora aqui fica a minha ideia:

1-> Les os valores para os catetos e para a hipotebusa

2-> Envias para a função para saberes se o teorema de pitagoras se aplica

3-> Se o teorema de pitágoras não se aplicar com os valores que passaste, mandas os valores para a função que vai analisar se o  triangulo è isosceles ou escaleno.

Parece simples. Poderá não ser a melhor solução em termos de recursos, mas funcionará e entenderás com mais facilidade. :D


Para perguntas idiotas, respostas estúpidas!

Share this post


Link to post
Share on other sites
Debbugger

Mais do que isso?Como assim? Sim o meu prof deu essas dicas que mencionei, mas o que continuo a querer é que a função ler_comprimento(); devolva 3 floats para a main.Penso que o meu prof tinha isso mente quando deu a dica ,logo, nesse sentido deve dar para fazer isto sem apontadores.

Na solução que me deste nao percebo o que é aquele float aux?Para que serve aquilo?Pedes um valor ao utilizador e depois guardas o valor na variável aux e depois?Atribuis esse valor a variavel cateto_1 na main e fica guardado na main esse valor , é isso?E depois o utilizador mete o cateto_2 este e guardado na aux e depois na main faço a atribuição e isso?

Se sim supõe que eu queria usar as variaveis cateto_1 e cateto_2 da main depois de terem esses valores noutras funções é possivel não é?Basta por exemplo ao definir a função verifica_triangulo(float cateto_1, float cateto_2){....

Cumprimentos.Obrigado

Share this post


Link to post
Share on other sites
Baderous

Mais do que isso?Como assim? Sim o meu prof deu essas dicas que mencionei, mas o que continuo a querer é que a função ler_comprimento(); devolva 3 floats para a main.Penso que o meu prof tinha isso mente quando deu a dica ,logo, nesse sentido deve dar para fazer isto sem apontadores.

Isso fazes ou com apontadores ou definindo uma struct com os 3 campos. De outra forma não dá.

Na solução que me deste nao percebo o que é aquele float aux?Para que serve aquilo?Pedes um valor ao utilizador e depois guardas o valor na variável aux e depois?Atribuis esse valor a variavel cateto_1 na main e fica guardado na main esse valor , é isso?E depois o utilizador mete o cateto_2 este e guardado na aux e depois na main faço a atribuição e isso?

Sim é isso tudo, o aux é apenas uma variável auxiliar para onde é lido o valor, este é devolvido pela função ler_comprimento para a main, e na main é atribuído à variável do lado esquerdo do sinal de igual '='.

Se sim supõe que eu queria usar as variaveis cateto_1 e cateto_2 na main depois de terem esses valores noutras funções é possivel não é?Basta por exemplo ao definir a função verifica_triangulo(float cateto_1, float cateto_2){....

Sim é possível, o código está a funcionar caso ainda não tenhas reparado.

Share this post


Link to post
Share on other sites
Debbugger

Isso fazes ou com apontadores ou definindo uma struct com os 3 campos. De outra forma não dá.

Sim é isso tudo, o aux é apenas uma variável auxiliar para onde é lido o valor, este é devolvido pela função ler_comprimento para a main, e na main é atribuído à variável do lado esquerdo do sinal de igual '='.

Sim é possível, o código está a funcionar caso ainda não tenhas reparado.

Mas afinal dá ou não?Então primeiro dizes que tenho de usar uma struct ou apontadores , mas depois dizes que o codigo ta a funcionar e que percebi bem.Então se percebi bem funciona, acho eu segundo o meu raciocinio....O que me interessa se a função retorna um valor de cada vez??O que eu quero e os 3 valores na main..Mas olha la no teu codigo nao faltam chamdas a função ler _comprimento?É que tu só fizeste a atribuição mas isso nao garante que esta é executada 3 vezes para o utilizador poder por os 3 parametros ou garante?Desculpa la ,as duvidas mas tou a tentar perceber como é que esta cena funciona.

Cumprimentos.Obrigado

Share this post


Link to post
Share on other sites
Baderous

O que não dá para fazer de outra forma sem ser com apontadores ou structs é devolver os 3 valores de uma só vez da função ler_comprimento para a main. Como eu fiz, em que alteras 1 valor de cada vez, dá.

Quanto ao resto, executa o código e descobre por ti.

Share this post


Link to post
Share on other sites
Debbugger

Ok,obrigado.Já o teria feito mas nao tenho o codeblocks neste pc e nao sei usar muito bem a linha de comandos, daí eu ter perguntado.

Cumprimentos

Share this post


Link to post
Share on other sites
Localhost

Baderous: O que eu quis dizer é que ele não vai certamente aprender nada com isto e que é daquele tipo de exercícios que quando se aprende algo mais avançado se pensa "que estupidez de resolução que era aquela"..

De qualquer das formas foi bem pensada essa da varíavel auxiliar... :)


here since 2009

Share this post


Link to post
Share on other sites
Debbugger

E em termos de poupança de memória e de rapidez de execução do código?Como é melhor com as structs e os ponteiros ou da forma que o baderous fez?Suponho que em termos de rapidez de execução do código seja melhor com ponteiros mas secalhar ocupa mais memória ou nao?

Cumps

Share this post


Link to post
Share on other sites
Baderous

É mais rápido com apontadores porque se faz apenas 1 chamada à função ler_comprimento (e não 3 como está agora) e, por conseguinte, ocupa menos memória.

@Localhost: pois, mas começa-se sempre pelo mais fácil.

Share this post


Link to post
Share on other sites

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 account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.