Programação II Prof. Jano Moreira de Souza e Jonice Oliveira Objetivos Conceitos mais profundos de programação Pascal. Revisão Programação I; Bibliotecas; Arquivo Texto; Arquivo Binário; Ponteiros e Estruturas Encadeadas; Estruturas Avançadas de Busca. O Curso Aulas Teóricas – 2ª. Feira (8:00/10:00); Exercícios Práticos - sem nota; Trabalhos em Grupo de 3-5 pessoas; Definam os grupos; 2 Provas; Período: 06/agosto 3/Dezembro (18 aulas) Monitor: Rafael De Martino Avaliação 2 provas (60%) 1ª Prova: 24 setembro 2ª Prova: 12 novembro Prova 2ª.Chamada: 26 novembro Matéria Completa Trabalhos em Grupo (40%) Contatos Prof. Jano – [email protected] Jonice Oliveira – [email protected] Página do curso: http://www.cos.ufrj.br/~jonice/classes/comp2/index.htm Obs: Ainda NÃO atualizada!!! O Primeiro Programa Programar significa resolver um problema usando uma solução que o computador seja capaz de realizar; Para tanto, usamos uma linguagem de programação que o computador seja capaz de “entender”; Linguagens de Alto Nível Tipos de Linguagem Linguagem de alto nível Este é o tipo de linguagem de programação que é usado efetivamente na prática para escrever programas O grau de abstração é bem alto, próximo ao modo de o ser humano pensar Neste nível, não trabalhamos com o conceito de instrução de máquina e sim com o de comando Um comando perfaz várias instruções de máquina As posições de memória são denotadas por variáveis e constantes Tipos de Linguagem Linguagem de alto nível Todo programa escrito em linguagem de alto nível também tem que passar por um processo de tradução para linguagem de máquina Esse processo é executado por um programa tradutor chamado compilador ou, em certas situações, interpretador Sem um compilador ou interpretador, os programas escritos em linguagem de alto nível resultam em peças inúteis na prática, pois o computador não é capaz de executá-los diretamente Compilador X Interpretador 1. Compilador Erros de Compilação Editor Compilador Código Fonte Bibliotecas Externas Erros de Linkedição Linkeditor Código Objeto Código Executável Erros na Execução Compilador X Interpretador Interpretador, que traduz os comandos ``passoa-passo'' e na medida da necessidade; LeituraTradução Execução de cada linha do programa-fonte, Linguagem Pascal Pascal é uma linguagem de alto nível Ela consiste em: comandos tipos de dados Ela contém também maneiras de modularizar o desenvolvimento de programas funções e procedimentos Esquema de Programa Pascal Todo programa escrito em Pascal tem a seguinte forma geral: program Nome_do_Programa; Declarações begin Comandos end. O Primeiro Programa Problema Efigênia e Cristóvão querem calcular a média de dois números inteiros por meio de um computador Eles sabem como calcular média, mas não sabem usar computador Para tanto, pediram ajuda a vocês. O Primeiro Programa Solução A média é uma estatística muito utilizada na prática, quando se quer representar por apenas um valor um conjunto de valores numéricos Uma forma fácil de estimar a média de um conjunto de dados numéricos é somar todos os dados e, depois, dividir essa soma pelo número de dados do conjunto No nosso caso, temos apenas dois dados o que torna a solução mais fácil ainda Algoritmo da Solução 1. 2. 3. 4. Entre com os dois números no computador Calcule a soma dos dois números Calcule a média dos números Imprima a média Programa da Solução program Media( input, output ); { Calcula a média de dois números inteiros. } var x, y : integer; m : real; begin { Lê dois números inteiros. } writeln( 'Digite dois números inteiros:' ); readln( x, y ); { Calcula a média dos números. } m := (x + y)/2; { Imprime a média. } writeln( 'A média deles é ', m ); end. Execução do Programa Digite dois números inteiros: 56 75 A média deles é 6.550000000000000E+001 O Alfabeto do Pascal O alfabeto da linguagem Pascal consiste em: letras dígitos símbolos especiais palavras-chaves O Alfabeto do Pascal Letras Consiste nas letras latinas maiúsculas e minúsculas A, B, C, ..., Y, Z a, b, c, ..., y, z Dígitos São os dígitos decimais indo-arábicos 0, 1, 2, ..., 9 O Alfabeto do Pascal Símbolos especiais São os símbolos usados para delimitadores, pontuação, operadores, etc. +, -, *, /, =, <>, <, >, <=, >=, (, ), [, ], :=, ., ,, :, ;, .., ', ^ Palavras-chaves São palavras da língua inglesa usadas como se fossem símbolos individuais em várias partes de um programa O Alfabeto do Pascal Palavras-chaves Elas são: div, mod, nil, in, or, and, not, if, then, else, case, of, repeat, until, while, do, for, to, downto, begin, end, with, goto, const, var, type, array, record, set, file, function, procedure, label, packed, program As palavras-chaves da linguagem Pascal são reservadas A linguagem Pascal não distingue letras maiúsculas de minúsculas Números Os números podem ser representados em Pascal em duas formas: inteiros reais Um número inteiro pode ser positivo, negativo ou zero Um número inteiro é escrito como uma seqüência de dígitos que pode ser precedida por um sinal, + ou Números Exemplos de números inteiros válidos: 6 0 -6 +7000000 Números inteiros inválidos: 6.437.271 -6,0 -6.0 Números Os números reais contêm uma parte fracionária ou um fator de escala A parte fracionária é separada da parte inteira por um ponto decimal O fator de escala é um sufixo contendo a letra E ou e, seguida de um inteiro. Este inteiro é a potência de 10 pela qual se deve multiplicar o número para obter sua grandeza correta Números Exemplos de números reais válidos: 0.0 0.873 -74.1 73.36789 0E0 8.73E+02 -741E-1 0.7336789E2 Números Exemplos de números reais inválidos 0. .736 2,736.45 25.94E 245.62E0.5 E34 5.E2 Números As seguintes formas são todas corretas para escrever o número real 253.0: 253.0 2.53E2 25.3E+01 253E0 2530E-1 Identificadores Certos itens de um programa requerem um nome para que sejam identificados Os nomes são chamados de identificadores Um identificador consiste em uma letra seguida por qualquer quantidade de outras letras ou dígitos Na prática, os identificadores devem ser significativos Identificadores Exemplos de identificadores válidos I ovni PC49 Umnomelongodefato UmExemploQualquer Exemplos de identificadores inválidos 1abc erva-doce $100 Identificadores Padrões Existem alguns identificadores que são pré-declarados em qualquer implementação do Pascal padrão Eles são: abs eoln maxint pred round trunc arctan exp new put sin unpack boolean false odd read sqr write char get ord readln sqrt writeln chr input output real succ cos integer pack reset text eof ln page rewrite true Cadeias de Caracteres Uma seqüência de caracteres entre apóstrofes forma uma cadeia de caracteres Pode ser chamada também pelo nome em inglês: string Exemplos de cadeias 'Isto é um exemplo de cadeia' '?' 'Seu nome é Joana D''Arc' Comentários São frases colocadas por todo um programa com o objetivo de explicar ou clarear partes do código-fonte Eles vêm entre chaves { e }, ou, às vezes, (* e *). Ainda existe // Comentários são completamente ignorados pelos compiladores Sua função é apenas aumentar a clareza e documentar um programa Estrutura Básica de um Programa em Pascal program identificador; parte_das_declarações begin parte_dos_comandos end. Variáveis Variável de programa é uma abstração para célula de memória Portanto uma variável armazena um valor ou estado Declaração de Variáveis Em Pascal, toda variável para ser usada em um programa tem que ser declarada antes As variáveis de um programa são declaradas na parte de declarações Declarar uma variável significa instruir o computador a reservar espaço na memória o qual passará a ser referenciado pelo nome da variável apresentado na declaração Declaração de Variáveis Além disso, na declaração, um tipo é associado à variável Ou seja, o tipo de uma variável determina quais valores podem ser armazenados pela variável Em Pascal, desde o momento em que uma variável é criada, seu tipo não pode ser modificado mais posteriormente Dizemos assim que a linguagem é estaticamente tipada Declaração de Variáveis Sintaxe var lista_de_variáveis : tipo; lista_de_variáveis : tipo; ... lista_de_variáveis : tipo; Declaração de Variável Exemplos var x : integer; a, b : char; area, perimetro : real; temTelefone : boolean; Criação de Variáveis A partir do momento em que uma variável é criada, ela já possui um valor Este valor inicial conhecido pode ser modificado durante a execução do programa Destruição de Variáveis Uma variável deixa de existir quando o bloco de programa ou de subprograma em que ela foi criada termina de ser executado Ao ser executado o último comando de um programa, toda a memória que foi alocada para o nosso programa é liberada para o sistema operacional e assim as variáveis do programa são destruídas Comandos Os comandos têm a função essencial de manipular e alterar o estado armazenado nas variáveis Existem vários comandos em Pascal, porém o mais fundamental de todos é o comando de atribuição O comando de atribuição modifica explicitamente o valor que uma variável armazena Comando de Atribuição Sintaxe variável := expressão Semântica A expressão que aparece do lado direito do operador de atribuição,:=, é avaliada. O valor resultante da avaliação é então atribuído à variável que aparece do lado esquerdo Isto é, o valor atual da variável é reposto pelo novo valor resultante da avaliação da expressão Comando de Atribuição O comando de atribuição destrói o valor corrente armazenado na variável—obviamente, ele não destrói a variável O valor da expressão passa a ser o novo valor armazenado na variável Exemplos a a j p c := := := := := 3.52 b*b*b j + 1; (j > 0) or (c <> ' ') '.' Entrada e Saída Simples de Dados Dentre os comandos simples da linguagem, podemos considerar os de entrada e saída de dados Na realidade, em Pascal, a entrada e a saída são realizadas por meio de chamadas de procedimentos padrões Por detrás, esses procedimentos de entrada/saída utilizam estruturas de arquivo para realizar as operações Entrada de Dados Toda informação que quisermos passar para o computador é realizada por meio dos procedimentos: read readln Sintaxe read( lista_de_variáveis ) Procedimento read Exemplos read( read( read( read( a ) alfa, beta, gama ) input, a ) input, alfa, beta, gama ) A chamada read( v1, v2, v3, ..., vn ) é equivalente a read( v1 ); read( v2 ); read( v3 ); ...; read( vn ) Saída de Dados Qualquer informação produzida por um computador fica conhecida por nós somente se for realizada alguma operação de saída Em Pascal, podemos realizar uma saída de dados por meio dos procedimentos padrões: write writeln Procedimento write Exemplos write( write( write( write( write( a, b, c 2*x + 7 output, output, 'a = ', + 1 ) ) a, b, c + 1 ) 2*x + 7 ) x*x - 2*x - 5 ) Saída Formatada A linguagem Pascal permite uma capacidade limitada de formatação do texto de saída por meio dos procedimentos write ou writeln A cada valor de saída podemos acrescentar até dois sufixos separados pelo símbolo especial dois-pontos Sintaxe valor_de_saída : largura_do_campo : comprimento_da_fração Saída Formatada Exemplo Suponha que a variável a seja do tipo real e contenha o valor -0.357000000E+02 Comando Saída write( a ) -0.357000000E+02 write( a:10 ) -0.357E+02 write( a:5:1 ) -35.7 write( 'a = ', a:5:1 ) a = -35.7 Projeto de Programação Problema Queremos calcular a área e o perímetro de um círculo dado seu raio Análise do problema O cálculo da área e do perímetro de um círculo já foi bem estudado pela geometria, desde a época dos gregos antigos Descobriu-se que estes cálculos envolviam o número irracional Projeto de Programação Análise (cont.) Dado o comprimento do raio r de um círculo, temos que sua área A e seu perímetro P são dados pelas fórmulas: Ar , 2 P 2 r Projeto de Programação Algoritmo Dados 1. 2. 3. 4. raio do tipo real área do tipo real perímetro do tipo real Leia o raio do círculo Calcule a área Calcule o perímetro Imprima a área e o perímetro Implementação 1 program Circulo; 2 { Calcula a área e o perímetro de um círculo dado o raio. } 3 const 4 PI = 3.141592653589793; Definição de constante 5 var 6 raio, area, perimetro : real; 7 begin 8 writeln( 'Entre com o raio do círculo:' ); 9 readln( raio ); 10 11 area := PI * sqr( raio ); 12 perimetro := 2.0 * PI * raio; Saídas com a formatação default para números reais 13 14 writeln( 'A área do círculo é: ', area ); 15 writeln( 'O perímetro é: 16 end. ', perimetro ); Testes ____________________________________________ Entre com o raio do círculo: 2 A área do círculo é: 1.256637061435917E+001 O perímetro é: 1.256637061435917E+001 ____________________________________________ Entre com o raio do círculo: 3 A área do círculo é: 2.827433388230814E+001 O perímetro é: 1.884955592153876E+001 Comandos Estruturados Os comandos estruturados contêm outros comandos em sua constituição Eles estabelecem o fluxo de execução dos comandos simples de um programa O poder de um computador reside na sua capacidade de executar ações seqüenciais, repetitivas e seletivas a grande velocidade e confiabilidade Comandos Estruturados Pascal fornece várias estruturas de controle: Comandos compostos Comandos repetitivos Comandos condicionais Comando Composto Sintaxe begin C1; C2; ... Cn end Cada Ci é um comando qualquer Comando Composto Semântica A execução do comando composto envolve a execução de seus comandos componentes Ci na ordem em que são escritos Exemplo begin a := b; b := c; c := a end Comando Composto Semântica (fluxograma) C1 C2 C3 Comandos Compostos Uso de ponto-e-vírgula em comandos Em Pascal, o símbolo especial ; é usado na parte de comandos para separar um comando do outro O ponto-e-vírgula não é parte integrante de nenhum comando Observe que o último comando de qualquer comando composto não tem ponto-e-vírgula Porém, se o programador colocar um ponto-e-vírgula após o último comando, não causará nenhum erro de sintaxe, porque existe o conceito de comando vazio em Pascal Comandos Condicionais É muito comum tornar a execução de um comando dependente de alguma condição Pascal fornece duas formas de comandos com este propósito: Comandos if Comandos case Por enquanto, vamos estudar apenas os comandos if Comandos if Sintaxe Forma simples if condição then comando Forma completa if condição then comando else comando Comando if Simples Semântica (fluxograma) Vamos considerar primeiro a forma simples: if B then C onde B é uma expressão lógica e C é um comando qualquer F B V C Exemplos 1) if c = '?' then pergunta := true 2) if i > 0 then begin t := x; x := y; y := t end Comando if Completo Semântica (fluxograma) A forma completa do if: if B then C1 else C2 onde B é uma expressão lógica e C1 e C2 são comandos V C1 B F C2 Exemplo if sqr(b) < 4*a*c then write('A equação tem raízes complexas') else begin d := sqrt(sqr(b) - 4*a*c); x1 := (-b + d)/(2*a); x2 := (-b - d)/(2*a) end Projeto de Programação Problema Eufrásia fez três provas para avaliação do seu rendimento na disciplina de Semiótica. Ela gostaria de saber se foi aprovada, baseando-se no seguinte critério: se a média das três notas for maior ou igual a 60, foi aprovada; caso contrário, foi reprovada. Faça um programa em Pascal para ajudar Eufrásia a determinar sua aprovação ou reprovação por meio do uso de computador. Projeto de Programação Análise do problema A determinação da média de três números é trivial: basta somá-los e depois dividir a soma por 3 Tendo a média, podemos determinar a aprovação ou reprovação pelo seguinte teste: Se a média for maior ou igual a 60, então aprovação Senão reprovação Projeto de Programação Algoritmo da solução Dados 1. 2. 3. 4. nota1, nota2, nota3, média : real Leia as três notas Calcule a soma das três notas Calcule a média Se média ≥ 60, então imprima 'Aprovado(a)' senão imprima 'Reprovado(a)' Implementação em Pascal 1 program Avaliacao( input, output ); 2 { Determina a aprovação de um aluno em uma disciplina, baseado na 3 4 média de três notas de provas. } var 5 nota1, nota2, nota3 : real; 6 media : real; 7 begin 8 writeln( 'Digite as três notas das provas:' ); 9 readln( nota1, nota2, nota3 ); 10 11 media := (nota1 + nota2 + nota3) / 3.0; Comando if completo 12 13 write ('Sua média foi ', media:5:1 ); 14 if media >= 60.0 then writeln( ' ===> Aprovado(a)' ) 15 else writeln( ' ===> Reprovado(a)' ) 16 end. Teste do Programa _____________________________________ Digite as três notas das provas: 50 50 50 Sua média foi 50.0 ===> Reprovado(a) _____________________________________ Digite as três notas das provas: 64 75 43 Sua média foi 60.7 ===> Aprovado(a) Comandos if Aninhados Testes com casos múltiplos são implementados com comandos if dentro de outros comandos if: if condição then comando else if condição then comando else ... Nova Implementação O programa do cálculo da média e teste de aprovação feito a pedido de Eufrásia pode ser melhorado No caso de reprovação, Eufrásia gostaria de que fosse feita uma recomendação ao usuário A nova implementação vem a seguir 1 program Avaliacao( input, output ); 2 { Determina a aprovação de um aluno em uma disciplina, baseado na 3 4 média de três notas de provas. } var 5 nota1, nota2, nota3 : real; 6 media : real; 7 begin 8 writeln( 'Digite as três notas das provas:' ); 9 readln( nota1, nota2, nota3 ); 10 11 media := (nota1 + nota2 + nota3) / 3.0; 12 Observe que, para colocar mais de um comando dentro das alternativas de um if, é necessário criar um comando composto delimitado por begin-end 13 write ('Sua média foi ', media:5:1 ); 14 if media >= 60.0 then writeln( ' ===> Aprovado(a)' ) 15 else 16 begin 17 writeln( ' ===> Reprovado(a)' ); 18 writeln( 'Você deve fazer a disciplina novamente!' ) 19 20 end end. Teste do Programa ________________________________________ Digite as três notas das provas: 64 75 43 Sua média foi 60.7 ===> Aprovado(a) ______________________________________________ Digite as três notas das provas: 50 50 50 Sua média foi 50.0 ===> Reprovado(a) Você deve fazer a disciplina novamente! Projeto de Programação Eufrásia gostou tanto do programa feito pelos alunos que até pediu uma nova versão, agora para calcular também o conceito recebido, de acordo com a média final Sua universidade usa o seguinte critério para atribuição de conceitos: Notas entre 90 (inclusive) e 100, conceito A; notas entre 80 (inclusive) e 90, conceito B; notas entre 70 (inclusive) e 80, conceito C; notas entre 60 (inclusive) e 70, conceito D; e notas menores que 60, conceito R Projeto de Programação Algoritmo Dados nota1, nota2, nota3, média : real conceito : caracter 1. 2. 3. Leia as notas Calcule a média Se média ≥ 90 então conceito 'A' senão se média ≥ 80 então conceito 'B' senão se média ≥ 70 então conceito 'C' senão se média ≥ 60 então conceito 'D' senão conceito 'R' 1 program Avaliacao( input, output ); 2 { Calcula a média de três notas e atribui conceitos de acordo com a média.} 3 var 4 nota1, nota2, nota3, media : real; 5 conceito : char; 6 begin 7 writeln( 'Digite suas três notas:' ); 8 readln( nota1, nota2, nota3 ); 9 10 media := (nota1 + nota2 + nota3) / 3.0; 11 12 write( 'Sua média foi ', media:5:1 ); 13 14 if media >= 90.0 then conceito := 'A' 15 else if media >= 80.0 then conceito := 'B' 16 else if media >= 70.0 then conceito := 'C' 17 else if media >= 60.0 then conceito := 'D' 18 else conceito := 'R'; 19 writeln( ' ===> Conceito ', conceito ) 20 end. Comandos if aninhados Teste do Programa _____________________________________ Digite suas três notas: 64 75 43 Sua média foi 60.7 ===> Conceito D _____________________________________ Digite suas três notas: 50 50 50 Sua média foi 50.0 ===> Conceito R Para Casa Eufrásia que melhorar o programa. Como funcionalidade adicional ela quer saber a sua menor nota e qual foi (primeira, segunda ou terceira). Além disto, caso tenha sido reprovada, ela quer saber o quanto faltou na média para ela passar... Se a diferença for até 5 pontos, ela quer ser notificada para pedir revisão de prova.