http://www.paim.pro.br/hall/
HALL
A nica forma de aprender uma nova linguagem de programao escrevendo programas nela. Brian Kernighan & Dennis Ritchie. (criadores da linguagem C)
Denominao
HALL uma homenagem ao computador da nave Discovery, do filme 2001 Uma Odissia no Espao, na verdade HAL (Heuristically-programmed ALgorithmic computer), obra prima da gerao de computadores.
Comentrios
Utilizados
Notao
// /*
*/
ser feitos para serem lidos por seres humanos! os comentrios no momento em que estiver escrevendo o algoritmo.
Escreva
comentrios no prlogo:
/***************************************** /***************************************** UNIVERSIDADE FEDERAL DO AMAZONAS UNIVERSIDADE FEDERAL DO AMAZONAS FULANO DA SILVA FULANO DA SILVA DATA: 25/11/2006 DATA: 25/11/2006 LTIMA MODIFICAO: 26/12/2007 LTIMA MODIFICAO: 26/12/2007 ALGORITMO DE DEMONSTRAO ALGORITMO DE DEMONSTRAO *****************************************/ *****************************************/
hip := sqrt(cat1 * cat1 + cat2 * cat2); hip := sqrt(cat1 * cat1 + cat2 * cat2);
Utilize
Hello World!
Abaixo est a verso hall do clssico exemplo do 1 programa escrito na linguagem C, o conhecido "Hello, world". algoritmo() { }
Incio do Algoritmo Instruo Palavra Reservada
escreva("Hello,world");
Fim do Algoritmo
Entrada e Saida
Funo escreva()
A funo escreva() tem por objetivo exibir na tela do computador diversas expresses aceitas pelo interpretador. Sintaxe: escreva(expresso), onde expresso poder ser: uma cadeia, uma varivel, uma sequencia de cadeias e variveis, separados por vrgulas. Exemplos: escreva ( "Hello, world"); escreva ( x ); escreva ( "O preo do produto ", P ); escreva ( "A sua altura e ", h, "e o seu peso e ", p ); escreva ( "Meu nome fernando", "o seu rosa" ); escreva ( a, b, c );
Entrada e Saida
Exemplo:
algoritmo() { inteiroX; Declarao de Varivel X:=10; escreva("Variassomas"); escreva("2+2=",2+2); escreva("ValordeX=",X); escreva("X+1=",X+1); }
Entrada e Saida
Funo leia()
A funo leia() tem por objetivo capturar o que digitado no teclado e atribuir a variveis declaradas no programa. Sintaxe: leia(expresso), onde expresso poder ser de dois tipos: 1. uma varivel 2. um texto seguido de uma varivel separados por uma vrgula. Exemplos: Leia ( x ); Leia ( "informe o preo do produto: ", P );
Entrada e Saida
Outro exemplo completo:
algoritmo() { realnum;//umnumeroqualquer realr;//araizquadradadenum leia("informeumnumeropositivo:",num); raiz uma funo matemtica r:=raiz(num); escreva("raizquadradade",num,"e=",r); }
Quando declaramos uma varivel de um tipo qualquer, estamos na verdade delimitando o conjunto de valores que ela poder assumir bem como os tipos de operaes que podemos realizar com elas.
utilizado para armazenar um nico caracter. Qualquer caracter da tabela ASCII vlido, por exemplo: 'a', 'A', '5', '&', etc. Na atribuio de valores a variveis do tipo ascii, o caracter dever ser colocado entre apstrofes ou aspas simples
exemplo:
algoritmo() { caracterc; c:='G'; }
Constante do tipo caracter tem que estar entre apstrofo
escreva("Ovaloratribuidoacfoi",c);
utilizado para armazenar sequencia de caracteres, ou seja, 1 ou mais caracteres. O comprimento mximo da cadeia est limitado atualmente a 128 caracteres. Toda cadeia uma sequencia de caracteres disposta entre aspas duplas, como no exemplo abaixo: "Algoritmos e Estruturas de Dados".
Exemplo:
algoritmo() { cadeias;
constante do tipo cadeia tem que vir entre aspas duplas.
s:="comunicaodedados"; escreva("Ovaloratribuidoasfoi",s); }
utilizado para armazenar valores numricos sem a parte ou casas decimais. representado por 4 bytes na memria. Uma tentativa de atribuir um valor no inteiro, por exemplo 3.1415 (valor de pi) a uma varivel do tipo inteiro, causar o truncamento da parte decimal do valor. Exemplo:
algoritmo() { inteirok; leia("informeumnumerointeiro",k); escreva("Ovalorinformado",k); }
O tipo real utilizado para armazenar valores numricos contendo casas decimais O tipo real ocupa 8 bytes na memria da mquina. A posio decimal em um valor numrico do tipo real representada por um ponto. Exemplo: algoritmo() { realR; leia("informeopreodecompra",R); R:=R*1.25; escreva("opreodevendae",R); }
Operadores
<=
Operadores
Expresses: uma combinao de operadores e operandos que produz um valor. Operandos: so variveis ou valores de retorno de funes. Finalizador: o ponto e vrgula utilizado como operador de finalizao, isto , ele informa ao interpretador o final de uma instruo. Delimitadores: indicam o incio e o final de um elemento. So utilizados dois smbolos: aspas duplas, para indicar uma cadeia, ou os apstrofes, para indicar o tipo ascii, isto , so utilizados para dar representao de um nico caracter.
Operadores
Membridade
Os parnteses, utilizados em chamadas de funes. Os colchetes, utilizados para referenciar elementos de vetores ou matrizes ou ainda elementos de conjuntos. O ponto, permite acesso a um campo da estrutura registro ou conjunto. As chaves indicam um bloco de cdigo.
Operadores
Precedncia refere-se a ordem de avaliao dos operadores em uma expresso. Por exemplo, na expresso x * y / (z * 3), a expresso (z*3) ser avaliada em primeiro lugar pois os parnteses tm precedncia mais alta. A precedncia dos operadores, na interpretao executada pelo Hall, est assim distribuida ou hierarquizada: () [] . ! ^ * / % + - < <= >= > == <> # & | := = <- , Quando dois ou mais operadores tm a mesma precedncia, a associatividade determina a ordem de avaliao.
Operadores
Quando dois operadores tem a mesma precedncia, o interpretador usa a seguinte regra de associatividade: esquerda para a direita. Como seria a ordem de avaliao da expresso: x * y / ( z * 3 )?
Declarao de Variveis
Especifica-se primeiro o tipo e em seguida as variveis daquele tipo. A instruo de declarao deve ser finalizada com um ponto e vrgula. Declarando uma varivel por linha, veja o exemplo: inteiroI; realX; caracterc; cadeias;
Declarando-se uma lista de variveis, veja o exemplo: inteiroi,j,k; realTemperatura,Peso,Estatura; caracterc,resp; cadeianome,sobrenome;
Declarao de Variveis
algoritmo(){ inteirob;//declaraumavariaveltipointeiro realc;//declaraumavariaveltiporeal cadeiad;//declaraumavariaveltipocadeia b:=33; c:=2.7182; d:="LinguagemC"; escreva("ovalordavariavelbe:",b); escreva("ovalordavariavelce:",c); escreva("ovalordavariavelde:",d); escreva("variaveisdeclaradas."); }
Estrutura de Deciso - Se
A instruo se uma instruo de deciso. Ela faz com que um bloco de comandos seja executado dependendo se uma determinada condio de controle verificada. Essa condio de controle a instruo que permite desviar o fluxo de execuo do programa. A instruo se tem a seguinte sintaxe: se(condicao) { instruo1; instruo2; instruo3; ... }
Estrutura de Deciso - Se
Exemplo: testa se um nmero maior que 10. algoritmo() { inteiroi; i:=0; escreva("digiteumnumero:"); leia(i); se(i>10) { escreva("onmeromaiorque10"); } }
Ela faz com que um bloco de comandos seja executado caso o teste da condio de controle da instruo se correspondente resulte falso. A instruo se/senao tem a seguinte sintaxe: se(condio){ instruo; ... } senao{ instruo; ... }
Exemplo: Testa se um nmero maior que 10. algoritmo() { inteiroi; leia("digiteumnumero:",i); se(i>10){ escreva("onumeromaiorque10"); } senao{ escreva("onumeronomaiorque10"); } }
A instruo se pode ser aninhada com outra instruo se. Exemplo : Testa se dois nmeros so maiores que 10.
O exemplo ento, poderia ser rescrito da seguinte forma: algoritmo(){ inteirox,y; leia("digiteonmerox:",x); leia("digiteonmeroy:",y); se(x>10&y>10){ escreva("xeysomaioresque10"); } }
Selecao / Caso
A instruo selecao uma instruo de deciso. Ela similar a instruo se, permitindo desvios mltiplos de uma forma mais elegante. A instruo testa vrios casos e executa apenas aquele que for verdadeiro.
Selecao / Caso
algoritmo(){ inteiroi; leia("digiteumnumero:",i); selecao{ caso(i>0){ escreva("positivo"); } caso(i<0){ escreva("negativo"); } caso(i==0){ escreva("zero"); } } }
Selecao / Caso
algoritmo(){ cadeiasigla; leia("sigladeestadodosudeste:",sigla); selecao{ caso(sigla=="MG"|sigla=="mg"){ escreva("MinasGerais");} caso(sigla=="SP"|sigla=="sp"){ escreva("SaoPaulo");} caso(sigla=="RJ"|sigla=="rj"){ escreva("MinasGerais");} caso(sigla=="ES"|sigla=="es"){ escreva("SaoPaulo");} } }
Lao Enquanto
A instruo enquanto uma instruo de lao. Ela faz com que um bloco de comandos seja executado repetidamente enquanto uma determinada condio de controle for verificada. O bloco executado zero ou mais vezes. Essa condio de controle a instruo que controla at quando o bloco de comandos entre as chaves, o corpo do lao, ser executado.
Lao Enquanto
algoritmo() { inteiroI,N; i:=0; leia(Entrecomumvalor,N); enquanto(i<=N) { escreva(i); i:=i+1; } }
Lao Enquanto
algoritmo() { inteiroi; i:=0; enquanto(i<=100) { escreva(i); i:=i+2; } }
Lao Enquanto
algoritmo(){ inteiroa,b,c,N; a:=1; b:=1; leia(entrecomovalormaximo:,N); enquanto(c<=N){ c:=a+b; escreva(c); a:=b; b:=c; } }
Num frigorfico existem diversos bois. Cada boi traz preso em seu pescoo um carto contendo seu nmero de identificao e seu peso. Fazer um algoritmo que escreva o nmero e peso do boi mais gordo e do boi mais magro. O ltimo boi, que no dever entrar no clculo possui identificao igual a zero.
Processamento
Saida de Dados
O Lao Repita
A instruo repita uma instruo de lao. Ela faz com que um bloco de comandos seja executado repetidamente at que uma determinada condio de controle seja verificada. O bloco executado 1 ou mais vezes. Essa condio de controle a instruo que controla at quando o bloco de comandos delimitados pelas chaves { } ser executado.
O Lao Repita
algoritmo() { //contaosdigitosdeumnumero inteiron,s; leia("informeumnumero:",n); s:=0; repita{ s:=s+1; n:=n/10; }ate(n<=0); escreva("onumeroinformadotem",s,"digitos."); }
O Lao Para
A instruo para uma instruo de lao. Ela faz com que um bloco de comandos seja executado repetidamente enquanto uma determinada condio de controle for verificada. Essa condio de controle a instruo que determina at quando o bloco de comandos entre as chaves ser executado.
O Lao Para
algoritmo() { inteiroi; para(i:=0ate100passo1) { escreva(i); } }
O Lao Para
Exemplo: Exibir os nmeros inteiros de 0 a 10 em ordem ascendente. algoritmo() { inteiroi; para(i:=0ate10incr1) { escreva(i); } }
O Lao Para
Exemplo: Exibir os nmeros inteiros de 0 a 10 em ordem decrescente. algoritmo() { inteiroi; para(i:=10ate0decr1) { escreva(i); } }
Funo
algoritmo() { inteiros; s:=soma(3,8); escreva("asomae:"); escreva(s); } // soma(inteiroa,inteirob) { inteiroc; c:=a+b; retornec; } //
Funo
algoritmo() { inteirofat; fat:=fatorial(7); escreva(fat); } // fatorial(inteiroi) { se(i<2){ retornei; } senao{ retornei*fatorial(i1); } } //
Registros
Registros so estruturas de dados heterogneas e seus elementos constituintes so referenciados pelo identificador do registro seguido pelo identificador de um campo desse registro. O identificador do registro separado do identificador do campo por um ponto.
Registros
algoritmo() { registro{ inteiroCODIGO; cadeiaDESCRICAO; }R; leia("informeocdigo:",R.CODIGO); leia("informeadescrio:",R.DESCRICAO); escreva("Ocdigoinformadofoi:",R.CODIGO); escreva("Adescriocorrespondente:",R.DESCRICAO); }
Registros
algoritmo() { registro{ caractera;inteirob;realc;cadeiad; }r; r.a:='X';r.b:=10; r.c:=3.1415;r.d:="CompiladorTurboC"; escreva("valoratribuidoavariavelr.a:",r.a); escreva("valoratribuidoavariavelr.b:",r.b); escreva("valoratribuidoavariavelr.c:",r.c); escreva("valoratribuidoavariavelr.d:",r.d); }
Matrizes
Matrizes so aglomerados de dados de um nico tipo. Por exemplo, podemos falar de matriz de inteiros, matriz de reais, matriz de cadeias e assim sucessivamente. A quantidade de elementos que a matriz contm e a forma como esto arranjados define um valor que conhecido como a dimenso da matriz. Conforme a dimenso da matriz ela chamada unidimensional, bidimensional, tridimensional. O interpretador Hall aceita matrizes de at 3 dimenses.
Matrizes
Declarando Matrizes
Para se declarar matrizes utiliza-se a palavra reservada matriz seguido do tipo e o nome da varivel seguido das dimenses entre colchetes. Quando a matriz possui mais de uma dimenso, na declarao os valores devem ser separados por dois pontos. matriz inteiro A[5]; matriz real B[3:4]; matriz real C[3:4:5];
Exemplos:
Matrizes
algoritmo() { matrizrealv[10]; inteiroi; para(i:=1ate10passo1) { leia(v[i]); v[i]:=v[i]*2; escreva(v[i]); } }
Matrizes
algoritmo() { matrizcadeiaj[5];//declaraumvetordotipocadeia inteiroi; i:=1; enquanto(i<=5){ leia("informevalor:",j[i]); i:=i+1; } i:=1; enquanto(i<=5){ escreva("valorinformado:",j[i]); i:=i+1; } }
Enumerao
algoritmo() { inteirodia; enumeracaoSemana={domingo,segunda,terca, quarta,quinta,sexta,sabado}; repita{ leia("informeodia(1a7):",dia); se(dia==segunda){escreva("segunda");} se(dia==terca){escreva("terca");} se(dia==quarta){escreva("quarta");} se(dia==quinta){escreva("quinta");} se(dia==sexta){escreva("sexta");} se(dia==sabado){escreva("sabado");} se(dia==domingo){escreva("domingo");} }ate(dia==0); }