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

Ajuda - exercicio de algoritmos

Discussão em 'Programação' iniciada por PasterOfMuppets, 29 de Outubro de 2007. (Respostas: 35; Visualizações: 5948)

  1. Pessoal, tenho uns exercicios para entregar de programação em pseudo-codigo e java. por muito que tente nao consigo entender/gostar/programar em java e em pseudo-codigo

    Se me puderem ajudar com estes exercicios agradecia:

    Exercicio 1

    Elabore um algoritmo e descreva-o em pseudo-código que verifica se um dado número é número de Amstrong.
    Um número é de Amstrong se a soma dos cubos dos seus dígitos é igual ao próprio número.

    Exemplo:
    407 = 43 + 03 +73 =64+0+343


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

    Exercício 2
    Elabore um programa ( algoritmo em Pseudo-código e código Java) que dadas as temperaturas máximas diárias registadas durante um período de N dias numa determinada cidade determinar qual a temperatura máxima registada nesse período e a apresentar a informação com o seguinte formato.
    Na cidade de XXXX
    durante os últimos XXX dias
    a temperatura máxima registada foi de XXX ºC.
     
  2. HecKel

    HecKel The WORM

    Qual é a tua dúvida nisso?
     
  3. Baderous

    Baderous Banido

    1 - Isto talvez ajude....
    2 - Usa um array.
     
  4. O meu problema é não perceber nada do que me é pedido e como é que ponho isso em linguagem de programaçao...

    E ainda n dei arrays
     
    Última edição: 29 de Outubro de 2007
  5. HecKel

    HecKel The WORM

    Pega no exemplo que o Baderous deu, tens aí os ingredientes todos ;) Agora só tens de pensar um bocado :)

    Para a próxima coloca dúvidas concretas, não coloques enunciados, sff.
     
  6. slack_guy

    slack_guy Power Member

    AH!! Nem eu! até me crescem borbulhas nas pontas dos dedos só de escrever 'java'... que raio de linguagem que nos obriga a pensar e resolver os problemas sempre da mesma forma.
     
  7. freskhy

    freskhy Power Member

    .

    tipo n custava nada a ninguem daki dar-te a resposta chapada, mas assim nunca vais conseguir fazer nada. Isso pelo que entendo e uma cadeira k tens pra fazer, e se nao entenderes vais chegar ao exame e vais-te espetar >< e mais facil tentares puxar pela cabeça e ***** duvida k tenhas o pessoal ai ajuda-te;)
     
  8. napalm

    napalm Power Member

    Quanto é 407 / 10 ? 40
    E qual o resto? 7
    Quanto é 40 / 10 ? 4
    E qual é o resto? 0
    Quanto é 4 / 10 ? 0
    E qual o resto? 4
    A divisão dá zero portanto não vale a pena continuar.

    A soma do cubo dos restos é igual a 407?
    -> Sim

    Fim.

    Agora é passar isto para java.
    Dica: um ciclo while pode ir vendo se a divisão dá 0, e podes arranjar uma variável exterior ao ciclo que vá guardando o resultado da soma.
     
  9. freskhy

    freskhy Power Member

    .

    tens de fazer o resultado da divisao inteira, e o resto da divisao inteira
     
  10. Consu

    Consu Power Member

    Eu só acrescentava duas coisas (por questões de desempenho, não que seja crítico :x2: ), porque o napalm já disse tudo:

    1 - Os dígitos vão de 0 - 9, seria boa ideia ter um array/vector com 10 posições para evitar estar sempre a calcular os cubos.
    Ex: int[] cubos = new int[10]; ( Agora um ciclo para inicializar os cubos e depois usar cubos[dígito] )

    2 - Se o valor for lido do teclado, pode ser lido directamente como uma string. Desta forma basta começar a ler a última posição da string até à primeira (mais um ciclo :p ). Para obter o dígito basta digito = caracter & 0x0F;

    Notas:
    Os dígitos em hexadecimal 0 - 9 são 0x30 - 0x39.



    Mas isto já sou eu a pensar em optimizações. :002:
     
  11. slack_guy

    slack_guy Power Member

    Eu não acredito que o Java seja tão complicado como vocês o pintam.
    Só tem de verificar se a soma do cubos de cada digito é igual ao numero introduzido.
    Código:
    #!/usr/bin/perl 
    # ficheiro: num_armstrong.pl
    
    use strict;
    use warnings;
    
    print "Digite um numero: ";
    chomp( my $numero = <> );
    
    is_valid( $numero )
      ? print narcisista( $numero )
      : print q|Numero invalido!|;
    
    exit 0;
    
    sub narcisista {
    
        my $num = shift;
    
        my $sum;
    
        # soma dos cubos de cada digito
        $sum += ( $_**3 ) foreach split //, $num;
    
        $sum == $num
          ? return qq|Sou narcisista :)\n|
          : return qq|Nao sou narcisista :(\n|;
    
    }
    
    sub is_valid {
    
        my @params = @_;
        foreach (@params) { return if !$_ || $_ =~ /\D/gmx }
        return 1;
    
    }
    
    Output:
    Código:
    [[email protected]] ~/Perl: perl num_armstrong.pl
    Digite um numero: 153
    Sou narcisista :)
    
    [[email protected]] ~/Perl: perl num_armstrong.pl
    Digite um numero: 407
    Nao sou narcisista :(
    
    [[email protected]] ~/Perl: perl num_armstrong.pl
    Digite um numero: o que e um numero?
    Numero invalido!
    
    Perl is soooo sexy!! :-)
     
    Última edição: 30 de Outubro de 2007
  12. Consu

    Consu Power Member

    O objectivo não era fornecer código, mas sim fornecer as bases para implementar. Claro que Java não é assim tão complicado, simplesmente ninguém colocou aqui o código para que ele possa aprender. ;)
     
  13. slack_guy

    slack_guy Power Member

    Também me quer parecer que não. Mas por que raio o estavam a encaminhar para contas 'complicadíssimas'?

    BTW, o 2º exercício seria qualquer coisa como:
    Código:
    #!/usr/bin/perl 
    # Ficheiro: temperatura.pl
    
    use strict;
    use warnings;
    
    print q|Digite o nome da cidade: |;
    chomp( my $cidade = <> );
    
    my $dias = {};
    
    for ( 1 .. 7 ) {
        print q|Temperatura registada no dia | . $_ . q|: |;
        chomp( my $temp = <> );
        if ( is_valid($temp) ) {
            $dias->{$_} = $temp;
        }
        else {
            print qq|Numero invalido!\n|;
            exit 0;
        }
    }
    
    print resultados( $cidade, $dias );
    
    exit 0;
    
    sub resultados {
    
        my ( $onde, $temps ) = @_;
    
        my $ndias  = scalar keys %$temps;
        my $media  = 0;
        my $maxima = 0;
        my $minima = 0;
    
        my @arr_val;
    
        foreach ( keys %$temps ) {
            $media += $temps->{$_};
            push @arr_val, $temps->{$_};
        }
    
        $media /= scalar keys %$temps;
        $media = sprintf( "%.1f", $media );
    
        @arr_val = sort { $a <=> $b } @arr_val;
    
        $minima = $arr_val[0];
        $maxima = $arr_val[-1];
    
        return <<"RESULTADOS";
    -----------------------------------------
    Na cidade de $onde
    durante $ndias dias as temperaturas foram:
    MEDIA : $media ºC
    MAXIMA: $maxima ºC
    MINIMA: $minima ºC
    -----------------------------------------
    RESULTADOS
    
    }
    
    sub is_valid {
    
        my @params = @_;
        foreach (@params) { return if !$_ || $_ !~ /^-?\d+(\.\d+)?$/gmx }
        return 1;
    
    }
    
    Output:
    Código:
    [[email protected]] ~/Perl: perl temperatura.pl
    Digite o nome da cidade: Lisboa
    Temperatura registada no dia 1: 20
    Temperatura registada no dia 2: 21
    Temperatura registada no dia 3: 18
    Temperatura registada no dia 4: 15
    Temperatura registada no dia 5: 10
    Temperatura registada no dia 6: -2
    Temperatura registada no dia 7: 0.5
    -----------------------------------------
    Na cidade de Lisboa
    durante 7 dias as temperaturas foram:
    MEDIA : 11.8 ºC
    MAXIMA: 21 ºC
    MINIMA: -2 ºC
    -----------------------------------------
    
    Sorry, não resisti :-)
    Também se aprende olhando para o código, ainda que seja numa linguagem diferente daquela que temos de usar (e assim não estou a fazer-lhe o TPC...)
     
    Última edição: 30 de Outubro de 2007
  14. napalm

    napalm Power Member

    Contas complicadissimas??? Talvez para um code-monkey, mas acho que na 4ª classe já se aprende a divisão e o resto.
    Código:
    # soma dos cubos de cada digito
        $sum += ( $_**$bas ) foreach split //, $num;
    
    Esta é uma hipótese mas além de ser ilegível em Java é mais reinventar a roda que outra coisa qualquer.
     
    Última edição: 30 de Outubro de 2007
  15. slack_guy

    slack_guy Power Member

    Não inventei nada. Estava escrito no enunciado: "Um número é de Armstrong se a soma dos cubos dos seus dígitos é igual ao próprio número. " (além do mais, esta definição não está inteiramente correcta. Deixo como exercício para o 'xupa-mos' descobrir onde está o 'gato' :-) ).
    Não tem nada que se meter a fazer 'restos' e conversões para hexadecimal. É claro como água.

    EDIT:
    Tens razão. Tanto quanto _não_ sei de Java, não existe um operador para exponenciação, tem de se usar uma classe ou coisa que o valha. Oh well....
     
    Última edição: 30 de Outubro de 2007
  16. PJTuga

    PJTuga Power Member

    Será que todos os exercicios de programação que eu tenho de entregar vão aparecer aqui?

    Eu já os fiz. Estes são para entregar até dia 5 de Novembro. e como ainda falta algum tempo.
    Mais tarde dou-te uma ajuda. (Agora tou sem tempo). Aproveita e vai pensando.

    se eu não tivesse aprendido a programar no ensino secundário, acho que agora estava "tramado".
    Por isso compreendo, as dificuldades que tens em resolver estes exercicios.

    Cumpz, fica bem
     
  17. reise

    reise Power Member

    Quem não sabe é como quem não vê!
    Já agora que linguagem é que gostas de programar? Asm? Ansi C?

    E outra dúvida, que raio quer dizer isto:
    Como até gosto de Java, tirei um tempinho para te fazer o exercicio em linguagem Java, não em oop!
    Código:
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    
    public class TempMaxima {
    
        public static void main(String[] args) {
            BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
            String cidade = null;
            try {
                System.out.print("Nome da cidade: ");
                cidade = in.readLine();
            } catch (IOException e) {
                e.printStackTrace();
                System.exit(1);
            }
    
            int dias = 0;
            try {
                System.out.print("Número de dias: ");
                dias = Integer.parseInt(in.readLine());
            } catch (IOException e) {
                e.printStackTrace();
                System.exit(1);
            }
    
            float temp = 0;
            float tempMaxima = 0;
            for (int i = 1; i <= dias; i++) {
                try {
                    System.out.print("Temperatura para o dia " + i + ": ");
                    temp = Float.parseFloat(in.readLine());
                    if (temp > tempMaxima) {
                        tempMaxima = temp;
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                    System.exit(1);
                }
            }
    
            System.out.println("Na cidade de " + cidade);
            System.out.println("durante os últimos " + dias + " dias");
            System.out.println("a temperatura máxima registada foi de "
                    + tempMaxima + " ºC.");
        }
    }
     
    Última edição: 30 de Outubro de 2007
  18. slack_guy

    slack_guy Power Member

    Quer dizer que é uma linguagem que te impõem um determinado paradigma de programação. Quando um paradigma é imposto tendemos a equacionar os problemas à luz dos constrangimentos desse mesmo paradigma: o programador perde liberdade para analisar e resolver problemas fora dos limites desse paradigma.

    Pensei que isso já fosse claro pelos exemplos: Perl.
     
  19. napalm

    napalm Power Member

    Não percebeste ainda. O Java é tipificado e não podes simplesmente fazer esse foreach que fizeste em Perl, que btw é a parte ilegível que eu estava a falar.
    E percebe outra coisa. A tua maneira de resolver o problema é uma de N e não é necessariamente a melhor. Para problemas matemáticos, existe um algoritmo matemático que os resolve daí ser o método das divisões e restos o ensinado em cadeiras de introdução à programação. Até porque há linguagens que não tem strings de todo o que obviamente não é verdade em relação a inteiros e floats.
     
  20. slack_guy

    slack_guy Power Member

    Sem dúvida.

    Não foi isso que disse. Porventura dei a entender que seria a mais simples.

    Quanto ao resto, confirmaste o que eu disse em #18. Essa é a minha malapata com o Java: tens de fazer as 'coisas' da forma que alguém entendeu ser a melhor e não da forma que tu (o programador) queres.
     

Partilhar esta Página