Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

thoga31

Introdução ao Pascal

Mensagens Recomendadas

thoga31

O tutorial está disponível em PDF:

http://www.portugal-a-programar.pt/files/file/6-tutorial-de-pascal/

Tutorial disponível na Wiki.

O presente tópico está descontinuado!

Introdução ao Pascal - Parte 1

(2ª parte)

Índice de Partes

  • 1ª Parte - Preliminares. Programação básica.
  • 2ª parte - Componente Prática para Aplicação de Conhecimentos.
  • 3ª parte - Funções e Procedimentos padrão. Conversão. Personalização gráfica.
  • 4ª parte - Registos. Ficheiros de texto simples. Aleatoriedade.
  • 5ª parte - Conjuntos. Estruturação de um programa em Pascal. Data e Hora do Sistema.
  • 6ª parte - Recursividade. Variáveis de Texto Simples. Estrutura de decisão. Lista padrão do Pascal.

Objectivos do Post

O presente post direcciona-se essencialmente a principiantes em Pascal. Tem por objectivo divulgar o Pascal como uma linguagem com grandes potencialidades para a aprendizagem de Programação, pois a sua linguagem aproxima-se deveras ao inglês. Pode-se dizer que quem sabe inglês sabe Pascal, depois é só juntar conhecimentos em Lógica e da estrutura desta linguagem e voilá!

Espero que apreciem este post. Apesar de a maioria aqui saber coisas sobre Pascal e saber as bases, já vi que há quem não saiba nada, e há até mesmo novatos em programação que não sabem por onde começar. Eis um post para os iniciados poderem ponderar sobre esta linguagem.

Enjoy it!

Índice

  1. Breve história, nível da linguagem e compiladores
  2. Variáveis e tipos de dados
  3. Operações e operadores
    1. Igualdade, Diferença e Negação
    2. Soma, subtracção, multiplicação e divisão
    3. Gravar um resultado numa variável
    4. Valor absoluto e truncado, logaritmo, seno, co-seno e tangente, número ao quadrado e raiz quadrada
  4. Declarações e noções sobre Pascal
    1. Declarações iniciais e de variáveis e enunciações básicas
    2. Gravar valores num array
    3. Escrita de textos e leitura de dados
  5. 5. Condições e Ciclos
    1. Condição If… Then… Else…
    2. Ciclo Repeat… Until…
    3. Ciclo While… Do…
    4. Ciclo For… to/downto… do…
    5. Condição Case of… Else…
  6. Procedimentos e funções
    1. Procedimentos
    2. Funções
  7. Arredondamentos

1. Breve história, nível da linguagem e compiladores

Após a criação do Assembly como primeira linguagem de programação que não exigia que o programador escrevesse os seus programas directamente em código binário, Niklaus Wirth criou, em 1971, a primeira linguagem de programação estruturada à qual, em homenagem ao grande matemático Blaise Pascal, deu o nome de Pascal.

Niklaus Wirth preocupou-se em aproximar a linguagem de programação da linguagem do ser humano, em particular, claro está, o inglês. Depois do seu sucesso com o lançamento do Pascal, hoje em dia discute-se se esta é uma liguagem de baixo nível, médio nível ou alto nível. Se considerarmos que estas denominações foram criadas baseadas na proximidade da linguagem de programação à linguagem humana, constatamos que o Pascal é de alto nível. Contudo, actualmente confunde-se estas designações com as potencialidades que a linguagem oferece, e, devido a isto, muitos dizem que Pascal é de baixo nível.

Ora, um dos compiladores mais antigos e dos mais famosos do mundo é o Turbo Pascal. Contudo, mais compiladores e IDEs têm saído, muitos na tentativa de criar um compilador/IDE com um ambiente gráfico muito mais agradável que o Turbo Pascal, como é o caso do Dev-Pascal (IDE que utiliza o GNU Pascal ou o Free Pascal como compilador subjacente). O compilador mais utilizado é o primeiro referido, havendo um compilador baseado neste e também muito utilizado, que é o Free Pascal. Qualquer um destes IDEs/compiladores é muito bom, apesar de muitas divergências quanto a este tema. Pessoalmente, eu já experimentei estes três, e todos estiveram ao nível das minhas expectativas, todos funcionaram, e, apesar das vantagens e desvantagens de uns e outros, o que interessa é que todos fazem excelentes compilações e criam ficheiros compatíveis entre si. Uma vantagem, por exemplo, do Dev-Pascal é o facto de podermos utilizar operadores da linguagem C, tais como *=, +=, etc, desde que tal opção esteja activada nas opções de compilação.

Escolhido um IDE/compilador, e partindo do pressuposto que sabem as bases sobre Lógica e Algoritmos, passamos então a referir os tipos de variáveis com que mais se trabalha, os principais operadores e afins, condições e ciclos, bem como as principais declarações do pascal, os procedimentos e as funções.

2. Variáveis e tipos de dados

Os principais tipos de dados são os seguintes:

  • Integer – número inteiro
  • Real – número real
  • String – texto
  • Char – caracter
  • Word – número inteiro mais pequeno
  • Longint – número inteiro mais longo
  • Array – matriz de valores, de 1, 2 ou mais dimensões
  • Boolean – booleano: verdadeiro ou falso
  • Text – ficheiro de texto simples

Nenhuma variável poderá ter o nome de um destes tipos de dados, ou seja, por exemplo, nunca uma variável de número inteiro poderá ser chamada de Array, pois esta é uma palavra reservada do Pascal.

3. Operações e operadores

3.1. Igualdade, Diferença e Negação

A igualdade e a diferença são úteis essencialmente em condições. A resposta que estes operadores devolvem ao programa é do tipo booleana: verdadeiro ou falso.

Por exemplo, no caso de 2 = 2 será devolvido True (verdadeiro), pois, de facto, 2 é igual (=) a 2.

Já no caso de 2 <> 2 será devolvido False (falso), pois 2 não é diferente de 2.

Já no caso de ser escrito NOT (2 <> 2), será devolvido que é verdade, pois, de facto, 2 não é diferente de 2.

  • = – igual a
  • <> – diferente de
  • not – não

3.2. Soma, subtracção, multiplicação e divisão

Se declararmos as variáveis A e B como números inteiros (Integer), então estas operações serão dadas segundo a seguinte lista:

  • Soma: A+B
  • Subtracção: A-B
  • Multiplicação: A*B
  • Divisão: A/B

Contudo, no caso da divisão, o Pascal tem dois operadores que devolvem um o resultado da divisão como um número inteiro e outro o primeiro resto da divisão:

  • Resultado inteiro: A div B
  • Primeiro resto: A mod B

3.3. Gravar um resultado numa variável

Claro que estas operações podem ser gravadas numa variável para depois ser utilizada noutros processos e cálculos. Em Pascal, o comando (operador) que dá ordem para gravar um resultado numa variável é :=. Este processo é denominado de atribuição. Por exemplo, se quisermos somar duas variáveis inteiras, A e B, e gravá-las numa variável inteira chamada RESULTADO, será escrito RESULTADO := A+B. As variáveis array têm uma forma diferente de serem gravadas, que será visto mais à frente.

3.4. Valor absoluto e truncado, logaritmo, seno, co-seno e tangente, número ao quadrado e raiz quadrada

Continuando com a variável A do tipo Integer:

  • Valor absoluto: abs(A)
  • Valor truncado: trunc(A)
  • Logaritmo neperiano (de base e): ln(A)
  • Seno (ângulo em radianos, só): sin(A)
  • Co-seno (ângulo em radianos, só): cos(A)
  • Número ao quadrado: sqr(A)
  • Raiz quadrada: sqrt(A)

Ora, pela fórmula da tangente, esta á calculada por sin(A)/cos(A). é claro que, se o co-seno valer zero então o programa dará erro e irá abaixo. Mais à frente, nas condições, veremos como transpor esta situação.

4. Declarações e noções sobre Pascal

4.1. Declarações iniciais e de variáveis e enunciações básicas

Um programa em Pascal tem de se iniciar com as seguintes declarações:

  • Nome do programa
  • Bibliotecas a utilizar
  • Variáveis, tipos e constantes

O nome do programa é enunciado com a declaração program, que deverá ter o mesmo nome do ficheiro que contém o código-fonte, tirando a extensão do ficheiro (*.pas, *.pp ou outra).

As bibliotecas são conjuntos de operações e funções que, sem estas estarem enunciadas, não serão reconhecidas pelo compilador. Por exemplo, o comando gettime, que obtém a hora do computador, só funciona com a biblioteca dos. As bibliotecas a utilizar são declaradas com uses. A biblioteca mais utilizada e que contém as funções básicas é a biblioteca crt.

Por fim, as variáveis são declaradas pela palavra reservada var. Contudo, para além destas, existem os Tipos de Variável e as Constantes.

As constantes são valores que nunca são alterados ao longo do programa. Podem ser de qualquer tipo, sendo o mais comum número real, como por exemplo o valor de pi. As constantes são enunciadas com const. Contudo, se um conjunto de variáveis for todo do mesmo tipo, pode-se criar um tipo de variável com um nome dado por nós, para além dos enunciados anteriormente. Os novos tipos criados pelo programador são declarados por type.

Por exemplo:

program exemplo;
uses crt;
type lista = array[1..10] of integer;
var avaliacoes:lista;
   n:string;
const pi=3.14;

Como pode ser visto por este exemplo, uma instrução é sempre sucedida de ponto e vírgula, excepto um caso, que será abordado mais à frente, que é com a condição else. Para além disso, um tipo de variável é definido por nome_do_tipo = tipo_de_dado. Neste caso, foi declarado que lista é do tipo array de 1 dimensão, constituído por dez elementos, que começa no elemento nº 1 e acaba no elemento nº 10, e este array é feito de variáveis integer.

As constantes também são enunciadas como uma igualdade. Sempre que no programa for escrito num comando pi, o programa irá assumir o valor 3.14. Caso se tente gravar um resultado qualquer dentro de pi, o compilador dará erro na compilação.

Ora, as variáveis são declaradas segundo a estrutura var nome_variavel : tipo_variavel;. Neste caso, foi enunciado que a variável n é do tipo String.

Os arrays, como matrizes de variáveis, têm de ser declaradas quanto à sua dimensão e ao tipo de variáveis que comporta: var nome : array [dimensão] of tipo_variavel;. A dimensão pode ser uni ou multidimensionais, ou seja, uma simples lista ou uma espécie de tabela de valores.

Por exemplo:

var list_numeros : array [0..5] of real;
   tabela : array [0..5,0..3] of real;

A variável list_numeros pode ser apresentada da seguinte forma:

0
1
2
3
4
5

Já a variável tabela pode ser apresentada graficamente desta forma:

0,0 0,1 0,2 0,3
1,0 1,1 1,2 1,3
2,0 2,1 2,2 2,3
3,0 3,1 3,2 3,3
4,0 4,1 4,2 4,3
5,0 5,1 5,2 5,3

Por fim, para o programa ser inicializado e finalizado:

program exemplo;  // declarações iniciais
uses crt;
var A:integer;

begin  // INÍCIO

// programa principal

end. // FIM

4.2. Gravar valores num array

Continuando com as variáveis list_numero e tabela, vamos gravar um valor dentro de cada um destes arrays.

Na list_numero, vamos gravar um valor na localização 2:

list_numero[2] := -4.5

Assim, considerando que os restantes elementos do array ainda não foram alterados, o array list_numero terá o seginte aspecto gráfico (quando uma variável é declarada, e esta é do tipo numérico, o seu valor inicial é, por defeito, 0, zero):

0
0
-4.5
0
0
0

Já para gravar este valor em tabela na posição 3,1:

tabela[3,1] := -4.5

O aspecto final do array será:

0 0 0 0
0 0 0 0
0 0 0 0
0 -4.5 0 0
0 0 0 0
0 0 0 0

4.3. Escrita de textos e leitura de dados

Ora, o programa pode escrever textos e receber dados, como é óbvio. Para escrever um texto e fazer parágrafo:

writeln('Texto');

Contudo, se quisermos escrever um texto e deixar o cursor a piscar à frente deste, escrevemos:

write('Texto ');

Para ler dados:

readln(variável);

Ora, a variável lida tem de coincidir com o seu tipo. Por exemplo, se a variável for a A, do tipo Integer, faremos:

readln(A);

Ora, no caso de introduzirmos um número real ou um texto em vez de um número inteiro, o programa irá abaixo. Por isso há que avisar o utilizador desse facto:

write('Introduza um numero inteiro: ');
readln(A);

5. Condições e Ciclos

As condições permitem analisar resultados e fazer decisão automática no decorrer do programa. Já os ciclos permitem realizar várias vezes os mesmos comandos e cálculos até uma condição estiver satisfeita.

5.1. Condição if… then… else…

Esta condição dá uma ordem ao programa do género Se… Então… Senão…:

if (condição) then begin
(comandos1)
end
else begin
(comandos2)
end;

Se a condição for verdadeira, então são executados os comandos1, senão são executados os comandos2.

Por exemplo, se a variável A, do tipo Real, for positiva ou nula, mostra-se o texto “numero positivo ou nulo”, caso contrário mostra-se o texto “numero negativo”:

write('Introduza um numero real: ');
readln(A);
if (A>=0) then begin
  writeln('Numero positivo ou nulo');
end
else begin
    writeln('Numero negativo');
end;

5.2. Ciclo repeat… until…

Este ciclo obriga o programa a executar a mesma série de comandos até que a condição imposta seja satisfeita.

Por exemplo, se quisermos que o utilizador introduza um número inteiro positivo e não nulo:

repeat
      readln(A);
until (A>0);

5.3. Ciclo while… do…

Este ciclo faz o mesmo que o Repeat… Until…, contudo fá-lo com uma lógica contrária. Enquanto o ciclo anterior dizia Repetir até que a condição seja verdadeira, este ciclo diz Repetir enquanto a condição for verdadeira, e só parar quando for falsa. o mesmo exemplo anterior, mas aplicando este ciclo:

while (A<=0) do begin
     readln(A);
end;

De forma a ser mais intuitivo quando se lê o código, pode-se escrever:

while NOT (A>0) do begin
     readln(A);
end;

5.4. Ciclo for… to/downto… do…

Este é um ciclo que é muito útil, por exemplo, para escrever o conteúdo de um array. Voltando ao array anteriormente descrito, tabela, após o programa ter colocado valores dentro deste, vamos escrever o seu conteúdo no ecrã:

program exemplo;
uses crt;
var tabela:array[0..5,0..3] of real;
   i,j:integer;
begin
    // commandos anteriores, quaisqueres, que gravaram valores no array
    for i:=0 to 5 do begin
        for j:=0 to 3 do begin
            write(tabela[i,j]);
        end;
    writeln;
    end;
end.

Ora, é incrementado à variável i o valor 1 após o conjunto de comandos ter sido realizado, assim como à variável j. O conjunto de comandos que está dentro do primeiro ciclo for só termina quando i assumir o valor 3. Assim acontece com o segundo ciclo: só termina quando j valer 5.

Contudo, poder-se-á escrever a ordem da tabela ao contrário. Em vez de começarmos pelo valor [0,0] e terminarmos no valor [5,3], começamos em [5,3] e acabamos em [0,0]. Em vez de escrevermos, no ciclo, to, escrevemos downto, que significa que se incrementa o valor -1 à variável em jogo no ciclo (a variável diminui em uma unidade):

program exemplo;
uses crt;
var tabela:array[0..5,0..3] of real;
   i,j:integer;
begin
    // commandos anteriores, quaisqueres, que gravaram valores no array
    for i:=5 downto 0 do begin
        for j:=3 downto 0 do begin
            write(tabela[i,j]);
        end;
        writeln;
    end;
    readln;  // impede que o programa feche logo com o END final, esperando que seja premido ENTER
end.

Outro exemplo de utilização

5.5. Condição Case of… else

Esta condição pode poupar a utilização excessiva de condições [t]if[/tt]. Este comando diz-nos Caso a variável assuma este valor, então…. Ora, se quisermos classificar uma nota de 0 a 20 em termos qualitativos, teremos, por exemplo, o seguinte:

program avaliacoes;
uses crt;
var nota:integer;

begin
    write('Introduza uma nota, de 0 a 20: ');
    readln(nota);
    case nota of
         0..9:writeln('Insuficiente');
         10..14:writeln('Suficiente');
         15..17:writeln('Bom');
         18..20:writeln('Excelente');
    end
    else begin
         if (nota<0) then writeln('ERRO! Nota nao pode ser negativa!');
         if (nota>20) then writeln('ERRO! Nota nao pode ser maior que 20!');
    end;
    readln;
end.

6. Procedimentos e funções

6.1. Procedimentos

Dentro de um programa pode existir um subprograma. Estes subprogramas são designados, em Pascal, por Procedimentos, e são declarados antes do bloco principal do programa pela expressão reservada procedure.

Por exemplo, podemos criar um procedimento para calcular a raiz quadrada de um número, sem que tal seja feito no bloco principal:

program raiz;
uses crt;
var a,resultado:real;

procedure calc_raiz;
begin
    resultado:=SQR(a);
end;

begin
    write('Introduza valor A: ');
    readln(a);
    calc_raiz;
    writeln('A raiz quadrada de A e: ',resultado);
    readln;
end.

6.2. Funções

O mesmo pode ser feito através de uma função. Podemos criar uma função, num programa, que calcule a tangente de um número sem ser necessário calcular no meio do bloco principal todas as contas necessárias. Uma função é declarada antes do bloco principal através da palavra reservada function. Dever-se-á ter em conta que uma função devolve um valor e um procedimento não, ou seja, uma função é da hierarquia das funções mais comuns do Pascal, como abs, e os procedimentos são subprogramas dentro do programa principal que executam instruções sem devolverem absolutamente nada no fim. Veja-se o exemplo:

program tang_ang;
uses crt;
var angulo:real;

procedure ler_angulo;
begin
    write('Introduza angulo em radianos: ');
    readln(angulo);
end;

function tangente(a:real):real;
begin
    tangente:=SIN(a)/COS(a);
end;

begin
    ler_angulo;  // procedimento que vai ler o ângulo, mas nada devolve.
    writeln('A tangente do angulo e: ',tangente(angulo));  // função que calcula a tangente e devolve o seu resultado.
    readln;
end.

7. Arredondamentos

O programa em Pascal pode arredondar valores de duas maneiras. Através da função reservada round ou através de um código que utiliza dois pontos.

Por exemplo, para arredondar um resultado do tipo real (sendo este a variável result) às unidades:

round(result);

Contudo, o arredondamento pode ser feito de outra forma. Podemos indicar o espaço que o número ocupa e o arredondamento que tem, do género: número:espaço:arredondamento. Por exemplo:

result:12:5;

Neste caso, se o resultado for 34.56356976356, irá aparecer algo como (sendo “-” indicação de um espaço vazio): ----34.56357

Já se for escrito:

result:0:2;

Irá aparecer exactamente como: 34.56

(2ª parte)

EDIT: os erros técnicos e de código foram corrigidos.

EDIT2: seria injusto não referir o excelente tutorial do @deathseeker25. :)

Editado por Rui Carlos
Revisão da formatação.
  • Voto 1

Knowledge is free! | Occasional Fortnite player

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
IRX773

Parabéns.... muito bom tutorial ... li até meio e para alguém que nunca programou pascal como eu percebe-se bem.

Vai haver mais partes julgo?

PS: Isto até que ia para a wiki não (ou para intercalar com o que já lá está)?!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
thoga31

Vai haver mais partes julgo?

Sim, vou tentar escrever mais umas coisinhas, já a incluir exemplos práticos de programas em Pascal. Também vou desenvolver com o cysco um Post para o Armazém de Código (em princípio) a exemplificar a utilização das variáveis do tipo text, que te permitem criar, editar e consultar ficheiros de texto simples e de qualquer extensão (até agora só o MP3 e o JPEG não foram abertos com este tipo de variável, nos meus testes).

E obrigado! Há três dias que ando a escrever este Post num doc para postar aqui. 😳 Já estou a escrever a segunda parte e estou a escrever outro sobre outra linguagem... ;)

Cumpz


Knowledge is free! | Occasional Fortnite player

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
thoga31

Boas, tens ai excelente trabalho mas pergunto me se já ta terminado.

Não, não está terminado. Estava a escrever a pouco e pouco a segunda parte, mas surgiram-me entretanto dois trabalhos prioritários, desenvolvidos para a comunidade, nos quais estou de momento a trabalhar, e espero poder publicar. Um deles

é sobre Pascal, e será um grande complemento a este thread, que é só uma introdução muito soft.

Cumpz.


Knowledge is free! | Occasional Fortnite player

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
oxyzero

Bom trabalho thoga31, sem dúvida que me ajudou bastante. :confused:

Mais tarde vou ver se dou uma olhadela às funções e ao ciclo for.. to\ downto .. do , que é o que me resta saber nesta introdução.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
thoga31

@thoga31

Podes-me tirar uma dúvida? Eu não percebi bem para que serve o for to\ downto ... do

:s

Quando necessitas de um ciclo, há que ter em atenção qual o melhor para se utilizar. Para trabalhar com arrays e percorrê-los de uma ponta à outra, o melhor é, de facto, o ciclo for... to/downto... do, que percorre o array ou do índice mais baixo para o mais alto ou vice-versa.

É extremamente útil, por exemplo, para ordenar uma lista por ordem crescente e, de seguida, mostrar a lista ao contrário, que é o mesmo que calcular a ordem decrescente. Exemplo:

program ciclo_for;
uses crt;
type lista = array[1..5] of integer;
var original:lista;
    crescente:lista;
    i,j:integer;
    temp:integer;

begin
     original[1]:=4;
     original[2]:=34;
     original[3]:=7;
     original[4]:=-8;
     original[5]:=15;

     // lista ORIGINAL é: {4, 34, 7, -8, 15}
     // Ordenar por ordem CRESCENTE:

     for i:=1 to 5 do begin  //cópia da lista ORIGINAL para a lista CRESCENTE
         crescente[i]:=original[i];
     end;

     for i:=1 to 4 do begin  // percorre a lista, comparando os valores da lista UM a UM
         for j:=i+1 to 5 do begin
             if crescente[i]>crescente[j] then begin  // se o elemento de índice i é maior que i+1, então estes dois trocam de lugar
                temp:=crescente[j];
                crescente[j]:=crescente[i];
                crescente[i]:=temp;
             end;
         end;
     end;

     writeln('Lista original:');
     for i:=1 to 5 do write(original[i],', ');
     writeln;
     writeln('Lista por ordem crescente:');
     for i:=1 to 5 do write(crescente[i],', ');
     writeln;
     writeln('Lista por ordem decrescente:');
     for i:=5 downto 1 do write(crescente[i],', ');
     writeln;

     readln;
end.

Nesta caso, a lista original é a seguinte:

{4, 34, 7, -8, 15}

A lista é analisada a todos os valores, UM A UM e aos pares, daí os dois ciclos.

Alguma dúvida, diz. :)

Cumpz.


Knowledge is free! | Occasional Fortnite player

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
oxyzero

Então, deixa ver se entendi. Se quiser mudar o valor de (for) x para (to) y faço (do) os comandos. Mas ainda não percebi bem no que é que isto é me útil  :)

Por exemplo, num jogo da cobra, se o jogador bater contra a parede, ele muda o valor, e esse valor activa por exemplo um subprograma, e o jogador perde? É isso? Ou estou completamente errado?

É que enquanto não perceber para que é que isto me serve, nunca hei-de conseguir saber o que isto é  :down:

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
thoga31

Então, deixa ver se entendi. Se quiser mudar o valor de (for) x para (to) y faço (do) os comandos. Mas ainda não percebi bem no que é que isto é me útil  ;)

Eu agora é que não percebi o que disseste........ 😲

Não é se eu quiser mudar o valor de x para y nem nada que se pareça. Se eu quero mudar o valor de x para y simplesmente farei

x := y;

O ciclo for... to/downto... do... permite-te percorrer um array de uma ponta à outra de uma forma simples e eficaz. Como exemplifiquei, permite copiar integralmente um array para outro. Em vez de escreveres:

crescente[1] := original [1];
crescente[2] := original [2];
crescente[3] := original [3];
crescente[4] := original [4];
crescente[5] := original [5];

Simplificas muito utilizando o ciclo for:

for i:=1 to 5 do begin
    crescente[i] := original[i];
end;

Ou seja, a variável i, que se denomina por contador, começa por valer 1. Quando i=1 o comando que está dentro do ciclo será crescente[1] := original[1];. Quando i=2 será crescente[2] := original[2]; e assim sucessivamente até que i>=5 - o fim do ciclo dá-se quando a variável contadora for igual ou superior (no caso de ser for... to...) ou inferior (no caso de ser for... downto...) ao limite do ciclo, neste caso é 5.

A cada repetição do ciclo dá-se o nome de iteração. O mesmo acontece com os ciclos while... e repeat... until...

Imagina que tens um array com 2000 valores, como eu já tive uma vez de fazer. Não me digas que vais escrever 2000 vezes a mesma coisa, quando o ciclo for percorre o array com quase 500 vezes menos linhas de código?

Existe uma equivalência entre o ciclo for e os outros dois ditos "tradicionais". Aquele ciclo que eu escrevi poderá ser assim:

i:=1;
repeat
      crescente[i] := original[i];
      i := i+1;
until (i>=5);

Faz como preferires. Mas não confundas as coisas: a variável i (pode ser outro nome, claro está) designa-se por contador por ser apenas uma variável que é incrementada ou decrementada e serve apenas para determinar o início e o fim do ciclo. Esta variável pode ser utilizada, como foi visto, dentro dos comandos do ciclo, nesta caso para percorrer uma array em todo o seu comprimento.

A utilização deste ciclo depende do programa que estiveres a fazer. É utilizado para muitas coisas. Tens de ter a plena noção de quando deverás utilizar ou um ciclo, ou outro ou outro, e o mesmo para as condições. Há que saber escolher, saber como funciona. Pessoalmente prefiro o ciclo for do que o repeat... until... ou o while... para percorrer arrays. Mas é uma questão de gostos.

Eu penso que melhor explicação não consigo dar. Apenas te pergunto: entendeste como funciona? A sua aplicação fica ao critério de cada programador. Mas aviso-te já: se pretenderes avançar para VB, é bom saberes o "bê-à-bá" dos ciclos for, pois a melhor (e muitas vezes a única) maneira de percorrer com eficiência não só arrays bem como listas e enumerações é com o ciclo For... Next e/ou o ciclo For Each... Next... (isto em VB).

Cumpz.


Já agora: se tiveres dúvidas, abre uma nova thread sobre o assunto. Esta thread é um "tutorial" (à falta de melhor palavra) introdutório ao pascal, não é um Centro de Dúvidas. :)

Isto antes que alguém do staff decida fazer split do tópico ou sei lá mais o quê... B)


Knowledge is free! | Occasional Fortnite player

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
oxyzero

Já entendi. :thumbsup:

Basicamente é um "atalho" para mudar os valores dos array's. Obrigado :)

E desculpem por ter feito aqui as perguntas neste tópico. :s

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
obstinovsky

Ola.

Tenho uma duvida.........Estou a fazer um programinha basico porque estou ainda a aprender..... e fiz uma condiçao com case....else.....   

e quando faço a utilizaçao do else no programa este apos o aviso de errro na escolha desliga-se.

Eu queria qe voltassea pedir qe escolhe sse uma opçao do case.

Alguem me pode ajudar nisso?

Qualqer resposta é gratificante

Obrigado

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
nunopicado

Se entendi bem o que queres, seria mais ou menos isto:

var
   RepeteCase:Boolean;

begin
{   .
   .
   .   Fica aqui o resto do codigo que tens até chegar ao case
   .
   .   }

   RepeteCase:=true;
   While RepeteCase do
      case <condição que tens no case> of
           1: begin
                    fsfdfsfd;
                    RepeteCase:=false;
               end;
           2: begin
                    dfgdfgdgdg;
                    RepeteCase:=false;
               end;
           3: begin
                    dfgdgdgfdgdf;
                    RepeteCase:=false;
               end;
      end;

{
.
.
.    Fica aqui o resto do codigo do teu programa
.
.
.   }


Sendo assim, não precisas do else no case (pelo menos não para esse efeito. Inserindo o case num loop como o <while do> por exemplo (também dava o <repeat until> com alguns ajustes), e usando uma variavel <boolean> como controle do ciclo, tens o problema resolvido.

Basta que antes do while a coloque como true, de modo a que o ciclo se repita até que lhe digas que pode para (definindo o valor da variavel como false), algo que farás sempre que a opção escohida for adequada ao resto do programa.

Também era possível fazer isto sem o loop, usando o <else> do <case>, e as funções <label> e <goto>.

Mas isto é considerado uma má prática de programação, e se agora talvez fosse mais simples de fazer para um programa de teste, o resultado seria complicar (e muito) num programa um pouco mais complexo.

De qualquer maneira, seria assim:


.
.
.
.
.

label VoltaAoCase:
readln(blablabla); // por exemplo... É preciso é que o label fique antes da condição do case ser gerada pelo utilizador

case blablabla of
   1: fdgdf;
   2: dfgdfgdf;
   3: dfgdfgdf;
else goto VoltaAoCase;
end;

Mais uma vez, isto não é recomendado, e há até compiladores pascal, dependendo da configuração, que não aceita esta forma.

Qualquer coisa apita...


"A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!"

> Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
thoga31

@thoga31, quando é que falas um bocadinho sobre pointers nesta thread? :)

De facto, nunca estudei pointers em Pascal. :dontgetit: Nunca me dediquei sobre o assunto. Mas, pelo que sei (não sabendo se é certo aquilo que vou dizer), as variáveis dinâmicas do pascal estão associadas aos pointers, sendo necessário (e agora é informação minha conhecida) iniciar e finalizar a variável dinâmica num programa. Decerto deverão haver comandos para descobrir e mover as variáveis na memória, incrementar, etc, como Inc.

Desculpa a minha "ignorância" no assunto. :wallbash: Como ainda não necessitei, nunca pesquisei sobre tal. ;)

EDIT: e ainda não avancei com a thread por muita falta de tempo. :bored:

Cumpz. ;)


Knowledge is free! | Occasional Fortnite player

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
pwseo

Os pointers são coisas muito úteis, e quando aprenderes o que são e como os podes usar, vais reparar que faz todo o sentido utilizá-los em muitos locais (com cuidado!!)

Um pointer é basicamente um apontador (lol) para um local na memória. Ou seja, o seu valor é um endereço da memória (imagina a RAM como sendo uma array de bytes; o valor do pointer é um índice para essa array).

Com isto podes fazer todo o tipo de coisas, como por exemplo ter várias variáveis que apontam para a mesma localização na memória...

Mas são campos que um dia irás explorar, especialmente quando falares de alocação dinâmica de memória e de algoritmos e estruturas de dados (o que disseste na tua resposta estava perto do correcto, mas só mesmo quando experimentares é que saberás mesmo o que é).

Não vou estragar-te a surpresa :P

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
thoga31

Não vou estragar-te a surpresa ;)

Ohh ;)

Eu tenho muitíssimo pouco tempo livre, sendo estudante de Arquitectura. A informática não apssa de um hobbie que tenho há quatro anos, sendo a minha experiência em programação computacional (em computadores) de há 1 ano e 3 meses :D

Quando tiver algum tempo, irei procurar sobre isso. Faz-me lembrar vagamente os comandos mov e assim do Assembly (não sei nada de ASM, mas já vi códigos :) ).

Mas espero que, de resto, o tutorial te tenha agradado, mesmo sendo tu um barra-à-tangente em pascal, pelo que me tenho apercebido!

Prometo que vou expandir muito o tutorial, mas não prometo, de todo, datas :P

Cumpz.


Knowledge is free! | Occasional Fortnite player

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
pwseo

Barra, eu? Sou como tu, apenas tive mais algum tempo para estudar estas coisas :)

Como estudo medicina também tenho o meu tempo contado, mas tenho que admitir que em arquitectura levam isso ao extremo, sendo quase mais comuns as directas do que as noites regulares lool!

De qualquer modo, pointers não tem a ver com assembly, não te preocupes. São apenas um tipo de dados extremamente útil que pode ser utilizado para fazer coisas engraçadas, como disse :P

Bom trabalho (curso) e boa aprendizagem nos tempos livres! :)

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
thoga31

Barra, eu? Sou como tu, apenas tive mais algum tempo para estudar estas coisas ;)

Como estudo medicina também tenho o meu tempo contado, mas tenho que admitir que em arquitectura levam isso ao extremo, sendo quase mais comuns as directas do que as noites regulares lool!

De qualquer modo, pointers não tem a ver com assembly, não te preocupes. São apenas um tipo de dados extremamente útil que pode ser utilizado para fazer coisas engraçadas, como disse ;)

Bom trabalho (curso) e boa aprendizagem nos tempos livres! :)

Lol. Sei que não tem nada a ver, mas a tua descrição fez-me lembrar vagamente o ASM, não sei bem pq...

Bgd, e igualmente, que medicina é de se tirar o chapéu!


Knowledge is free! | Occasional Fortnite player

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
thoga31

Boas pessoal!

Finalmente tenho a 2º parte do tutorial escrita! É um tutorial mais pequeno e muitíssimo mais prático.

Inclui 7 capítulos, sem subcapítulos, cada um com um programa completo, e cada um faz ênfase à utilização de um método específico do Pascal, como ciclos e estruturas de decisão. O primeiro programa é apenas um Hello World com uma breve referência à utilização de strings.

Inclui 5 Propostas de Exercícios, não resolvidas, as quais eu até nem me importava que fossem aqui resolvidas para comparação: cada um poderá ter a sua maneira de resolver um problema, e seria interessantíssimo compará-las.

Agora, uma questão: a 2ª parte coloco-a aqui num novo post ou actualizo no 1º post de todos? Penso que um novo tópico não faz qualquer sentido.

Cumpz. :)


Knowledge is free! | Occasional Fortnite player

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
apocsantos

    Boa noite,

    Como a 2ª parte é uma continuação do trabalho, serie interessante tê-la num post aqui, com o link para a primeira parte de forma a ser fácil e rápida a consulta, bem como a leitura integral ser facilitada. :)

    Não penso que criar um novo tópico seja necessário, e actualizar a mensagem original poderia criar alguma confusão, penso eu, sobre a conversa que se desenrolou aqui, até a publicação da 2ª parte.

Cordiais cumprimentos,

Apocsantos


"A paciência é uma das coisas que se aprendeu na era do 48k" O respeito é como a escrita de código, uma vez perdido, dificilmente se retoma o habito"

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
pwseo

Sim, concordo com o apocsantos... Adiciona também um link no 1º post a apontar para essa segunda parte, de forma a que as pessoas possam saltar facilmente de uma parte para a outra :)

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.