Apostila de algoritimos

12

Click here to load reader

Transcript of Apostila de algoritimos

Page 1: Apostila de algoritimos

Algoritmos Existem muitas formas de se representar algoritmos, utilizando-se linguagens de programação, linguagem formal, formas geométricas, diagramas, e muitas outras. Algumas destas formas se tornaram especiais pela eficácia de sua representação nas diversas áreas do conhecimento. Neste texto de maneira sucinta são apresentadas três destas formas, porém dando-se mais ênfase a duas delas. É importante salientar que o estudo de algoritmos exige do estudante um esforço quanto à realização de exercícios, de modo que não se pode aprendê-lo apenas lendo textos. Sendo assim, procurem realizar os exercícios que são passados em sala de aula. Conceito de Algoritmo - Algoritmo é a especificação de uma sequência ordenada de passos que deve ser seguida com o intuito de realizar uma tarefa, garantindo a sua repetibilidade. Obs.: repetibilidade – permite que esta sequência possa ser repetida toda vez que a tarefa tiver que ser realizada. - Algoritmo é um conjunto finito de regras bem definidas para a solução de um problema, em um tempo finito, e com um número finito de passos. Para que um computador possa desempenhar uma tarefa é necessário que esta seja detalhada passo a passo, numa forma compreensível pela máquina, utilizando aquilo que se chama de programa. Neste sentido, um programa de computador nada mais é que um algoritmo escrito numa forma compreensível pelo computador. Formas de Algoritmos Existem diversas formas possíveis de se representar um algoritmo. Para a Informática, algumas das formas mais conhecidas são: - Descrição Narrativa - Fluxograma - Pseudocódigo >> Descrição Narrativa: Nesta forma os algoritmos são expressos diretamente em linguagem coloquial, descrevendo-se em passos a sequência de ações a serem realizadas. Exemplo: >> Troca de um pneu furado: Passo 1 – Afrouxar ligeiramente as porcas Passo 2 – Suspender o carro Passo 3 – Retirar as porcas e o pneu Passo 4 – Colocar o pneu reserva Passo 5 – Apertar as porcas Passo 6 – Abaixar o carro Passo 7 – Dar o aperto final nas porcas Um exemplo bastante comum de um Algoritmo em forma de Descrição Narrativa é o texto de um Manual que ensine a utilização de um determinado aparelho. Nele são descritos passos que devem ser seguidos para se realizar as possíveis ações daquele aparelho. O nível de detalhamento destas descrições deve ser tal que permita que toda vez que o Usuário pretenda realizar aquela ação, basta seguir aqueles passos na sequência correta para se ter o êxito esperado.

Page 2: Apostila de algoritimos

>> Fluxograma ou Diagrama de Blocos: É uma representação gráfica de algoritmos, onde formas geométricas diferentes implicam em ações (instruções ou comandos) distintas. Esta forma facilita o entendimento das idéias contidas nos algoritmos. De modo geral, o fluxograma são símbolos dispostos em uma determinada sequência, em que há um único caminho orientado a ser seguido, representando a sequência de execução daquelas instruções. Dos diversos símbolos existentes que podem ser utilizados em um Fluxograma, os que serão necessários para o curso apresentado neste texto, são:

= Início e final do fluxograma

= Seta do Fluxo de Dados

= Operações de entrada de dados via teclado

= Operações de saída de dados em vídeo (monitor)

= Processo – ou Processamento, como operações de atribuição

= Decisão - utilizado nas estruturas condicionais ("Se..então..senão")

= Conector utilizado quando é preciso particionar o diagrama

= Preparação – utilizado em laços de repetição do tipo "Para..de..até..faça"

>> Pseudocódigo: Esta forma de representação de algoritmos, também conhecida como Português Estruturado ou Portugol, é bastante rica em detalhes e, por assemelhar-se bastante à forma em que os programas são escritos, será juntamente com o Fluxograma, a forma de representação de algoritmos a ser adotada nesta disciplina. Estrutura de Um Algoritmo na Forma de Pseudocódigo

Algoritmo <nome_do_algoritmo> Var <declaração_de_variáveis> Início <corpo_do_algoritmo> Fim.

"Algoritmo" é uma palavra que indica o início da definição do algoritmo em forma de pseudocódigo. "<nome_do_algoritmo>" – no lugar deste, deve ser colocado o nome simbólico do algoritmo, o que irá distingui-lo dos demais. "<declaração_de_variáveis>" parte do algoritmo onde devem ser declaradas as variáveis utilizadas no algoritmo. Esta parte será detalhada mais adiante. "Início" e "Fim." são respectivamente as palavras que delimitam o início e o término do conjunto de instruções do corpo do algoritmo.

Page 3: Apostila de algoritimos

Exemplo de um Algoritmo que calcula a média de duas notas, que devem ser digitados pelo Usuário ao executar o programa, e ao final mostra se houve aprovação ou não, segundo um critério estabelecido. Algoritmo Media Var N1, N2, Media: Real; Início Leia (N1, N2); Media = (N1+N2)/2; Se Media >= 7 Então Escreva ("Aprovado"); Senão Escreva ("Reprovado"); Fim_se Fim. Tipos de Dados Todo o trabalho realizado por um computador é baseado na manipulação das informações contidas em sua memória. Estas informações podem ser classificadas em dois tipos: – As instruções, que comandam o funcionamento da máquina e determinam a maneira como devem ser tratados os dados. – Os dados propriamente ditos, que correspondem à porção das informações a serem processadas pelo computador. Para que sejam manipulados pelo processador, os dados devem ser declarados no início do programa, a fim de que o compilador conheça os tipos e os nomes das variáveis que contemplarão estes dados. >> Tipos Inteiros: São os dados numéricos positivos ou negativos excluindo-se destes qualquer número fracionário. Como exemplo deste tipo de dado, tem-se os valores: 35, 0, 234, -56, 1024 entre outros. >> Tipos Reais: São os dados numéricos positivos e negativos, incluindo-se os números fracionários. Como exemplo deste tipo de dado, tem-se os valores: 35, 0, -56, 1.2, 234.18, -45.8987 entre outros. >> Tipos Caracteres: São as seqüências contendo letras, números e símbolos especiais. Uma seqüência de caracteres deve ser indicada entre aspas (""). Este tipo de dado também é conhecido como Alfanumérico, String, Literal ou Cadeia. Como exemplo deste tipo de dado, tem-se os valores: "Programação", "Rua Alfa, 52 Apto 1", "Fone 574-9988", "04387-030", " ", "7" entre outros. >> Tipos Lógicos: São os dados com valor "verdadeiro" ou "falso", sendo que este tipo de dado poderá representar apenas um dos dois valores. Ele é conhecido também por tipo "booleano", devido à contribuição do filósofo e matemático inglês George Boole na área da lógica matemática. Conceito e Utilidade de Variáveis Basicamente, uma variável possui três atributos: um nome, um tipo de dado associado à mesma, e um valor por ela guardado. Toda variável possui um nome que tem a função de diferenciá-la das demais. Cada linguagem de programação estabelece suas próprias regras de formação de nomes de variáveis.

Page 4: Apostila de algoritimos

Adotaremos para os algoritmos, as seguintes regras para nome de variável: - deve necessariamente começar com uma letra; - não deve conter nenhum símbolo especial, exceto o "underline" (_); - não deve conter nenhum espaço em branco; - não deve ser uma palavra acentuada; - não poderá ser uma palavra reservada a uma instrução de programa. Obviamente é interessante adotar nomes relacionados às funções que serão exercidas pela variável dentro de um programa. Outro atributo característico de uma variável é o "tipo" do dado que ela pode armazenar. Este atributo define a natureza das informações contidas na variável. Por último há o atributo "valor", que nada mais é do que a informação útil contida na variável. Uma vez definidos os atributos "nome" e "tipo de dado" de uma variável, estes não podem ser alterados, e assim permanecem durante toda a sua existência no programa. Por outro lado, o atributo "valor" está constantemente sujeito a mudanças de acordo com o fluxo de execução do programa (por ser uma "variável"). Em resumo, o conceito de variável foi criado para facilitar a vida dos programadores, permitindo acessar informações na memória dos computadores por meio de um nome, em vez do endereço de uma célula de memória. Declaração de Variáveis em Algoritmos Todas as variáveis utilizadas em algoritmos devem ser declaradas antes de serem utilizadas. Isto se faz necessário para permitir que o compilador reserve um espaço na memória para as mesmas. Nos algoritmos, todas as variáveis utilizadas serão declaradas no início do mesmo, por meio de um comando que pode ser escrito em uma das seguintes formas: VAR <nome_da_variável> : <tipo_da_variável>; ou <lista_de_variáveis> : <tipo_das_variáveis>; Observações: - numa mesma linha poderão ser definidas uma ou mais variáveis do mesmo tipo. Se forem várias, estas devem estar separadas por vírgulas; - variáveis de tipos diferentes devem ser declaradas em linhas diferentes. Operadores Operadores são elementos fundamentais que atuam sobre operandos e produzem um determinado resultado. Por exemplo, a expressão 3 + 2 relaciona dois operandos (os números 3 e 2) por meio do operador (+) que representa a operação de adição. Pode-se classificar os operadores levando-se em consideração o tipo de dado de seus operandos, e do valor resultante de sua avaliação. Sendo assim, dividem-se em Operadores "de Atribuição", "Aritméticos", "Relacionais", "Lógicos" e "Literais". >> Operador de Atribuição: Um operador de atribuição serve para atribuir um valor a uma variável. Neste curso o operador de atribuição será o "sinal de igual": = Sendo assim, a sintaxe de um comando de atribuição será: NomeDaVariável = expressão;

Page 5: Apostila de algoritimos

A expressão localizada no lado direito do sinal de igual é avaliada, e seu valor resultante é armazenado na variável que está à esquerda. "O nome da variável que recebe o valor deve aparecer sempre sozinho, no lado esquerdo do sinal de igual deste comando."

Exemplos:

a = 3; nota1 = 8.5; media = (nota1 + nota2) / 2; v = v0 + a * t; salFinal = sal * perc / 100;

>> Operadores Aritméticos: Os operadores aritméticos relacionam as operações aritméticas básicas, conforme a tabela abaixo:

Operador Operação Prioridade + adição 3 - subtração 3 * multiplicação 3 / divisão 3

DIV parte inteira de uma divisão 2 MOD resto de uma divisão 2 ** potenciação (ou exponenciação) 1

Obs.: A prioridade (ou hierarquia) entre operadores define a ordem em que os mesmos serão avaliados (e executados) dentro de uma mesma expressão. >> Operadores Relacionais: Os operadores relacionais são operadores binários que "devolvem" os valores lógicos "verdadeiro" e "falso". Obs.: a palavra "devolvem" indica que uma operação com Operadores Relacionais tem como possíveis resultados apenas 2 valores: "verdadeiro" ou "falso".

Operador Operação < menor que > maior que <= menor ou igual a >= maior ou igual a != diferente de == igual a

Estes valores são somente usados quando se deseja efetuar comparações. Comparações só podem ser feitas entre objetos de mesma natureza, isto é, variáveis do mesmo tipo de dado. Por exemplo, digamos que a variável inteira "num" contenha o valor 7(sete). Assim as expressões a seguir fornecem cada uma, um valor lógico, sendo falso a primeira, e verdadeiro a segunda: num <= 5 num > 5 Operações que utilizam operadores relacionais são como perguntas, cuja resposta será sempre "Não" ou "Sim"; "Falso" ou "Verdadeiro"; "0" ou "1". Ex.: se num for igual a 7(sete), então: num <= 5 ? ... Não (Falso) num > 5 ? ... Sim (Verdadeiro) >> Operadores Lógicos: Os operadores lógicos ou booleanos são usados para combinar expressões relacionais. Também devolvem como resultado valores lógicos "verdadeiro" ou "falso".

Page 6: Apostila de algoritimos

Operador OU E

NÃO Fornecendo dois valores ou expressões lógicas, representadas por expressão1 e expressão2, podemos descrever as quatro operações lógicas a seguir:

expressão1 E expressão2 é verdadeiro somente se ambas, expressão1 e expressão2, forem verdadeiras. Se uma for falsa, ou se ambas forem falsas, a operação "E"como um todo também será falsa.

expressão1 OU expressão2 é verdadeiro se tanto a expressão1 como a expressão2 forem verdadeiras. As operações "OU" só resultam em valores falsos se ambas, expressão1 e expressão2, forem falsas.

NÃO expressão1 é verdadeiro se expressão1 for falsa; de modo contrário, a expressão "NÃO expressão1" resultará em falso, se expressão1 for verdadeira. Ou seja, a expressão NÃO expressão1 resulta na negação da expressão1.

Tabela Verdade:

A B A 0U B A E B NÃO A NÃO B V V V V F F V F V F F V F V V F V F F F F F V V

>> Operadores Literais: São os operadores que atuam sobre caracteres. Eles variam muito de uma linguagem para outra. O operador mais comum, e mais usado, é o operador que faz a concatenação (união) de strings: ou seja, tomando-se duas strings e unindo-se (concatenando-se) a segunda ao final da primeira. Podem-se utilizar dois operadores que fazem esta operação de união de caracteres: o "sinal de mais", ou a "vírgula". Por exemplo, a concatenação das strings "ALGO" e "RITMO" pode ser representada por:

"ALGO" + "RITMO" ou "ALGO", "RITMO" ...e o resultado de sua avaliação é: "ALGORITMO"

Nesta Apostila será adotada a "vírgula" como operadora de concatenação. Funções Matemáticas Abaixo, estão enumeradas algumas Funções Matemáticas que poderão ser abordadas e utilizadas em exercícios neste curso: ABS (x) Retorna o valor absoluto (positivo) de uma expressão SEN (x) Retorna o valor do seno COS (x) Retorna o valor do cosseno TAN (x) Retorna o valor da tangente EXP (x) Retorna o valor exponencial (ex - sendo "e" o no de Euler) LN (x) Retorna o logaritmo natural (logaritmo neperiano) PI Retorna o valor de PI (3.1415...)

Page 7: Apostila de algoritimos

Exemplos de expressões que utilizam estas funções matemáticas: val1 = SEN (4*x); val2 = ABS (val1); val3 = PI * SEN (x + 1); val4 = 2 * a * EXP (x + TAN (y)); val5 = LN (x ** 2) + 3 * COS (x – 2);

Expressões O conceito de "expressão", em termos computacionais, está intimamente ligado ao conceito de expressão ou fórmula matemática, onde um conjunto de variáveis e constantes numéricas relaciona-se por meio de operadores aritméticos compondo uma fórmula que, uma vez avaliada, resulta num valor. Expressões aritméticas são aquelas cujo resultado da avaliação é do tipo numérico, seja ele inteiro ou real. Somente o uso de funções, operadores aritméticos, variáveis numéricas e parênteses é permitido em expressões deste tipo. "Toda expressão aritmética deve estar linearizada, ou seja, representada inteiramente em apenas uma linha."

As seguintes regras são essenciais para a correta avaliação de expressões: 1. Deve-se observar a prioridade dos operadores, conforme mostrado nas tabelas de operadores: (obs.: operadores de maior prioridade devem ser avaliados primeiro. Se houver empate com relação à precedência, então a avaliação se faz da esquerda para a direita). 2. Os parênteses usados em expressões tem o poder de "roubar" a prioridade dos demais operadores, forçando a avaliação da subexpressão em seu interior, independente de qual seja. 3. Entre os quatro principais grupos de operadores existentes, a saber, aritmético, lógico, literal e relacional, há uma certa prioridade de avaliação: os aritméticos e literais devem ser avaliados primeiro; a seguir, são avaliadas as sub-expressões com operadores relacionais e, por último são avaliados os operadores lógicos. Comandos de Entrada de Dados Os comandos de entrada de dados são o meio pelo qual as informações dos usuários são transferidas para a memória dos computadores, para que possam ser usadas nos programas. No diagrama de blocos o comando de entrada de dados é representado por:

= Operações de entrada de dados via teclado

Em Português Estruturado há duas sintaxes possíveis para esta instrução: LEIA (<variável>) Ex: LEIA (X) LEIA (<lista_de_variáveis>) Ex: LEIA (nome, endereco, cidade) Obs.: A lista_de_variáveis é um conjunto de um ou mais nomes de variáveis separados por vírgulas. No diagrama, as variáveis que devem receber os valores devem ser descritas dentro do símbolo:

OU

X nome, endereco, cidade

Page 8: Apostila de algoritimos

Comandos de Saída de Dados Os comandos de saída de dados são o meio pelo qual informações contidas na memória dos computadores são colocadas nos dispositivos de saída, para que os usuários possam apreciá-las. No diagrama de blocos o comando de saída de dados é representado por:

= Operações de saída de dados em vídeo (monitor)

Em Português Estruturado há quatro sintaxes possíveis para esta instrução: ESCREVA (<variável>); Ex: ESCREVA (X); ESCREVA (<lista_de_variáveis>); Ex: ESCREVA (nome, endereco, cidade); ESCREVA (<literal>); Ex: ESCREVA ("Algoritmo é o máximo!"); ESCREVA (<literal>, <variável>, ... ,<literal>, <variável>); Ex: ESCREVA ("Meu nome é: ", nome, "e meu endereço é: ", endereco); No Fluxograma, os valores que devem ser mostrados na tela devem ser descritos dentro do símbolo:

OU Uma <lista_de_variáveis> é um conjunto de nomes de variáveis separados por vírgulas. Um literal é simplesmente um dado do tipo literal (string ou cadeia de caracteres) delimitado por aspas. Há ainda a possibilidade de se misturar nomes de variáveis com literais na lista de um mesmo comando. O efeito obtido é bastante útil e interessante: a lista é lida da esquerda para a direita e cada elemento da mesma é tratado separadamente; se um nome de variável for encontrado, então o valor da mesma é colocado no dispositivo de saída; no caso de um literal, o mesmo é escrito diretamente no dispositivo de saída (na tela). Exemplo: algoritmo que calcula o preço total de acordo com a quantidade de produto comprada.

Algoritmo exemplo_comando_de_entrada_de_dados Var preco_unit, preco_tot : Real; quant : Inteiro; Início Leia (preco_unit, quant); preco_tot = preco_unit * quant; Escreva (preco_tot); Fim.

X "Valor da média: ", media

Page 9: Apostila de algoritimos

Estruturas Condicionais: (Comandos de Decisão) Neste tipo de estrutura o fluxo de instruções a ser seguido é escolhido em função do resultado da avaliação de uma ou mais condições. Uma condição é uma expressão lógica. A classificação das estruturas de decisão é feita de acordo com o número de condições que devem ser testadas para que se decida qual o caminho a ser seguido. Segundo esta classificação, têm-se 3 tipos de estruturas de decisão: - Estrutura de Decisão Simples (Se..então..fim_se) - Estrutura de Decisão Composta (Se..então..senão..fim_se) - Estrutura de Decisão Múltipla (Se..então..senão se..então ... fim_se) Uma Estrutura de decisão inicia-se na palavra reservada "SE" (inicial), e termina na palavra reservada "FIM_SE". >> Estruturas de Decisão Simples (Se..então..fim_se) Nesta estrutura uma única condição (expressão lógica) é avaliada. Dependendo do resultado desta avaliação, um comando ou conjunto de comandos serão executados (se a avaliação for verdadeira) ou não serão executados (se a avaliação for falsa). No diagrama de blocos a estrutura para instrução "Se..então..fim_se" é representado por:

Sintaxe em Português Estruturado de uma estrutura de decisão simples:

SE <condição> ENTÃO <instruções>; FIM_SE

A semântica desta construção é a seguinte: – a condição é avaliada: – Se ela for verdadeira, então o conjunto de instruções delimitado pelas palavras-reservadas "ENTÃO" e "FIM_SE" será executado. Ao término de sua execução o fluxo do algoritmo prossegue pela instrução seguinte à construção, ou seja, o primeiro comando após a palavra-reservada "FIM_SE". – No caso da condição ser falsa, o fluxo do algoritmo prossegue pela instrução seguinte à construção, ou seja, o primeiro comando APÓS a palavra-reservada "FIM_SE", sem executar o conjunto de instruções entre as palavras-reservadas "ENTÃO" e "FIM_SE".

CONDIÇÃO

INSTRUÇÕES

VERDADEIRA FALSA

Page 10: Apostila de algoritimos

Exemplo de algoritmo que lê um número e escreve se o mesmo é maior que 10:

Algoritmo exemplo_estrutura_de_decisão_simples Var X : Inteiro; Início Escreva ("Digite um valor"); Leia (X); Se X > 10 Então Escreva ("X é maior que 10"); Fim_se Fim.

>> Estruturas de Decisão Compostas (Se..então..senão..fim_se): Nesta estrutura uma única condição (expressão lógica) é avaliada. Se o resultado desta avaliação for "verdadeiro", um conjunto de instruções será executado. Caso contrário, ou seja, quando o resultado da avaliação for "falso", um outro conjunto de instruções será executado. No diagrama de blocos a estrutura para instrução "Se..então..senão..fim_se" é representado por:

Sintaxe em Português Estruturado de uma estrutura de decisão composta:

SE <condição> ENTÃO <instruções_1>; SENÃO <instruções_2>; FIM_SE

A semântica desta construção é a seguinte: – a condição é avaliada: – Se ela for verdadeira, então o conjunto de "instruções_1" delimitado pelas palavras-reservadas "ENTÃO" e "SENÃO" será executado. Ao término de sua execução o fluxo do algoritmo prossegue pela instrução seguinte à construção, ou seja, o primeiro comando após a palavra-reservada "FIM_SE". – No caso da condição ser falsa, então o conjunto de "instruções_2" delimitado pelas palavras-reservadas "SENÃO" e "FIM_SE" será executado. Ao término de sua execução o fluxo do algoritmo prossegue pela instrução seguinte à construção, ou seja, o primeiro comando após a palavra-reservada "FIM_SE".

CONDIÇÃO

INSTRUÇÕES_1 INSTRUÇÕES_2

FALSA VERDADEIRA

Page 11: Apostila de algoritimos

Exemplo de algoritmo que lê um número e escreve se o mesmo é, ou não, maior que 100:

Algoritmo exemplo_estrutura_de_decisão_composta Var X : Inteiro; Início Leia (X); Se X > 100 Então Escreva ("X é maior que 100"); Senão Escreva ("X não é maior que 100"); Fim_se Fim.

>> Estruturas de Decisão Múltiplas (Se..então..senão se..então ... fim_se) Nesta estrutura várias condições (expressões lógicas) são avaliadas. Se o resultado de uma destas avaliações for "verdadeiro", apenas o conjunto de instruções daquela condição será executado. No diagrama de blocos a estrutura para instrução "Se..então..senão se..então ... fim_se" é representado por:

Sintaxe em Português Estruturado de uma estrutura de decisão múltipla:

SE <condição_1> ENTÃO <instruções_1>; SENÃO SE <condição_2> ENTÃO <instruções_2>; SENÃO SE <condição_3> ENTÃO <instruções_3>; ... SENÃO <instruções_N>; FIM_SE

CONDIÇÃO_1

INSTRUÇÕES_1

INSTRUÇÕES_2

FALSA

VERDADEIRA

CONDIÇÃO_2

FALSA INSTRUÇÕES_2

nome,

VERDADEIRA nome,

INSTRUÇÕES_3 nome,

VERDADEIRA nome,

INSTRUÇÕES_N nome,

FALSA

Page 12: Apostila de algoritimos

A semântica desta construção é a seguinte: – a 1a condição é avaliada. – Se ela for verdadeira, então o conjunto de "instruções_1" será executado. Ao término de sua execução o fluxo do algoritmo prossegue pela instrução seguinte à construção, ou seja, o primeiro comando após a palavra-reservada "FIM_SE". – No caso da 1a condição ser falsa, então a 2a condição é avaliada. – Se ela for verdadeira, então o conjunto de "instruções_2" será executado. Ao término de sua execução o fluxo do algoritmo prossegue pela instrução seguinte à construção, ou seja, o primeiro comando após a palavra-reservada "FIM_SE". – No caso desta condição ser falsa, então as seguintes condições são avaliadas em sequência, até encontrar alguma "verdadeira". Se nenhuma das condições existentes for "verdadeira", o conjunto de "instruções_N" delimitado pelas palavras-reservadas "SENÃO" e "FIM_SE" será executado. Ao término de sua execução o fluxo do algoritmo prossegue pela instrução seguinte à construção, ou seja, o primeiro comando após a palavra-reservada "FIM_SE". OBS.: Não é obrigatória a existência do conjunto de "instruções_N" delimitado pelas palavras-reservadas "SENÃO" e "FIM_SE". Exemplo de algoritmo que lê um número e escreve se o mesmo é menor que: 10, 20, 30, ou 40:

Algoritmo exemplo_estrutura_de_decisão_multipla Var X : Inteiro; Início Leia (X); Se X < 10 Então Escreva ("X é menor que 10"); Senão Se X < 20 Então Escreva ("X é menor que 20"); Senão Se X < 30 Então Escreva ("X é menor que 30"); Senão Se X < 40 Então Escreva ("X é menor que 40"); Senão Escreva ("X é maior ou igual a 40"); Fim_se Fim.