Escolar Documentos
Profissional Documentos
Cultura Documentos
TRANSIO PARA
C++
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.
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.
Aa Maisculas diferenciadas
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.
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>; }
Comentrios
Comentrios
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
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.
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
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; }
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
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 = $;
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.
C++
+ * / %
not and or
! && ||
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++
! * / % + < <= > >=
== != && || =
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
C++
Declarao em : stdlib.h ou math.h
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 ).
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; }
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
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
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------
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-----} } } }
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>.
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; }
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++.
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
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;
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;
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
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.
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;
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 (;).
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
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; }}
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
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
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.
21
Ficheiros
Ficheiros
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.
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> [ ]
1 6
P1 (pointer)
1214843
3.14159
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
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
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).
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; } }
25