pascal/c - ebrito.com.brebrito.com.br/profa-elaine/aulac.pdf · • pascal é interessante pois sua...

70
Pascal/C Técnicas de Programação

Upload: hoangthuy

Post on 09-Dec-2018

225 views

Category:

Documents


0 download

TRANSCRIPT

Pascal/C

Técnicas de Programação

Introdução

• Programar um computador é instruí-lo a executar uma série de passos para se atingir um determinado objetivo.

• Cada computador possui uma linguagem que ele compreende - linguagem de máquina.

• A linguagem de máquina é composta, geralmente, por representações dos sinais elétricos que o computador compreende.

• Como quase todo computador é binário – compreende apenas dois níveis de voltagem elétricos – a linguagem de máquina geralmente é expressa em sequências compostas por dois valores: 0, para um nível menor de voltagem; e 1, para um nível maior de voltagem. Algo do tipo: 001001010010100101010100101010101 010101001010100001011101010101010

• Para o computador isto é completamente compreensível, mas para o ser humano este tipo de linguagem seria difícil de compreender, pois para cada comando do computador haveria uma sequência diferente de zeros e uns.

• Para resolver este problema, durante os anos foram criadas linguagens de programação mais compreensíveis, geralmente baseadas em termos de idiomas humanos reais (inglês é o mais utilizado), para expressar as instruções que o computador deveria executar.

• Como os computadores continuam entendendo somente o código de máquina, após os programas serem criados nestas novas linguagens de programação eles devem ser traduzidos para programas em linguagens de máquina. Para fazer esta tradução são utilizados programas especiais chamados tradutores. O trabalho do tradutor é: – ler um código-fonte escrito em uma linguagem de programação; – analisar possíveis erros de escrita no código-fonte e informá-los ao

programador; – se não houver erros, gerar um código de máquina correspondente a este

programa.

• Isto foi uma grande evolução na programação de computadores, pois aumentou a eficiência dos programadores e diminuiu a probabilidade de erros nos códigos.

Introdução

• A forma como o tradutor faz a leitura do código-fonte em uma linguagem de programação e gera um programa em código de máquina é que define o tipo do tradutor. Tradicionalmente os tradutores podem ser classificados como compiladores, interpretadores, ou híbridos deles.

• O compilador lê todo o código-fonte, verifica se há erros e gera um programa em linguagem de máquina. Após isso o programa está pronto para ser executado e o código-fonte não é mais necessário. Um programa feito por compilação pode ser entregue para o usuário sem o código-fonte, pois o executável é uma tradução fiel e total do código-fonte.

• O interpretador realiza o trabalho de tradução e execução de forma simultânea. Em vez de gerar todo o código de máquina para depois possibilitar a execução, ele vai lendo o código-fonte instrução por instrução, gera o código de máquina correspondente àquela instrução e executa-o. Não há separação entre traduzir e executar, a tradução é feita de acordo com a sequência do código que é executado. Portanto, o código-fonte é entregue ao usuário e ele deve ter o interpretador na máquina para executar o programa.

Introdução

Breve Panorama das Linguagens de Programação

• As primeiras linguagens de programação não eram tão diferentes das linguagens de máquina. Eram chamadas de linguagens de montagem, ou Assembly.

• Depois surgiram linguagens que possuíam instruções que se aproximavam mais de construções matemáticas como expressões, funções e ofereciam estruturas complexas de repetição e desvio de execução. Linguagens como FORTRAN, C, Pascal e BASIC ofereciam tal facilidade.

• Nosso interesse é aprender a lógica de programação utilizando duas linguagens estruturadas: C e Pascal, pois estas linguagens são muito utilizadas para ensino no meio acadêmico.

• C é a linguagem historicamente mais bem-sucedida da computação, pois foi utilizada na construção da maioria dos sistemas operacionais conhecidos e sua sintaxe serviu como base para diversas linguagens de sucesso como Java, PHP e C++.

• Pascal é interessante pois sua sintaxe se aproxima bastante do português estruturado, ou Portugol, bastante usado em aulas de lógica de programação.

C e Pascal

• Para desenvolver programas em C e Pascal geralmente são usados compiladores, e não interpretadores, não porque não seja possível mas porque historicamente foram usadas no desenvolvimento de aplicativos que não devem funcionar com interpretação como Sistemas Operacionais e programas comercializados sob licença, que obviamente não podem ter seu código fonte aberto.

Code::Blocks • Para facilitar o desenvolvimento e compilação de um programa

em C, o Code::Blocks oferece um ambiente que integra um editor de textos a um compilador para linguagem C.

• O compilador usado pelo Code::Blocks é o famoso gcc (Gnu C Compiler).

• No Windows há basicamente dois tipos de programas de usuário:

– aplicações para o console (Console Applications), que são executadas numa janela de texto (também conhecida como Prompt do MS-DOS); e

– aplicações Gráficas (GUI Applications), que usam janelas, menus e outros elementos visuais como parte de sua interface com o programador.

• Todos os programas em C que faremos serão aplicações para o console.

Code::Blocks

• O Code::Blocks é “Free Software” (sob GNU General Public License). Isto significa, entre outras coisas, que ele pode ser distribuído e copiado à vontade.

Tela inicial do Code::Blocks

• Inicie o Code::Blocks clicando no ícone do mesmo que aparece na área de trabalho, ou em Iniciar —> Todos os Programas —> CodeBlocks —> CodeBlocks

• Com isso, o ambiente de programação do Code::Blocks é iniciado. Isso fará com que apareça no monitor uma janela semelhante à mostrada a seguir.

Code::Blocks

• Uma vez obtida a tela inicial do Code::Blocks clique em File —> New —> File....

conforme ilustrado abaixo.

Code::Blocks

• Na próxima janela clique e C/C++ source e clique em GO

• Clique em Next para as duas próximas janelas, em especial para a segunda janela a seguir, se certifique que linguagem selecionada é a C.

• Na janela a seguir, digite um nome para o arquivo de programa a ser digitado. Para tanto, clique no quadrado com ... que aparece ao lado da caixa com título Filename with full path: e digite um nome de arquivo, por exemplo: primeiro

• Clique agora em Salvar e depois em Finish.

• Na janela que foi criada você vai digitar, compilar e executar seu primeiro programa em C.

Code::Blocks

Primeiro Programa

• Tradicionalmente o primeiro programa desenvolvido em qualquer linguagem de programação é um programa vazio, ou seja, sem instrução nenhuma.

• Em Português Estruturado, seria algo assim:

• Em Pascal, todo programa deve ser criado em um arquivo com extensão .pas. No nosso caso podemos chamar nosso primeiro programa de primeiro.pas. O correspondente em Pascal ao programa acima é:

Primeiro Programa

• Em C, todo programa é criado em um arquivo com extensão .c, ou .ccp em C++. Chamaremos este programa de primeiro.c e seu código será o seguinte:

• Não temos uma definição explícita para nome de programa em C, porque o nome do programa é o nome do seu arquivo executável.

• O programa consiste na criação da função main, que é um nome reservado exclusivamente para este fim. Outras funções podem ser criadas mas main só pode ser usada para este propósito. Toda função tem um tipo de retorno e o tipo de main é int, já que em C o programa geralmente retorna um valor inteiro que indica se o programa rodou corretamente ou apresentou erros – 0 indica que não houve erro.

• As chaves, { }, indicam início e fim de um bloco, assim como begin e end em Pascal.

Primeiro Programa

• Podemos enriquecer os programas adicionando comentários.

Primeiro Programa

Bibliotecas

• Em Pascal nós incluímos a biblioteca através de uses crt

• Em C, é necessário incluir duas bibliotecas para permitir a saída da frase e a chamada de system. Estas bibliotecas geralmente vem com o pacote padrão do compilador ou do sistema operacional, e devem ser incluídas com a diretiva de compilação #include. #include <stdio.h> permite entrada e saída #include<stdlib.h> permite interação com funções do sistema operacional

Programa Olá, Mundo • Com o programa Hello, World (Olá, mundo) é

possível ver uma saída visual no monitor, a fim do programador poder “ver algo acontecer”. Temos:

Programa Olá, Mundo

• Para compilar o seu programa pelo Code::Blocks você deve clicar em – Build —> Compile current file

• Se tudo der certo, na janela de log abaixo do programa, haverá a indicação de que o programa foi compilado com sucesso: 0 errors, 0 warnings

Programa Olá, Mundo

• Bem, com o programa primeiro compilado sem erros, a pasta onde foi salvo o arquivo primeiro.c contém agora o programa executável primeiro.exe. Para executar o programa clique no botão

Build —> Run da janela principal do Code::Blocks. Deverá surgir uma nova janela, de DOS, mostrando a execução de seu programa

Programa Olá, Mundo

Tipo de dados primitivos e variáveis

• Variáveis são espaços de memórias reservados pelo programa para armazenar dados.

• As variáveis devem possuir um tipo, que determina o tamanho da porção de memória necessária a ser reservada pelo programa para a variável.

Tipos de Variáveis

• Uma tabela com um descritivo dos tipos em Pascal e C:

Atribuições

• Quanto à atribuição de valores às variáveis, usamos, em cada linguagem, o operador de atribuição correspondente. – Em Pascal := – Em C =

• Quanto aos valores atribuídos, em ambas as linguagens o valor decimal utiliza o ponto e não vírgula como separador das casas numéricas e aspas simples para envolver um caractere simples.

• Para strings Pascal usa aspas simples e C usa aspas duplas para envolvê-las.

• Em C, as variáveis podem ser inicializadas em suas declarações, ou seja, ela recebe um valor já no momento da criação.

Exemplos

Program Variaveis; Uses CRT; {Declara variáveis com seus tipos} Var c: char; i:integer; d:real; f:string; Begin c:= ‘a’; i:=12; d:=45.23; f:=‘Hello, world’; End.

#include <stdio.h> #include <stdlib.h> {Declara variáveis com seus tipos} int main(void) { char c = 'a'; int i; float d; char* f; i = 12; d=45.23; f = "Hello,world"; }

Em C as variáveis devem ser declaradas logo após o início do corpo da função (antes de qualquer outra instrução).

Em Pascal as variáveis devem ser declaradas em um bloco especial iniciado por var

• Podemos verificar a forma como as variáveis são declaradas e como recebem valores via atribuição.

• Nos dois códigos abaixo, em Pascal e C, estão listados mais alguns exemplos de declaração de variáveis.

Exemplos

Entrada e saída de dados

• Para que um programa torne-se minimamente funcional é preciso que ele receba dados do meio externo e emita o resultado de seu processamento de volta para o meio externo .

• Em Pascal usamos para entrada read e readln e para saída write e writeln.

• Em C, existem muitas funções pré-definidas que tratam de entrada e saída. Vamos agora dar uma idéia das funções printf() e scanf() em C.

Saída Formatada: printf() • Esta função imprime dados numéricos, caracteres e

strings e os dados de saída podem ser formatados (alinhados, com número de dígitos variáveis, etc.)

• Observe no exemplo abaixo as instruções de saída formatada e os respectivos resultados.

• Observe que na primeira instrução, a saída é exatamente igual a string de controle. Já na segunda instrução a impressão se deu em duas linhas. Isto se deve ao \n que representa o código ASCII para quebra de linha

Exemplos

#include <stdio.h> // biblioteca da funcao printf()! #include <conio.h> // biblioteca da funcao clrscr() void main() { // somente texto printf("Texto Exemplo"); // sem quebra de linha printf("Texto Exemplo"); printf("Texto Exemplo"); printf("\nTexto Exemplo"); // com quebra de linha printf("\nTexto Exemplo"); printf("\nTexto Exemplo"); } Saída:

• É possível reservar espaço para o valor de alguma variável usando especificadores de formato que marcam o lugar e o formato de impressão das variáveis contidas na lista variáveis. Deve haver um especificador de formato para cada variável a ser impressa e todos eles começam com um %

• Exemplo:

Admita que idade seja uma variável int com valor 29

printf(“Tenho %d anos de vida”,idade);

Saída: Tenho 29 anos de vida

Saída Formatada: printf()

Formatadores mais comuns: %d número inteiro em formato decimal %o número inteiro em formato octal %x número inteiro em formato hexadecimal %f número real em ponto flutuante %c caractere simples %s cadeia de caracteres \n nova linha (pula uma linha) \t tab (insere espaços de uma tabulação) \“ aspas (usado quando se quer imprimir aspas) \\ barra (usado quando se quer imprimir uma barra)

Saída Formatada: printf()

• Exemplo: Admita que tot e din sejam variáveis float cujo valores são 12.3 e 15.0.

• printf(“Total: %.2f \nDinheiro: %.2f \nTroco: %.2f“,tot,din,din-tot);

Saída: Total: 12.30

Dinheiro: 15.00

Troco: 2.70

Saída Formatada: printf()

Número de casas decimais a serem exibidas para o valor da variável float Padrão 6 dígitos – se omitido .0 – sem casas decimais .n – com n casas decimais

Exemplos #include <stdio.h> // biblioteca da funcao printf()! #include <conio.h> // biblioteca da funcao clrscr() void main(){ char letra = 'a'; char* nome = "Teste"; // formato caracter printf("%c",letra);//escreve o valor da variável letra e continua na mesma linha

printf("\n%c",'b');//primeiro muda de linha, depois escreve b e continua na mesma linha

printf("%c\n",'b');//primeiro escreve b, depois muda de linha

printf("\n%c",'b');//primeiro muda de linha, depois escreve b

// formato string printf("\n%s",nome); //muda de linha e escreve o valor da variável nome

} Saída:

Exemplos #include <stdio.h> // biblioteca da funcao printf()! #include <conio.h> // biblioteca da funcao clrscr() void main(){ int i = 12; float r = 5.83; // texto e numero sem formatacao printf("\nJoaozinho tem %d amiguinhos!",i); printf("\nConsumo Medio: %f kWh",r); } Saída:

Exemplos #include <stdio.h> // biblioteca da funcao printf()!

#include <conio.h> // biblioteca da funcao clrscr()

void main(){

int i = 12;

float r = 5.83;

// Uso dos modificadores de formato

printf("\n %d %12f",i,r);//muda de linha escreve o valor da variável i, escreve o valor da variável r

usando pelo menos 12 dígitos (como ele ocupa 4 serão inseridos 8 espaços em branco)

printf("\n %10d %12f",i,r); //muda de linha escreve o valor da variável i usando pelo menos 10

dígitos(como ele tem 2 dígitos serão inseridos 8 espaços em branco, escreve o valor da variável r usando pelo menos 12 dígitos (como ele ocupa 4 serão inseridos 8 espaços em branco)

printf("\n %010d %12f",i,r); //muda de linha escreve o valor da variável i usando pelo menos 10

dígitos(como ele tem 2 dígitos serão inseridos 8 zeros à esquerda, escreve o valor da variável r usando pelo menos 12 dígitos (como ele ocupa 4 serão inseridos 8 espaços em branco)

} A especificação de tamanho é opcional n pelo menos n dígitos serão impressos (dígitos faltantes serão completados por brancos).

0n pelo menos ndígitos serão impressos (dígitos faltantes serão completados por zeros).

Saída:

Exemplos #include <stdio.h> // biblioteca da funcao printf()!

#include <conio.h> // biblioteca da funcao clrscr()

void main(){

int i = 12;

int j = -35;

int k = 9386;

float r = 5.83;

float s = -82.3;

float t = 5467.75;

// Uso dos modificadores de formato

printf("\n\nJustificacao a direita");

printf("\n %6d %12f",i,r);

printf("\n %6d %12f",j,s);

printf("\n %6d %12f",k,t);

printf("\n\nJustificacao a esquerda");

printf("\n %-6d %-12f",i,r);

printf("\n %-6d %-12f",j,s);

printf("\n %-6d %-12f",k,t);

printf("\n\nCom sinal");

printf("\n %+6d %+12f",i,r);

printf("\n %+6d %+12f",j,s);

printf("\n %+6d %+12f",k,t);

}

A justificação de saída é o elemento que é inserido logo após o % e ela é opcional omitido justificação à direita (padrão) - justificação à esquerda. + conversão de sinal (com sinal: + ou -)

Saída:

Leitura formatada: scanf()

• O uso da função scanf() é semelhante ao da função printf(). A função lê da entrada padrão (em geral, teclado) uma lista de valores que serão formatados e armazenados nos endereços das variáveis da lista.

Especificadores de formatos mais comuns

d inteiro decimal (int) f ponto flutuante (float) x inteiro hexadecimal (int) i inteiro decimal de qualquer formato(int) u inteiro decimal sem sinal (unsigned int) s string (char*) c caracter (char)

• A lista de variáveis é o conjunto de (endereços) de variáveis para os quais serão passados os dados lidos. Variáveis simples devem ser precedidas pelo caracter &.

Para essa declaração de variáveis:

char nome[15]; int cod; float preco; int dia,mes,ano;

Podemos ter: scanf("%d",&cod);

scanf("%s %d %f",nome,&cod,&preco); scanf("%2d %2d %2d",&dia,&mes,&ano);

Leitura formatada: scanf()

Observe que neste exemplo nome não é uma variável simples, pois é uma cadeia de caracteres, assim a variável nome não é precedida de &

Exemplo #include <stdio.h> // biblioteca das funcoes scanf() e printf()

void main(){

char nome[15];

int cod;

float preco;

// leitura individual

printf("\nDigite o nome do item: "); // texto de aviso (prompt)

scanf("%s",nome); // leitura do dado

printf("Digite o codigo do item: ");

scanf("%d",&cod);

printf("Digite o preco do item: ");

scanf("%f",&preco);

}

Exemplo

#include <stdio.h> // biblioteca das funcoes scanf() e printf()

void main(){

char nome[15];

int cod;

float preco;

// leitura conjunta

printf("\nDigite o nome, codigo e preco do item: ");

scanf("%s %d %f",nome,&cod,&preco);

}

Exemplo #include <stdio.h> // biblioteca das funcoes scanf() e printf()

void main(){

char nome[15];

int cod;

float preco;

preco=9.80;

// leitura conjunta com supressao

printf("\nDigite o nome, codigo e preco do item: ");

scanf("%s %d %*f",nome,&cod,&preco); // apos a leitura,'preco' nao e‘ alterado

printf("\nNome %s Codigo %d Preço %f",nome,cod,preco);

} Observe que neste exemplo temos um * na especificação de %*f que define o valor da variável preco. Esse * indica que esse valor lido será suprimido, ou seja, ele não será atribuído à variável. Assim preco continuará com o valor anteriormente atribuído de 9.80, não alterado.

Exemplo #include <stdio.h> // biblioteca das funcoes scanf() e printf()

void main(){

int dia,mes,ano;

// leitura segmentada

printf("\nDigite sua data de nascimento (ddmmaa): ");

scanf("%2d %2d %2d",&dia,&mes,&ano);

printf("\nVoce nasceu em %d de %d de 19%d!",dia,mes,ano);

}

Observe que neste exemplo temos um 2 na especificação de %2d que define o valor das variáveis dia, mês e ano. Esse 2 indica que o numero máximo de caracteres para leitura desses campos é de 2 dígitos. Assim, os dois primeiros dígitos digitados serão atribuídos à dia, os dois seguintes à mês e os dois últimos à ano.

Voltando aos códigos...

• Agora que já fizemos uma introdução à entrada e saída em C que por ser formatada é um pouco diferente da entrada e saída no Pascal, voltamos a comparar sempre as duas linguagens...

Exemplos

Operadores Aritméticos

Exemplo – Operadores Aritméticos

Operadores Lógicos

• Uma expressão lógica é uma comparação que sempre retorna valor verdadeiro ou falso.

• Podemos atribuir o resultado de uma expressão lógica à uma variável resposta ← a = b se a possui valor 1 e b possui valor 1, então

resposta deve receber true(verdadeiro)

se a possui valor 1 e b possui valor 2, então

resposta deve receber false(falso)

• O tipo da variável resposta que armazena os resultados das expressões lógicas é o booleano.

• Em Pascal temos o tipo boolean que pode receber como valores true (verdadeiro) ou false (falso) enquanto que em C não existe o tipo booleano. O resultado de uma expressão lógica em C pode ser 0 (falso) ou qualquer outro valor inteiro (verdadeiro). Para armazenar um valor booleano em C podemos usar uma variável inteira ou char.

Operadores Lógicos

Exemplo - Operadores Lógicos

Estrutura condicional

Em Pascal

if (condição) then

begin

comandos

end

else

begin

comandos

end

Em C

if (condição)

{

comandos

}

else

{

comandos

}

Exemplo - IF

• Um esporte só pode ser praticado por maiores de 18 anos e a divisão é feita por peso:

– até 80kg é considerado peso-leve,

– acima de 80kg até 130kg, peso-pesado,

– acima disso não é permitido praticar este esporte.

Pascal C

Exemplo – SWITCH/CASE

• A mãe pergunta ao filho sobre o que ele gostaria de comer entre bolo, salgado, pipoca ou sorvete. Dependendo da resposta, ela compra os ingredientes corretos para o preparo da opção escolhida. Se ele disser outra coisa qualquer, ela nega.

Pascal C

Notem que no Pascal temos else e em C temos default

Comandos de Repetição - Laços

• Os comandos de repetição possibilitam que um conjunto de comandos possam ser repetidos seguindo uma determinada regra ou condição.

– alguns comandos repetem um conjunto de instruções enquanto uma condição é satisfeita,

– outros repetem até que a condição seja satisfeita

– e outros repetem um determinado número de vezes.

• Cada repetição executada é chamada de iteração.

Enquanto...faça

• O comando enquanto … faça realiza as iterações enquanto uma condição for satisfeita.

• O teste da condição é feito antes de executar a iteração, por isso um comando enquanto … faça pode não ter sequer uma iteração realizada, quando logo no início a condição resulta em falso.

Exemplo

• O programa pede o número de caracteres que o usuário deseja digitar e permite que o usuário entre com esta quantia de caracteres.

Exemplo

Exemplo

• Existem situações em que o desejável é executar primeiro a iteração e depois testar a condição.

• Para isso temos o comando faça … enquanto ou repita … até.

• O faça … enquanto realiza uma iteração e só realiza a próxima se a condição for satisfeita, enquanto que o repita … até realiza uma iteração e só realiza a próxima se a condição não for satisfeita, pois até denota uma condição de terminação e não de continuação.

• Pascal tem apenas o repita … até e C somente o enquanto … faça.

Comandos de Repetição - Laços

Exemplo • Podemos refinar o programa anterior pedindo

repetidamente que o usuário digite uma caractere: agora a condição é que quando ele digitar o caracter 0 o programa será finalizado. Assim, não será necessário estabelecer o número de caracteres digitados previamente.

Exemplo

O comando repeat … until não necessita dos delimitadores de bloco begin end nem quando envolvem vários comandos.

Exemplo

O comando do … while, em C, deve sempre ter os delimitadores {}, ainda que envolva um único comando.

• Agora, vamos visualizar a seguinte situação: temos um laço que gira em torno de uma variável. O valor da variável inicia com um determinado valor, este valor é aumentado ou diminuído em uma unidade a cada iteração e quando atinge um determinado valor limite, o laço é finalizado. O comando para este fim é o para … faça.

Comandos de Repetição - Laços

• Em Pascal to indica que a variável aumenta a cada iteração e downto que diminui.

• Em C o comando para … faça é bastante poderoso, permite a inicialização e atualização de várias variáveis e permite condições de continuação que não necessariamente estejam relacionadas às variáveis.

Comandos de Repetição - Laços

• Um exemplo simples é o de uma contagem a ser impressa na tela. Uma variável começa em um determinado valor, a cada iteração é impressa na tela e incrementada e quando atinge o valor limite, o laço é finalizado. No laço seguinte a contagem é feita em forma decrescente.

Exemplo

Exemplo

Exemplo