Você está na página 1de 53

Linguagem Pascal | Rafael Toledo

http://www.rafaeltoledo.net/category/linguagem...

Rafael Toledo
Desenvolvimento de Software, Poemas e o Mundo Interntico

ARQUIVOS DA CATEGORIA: LINGUAGEM PASCAL

Notepad++ e FreePascal Funcionando Como uma IDE


Hoje em dia, assim como quando comecei a estudar programao, usa-se a linguagem Pascal para ensinar programao, principalmente devido a sua sintaxe simples (eu no acho to simples assim, mas enfim). Um dos problemas que eu vejo o fato de possuir um editor + compilador bacanas. Quando estudei, usava o Turbo Pascal. Sem brincadeira era uma tristeza usar aquele dinossauro (que hoje em dia nem roda direito no Windows 7). A apareceu o Free Pascal. Muito bom, um compilador moderno e tudo. Mas a IDE em modo texto uma tristeza Por fim das contas, descobri o Notepad++ para editar os arquivos e usava o compilador do FreePascal na linha de comando pra compilar os fontes. At que Continue lendo! Este post foi publicado em Linguagem Pascal e marcado com a tag configurao, free pascal, ide, notepad em 31/01/2012 [http://www.rafaeltoledo.net/notepad-e-freepascal-funcionando-como-uma-ide/] .

Arquivos
1 de 53 25-10-2013 17:21

Linguagem Pascal | Rafael Toledo

http://www.rafaeltoledo.net/category/linguagem...

Ol pessoal! Aqui estamos ns novamente. Dessa vez, para o ltimo post da srie de programao para iniciantes. Sim, sim, aps 18 posts encerramos essa primeira srie. Mas por uma boa causa: em breve comearemos a srie de posts sobre POO (Programao Orientada a Objetos)! Se voc acompanhou essa srie desde o incio, poder seguir a prxima srie como um complemento desta. Mas sem mais demoras, vamos ao tema desse ltimo post. Nele falaremos sobre a gravao de dados em arquivos, pois de que vale um bom aplicativo se ele no guarda dados? Fechou o programa, perdeu tudo?? Negativo. Aps esse post, voc poder criar programas realmente funcionais, gravando dados em arquivos (binrios ou de texto). Antes de comearmos a ver na programao como as coisas funcionam, precisamos entender o que um arquivo. O arquivo nada mais que um conjunto sequencial de dados em sua forma binria (0 e 1). Na programao, usualmente salvamos o arquivo em dois formatos diferentes: o formato ASCII e o formato binrio. No formato ASCII, os dados so gravados na forma de caracteres, ou seja, caso voc abra o arquivo em um editor de textos (como o Bloco de Notas ou o Gedit), voc poder ver os dados normalmente. Tais tipos de arquivos so teis ao exportar um log, por exemplo. Assim, caso o usurio abra o arquivo, poder ler os dados normalmente. J no tipo binrio, os dados so gravados na forma que se encontram na memria. Por exemplo, vamos supor que um inteiro seja representado por 0x0001A047 na memria. E vamos supor que isso valha 80. Ao gravar no arquivo, voc gravar o correspondente binrio de 80 (alguma coisa parecida com esse nmero hexadecimal). Dessa forma, se algum abrir o arquivo com um editor de textos, no conseguir distinguir muita coisa. Esse tipo de arquivo bom para gravarmos os dados que o aplicativo ir manipular, dificultando alteraes externas por usurios espertinhos. Ficou clara a diferena? Na programao, os arquivos so controlados geralmente por um ponteiro (em C) ou por uma estrutura prpria (em Pascal). Ao abrir um arquivo, o ponteiro localiza-se automaticamente no incio do arquivo. A partir da, vamos ento lendo os dados, especificando a quantidade de informao a ser lida, at chegar ao fim do arquivo. Tal condio obtida atravs de uma funo que indica esse fim do arquivo. Para comearmos a colocar a mo na massa, vamos fazer diferente dessa vez. Vamos criar um programa completo, em Pascal e em C, que demonstrar todos os conceitos que pretendo passar neste post. Ser uma agenda eletrnica, que guardar o nome, a data de aniversrio e o telefone do contato. Nesse aplicativo, ser possvel inserir um contato, buscar um contato, editar um contato e excluir um contato (conceito bsico de CRUD - Create, Read, Update e Delete). Este aplicativo tambm ser um tipo de reviso geral de tudo que vimos at aqui! Logo em seguida, vou explic-lo passo a passo. Primeiro, o programa em Pascal:

2 de 53

25-10-2013 17:21

Linguagem Pascal | Rafael Toledo 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64

http://www.rafaeltoledo.net/category/linguagem...

(* * Aplicativo de Agenda Eletrnica - verso em Pascal * Desenvolvido por Rafael D. Toledo * (rafaeldtoledo@gmail.com) * Baixado de http://striker07.wordpress.com * Compartilhe, use vontade, mas cite a fonte! =) *) program agendaEletronica; uses crt, sysutils; type contato = record nome: string[30]; diaAniversario: integer; mesAniversario: integer; telefone: string[15]; end; function exibirMenu: integer; var opcao: integer; begin clrscr; writeln(' AGENDA ELETRONICA - striker07.wordpress.com'); writeln; writeln(' 1. Inserir Contato'); writeln(' 2. Buscar Contato'); writeln(' 3. Atualizar Telefone'); writeln(' 4. Excluir Contato'); writeln(' 5. Encerrar'); writeln; write(' Digite a opcao desejada: '); readln(opcao); exibirMenu := opcao; end; procedure gravarContato; var meuContato: contato; arquivo: file of contato; begin clrscr; writeln(' AGENDA ELETRONICA - INSERIR CONTATO'); writeln; write(' Nome: '); readln(meuContato.nome); write(' Dia do Aniversario: '); readln(meuContato.diaAniversario); write(' Mes do Aniversario: '); readln(meuContato.mesAniversario); write(' Telefone: '); readln(meuContato.telefone); assign(arquivo, 'contatos.dat'); {$I-} reset(arquivo); {$I+}; if ioresult <> 0 then rewrite(arquivo);

3 de 53

25-10-2013 17:21

Linguagem Pascal | Rafael Toledo 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128

http://www.rafaeltoledo.net/category/linguagem...

if filesize(arquivo) > 0 then seek(arquivo, filesize(arquivo)); write(arquivo, meuContato); close(arquivo); end; procedure buscarContato; var encontrado: boolean; busca: string[30]; meuContato: contato; arquivo: file of contato; begin encontrado := false; clrscr; writeln(' AGENDA ELETRONICA - BUSCAR CONTATO'); writeln; write(' Nome do Contato: '); readln(busca); assign(arquivo, 'contatos.dat'); {$I-} reset(arquivo); {$I+}; if ioresult <> 0 then begin writeln; write(' Nada encontrado no arquivo!'); sleep(1000); end else begin seek(arquivo, 0); while not eof(arquivo) do begin read(arquivo, meuContato); if meuContato.nome = busca then begin encontrado := true; writeln; writeln(' Nome: ', meuContato.nome); writeln(' Aniversario: ', meuContato.diaAniversario, '/', meuContato write(' Telefone: ', meuContato.telefone); sleep(2000); end; end; if encontrado = false then begin writeln; write(' Contato nao encontrado!'); sleep(1000); end; close(arquivo); end; end; procedure atualizarTelefone; var encontrado: boolean; nome: string[30]; telefone: string[15];

4 de 53

25-10-2013 17:21

Linguagem Pascal | Rafael Toledo 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192

http://www.rafaeltoledo.net/category/linguagem...

contatoTemporario: contato; arquivoAntigo, arquivoAtualizado: file of contato; begin encontrado := false; clrscr; writeln(' AGENDA TELEFONICA - ATUALIZAR TELEFONE'); writeln; write(' Nome do Contato: '); readln(nome); write(' Novo Telefone: '); readln(telefone); assign(arquivoAntigo, 'contatos.dat'); {$I-} reset(arquivoAntigo); {$I+}; if ioresult = 0 then begin assign(arquivoAtualizado, 'temp.dat'); {$I-} rewrite(arquivoAtualizado); {$I+}; if ioresult <> 0 then begin writeln; write(' Falha na atualizacao do contato!'); close(arquivoAntigo); sleep(1000); end else begin seek(arquivoAntigo, 0); while not eof(arquivoAntigo) do begin read(arquivoAntigo, contatoTemporario); if nome = contatoTemporario.nome then begin contatoTemporario.telefone := telefone; encontrado := true; end; write(arquivoAtualizado, contatoTemporario); end; close(arquivoAntigo); close(arquivoAtualizado); erase(arquivoAntigo); rename(arquivoAtualizado, 'contatos.dat'); writeln; if encontrado then write(' Atualizacao realizada com sucesso!') else write(' Nao foi possivel encontrar o contato...'); sleep(1000); end; end else begin writeln; write(' Nenhum contato encontrado!'); sleep(1000); end; end; procedure excluirContato; var encontrado: boolean;

5 de 53

25-10-2013 17:21

Linguagem Pascal | Rafael Toledo 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256

http://www.rafaeltoledo.net/category/linguagem...

nome: string[30]; contatoTemporario: contato; arquivoAntigo, arquivoAtualizado: file of contato; begin encontrado := false; clrscr; writeln(' AGENDA TELEFONICA - EXCLUIR TELEFONE'); writeln; write(' Nome do Contato: '); readln(nome); assign(arquivoAntigo, 'contatos.dat'); {$I-} reset(arquivoAntigo); {$I+}; if ioresult = 0 then begin assign(arquivoAtualizado, 'temp.dat'); {$I-} rewrite(arquivoAtualizado); {$I+}; if ioresult <> 0 then begin writeln; write(' Falha na exclusao do contato!'); close(arquivoAntigo); sleep(1000); end else begin seek(arquivoAntigo, 0); while not eof(arquivoAntigo) do begin read(arquivoAntigo, contatoTemporario); if nome <> contatoTemporario.nome then begin write(arquivoAtualizado, contatoTemporario); end else encontrado := true; end; close(arquivoAntigo); close(arquivoAtualizado); erase(arquivoAntigo); rename(arquivoAtualizado, 'contatos.dat'); writeln; if encontrado then write(' Exclusao realizada com sucesso!') else write(' Nao foi possivel encontrar o contato...'); sleep(1000); end; end else begin writeln; write(' Nenhum contato encontrado!'); sleep(1000); end; end; var opcao: integer;

6 de 53

25-10-2013 17:21

Linguagem Pascal | Rafael Toledo 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 E em C: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 begin repeat opcao := exibirMenu; case 1: 2: 3: 4: 5: opcao of gravarContato; buscarContato; atualizarTelefone; excluirContato;

http://www.rafaeltoledo.net/category/linguagem...

begin writeln; write(' Encerrando...'); end else begin writeln; write(' Opcao invalida!'); end end; sleep(1000); until opcao = 5; end.

/* * Aplicativo de Agenda Eletrnica - verso em C * Desenvolvido por Rafael D. Toledo * (rafaeldtoledo@gmail.com) * Baixado de http://striker07.wordpress.com * Compartilhe, use vontade, mas cite a fonte! =) */ #include #include #include #include <stdio.h> <stdlib.h> // Para system() e sleep() (Linux) <string.h> <windows.h> // Para Sleep() - somente se for Windows

struct contato { char nome[30]; int diaAniversario; int mesAniversario; char telefone[15]; }; int exibirMenu(void); void gravarContato(void); void buscarContato(void); void atualizarTelefone(void); void excluirContato(void); int main(void) { int opcao; do {

opcao = exibirMenu(); switch (opcao) {

7 de 53

25-10-2013 17:21

Linguagem Pascal | Rafael Toledo 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101

http://www.rafaeltoledo.net/category/linguagem...

case 1: gravarContato(); break; case 2: buscarContato(); break; case 3: atualizarTelefone(); break; case 4: excluirContato(); break; case 5: printf("\n Encerrando..."); break; default: printf("\n Opcao invalida!"); } Sleep(1000); // Se estiver usando Linux, sleep(1); } while (opcao != 5); } return 0;

int exibirMenu(void) { int opcao; system("cls"); // Se estiver usando Linux, system("clear"); printf("\tAGENDA ELETRONICA - striker07.wordpress.com\n\n"); printf(" 1. Inserir Contato\n"); printf(" 2. Buscar Contato\n"); printf(" 3. Atualizar Telefone\n"); printf(" 4. Excluir Contato\n"); printf(" 5. Encerrar\n\n"); printf(" Digite a opcao desejada: "); scanf("%d", &opcao); } return opcao;

void gravarContato(void) { struct contato meuContato; FILE *arquivo; system("cls"); // Se estiver usando Linux, system("clear"); printf("\tAGENDA ELETRONICA - INSERIR CONTATO\n\n"); printf(" Nome: "); fflush(stdin); gets(meuContato.nome); printf(" Dia do Aniversario: "); scanf("%d", &meuContato.diaAniversario); printf(" Mes do Aniversario: "); scanf("%d", &meuContato.mesAniversario); printf(" Telefone: "); fflush(stdin); gets(meuContato.telefone); arquivo = fopen("contatos.dat", "ab"); if (!arquivo) {

8 de 53

25-10-2013 17:21

Linguagem Pascal | Rafael Toledo 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165

http://www.rafaeltoledo.net/category/linguagem...

arquivo = fopen("contato.dat", "wb");

fwrite(&meuContato, 1, sizeof(struct contato), arquivo); } fclose(arquivo);

void buscarContato(void) { int encontrado = 0; char busca[30]; struct contato meuContato; FILE *arquivo; system("cls"); // Se estiver usando Linux, system("clear"); printf("\tAGENDA ELETRONICA - BUSCAR CONTATO\n\n"); printf(" Nome do Contato: "); fflush(stdin); gets(busca); arquivo = fopen("contatos.dat", "rb");

if (arquivo) { fread(&meuContato, 1, sizeof(struct contato), arquivo); while (!feof(arquivo)) { if (strcmp(busca, meuContato.nome) == 0) { printf("n Nome: %s\n", meuContato.nome); printf(" Aniversario: %d/%d\n", meuContato.diaAniversario, meuCo printf(" Telefone: %s", meuContato.telefone); Sleep(2000); // Se estivar usando Linux, sleep(2); encontrado = 1; break; } fread(&meuContato, 1, sizeof(struct contato), arquivo); } if (!encontrado) { printf("\n Contato nao encontrado!"); Sleep(1000); // Se estivar usando Linux, sleep(1); } fclose(arquivo);

} else { }

printf("\n Nada encontrado no arquivo!"); Sleep(1000); // Se estivar usando Linux, sleep(1);

void atualizarTelefone(void) { int encontrado = 0; char nome[30], telefone[15]; struct contato contatoTemporario; FILE *arquivoAntigo = NULL, *arquivoAtualizado = NULL; system("cls"); // Se estiver usando Linux, system("clear");

9 de 53

25-10-2013 17:21

Linguagem Pascal | Rafael Toledo 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229

http://www.rafaeltoledo.net/category/linguagem...

printf("\tAGENDA TELEFONICA - ATUALIZAR TELEFONE\n\n"); printf(" Nome do Contato: "); fflush(stdin); gets(nome); printf(" Novo Telefone: "); fflush(stdin); gets(telefone); arquivoAntigo = fopen("contatos.dat", "rb"); if (arquivoAntigo) { arquivoAtualizado = fopen("temp.dat", "wb"); if (!arquivoAtualizado) { printf("\n Falha na atualizacao do contato!"); Sleep(1000); // Se estivar usando Linux, sleep(1); return; }

fread(&contatoTemporario, 1, sizeof(struct contato), arquivoAntigo); while (!feof(arquivoAntigo)) { if (strcmp(contatoTemporario.nome, nome) == 0) { strcpy(contatoTemporario.telefone, telefone); encontrado = 1; } fwrite(&contatoTemporario, 1, sizeof(struct contato), arquivoAtualiz fread(&contatoTemporario, 1, sizeof(struct contato), arquivoAntigo); } fclose(arquivoAntigo); fclose(arquivoAtualizado); remove("contatos.dat"); rename("temp.dat", "contatos.dat"); if (!encontrado) { printf("\n Nao foi possivel encontrar o contato..."); } else { printf("\n Atualizacao realizada com sucesso!"); } Sleep(1000); // Se estiver usando Linux, sleep(1); } else { printf("\n Nenhum contato encontrado!"); Sleep(1000); // Se estivar usando Linux, sleep(1); }

void excluirContato(void) { int encontrado = 0; char nome[30]; struct contato contatoTemporario; FILE *arquivoAntigo = NULL, *arquivoAtualizado = NULL; system("cls"); // Se estiver usando Linux, system("clear");

10 de 53

25-10-2013 17:21

Linguagem Pascal | Rafael Toledo 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283

http://www.rafaeltoledo.net/category/linguagem...

printf("\tAGENDA TELEFONICA - EXCLUIR TELEFONE\n\n"); printf(" Nome do Contato: "); fflush(stdin); gets(nome); arquivoAntigo = fopen("contatos.dat", "rb"); if (arquivoAntigo) { arquivoAtualizado = fopen("temp.dat", "wb"); if (!arquivoAtualizado) { printf("\n Falha na exclusao do contato!"); fclose(arquivoAntigo); Sleep(1000); // Se estivar usando Linux, sleep(1); return; }

fread(&contatoTemporario, 1, sizeof(struct contato), arquivoAntigo); while (!feof(arquivoAntigo)) { if (strcmp(contatoTemporario.nome, nome) == 0) { encontrado = 1; } else { fwrite(&contatoTemporario, 1, sizeof(struct contato), arquivoAtu } fread(&contatoTemporario, 1, sizeof(struct contato), arquivoAntigo); } fclose(arquivoAntigo); fclose(arquivoAtualizado); remove("contatos.dat"); rename("temp.dat", "contatos.dat"); if (!encontrado) { printf("\n Nao foi possivel encontrar o contato..."); } else { printf("\n Exclusao realizada com sucesso!"); } Sleep(1000); // Se estiver usando Linux, sleep(1); } else { printf("\n Nenhum contato encontrado!"); Sleep(1000); // Se estivar usando Linux, sleep(1); }

Como podem perceber, um programa razoavelmente grande (quase 300 linhas, em ambas as verses). Para facilitar as explicaes, vamos analisar funo por funo, comeando pela funo principal (Pascal linha 254; C - linha 28). A funo principal do aplicativo no tem nenhum segredo. Declaramos uma varivel chamada opo que armazenar a escolha do usurio sobre o que fazer. Se voc no entendeu alguma

11 de 53

25-10-2013 17:21

Linguagem Pascal | Rafael Toledo

http://www.rafaeltoledo.net/category/linguagem...

coisa do que foi feito aqui, no hesite em voltar nos posts anteriores e reler para entender. Aqui, estou assumindo que voc j compreendeu as tcnicas utilizadas anteriormente nessa srie de posts. Ento, como eu ia dizendo, fazemos uma escolha de acordo com a opo do usurio, chamando a funo correspondente ao que ele escolheu. Essa opo retornada pela funo exibirMenu (Pascal - linha 23; C - linha 62). Esta funo limpa a tela, tambm muito simples, exibe o menu na tela com as opes, l a opo digitada pelo usurio e retorna. Somente isso. Vamos comear a falar da parte importante desse programa, que a manipulao de arquivos em si. Vamos comear pela funo de incluso, a funo gravarContato (Pascal - linha 43; C - linha 80). Nesta funo (estou usando a palavra funo pra generalizar, mas gravarContato um procedimento!), temos duas variveis: um registro, do tipo contato, que declaramos com os campos nome, diaAniversario, mesAniversario e telefone (Pascal - linha 15; C - linha 14), e uma outra varivel representando o nosso arquivo. Em Pascal, definimos que tipo de dados guardaremos no arquivo logo na sua declarao no nosso caso, file of contato, j que guardaremos os contatos nele. J em C, o tipo arquivo mais genrico. Declaramos um ponteiro para o tipo FILE (sim, todas em maisculo). A partir dele, o controle do fluxo para o arquivo todo de nossa responsabilidade. Prosseguindo, na primeira parte, simplesmente lemos os dados do usurio e o colocamos dentro do registro. No ponto em que estamos, no deve haver dvidas sobre isso. O prximo passo, realizarmos a abertura do arquivo. O processo de abertura essencial, pois com ele tomamos o arquivo, impedindo que outras aplicaes o acessem enquanto o estamos manipulando. Em Pascal, isso ocorre neste trecho: 1 2 3 4 assign(arquivo, 'contatos.dat'); {$I-} reset(arquivo); {$I+}; if ioresult <> 0 then rewrite(arquivo);

Primeiramente, ligamos a nossa varivel a um arquivo fsico atravs da funo assign. Logo em seguida, fazemos uma chamada a funo reset, que serve para abrir um arquivo j existente. Circundamos essa chamada com as diretivas de compilao {$I-} e {$I+}, para verificarmos posteriormente se houve erro. Ao usarmos tais diretivas, temos o resultado da operao na varivel ioresult. Caso o valor presente seja diferente de 0, sinal que houve algum erro provavelmente porque o arquivo ainda no existe. Dessa forma, realizamos a abertura com a funo rewrite. Essa funo cria um novo arquivo, independentemente se existe ou no outro com mesmo nome. Caso exista, o mesmo ser sobrescrito por isso, tome certo cuidado ao utilizar tal funo, ou poder perder todos os seus dados! Pronto! O nosso arquivo est, ento, aberto e est aguardando realizarmos alguma coisa com ele. Vamos ver como fica esse mesmo procedimento na linguagem C: 1 2 3 4 arquivo = fopen("contatos.dat", "ab"); if (!arquivo) { arquivo = fopen("contato.dat", "wb");

12 de 53

25-10-2013 17:21

Linguagem Pascal | Rafael Toledo 5 }

http://www.rafaeltoledo.net/category/linguagem...

Temos o nosso ponteiro chamado arquivo, que receber o retorno da funo fopen. Esta funo tem como argumentos o nome do arquivo (no nosso caso, contatos.dat) e em seguida o modo de abertura. Neste caso, utilizamos o modo ab - append & binary, ou seja, queremos adicionar alguma coisa aps o fim do arquivo, que se trata de um arquivo binrio. Caso o retorno da funo seja nulo (NULL) indicando que o arquivo no existe, por isso no possvel adicionar nada ao seu fim, abrimos ento o arquivo para escrita, usando o modo wb - write & binary. Da mesma forma como em Pascal, esse modo sobrescrever ou criar um novo arquivo. Para gravarmos o nosso dado no arquivo, fazemos chamada a uma funo de escrita. Em Pascal, chamamos a funo write, passando pra ela onde iremos gravar (no caso, no arquivo), e o que iremos gravar (no caso, o nosso registro). Porm, antes disso, posicionamos o arquivo no seu fim, atravs da funo seek. Verificamos se o tamanho do arquivo maior que 0 (valor em bytes), e caso positivo, o posicionamos em seu final. Por fim, fechamos o arquivo usando a funo close, que recebe o arquivo como argumento. Em C, no precisaremos realizar o reposicionamento, pois caso o arquivo seja aberto no modo append, ele j estar automaticamente posicionado no fim do arquivo, e caso seja aberto no modo write, porque no h arquivo, ou seja, o dado ser gravado na posio 0. A funo para a gravar o dado um pouco mais complexa que em Pascal. Em C, utilizamos a funo fwrite. Para ela, passamos primeiramente o endereo onde est o dado que desejamos gravar (por isso o &), logo em seguida, quantas vezes iremos gravar a informao (no caso, 1 vez), o tamanho da informao que ser gravada (do tamanho de um registro do tipo contato obtemos tal valor com a funo sizeof) e por fim, onde tal informao ser gravada no arquivo. Por fim, fechamos o arquivo com a funo fclose. Pronto! A nossa informao j est gravada no arquivo contato.dat! Vamos agora analisar o funcionamento da funo buscarContato (Pascal - linha 73; C - linha 110). Temos uma varivel que indica se o contato buscado foi encontrado ou no, uma varivel que ter o nome do contato que est sendo buscado, um registro que armazenar os dados lidos do arquivo e o nosso arquivo. No incio da funo, pedimos ao usurio que digite o nome do contato a ser buscado. Em seguida, abrimos o arquivo para leitura. Em Pascal, caso no seja possvel executar o comando reset, significa que o arquivo no existe exibimos ento uma mensagem de erro ao usurio (Nada encontrado no arquivo). Em C, abrimos o arquivo no modo rb read & binary. Caso a funo de abertura retorne NULL, significa que o arquivo no existe, portanto no possvel l-lo exibimos ento a mensagem de erro. Caso tudo ocorra dentro dos conformes, vamos comear a varrer o arquivo em busca do contato digitado pelo usurio. O que limitar a quantidade de acessos ao arquivo, ser a funo eof (Pascal) ou feof (C). Essa

13 de 53

25-10-2013 17:21

Linguagem Pascal | Rafael Toledo

http://www.rafaeltoledo.net/category/linguagem...

funo retorna verdadeiro caso seja atingido o fim do arquivo. Porm, vale ressaltar uma diferena bsica entre o funcionamento das duas funes. Em Pascal, a funo retornar verdadeiro ao ler-se o ltimo registro, ou seja, eu terei em meu registro o contedo do ltimo registro do arquivo. J em C, a funo retorna verdadeiro quando eu tento ler dados que j ultrapassariam o fim do arquivo. Por exemplo, ao ler o ltimo registro do arquivo, ela no retornaria verdadeiro. Apenas se eu tentar ler mais uma vez! Assim, quando a funo feof me retornar verdadeiro, eu terei lixo no meu registro. por esse motivo que, em Pascal utilizamos o while, com a leitura no incio do corpo da repetio. J em C, realizamos uma primeira leitura fora da repetio, e utilizamos o do-while, com a leitura ao final do corpo da repetio. Em Pascal, para lermos o nosso arquivo, chamamos a funo read, que recebe como parmetros o arquivo de onde os dados sero lidos e o registro onde os dados lidos sero armazenados. J em C, chamamos a funo fread, que possui os mesmos parmetros da funo fwrite, com a uma leve diferena de significado o registro onde sero armazenados os dados lidos do arquivo, a quantidade de leituras (sempre achei isso meio estranho), a quantidade de dados lidos do arquivo, e o arquivo no qual os dados sero lidos. Caso o registro lido corresponda ao que o usurio est procurando, exibimos os dados na tela e setamos a varivel encontrado (nota: achou estranho em C, essa varivel ser inteira? Em C, como nativamente no existe o tipo booleano, as variveis inteiras podem ser consideradas como booleanas, levando-se em considerao a regra: Falso = 0; Verdadeiro != 0. Porm, a partir de sua ltima especificao, o C99, o tipo bool foi especificado, adicionando-se o arquivo de cabealho stdbool.h). Aps atingir o fim do arquivo, verificamos se o registro no foi encontrado para exibirmos a mensagem ao usurio e por fim fechamos o arquivo. Vamos analisar, ento, as ltimas duas funes atualizarTelefone (Pascal - linha 124; C - linha 157) e excluirContato (Pascal - linha 190; C - linha 221). Essas funes permitem diversas formas de implementao. Esta que lhes apresento no a melhor, nem a mais otimizada, mas funciona e acredito que seja a mais simples de entender. Vou explicar a lgica antes de explicar o cdigo. Vamos utilizar dois arquivos. O primeiro, ser o arquivo de entrada, onde esto todos os registros j gravados. O segundo, ser o arquivo de sada, que iremos regravar os dados. Na atualizao, lemos um registro do arquivo de entrada, verificamos se o arquivo a ser atualizado. Se no for, gravamos no arquivo de sada. Se for, atualizamos o telefone e tambm gravamos no arquivo de sada. J na excluso, o processo bastante semelhante. Lemos um registro do arquivo de entrada, verificamos se o registro a ser excludo. Se no for, gravamos no arquivo de sada. Se for, simplesmente o ignoramos e seguimos para o prximo. Ao final do processo, exclumos o arquivo original e renomeamos o arquivo atualizado para o nome que o outro arquivo tinha. Confuso? Talvez um pouco agora no incio. Mas com a prtica, voc entender melhor a lgica e poder criar a sua prpria lgica que pode ser infinitamente melhor que a minha. Analisando o cdigo, temos a varivel indicadora se a atualizao/excluso ocorreu com sucesso, o nome do registro a ser atualizado/excludo, o telefone a ser atualizado (somente na funo

14 de 53

25-10-2013 17:21

Linguagem Pascal | Rafael Toledo

http://www.rafaeltoledo.net/category/linguagem...

atualizarTelefone), o registro temporrio que armazenar os dados a medida com que forem lidos do arquivo, e as duas variveis representando os arquivos. Iniciamos a funo pedindo os dados do usurio, abrimos o arquivo contatos.dat para leitura e o arquivo temp.dat para escrita. Assim, lemos todos os registros, realizamos a anlise, e gravamos tudo no arquivo de sada (temp.dat). Aps isso, fechamos os dois arquivos para que possamos realizar o processo de excluir e renomear. Em Pascal, utilizamos as funes erase que recebe uma varivel vinculada a um arquivo esse vnculo foi criado ao chamarmos a funo assign l no topo da funo. J para renomearmos, chamamos a funo rename, passando o arquivo a ser renomeado e o seu novo nome. Em C, chamamos a funo remove, passando o nome do arquivo a ser excludo, e em seguida a funo rename, passando o nome do arquivo a ser renomeado, seguido pelo novo nome do arquivo. Bom, pode parecer um bocado de informao de uma s vez, mas como j disse antes: somente com a prtica voc vai se familiarizar com tais tcnicas. Eu mesmo posso dizer: quando estava aprendendo, isso me pareceu extremamente complicado, complexo, pra no dizer sem sentido. Mas posso dizer tambm que, ao superar essa etapa (ou este medo?), voc estar preparado para seguir em frente e comear a desbravar temas mais complexos. Agora, pra fecharmos esse post, vou mostrar um exemplo simples de como escrever e ler de um arquivo texto. Em Pascal: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 program arquivoTexto; uses crt; var texto: string[255]; arquivo: text; begin writeln('Vamos escrever uma frase no arquivo.'); assign(arquivo, 'arquivo.txt'); rewrite(arquivo); writeln(arquivo, 'Testando arquivos txt.'); close(arquivo); writeln('Va ate o diretorio e verifique o arquivo.txt'); write('Pressione uma tecla para continuar. . .'); readkey; writeln; writeln('Agora vamos ler o conteudo gravado.'); reset(arquivo); readln(arquivo, texto); writeln('Conteudo do arquivo: '); writeln(texto);

15 de 53

25-10-2013 17:21

Linguagem Pascal | Rafael Toledo 29 30 31 32 33 Em C: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 #include <stdio.h> #include <stdlib.h> int main(void) { char texto[255]; FILE *arquivo; close(arquivo);

http://www.rafaeltoledo.net/category/linguagem...

write('Pressione uma tecla para continuar. . .'); readkey; end.

arquivo = fopen("arquivo.txt", "w"); fprintf(arquivo, "Testando arquivos txt."); fclose(arquivo); printf("Va ate o diretorio e verifique o arquivo.txt\n"); system("pause"); printf("\nAgora vamos ver se o conteudo foi gravado.\n"); arquivo = fopen("arquivo.txt", "r"); fgets(texto, 255, arquivo); printf("Conteudo do arquivo:\n%s\n", texto); fclose(arquivo); system("pause"); printf("\n"); } return 0;

Bom, neste exemplo, simplesmente gravamos uma string em um arquivo e depois lemos novamente e exibimos na tela. Em Pascal, a nica novidade seria o tipo text. Esse tipo representa o arquivo texto, fazendo com que o manipulemos como se fosse a prpria tela ou a entrada do teclado, ou seja, utilizando as funes writeln e readln. Em C, o que diferencia para o uso de arquivos binrios, primeiramente, que no modo de abertura, no temos a letra b. Assim, ao abrir o arquivo para leitura, usamos r, para escrita, usamos w e assim por diante. Para escrever e ler do arquivo, temos verses das funes printf e scanf, com o prefixo f. Dessa forma, usamos fprintf e fscanf da mesma forma que usamos normalmente, s que passando tambm o arquivo como parmetro. Nesse exemplo em especfico, eu usei fgets, j que a nossa frase continha espaos (que o scanf interpreta como fim de linha). Nessa chamada, passamos a varivel que receber o texto, o tamanho mximo de bytes a serem lidos (pra que no ocorra o problema de estourar a capacidade de nossa string), e o arquivo de onde o texto ser lido. Com o gets, a leitura interrompida quando encontra-se um enter ou quebra de linha. No mais, nada de novidade nos programas acima. Bom pessoal, isso. O post ficou longo, demorou pra ficar pronto, mas acho que deve ajudar o pessoal a. Assim, encerramos essa primeira srie de posts. Fico imensamente grato a todos que

16 de 53

25-10-2013 17:21

Linguagem Pascal | Rafael Toledo

http://www.rafaeltoledo.net/category/linguagem...

visitam o blog. Acho que atingi meu primeiro objetivo, que era o de passar o conhecimento que eu tenho em programao de uma forma descomplicada pra quem est comeando. L no primeiro post, em dezembro de 2008, mal sabia eu o quo certo essa ideia daria. Hoje, j temos mais de 16.000 visitas e pretendo aumentar cada vez mais a quantidade de pessoas ajudadas por esse blog. Deixo, por ora, meu muito obrigado, e que continuem acessando, pois em breve, teremos novidades por aqui. Abrao a todos Este post foi publicado em Linguagem C, Linguagem Pascal, Programao para Iniciantes e marcado com a tag arquivo, c, file, pascal, programao em 09/07/2011 [http://www.rafaeltoledo.net /arquivos/] .

Ponteiros
Ol pessoal! Aqui estou eu continuando a nossa srie de posts sobre programao para iniciantes para tratarmos de um assunto bastante delicado: os temidos Ponteiros. Ponteiros so capazes tanto de te dar poder total sobre a sua aplicao, possibilitando manipulaes de memria, casting, e uma poro de coisas, como tambm podem destruir sua aplicao facilmente (e em casos extremos causar erros de memria inclusive no sistema operacional). Hoje em dia, algumas linguagens mais novas (como o Java), aboliram o uso de ponteiros, retirando do programador toda a responsabilidade de alocar memria, desalocar aps o uso (o Java possui um Garbage Collector, ou coletor de lixo). Mas, o que seriam estes tais ponteiros? Ponteiros nada mais so do que variveis cujo o seu contedo um endereo de memria. Como assim? Ele guarda, no um valor propriamente dito uma referncia a algum lugar na memria que, provavelmente, contm algum dado. Mas que tipo de dado? Para o tipo de dados definido na declarao do ponteiro. O que isso significa? Significa que os ponteiros necessitam de um tipo para serem definidos. Em C, podemos definir um ponteiro sem tipo, genrico (utilizando o tipo void). Porm, o uso desse artifcio deve ser bastante ponderado, pois pode acarretar em um comportamento equivocado ou mesmo em erros de memria.

17 de 53

25-10-2013 17:21

Linguagem Pascal | Rafael Toledo

http://www.rafaeltoledo.net/category/linguagem...

Bom, primeiramente, como os ponteiros referem-se a memria, um pouco estranho pensarmos nisso no algoritmo. Se vocs esto acompanhando a nossa srie desde o comeo, j devem estar conseguindo fazer alguns programas bastante funcionais, e devem ter percebido que nem sempre precisamos fazer o algoritmo todo do programa. Processamentos banais, estruturas de repetio simples, naturalmente surgem na cabea do programador. E com o tempo, ao se familiarizarem-se com alguma linguagem de programao, iro pensar j no cdigo. Voltando aos ponteiros, eles serviro para nos auxiliarem em algumas tarefas mais cabeludas onde precisaremos modificar alguma coisa na unha, ou o que a sua imaginao quiser. Alguns dos usos mais comuns de ponteiros so na passagem de parmetros por referncia e na alocao dinmica (em tempo de execuo) de memria. Pra comear, ento, podemos ver um exemplo de ponteiros em Pascal e em C. No seguinte trecho, vamos simplesmente criar um ponteiro, alocar memria para ele, atribuir um valor varivel e escrever na tela. Para fins didticos, tambm vou colocar em pseudo-cdigo (algoritmo), mas como eu disse acima, na minha opinio manipulao de ponteiros em forma algortmica algo meio estranho mas enfim, vamos criar aqui uma notao prpria. Lembre-se que o algoritmo deve ser claro para descrever uma ideia. Portanto, fique vontade para adaptar sua prpria notao. 1 2 3 4 5 6 7 8 9 10 11 1 2 3 4 5 6 7 8 9 10 11 12 13 1 2 3 4 5 6 7 8 9 18 de 53 Algoritmo Alocacao_Dinamica [Declarao de Variveis] ponteiro : ^inteiro [Processamento] alocar(ponteiro) ponteiro^ 10 escreva("Varivel alocada dinamicamente com o valor ", ponteiro^) desalocar(ponteiro) [Fim] program alocacao_dinamica; uses crt; var ponteiro: ^integer;

begin new(ponteiro); ponteiro^ := 10; writeln('Varivel alocada dinamicamente com o valor ', ponteiro^); dispose(ponteiro); end. // Alocao dinmica de memria #include <stdio.h> #include <stdlib.h> // Necessrio para malloc() e free() int main(void) { int *ponteiro; ponteiro = malloc(sizeof(int)); 25-10-2013 17:21

Linguagem Pascal | Rafael Toledo 10 11 12 13 14 15

http://www.rafaeltoledo.net/category/linguagem...

*ponteiro = 10; printf("Varivel alocada dinamicamente com o valor %d", *ponteiro); free(ponteiro); } return 0;

Vamos conhecer a sintaxe e o funcionamento das funes que utilizamos. Primeiramente, declaramos uma varivel ponteiro que, como foi dito acima, declarada de um tipo correspondente. Isso ocorre porque os bits na memria so lidos de maneira diferente dependendo do tipo. Em C, podemos atravs de cast ponteiros, podemos setar um ponteiro de float para ser lido como inteiro umas doideras assim (que eu, particularmente, nunca utilizei). Fazendo algumas brincadeiras com isso, podemos ver como um descuido desses pode causar reaes adversas no programa. Bom, a sintaxe da declarao da mesma forma que uma varivel comum, porm adicionando-se o caractere referente ao ponteiro, que em Pascal representado pelo caracter ^ (acento circunflexo), que na declarao colocado antes do tipo, e na utilizao da varivel, vai aps o nome dela. J em C, a sintaxe consiste no * (asterisco) precedendo o nome da varivel. Perceba que em alguns pontos do cdigo, tambm utilizamos a varivel sem o caractere. Bom, antes de explicarmos o porqu, tambm temos de falar de outro caractere relativo aos ponteiros: o caractere de referncia. Em Pascal, esse caractere o @ (arroba) e em C o & ( comercial). Com essa sopa de caracteres, vamos agora explicar como funcionam e pra que servem tais notaes. Primeiramente, temos o ponteiro sem caractere nenhum. Neste caso (como na primeira linha de cdigo propriamente dito do nosso exemplo), a varivel sem nenhum dos dois caracteres, indica o endereo de memria. Ou seja, naquela linha (utilizando o new ou o malloc), estamos reservando uma rea de memria apontada pela varivel ponteiro. Ento, fixando: sem qualquer caractere, o ponteiro representa um endereo de memria. Por exemplo 0x00AC1D. Em um segundo caso, temos o caractere de contedo: ^ em Pascal e * em C. Esse caractere indica o contedo de. Como assim? Em vez de indicar o local, voc vai utilizar o valor que est armazenado no local indicado pelo ponteiro. Se no tiver nada (ou tiver lixo, como acontece sempre), ele simplesmente vai interpretar o que est l de acordo com o tipo do ponteiro. Por isso sempre bom anular ou inicializar o ponteiro, atravs das constantes nil em Pascal ou NULL em C. J j veremos exemplos de cdigo utilizando isso. Por fim, temos o caractere de referncia @ em Pascal e & em C. Ao utilizar este caractere, obtemos o endereo onde tal varivel armazenada, ou seja, o caractere indica o endereo de alguma varivel. Utilizamos bastante ao atribuirmos, por exemplo, o endereo de uma varivel esttica a um ponteiro (veremos isso em alguns exemplos logo mais). Se utilizarmos tal caractere em um ponteiro, por exemplo, teremos o endereo onde a varivel do tipo ponteiro foi criada, e no o que ela aponta. Meio confuso? Os exemplos a seguir devem ajudar a clarear um pouco as ideias. (nota mental: meu crebro ainda no se acostumou a escrever ideia sem acento!) 1 var

19 de 53

25-10-2013 17:21

Linguagem Pascal | Rafael Toledo 2 3 4 5 6 7 8 9 10 11 12 1 2 3 4 5 6 7 8 9 10 11 12 x : integer; p, q : ^integer; begin x := 10; p := @x; q := p; q^ := p^ + 10; writeln('Resultado: ', p^); end. int main(void) { int x, *p, *q; x = 10; p = &x; q = p; *q = *p + 10; printf("Resultado: %d", *p); return 0;

http://www.rafaeltoledo.net/category/linguagem...

Acima, temos dois exemplos simples demonstrando tudo o que eu falei. Temos x como varivel esttica e p e q como ponteiros. Percebam que em C, ao contrrio de Pascal, possvel declarar ponteiros e variveis estticas na mesma linha. Iniciando nosso programa, atribumos o valor 10 para a varivel x, da maneira convencional mesmo. Em seguida, fazemos com que p aponte para x, passando para p (sem o ^ ou o *) o endereo de x, atravs do operador @ (Pascal) e & (C). Em seguida, q recebe p, ou seja, agora os dois ponteiros so iguais (ambos apontam para x). Depois, o endereo de memria apontado por q (que o mesmo que x), recebe o que tem no endereo apontado por p (tambm x, ou seja, 10), mais 10. Ou seja, agora, x vale 20, e q e p continuam apontando para x. Para ilustrar a situao, elaborei o desenho abaixo que pode ajudar a compreender o que aconteceu.

x recebe 10. q e p ainda no foram inicializados

20 de 53

25-10-2013 17:21

Linguagem Pascal | Rafael Toledo

http://www.rafaeltoledo.net/category/linguagem...

p agora aponta para x.

q recebe p. Agora q e p apontam para x.

o local apontado por q (ou seja, x), receber o valor contido no local apontado por p (tambm x, ou seja, 10) mais 10. No final, x valer 20, pois o local apontado por q.

Sim, as imagens foram feitas no Paint. Mas enfim, percebam que as referncias a uma varivel por dois ponteiros pode ficar realmente confusa! Hahahaha. Mas espero que com essas ilustraes, o entendimento do cdigo descrito acima tenha ficado melhor.

21 de 53

25-10-2013 17:21

Linguagem Pascal | Rafael Toledo

http://www.rafaeltoledo.net/category/linguagem...

Veremos agora, como ficaria a alocao dinmica de um registro. Percebam que ocorre da mesma maneira que uma varivel comum, porm com a diferena que em C, os campos do registro so referenciados no mais com o . mas sim com o operador seta ->. Abaixo, um exemplo de uso de um registro alocado dinamicamente, em Pascal e em C. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 type reg_aluno = record nome : string[30]; idade : integer; end; var aluno : ^reg_aluno;

begin new(aluno); write('Nome do aluno: '); readln(aluno^.nome); write('Idade: '); readln(aluno^.idade); writeln('Dados lidos.'); writeln('Nome: ', aluno^.nome, ' - Idade: ', aluno^.idade); dispose(aluno); end. typedef struct { char nome[30]; int idade; } reg_aluno; int main(void) { reg_aluno *aluno; aluno = malloc(sizeof(reg_aluno)); printf("Nome do aluno: "); scanf("%s", aluno->nome); printf("Idade: "); scanf("%d", &aluno->idade); printf("Dados lidos.\n"); printf("Nome: %s - Idade: %d\n", aluno->nome, aluno->idade); } return 0;

A nica ressalva no cdigo acima, que alguns compiladores podem chiar na utilizao do malloc(), atribuido nossa struct. Caso isso acontea, faa a converso de ponteiros (cast). Dessa forma, a linha ficaria assim: 1 aluno = (reg_aluno*) malloc(sizeof(reg_aluno));

Um outro ponto que devemos frisar aqui, a maneira de zerarmos um ponteiro. Ao fazermos isso, evitamos deixar o ponteiro com lixo, o que pode ocorrer dele acessar alguma rea de memria no permitida, e consequentemente ter o programa encerrado de maneira forada pelo sistema operacional. Dessa forma, ao declararmos um ponteiro, recomenda-se inicializ-lo as-

22 de 53

25-10-2013 17:21

Linguagem Pascal | Rafael Toledo

http://www.rafaeltoledo.net/category/linguagem...

sim: 1 2 3 4 5 1 2 3 var

ponteiro: ^integer;

begin ponteiro := nil; int main(void) { int *ponteiro = NULL; // sim, o NULL em caixa alta!

Para encerrarmos o post, mostrarei um exemplo de como fazer funes que recebem parmetros como refncia. No sabe o que um parmetro passado como referncia? Bom, vamos a uma breve explicao: quando chamamos uma funo, os parmetros so chamados por cpia ou por referncia. Os parmetros por cpia, como foram os j ensinados aqui anteriormente, utilizam uma cpia do valor passado por argumento em seus clculos. Ou seja, se voc passa uma varivel y para uma funo, seu valor no ser alterado, mesmo que y sofra alteraes dentro da funo. J nos parmetros por referncia, a varivel passada como argumento sofre alteraes caso seja alterada dentro da funo. Isso til quando queremos que uma funo retorne mais de um valor (j que com o retorno convencional podemos devolver somente um valor). A seguir, exemplos em Pascal e em C de funes que recebem 2 nmeros e devolvem por referncia os nmeros somados e subtrados. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 1 2 3 4 5 6 7 8 9 10 11 var

num1, num2, soma, subtracao : integer;

procedure aplicarOperacoes(n1, n2: integer; var soma, subt: integer); begin soma := n1 + n2; subt := n1 - n2; end; begin num1 := 5; num2 := 3; aplicarOperacoes(num1, num2, soma, subtracao); writeln('A soma de ', num1, ' e ', num2, ' ', soma, ' e a subtraao ' end. void aplicarOperacoes(int n1, int n2, int *soma, int *subt) { *soma = n1 + n2; *subt = n1 - n2; } int main(void) { int num1, num2, soma, subtracao; num1 = 5;

23 de 53

25-10-2013 17:21

Linguagem Pascal | Rafael Toledo 12 13 14 15 16 17 18 num2 = 3;

http://www.rafaeltoledo.net/category/linguagem...

aplicarOperacoes(num1, num2, &soma, &subtracao);

printf("A soma de %d e %d %d e a subtrao %d.\n", num1, num2, soma, subtr return 0;

Apesar do post sobre ponteiros, perceba que em Pascal no utilizamos ponteiros pra fazermos os parmetros serem passados como referncia. Para isso, basta adicionar a palavra var antes das variveis que sero passadas como referncia. J em C, declaramos os parmetros de referncia como ponteiros, e ao chamarmos a funo, utilizamos o operador & para passarmos a referncia das variveis de recepo da funo. Bom, amigos, finalizamos ento nosso post sobre os temidos ponteiros. Eles so um assunto delicado na programao, por vezes nos dando imenso controle sobre a aplicao, e por outras vezes nos tirando todo o controle do programa (e a pacincia tambm). Mas somente com a prtica que vocs conseguiro dom-los de uma vez (at hoje apanho deles de vez em quando). Bom Carnaval a todos, e muito juzo! Hahaha!!! At a prxima! Este post foi publicado em Linguagem C, Linguagem Pascal, Programao para Iniciantes e marcado com a tag c, pascal, pointer, ponteiro, programao em 27/02/2011 [http://www.rafaeltoledo.net/ponteiros/] .

Funes e Procedimentos
Estou ficando preocupado. Praticamente todos os meus posts comeam com Ol pessoal!. Preciso urgentemente de uma nova maneira de comear meus posts e saudar meus leitores. Mas, enfim, at o prximo post eu penso em alguma coisa. Quem sabe alguma gria, algum termo informtico ah, sei l. Aguardemos os prximos captulos. Bom, hoje vamos tratar de um assunto de extrema importncia na programao estruturada: as Funes e Procedimentos. Sem eles, a programao seria praticamente impossvel de ser realizada medida que os programas crescessem em tamanho. Alm disso, seria praticamente impossvel trabalhar em equipe (entenderemos isso j j), e a reutilizao de cdigo tambm seria inimaginvel, ou seja, toda vez que escrevssemos nossos programas, teramos que fazer tudo a partir do zero. A prpria linguagem no teria suas funes e procedimentos, e teramos que fazer toda a manipulao de teclado, vdeo, E/S, tudo a partir do zero. Entenderam a importncia? Veremos aqui como constitui-se uma funo/procedimento, as diferenas de um para o outro, o que um argumento e um parmetro, diferenas entre um e outro, o que um retorno ufa!

24 de 53

25-10-2013 17:21

Linguagem Pascal | Rafael Toledo

http://www.rafaeltoledo.net/category/linguagem...

Como deu para perceber, o post t bem recheado! Ento vamos que vamos! Para comearmos a falar sobre procedimentos e funes, vamos dar uma olhada no conceito da mquina de von Neumann, onde os sistemas computacionais so constitudos de: ENTRADA -> PROCESSAMENTO -> SADA Atravs desse conceito, podemos generalizar que todo programa recebe uma entrada de Dados, realiza seus clculos no processamento e, como sada, temos a Informao que o dado processado. Da mesma forma, os procedimentos e funes recebem dados de entrada, processam-os e retornam algo para quem os chamou. Podemos comear diferenciando um procedimento de uma funo pela maneira como feito o retorno. Na Funo, o valor de retorno Explcito, enquanto que no Procedimento, o retorno realizado de maneira Implcita. Veremos isso na prtica mais adiante. Da mesma forma que temos a sada na forma do retorno, tambm temos a sada na forma dos parmetros ou argumentos de nossa funo ou procedimento. Mas qual a diferena entre um Parmetro e um Argumento? De maneira simplificada, podemos dizer que uma funo (vou utilizar apenas o termo funo para designar funo e procedimento, apenas para poupar digitao) recebe de quem a chamou, em seus Parmetros, os dados a serem processados. J quando chamamos uma funo, passamos Argumentos para que ela execute o seu processamento. Dessa forma, os Parmetros so os dados aguardados pela funo, enquanto que os Argumentos so os dados que passamos funo. Pode parecer um pouco confuso agora, mas pretendo espairecer melhor essas ideias quando discutirmos a parte prtica da coisa. Ento, para fechar essa parte mais conceitual, podemos dizer que as funes so pequenos programas. Ou seja, a partir de agora, podemos quebrar o nosso programa em partes menores. Dessa forma, podemos, dentre outras coisas, reutilizar funes j escritas em programas novos, dividir trabalho entre uma equipe, onde cada um escreve um trecho do cdigo, ou seja, cada um escreve suas funes e depois junta-se em um nico programa. Legal, hein! Antes de comearmos a ver as Funes e Procedimentos na prtica, precisamos ter uma noo sobre Variveis Globais e Variveis Locais. O conceito de Variveis, j foi explorado em um post anterior (varivel um clula de memria que armazena um valor, toda varivel precisa de um tipo, etc). Uma Varivel Global uma varivel que pode ser acessada, alterada, enfim, ela pode ser vista por todo o programa. Como assim? As variveis so todas globais ento? Bom, nos programas que fizemos at agora, sim. A partir de agora, veremos que os procedimentos e funes tambm possuem suas prprias variveis, que s so conhecidas dentro de seu escopo (dentro do procedimento ou funo). Ou seja, uma Varivel Local uma varivel que s conhecida por um trecho do programa, no podendo ser acessada fora dele. Por exemplo, eu declarei uma varivel chamada X dentro de uma funo. Se eu mencion-la fora da funo onde foi declarada, o compilador em questo ir acusar um erro, dizendo que a varivel no foi declarada. Com isso, voc pode perceber que po-

25 de 53

25-10-2013 17:21

Linguagem Pascal | Rafael Toledo

http://www.rafaeltoledo.net/category/linguagem...

demos ter variveis de mesmo nome em nosso programa, porm cada uma dentro de seu escopo, sem nenhuma ligao uma com a outra. Bom, j falamos bastante da parte terica de funes e procedimentos. Ento vamos ver alguns exemplos de como faz-los, tanto nos algoritmos quanto na linguagem Pascal. Primeiramente, vamos criar um programa que l dois nmeros e os somam. Para isso iremos criar uma funo chamada somar, que receber dois nmeros inteiros como parmetros e devolver tambm um inteiro contendo o resultado da soma. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 Algoritmo Somar_com_Funcoes [Declarao de Variveis] valor1, valor2, resultado : inteiro Funo somar(n1, n2 : inteiro) : inteiro [Incio] [Declarao de Variveis Locais] resultado : inteiro [Processamento] resultado n1 + n2 retorne(resultado) [Fim] [Processamento Principal - Incio] escreva("Digite o primeiro membro da soma: ") leia(valor1) escreva("Digite o segundo valor da soma: ") leia(valor2) resultado somar(valor1, valor2) escreva("O resultado ", resultado) [Fim]

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19

program Somar_com_Funcoes; uses crt; var valor1, valor2, resultado : integer;

function somar(n1, n2 : integer) : integer; var resultado : integer; // Logo a seguir vou explicar algumas particularidades da linguagem Pascal begin resultado := n1 + n2; somar := resultado; end; begin

26 de 53

25-10-2013 17:21

Linguagem Pascal | Rafael Toledo 20 21 22 23 24 25 26 27

http://www.rafaeltoledo.net/category/linguagem...

write('Digite o primeiro membro da soma: '); readln(valor1); write('Digite o segundo membro da soma: '); readln(valor2); resultado := somar(valor1, valor2); writeln('O resultado ', resultado); readkey; end.

Vimos acima um exemplo bastante simples, onde declaramos uma funo chamada somar que recebe dois valores inteiros (n1 e n2) e retorna um valor inteiro, contendo a soma dos dois valores passados como argumento. Voc pode pensar: que coisa intil muito mais fcil usar o operador + e pronto. Calma, calma esse foi s um exemplo. Obviamente no iremos criar funes que j existem. As funes servem pra que possamos modularizar o cdigo, dividindo tarefas e deixando o cdigo mais legvel. Por exemplo, podemos criar uma funo que calcule o imposto de renda, que calcule as razes de uma equao de 2 grau, dentre outros. Com isso, se tivermos outro programa que tambm necessite de tais clculos, podemos reutilizar o cdigo! Podemos perceber em nosso cdigo que declaramos algumas variveis globais e locais. Nesse caso, declaramos as variveis globais: valor1, valor2 e resultado, enquanto que declaramos as variveis locais: n1, n2 e resultado. Epa! Surgiram duas dvidas agora! Primeiro: n1 e n2 so parmetros e no variveis locais, certo? Errado. Os parmetros que declaramos em nossas funes e procedimentos tambm so variveis locais, apesar de no terem sido declarados na rea de variveis locais. A segunda dvida : voc declarou duas variveis de nome resultado! Por que o compilador no acusou erro? Na verdade eu s percebi isso agora, mas serviu pra explicar um detalhe da linguagem Pascal: quando temos duas variveis de mesmo nome, sendo uma global e uma local, o programa sempre vai levar em conta a varivel local. Ele acusaria erro se declarssemos suas variveis de mesmo nome dentro de um mesmo escopo. Bom, eu comentei o cdigo ali em cima, dizendo que iria explicar algumas particularidades da linguagem Pascal. No algoritmo, quando vamos retornar o valor que a funo calculou, utilizamos simplesmente retorne(<valor>). J na linguagem Pascal, fazemos isso de uma modo diferente. Atribumos o valor a uma varivel com o mesmo nome da funo. Essa varivel no precisa ser declarada, pois criada automaticamente para representar a funo. No nosso exemplo, atribumos o que queremos retornar varivel somar. Pra encerrar, vou mostrar um exemplo do uso de Procedimentos, tambm para somar dois valor. Vocs percebero que eles funcionam exatamente da mesma maneira, porm, sem o valor de retorno: 1 2 3 4 5 6 7 27 de 53 Algoritmo Somar_com_Procedimentos [Declarao de Variveis] valor1, valor2, resultado : inteiro Procedimento somar(n1, n2 : inteiro) [Incio] 25-10-2013 17:21

Linguagem Pascal | Rafael Toledo 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24

http://www.rafaeltoledo.net/category/linguagem...

[Declarao de Variveis Locais] resultado : inteiro [Processamento] resultado n1 + n2 escreva("O resultado ", resultado) [Fim] [Processamento Principal - Incio] escreva("Digite o primeiro membro da soma: ") leia(valor1) escreva("Digite o segundo valor da soma: ") leia(valor2) somar(valor1, valor2) [Fim]

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25

program Somar_com_Procedimentos; uses crt; var valor1, valor2, resultado : integer;

procedure somar(n1, n2 : integer); var resultado : integer begin resultado := n1 + n2; writeln('O resultado ', resultado); end; begin write('Digite o primeiro membro da soma: '); readln(valor1); write('Digite o segundo membro da soma: '); readln(valor2); somar(valor1, valor2); readkey; end.

Perceberam como simples? E acaba auxiliando e muito no desenvolvimento de aplicaes. Quem sabe eu ainda reescrevo o nosso jogo da velha em Pascal, recodificando-o de forma modularizada? Vou pensar nisso Ah, e antes de encerrar, vale lembrar que uma funo ou procedimento pode, tambm, no ter nenhum parmetro. Para isso, s deixar os parnteses vazios ou at omiti-los. Post grande, de certa forma cansativo, mas de um tema bastante interessante! No prximo post vamos comear a nos aventurar por um outro mundo: A Linguagem C! Ela vai servir pra nos mostrar que, tendo um algoritmo bem feito, podemos implement-lo facilmente, independente da linguagem.

28 de 53

25-10-2013 17:21

Linguagem Pascal | Rafael Toledo

http://www.rafaeltoledo.net/category/linguagem...

Abrao, pessoal e bons estudos! Este post foi publicado em Linguagem Pascal, Programao para Iniciantes e marcado com a tag funo, function, procedimento, procedure, programao em 17/02/2010 [http://www.rafaeltoledo.net/funcoes-e-procedimentos/] .

Registros
Ol pessoal! Mais uma vez estou eu aqui em um post, depois de mais um bom perodo sem postar nada. Fim de semestre na faculdade sempre complicado, cheio de provas e ainda estive estudando muitas coisas (C++, Java, Delphi, OpenGL e ainda pretendo dar uma olhada em C#) pra melhorar viajei e voltei mal, passei uns dias no hospital e tudo mas chega de desculpas, finalmente estou no 3 ano da faculdade. Cheguei metade. Sem perder tempo, vamos ao que importa: programao! Hoje vamos falar sobre Registros, tambm chamados de Estruturas. Bom, no ltimo post, vimos como criar agrupamentos de dados de um mesmo tipo, no caso, com os Vetores. Agora, suponhamos que queremos agrupar alguns dados referentes a uma pessoa um aluno para exemplificar. Para um aluno podemos ter uma grande diversidade de dados correspondente a ele: Nome, Idade, Endereo, Telefone, Notas dos Bimestres, Situao (aprovado/reprovado/em exame). No caso, como os dados so de tipos diferentes, no seria possvel agrup-los em um vetor. Para isso existem os Registros! Porm, antes de entrarmos na definio dos registros no algoritmo, precisamos dar uma passada na definio de novos tipos. Os tipos, nada mais so do que modelos de dados. Por exemplo, quando criamos uma varivel do tipo inteiro, estamos definindo que teremos um dado com o formato de um inteiro. como se o tipo fosse o molde ou a forma (sem acento, de acordo com a nova regra ortogrfica, hahaha) e a varivel fosse o bolo ou o que quer que seja. Quando criamos o nosso registros, estamos definindo um novo tipo, ou um novo molde de dados. As variveis criadas com esse novo tipo tero o seu aspecto, definido na rea de definio de tipo. A seguir, vamos ao exemplo algoritmico e na linguagem Pascal de uma definio de um tipo novo, criando um registro simples: 1 2 3 4 5 6 [Definio de Tipos] Aluno = registro nome : literal[30] idade : inteiro fim-registro

29 de 53

25-10-2013 17:21

Linguagem Pascal | Rafael Toledo 7 8 [Declarao de Variveis] umAluno : Aluno

http://www.rafaeltoledo.net/category/linguagem...

1 2 3 4 5 6 7 8

type Aluno = record nome : string[30]; idade : integer; end; var umAluno : Aluno;

Utilizar os registros dessa maneira que voc define um tipo, e ele fica sendo reconhecido em todo o seu programa, alm da vantagem de voc poder passar ou retornar um conjunto de variveis de uma vez s em funes (calma, no prximo post veremos funes e procedimentos!). Lembrando que, em Pascal, a definio de tipos deve ser feita logo aps a rea Uses (ou a Program, no caso do PascalZim). Porm, caso voc for utilizar o registro somente uma vez, voc pode declar-lo diretamente na rea de variveis da seguinte maneira: 1 2 3 4 5 6 [Declarao de Variveis] Bola : registro cor : literal[20] peso : real diametro : real fim-registro

1 2 3 4 5 6

Var

Bola : record cor : string[20]; peso : real; diametro : real; end;

Beleza, tenho o meu registro. Mas como eu acesso os seus campos separadamente? Atravs do <nome do registro>.<nome do campo>. Dessa forma, apesar do registro ser uma nica varivel, ele nos oferece a possibilidade de acessar cada um dos seus campos separadamente. Um pequeno exemplo disso pode ser visto abaixo: 1 2 3 4 5 6 7 8 9 10 [Declarao de Variveis] Aluno : registro nome : literal[30] idade : inteiro fim-registro [Processamento] Aluno.nome "Rafael" Aluno.idade 20 escreva("O aluno ", Aluno.nome, " tem ", Aluno.idade, " anos.")

30 de 53

25-10-2013 17:21

Linguagem Pascal | Rafael Toledo 11 [Fim]

http://www.rafaeltoledo.net/category/linguagem...

1 2 3 4 5 6 7 8 9 10 11 12

var

Aluno : record nome : string[30]; idade : integer; end;

begin Aluno.nome := 'Rafael'; Aluno.idade := 20; writeln('O aluno ', Aluno.nome, ' possui ', Aluno.idade, ' anos.'); readkey; end.

Bom, ento isso. Os registros podem assustar um pouco no comeo, mas so simples e de grande utilidade. Qualquer dvida, como eu j disse, s deixar um comentrio ou mandar um e-mail. No prximo post teremos Funes e Procedimentos, elementos essenciais na programao estruturada. At l! Este post foi publicado em Linguagem Pascal, Programao para Iniciantes e marcado com a tag programao, record, registros, struct em 27/01/2010 [http://www.rafaeltoledo.net/registros/] .

Jogo da Velha em Pascal


Ol pessoal! Aqui estou eu de volta. E como prometido no final do ltimo post, teremos uma brincadeirinha. Utilizando os conceitos que vocs j conhecem, elaborei um Jogo da Velha bem simples, mas bastante divertido, que roda em modo console. Com isso, vocs iro perceber que o que mais importa quando se vai programar a IMAGINAO e a CRIATIVIDADE!

31 de 53

25-10-2013 17:21

Linguagem Pascal | Rafael Toledo

http://www.rafaeltoledo.net/category/linguagem...

Bom, o link com o cdigo-fonte est aqui. Escrevi e compilei ele na IDE do Free Pascal, mas acredito que vocs conseguiro compil-lo sem problema nenhum tanto no Pascal Zim, quanto no Turbo Pascal. Pra compilar no Pascal Zim, s retirar a rea que contm as Uses crt; e no Turbo Pascal, se caso estiver utilizando a verso Windows, colocar wincrt em vez de crt. Vou ento explicar as partes principais do cdigo (que tambm est com alguns comentrios) 1 2 3 4 var

campo : array[1..3, 1..3] of integer; i, j, vencedor, vez, jogada, numero_jogadas : integer; jogada_ok : boolean;

Na declarao de variveis, temos uma matriz 33 chamada campo, que representar o nosso campo de jogo. Logo em seguida, temos i e j, que so os ndices que utilizaremos em algumas partes para varrer a matriz. vez representa de quem a vez de jogar (no caso, jogador 1 ou jogador 2) . Jogada, ir armazenar o nmero inteiro correspondente a uma jogada (nmero de 1 a 9). Numero_jogadas ser um contador de jogadas, pois o jogo, invariavelmente, acaba aps 9 jogadas, mesmo que no haja vencedores. Por ltimo, temos a varivel booleana jogada_ok, que ser o indicador para a prxima jogada. Nela colocaremos um valor verdadeiro ou falso aps conferir se o nmero digitado pelo jogador resulta em uma jogada vlida (nmero de 1 a 9 e se o campo selecionado j no foi marcado em uma jogada anterior). 1 2 3 4 5 6 7 8 (* Inicializando o campo de jogo *) for i := 1 to 3 do begin for j := 1 to 3 do begin campo[i, j] := 0; end; end;

No incio do processamento, inicializamos o campo de jogo, com dois fors encadeados, setando todas as posies da matriz com o valor 0, que indicar vazio em nosso jogo. Aps isso so exibidas as instrues aos jogadores e espera-se que uma tecla seja pressionada para continuar, atravs da funo readkey. Logo em seguida, realizamos algumas inicializaes de variveis. Setamos o valor 0 para a varivel vencedor. Esta varivel ir armazenar o valor 1 ou 2 dependende de quem ganhar o jogo, ou ainda o valor 3 caso o jogo termine empatado. Inicializamos tambm a varivel vez, definindo o jogador 1 como quem vai iniciar o jogo, e a varivel numero_jogadas, que ser o nosso contador de jogadas, com o valor 0. Prosseguindo, entramos dentro do looping principal do jogo, controlado pela varivel vencedor (enquanto igual a zero, ou seja, enquanto no houver vencedor). Dentro do looping, limpamos a tela com a funo clrscr (clear screen), e mostramos o campo de jogo atual.

32 de 53

25-10-2013 17:21

Linguagem Pascal | Rafael Toledo

http://www.rafaeltoledo.net/category/linguagem...

Em seguida, temos uma consistncia. Consistncia vem a ser um mtodo de forar o usurio em um programa a inserir uma entrada desejada. Com o uso de consistncias, evita-se que o programa reaja de maneira indesejada, devido a entradas inesperadas. Neste caso do nosso jogo, obtemos a leitura de uma jogada e verificamos se ela vlida, conferindo se a clula selecionada est livre e se o valor digitado corresponde a uma clula vlida. Dessa forma, enquanto no tivermos uma jogada vlida, ficaremos em looping. Caso a jogada seja vlida, incrementamos o contador de jogadas e conferimos se existe algum ganhador. Passamos a vez para o outro jogador e voltamos ao incio do looping principal, at que haja um vencedor, ou o nmero mximo de jogadas seja atingido. Ao final, exibimos na tela o campo de jogo novamente, e apresentamos o resultado final. Bom, pessoal, o jogo foi feito de maneira bem simples (pode no ser a maneira mais eficiente de se fazer), mas fiz com o intuito de mostrar a vocs um exemplo do que j podem programar com o conhecimento que j sabem. Apesar de no ter nenhuma interface grfica, ele j serve pra gastar uns minutinhos a se divertindo e ainda mostrar pros seus amigos. Fica a, ento, a dica: que tal fazer um RPG de opes? Com o contedo dos prximos posts, vocs vero que o principal para se desenvolver um jogo no o conhecimento da linguagem (obviamente, necessrio um certo conhecimento), mas a criatividade e a capacidade de abstrao (transformar o pensamento humano em lgica de programao!). Bom, ento at o prximo post, com um contedo bastante til para a programao: Registros (estruturas). Abrao a todos e at a prxima! Este post foi publicado em Linguagem Pascal, Programao de Jogos e marcado com a tag game, gamedev, jogos, pascal, programao, tic-tac-toe em 06/11/2009 [http://www.rafaeltoledo.net/jogo-da-velha-em-pascal/] .

Free Pascal

Ol pessoal!

33 de 53

25-10-2013 17:21

Linguagem Pascal | Rafael Toledo

http://www.rafaeltoledo.net/category/linguagem...

Esse post bem curto, e serei direto: apesar de programar em Pascal h pouco mais de um ano, no conhecia a interessantssima comunidade do Free Pascal. L possvel encontrar fruns, downloads, notcias e muito mais. Na seo de downloads, possvel encontrar uma tima IDE para programar em Pascal. A Free Pascal IDE, apesar de seu visual console, super completa e oferece muitos recursos interessantes. Alm disso, ao baixar o pacote da verso 2.2.4, voc encontrar tambm vrios arquivos de documentao sobre a linguagem. Pra quem utiliza (ou j utilizou) o Delphi, pode tambm dar uma conferida na IDE chamada Lazarus. Utilizei a verso Linux no Ubuntu, e me espantei pela quantidade de recursos. A disposio dos menus, barras de ferramentas, componentes, enfim, tudo muito parecido com o Delphi/C++ Builder. E o melhor de tudo: totalmente gratuito! Ento isso pessoal, fica a a dica pra quem gosta da linguagem Pascal! Abrao a todos!

Shell Let's Go
youtube.com/shell

Build a better energy future Get started now on YouTube!

Este post foi publicado em Linguagem Pascal e marcado com a tag free pascal, lazarus, pascal em 26/10/2009 [http://www.rafaeltoledo.net/free-pascal/] .

Vetores e Matrizes
Ol pessoal! Depois de mais um perodo relativamente grande sem postar, aqui estou eu de volta. A minha ausncia foi causada, principalmente, pelo projeto que eu estava desenvolvendo para a FAITEC. Mais informaes sobre ele podem ser encontradas na pgina de projetos, ali no topo. O projeto chama-se Best Way, e, felizmente, conseguimos ganhar o 1 lugar na categoria 2 ano de Sistemas de Informao. Permitam-me aqui agradecer do fundo do corao aos outros membros da equipe, que se empenharam tambm para a realizao do mesmo. Outra coisa bem legal que aconteceu nesses ltimos tempos, que tive um artigo publicado na revista INICIA, da FAI. A INICIA uma revista voltada para Iniciao Cientfica, e conta com artigos de vrios bolsistas da FAPEMIG. O meu artigo pode ser lido aqui. Bem, ento vamos ao que interessa! Hoje vamos falar sobre outro assunto de suma importncia

34 de 53

25-10-2013 17:21

Linguagem Pascal | Rafael Toledo

http://www.rafaeltoledo.net/category/linguagem...

para a programao: os Vetores e as Matrizes. Antes de falar da sua sintaxe, implementao e particularidades, vamos falar de seu uso. Imagine a seguinte situao: eu preciso armazenar em meu programa as idades de 100 pessoas para, depois, calcular a mdia de idade delas. Ser que eu vou precisar declarar 100 variveis em meu programa, nomeando uma a uma? A resposta sim e no. Como assim? Digamos que voc ir, sim, declarar 100 variveis, mas no precisar nomear uma a uma na sua declarao. Os Vetores ou Listas surgiram para resolver problemas como estes. Mas o que vem a ser um vetor? Um vetor um conjunto de variveis de mesmo tipo, referenciadas por um nome comum. Mas se elas tem o mesmo nome, como eu vou conseguir distingui-las? O acesso a cada uma das variveis ocorre atravs de um processo chamado Indexao. Indexao consiste em utilizar-se de um ndice para acessar cada uma das variveis. Teoricamente, pode parecer meio complexo, mas vocs vero que, na prtica, uma tcnica muito til para a programao. Vamos ver, ento, como declaramos um vetor na maneira algoritmica

[Declarao de Variveis] notas : conjunto[50] de real

e na linguagem Pascal

var notas : array[1..50] of real;

Como pode ser visto nos exemplos acima, a declarao realizada na rea comum de declarao de variveis, como se fosse uma varivel qualquer. O que difere, que estabelecemos na declarao a quantidade de posies que o nosso vetor ter, colocando entre colchetes uma constante numrica (ou uma constante definida pelo programador). Podemos perceber, tambm, que a declarao na linguagem Pascal possui uma particularidade interessante: definimos tambm o alcance do ndice do vetor. No caso acima, o nosso vetor iniciar na posio 1 e ter a sua ltima posio como sendo 50. Isso no acontece em outras linguagens, como C/C++ (onde os vetores iniciam na posio 0). Com essa particularidade, podemos criar, por exemplo, vetores que iniciam em ndices negativos, dentre outras possibilidades. Ok, vimos como se declara um vetor. Mas e a matriz, como se faz? Na programao, uma matriz nada mais que um vetor de duas dimenses. Como assim? Imagine um vetor como uma sequncia de quadradinhos em linha reta, um atrs do outro, on-

35 de 53

25-10-2013 17:21

Linguagem Pascal | Rafael Toledo

http://www.rafaeltoledo.net/category/linguagem...

de cada um representa uma posio do vetor. Agora, imagine um bloco de quadradinhos, formando uma espcie de tabela. Esse vetor de duas dimenses uma matriz. No caso da programao, podemos tambm ter vetores de 4, 5, 6, 7 dimenses, enfim, de quantas dimenses voc necessitar (e o sua memria suportar). preciso tomar um certo cuidado com a declarao de vetores/matrizes muito grandes, pois essas estruturas so armazenadas sequencialmente na memria. Dessa forma, se o vetor for muito grande, ele pode invadir a rea de outros programas ou at sobrescrever dados do seu prprio programa, gerando problemas muito difceis de serem descobertos (pois no so mostrados como erros de compilao). Vamos ver, ento, como declarar uma matriz (ou um vetor de duas dimenses) na forma algoritmica

[Declarao de Constantes] MAX = 100 [Declarao de Variveis] notas : conjunto[50][MAX] de inteiro

e na linguagem Pascal

const MAX = 100; var notas : array[1..50, 1..MAX] of integer;

Nos exemplos acima, demonstrei tambm como definir uma ou mais dimenses de um vetor com o uso de constantes. uma maneira simples de deixar o cdigo mais adaptvel. Como assim? Digamos que eu vou armazenar as idades de 50 pessoas. A, um belo dia eu preciso aumentar esse nmero para 100, 200 pessoas. Se eu utilizei uma constante na definio do vetor, basta modificar o valor da constante e pronto, o programa todo j ter como referncia do vetor a nova quantidade estabelecida. Bem, temos ento o nosso vetor com suas inmeras posies. Agora chegou a hora de ler os valores para armazen-los. Precisarei escrever dezenas, centenas de vezes o comando de leitura? Bem, s se voc quiser (o que eu acho muito pouco provvel Hahahaha). Para nos auxiliar nessa rdua tarefa, utilizaremos um companheiro j conhecido de vocs: o Para. Atravs de seu uso (que consiste em uma repetio realizada uma quantidade de vezes determinada), podemos comprimir a leitura/escrita dos/nos elementos do vetor em poucas linhas facilmente. A seguir,

36 de 53

25-10-2013 17:21

Linguagem Pascal | Rafael Toledo

http://www.rafaeltoledo.net/category/linguagem...

teremos um exemplo bem simples em linguagem algoritmica e em Pascal.

[Declarao de Constantes] MAX = 50 [Declarao de Variveis] vetor : conjunto[MAX] de inteiro i : inteiro // ser o nosso ndice [Incio] para i = 1 at MAX faa incio leia(vetor[i]) fim-para para i = 1 at MAX faa incio escreva(vetor[i]) fim-para [Fim]

const MAX = 50; var vetor : array[1..MAX] of integer; i : integer; { ser o nosso ndice } begin for i := 1 to MAX do begin readln(vetor[i]); end; for i := 1 to MAX do begin writeln(vetor[i]); end;

37 de 53

25-10-2013 17:21

Linguagem Pascal | Rafael Toledo

http://www.rafaeltoledo.net/category/linguagem...

end.

No nosso exemplo acima, lemos as posies do vetor e em seguida listamos, mostrando os valores lidos na tela. Bastante simples, no acham? Mas, ento, como fazemos para ler uma matriz? Se utilizarmos o Para, s conseguiremos ler a diagonal principal da matriz Mas e se encadearmos dois Paras? Vamos ver como ficaria?

[Declarao de Constantes] MAX = 50 [Declarao de Variveis] matriz : conjunto[MAX][MAX] de inteiro i, j : inteiro // sero os nossos ndices [Incio] para i = 1 at MAX faa incio para j = 1 at MAX faa incio leia(matriz[i][j]) fim-para fim-para [Fim]

const MAX = 50; var matriz : array[1..MAX, 1..MAX] of integer; i, j : integer; { sero os nossos ndices } begin for i := 1 to MAX do begin for j := 1 to MAX do begin

38 de 53

25-10-2013 17:21

Linguagem Pascal | Rafael Toledo

http://www.rafaeltoledo.net/category/linguagem...

readln(vetor[i, j]); end; end; end.

Simples, rpido e fcil! Com o primeiro ndice (no caso acima, i), controlamos as linhas da matriz (ou a primeira dimenso). Com o segundo ndice (j), controlamos as colunas da matriz. Poderamos adaptar essa maneira para lermos/mostrarmos vetores de quantas dimenses forem necessrias, sempre colocando um ndice e um Para para cada dimenso do vetor. Bem, pessoal, isso qualquer dvida s comentar e/ou mandar um e-mail (rafaeldtoledo@gmail.com), que responderei o mais breve possvel! Valeu, e at a prxima (aguardem, pois teremos uma brincadeirinha no prximo post!) Este post foi publicado em Linguagem Pascal, Programao para Iniciantes e marcado com a tag array, matriz, programao, vetor em 26/10/2009 [http://www.rafaeltoledo.net/vetores-e-matrizes/] .

Laos de Repetio
Olha eu aqui denovo. Apesar dos sumios peridicos, at que o blog est caminhando bem E estou gostando tambm que, mesmo tendo um nvel bem baixo de atualizaes, o blog est com uma mdia de 15 a 20 visitas por dia. Saber que o blog est sendo til para algumas pessoas me deixa muito contente. Ah, gostaria tambm pedir desculpas por no estar respondendo os e-mails nas ltimas semanas que estou muito sem tempo mesmo iniciao cientfica, projeto da FAITEC (a feira tecnolgica da minha faculdade), seminrios, palestras, e agora ainda tem a Maratona de Programao, alm tambm de uns problemas pessoais aqui. Mas de boa, podem mandar as dvidas que eu responderei na medida do possvel. Bem, ento vamos ao que interessa! Hoje iremos tratar de um tema de suma importncia na programao: Os Laos de Repetio. Em nossos programas j estamos lendo dados do usurio. Imagine o seguinte: vamos fazer uma soma de nmeros. Lemos dois nmeros e realizamos a soma. E se quisssemos fazer uma soma de, por exemplo, 100 nmeros, ou mesmo uma quantidade X definida pelo usurio? No caso da soma de 100 nmeros, teramos 100 vezes o comando Leia()? E como faramos pra ler uma quantidade X de vezes? Sem as estruturas de repetio, sem dvida, seria bem complicado.

39 de 53

25-10-2013 17:21

Linguagem Pascal | Rafael Toledo

http://www.rafaeltoledo.net/category/linguagem...

Alm disso, teramos um cdigo extremamente grande e repetitivo, com comandos iguais pra fazer as mesmas coisas. Os Laos de Repetio foram criados para solucionar estes problemas, deixando os cdigos mais compactos, mais legveis e mais rpidos de serem desenvolvidos. Os Laos de Repetio que iremos tratar aqui so o Enquanto, Faa e o Para. Descrevendo-os resumidamente, temos o seguinte: Enquanto: testa a condio antes de executar o bloco de cdigo Faa: executa o bloco de cdigo e depois verifica a condio Para: executa um bloco de cdigo um determinado nmero de vezes Vamos comear, ento, falando do Enquanto. O enquanto possui um funcionamento bem simples, porm de grande utilidade. Ele compara uma sentena e executa o bloco de cdigo se a condio for verdadeira. Da mesma forma que, por exemplo, no Se, voc pode colocar diversas condies, com o uso dos operadores lgicos e e ou, alm do no. A seguir temos o exemplo da sintaxe em algoritmo

enquanto (nota > 70) faa comandos... fim-enquanto

e em Pascal

while (Nota > 70) do begin comandos... end;

Dessa forma, utilizamos o Enquanto quando vamos executar uma repetio sem sabermos necessariamente o nmero de vezes que ele ser executado. O looping pode, ainda, no ser executado nenhuma vez, caso a condio no seja satisfeita, ou seja, no Enquanto, testa-se a condio antes de executar o bloco de cdigo. Outra estrutura de repetio importante o Repita. Ela possui praticamente o mesmo funcionamento que o Enquanto, porm a condio testada aps a execuo do bloco de cdigo. Abaixo, temos a sua sintaxe algoritmica

40 de 53

25-10-2013 17:21

Linguagem Pascal | Rafael Toledo

http://www.rafaeltoledo.net/category/linguagem...

repita comandos... enquanto(nota <= 70) e (nota >= 30)

e em Pascal

repeat comandos... until(nota <= 70) and (nota >= 30);

Neste exemplo acima, utilizei o operador lgico e para condicionar a repetio. Dessa forma, o looping ser executado somente enquanto a varivel Nota estiver na faixa entre 30 e 70 (para mais detalhes sobre os operadores lgicos, d uma olhada no post sobre eles). Por ltimo, mas no menos importante, temos o Para. Esta estrutura de repetio se diferencia das outras por executar a repetio um determinado nmero de vezes. Como assim? A execuo do Para executada atravs da verificao e incremento de uma varivel inteira, ou seja, determinamos a quantidade de vezes que a repetio ser executada atravs de um limite para o valor da varivel. Meio confuso? Calma, nos exemplos abaixo vai ficar mais claro. Primeiro na forma algoritmica

para i = 1 at 50 faa comandos... fim-para

e em Pascal

for i := 1 to 50 do begin comandos... end;

No exemplo acima, temos a varivel I funcionando como o contador de execuo do looping,

41 de 53

25-10-2013 17:21

Linguagem Pascal | Rafael Toledo

http://www.rafaeltoledo.net/category/linguagem...

sendo incrementado automaticamente a cada execuo do bloco de cdigo. Dessa forma, o nosso looping ser executado 50 vezes, ou seja, enquanto a varivel I for menor ou igual o valor 50. Podemos, em vez do valor 50 colocar outra varivel ou uma constante pra controlar a quantidade de vezes que o Para ser executado. O Para tambm possui uma particularidade interessante, podendo realizar decrementos a cada execuo do looping. Dessa forma, podemos, por exemplo, criar contadores decrescentes, ou ainda exibir vetores invertidos (para mais informaes sobre vetores, consulte o prximo post). A seguir temos a sintaxe do Para com decremento tanto em algoritmo quanto em Pascal:

para i = 50 at 1 passo -1 Comandos... fim-para

for i := 50 downto 1 do begin Comandos... end;

Bem, pessoal, acho que isso. Com o tempo vocs vero que a utilizao das estruturas de repetio est sempre presente no dia-a-dia de um programador e tem papel fundamental na construo de um cdigo otimizado. Fiquem atentos, pois no prximo post iremos falar de vetores e matrizes. At l e bons estudos! Este post foi publicado em Linguagem Pascal, Programao para Iniciantes e marcado com a tag do, for, pascal, programao, repeat, until, while em 18/09/2009 [http://www.rafaeltoledo.net/lacos-de-repeticao/] .

Estruturas de Seleo
Ol pessoal! No, eu no morri, s sumi por um tempo maior do que eu planejava. E no peguei a gripe suna tambm. Pelo menos por enquanto. A minha faculdade uma das nicas da regio que no suspendeu as aulas. Enfim, melhor assim. Sinceramente acho que essas medidas de

42 de 53

25-10-2013 17:21

Linguagem Pascal | Rafael Toledo

http://www.rafaeltoledo.net/category/linguagem...

suspender a volta s aulas por uma, duas semanas no adianta em nada. Bem, mas vamos ao que interessa. No ltimo post, eu deixei alguns exerccios pra vocs treinarem a elaborao de algoritmos e a implementao na linguagem Pascal. Ento aqui voc encontra as solues para os exerccios (tanto a resoluo algortmica quanto as implementaes em Pascal). As implementaes foram feitas no PascalZim. Portanto, se algum for compilar em algum outro ambiente, como o Turbo Pascal, no se esqueam de adicionar depois da seo Program a seo Uses. Vamos ento ao nosso assunto de hoje. At agora, todos os programas que fizemos eram totalmente sequenciais, ou seja, comeavam da primeira linha e iam executando uma em seguida da outra, at a ltima linha. Dessa forma o nosso programa executa sempre as mesmas aes, o que no acontece com os programas em geral. Os programas geralmente, baseados em algum dado, selecionam pores do cdigo a serem executadas, realizando operaes diferenciadas a cada execuo. Para representar essa seleo em nosso programa utilizamos as estruturas de seleo. A primeira estrutura de seleo que iremos conhecer o Se. O Se utilizado quando esperamos por uma condio. O bloco de cdigo referente s sera executado se a condio for verdadeira. A seguir temos um exemplo algoritmico da utilizao dessa estrutura e sua implementao em Pascal.

leia(numero) se (numero MOD 2 = 0) ento incio escreva("O nmero par.") fim

readln(numero); if (numero MOD 2 = 0) then begin write('O nmero par.'); end;

Neste exemplo, lemos do usurio a varivel numero. Se o resto da diviso do contedo da va-

43 de 53

25-10-2013 17:21

Linguagem Pascal | Rafael Toledo

http://www.rafaeltoledo.net/category/linguagem...

rivel for igual a zero, ser mostrada na tela a frase O nmero par. A partir disso, podemos criar condies para o nosso programa, executando determinadas tarefas somente se algumas condies forem satisfeitas. Mas e se, por exemplo o nmero no fosse par? Ele seria mpar mas como faramos isso no programa? A estrutura do Se composta do Seno, que executado caso a condio do Se no seja satisfeita. A seguir temos o exemplo da utilizao do Se com o Seno na forma algoritmica e na linguagem Pascal:

leia(numero) se(numero MOD 2 = 0) ento escreva("O nmero par.") seno escreva("O nmero impar.") fim-se

readln(numero); if (numero MOD 2 = 0) then begin write('O nmero par.'); end else begin write('O nmero mpar.'); end;

Dessa forma, se o nmero digitado fosse par, a mensagem O nmero par. Caso contrrio, a mensagem O nmero mpar. seria exibida. Alm disso, podemos encadear vrios Ses, criando uma srie de condies. Podemos tambm, colocar mais de uma condio ou negar uma condio, com a utilizao dos operadores lgicos e, ou e no.

leia(idade) se (idade < 13) ento Escreva("Criana")

44 de 53

25-10-2013 17:21

Linguagem Pascal | Rafael Toledo

http://www.rafaeltoledo.net/category/linguagem...

seno se (idade >= 13 e < 21) escreva("Adolescente") seno escreva("Adulto") fim-Se

readln(idade); if (idade < 13) then begin write('Criana'); end else if (idade >= 13 and idade < 21) then begin write('Adolescente'); end else begin write('Adulto'); end;

Ah, um detalhe. Percebam que em Pascal, somente o ltimo End de uma sequncia de Ifs tem ponto-e-vrgula! Observando o exemplo acima, podemos realizar diversas tarefas, encadeando diversos Ifs / Elses. Apesar de simples, esta estrutura vastamente utilizada na programao. Porm, quando precisamos conferir o valor de uma varivel frente a muitos valores, o uso de Ifs encadeados torna-se trabalhoso, principalmente ao programador, alm de deixar o cdigo repleto de Begins e Ends. Para resolver problemas do tipo, utilizamos uma estrutura chamada Escolha ou Case. Com ela, podemos comparar o contedo de uma varivel frente a diversas constantes, de uma forma bem mais organizada que o simples encadeamento de Ifs. A seguir, temos um exemplo de um programa de apurao de votos, com a utilizao do Escolha.

... escolha (votos) caso (votos = 1) : candidato1 candidato1 + 1 caso (votos = 2) : candidato2 candidato2 + 1 seno escreva("Voto invlido")

45 de 53

25-10-2013 17:21

Linguagem Pascal | Rafael Toledo

http://www.rafaeltoledo.net/category/linguagem...

fim-escolha

case votos of 1 : candidato1 := candidato1 + 1; 2 : candidato2 := candidato2 + 2; else write('Voto invlido'); end;

Neste caso, a varivel votos foi comparada com os valores 1 e 2. Dependendo do seu contedo, incrementa-se a varivel correspondente ao candidato. Caso o voto no confira com nenhuma das opes do case, ele ir executar o comando para escrever Voto invlido na tela. Nesta estrutura, assim como no se, o uso do seno facultativo, ou seja, ele no precisa necessariamente estar presente, sendo utilizado de acordo com a necessidade. Outro ponto que os valores constantes comparados no precisam ser necessariamente inteiros. Podem ser, por exemplo, um tipo caracter. Bom, pessoal, isso. No comeo pode ser que vocs estranhem um pouco estas estruturas, mas com o tempo elas viro a estar presente em praticamente todas as aplicaes que vocs fizerem. E lembrem-se que, em caso de dvida, podem me mandar um e-mail (rafaelmgn@yahoo.com.br ou rafaeldtoledo@gmail.com) ou simplesmente deixar um comentrio aqui no blog. Obrigado pela visita e at o prximo post com as Estruturas de Repetio. Abrao a todos! Este post foi publicado em Linguagem Pascal, Programao para Iniciantes e marcado com a tag case, else, if, pascal, seleo, switch em 05/08/2009 [http://www.rafaeltoledo.net/estruturasde-selecao/] .

Introduo Linguagem Pascal


Ol a todos novamente!

46 de 53

25-10-2013 17:21

Linguagem Pascal | Rafael Toledo

http://www.rafaeltoledo.net/category/linguagem...

Hoje, finalmente, iremos comear a programar de fato, e fazer o nosso primeiro programa! Quanto a linguagem, iremos utilizar a Linguagem Pascal num primeiro momento. Apesar de muitos no concordarem com o uso dela, eu a considero a melhor escolha para o ensino da programao, por ter uma sintaxe clara e fcil de ser entendida. Para escrever e compilar (transformar o cdigo escrito em um arquivo executvel), utilizaremos o Pascal Zim, um ambiente criado pelo departamento de Cincia da Computao da Universidade de Braslia, para o auxlio no ensino da disciplina de Algoritmos. Atualmente, ele encontra-se na verso 5.01. O link para download voc encontra aqui. Algumas pessoas podem preferir utilizar o Turbo Pascal, da Borland. Eu optei pelo Pascal Zim por dois motivos: a ltima verso do Turbo Pascal de 1991 (ou seja, j tem 18 anos!!!) e tambm pelo fato do Pascal Zim ser brasileiro! (vamos valorizar os programadores do Brasil!). Caso queiram utilizar o Turbo Pascal, fiquem vontade, pois a sintaxe a mesma. Aps baixarem o Pascal Zim, descompacte-o utilizando o Winrar, PKZip, Winzip, 7Zip, enfim, qualquer um que voc tenha a. Logo aps, v at a pasta pascalzim e execute o Pzim.exe. Teremos a seguinte janela:

Esta a tela de edio de um programa no Pascal Zim. nela que escreveremos os comandos que iro compor o nosso programa. A seguir, temos um programa simples em algoritmo que iremos passar para a linguagem Pascal:

algoritmo ola_mundo

47 de 53

25-10-2013 17:21

Linguagem Pascal | Rafael Toledo

http://www.rafaeltoledo.net/category/linguagem...

[Processamento] escreva("Ol, Mundo! Estou no blog do Striker07!") [Fim]

Este um programa extremamente simples, que escreve o texto Ol, Mundo! Estou no blog do Striker07! na tela. Em Pascal, este programa ficaria dessa forma:

program ola_mundo; begin write('Ol, Mundo! Estou no blog do Striker07!'); end.

Vamos agora explicar passo-a-passo este primeiro programa. Na primeira linha, temos Program Ola_Mundo; Esta linha define o nome do nosso programa, da mesma forma que definimos o nome do nosso algoritmo na primeira linha dele. Perceba que, os comandos do Pascal terminam com ; e se voc no coloc-los, ocorrer um erro na hora de compilar. Logo em seguida temos o Begin, que significa o incio do programa. Os comandos do nosso programa comearo a ser escritos a partir deste Begin. Ele no tem ; porque no um comando, mas uma indicao de que a rea de processamento est iniciando. A seguir, temos o comando write(Ol, Mundo! Estou no blog do Striker07!); que corresponde ao Escreva(Ol, Mundo! Estou no blog do Striker07!). Perceba, basicamente, a mesma coisa no algoritmo e no programa, com a diferena de que no Pascal os comandos so em ingls. Outra diferena que na linguagem Pascal o texto deve vir entre aspas simples enquanto que no algoritmo ele vem entre aspas duplas . Tambm no se deve esquecer de colocar o ponto e vrgula no final do comando. Encerrando o programa, temos End. que indica o final do programa. Este End deve sempre ser acompanhado do ponto final, indicando que o programa se encerra a. Caso voc esteja utilizando o Turbo Pascal, precisar incluir a seguinte linha depois do ttulo do programa:

program ola_mundo; uses wincrt;

48 de 53

25-10-2013 17:21

Linguagem Pascal | Rafael Toledo

http://www.rafaeltoledo.net/category/linguagem...

begin ...

Esta linha inclui a biblioteca padro de comandos. Caso esteja utilizando a verso para DOS do Turbo Pascal, substitua wincrt por crt. No Pascal Zim, a biblioteca includa automaticamente, ento no h a necessidade de colocar esta linha. Vamos agora fazer um programa simples, que recebe dois nmeros do usurio e os soma. Primeiro, vamos fazer o algoritmo deste programa:

algoritmo soma_dois_numeros [Declarao de Variveis] numero1, numero2, resultado : inteiro [Processamento] escreva("Digite o primeiro nmero: ") leia(numero1) escreva("Digite o segundo nmero: ") leia(numero2) resultado numero1 + numero2 escreva("O resultado da soma ", resultado) [Fim]

Um algoritmo muito simples, onde lemos o valor de duas variveis do tipo inteiro, e depois as somamos, armazenando na varivel resultado, e mostramos na tela. Agora vamos fazer o mesmo programa em Pascal:

program soma_dois_numeros; var numero1, numero2, resultado : integer; begin write('Digite o primeiro nmero: '); readln(numero1); write('Digite o segundo nmero: '); readln(numero2);

49 de 53

25-10-2013 17:21

Linguagem Pascal | Rafael Toledo

http://www.rafaeltoledo.net/category/linguagem...

resultado := numero1 + numero2; write('O resultado da soma ', resultado); end.

Este programa tem alguns elementos a mais que o outro no tinha. Na primeira linha, temos o ttulo do programa, da mesma forma como estava no Ol Mundo. Aps isso, temos a rea Var, onde declaramos as variveis do tipo Inteiro, no caso da linguagem Pascal, Integer. A seguir os tipos bsicos e os seus respectivos nomes na linguagem Pascal: Inteiro = Integer Real = Real Caracter = Char Booleano = Boolean Literal = String Na linguagem Pascal, todas as variveis devem ser declaradas nesta seo. Caso queira declarar variveis de tipos diferentes, deve-se fazer igual a um algoritmo:

// No Algoritmo [Declarao de Variveis] soma : inteiro inicial : caracter media : real { Em Pascal } var soma : integer; inicial : char; media : real;

Uma coisa importante que eu tinha esquecido de falar que a linguagem Pascal no distingue maisculas de minsculas. Ou seja, Real a mesma coisa que real ou rEaL ou reaL. Da mesma forma se voc declarar uma varivel Media, no poder declarar outra com o nome de media. Continuando o cdigo, temos o incio do programa. O primeiro comando escreve uma mensagem pedindo pra o usurio entrar com o primeiro nmero. Em programao, esse tipo de mensagem conhecido como prompt. Em seguida, temos a funo readln() que l um valor do usurio e o armazena em uma varivel. Depois, repetimos os dois comandos para ler o segundo nmero da soma. Em seguida, temos o clculo da soma. Perceba que, na linguagem Pascal, o

50 de 53

25-10-2013 17:21

Linguagem Pascal | Rafael Toledo

http://www.rafaeltoledo.net/category/linguagem...

operador de atribuio representado por := em vez da seta que representamos nos algoritmos. Na ltima linha, temos a apresentao do resultado na tela, atravs da funo write(), onde colocamos entre os parnteses o texto e a varivel que queremos exibir na tela. Para concluir este primeiro post, vamos fazer um ltimo programa que calcula a sua idade, baseando-se no seu ano de nascimento, utilizando o conceito de constantes. Teremos, ento o seguinte algoritmo:

algoritmo calculo_idade [Declarao de Constantes] ano_atual = 2009 [Declarao de Variveis] ano_nascimento, idade : inteiro nome : literal [Processamento] escreva("Ol! Poderia me dizer qual o seu nome? ") leia(nome) escreva("Em que ano voc nasceu? ") leia(ano_Nascimento) idade ano_atual - anoNascimento escreva("Prazer em conhec-lo, ", nome, ".") escreva("Voc tem ", idade, " anos.") [Fim]

Passando este algoritmo para a linguagem Pascal, teremos o seguinte:

program calculo_idade; const ano_atual = 2009; var ano_nascimento, idade : integer; nome : string; begin

51 de 53

25-10-2013 17:21

Linguagem Pascal | Rafael Toledo

http://www.rafaeltoledo.net/category/linguagem...

write('Ol! Poderia me dizer qual o seu nome? '); readln(nome); write('Em que ano voc nasceu? '); readln(ano_nascimento); idade := ano_atual - ano_nascimento; writeln('Prazer em conhec-lo, ', nome, '.'); write('Voc tem ', idade, ' anos.'); end.

Basicamente, temos apenas um detalhe novo em relao ao ltimo programa: a incluso da rea Const para a declarao de constantes. A declarao ocorre da mesma forma que nos algoritmos, ou seja, sem a definio do tipo, utilizando o operador = para indicar o valor da constante. Outro detalhe a utilizao da funo writeln(). Mas qual a diferena entre write() e writeln()? Ao utilizar a funo write(), o cursor ficar posicionado logo aps o final do texto. J na funo writeln(), o cursor pular para a prxima linha ao escrever o texto. O emprego dessas funes deve priorizar a esttica na tela, deixando o programa com um visual mais agradvel. Para encerrar este tpico, vou deixar alguns exerccios para praticarem a elaborao de algoritmos e a programao em Pascal: 1. Desenvolva um algoritmo para calcular a mdia de 4 nmeros fornecidos pelo usurio. 2. Desenvolva um algoritmo para calcular a expresso S = (A + B) / (A B).Os valores A e B devero ser fornecidos pelo usurio. 3. Desenvolva um algoritmo para calcular o volume de um cilindro, dado por Pi R H, onde R o raio, H a altura e Pi uma constante equivalente a 3,14. Os valores de R e H devero ser fornecidos pelo usurio. 4. Desenvolva um algoritmo para calcular a rea da esfera, dada por 4 Pi R e o seu volume, dado por 4 Pi R / 3, onde R o raio e Pi uma constante equivalente a 3,14. O valor de R dever ser fornecido pelo usurio. 5. Desenvolva um algoritmo para calcular a altura do cilindro, dada por V / 4 Pi R, onde R o raio, V o volume e Pi uma constante equivalente a 3,14. Os valores R e V devero ser fornecidos pelo usurio. 6. Desenvolva um algoritmo para calcular a funo F(x,y) = 2x + 2y, em um domnio real. Os valores X e Y devero ser fornecidos pelo usurio.

52 de 53

25-10-2013 17:21

Linguagem Pascal | Rafael Toledo

http://www.rafaeltoledo.net/category/linguagem...

7. Desenvolva um algoritmo para calcular o troco a ser devolvido a um cliente. Deve ser lido (fornecido pelo usurio) o valor a ser pago e o valor dado pelo cliente. 8. Desenvolva um algoritmo para calcular o valor absoluto da diferena entre A e B. Os valores A e B devero ser lidos. 9. Desenvolva um algoritmo para calcular (converter) graus Farenheit (F) em graus Centgrados (C) , utilizando a seguinte frmula: C = 5 (F 32) / 9. O valor F dever ser lido. Algumas dicas: - Funo para calcular a raiz quadrada: sqrt(nmero) - Funo para calcular o valor absoluto de um nmero: abs(nmero) Tentem fazer os exerccios. Qualquer dvida, postem nos comentrios ou me enviem um e-mail (rafaeldtoledo@gmail.com). No prximo post colocarei as respostas dos exerccios e as respectivas implementaes em Pascal. Abrao a todos e bom feriado! Este post foi publicado em Linguagem Pascal, Programao para Iniciantes e marcado com a tag introduo, pascal, programao em 19/04/2009 [http://www.rafaeltoledo.net/introducao-a-linguagem-pascal/] .

Orgulhosamente mantido com WordPress

53 de 53

25-10-2013 17:21

Você também pode gostar