Você está na página 1de 25

Escola Superior de Tecnologia

TRANSIO PARA

C++

Para programadores de Pascal

Jos Cordeiro e Joaquim Filipe 1998

ESCOLA SUPERIOR DE TECNOLOGIA / INSTITUTO POLITCNICO DE SETBAL

Transio para C++


Para programadores de Pascal

Dezembro 1998 Jos Cordeiro e Joaquim Filipe Escola Superior de Tecnologia / Instituto Politcnico de Setbal R do Vale de Chaves, Estefanilha 2910 Setbal Telefone (065) 790000 Fax (065) 721869 j.cordeiro@computer.org jfilipe@est.ips.pt

ndice
NDICE INTRODUO ALGUMAS DIFERENAS FUNDAMENTAIS ENTRE O PASCAL E O C++ ESTRUTURA DO PROGRAMA Blocos Comentrios Funes TIPOS DE DADOS ELEMENTARES VARIVEIS Definio Inicializao Variveis globais Existncia e visibilidade CONSTANTES OPERADORES E EXPRESSES Operadores aritmticos Operadores relacionais Operadores Lgicos Atribuio Precedncias Funes associadas aos tipos de dados elementares Expresses Converso entre tipos de dados elementares Operador de coero (cast) ENTRADA E SADA DE DADOS Entrada de Dados Sada de Dados Simples Sada de Dados Formatada ESTRUTURAS DE CONTROLO - SELECO Instruo If Instruo Switch ESTRUTURAS DE CONTROLO - REPETIO Instruo for Instruo while Instruo do-while SUBPROGRAMAS Funes e Procedimentos Transmisso de Parmetros Retorno de Valores (funes) Prottipos de Funes TIPOS DE DADOS AVANADOS Tipo enumerativo Matrizes Cadeias de caracteres Registos Ficheiros Tipos de dados definidos pelo utilizador ESTRUTURAS DE DADOS DINMICAS Listas 3 4 4 5 5 5 5 6 7 7 7 7 7 8 9 9 9 9 9 10 11 11 11 12 13 13 13 14 14 14 15 16 16 16 17 17 17 17 18 19 19 19 19 20 21 22 22 23 23

Introduo

! 1

A linguagem C++ surge como uma extenso linguagem C trazendo consigo dois importantes conjuntos de novidades:
1. 2.

Melhorias e acrescentos linguagem C Possibilidade de programao orientada por objectos

Este segundo conjunto de novidades no ser tido em conta neste manual. Este manual pretende ilustrar, de uma forma prtica e simples, a passagem da linguagem Pascal para a linguagem C++. Neste sentido apenas se referem as caractersticas existentes na linguagem Pascal que tm correspondncia na linguagem C++. Para uma transio completa seria ainda necessrio analisar as caractersticas do C++ que funcionam como uma extenso ao Pascal e as novas possibilidades de programao orientada por objectos. A transio para C++ a partir do Pascal feita directamente no se fazendo nenhuma referncia linguagem C nem sendo necessrio o conhecimento desta. Isto deve-se, principalmente, a esta forma de transio ser mais simples e prefervel.

Algumas Diferenas Fundamentais entre o Pascal e o C++


Do ponto de vista da transio do Pascal para o C++ estas linguagens podem ser consideradas muito semelhantes sendo as suas diferenas principalmente de sintaxe. Para uma melhor compreenso convm, no entanto, referir algumas diferenas bsicas de sintaxe e estrutura que se consideram fundamentais:
E M C + +

Aa Maisculas diferenciadas

; O Sinal ; termina instrues

Enquanto em Pascal indiferente a utilizao de maisculas e minsculas, em C++ existe essa distino, sendo todas as palavras reservadas desta linguagem escritas em letras minsculas. O ponto-e-vrgula em Pascal utilizado para separar instrues. Em C++ esse caracter utilizado para terminar instrues. Enquanto em Pascal os subprogramas podem ser de dois tipos: funes e procedimentos, em C++ apenas existem funes. Contudo, existe em C++ o tipo void (vazio), pelo que possvel obter, em C++, o mesmo efeito dos procedimentos do Pascal, utilizando funes que retornam void. Os subprogramas em C++ (as funes) esto todos ao mesmo nvel, no se podendo colocar uns dentro de outros como acontece em Pascal.

f() Subprogramas s funes f() Funes ao mesmo nvel

Estrutura do Programa
Blocos

Em Pascal, o conceito de bloco essencial. Sintacticamente, o programa constitudo por um cabealho, um bloco e um ponto final. O bloco contm, por sua vez, diversas zonas incluindo, em particular, todas as funes e procedimentos utilizados pelo programa, bem como o corpo (zona de instrues) do programa principal.

Em C++ no existe o conceito de bloco. O programa principal apenas mais uma funo, ainda que com um nome especial: main. Esta funo a primeira a ser executada. Todas as outras funes definem-se ao mesmo nvel desta funo principal.
Blocos de instrues
definidos entre os smbolos {e}

Em Pascal todas as instrues encontram-se agrupadas dentro de uma outra forma de bloco: o bloco de instrues. Este bloco delimitado pelas palavras begin e end.. Tal como acontece em Pascal em C++ esta forma de bloco existe utilizando-se neste caso como caracteres delimitadores as chavetas. Este tipo de bloco pode tambm ser utilizado sempre que se precise de colocar mais que uma instruo num local onde a sintaxe da linguagem obrigue utilizao de apenas uma instruo (Ex.: nos ciclos for) e denomina-se neste caso de instruo composta. Pascal
Begin <instruo>; <instrues> end

C++
{ <instruo>; <instrues>; }

FIGURA 1 Bloco de instrues ou instruo composta

Comentrios

Comentrios

comeados pela sequncia de smbolos // e vlidos apenas na linha corrente

Os comentrios colocados dentro de um programa em C++ so introduzidos de forma diferente: so comeados pela sequncia // e levam o compilador a ignorar tudo o que aparea a seguir dentro da mesma linha. Existe tambm a possibilidade de utilizar comentrios muito semelhantes aos usados em Pascal em que as chavetas que delimitam os comentrios (Ex.: {comentrio...}) so substitudas em C++ pela sequncia de smbolos /* e */ (Ex.: /*comentrio...*/). No entanto, esta segunda forma de comentar desaconselhada por ser mais difcil de gerir e poder originar erros de programao.
Funes

Funes

com declarao obrigatria.

Todas as funes em C++ necessitam de ser declaradas antes de serem utilizadas para que o compilador reconhea o seu formato, algo semelhante utilizao da declarao forward em Pascal.

Enquanto em Pascal as funes standard da linguagem so automaticamente reconhecidas, em C++ necessrio fornecer a sua declarao. Isto feito habitualmente atravs de uma linha de cdigo colocada no incio do programa. Esta linha leva o programa de compilao a incluir no programa o texto de um ficheiro contendo a declarao das funes utilizadas (e.g. #include <iostream.h> para incluir o ficheiro iostream.h com as principais funes de entrada e sada do C++). Na figura seguinte d-se um exemplo de um programa completo escrito em Pascal e em C++ para permitir a comparao da estrutura do programa nas duas linguagens.
Pascal C++ #include <iostream.h> // funo factorial: int fact(int i) { if (i <= 1) return 1; else return i*fact(i-1); } // corpo da funo principal main() { int n; cout << "Escreva um nmero "; cin >> n; cout << "Factorial de n = " << fact(n); }

PROGRAM exemplo (input, output); VAR N : integer; { funo factorial: } FUNCTION fact(i : integer) : integer; BEGIN if i<=1 then fact:=1 else fact:=n*fact(i-1) END; { corpo do programa principal } BEGIN Write('Escreva um nmero'); Read(n) Write('Factorial de n = ', fact(n)) END.

LISTAGEM 1 programa para calcular o factorial de um nmero.

Tipos de Dados Elementares


Entre os tipos de dados bsicos do Pascal iremos considerar os tipos caracter, inteiro, real e lgico.
caracter e inteiro idnticos. Tipo lgico implementado atravs de inteiros. Tipo real dividido em dois tipos: float e double.

Tipos de dados

Os tipos de dados caracter e inteiro so semelhantes nas linguagens Pascal e C++. O tipo real aparece em C++ sub-divido em dois tipos: float e double. Estes tipos so idnticos permitindo guardar um valor real, a sua nica diferena a preciso, tendo o tipo double uma preciso dupla em relao ao tipo float. Deve-se acrescentar que prefervel usar o tipo double por questes de compatibilidade com as funes matemticas do C++. O tipo lgico no suportado directamente pelo C++, em vez disso utiliza-se o valor inteiro 0 para representar o valor falso e um valor inteiro diferente de 0 (normalmente o 1 ou o 1) para representar o valor lgico verdadeiro.

Y 1
Variveis definidas em
qualquer stio do cdigo com possbilidade de inicializao simultnea

Na tabela 2 apresenta-se uma correspondncia entre os tipos de dados elementares de ambas as linguagens: Pascal
Char Integer Real Boolean

C++
char int float/double int

TABELA 1 Correspondncia entre tipos de dados elementares

Variveis
As variveis em C++ no possuem uma zona prpria de definio como em Pascal podendo ser criadas em qualquer stio do cdigo. Como princpio devem-se definir as variveis o mais perto possvel do local em que so utilizadas. A definio das variveis faz-se colocando primeiro o tipo da varivel e a seguir o seu nome, terminando-se com o caracter ponto-e-vrgula:
<varivel> <tipo> <nome>;
Definio

Tal como em Pascal possvel definir simultaneamente mais que uma varivel do mesmo tipo desde que se separem os seus nomes por vrgulas.
Inicializao

Em C++ possvel ainda inicializar uma varivel na altura da sua definio. Isto feito colocando aps o nome de cada varivel o sinal de igual seguido do seu valor inicial (Ex.: int valor = 10; ).
Variveis globais definidas fora do corpo das funes.

Variveis globais

As variveis que pertencem ao programa principal em Pascal consideram-se globais e podem ser reconhecidas em qualquer parte do programa. Uma vez que em C++ as funes esto ao mesmo nvel, as variveis da funo principal (main) so locais a esta no podendo ser referidas a partir de outras funes. Para que uma varivel seja global em C++ esta deve ser declarada fora do corpo das funes. Deve-se, contudo, evitar o uso das variveis globais.
Existncia e visibilidade

As variveis locais em C++, tal como em Pascal, s existem e so visveis dentro do bloco (conjunto de cdigo delimitado por chavetas) em que esto declaradas. De notar ainda que as variveis em C++ s so reconhecidas dentro dum bloco a partir do ponto em que foram declaradas.

Pascal PROGRAM converso (input, output); CONST Polegadas = 2.54; VAR Comprimento : real; {varivel global} Resultado : real; {varivel global} BEGIN Write('Valor em polegadas: '); Read( comprimento ); Resultado := comprimento*polegadas; Write('Em centmetros = ',resultado); END.

C++ #include <iostream.h> const double polegadas = 2.54; double comprimento; // varivel global main() { cout << "Valor em polegadas: "; cin >> comprimento; double resultado; // varivel local resultado = comprimento*polegadas; cout << "Em centmetros " << resultado; }

LISTAGEM 2 Definio de variveis e constantes

Constantes
possvel em Pascal e em C++ utilizar dois tipos de constantes: As constantes definidas pelo utilizador associadas a um identificador e os valores constantes. Na tabela 3 apresentam-se exemplos de alguns valores constantes nas duas linguagens. Pascal
-3.02 0.15E-2 23 $FF40 False a algum texto

C++
-3.02 0.15E-2 23 0xFF40 0 a algum texto

TABELA 2 Correspondncia entre valores constantes


Constantes definidas
como variveis utilizando o modificador const

Para definir constantes atravs de um identificador em Pascal utiliza-se a zona de definio de constantes referenciada pela palavra CONST. Em C++ as constantes definem-se nos mesmos locais e da mesma forma que as variveis acrescentando-se antes do tipo a palavra reservada const. Habitualmente as constantes definem-se no inicio do programa.
Pascal C++ const const const const char *nome = Jos; double PI = 3.14159; int Diasdasemana = 7; char Escudo = $;

CONST nome = Jos; PI = 3.14159; Diasdasemana = 7; Escudo = $;

LISTAGEM 3 Definio de constantes

Operadores e Expresses
Operadores
semelhantes aos do Pascal utilizando por vezes smbolos diferentes

Os operadores aritmticos aplicados aos valores reais so os mesmos em ambas as linguagens. No que diz respeito sua aplicao a valores inteiros enquanto em Pascal se usam as palavras reservadas DIV e MOD para as operaes de diviso e resto em C++ usam-se os smbolos / e %. As operaes realizadas so equivalentes.
Operadores relacionais

Operadores aritmticos

Apenas as operaes de verificao de igualdade e diferena adoptam smbolos diferentes nas duas linguagens, sendo utilizado em C++ o conjunto de smbolos == para a igualdade e o conjunto != para a diferena.
Operadores Lgicos

Embora as operaes lgicas em ambas as linguagens sejam semelhantes os smbolos adoptados so bastante diferentes. Em C++ usam-se os smbolos && para a operao lgica e, || para a operao ou e ! para a negao. No existe equivalente em C++ para a operao lgica ou exclusivo do Pascal.
Atribuio uma
operao em C++ que devolve o valor que foi atribudo

Atribuir um valor a uma varivel uma operao em C++ que devolve como resultado o valor atribudo. O smbolo adoptado o sinal de igual =. Em Pascal a atribuio por seu lado uma instruo nica que usa o smbolo :=. necessrio tomar cuidado com o facto de que o smbolo de comparao entre dois valores em Pascal ser o mesmo que o de atribuio em C++ o que pode levar a que este seja usado erradamente numa operao de comparao como por exemplo: if(x=5) em vez de if(x==5) ). Este caso perfeitamente vlido em C++, significa que o valor 5 atribudo varivel x devolvendo 5 como resultado da operao de atribuio. Uma vez que este valor diferente de 0 a condio do if verdadeira e o cdigo do if sempre executado.
Pascal C++ { int n; // Atribuio de um valor a uma varivel n = 10; // Comparao de dois valores if ( n == 10 ) cout << Os valores so iguais; }

Atribuio

VAR N:Integer; BEGIN { Atribuio de um valor a uma varivel } N := 10; { Comparao de dois valores } IF N = 10 THEN Write( Os valores so iguais ); END.

LISTAGEM 4 Comparao versus atribuio

A tabela seguinte sumariza as equivalncia de operadores: Pascal


+ * / e DIV MOD

C++
+ * / %

< <= > >= = <>

< <= > >= == !=

not and or

! && ||

TABELA 3 Correspondncia de operadores.


Precedncias

Precedncias com
regras diferentes

As regras de precedncia entre operadores so diferentes em Pascal e C++. Sempre que surjam dvidas devem-se utilizar os parnteses. A tabela 4 apresenta um resumo das regras de precedncia numa e noutra linguagem. Pascal
not * / div mod and + - or < <= > >= <> =

C++
! * / % + < <= > >=

== != && || =

TABELA 4 Precedncia de operadores.

10

Funes bsicas
associadas aos tipos de dados elementares com equivalentes em C++

Existe um conjunto de funes pr-definidas no Pascal associadas aos tipos bsicos. Na tabela 5 apresentam-se as funes do Pascal que se aplicam aos tipos bsicos e produzem resultados do mesmo tipo. Note-se que em C++ necessrio fornecer a declarao das funes antes de serem usadas. Isto conseguido incluindo o ficheiro de extenso .h onde se encontra a declarao (Ex.: para a funo fabs deve-se colocar no ficheiro uma linha com #include <math.h> para fornecer a declarao da funo). Pascal
Tipo base Funo Abs inteiro Sqr Abs Sqr Sqrt Real Sin Cos Arctan Ln Exp Pred Caracter Succ sqrt sin cos atan log exp math.h math.h math.h math.h math.h math.h fabs stdlib.h ou math.h Funo abs

Funes associadas aos tipos de dados elementares

C++
Declarao em : stdlib.h ou math.h

TABELA 5 Correspondncia de funes aplicadas aos tipos bsicos.


Expresses

Expresses definidas
com base apenas nos tipos reais e inteiro

Enquanto em Pascal as operaes e as expresses podem ser de qualquer um dos tipos elementares mencionados, em C++ as expresses s podem ser do tipo inteiro ou do tipo real (float ou double). Isto significa na prtica que todas as expresses lgicas e do tipo caracter so efectuadas a partir do tipo inteiro. Os caracteres em expresses envolvendo este tipo so convertidos para o seu valor em cdigo ASCII, sendo este o valor usado nas expresses. O valor lgico tambm utilizado como um inteiro, sendo 0 para o valor falso e qualquer outro valor (diferente de zero) para o valor lgico verdadeiro.
Converso entre tipos de dados elementares

Existem alguns casos em que possvel misturar diferentes tipos de dados numa expresso. Por exemplo quando se utilizam operadores relacionais, embora o tipo de dados dos operandos tenha de ser idntico o resultado

11

sempre do tipo lgico. Em Pascal tambm possvel misturar o tipo inteiro com o tipo real numa expresso atravs da converso automtica do inteiro num real obtendo-se como resultado um valor real. Outra forma de se misturar tipos de dados diferentes utilizar funes que operam sobre um dado tipo de dados e produzem como resultado um tipo diferente.
utiliza o operador de coero (cast)

Converso de tipos

Na tabela seguinte apresentam-se as funes que, em Pascal, operam sobre um tipo de dados e produzem um tipo diferente como resultado. Estas funes permitem obter a converso entre tipos de dados. Em C++ existe correspondncia para apenas uma destas funes. Nesta linguagem a converso normal de tipos realizada duma forma automtica pelo compilador ou utilizando um operador especial o operador de coero. Pascal
Funo Trunc Round Ord Chr Odd Converso Real Inteiro Real Inteiro Caracter Inteiro Inteiro Caracter Inteiro Lgico Funo Floor (*)

C++
Declarao em : math.h

TABELA 6 Correspondncia de funes aplicadas aos tipos bsicos. usadas na converso de tipos.
* Esta funo devolve um valor do tipo double que possui parte decimal nula

>

possvel, de uma maneira geral, utilizar tipos diferentes em operaes em C++. Se for necessrio o compilador converte automaticamente um dos tipos (por exemplo uma operao envolvendo inteiros e reais (float ou double) os inteiros so convertidos em reais antes da operao). Quando a converso resultar em perca de informao ou for duvidosa o compilador gera uma mensagem de aviso. Para eliminar a mensagem, e de uma certa forma informar o compilador que a converso vlida e pretendida, o programador deve realizar uma operao de coero sobre o tipo que pretende converter. A operao de coero permite a converso explicita entre tipos de dados diferentes. Esta operao obtem-se colocando o tipo, para o qual se quer converter um valor ou expresso, seguido entre parnteses do valor ou expresso a converter. (Ex.: 2 + 4 * int(2.3) produz o resultado inteiro 10). Esta forma de coero possui uma notao funcional, ou seja como se fosse uma funo: o nome da funo dado pelo tipo de dados e o valor entre parnteses o argumento. Existe, no entanto uma outra notao para a coero, herdada da linguagem C, que consiste em colocar o tipo para o qual se quer converter entre parnteses antes do valor. (Ex.: 2 + 4 * (int) 2.3 ).

Operador de coero (cast)

12

Pascal VAR Ch:Character; I:Integer; Val:Real; BEGIN Ch := a; I := ord(Ch); Writeln( Ascii de: , ch, , I ); Writeln( Ascii: , i, , chr(I) ); Val := 3.124; Write( Real: , val ); Writeln( para inteiro: , trunc(val) ); END. { char ch; int i;

C++

ch = a; i = int( ch ); // i=ch; era suficiente por // converso automtica cout cout cout cout << << << << Ascii de: << ch << : << i; endl; Ascii: << i << : << char(i); endl;

val = 3.124; cout << Real: << val; cout << para inteiro: << int(val); // ou ento int(floor(val)) cout << endl; }

LISTAGEM 5 Converso de tipos e operao de coero

Entrada e Sada de Dados


A entrada e sada de dados mais comum utiliza respectivamente o teclado e o monitor. Os ficheiros sero abordados mais frente.
Entrada de dados

feita atravs do operador de extraco e da varivel cin

As instrues read e readln do Pascal so substitudas, em C++, por uma nica instruo: cin, que se comporta como o read. Enquanto a lista de parmetros de read apresentada entre parnteses encontrando-se os parmetros separados por vrgulas, a instruo cin encontra-se separada dos parmetros pelo operador de extraco >> utilizando-se o mesmo operador para separar os parmetros entre si.
Sada de Dados Simples

Entrada de Dados

Sada de dados

feita atravs do operador de insero e da varivel cout

As instrues write e writeln, do Pascal, so substitudas, em C++, por uma nica instruo: cout, que equivalente ao write. Tal como acontece com a instruo de entrada de dados, cin, tambm o cout utiliza um operador , neste caso o operador de insero << para separar os parmetros do comando e para separar os parmetros entre si. Podem ainda ser utilizados caracteres especiais como o tab(\t) e o
newline(\n).
Pascal C++ main() { int a; float b; char c; cin >> a >> b >> c; cout << "Valores lidos: " << a << b << c;

program exemplo(input,output); var a : integer; b : real; c : char; begin read(a, b, c); writeln('Valores lidos: ', a, b, c); end. LISTAGEM 6 Instrues de entrada e sada de dados

13

Formatao da sada

de dados utiliza manipuladores

Em Pascal possvel definir na instruo write o nmero mnimo de caracteres com que um parmetro deve aparecer escrito. Isto conseguido colocando a seguir ao parmetro um sinal de dois pontos seguido de um valor inteiro com o nmero de caracteres de escrita. Para o caso de nmeros reais ainda possvel definir o nmero de casas decimais juntando mais um sinal de dois pontos e o total de casa decimais (Ex.: escrita de um real com 6 caracteres e duas casas decimais Write( valor:6:2 );). Em C++ o mesmo efeito conseguido atravs de manipuladores que se incluem antes dos parmetros a serem escritos. O manipulador setw permite definir em C++ o nmero mnimo de caracteres de escrita e o manipulador setprecision o nmero de casas decimais. Estes manipuladores possuem uma sintaxe semelhante s funes levando um argumento com o valor numrico (ver exemplo na listagem 7). Existe ainda o manipulador endl que se utiliza para mudar de linha.
Pascal C++ { int n; double r; n = -10; r = 23.126; cout << Valor inteiro - << setw(5) << n; cout << endl; cout << Valor real << setw(8) << setprecision(2) << r << endl; cout << setw(5) << Fim << ------ << endl; } // OUTPUT: // Valor inteiro -10 // Valor real 23.12 // Fim------

Sada de Dados Formatada

VAR N:Integer; R: Real; BEGIN N := -10; R := 23.126 Write( Valor inteiro , N:5 ); Writeln; Writeln ( Valor real , R:8:2 ); Writeln(FIM:5, ------) END. { OUTPUT: { Valor inteiro -10 { Valor real 23.12 { Fim-----} } } }

LISTAGEM 7 Sada de dados formatada


NOTA

Quando se utilizam manipuladores em C++ deve-se incluir o ficheiro iomanip.h no incio do programa, ou seja acrescentar a linha: #include <iomanip.h>.

Estruturas de Controlo - Seleco


Em Pascal existem duas instrues de seleco: if e case. As instrues correspondentes em C++ so: if e switch.
Instruo if com
condio lgica entre parnteses e sem then

A instruo if do C++ requer que a condio lgica esteja entre parnteses, isto deve-se ao facto de no ser utilizada a palavra then que funciona como marcador do fim da condio em Pascal.

Instruo If

14

A sintaxe a seguinte:
<instruo if> if ( <condio> ) <instruo1>; [ else <instruo2>; ]
Pascal if x=y then a:=1 else a:=2; if (x==y) a=1; else a=2; C++

LISTAGEM 8

Instruo if

Instruo switch
substitui case do Pascal

A instruo case do Pascal possui como equivalente em C++ a instruo switch. O argumento desta instruo em C++ deve ser fornecido entre

Instruo Switch

parnteses, e deve ser de um tipo inteiro ou compatvel (tipos caracter ou enumerativo). Tambm as diferentes possibilidades de seleco so precedidas em C++ pela palavra reservada case podendo apenas existir um valor de cada hiptese. Ainda outra diferena que se for necessrio fornecer mais que uma instruo em C++ no necessrio colocar as chavetas para as agrupar. A sintaxe ento a seguinte:
<Inst. switch> switch (<expresso>) { case <const> : <instruo>; }
Pascal case mes of 1,3,5,7,8,10,12: ultimodia := 31; 4,6,9,11: ultimodia := 30; 2: if ano mod 4 = 0 then ultimodia := 29 else ultimodia := 28; otherwise: ultimodia := 0 end; C++ switch( mes ) { case 1: case 3: case 5: case 7: case 8: case 10: case 12: ultimodia = 31; break; case 4: case 6: case 9: case 11: ultimodia = 30; break; case 2: if ( ano%4 == 0 ) ultimodia = 29; else ultimodia = 28; break; default: ultimodia = 0; break; }

LISTAGEM 9 Instruo switch

15

NOTA

Para a correspondncia directa entre a instruo case do Pascal e a instruo switch do C++ deve-se acrescentar uma instruo break no final de cada case do C++.

Estruturas de Controlo - Repetio


As trs instrues de repetio do Pascal so: for, while e repeat. Em C++ as instrues correspondentes so: for, while e do.
Instruo for com
formato e funcionalidade diferentes em C++

A instruo for do C++ muito mais poderosa e verstil que a do Pascal.. Esta instruo possui entre parnteses uma lista de outras trs instrues fornecidas pelo programador. A primeira destas instrues corrida apenas uma vez quando se entra no for e utilizada normalmente para iniciar uma varivel de controlo. A segunda instruo fornece um valor lgico e corrida sempre que se inicia a passagem no ciclo, se o valor lgico for falso o ciclo j no executado passando-se instruo seguinte. A terceira e ltima instruo corrida sempre que se termina uma passagem pelo ciclo e utilizase normalmente para alterar o valor da varivel de controlo. A sintaxe da instruo for a seguinte:
<Inst. for> for(<instr1>;<instr2>;<instr3>) <instruo>;
Pascal C++ for (i=0; i<=10; i=i+1) { j=2*i+1 cout << "impar: " << j << endl; }

Instruo for

for i:=0 to 10 do begin j:=2*i+1; writeln('impar: , j) end;

LISTAGEM 10 Instruo for


Instruo while

Instruo while
com a condio entre parnteses e sem do

A instruo while idntica em C++ e Pascal, necessitando apenas em C++ que a condio esteja entre parnteses no sendo ento utilizada a palavra
do. A sintaxe ento a seguinte: <Inst. while> while (<condio>) <instruo>;

16

Pascal Fact := 1; N := 5; Termo := N; While termo > 1 do Begin Fact := fact * termo; Termo := termo 1; End Writeln(Factorial de , N, = , fact);

C++ fact = 1; n = 5; termo = n; while (termo > 1) { fact = fact * termo; termo = termo 1; } cout << Factorial de << n << = << fact << endl;

LISTAGEM 11 Instruo while


Instruo do-while
sustitui repeat-until do Pascal

A instruo correspondente ao repeat-until do Pascal a instruo do-while do C++. Esta instruo funciona de uma forma ligeiramente diferente, enquanto em Pascal o ciclo termina quando uma determinada condio verdadeira em C++ o ciclo termina quando a condio falsa, continuando enquanto essa condio for verdadeira. A condio aparece em C++ entre parnteses. A sintaxe desta instruo :
<Inst.do> do {<instruo>;} while (<expresso>);
Pascal C++ do { cout << "Em que numero pense?"; cin >> n; if (n==numero) cout << "Acertou!!" << endl; else if (n < numero) cout << "Baixo..." << endl; else cout << "Alto..." << endl; } while (n!=numero);

Instruo do-while

repeat write(Em que numero pensei?'); read(n); if n = numero then writeln('Acertou!!') else if n < numero then writeln('Baixo...') else writeln('Alto...') until n=numero;

LISTAGEM 12 Instruo do-while

Subprogramas
Conforme foi referido na seco inicial, o Pascal difere do C++ num aspecto fundamental: enquanto o Pascal dispe de dois tipos de subprogramas (funes e procedimentos) o C++ apenas tem um tipo: as funes. Para emular os procedimentos, em C++, pode recorrer-se a funes que retornam o tipo void, uma vez que este tipo significa vazio o mesmo que retornar vazio ou seja no retornar nada.
Transmisso de Parmetros Funes e Procedimentos

Tanto em Pascal como em C++ possvel passar parmetros por valor e por referncia.

17

Parmetros com

passagem por referncia so obtidos colocando & antes do nome da varivel

Para o Pascal a diferenciao do mtodo de transmisso de cada parmetro efectuada na definio da funo (indicao ou no da palavra reservada var) e no na sua invocao. Em C++ passa-se o mesmo utilizando-se na lista de parmetros da funo o operador & antes do nome de cada varivel a passar por referncia. De notar ainda que em C++ obrigatrio indicar nos parmetros de uma funo o tipo antes de todas as variveis, no se podendo referir um tipo para um grupo de variveis separadas por vrgula.
Pascal C++ #include <iostream.h> void troca(double &x, double &y) { double aux; aux = x; x = y; y = aux; } main() { double a, b; cout << "Escreva dois reais: "; cin >> a >> b; cout << a << b << " -- Aps troca:\n"; troca(a, b); cout << a << b; }

PROGRAAM transmiteRef (input, output); VAR a, b : real; PROCEDURE troca (var x, y : real); VAR aux : real; BEGIN Aux := x; x := y y := aux END; BEGIN Write(Escreva dois reais:); Readln(a, b); Writeln(a, b, -- Aps troca: ); Troca(a, b); Write(a, b) END.

LISTAGEM 13 Passagem de parmetros para funes.


Retorno de Valores (funes)

O tipo do valor que retornado por uma funo em C++ aparece como primeiro elemento antes do nome da funo, ao contrrio do Pascal em que este aparece a seguir ao smbolo : aps a lista de parmetros da funo.
feita a partir da instruo return que termina tambm a funo

Retorno de funes

O retorno de um valor, em Pascal, efectua-se por atribuio do mesmo a uma pseudo varivel com o mesmo nome que a funo. Em C++ a devoluo de um valor efectua-se atravs da instruo return <expresso>, a qual tambm termina imediatamente a execuo da funo devolvendo o resultado de <expresso>.

Pascal function fact (i : integer) : integer; begin if i<=1 then fact:=1 else fact:=i*fact(i-1) end;

C++ int fact (int i) { if (i<=1) return 1; else return i*fact(i-1); }

LISTAGEM 14 Retorno de funes

18

Prottipos de Funes

Um prottipo de uma funo uma declarao que, para alm do nome da funo, especifica os tipos de dados dos parmetros e do resultado devolvido. terminado pelo ponto-e-vrgula. O compilador de C++ utiliza o prottipo para verificar a validade sintctica das invocaes da funo. Esta declarao anloga declarao forward, do Pascal.

O prottipo das funo deve aparecer antes da chamada da funo. Normalmente, boa prtica colocar os prottipos das funes num ficheiro separado com o mesmo nome do ficheiro fonte mas com a extenso .h, o qual inserido no incio do ficheiro fonte utilizando a directiva #include. Por exemplo, se se definirem 10 funes, para alm da funo main, no ficheiro prog.c, deve construir-se um ficheiro designado prog.h, cujo contedo dever ser uma lista dos 10 cabealhos (headers) das funes definidas em prog.c, terminados por ponto-e-vrgula (;).

Tipos de Dados Avanados


O Pascal uma linguagem com uma tipificao muito rica possuindo uma grande quantidade de tipos de dados. Embora o C++ apresente grande parte dos tipos do Pascal alguns deles no tm correspondncia em C++ como o caso dos tipos sub-domnio e conjunto (set).
Tipo enumerativo

O tipo enumerativo encontra-se entre os tipos que existem igualmente em C++, possuindo no entanto uma sintaxe diferente nesta linguagem:
<tipo enum> enum <nome> {<ident1>, <ident2>, };
Matrizes

Matrizes apenas com

ndices inteiros que comeam obrigatoriamente no valor zero

As matrizes (arrays) permitem armazenar sequncias de elementos, todos do mesmo tipo, identificados por um ou mais nmeros de ordem (ndices). Uma importante diferena na definio e utilizao de matrizes que em C++ o ndice sempre um inteiro cujo valor inicial obrigatoriamente zero. Quando se declara uma matriz em C++ fornece-se o nmero total de elementos existentes, digamos n. De notar que este nmero nunca aparece como ndice da matriz uma vez que comeando no valor 0 os seus ndices variam entre 0 e n-1, sendo n o total de elementos da matriz. Uma caracterstica muito importante do C++ que a escrita e leitura de matrizes no testada pela linguagem, pelo que possvel escrever ou ler de um ndice que no exista. Quando isto acontece na operao de escrita pode ser desastroso uma vez que se estar a escrever na memria numa zona onde poder estar o cdigo ou dados do programa corrompendo-os. Nas listagens 15 e 16 apresentam-se exemplos com matrizes unidimensionais e bidimensionais.

19

Pascal Pascal program media10valores(input,output); var mat:array[1..10] of real; x : real; I : integer; Begin x := 0.0; writeln(Introduza 10 valores reais: ); for i:=1 to 10 do begin write( I, valor: ); read( mat[I] ); x := x + mat[I]; end; writeln("Mdia = ", x / 10.0 ) end. main() main() {{ double mat[10]; double mat[10]; double x x= =0.0; double 0.0;

C++ C++

cout << "Introduza 10 valores reais:\n"); cout << Introduza 10 valores reais:\n); for( i=0; i<9; i=I+1 ) ) for( i=0; i<9; i=i+1 {{ cout << i+1 << " valor: "; cout << i+1 << valor: ; cin >> mat[i]; cin >> mat[i]; x x= =x x+ +mat[i]; mat[i]; }} cout << "Mdia = =" "<< x x/ /10.0 << endl; cout << "Mdia << 10.0 << endl; }}

LISTAGEM 15 Mdia de uma matriz de valores reais


Pascal program exemplo(input,output); var mat:array[0..9, 0..4] of real; x : real; begin mat[2, 3]:=2.4325; x:= mat[2, 3]*3.14; mat[4, 0]:=x*mat[2, 3]; write("Elem.4,0 = ", mat[4, 0]) end. ; C++ main() { double mat[10][5]; double x; mat[2][3] =2.4325; x= mat[2][3]*3.14; mat[4][0] =x*mat[2][3]; cout << "Elem.4,0 = " << mat[4][0]; }

LISTAGEM 16 Utilizao de matrizes bidimensionais


Cadeias de caracteres

Tal como acontece em Pascal as matrizes de caracteres ou cadeias de caracteres (strings) possuem um tratamento especial. Este tipo de matrizes unidimensionais serve para guardar um pedao de texto.
Strings definidas como
matrizes de caracteres e terminadas com o caracter ASCII de valor zero

Em C++ pode-se armazenar numa matriz de caracteres um pedao de texto de qualquer dimenso que no exceda o tamanho da matriz. Para que seja possvel determinar o fim do texto por conveno acrescenta-se um caracter especial - o caracter \0 (com o cdigo ASCII 0), no fim do texto. Todas as funes que trabalham com cadeias de caracteres em C++ adoptam esta conveno. Assim sendo, uma matriz de caracteres dever ter espao para o texto incluindo o caracter de terminao. As funes de leitura e escrita de dados tratam as cadeias de caracteres como se fossem compostas por um nico valor de um tipo especial. Assim possvel escrever ou ler uma cadeia de caracteres fornecendo apenas o seu identificador. Outro aspecto importante das cadeias de caracteres em C++ que sobre elas no existem operaes definidas. Assim todas as operaes com cadeias de caracteres passam pelo uso de funes. Na tabela seguinte fornece-se uma pequena lista de funes que permitem efectuar as operaes existentes em Pascal sobre cadeias de caracteres do C++.

20

C++
operao Comparao Juno Cpia Dimenso funo strcmp strcat strcpy strlen Declarao em : String.h String.h String.h String.h

TABELA 7 Operaes com cadeias de caracteres em C++.

C++ main() { char string[100]; char *string1 = "Inicio do texto"; char string2[20]; cout << "Dimenso da string1: " << strlen(string1); // Obter o numero de caracteres strcpy( string2, "e fim do texto"); // Copiar para string2 o texto do segundo parmetro strcpy( string, string1 ); strcat( string, string2 ); cout << "Texto final: " << string; } // Copiar para string o texto de string1 // Juntar a string o texto de string2

LISTAGEM 17 Exemplo de operaes com cadeias de caracteres


Registos equivalentes ao tipo registo do Pascal

Estruturas

Os registos so estruturas de dados que permitem agrupar elementos de diversos tipos, referenciados atravs de identificadores. O Equivalente aos registos em Pascal so as estruturas de C++ cuja sintaxe a seguinte:
<tipo estrutura> struct <nome> { <varivel1>; <varivel2>; ... };
Pascal C++ main() { struct ( float x; float y; ) pt1; pt1.x=2.4325; pt1.y=3.14; pt1.x=pt1.x*4.5; cout << "Ponto= " << pt1.x << pt1.y;

program exemplo(input,output); var pt1 : record x : real; y : real end; begin pt1.x:=2.4325; pt1.y:=3.14; pt1.x:=pt1.x*4.5; write("Ponto= ", pt1.x, pt1.y) end.

LISTAGEM 18 Utilizao de registos ou estruturas

21

Ficheiros

Ficheiros

implementados pelos tipos ifstream e ofstream

Os ficheiros permitem armazenar informao sobre a forma de uma sequncia de elementos todos do mesmo tipo. Os dados so guardados de forma permanente, em dispositivos de memria no voltil, como por exemplo os discos rgidos. Ainda que seja possvel manipular ficheiros de elementos de qualquer tipo, o tipo de ficheiros mais comum o de caracteres (texto em formato ASCII). Em C++ no existe o tipo ficheiro, sendo utilizado um conjunto de tipos especiais definidos pelo utilizador que so pr-definidos na linguagem: Em particular os tipos ifstream para leitura de dados e ofstream para escrita de dados.
Pascal C++ main() { ofstream fich1; // para escrita ifstream fich2; // para leitura int a; float b; char c; fich1.open("out.txt"); fich2.open("in.txt"); fich2 >> a >> b >> c; fich1 << a << b << c; fich2.close(); fich1.close();

program exemplo(input,output); var fich1, fich2 : file of char; a : integer; b : real; c : char; begin assign(fich1, "out.txt"); assign(fich2, "in.txt"); rewrite(fich1); reset(fich2); read(fich2, a, b, c); write(fich1, a, b, c); close(fich2); close(fich1) end.

LISTAGEM 19 Utilizao de ficheiros

Nota:

A manipulao de ficheiros no est abrangida pelo Pascal standard, pelo que as instrues acima referidas podem ter ligeiras alteraes sintcticas em diferentes sistemas operativos.
Tipos de dados definidos pelo utilizador

Tambm em C++ possvel definir novos tipos de dados com base nos existentes.
Definio de tipos
efectuada em qualquer lugar do cdigo utilizando a palavra chave typedef

Os novos tipos de dados em C++ no possuem uma zona de definio prpria como em Pascal, sendo declarados nos mesmos locais que as variveis. Normalmente os novos tipos so declarados num ficheiro separado conjuntamente com a declarao de funes e variveis externas. Este ficheiro depois includo no programa usando a directiva #include. Alternativamente os novos tipos so declarados no incio do programa. A sintaxe da definio de tipos em C++ a seguinte:
<Def de tipo> typedef <tipo existente> <nome>;

22

Pascal
array[ ] of <tipo> Record File ( val1, val2, p^ ...) struct

C++
<tipo> [ ]

ofstream ou ifstream enum { val1, val2, ...) *p

TABELA 8 Resumo dos tipos de dados avanados.

1 6

Estruturas de Dados Dinmicas


Tanto o Pascal como o C++ proporcionam a possibilidade de definir e utilizar estruturas de dados cuja topologia e nmero de elementos varia ao longo da execuo do programa. Por esse motivo, estas estruturas de dados so designadas como estruturas de dados dinmicas. O elemento essencial para a construo de estruturas de dados deste gnero um tipo de dados elementar, designado ponteiro (pointer). As variveis deste tipo contm valores especiais: endereos de posies de memria. Desta forma, a informao no se encontra no valor da varivel mas sim no valor da posio de memria guardada na varivel, conforme se ilustra na figura 1.

P1 (pointer)

*P1 (C++) / P1^ (Pascal) (n real, na posio de mem. 1214843)

1214843

3.14159

FIGURA 1: Exemplo de uma referncia indirecta por meio de um ponteiro

Dada a varivel do tipo pointer, possvel obter o valor por ela indicado de forma indirecta, atravs do acesso chamada varivel referenciada pelo ponteiro. A identificao da varivel referenciada obtida, em Pascal, acrescentando no fim do nome do ponteiro um acento circunflexo (^), enquanto em C++ necessrio acrescentar um asterisco (*) no incio. preciso muito cuidado ao trabalhar com este tipo de dados uma vez que atravs deles possvel escrever em qualquer sitio da memria incluindo sobre o prprio programa ou sobre os seus dados.
Listas

Uma lista uma estrutura de dados dinmica, semelhante a um vector (array unidimensional) com a diferena de o nmero dos seus elementos poder aumentar ou diminuir durante a execuo do programa, consoante as necessidades.

23

Esta possibilidade oferece duas vantagens importantes:


1.

Se o nmero de elementos previsto inicialmente for ultrapassado o programa no terminar abruptamente com uma mensagem de erro. O sobredimensionamento dos arrays evitado, com a consequente optimizao da gesto da memria disponvel.

2.

Tem a desvantagem de o processamento de listas ser geralmente mais lento do que o de arrays.
utilizam os operadores new e delete para reservar e libertar espao na memria

Dados dinmicos

Os procedimentos de manipulao de ponteiros, utilizados em Pascal, tm correspondentes em C++ conforme indicado na tabela 9. Pascal
new dispose nil

C++
new delete NULL

TABELA 9 Entidades utilizadas na manipulao de ponteiros.

Seguidamente apresentam-se um programa em C++ e outro em Pascal que preenchem uma lista de 5 elementos com nmeros inteiros, lidos do teclado, e ecoam os valores lidos no ecr (admitindo que eram lidos os valores 4, 1, 8, 4 e 7).

A estrutura de dados criada a que se mostra na figura 2:


NULL (C++) NIL (Pascal)

FIGURA2: Estrutura de dados criada pelos programas abaixo descritos

Na pgina seguinte esto escritos dois programas, um em Pascal e o outro em C++, que constroem a estrutura de dados acima referida.

24

Pascal program lista (input,output); type lista = ^elem; elem = record num : integer; prox : lista end; var lis, lis1 : lista; j : integer; begin new(lis); lis1:=lis; for j:=1 to 4 do begin readln(lis^.num); new(lis^.prox); lis:=lis^.prox end readln(lis^.num); lis^.prox:=nil;

C++ #include<iostream.h> #include<stdlib.h> typedef struct elem *lista; struct elem{ int num; lista prox; }; main() { lista lis, lis1; int j; lis = new elem; lis1 = lis; for(j=1;j<=4;j++) { cin >> lis->num; lis->prox = new elem; lis = lis->prox; } cin >> lis->num; lis->prox = NULL; // eco... while (lis1 != NULL) { cout << lis1->num << endl; lis1 = lis1->prox; } }

{ eco ...} while lis1<>nil do begin writeln(lis1^.num); lis1:=lis1^.prox end end.

LISTAGEM 20 Implementao de listas ligadas

25

Você também pode gostar