Ajuda - exercicio de algoritmos

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.
 
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:
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.
 
por muito que tente nao consigo entender/gostar/programar em java
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.
 
.

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;)
 
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.
 
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.

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:
 
tens de fazer o resultado da divisao inteira, e o resto da divisao inteira
...
Os dígitos em hexadecimal 0 - 9 são 0x30 - 0x39.
...
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.
...
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:
[me@mybox] ~/Perl: perl num_armstrong.pl
Digite um numero: 153
Sou narcisista :)

[me@mybox] ~/Perl: perl num_armstrong.pl
Digite um numero: 407
Nao sou narcisista :(

[me@mybox] ~/Perl: perl num_armstrong.pl
Digite um numero: o que e um numero?
Numero invalido!

Perl is soooo sexy!! :-)
 
Última edição:
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. ;)
 
Claro que Java não é assim tão complicado
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:
[me@mybox] ~/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:
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:
é mais reinventar a roda que outra coisa qualquer.
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:
além de ser ilegível em Java
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:
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
 
AH!! Nem eu! até me crescem borbulhas nas pontas dos dedos só de escrever 'java'...

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:
que raio de linguagem que nos obriga a pensar e resolver os problemas sempre da mesma forma.

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:
E outra dúvida, que raio quer dizer isto:(...)
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.

Já agora que linguagem é que gostas de programar? Asm? Ansi C?
Pensei que isso já fosse claro pelos exemplos: Perl.
 
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.
 
A tua maneira de resolver o problema é uma de N
Sem dúvida.

e não é necessariamente a melhor
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.
 
Back
Topo