1. Este site usa cookies. Ao continuar a usar este site está a concordar com o nosso uso de cookies. Saber Mais.

Condição Ternária C++

Discussão em 'Programação' iniciada por tds, 31 de Outubro de 2008. (Respostas: 6; Visualizações: 1963)

  1. tds

    tds Power Member

    Boas pessoal!

    Tudo em cima?
    Espero que sim ;)

    Gostaria de saber se o seguinte programa dá para ser escrito com a condição ternária ao invés de if's.
    Já tentei fazer, mas dava-me sempre dois erros =z

    Utilizo o Visual Studio C++ 6.

    Aqui vai o código:

    Código:
    
    #include<iostream.h>
    void main (void){
    int x,y,z;
    cin >> x >> y >> z;
    cout << "___ \n" ;
    if(x<z)
          if (y<z)
               if(x<y)
                    cout << x << "<" << y << "<" << z << "\n";
               else
                    cout << y << "<" << x << "<" << z << "\n";
          else
               cout << x << "<" << z << "<" << y << "\n";
    else
          if(z<y)
               if (y<x)
                    cout << z << "<" << x << "<" << y << "\n";
               else 
                    cout << z << "<" << y << "<" << x << "\n";
          else 
              cout << y << "<" << z << "<" << x << "\n";
    return;
    }
    
    
    o programa ordena 3 numeros inseridos de forma crescente.


    Obrigado pelo vosso tempo.


    Tiago dos Santos ;)
     
    Última edição pelo moderador: 31 de Outubro de 2008
  2. Mr_Miguel

    Mr_Miguel Power Member

    Tive que corrigir o teu programa primeiro:

    Código:
    #include <iostream>
    
    int main (void) {
        int x,y,z;
        std::cin >> x >> y >> z;
        std::cout << "___ \n" ;
        if(x<z)
            if (y<z)
                if(x<y)
                    std::cout << x << "<" << y << "<" << z << "\n";
                else
                    std::cout << y << "<" << x << "<" << z << "\n";
            else
                       std::cout << x << "<" << z << "<" << y << "\n";
        else
            if(z<y)
                if (y<x)
                    std::cout << z << "<" << y << "<" << x << "\n";
                else
                    std::cout << z << "<" << x << "<" << y << "\n";
            else
                std::cout << y << "<" << z << "<" << x << "\n";
        return 0;
    }
    
    Na parte do (y < x), tens dois casos trocados. E nada de usar "void main()" ou "void main(void)": http://faq.cprogramming.com/cgi-bin/smartfaq.cgi?answer=1044841143&id=1043284376

    Agora, escrito com a condição ternária (ou, melhor dizendo, condições ternárias aninhadas):

    Código:
    #include <iostream>
    
    int main (void) {
        int x,y,z;
        std::cin >> x >> y >> z;
        std::cout << "___ \n" ;
        (x<z?
            (y<z?
                (x<y?
                    (std::cout << x << "<" << y << "<" << z << "\n"):(std::cout << y << "<" << x << "<" << z << "\n")
                )
                    :(std::cout << x << "<" << z << "<" << y << "\n")
            )
        :
            (z<y?
                (y<x?
                    (std::cout << z << "<" << y << "<" << x << "\n"):(std::cout << z << "<" << x << "<" << y << "\n")
                )
                    :(std::cout << y << "<" << z << "<" << x << "\n")
            )
        );
        return 0;
    }
    
    Tentei manter a mesma estrutura do código com os if's. Agora imagina se escreveres tudo na mesma linha, como geralmente se escrevem condições com operadores ternários...

    Moral da história: usar if's sempre que possível ;)
     
  3. tds

    tds Power Member

    LOOOL xD

    Obrigado! xD

    Sempre que possivel usarei os belos if's xD

    "my teacher said it's OK" --> isto foi o que aconteceu!! :P

    Vou mostrar ao meu prof o faq, a ver se ele muda a maneira de ensino ;)

    Mais uma vez, muito obrigado ;)

    já agora - aquele std está alí porque na chamada da biblioteca não está o *.h, certo?
    std::cin >> x >> y >> z;
     
  4. Mr_Miguel

    Mr_Miguel Power Member

    Nop. Eu tive que escrever std::cin e std::cout porque a seguinte linha não está presente:

    Código:
    using namespace std;
    Que, na realidade, nunca se deve importar um namespace todo. O mais correcto a fazer é:

    Código:
    using std::cin;
    using std::cout;
    Quanto ao <iostream> VS <iostream.h>, tanto quanto sei, o <iostream.h> está "deprecated" (i.e. já não se usa). Todas as bibliotecas do C++ devem ser importadas sem o uso do ".h".

    Link sobre namespaces: http://faq.cprogramming.com/cgi-bin/smartfaq.cgi?answer=1046398336&id=1043284351

    Também queria ver se colocava um link sobre a questão de não se usar o ".h" com bibliotecas do C++, mas não me parece que esteja na FAQ do cprogramming.com. Lembro-me, no entanto, de o pessoal nos fóruns do cprogramming.com dizer isso, e acredita que eles são bastante rigorosos :)
     
  5. tds

    tds Power Member

    Muito Obrigado miguel ;)

    Estou a ver que por aqui se aprende mesmo muito :D

    Isto está me a dar jeito, já que estou a pensar em ir às Olimpiadas da Informática este ano e não estou a imaginar aprender isto pelo meu professor xD


    Muito obrigado ;) pesquisarei sobre o <iostream.h> vs <iostream> então ;)

    Agradecido,
    Tiago dos Santos
     
  6. Warrior

    Warrior Power Member

    Posso-te explicar porque motivo se deixou de usar .h no C++, mas não garanto que percebas: não é algo simples ou evidente.

    Em C++ deixou-se de se importar os .h por causa dos templates.

    Uma função template deve ser declarada no mesmo ficheiro que o seu protótipo para o compilador poder fazer a linkagem correctamente.
    No entanto, por hábito (bons hábitos), é comum declarares nos .h as classes/protótipos e nos .cpp definires as funções.
    Assim, o ficheiro "iostream" não é mais do que um ficheiro que contém as linhas #include "iostream.h" e #include "iostream.cpp", ficando assim tanto o protótipo como a definição da função no mesmo ficheiro, e deixando de haver problemas com os templates.

    Em C isto obviamente não acontecia por não existirem templates..


    ---------------------


    Quanto às ONI, acho que deves participar. Tu e toda a gente, a partir do momento em que saibam ler. Aprende-se MUITO nas ONI, e não se deve participar com o objectivo de ganhar, mas sim de aprender mais.
    Este género de pormenores são completamente irrelevantes. Tu não vais fazer os teus próprios headers num concurso. (e muito raramente usar templates)
    Se queres treinar para as ONI, aprende algoritmia e lógica como deve ser. Resolve problemas dos anos anteriores, ou segue uma página de treino como por exemplo http://train.usaco.org (apesar de esta poder ser um bocado avançada de mais para o nível onde estás agora)
    Podes também resolver problemas no spoj.pl , por exemplo.

    Eu participei nas ONI 3 anos, e agora nos concursos universitários, e acho que é algo que todos deviam fazer.
     
  7. tds

    tds Power Member

    Hm... Percebi mais ou menos.
    Sou iniciante em C++ (12º ano Curso Tecnológico de Informatica :P WE ARE NOT DEAD YET :p), inda me faz um pouco de confusão algumas particularidades desta linguagem xD
    Obrigado pela explicação ;)

    Fiquei, inda assim, com algumas duvidas.
    Função template o que é? Qual o exemplo de uma?


    _ _ _ _ _ _ _ _

    Em relação às ONI, espero ir para lá aprender muito, e sair de lá com mais conhecimentos.
    Vou na desportiva, mas acima de tudo quero aprender e divertir-me (gosto de programação porque me obriga a pensar xD).

    Obrigado pelas dicas ;) já tenho mais uns passatempos agora xD
    A ver se me dou bem com isto ;)
     

Partilhar esta Página