Encontrei este exercicio em um forum de programação e informatica. Um tanto engenhoso, devo admitir, e é otimo para praticar diferentes linguagens de programação, que podem exercitar muitos paradigmas. Infelizmente o professor pediu para fazer em Pascal.
o número 3025 possui a seguinte caracteristica: 30+25=55 e 55*55=3025. Escreva um programa que escreva todas os números com quatro algarismos que possuem a citada características.
Veja que solução elegante temos com ruby:
>> (1000..9999).find_all{|x| (x/100+x%100)**2 == x} => [2025, 3025, 9801]
Entretanto tive a apelar para uma sujeira (alguem percebe?) na versão em haskell:
Prelude> import List Prelude List> findIndices(\x -> ((x `div` 100)+(x `mod` 100))^2 == x && x > 1000)[0..9999] [2025,3025,9801]
Por fim, um simples ‘one liner’ usando gawk
$ seq 1000 9900 | gawk '(int($1/100) + $1%100) == sqrt($1){print}' 2025 3025 9801
É claro que a solução esperada é algo como
#include <math.h> #include <stdio.h> int main(){ int i; for(i=1000;i<=9999;i++){ if(((i/100)+(i%100))==sqrt(i)) printf("%d\n",i); } return 0; }
Até ANSI C é mais elegante – sem flamewars por favor, afinal todos sabem o que são programadores de verdade
Acredito que pascal é apenas uma convenção, as linguagens evoluem a cada ano e não existiria consenso se cada instituição escolhesse uma delas para ensinar algorítmo.
é fácil escrever one-liners para resolver problemas simples quando se é um programador de verdade (btw, o link que não aponta para nada no final do artigo foi proposital?)… porem quando não se tem noção alguma de como funciona uma linguagem de programação, e para exercitar o uso de estruturamento do flow de um algoritmo, pascal (até C++ ou PHP) faz um excelente serviço em ensinar o pessoal como organizar um algoritmo. Se depois, quando eles tiverem tanta experiencia quanto tu, eles resolverem este problema com one-liners, melhor para eles.
e teu código em C ANSI tá com um pequeno bug
ele tá fazendo (i/100)+(i%200))==sqrt(i) quando deveria ser i%200
err… i%100
É verdade, eu tive q editar pq o wordpress enfiou uns > em todo o canto e acabei fazendo besteira.
Tá, e cadê a versão em Pascal?
Ta ai uma coisa q eu não espero fazer…
Eu chuto que os motivos são três:
- Begin
- End
- Já está instalado (no caso o Turbo Pascal).
O Begin e o End porque enfatizam a programação estruturada, e o “já está instalado” (ie, inércia) nem precisa explicar.
Não entendo muito Haskell, mas assim não seria melhor?
[x| x <- [1000..9999], ((x `div` 100)+(x `mod` 100))^2 == x]
É verdade Paulo. Infelizmente na hora eu não sabia fazer isso e fiz via gambiarra. Realmente dessa forma fica muito melhor!
Existem várias questões envolvidas.
A primeira é separar o paradigma…lógico, funcional, imperativo…isso por sí só é uma discussão tremenda! Hoje em dia o mais utilizado é o imperativo….então, o leque se fecha em praticamente C, Pascal e Java (esqueça haskell, prolog, lisp, …).
Entre esses 3 casos, acredito que o uso de pascal tem mais a ver com questões didáticas do que qualquer outra coisa. O ponto é que o aluno que está aprendendo a programar não tem que se preocupar com detalhes da linguagem, mas sim com o problema em questão! Porque o objetivo é que não aconteça isso que foi feito no seu exemplo em Haskell…”gambiarra”, e depois use o argumento de “na hora eu não sabia fazer isso”, porque Pascal é tão simples que isso não seria um argumento válido!
O objetivo é ensinar a resolver problemas e não ter que fazer peripécias com a linguagem…para isso existem disciplinas mais avançados que dão conta do recado.
Ainda assim, atualmente, creio que um curso em Java é mais interessante do que qualquer outra linguagem (obviamente, se estamos falando de uma linguagem imperativa).
Pac, faltou a versão em COW: http://www.bigzaphod.org/cow/
@Wellington ate entendo esse ponto, entretanto que evoluções o Pascal teve nos ultimos anos?
Hoje em dia Perl, Python ou Ruby podem ser encontrados para quase todas as plataformas, possuem uma grande quantidade de frameworks, seu uso e instalação é muito simples, existe muita documentação, comunidades e projetos reais open-source que podem ser utilizados como fonte de estudo.
Existem referências a Pascal em 419 projetos no sourceforge, perl tem 4464, python tem 5531e ruby tem 943 (em compensação tem o RubyForge exclusivo). Java passa de 20 mil. Isso sem falar em Lua, Groovy…
Pessoalmente eu acredito que o Turbo-Pascal é incentivado (também) pelo seu uso com o sistema operacional Windows – afinal linux é muito “tela preta” pros estudantes e professores da atualidade. Ensinar programação estruturada imperativa pode ser feito com qualquer uma das linguagens acima (afinal todas elas tem if , while e for, entre outras coisas)
Então, o ponto exato não é o ensino de uma linguagem mas sim de estratégias para solucionar problemas com uma linguagem alto nível que seja fácil de se assimilar. Porque Pascal precisaria evoluir para ensinar os alunos a fazer um laço? Aliás, qual a evolução que o C-ANSI teve nos últimos anos? A meta é ensinar a pensar em como transformar problemas cotidianos em soluções computacionais.
Ainda, dentre esses projetos do sourceforge que você mencionou, quantos são usados para o ensino de programação? É diferente você colocar uma pessoa que já sabe programa, ou que tem alguma intimidade com isso, para olhar o código fonte de outros projetos e tirar alguma info de lá, daquela pessoa que sequer entende o porque de se usar um “if”!
Daí você cita que “programação estruturada imperativa pode ser usada em qualquer uma das linguagens”, o que é verdade, mas então porque não ser Pascal, se ela faz o que precisa, ou seja, assumir o seu papel passivo no aprendizado de técnicas de programação! Só porque não tem muitos projetos no sf? Inclusive, quem me garante que todo código que eu pegar lá vai ser uma boa referência?
Novamente, a questão não é o ensino da linguagem, mas sim de técnicas de programação. E se isso funciona bem com Pascal, então tá bom….é o suficiente.
Concordo com @Wellington.
Quando você está na faculdade o importante são os conceitos. Se pararmos de ensinar conceitos que tipo de pessoa serão ?
Talvez um “analfabeto funcional computacional” ?
Pascal funciona como um pseudo-código uma maneira simples de implementar a resolucão do problema.
Como você esperar que um aluno que está tentando transpor a linha entre “problema” e “solućão computacional” consiga deslumbrar a gambiarra em Haskell ?
É igual tentar ensinar série de Fourier para quem não viu cálculo I, II e III.
Urul, flamewar
Eu aprendi mais sobre programação estruturada e imperativa usando Fortran e C do que Pascal. No meu ponto de vista, Pascal não agrega tanto quanto outras linguagens atuais. Mas é a minha opinião: seria bom termos 2 grupos de pessoas com formações diferentes, uma que começou com Pascal e outra que começou com, digamos, Ruby, e fosse feita uma analise dos dois grupos.
@Paulo Castro
Desde quando parar de ensinar uma linguagem defasada é parar de ensinar conceitos? Pq não ensinar os mesmos conceitos com algo mais moderno, que tenha muita documentação, livros, seja usada pela industria, seja multiplataforma e que funcione como um pseudo codigo tão bem quanto ou até mais ?
O que o @Paulo Castro queria dizer é que a ênfase continua no conceito e não na linguagem! Certamente que isso pode ser feito com algo mais moderno (inclusive citei que, pessoalmente, prefiro Java), mas a discussão que surgiu é do porque não fazer isso com Pascal…
Na verdade, eu vi algumas discussões fortes sobre usar um paradigma funcional ao invés do imperativo para ensinar programação. Nesse link tem algumas discussões sobre: http://doi.acm.org/10.1145/1189136.1189183
Eu teria ficado muito feliz em ter aprendido o paradigma funcional 9 anos atrás. Quem sabe eu não deixaria de fazer as gambiarras em Haskell… hehehe
engraçado vc começar o texto provocando com “*infelizmente* o professor pediu pra fazer em pascal” e depois dizer algo idiota como “sem flamewars”. Até eu que sou um programador de verdade (C++) fiquei ofendido. Antes pascal do que uma droguinha de linguagem interpretada que não resolve nenhum problema de verdade.
programadores de verdade não ficam ofendidos a menos que tenham sido compilados com as opções coerentes.
Eles usam pascal por quê é didático, informa os erros de uma forma elegante e sem causar traumas. Quase te guia pelo código.
Não é recomendável começar o ensino por C ou Java ou, muito menos, Ruby. Elas não são didáticas, apesar de serem simples. Uma coisa não é sinônimo da outra.
Mas em uma segunda instância, é essencial adotar logo um C.
Uma evolução meio que Pascal – C – Depois um C++ ou Java mesmo…
Infelizmente, eu comecei a aprender por VB :s.. Tosco neh? Depois veio Java, C, Ruby, C++…. Caminho bem controverso, eu acho…
Independente da linguagem, não é melhor loopar pelas raízes quadradas em vez dos quadrados?
seq 10 99 | gawk ‘(int($1*$1/100) + $1*$1%100 == $1) {print $1*$1}’
perl -e ‘for(1000..9999){print$_,”-\n”if((int($_/100)+$_%100)==sqrt($_))}’
> v.10
perl -E ‘for(1000..9999){say$_,if((int($_/100)+$_%100)==sqrt($_))}’