Vous êtes sur la page 1sur 25

02/08/2011

Algoritmos e Programao de Computadores


3 Bimestre 2011
Prof. Ederson Cichaczewski, MSc

Universidade Positivo

Contrato Didtico 3 Bimestre


Trabalho Jogo Pac-Man 5,0 pontos (em dupla, descrio no portal - atividade APS), apresentao em 2 etapas. Exerccios 0,5 ponto extra (2 listas - 0,25 cada)
(individual entregue via portal em entrega de trabalhos como atividade prtica supervisionada - APS)

Prova Bimestral 5,0 pontos (individual) Questo na prova bimestral sobre o livro (1,0 ponto).

02/08/2011

Contrato Didtico 3 Bimestre


Alternar aula terica e de laboratrio. Atividades prticas supervisionadas:
Realizadas fora de sala (exerccios, trabalho) com entrega via portal.

Atendimento aos alunos fora de sala:


Professor no horrio de permanncia e e-mail. Aluno de monitoria.

Trazer para aulas livro da biblioteca e material das aulas. Caso a prova bimestral seja perdida por motivo de fora maior, possvel substituir a nota da prova na segunda chamada, realizada aps as provas do 4 bimestre. Horrio de entrada: tolerncia mxima de 15 minutos. Caso ultrapasse, o aluno poder entrar somente na 2 aula.

Funes grficas do C
Escrita formatada em cores: cprintf() Biblioteca: conio.h Declarao: int cprintf (const char* st_contr [,lista_arg]); Propsito: Esta funo cprintf() (color print formated) permite a sada de dados numricos, caracteres e strings usando cores. O uso da funo cprintf() semelhante a printf()porm permite que a sada seja a cores. Para que a sada seja colorida necessrio definir as cores de fundo e de letra para a impresso antes do uso da funo.

02/08/2011

Definio das Cores


Atributo FOREGROUND_BLUE FOREGROUND_GREEN FOREGROUND_RED FOREGROUND_INTENSITY BACKGROUND_BLUE BACKGROUND_GREEN BACKGROUND_RED BACKGROUND_INTENSITY Significado Text color contains blue. Text color contains green. Text color contains red. Text color is intensified. Background color contains blue. Background color contains green. Background color contains red. Background color is intensified.

Biblioteca: wincon.h Pode-se combinar as cores para formar outras, fazendo uma operao de OU bit a bit (|).

Aplicao das cores


As definies das cores so aplicadas pela funo SetConsoleTextAttribute,cuja sintaxe : SetConsoleTextAttribute(HANDLE hConsoleOutput, WORD wAttributes);

onde hConsoleOutput o manipulador da tela. wAttributes a especificao da cor do texto e do fundo. Estes valores de cor so representadas por constantes simblicas definidas na biblioteca wincon.h. Para obter o handle da tela, necessrio usar a funo GetStdHandle(STD_OUTPUT_HANDLE), recebendo em uma varivel do tipo HANDLE.

02/08/2011

Exemplo
O trecho de programa abaixo imprime uma mensagem de alerta em verde sobre fundo vermelho. #include <stdio.h> #include <windows.h> #include <wincon.h> void main() { HANDLE hOut; hOut = GetStdHandle(STD_OUTPUT_HANDLE); SetConsoleTextAttribute(hOut, FOREGROUND_GREEN | FOREGROUND_INTENSITY | BACKGROUND_RED); cprintf("Alerta: Virus Detectado!"); getch(); }

Sada Sonora
Beep(freq, tempo); Biblioteca: windows.h A funo Beep ativa o alto-falante do PC com uma frequncia freq (Hz) e de durao tempo (milisegundos).

02/08/2011

Exemplo
#include <stdio.h> #include <conio.h> #include <windows.h> #include <wincon.h> void main() { HANDLE hOut; hOut = GetStdHandle(STD_OUTPUT_HANDLE); SetConsoleTextAttribute(hOut, FOREGROUND_GREEN | FOREGROUND_INTENSITY); cprintf("Alguns sons..."); Beep( 750, 500 ); Beep( 1750, 500 ); Beep( 2750, 500 ); Beep( 1050, 500 ); getch(); }

Limpeza da Tela
system(cls); Biblioteca: windows.h Conceitos:
A funo system com o parmetro cls limpa a janela de tela e posiciona o cursor na primeira linha e primeira coluna da janela (canto superior esquerdo da janela).

02/08/2011

Aguardando um Tempo
Sleep(tempo); Biblioteca: windows.h Conceitos:
Esta funo Sleep faz com que a execuo do programa aguarde (fique parada) durante um tempo em milisegundos.

Posicionamento do Cursor
gotoxy() Conceito:
Em modo texto padro, a tela dividida em uma janela de 25 linhas e 80 colunas. A funo gotoxy() permite posicionarmos o cursor em qualquer posio (pos_x,pos_y) da tela. Sendo que a posio (1,1) corresponde ao canto superior esquerdo da tela e a posio (80,25) corresponde ao canto inferior direito. Como as funes printf() e cprintf()escrevem a partir da posio do cursor, podemos escrever em qualquer posio da tela.

02/08/2011

Posicionamento do Cursor
necessrio implementar no cdigo a funo gotoxy, criando uma varivel do tipo COORD e usando a funo SetConsoleCursorPosition, da seguinte forma:
void gotoxy(int x, int y) { COORD c; c.X = x - 1; c.Y = y - 1; SetConsoleCursorPosition (GetStdHandle(STD_OUTPUT_HANDLE),c); }

Redimensionamento da Janela
SetConsoleScreenBufferSize(handle, coordenadas); Biblioteca: windows.h Conceito:
Esta funo permite redefinir a janela de texto. As coordenadas so definidas pelo tamanho da janela em largura (X - colunas) e altura (Y - linhas). necessrio declarar uma varivel do tipo struct COORD, esta varivel ter duas variveis internas: X e Y, acessando-as com ponto, ex: var.X e var.Y.

02/08/2011

Exemplo:
#include <stdio.h> #include <windows.h> #include <wincon.h> void gotoxy(int x, int y) { COORD c; c.X = x - 1; c.Y = y - 1; SetConsoleCursorPosition (GetStdHandle(STD_OUTPUT_HANDLE), c); } void main() { HANDLE hOut; COORD coord; hOut = GetStdHandle(STD_OUTPUT_HANDLE); SetConsoleTextAttribute(hOut, FOREGROUND_GREEN | FOREGROUND_INTENSITY); cprintf("Janela padrao...\n\n"); Beep( 750, 500 ); coord.X=90; coord.Y=40; cprintf("Espera 2 segundos, limpa a tela, redimensiona e vai para o meio da janela..."); Sleep(2000); system("cls"); SetConsoleScreenBufferSize(hOut, coord); gotoxy(45,20); Beep( 2750, 500 ); cprintf("Pronto..."); getch(); }

Monitorao de teclado
kbhit() Biblioteca: conio.h Declaraes: int kbhit(void); Propsito:
Esta funo (keyboard hitting) permite verificar se uma tecla foi pressionada ou no. Esta funo verifica se existe algum cdigo no buffer de teclado. Se houver algum valor, ela retorna um nmero no nulo e o valor armazenado no buffer pode ser lido com a funo getch(). Caso nenhuma tecla seja pressionada a funo retorna 0. Observe que, ao contrrio de getch(), esta funo no aguarda que uma tecla seja pressionada.

02/08/2011

Exemplo
void main() { char c; Beep( 2750, 500 ); printf("Preenchendo... (aperte p para parar): \n"); while(1) { printf("$"); if(kbhit()) { c=getch(); if(c=='p')break; else printf(#"); } Sleep(500); }; getch(); }

Nmeros Aleatrios
rand() Biblioteca: stdio.h Conceito:
Gera um pseudo nmero randmico. necessrio iniciar a seed com a funo srand usando a hora atual, para que sejam gerados sempre nmeros aleatrios diferentes.

02/08/2011

Nmeros Aleatrios
Exemplo:
#include <stdio.h> #include <windows.h> #include <time.h> void main() { int num, pen; printf("Tente adivinhar o numero que estou pensando ate 20...\n"); scanf("%d",&num); srand(time(NULL)); pen = rand()%20; if(num==pen)printf("Voce acertou!!!"); else printf("Voce errou, o numero era %d",pen); getch(); }

Endereos e Ponteiros
O endereo uma referncia ao contedo da posio da memria, representado pelo caractere &. Por exemplo:
& "o endereo de" . Ex. : a = &b. a recebe o endereo da varivel b.

O ponteiro uma varivel que armazena endereo. Dependendo do tipo do dado do qual se quer guardar o endereo, deve-se declarar o ponteiro com o mesmo tipo. Para declarar uma varivel que um ponteiro, utiliza-se o caractere * (asterisco) na frente do nome da varivel. Por exemplo: int *pt;

10

02/08/2011

Endereos e Ponteiros
Sintaxe da declarao de um ponteiro: tipo_de_dado *identificador_ponteiro; Exemplo: int *p, *t, i; p=&i; t=p;
No cdigo acima, p e t podem armazenar endereos de variveis do tipo inteiro. Tambm pode-se dizer que p e t apontam para um inteiro. Neste caso o ponteiro p recebeu o endereo da varivel i; logo em seguida o ponteiro t recebeu o endereo de i que estava armazenado no ponteiro p.

Endereos e Ponteiros
Exemplo: Neste exemplo, uma varivel que est alocada na posio 1001 possui como contedo, o valor 1100; este valor o endereo de uma outra posio de memria, que possui uma informao armazenada, por exemplo, o caracter 'A'. Ento neste exemplo, diz-se que a varivel da posio 1001 aponta para a varivel da posio 1100, e ambas tem o mesmo contedo, a letra'A'

11

02/08/2011

Endereos e Ponteiros
Ateno:
Ao manipular o contedo de um ponteiro (endereo) no necessrio utilizar o asterisco. Mas para acessar o contedo de uma varivel que um ponteiro representa, utiliza-se o asterisco (*).

Cuidados:
O principal cuidado ao se usar um ponteiro deve ser: saiba sempre para onde o ponteiro est apontando. Isto inclui: nunca use um ponteiro que no foi inicializado. Este programa compilar e rodar. O que acontecer? Ningum sabe. O ponteiro p pode estar apontando para qualquer lugar. Voc estar gravando o nmero 13 em um lugar desconhecido.

Expresses com Ponteiros


Ponteiros podem aparecer em expresses. A precedncia do asterisco (*) representando um ponteiro maior do que as operaes aritmticas. Podem ser realizadas operaes aritmticas, lgicas, incremento e decremento. H entretanto operaes que voc no pode efetuar num ponteiro. Voc no pode dividir ou multiplicar ponteiros, adicionar dois ponteiros, adicionar ou subtrair floats ou doubles de ponteiros.

12

02/08/2011

Expresses com Ponteiros


Exemplos: p++; p--; se voc incrementa um ponteiro char* ele anda 1 byte na memria e se voc incrementa um ponteiro double* ele anda 8 bytes na memria. O decremento funciona semelhantemente. Caso queira, por exemplo, incrementar o contedo da varivel apontada pelo ponteiro p, faz-se: (*p)++;

Expresses com Ponteiros


Exemplos: Para incrementar um ponteiro de 16: p=p+16; ou p+=16;

Se quiser usar o contedo 16 posies adiante: *(p+16); A subtrao funciona da mesma maneira. Pode-se querer comparar dois ponteiros, saber se so iguais, maior ou menor, utiliza-se os operadores ==, !=, >, <, >=, <=.

13

02/08/2011

Expresses com Ponteiros


Em resumo: ++p --p p++ p-*p p+i p-i p-q Pr-incrementa o valor do ponteiro Pr-decrementa o valor do ponteiro Ps-incrementa o valor do ponteiro Ps-decrementa o valor do ponteiro Acessa o contedo do endereo apontado por p Soma de um ponteiro com um inteiro Subtrao de um inteiro sobre o ponteiro Subtrao entre ponteiros desde que apontem para o mesmo vetor

Ponteiros e Vetores
Quando se declara um vetor, automaticamente criado um ponteiro para este vetor, que o nome do vetor. Ex: int vet[10]; vet um ponteiro Este ponteiro tem o mesmo tipo do vetor O compilador reserva na memria o tamanho de bytes necessrios, dado por: tamanho_vetor x tamanho_tipo O ponteiro aponta para o primeiro elemento do vetor.

14

02/08/2011

Ponteiros e Vetores
Para acessar o contedo de um vetor, utiliza-se a indexao: nome_vetor[indice] Utilizando ponteiro, o equivalente : *(nome_vetor+indice) Como o ponteiro apronta para o primeiro elemento do vetor, temos: *nome_vetor equivalente a nome_vetor[0] Para saber o endereo do vetor, usa-se: &nome_vetor[0] ou somente nome_vetor

Ponteiros e Vetores
Ateno:
O ponteiro representado por um vetor no pode ter seu endereo alterado como uma varivel ponteiro!

Por exemplo:
int vetor[10]; int *ponteiro, i; ponteiro = &i; /* as operacoes a seguir sao invalidas */ vetor = vetor + 2; vetor++; vetor = ponteiro; /* ERRADO: vetor nao e' variavel */ /* ERRADO: vetor nao e' variavel */ /* ERRADO: vetor nao e' variavel */

15

02/08/2011

Ponteiros e Vetores
Um exemplo correto seria:
int vetor[10]; int *ponteiro; /* as operacoes abaixo sao validas */ ponteiro = vetor; /* CERTO: ponteiro e' variavel */ ponteiro = &vetor[0]; /* CERTO: ponteiro e' variavel */ ponteiro = vetor+2; /* CERTO: ponteiro e' variavel */

Ponteiros e Matrizes
Ao se declarar uma matriz, o nome da matriz tambm um ponteiro para o seu primeiro elemento, ou seja, armazena o endereo do seu primeiro elemento. No caso da matriz necessrio associar ao seu nome o ndice [0] para atribuir seu endereo a um ponteiro. Exemplo: int mat [10][10]; Temos que: mat[0], equivale a &mat[0][0] mat[0][4], pode ser acessado por *(mat+3) mat[1][2], pode ser acessado por *(mat+12)

16

02/08/2011

Vetores de Ponteiros
Pode-se declarar um vetor de ponteiros, da seguinte forma: tipo *nome_vetor[tamanho] Por exemplo, um vetor de ponteiros do tipo int de nome vetpont de 15 elementos: int *vetpont[15];

Ponteiros de Ponteiros
Um ponteiro para outro ponteiro uma forma de indicao mltipla, tambm conhecida como indireo mltipla. Um endereo contem outro endereo, que por sua vez aponta para uma varivel. Sintaxe: tipo **pontpont; tipo ***pontpontpont; Exemplo: float **bala; bala um ponteiro para um ponteiro float.

17

02/08/2011

Alocao Dinmica de Memria


Forma diferenciada do compilador armazenar informaes na memria alm da utilizao de variveis globais e locais. Permite criar variveis em tempo de execuo, ou seja, alocar memria para novas variveis quando o programa est sendo executado. Pode-se tambm liberar a memria dessas variveis criadas em tempo de execuo.

Alocao Dinmica de Memria


Sintaxe:
ponteiro = (tipo_dado *)malloc(unsigned int num_bytes); A funo malloc() devolve um ponteiro para o primeiro byte de uma regio de memria de tamanho num_bytes. Caso no haja memria suficiente, malloc devolve um ponteiro NULL (nulo), ou seja, sempre deve ser verificado se no devolvido um ponteiro nulo antes de usar a memria requisitada. Para especificar o nmero de bytes de acordo com o tipo a ser alocado, utiliza-se a funo sizeof(tipo_dado). Ao terminar de usar a varivel alocada, pode-se liberar a memria que havia sido reservada para ela utilizando-se a funo free().

18

02/08/2011

Alocao Dinmica de Memria


H outra forma de alocar memria, utilizando a funo calloc(), que possui a seguinte sintaxe:
ponteiro = (tipo_dado *)calloc(unsigned int num_elem, unsigned int tam_bytes);

Ser alocado um espao igual a num_elem * tam_bytes. Caso no haja memria suficiente, calloc devolve um ponteiro nulo, portanto, sempre deve ser verificado se no devolvido um ponteiro nulo antes de usar a memria requisitada.

Alocao Dinmica de Memria


Tambm possvel alterar o tamanho de um espao alocado utilizando a funo realloc(). Que possui a seguinte sintaxe:
ponteiro = (tipo_dado *)realloc(ponteiro, unsigned int novo_num_bytes);

O novo tamanho alocado pode ser maior ou menor que o original. Se no houver memria suficiente para a alocao, um ponteiro nulo devolvido e o bloco original deixado inalterado. No necessariamente preciso ter o ponteiro para uma alocao previamente feita com malloc ou calloc.

19

02/08/2011

Funes e Ponteiros
Passagem de parmetros por valor J vimos que uma funo pode receber parmetros. Quando esses parmetros so apenas contedos de variveis, dizemos que os parmetros foram passador por valor.
Por exemplo: int Soma(int x, int y){ x = x + y; return(x); } void main(){ int a = 4,b = 5; a = Soma(a,b); }
Apenas os contedos de a e b so passados para x e y. A funo interfere apenas nos valores de x e y, e no diretamente em a ou b.

Funes e Ponteiros
Passagem de parmetros por referncia possvel que a execuo de uma funo altere os contedos de variveis no locais. Para isto deve-se utilizar o * na frente dos parmetros no prottipo da funo. Na chamada da funo usa-se o & na frente dos parmetros. Assim qualquer alterao feita no parmetro se reflete no contedo da varivel. Diz-se ento que a passagem de parmetro foi feita por referncia. O exemplo anterior poderia ser escrito desta forma:
void Soma(int *x, int *y){ // x e y recebem o endereo de a e b *x = *x + *y; } void main(){ int a = 4,b = 5; Soma(&a,&b); // a partir desta linha, a contem a soma de a e b. }

20

02/08/2011

Funes e Vetores
A passagem de vetor como parmetro de uma funo pode ser feita de 3 formas:
No prottipo da funo passado um vetor com abre e fecha colchetes, sem especificar tamanho; No prottipo da funo passado um vetor com abre e fecha colchetes, informando o tamanho do vetor; No prottipo da funo passado um ponteiro para o vetor usando *.

Um vetor sempre passado por referncia, logo, qualquer alterao em seus elementos altera a varivel usada como parmetro na chamada da funo. O ponteiro, a partir do momento que possui o endereo de um vetor, tambm pode ser indexado igual ao vetor. Ex: p[2] equivale a *(p+2).

Funes e Matrizes
A passagem de uma matriz como parmetro de uma funo pode ser feita apenas de 3 formas:
No prottipo da funo passado uma matriz com abre e fecha colchetes no ndice mais esquerda, sem especificar tamanho, e no(s) ndice(s) mais direita com o tamanho especificado; No prottipo da funo passado uma matriz com dois (ou mais) abre e fecha colchetes, informando sempre o tamanho das dimenses da matriz; No prottipo da funo passado um ponteiro para matriz, da seguinte forma: (*nome_matriz)[dimens_dir]

Na chamada da funo, pode-se passar somente o nome da matriz para referenciar o endereo do primeiro elemento da matriz. A matriz tambm sempre passada como referncia.

21

02/08/2011

Funes e Matrizes
Exemplo
#include <stdio.h> int a[4][4] = { {1, 2, 3, 4}, {4, 1, 2, 1}, {1, 2, 1, 4}, {4, 3, 2, 1} }; int b[4] = {1, 1, 1, 1}; void matvet(int a[][4], int b[4], int c[4], int n) {
int i, j, aux; for (i = 0; i < n; i++) { aux = 0; for ( j = 0; j < n; j++) { aux = aux + a[i][j] * b[j]; } c[i] = aux; }

void main() { int c[4], i; matvet(a, b, c, 4); for (i = 0; i < 4; i++) { printf(" c[%d] = %d \n", i, c[i]); } getch(); }

Formas de chamar a funo matvet:


void matvet(int a[4][4], int b[4], int c[4], int n) void matvet(int a[][4], int b[4], int c[4], int n) void matvet(int (*a)[4], int b[4], int c[4], int n)

Alocao Dinmica de Matrizes


O conceito de alocao dinmica de memria visto at agora define uma reserva de memria para uma estrutura tipo vetor. A alocao dinmica de matrizes realizada da mesma forma que para vetores, com a diferena que teremos um ponteiro apontando para outro ponteiro (indireo mltipla). Para uma matriz bidimensional utiliza-se um vetor de ponteiros, e cada ponteiro aponta para o incio de uma linha da matriz.

22

02/08/2011

Alocao Dinmica de Matrizes

Alocao Dinmica de Matrizes


Para realizar a alocao dinmica de memria de uma matriz, utiliza-se 2 passos:
1 Alocam-se as linhas, que so representadas pelo ponteiro declarado com dois asteriscos. 2 Alocam-se as colunas, que so representadas pelo vetor de ponteiros indexado.

Exemplo:
float **v; /* ponteiro para a matriz */ int i,m,n; /* variavel auxiliar */ v = (float **) calloc (m, sizeof(float *)); /* aloca as linhas da matriz */ if (v == NULL) { printf ("** Erro: Memoria Insuficiente **"); return (NULL);} else for ( i = 0; i < m; i++ ) { v[i] = (float*) calloc (n, sizeof(float)); if (v[i] == NULL) { printf ("** Erro: Memoria Insuficiente **"); return (NULL); } }

23

02/08/2011

Alocao Dinmica de Matrizes


Para liberar a memria reservada dinamicamente, utiliza-se tambm 2 etapas:
1 Liberam-se as colunas, que so representadas pelo vetor de ponteiros indexado. 2 Liberam-se as linhas, passando o nome da matriz.

Exemplo:
int i,m; /* variavel auxiliar */ for (i=0; i<m; i++) free (v[i]); /* libera as colunas da matriz */ free (v); /* libera as linhas da matriz */

Alocao Dinmica de Vetor com Funo Retornando Ponteiro


Como importante testar se a alocao deu certo, replicar o cdigo de alocao vrias vezes no cdigo acaba ocupando desnecessariamente muitas linhas de cdigo. Pode-se implementar uma funo para alocao de memria de um vetor. A funo ir retornar um ponteiro para o espao de memria alocado.

24

02/08/2011

Alocao Dinmica de Matriz com Funo Retornando Ponteiro para Ponteiro


Como a alocao dinmica de uma matriz relativamente dispendiosa em termos de cdigo, interessante criar uma funo para realizar a respectiva seqncia de cdigo. Da mesma forma interessante criar uma funo para liberar a memria alocada dinamicamente para uma matriz. Ambas as funes retornam um ponteiro para ponteiro.

25

Vous aimerez peut-être aussi