Вы находитесь на странице: 1из 61

Linguagem

Cludio Mrcio do Nascimento Abreu Prereira 2000

Observaes aos leitores Este documento foi criado com intuito de servir de acompanhamento no aprendizado dos conceitos fundamentais da linguagem C bem como aspectos bsicos da linguagem C++, fornecendo exemplos que ilustram os conceitos aprendidos. Portando, este documento no deve ser o nico instrumento de aprendizado, devendo ser complementado com as notas de aula, bem como com as referncias citadas no final do texto. A familiarizao com alguma linguagem de programao estruturada (por exemplo Pascal) fundamental para o bom aproveitamento do curso.

ii

SUMRIO UNIDADE 1 - HISTRICO UNIDADE 2 - ELEMENTOS BSICOS DA LINGUAGEM C 2.1 - Anatomia de um Programa em C 2.2 - Identificadores em C 2.3 - Tipos de dados 2.4 - Declarao de Variveis 2.5 - Comandos de Atribuio 2.6 - Inicializao de variveis 2.7 - Imprimindo Variveis 2.8 - Converso de Tipos nas Atribuies 2.9 - Constantes 2.10 - Operadores 2.10.1 - Operadores Aritmticos 2.10.2 - Operadores Relacionais e Lgicos 2.10.3 - Operadores Bit-a-Bit 2.10.4 - Operador Ternrio ? : 2.10.5 - Operadores de Ponteiro & e * 2.10.6 - Operador Vrgula , 2.10.7 - Taquigrafia em C *2.10.8 - Operador de Molde UNIDADE 3 - CONTROLE DE FLUXO 3.1 - O Comando if 3.2 - O Comando switch 3.3 - O Lao for 3.4 - O Lao while *3.5 - O Lao do-while 3.6 - O comando break 3.7 - O comando continue

UNIDADE 4 - FUNES 4.1 - Chamada a uma funo iii

4.2 - Criao uma funo 4.3 - Parmetros (ou argumentos) de uma funo 4.4 - O Comando return 4.5 - Prottipo 4.6 - Passagem por Valor 4.7 - Passagem por Referncia 4.8 - Valores Default para argumentos 4.9 - Recursividade UNIDADE 5 - MATRIZES 5.1 Declarao de matriz de uma dimenso 5.2 - Acesso aos elementos feito referenciando-se o ndice desejado. 5.3 - Inicializao de matriz unidimensional 5.4 - Matrizes unidimensionais e funes 5.5 - Declarao e inicializao strings 5.6 - Manipulao de strings 5.7 - Matrizes bidimensionais 5.8 - Matrizes bidimensionais e funes 5.9 - Matrizes de strings UNIDADE 6 - PONTEIROS 6.1 - Operadores de ponteiro 6.2 - Aritmtica de ponteiros 6.3 - Ponteiros e matrizes UNIDADE 7 - ESTRUTURAS 7.1 - Declarao 7.2 - Acesso aos membros (variveis) da estrutura 7.3 - Atribuio de estruturas 7.4 - Estruturas e funes 7.5 - Ponteiros para estruturas UNIDADE 8 - TPICOS EM C++ 8.1 - Criando uma classe em C++ 8.2 - Criao de um objeto 8.3 - Acesso aos mtodos iv

8.4 - Atribuio de Objetos 8.5 - Entradas e Sadas bsicas 8.6 - Sobrecarga de funes 8.7 - Construtores 8.8 - Destrutores 8.9 - Herana

UNIDADE 1 - HISTRICO A evoluo das Linguagens e Tcnicas de Programao (LTP) um processo de adaptao das mesmas crescente necessidade de atendimento ao mercado (sejam demandas cientficas ou tecnolgicas). A necessidade de se criar programas que realizem cada vez mais tarefas, e cada vez mais difceis, produz um aumento considervel na complexidade e tamanho dos cdigos (programas). Visando lidar com a complexidade de forma cada vez mais amigvel, vo surgindo novas tcnicas que geralmente levam a criao de novas linguagens de programao. Desta forma, vem sendo a evoluo das LTP desde a linguagem de mquina at as linguagens orientadas a objeto (por exemplo C++), passando por linguagens de alto nvel e linguagens de programao estruturada (por exemplo C). A linguagem C, criada por Dennis Ritchie na dcada de 70 na AT&T Bell Laboratories, tendo como precursores as linguagens BCPL (Martin Richards) e B (Ken Thompsom). Por volta de 1980, Bjarne Strausstrup, buscando solues para lidar com a imensa complexidade de um sistema que estava desenvolvendo, cria C com Classes, que uns 5 anos depois d origem ao C++.

UNIDADE 2 - ELEMENTOS BSICOS DA LINGUAGEM C

2.1 - Anatomia de um Programa em C Para introduzir os conceitos bsicos da linguagem C vamos tomar por base um exemplo simples e fazer observaes a respeito do mesmo. Seja o algoritmo abaixo:

{ Programa Hello World } incio escreva (Hello World!); fim.

Sua implementao implementao em C fica:

/* Programa Hello World */ main ( ) { printf (Hello World!); }

Algumas observaes importantes a respeito do exemplo acima so listadas a seguir. A Funo Main O bloco principal tem nome especial chamado main, que uma funo por onde o programa comea a ser executado. Caracteres Maisculos e Minsculos Letras maisculas e minsculas so coisas diferentes. Espaos em branco Espaos, tabulaes e linhas em branco so ignorados pelo compilador. 2

Fim de Instruo O ponto e vrgula (;) termina uma instruo. Marcadores de Bloco Incio e fim de bloco so marcados por chaves, ou seja { e } respectivamente. Comentrios Comentrios devem aparecer entre /* e */. Outra forma de comentrio utilizar // comentando uma linha inteira. Ex: // Hello World! Imprimindo Caracteres printf ( ) uma funo que imprime constantes e variveis na tela do computador. printf ( ) uma funo predefinida em um arquivo chamado stdio.h, que deve ser referenciado no programa fonte atravs da diretiva #include. Desta forma, o programa precisa ser acrescido de uma linha:

/* Programa Hello World */ #include <stdio.h> main ( ) { printf (Hello World!); }

A Diretiva #include #include no um comando do compilador e sim uma diretiva do preprocessador, que indica que o arquivo entre < e > deve ser incluido para que se possa utilizar as funes nele definidas. O pr-processador O pr-processador um programa que faz modificaes no programa fonte antes que este seja compilado. Strings Seqncias de caracteres (strings) devem ser escritos entre aspas. Caracteres Especiais 3

Utilizando-se a contrabarra pode-se embutir nos strings caracteres especiais. Alguns exemplos so: \n - nova linha \t - tabulao \b - retrocesso \f - salta pgina \a - beep \\ - barra invertida entre outros. Obs: A escrita de um nico caracter constante feita com apstrofo ( ). Ex: \n, a, 1, \t 2.2 - Identificadores em C Identificadores so os nomes de variveis, funes, etc, definidos pelo usurio. Os identificadores devem ser escritos iniciando-se por letra ou sublinhado (_), e todos os outros caracteres subsequentes sendo letran, nmeros ou sublinhado. Ex: Contador; Quadrado; X1; Posicao_x; _xpto; _A23;

2.3 - Tipos de dados Tipos de Dados Bsicos Tipo char int float double void Descrio caracter inteiro real real c/ dupla preciso vazio Largura (bytes) 1 2 4 8 0 Intervalo -128 a 127 -32768 a 32767 3.4e-38 a 3.4 e+38 1.7e-308 a 1.7e+308 nenhum valor

Obs: O tipo void tem trs usos: (i) declarar explicitamente que uma funo no retorna valores; (ii) declarar explicitamente que uma funo no tem parmetros; (iii) criar ponteiros genrico. Modificadores de Tipos Um modificador utilizado para alterar o significado de um tipo bsico. Os modificadores so: signed, unsigned, long e short Tipo unsigned char unsigned int long (int) unsigned long int short (int) long double Descrio caracter s/ sinal inteiro s/ sinal inteiro longo inteiro longo s/ sinal inteiro curto real longo dupla preciso Larg. (bytes) 1 2 4 4 2 10 Intervalo 0 a 255 0 a 65535 -2147483648 a 2147483648 0 a 4294967295 -32768 a 32767 3.4e-4932 a 1.1e+4932

Obs: short int no DOS igual ao int.

2.4 - Declarao de Variveis Varivel em C um espao de memria reservado para receber certo tipo de dado. Por isso necessrio que se declare o tipo da varivel. A sintaxe de declarao de variveis em C : <tipo da varivel><lidentificador 1>,...,<lidentificador n> ; Ex: int i, j, k; long l; double x, y;

2.5 - Comandos de Atribuio Sintaxe: <nome da varivel> = <expresso>; Ex: x = 0; onde expresso pode ser uma nica constante ou uma combinao de variveis, operadores e constantes. Mltiplas Atribuies Sintaxe: <varivel 1> = <varivel 2> = ... = <varivel n> = <expresso>; Ex: x = y = 0; 2.6 - Inicializao de variveis

A inicializao de variveis feita atravs do comando de atribuio: Sintaxe: <tipo da varivel> <identificador> = <valor inicial>; Ex: float z = 10.5;

2.7 - Imprimindo Variveis A impresso de uma varivel requer a identificao do formato a ser impresso. Para tal caracteres especiais devem ser includos no string a ser impresso. Alguns deles so: %d - para impresso de int %f - para impresso de float %E - para impresso de float formato exponencial %c - caracter %s - stirng Ex: int contador=0; float x=5.3; printf(%d, contador); printf(%f, x);

2.8 - Converso de Tipos nas Atribuies Quando uma expresso de certo tipo atribuda a uma de outro tipo, o valor do lado direito convertido para o tipo do lado esquerdo.

Ex: int i; float j=2.5; i=j; // i recebe 2 7

Pegadinha: O que dever ser impresso pelo cdigo abaixo? (Se tiver dvida faa um teste.) #include <stdio.h> main() { int i,j; float x=2.5, y; y=i=x; printf("%f",y); }

2.9 - Constantes Constantes referenciam valores fixos que no podem ser alterados pelo programa. Alguns exemplos de constantes podem ser vistos na tabela abaixo. Tipo char int long int unsigned int float double Exemplo x \n 1 1 3984 -267 35000L -3478L 23478U 0U 2.56F 4.5e-3F 123.456 -178.5

2.10 - Operadores 2.10.1 - Operadores Aritmticos Operador + * / % - (unrio) ++ -Operao soma subtrao multiplicao diviso mdulo sinal incremento decremento

Observaes: 1) O operador % retorna o resto da diviso inteira. 2) Os operadores ++ e Ex: ++i; i++; --i; i--; // pr-fixado // ps-fixado // pr-fixado // ps-fixado

3) Os operadores ++ e aplicados a uma varivel i equivalente a fazer i = i+1. Ex: int i=10; i++; ++i; i--; --i; // i recebe 11 // i recebe 12 // i recebe 11 // i recebe 10

Operadores de Incremento e Decremento Pr e Ps-Fixados A diferena entre os operadores pr e ps fixados aparece quando deseja-se atribuir uma expresso que os contenha uma varivel. No caso da pr-fixao, o operador ++ ou aplicado e depois a atribuio feita. 9

Ex: int i=10, j; j=++i; No caso do exemplo acima, i incrementado recebendo 11, valor este que atribudo a j. No final, i e j so 11. No caso da ps-fixao, a atribuio feita e depois o operador ++ ou aplicado. Ex: int i=10, j; j=i++; No caso do exemplo acima, i atribudo a j (ou seja j recebe 10) e logo aps, incrementado, recebendo 11. No final, i 11 e j 10. Pegadinha: O que dever ser impresso pelo cdigo abaixo? (Se tiver dvida faa um teste. Se mesmo com o teste continuar achando estranho, pergunte ao professor) #include <stdio.h> main() { int i=10, j; j = i + i++ + ++i; printf("i = %d } j = %d",i,j);

Precedncia dos Operadores Aritmticos 1o) 2) 3)


o o

- (unrio) * + / -

++ %

--

2.10.2 - Operadores Relacionais e Lgicos 10

Relacionais Operador > >= < <= == != Lgicos Operador && || ! Operao e ou negao Operao maior maior ou igual menor menor ou igual igual diferente

Precedncia dos Operadores Relacionais e Lgicos 1o) 2o) 3o) 4o) 5o) ! > == && || >= != < <=

2.10.3 - Operadores Bit-a-Bit Os operadores bit-a-bit so teste, ativao ou deslocamento dos bits de um char, int ou suas variantes.

Operador & | ^ ~ >> <<

Operao e ou ou exclusivo no (complemento de 1) deslocamento direita deslocamento esquerda

11

Os operadores &, | e ~ possuem a mesma tabela verdade que os operadores lgicos, no entanto a mesma deve ser aplicada a todos os bits do char ou int. O operador ^ retorna 1 se os bits forem diferentes e 0 se forem iguais. Os operadores >> e << executam deslocamentos para a direita e esquerda respectivamente. Ex: char x; x=7; x=x<<1; x=x>>1; binrio 00000111 00001110 00000111 valor de x 7 14 7

Obs: << multiplica o nmero por 2 e >> divide por 2.

2.10.4 - Operador Ternrio ? : O operador ternrio possui a seguinte sintaxa: <exp1>?<exp2>:<exp3>; onde exp1, exp2 e exp3 so expresses. Se exp1 for verdadeira, ento exp2 avaliada e seu valor retornado. Caso contrrio retornado o valor de exp3. Ex: maior = (a>b)?a:b; absoluto = (x>0)?x:-x; // retorna o maior entre a e b //retorna o valor absoluto

printf(%s, (y%2)?impar:par); // imprime par ou impar O operador ?: pode ser entendido como: se <exp1> ento <exp2>; seno <exp3>; fim se.

12

2.10.5 - Operadores de Ponteiro & e * Um ponteiro um endereo de memria de uma varivel. & retorna o endereo de memria de uma varivel. Sintaxe: &<nome da varivel> Ex: m=&contadorl; O operador & pode ser entendido como endereo de. * retorna o valor da varivel Sintaxe: *<varivel> Ex: *m; Ex: #include <stdio.h> main() { int alvo, origem; int *m; origem = 10; m = &origem; // m recebe end. de origem alvo = *m; // alvo recebe contedo de m printf(%d,alvo); }

2.10.6 - Operador Vrgula ,

13

utilizado para encadear vrias expresses. #include <stdio.h> main() { double x, y, z; x = (y=10, z=20, y+z); printf("%f",x); }

Exemplo: O que ser impresso pelo programa abaixo?

#include <stdio.h> main() { int x=1, y=1, z=1; x = (y=10, z=20, y++, z=z+5, y+z); printf("%d",x); }

#include <stdio.h> Pegadinha: O que ser impresso pelo programa abaixo? main() { int x=1, y=1, z=1; x = (y=10, z=20, y++, z=z+5, y+z, z++); printf("%d",x); } 14

Obs: Os parntese so necessrios porque a precedncia do , menor que a do =.

2.10.7 - Taquigrafia em C Existem operadores para resumir a escrita de operaes entre a varivel esquerda e outro valor esquerda. Exemplo: x = x + 10; y = y/3; equivale a: equivale a: x += 10; y /=3;

Esta taquigrafia funciona para todos os operadores binrios em C.

2.10.8 - Operador de Molde utilizado para converter tipos diferentes. Possui a mesma sintaxe do tipo. Sintaxe de converso: (<tipo>) varivel; Ex: int i; float x; 15

x = (float) i;

// converte o valor de i para float e atribui a x

16

UNIDADE 3 - CONTROLE DE FLUXO

3.1 - O Comando if Sintaxe: if (<expreso>) <comando1>; else <comando2>; ou if (<expresso>) { <seqncia de comandos> } else { <seqncia de comandos> } Obs: Verdadeiro em C qualquer valor diferente de zero. Ex:

#include <stdio.h> main() { int senha = 123, n; printf(Digite a senha: ); scanf(%d, &n); if(n == senha) printf("Certo"); else printf(Errado); }

Comandos ifs aninhados

17

Sintaxe: if(<expresso 1>) if(<expresso 2>) <comando 1>; else <comando 2>; Obs: 1) Se houver mais de um comando a ser executado, deve-se utilizar chaves. 2) Um else pertence ao if mais prximo (acima dele) que ainda no tenha um else, e que esteja no mesmo escopo. Exemplos: if (a>b) if(a>c) printf(a > b > c); else printf(a > b e a < c); Neste caso o if pertence ao segundo else. Se desejssemos que o if pertencesse ao primeiro else, precisaramos utilizar chaves. if (a>b) { if(a>c) printf(a > b > c); } else printf(a < b);

No entanto, se o segundo if j tivesse um else, as chaves poderiam ser desprezadas.

Escada if-else-if Sintaxe:

18

if(<expresso 1>) <comando 1>; else if(<expresso 2>) <comando 2>; .......... else if(<expresso n>) <comando n>; else <comando m>;

Quando uma expresso for verdadeira o comando referente mesma executado e os demais desprezados. Se nenhuma expresso for verdadeira o comando m ser executado.

Ex: if (a==1) printf(Opcao 1); else if (a==2) printf(Opcao 2); else if (a==3) printf(Opcao 3); else printf(Nenhuma opcao foi escolhida);

19

3.2 - O Comando switch O comando switch utilizado para teste com mltipla escolha, cuja sintaxe geral fica: switch(<expresso>) { case <constante 1>: <comando 11>; ..... <comando 1n>; break; case <constante 2>: <comando 21>; ..... <comando 2n>; break; ............ case <constante m>: <comando m1>; ..... <comando mn>; break; default: int n; <comando d1>; printf(\n [1] : Opcao 1); ..... printf(\n [2] : Opcao 2); printf(\n [3] : Opcao 3); <comando dn>; printf(\n Digite sua opcao: );

scanf(%d, &n); Quando o valor de <expresso> tem seu valor de retorno identificado em um dos cases, o switch (n) { fluxo desviado para l e os comandos referentes quele case so executados. O comando break ao case 1: trmino da seqncia de comandos de cada case provoca sada imediata do switch. Se este no for printf(\n Escolhida opcao 1); break; encontrado, os cases subseqentes sero executados at que um break seja encontrado. case 2: A palavra default indica a opo que ser executada se nenhuma das opes for escolhida. printf(\n Escolhida opcao 1); break; case 3: Ex: printf(\n Escolhida opcao 1); break; default: printf(\n Nenhuma opcao escolhida); 20

Obs: Testar com e sem break

3.3 - O Lao for Sintaxe: for ( <exp. Inicializao> ; <exp. Teste> ; <exp. Incremento> ) <comando>; ou for ( <exp. Inicializao> ; <exp. Teste> ; <exp. Incremento> ) { <comando 1>; ......... <comando 1>; } Ex: int i; 21

for (i=0; i<10; i++) printf (\ni=%d,i);

Mecanismo do lao for: 1o ) Ao entrar no for, a expresso de inicializao avaliada; 2o ) Avalia a expresso de teste; 3o ) Se a expresso de teste for verdadeira, executa comandos, seno sai do for; 4o ) Aps executar comandos, executa expresso de incremento; 5o ) volta para 2o passo. Obs: As expresses de inicializao, teste e incremento podem ser quaisquer.

Variveis declaradas na inicializao do for Ex: for (int i=0; i<10; i++) printf (\ni=%d,i);

Mltiplas Expresses Ex: int i, j; for (i=0, j=0; i+j<10; i++, j++) printf (\ni=%d,i+j);

22

As funes getch() e getche() Ambas lem um char do teclado e atribuem a uma varivel. A funo getche() ecoa o caracter na tela enquanto getch() no o faz. Ex: char ch; ch = getch(); printf(%c,ch);

Chamadas a funes dentro do for Ex: for (char ch=getch(); ch != x; ch=getch()) printf(%c,ch);

Omitindo expresses Ex: char ch; for ( ; (ch=getch()) != x; ) printf(%c,ch);

Omitindo o corpo do lao Ex: for (char ch; (ch=getch()) != x; printf(%c,ch));

Lao infinito Ex: for (; ; ) printf(Lao infinito);

Laos for aninhados

23

Ex:

for (int i=0; i<10; i++) for (int j=0; j<10; j++) printf(\n%d %d, i, j);

3.4 - O Lao while Avalia uma expresso e repete umasencia de comandos enquanto for verdadeira. Sintaxe: while(<expresso>) { <comando 1>; ............... <comando n> } #include <stdio.h> #include <conio.h> Ex: main() { char c, ch; char c; float a,b,r; c = getch(); printf("C A L C U L A D O R A"); printf("\n---------------------"); while(c != 27) { ch='0'; c=getch(); while (ch!=27) { printf("\n\n>> "); printf(%c,c); scanf("%f%c%f",&a,&c,&b); } switch (c) { case '+': r = a + b; break; case '-': r = a + b; break; case '*': r = a * b; break; case '/': r = a / b; break; } printf(" = %f\n", r); printf("\n<ESC> para SAIR, outra tecla para continuar..."); ch=getch(); } } 24

Ex:

3.5 - O Lao do-while Executa um bloco de comandos enquanto a expresso de teste for verdadeira. A diferena entre o while e o do-while que no segundo o teste feito ao final da execuo, ou seja, o bloco de comandos executado pelo menos uma vez, mesmo que a condio seja falsa. Sintaxe: do { <comando 1>; ........... <comando n>; } while (<expresso>); 25

Ex: do { c = getch(); printf(%c,c); } while (c != 27);

3.6 - O comando break O comando break provoca a sada imediata de um lao (for/while/do-while) ou switch. Ex: #include <stdio.h> #include <conio.h> main() { float a,b; do { printf("\nEntre com a: "); scanf("%f", &a); printf("Entre com b: "); scanf("%f", &b); if (a==0) { printf(\nAbortando para evitar diviso por zero."); break; } #include <stdio.h> printf("A razao e %f",b/a); #include <conio.h> printf("\nRepetir operacao? (s/n): "); } while (getch()!='n'); main() { printf("\nSaindo do laco ..."); float a,b; printf("\nAperte uma tecla ..."); do { getch(); printf("\nEntre com a: "); } scanf("%f", &a); 3.7 - O comando continue printf("Entre com b: "); scanf("%f", &b); if (a==0) { Este comando provoca a prxima iteraono podelao.feita.");vez encontrado o comando printf(\nEsta diviso de um ser Uma printf("\nRepetir operacao? (s/n): "); continue, os comandos entre ele e o fim do bloco do lao so desprezados. continue; } printf("A razao e %f",b/a); Ex: printf("\nRepetir operacao? (s/n): "); } while (getch()!='n'); printf("\nSaindo do laco ..."); printf("\nAperte uma tecla ..."); getch(); 26 }

27

UNIDADE 4 - FUNES

Uma funo um conjunto de instrues que desempenha uma tarefa particular, e que so agrupadas em um bloco de comandos que possui um nome para referenci-lo. O cdigo de uma funo escrito apenas uma vez e pode ser executado quantas vezes for necessrio. At este momento vnhamos apenas escrevendo programas no main, que a funo principal, onde inicia-se a execuo do programa. A partir de agora veremos como criar e utilizar nossas prprias funes.

4.1 - Chamada a uma funo Para que o cdigo de uma funo seja executado, necessrio que a mesma seja chamada execuo. Isto feito pela citao do nome que a referencia no decorrer do programa. Ex: printf(Hello); // chamada da funo printf.

4.2 - Criao uma funo <tipo> <nome> (<tipo 1> <parmetro 1>, <tipo 2> <parmetro2>,..., <tipo n> <parmetro n>) { <comando 1>; .......... <comando n>; } Onde: <tipo> o tipo de dado a ser retornado pela funo, o que caracteriza o tipo da funo; <parmetro 1>,...,<parmetro n> so os parmetros a serem passados para a funo; <tipo 1>,...,<tipo n> so os tipos dos parmetros. O tipo da funo pode ser um dos tipos bsicos da linguagem C, inclusive void, que indica que a funo no retorna valor, ou seja, a funo simplesmente realiza um procedimento. 28

Ex:

#include <stdio.h> void Hello () { printf(\nHello World!); } void main() { Hello (); }

4.3 - Parmetros (ou argumentos) de uma funo So os dados (variveis) passados para a funo. Os dados podem ser utilizados no corpo da funo como variveis locais da funo, que so criadas quando a funo chamada e destrudas quando a funo termina. Ex: #include <stdio.h> void Hello (int N) { int i; for(i=0; i<N; i++) printf(\nHello World!); } void main() { int a = 2; Hello (a); // imprime 2 vezes Hello (3); // imprime 3 vezes }

#include <stdio.h> 4.4 - O Comando return double Potencia (double x, int n) { Termina a execuo da funo, int i; podendo retornar valor para a funo que a chamou (mesmo que double p; seja a funo main). Para uma p=x; funo retornar valor, este precisa ser especificado no comando for(i=1; i<n; i++) return. p = p * x; Ex: uma funo que calcula a potncia p; um nmero, ou seja xn return de } void main() { double z; z = Potencia(10,3); printf(%f, z); 29 }

Obs: 1) O valor especificado no comando return deve ser do tipo especificado como tipo de retorno da funo (ou tipo da funo). No exemplo a funo retorna double e p double. 2) Uma funo void no pode retornar valor, o comando return no deve especificar valor algum. 3) Uma funo que retorna valor pode ser utilizada em qualquer expresso vlida do C. Ex: z = 5 + 3 * Potencia (y, 2) + Potencia (y,3); 4) Quando o tipo de retorno no especificado, int assumido por default

4.5 - Prottipo a declarao da funo. Toda funo tem que ser declarada antes de sua utilizao, exceto se a mesma for implementada antes de sua chamada, dispensando, assim, o prottipo. Sintaxe: <tipo> <nome> (<tipo 1> <parmetro 1>, <tipo 2> <parmetro2>,..., <tipo n> <parmetro n>); Ex: #include <stdio.h> void Hello(); void main() { Hello(); } void Hello() { printf("Hello"); } 30

No exemplo acima, como a funo Hello est sendo utilizada antes de sua implementao (feita depois da funo main), o prottipo requerido, antes de sua chamada (em main).

4.6 - Passagem por Valor Denomina-se Passagem por Valor quando se passa para uma funo a cpia do valor dos parmetros. As variveis passadas no tero seus valores alterados, pois a funo trabalha com uma cpia delas. Ex: #include <stdio.h> int Incrementa(int a) { printf(\nO valor passado foi %d,a); a++; printf(\nDepois de incrementar (dentro da funcao) temos a=%d,a); return a; } void main() { int x=3, z; printf(\nO valor que sera passado e x=%d,x); z=Incrementa(x); printf(\nz=%d,z); printf(\nx=%d,x); } Obs: 1) O valor de a foi incrementado, mas x permanece inalterado depois da execuo de Incrementa(x). Isto acontece porque apenas o valor foi passado. A varivel a uma cpia de x (tem outro endereo de memria).

4.7 - Passagem por Referncia Denomina-se Passagem por Referncia quando se passa para a funo o endereo de uma varivel. Neste caso, a funo tem acesso prpria varivel passada, podendo alterar o seu valor. O endereo da varivel passado com auxlio do operador de endereo &. 31

Sintaxe: <tipo> <nome> ( <tipo 1> &<var 1>,...,<tipo n> &<var n>) { ......... } Ex: #include <stdio.h> int Incrementa(int &a) { printf(\nO valor passado foi %d,a); a++; printf(\nDepois de incrementar (dentro da funcao) temos a=%d,a); return a; } void main() { int x=3, z; printf(\nO valor que sera passado e x=%d,x); z=Incrementa(x); printf(\nz=%d,z); printf(\nx=%d,x); }

Neste caso, observa-se que o valor de x ser alterado quando for executado a++.

4.8 - Valores Default para argumentos So valores assumidos em caso de omisso da passagem de par6ametros. Sintaxe:

#include <stdio.h> <tipo> <nome> ( <tipo 1> <var 1>=<valor 1>,...,<tipo n> <var n>=<valor n>) { void Linha(int tam=10, char c='-') { ....... for(int i=0; i<tam; i++) printf("%c",c); } } main() { Linha(); printf("\n"); Linha(20); printf("\n"); Linha(15,'*'); } // ---------// -------------------// *************** 32

Ex:

Obs: 1) Se algum parmetro for omitido, o valor default assumido. 2) Uma vez omitido um parmetro, os parmetros subsequentes devem ser omitidos tambm.

4.9 - Recursividade o fato que permite que funes chamem a si prprias. Ex: clculo de fatorial.

#include <stdio.h> int Fatorial(int n) { int F; if(n==0) return 1; F = Fatorial(n-1)*n; return F; } main() { printf("%d",Fatorial(3)); }

A funo chamada recursivamente at que algum valor seja retornado. O valor ento substitudo sucessivamente. Por exemplo Fatorial(3) calculado da seguinte forma: 1) Como n>0, F = Fatorial(2)*3. Ento temos que calcular Fatorial(2) 33

2) Para calcular Fatorial(2), temos: F = Fatorial(1)*2. Ento temos que calcular Fatorial(1). 3) Como agora n==1, o valor 1 retornado. 4) Substituindo em 2) Fatorial(1) por 1 temos que F = 1*2 = 2, que o valor retornado na chamada de Fatorial(2). 5) Substituindo em 1) Fatorial(2) por 2 temos que F = 2*3 = 2, que o valor retornado na chamada de Fatorial(3).

34

UNIDADE 5 - MATRIZES Matriz uma estrutura de dados homognea (que representa um conjunto de variveis de um mesmo tipo), referenciada por um nome, onde cada elemento pode ser acessado por um ndice.

5.1 Declarao de matriz de uma dimenso Sintaxe de declarao: <tipo> <nome>[<dimenso>]; Exemplo: int m[10]; // declara matriz m de 10 inteiros Obs: Os ndices comeam no zero, valendo portanto ndices de 0 a 9.

5.2 - Acesso aos elementos feito referenciando-se o ndice desejado. Exemplo: int m[10]; int i; i=m[5]; m[3]=28;

5.3 - Inicializao de matriz unidimensional Sintaxe: <tipo> <nome>[<dimenso>] = { <valor 1>, <valor 2>, ... }; ou, sem explicitar a dimenso <tipo> <nome>[ ] = { <valor 1>, <valor 2>, ... }; Exemplo: float mat[5] = {2.5, 3.8, 1.9, 3.0, 5.7};

35

5.4 - Matrizes unidimensionais e funes Tode matriz passada como parmetro de uma funo passada por referncia. Sintaxe: <tipo_funo> <nome_funo>( <tipo_matriz> <nome_matriz>[<dimenso>]) { ... } ou, sem passar dimenso <tipo_funo> <nome_funo>( <tipo_matriz> <nome_matriz>[ ]) { ... } ou, com declarao de ponteiro <tipo_funo> <nome_funo>( <tipo_matriz> *<nome_matriz>) { ... } OBS: Qualquer uma destas sintaxes passa, na realidade, um ponteiro (referncia) para a funo. A chamada feita passando-se apenas o nome da matriz. <nome_funo> (<nome_matriz>); Exemplo: void Print(int m[3]) { ... } ... int x[3] = {1,2,3}; Print(x); // chamada

5.5 - Declarao e inicializao strings 36

Em C, as strings (sequncias de caracteres) so representadas em uma matriz unidimensional de caracteres. A sequncia inicia no primeiro elemento da matriz e termina quando encontrar um caracter nulo (\0). No entanto iremos nos referenciar ao string como sendo a prpria matriz. Um exemplo de inicializao de strings pode ser visto a seguir: Ex: char s[5] = {c, a, s, a, \0};

a sequncia de caracteres constante tem sintaxe especial, utilizando-se aspas. Neste caso poderamos escrever: Ex: char s[5] = casa;

OBS: Esta sintaxe j inclui o \0 aps o ltimo caracter. Por isso precisamos dimenso pelo menos 5.

5.6 - Manipulao de strings Sejam os strings: char str1[80], str2[80]; Impresso formatada na tela: printf(%s, str1); Leitura pelo teclado: gets(str1); Cpia de strings: strcpy(str1,str2); // copia string str2 para str1 OBS: str1 = str2; <= ERRADO Comparao de strings: strcmp(str1,str2); // compara string str2 com str1, se forem iguais retorna zero OBS: str1 == str2; <= ERRADO Concatenao de strings: 37

strcat(str1,str2); // concatena string str2 com str1, atribuindo resultado a str1 OBS: str1 = str1 + str2; <= ERRADO Medida do tamanho do string strlen(str1); // retorna o tamanho da string ( do 1o elemento at o \0, sem cont-lo Exemplo: #include <stdio.h> #include <string.h> void main() { char s1[80], s2[80],s3[80]; printf("\nDigite s1: "); gets(s1); printf("\nDigite s2: "); gets(s2); printf("\ns1 tem %d e s2 tem %d caracteres.", strlen(s1), strlen(s2)); if(strcmp(s1,s2)==0) printf("\ns1 e s2 sao iguais."); else printf("\ns1 e s2 sao diferentes."); strcpy(s3,s1); printf("\nApos receber s1, s3 = %s.",s3); strcat(s3,s2); printf("\nApos concatenar s3 e s2, s3 = %s.",s3); }

5.7 - Matrizes bidimensionais Sintaxe de declarao: <tipo> <nome>[<dimenso 1>][<dimenso 1>]; Exemplo: int m[3][2]; // declara matriz m 3 x 2 A inicializao feita da seguinte forma: 38

Sintaxe: <tipo> <nome>[<M>][<N>] = { {<0 0>,<0 1>,...<0 N-1>}, {<1 0>,<1 1>,...<1 N-1>}, ......... {<M-1 0>,<M-1 1>,...<M-1 N-1>} } Exemplo: int m[3][2] = { {0,1}, {2,3}, {4,5} };

5.8 - Matrizes bidimensionais e funes Tode matriz passada como parmetro de uma funo passada por referncia. Sintaxe: <tipo_funo> <nome_funo>( <tipo_matriz> <nome_matriz>[<dim 1>][<dim 2>]) { ... } apenas a primeira dimenso pode ser omitida <tipo_funo> <nome_funo>( <tipo_matriz> <nome_matriz>[ ][<dim 2>]) { ... } A chamada feita passando-se apenas o nome da matriz. #include <stdio.h> #include <conio.h> Exemplo: void PrintMatriz (int M[][3]) { for (int i=0; i<3; i++) { for (int j=0; j<3; j++) printf("%d ",M[i][j]); printf("\n"); } } void main() { int A[3][3] = {{11,12,13},{21,22,23},{31,32,33}}; PrintMatriz(A); } 39

5.9 - Matrizes de strings Uma matriz de string uma matriz bidimensional de caracteres, onde a primeira dimenso diz o nmero de strings e a segunda dimenso dita o tamanho mximo para cada string. Exemplo: char s[10][80]; // declara uma matriz com 10 strings de tamanho 80. A inicializao da matriz de strings pode ser feita utilizando-se duas sintaxes. Exemplo: char s[2][5] = { {c, a, s, a, \0}, {c, a, m, a, \0} }; ou char s[2][5] = { casa, cama }; OBS: Cada elemento (string) pode ser referido pelo primeiro ndice. #include <stdio.h> #include <string.h> Exemplo: void PrintString (char str[][80]) { for (int j=0; char s[2][5] = { casa, cama }; j<3; j++) printf("\n%s ",str[j]); printf(%s, s[0]); // imprime: casa } void main() { char s[3][80]; for(int i=0; i<3; i++) { printf("\nDigite s[%d]: ",i); gets(s[i]); } PrintString(s); } 40

Exemplo:

41

UNIDADE 6 - PONTEIROS Um ponteiro um endereo de memria. Uma varivel do tipo ponteiro uma varivel cujo contedo um endereo de memria, que por sua vez o endereo de outra varivel. Neste caso dizemos que a primeira um ponteiro para a segunda.

Endereo 5000 5001 5002 5003 5004 5005 5006 5007

Contedo 5005

Nome a

OBS: A varivel a um ponteiro para a verivel b, pois contm o seu endereo.

3.1416

Uma varivel do tipo ponteiro deve ser declarada como tal, ou seja, uma varivel capaz de guardar um endereo de memria. A sintaxe de declarao de ponteiros : <tipo_apontado> *<nome>; Exemplo: int *q; // q um ponteiro para um inteiro.

6.1 - Operadores de ponteiro & - retorna o endereo de uma varivel. Exemplo: int n; // declara inteiro int *p; // declara ponteiro para inteiro p = &n; // p recebe o endereo da varivel n

* - retorna o contedo da varivel apontada por um ponteiro

42

Exemplo: int n, m; // declara 2 inteiros int *p; // declara ponteiro para inteiro p = &n; // p recebe o endereo da varivel n m = *p; // m recebe o contedo de n Exemplo: #include <stdio.h> void main() { int var1,var2; int *p; var1=100; p=&var1; var2=*p; printf("var1=%d\nvar2=%d",var1,var2); }

6.2 - Aritmtica de ponteiros Incremento/decremento:

Endereo 5000 5001 5002 5003 5004

Contedo 5003

Nome p a b

p++; // incrementa o contedo de p, ou seja, incrementa o endereo. P continha 5003, apontando para a. Se p passa a conter 5004, p est agora apontando para b

Soma/subtrao: Endereo 5000 5001 5002 5003 5004 Contedo 5002 Nome p a b c OBS: P aponta para a. (p+1) aponta para b (p+2) aponta para c 43

6.3 - Ponteiros e matrizes Os elementos de uma matrize so alocados consecutivamente na memria do computador, permitindo que sejam indexados por ponteiros.

Endereo 5000 5001 5002 5003 5004

Contedo 5002

Nome p x[0] x[1] x[2]

p=x; // p recebe o end. De x[0] p aponta para x[0]. (p+1) aponta para x[1] (p+2) aponta para x[2]

#include <stdio.h> void main() { int x[10] = {10,11,12,13}; int a, *p; p=x; a=*p; // a=11 printf("\n%d",a); a=*(p+2); // a=12 printf("\n%d",a); a=*p++; // a=10, *p=11 printf("\n%d",a); }

UNIDADE 7 - ESTRUTURAS Estruturas so tipos de dados heterogneos, definidos pelo usurio, referenciado por um nome.

7.1 - Declarao 44

Sintaxe: struct <nome> { <declarao das variveis, chamadas MEMBROS da estrutura> }; Para definir uma varivel do tipo criado devemos simplesmente declar-la como sendo daquele tipo: struct TipoAluno { char nome[80]; int matricula; }; ....... TipoAluno Aluno1; // define varivel Aluno1 do tipo TipoAluno. possvel definir a varivel na hora da definio da estrutura: struct TipoAluno { char nome[80]; int matricula; }Aluno1, Aluno2; A estrutura pode no ter nome. Neste caso varivel tem que ser criada quando da declareo da estrutura struct { char nome[80]; int matricula; }Aluno3; 7.2 - Acesso aos membros (variveis) da estrutura Sintaxe: <varivel>.<membro>;

45

Exemplo: TipoAluno A1; gets(A1.nome); A1.matricula = 1234; i = A1.matricula;

7.3 - Atribuio de estruturas A atribuio direta, bastando a utilizao do operador de atribuio. Exemplo: A2 = A1; // A2.nome recebe A1.nome e A2.matricula recebe A1.matricula.

7.4 - Estruturas e funes As estruturas so passadas por valor. Sintaxe: void Print(struct TipoAluno Aluno) { printf(\n%s,Aluno.nome); printf(\n%d,Aluno.matricula); } ou, sem a palavra struct #include <stdio.h> void Print(TipoAluno Aluno) { struct TPonto { printf(\n%s,Aluno.nome); int x,y; printf(\n%d,Aluno.matricula); }; } Exemplo: void Print(struct TPonto ponto) { printf("\n(%d,%d)",ponto.x,ponto.y); } void main() { TPonto p; printf("\nx: "); scanf("%d",&p.x); printf("\ny: "); scanf("%d",&p.y); Print(p); }

46

7.5 - Ponteiros para estruturas Exemplo: TPonto *Ponto; Acesso aos membros: Exemplo: (*Ponto).x; ou, utilizando sintaxe especial: Ponto->x;

47

UNIDADE 8 - TPICOS EM C++ A linguagem C++ foi criada a partir do C, com objetivo de proporciomar as ferramentas necessrias para facilitar a programao orientada a objetos (POO). Programao Orientada a Objetos (POO) uma nova forma de programao que se baseia na utilizao de entidades chamadas objetos, que renem dados e procedimentos. Objetos so variveis de um determinado tipo que pode ser definido pelo usurio, chamado classe. Portanto, classe uma abstrao que caracteriza um grupo de objetos, ou seja, a estrutura onde se definem dados e funes comuns a certo grupo de objetos. A POO baseia-se em trs caractersticas principais: Encapsulamento, que o fato de se reunir e dados e funes em uma nica estrutura. Isto possibilita maior controle de acesso aos dados atravs de funes especializadas. Polimorfismo, que o fato de se poder utilizar um mesmo identificador assumindo vrias formas diferentes. Por exemplo, funes com o mesmo nome que realizam tarefas diferentes (sobrecarga de funes). Herana, que o fato de se poder cirar novas classes derivadas de classes j existentes, herdando suas caractersticas (dados e funes). O aspecto importante da herana o reaproveitamento de cdigo que proporciona.

8.1 - Criando uma classe em C++ Criar uma classe como criar um tipo definido pelo usurio (como uma estrutura - struct), mas que contm alm da declarao de variveis (dados), que a partir de agora denominaremos atributos da classe, declarao de funes, doravante chamadas mtodos da classe. A criao de uma classe em C++ feita utilizando-se a palavra reservada class, seguindo a seguinte sintaxe bsica: class <nome> { <declarao de variveis> 48

<declarao/implementao de funes> }; O paradigma da POO diz que os atributos (que so as caractersticas do objeto) devem estar escondidos, sendo acessados apenas pelos mtodos (que podero controlar o acesso). Para tal temos as palavras reservadas private para dizer que algo (no caso, os atributos) privativo da classe, e public para deizer que algo (no caso os mtodos) pblico. Desta forma podemos a nossa classe fica: class <nome> { private: <declarao de variveis> public: <declarao/implementao de funes> }; OBS: Vale lembrar que atributos privativos e mtodos public so recomendaes da POO. Exemplo de classse: Classe Aluno class Aluno { private: char nome[80]; int matricula; float nota[3]; public: void Dados(char n[],int m, float nt[]) { strcpy(nome,n); matricula = m; for (int i = 0; i<3; i++) nota[i] = nt[i]; } float Media() { return (nota[0]+ nota[1]+ nota[2])/3; } void Print() { cout << nome << matricula << Media(); cout << nota[0] << nota[1] << nota[2]; } }; OBS: cout o objeto utilizado para imprimir dados na tela.

49

8.2 - Criao de um objeto A criao de um objeto feita pela simples declarao de uma vrivel de uma determinada classe. O exemplo a seguir cria um objeto aluno1 da classe Aluno. Ex: Aluno aluno1;

8.3 - Acesso aos mtodos O acesso aos membros feito utilizando-se o nome do objeto, um ponto e o nome do mtodo. Ex: char n[10]=Claudio; int m=1234; float nt[3]={9.0,8.0,9.0}; Aluno aluno1; aluno1.Dados(n,m,nt); aluno1.Print(); Obs: No podemos acessar membros private (por exemplo, os atributos) Ex: aluno1.Matricula; => ERRADO !!!

8.4 - Atribuio de Objetos A atribuio entre objetos de uma mesma classe direta. Ex: Aluno, aluno1, aluno2; ......... 50

aluno1 = aluno2; Obs: Todos os atributos de aluno1 recebero os valores dos atributos de aluno2.

8.5 - Entradas e Sadas bsicas So feitas atravs dos objetos cin e cout, definidos em iostream.h. Leitura: cin >> varivel; Escrita: cout << varivel ou constante; Ex: int i; cout << Digite o valor de i: ; cin >> i; cout << \nO valor de i eh << i; class Aluno { private: char 8.6 - Sobrecarga de funes nome[80]; int matricula; float nota[3]; public: o fato de se poder definir famlias de funes diferentes, mas que possuem o mesmo nome. void Dados(char n[],int m, float nt[]) { strcpy(nome,n); matricula = m; for (int i = 0; i<3; i++) nota[i] = nt[i]; } void Dados() { cout << Nome: ; gets(nome); Ex: cout << Matricula: ; cin >> matricula; for(int i=0; i<3; i++) cin >> nota[i]; } float Media() { return (nota[0]+ nota[1]+ nota[2])/3; } void Print() { cout << nome << matricula << Media(); cout << nota[0] << nota[1] << nota[2]; } }; 51

Obs: Funes sobrecarregadas devem ter lista de parmetros diferentes, pois a forma que o compilador utiliza para identificar qual funo deve executar. Ex: char n[10]=Claudio; int m=1234; float nt[3]={9.0,8.0,9.0}; Aluno aluno1; aluno1.Dados(n,m,nt); // executa a primeira class Aluno { aluno1.Dados(); // executa a segunda private: char nome[80]; int matricula; float nota[3]; public: Aluno(char n[],int m, float nt[]) { strcpy(nome,n); matricula = m; for (int i = 0; i<3; i++) nota[i] = nt[i]; 8.7 - Construtores } Aluno() { cout << Nome: ; gets(nome); So funes especiais executadas automaticamente sempre que um objeto criado. Por ser cout << Matricula: ; cin >> matricula; executado automaticamente pelo for(int i=0; i<3;chamado explicitamente), o construtor no retorna sistema (no i++) valor. O construtor precisa ter o mesmocin >> nota[i]; para ser identificado pelo compilador, e nome da classe } como qualquer outra funo, pode ser sobrecarregado. float Media() { return (nota[0]+ nota[1]+ nota[2])/3; } Obs: Uma classe pode ter 0, 1 ou vrios construtores. void Print() { cout << nome << matricula << Media(); cout << nota[0] << nota[1] << nota[2]; } }; 52

8.8 - Destrutores So mtodos executados automaticamente sempre que um objeto deixa de existir. Os destrutores no recebem parmetros e no podem ser sobrecarregados. identificado por possuir o mesmo nome da classe precedido de um til (~). class Aluno { private: char nome[80]; int matricula; float nota[3]; public: ~Aluno() { cout << Fim do objeto; } ......................... };

53

8.9 - Herana o meio pelo qual se pode derivar novas classe a partir de classes j existentes, herdando suas caractersticas, ou seja, sem necessidade de reescrever o cdigo que se deseja aproveitar. Sintaxe: class <classe derivada> : <especificador> <classe base> { ........... }; Obs: Para que se herde membros de uma classe necessrio que estes sejam declarados com protected , ao invs de private, ou public.

Ex: // Classe base class Pessoa { protected: char nome[80]; int idade; int identidade; public: void Registrar (char n[],int id, int ident) { strcpy(nome,n); idade = id; identidade = ident; } }; // Classe derivada class Aluno : public Pessoa{ private: int matricula; float nota[3]; public: ......................... };

54

55

REFERNCIAS [1] Peter Aitken e Bradley Jones, Guia do Programador C Srie Tutorial, Ed. Berkeley, 1994. [2] Victorine Viviane Mizrahi, Treinamento em Linguagem C, Mdulos 1 e 2, Ed. Makron Books. O QUE UM CONTRUTOR EX AS DUAS 1 PG DE JAVA CONCEITOS DO QUE CLASSE CONCEITO P.O.O CARACTERISTICAS DA LING JAVA SINTAXE P.O.O EM JAVA + CONCEITOS P.O.O EX DE CONTRUTOR PUBLIC XPTO { . . . } } EX. CLASSE PUBLIC CLASS XPTO { . . . }

56

Вам также может понравиться