Escolar Documentos
Profissional Documentos
Cultura Documentos
MELAR
ANGELINAMELARE@GMAIL.COM
Linguagem
00110000
SUMRIO
Lgica de Programao ................................................................................................................... 7 Algoritmo ........................................................................................................................................ 8 Estruturas dos Algoritmos: Linear / Seletiva/ Repetio ............................................................. 10 Mtodo para a construo de Algoritmo ....................................................................................... 10 Etapas de Desenvolvimento .......................................................................................................... 12 Tipos de Algoritmos ...................................................................................................................... 14 1. Tipos de Algoritmos ........................................................................................................... 14 Pseudocdigo ................................................................................................................................ 15 Fluxograma.................................................................................................................................... 16 Diagrama de Chapin ...................................................................................................................... 18 Paradigmas de Programao forma de programar ...................................................................... 19 1. Programao No Estruturada: ........................................................................................... 19 2. Programao Estruturada (Procedural): ............................................................................. 19 3. Programao Orientada a Objetos ...................................................................................... 20 Modularidade ................................................................................................................................ 20 4. Estratgia de Decomposio ou Dividir para Conquistar ............................................... 20 5. Mdulos .............................................................................................................................. 21 Linguagem C ................................................................................................................................. 23 Processo de Compilao e Ciclo de Vida do Programa ................................................................ 24 6. Linguagem C Compiladora ou Interpretadora? ............................................................. 24 7. Ciclo de Vida do Programa ................................................................................................ 24 Ambiente de Desenvolvimento DEV-C++ ................................................................................... 26 1. Ambiente integrado ............................................................................................................ 26 2. Configurando o ambiente e o editor ................................................................................... 26 3. Configuraes para o Windows Vista/7 ............................................................................. 27 4. Digitao do programa ....................................................................................................... 27 5. Gravao do programa ....................................................................................................... 27 6. Compilao e execuo do programa ................................................................................. 27 7. Criando um cdigo fonte padro ........................................................................................ 28 Estrutura do Programa na Linguagem C ....................................................................................... 29 1. Estrutura bsica .................................................................................................................. 29 2. Diretivas ............................................................................................................................. 29 3. Arquivos de Cabealho (header) ........................................................................................ 30 4. Biblioteca ........................................................................................................................... 31 5. Bloco de instrues e Funo MAIN() ............................................................................... 31 6. Projeto ................................................................................................................................ 31 7. Regras de Digitao e Dicas da Estrutura em C ................................................................. 31 8. Comentrios ....................................................................................................................... 32 Variveis........................................................................................................................................ 33 1. O que so variveis? ........................................................................................................... 33 2. Mas em que parte da memria vo os dados? .................................................................... 33 Identificadores ........................................................................................................................... 33 3. Declarao de varivel ....................................................................................................... 34 Constantes ..................................................................................................................................... 35 Tipos de dados ............................................................................................................................... 36 Prof Angelina V.S.Melar 2
1. Numrico ............................................................................................................................ 36 2. Literal/ Cadeia de Caracteres.............................................................................................. 36 3. Lgicas ............................................................................................................................... 37 4. Caracter .............................................................................................................................. 37 5. Espao Alocado de Memria ............................................................................................. 37 6. Modificadores de Tipos ...................................................................................................... 38 Dica: Pode-se definir valores em outras bases (diferente da decimal): ..................................... 38 7. Tabela ASCII (American Standard Code for Information Interchange) ............................ 39 8. Cdigo de Barra Invertida .................................................................................................. 40 Operadores Aritmticos................................................................................................................. 42 1. Operadores Aritmticos ...................................................................................................... 42 Os operadores aritmticos so os operadores usados nas operaes bsicas da matemtica. Esses operadores so usados para representar as expresses matemticas, os resultados so valores numricos. ..................................................................................................................... 42 Eles so: +, -, *, /. ...................................................................................................................... 42 Ainda existem o mod e o div, que representam o resto da diviso e o quociente da diviso na respectiva ordem. Esses operadores somente podem ser usados para nmeros inteiros. .......... 42 Operadores Aritmticos da Linguagem C ................................................................................. 43 2. Operadores de Incremento e Decremento .......................................................................... 43 3. Operadores Aritmticos de Atribuio ou C Reduzido ...................................................... 43 4. Converso de Tipo ............................................................................................................. 43 Prioridade dos Operadores Aritmticos ........................................................................................ 44 Funes Matemticas e Operadores Bit a Bit................................................................................ 47 1. Funes Matemticas ......................................................................................................... 47 2. Operadores de deslocamento de bits .................................................................................. 47 1. Funo Rand() e SRand() ................................................................................................... 48 Estrutura de Controle Linear/ Sequencial...................................................................................... 49 Funes de Entrada e Sada Formatada ......................................................................................... 50 1. Funo de Sada - printf() ................................................................................................... 50 2. Funo de Entrada scanf() ............................................................................................... 51 1. Funo de Entrada de caracter getch() e getchar() ........................................................... 52 Exemplos ....................................................................................................................................... 52 Exerccios Resolvidos e Propostos ................................................................................................ 55 Operador Relacional e Lgico ....................................................................................................... 56 1. Operadores Relacionais ...................................................................................................... 56 2. Operadores Lgicos ............................................................................................................ 56 3. Tabela Verdade: o conjunto das possibilidades combinatrias dos operadores lgicos. 57 4. Prioridade dos Operadores ................................................................................................. 57 Estrutura de Deciso /Condicional/ Seleo ................................................................................. 58 Exerccio Resolvido ...................................................................................................................... 59 Tipos de Estruturas de Deciso ..................................................................................................... 60 1. Estrutura de Deciso Simples ............................................................................................. 60 2. Estrutura de Deciso Composta: ........................................................................................ 61 3. Estrutura de Deciso Encadeada: ....................................................................................... 62 Intervalos ....................................................................................................................................... 63 Operador Ternrio ......................................................................................................................... 64 Seleo Mltipla ............................................................................................................................ 65 Exerccios Resolvidos ................................................................................................................... 67 Prof Angelina V.S.Melar 3
Variveis de Bloco ........................................................................................................................ 68 Estrutura de Repetio................................................................................................................... 69 Estrutura de Repetio Condicional (Enquanto..Faa / Faa..Enquanto / Repita..at) ................ 70 1. Repetio com Pr-condio- Enquanto..faa .................................................................... 70 2. Repetio com Ps-condio - Faa..Enquanto ................................................................. 71 3. Repetio com Ps-condio - Repita..at ......................................................................... 71 4. Comandos Break, Continue funo Exit() ........................................................................ 72 5. Enquanto Verdadeiro .......................................................................................................... 73 Repetio Pr-Definida Para ...................................................................................................... 75 6. Estrutura em C .................................................................................................................... 76 Variveis Contadoras e Acumuladoras ......................................................................................... 78 SubAlgoritmos/ Modularizao .................................................................................................... 79 1. Sub-Rotinas (Mdulos) ...................................................................................................... 79 2. Declarao da Funo......................................................................................................... 79 3. A funo principal - main() ................................................................................................ 80 4. Comando Return ................................................................................................................ 81 5. Tipo Void ........................................................................................................................... 81 6. Prottipos de Funes ........................................................................................................ 82 7. Chamada (ativao) da Funo ......................................................................................... 82 8. Exemplo Completo de Funo ........................................................................................... 83 9. Classes de Armazenamento de Variveis ........................................................................... 83 Funo com Passagem de Parmetro por Valor ............................................................................ 85 Funes Recursivas ....................................................................................................................... 89 Vetores .......................................................................................................................................... 91 1. Conceito ............................................................................................................................. 91 2. Exemplos: ........................................................................................................................... 91 3. Declarao: ......................................................................................................................... 91 4. Acessando os elementos ..................................................................................................... 92 5. Armazenando os elementos ................................................................................................ 92 6. Endereo do vetor ou matriz unidimensional ..................................................................... 92 7. Exerccios Resolvidos: ....................................................................................................... 93 Vetor String (Cadeias de Caracteres) ............................................................................................ 94 Matriz ............................................................................................................................................ 98 1. Matriz Bidimensional ......................................................................................................... 98 2. Declarao: ......................................................................................................................... 98 3. Armazenando os elementos ................................................................................................ 98 4. Armazenamento feito via teclado ....................................................................................... 99 5. Mostrando os elementos ..................................................................................................... 99 Ponteiros ...................................................................................................................................... 100 1. Variveis ponteiros ........................................................................................................... 100 2. Trabalhando com Matriz atravs de Ponteiros ................................................................. 103 Funes com Passagem de Parmetros por Referncia ............................................................... 105 3. Passagem de Matriz por Referncia ................................................................................. 106 Estruturas ..................................................................................................................................... 108 Unio e Enumerao ................................................................................................................... 116 1. Unio union ................................................................................................................... 116 2. Tipo enumerao .............................................................................................................. 117 Arquivos ...................................................................................................................................... 118 Prof Angelina V.S.Melar 4
3. Abertura do arquivo.......................................................................................................... 118 4. Fechamento do arquivo .................................................................................................... 119 5. Leitura .............................................................................................................................. 119 6. Gravao ........................................................................................................................... 120 Posicionamento e Pesquisa em arquivo binrio ...................................................................... 125 7. Verificando o final do arquivo binrio ............................................................................. 125 8. Para apagar um arquivo .................................................................................................... 125 Conceitos Bsicos ....................................................................................................................... 126 Nvel de Programao das Linguagens ....................................................................................... 128 Bibliografia Consultada e Referenciada ...................................................................................... 129
Lgica de Programao
A lgica usada na programao a mesma lgica usada diariamente pelas pessoas. a lgica uma das caractersticas que diferencia um ser humano de outro, capaz de torn-lo mais coerente e racional nas suas aes e com bom senso para tomar as decises. Mas como essa lgica? De onde ela vem? A palavra lgica vem do grego logos, que significa expresso, pensamento, conceito, discurso, razo. Uma das definies de lgica encontrada no dicionrio Aurlio a coerncia do raciocnio de idias. O estudo da lgica comeou na Grcia antiga com o filsofo Aristteles, que definiu lgica como sendo a cincia da demonstrao. Segundo Aristteles, a lgica estuda a razo como instrumento da cincia ou meio de adquirir a verdade. Como o objetivo da razo o raciocnio, a lgica est ligada ao raciocnio, uma operao discursiva do pensamento que consiste em encadear logicamente juzos e dele tirar uma concluso. O escritor Othon Manoel Garcia define lgica como a cincia das leis ideais do pensamento, a arte que nos faz proceder, com ordem, facilmente e sem erro, no ato prprio da razo. O que ter lgica? Ter lgica estar em uma determinada situao e saber a melhor maneira de proceder. conseguir visualizar todas as possibilidades existentes daquele momento e decidir pela mais adequada. Quanto mais a pessoa tenta raciocinar corretamente ela estar procurando ter lgica. Forbellone, destaca a lgica usada no dia-a-dia, pois quando pensamos, falamos, agimos estamos criando uma ordem no pensamento e nas aes, isto utilizar lgica. Mas e a Lgica de Programao? Segundo Forbellone, a aplicao das leis do pensamento e de processos simbolizados de maneira formal nos computadores, onde so empregadas tcnicas para a produo de solues logicamente vlidas e que resolvem problemas que sero programados. Para isso sero desenvolvidos os Algoritmos. O que um bom programa/sistema? O importante na programao desenvolver programas que atendam as necessidades do usurio, com funcionalidade, rapidez, desempenho e confiabilidade. Um bom programa no depende exclusivamente da linguagem de programao. O que eu devo fazer agora????? Segundo Forbellone, ...fundamental formao do profissional de programao esto a desenvolver a lgica e a construo de algoritmos... preciso ter Lgica de Programao: Ter lgica raciocinar coerentemente, avaliar as aes tomadas, organizar o pensamento, visualizar todas as possibilidades, atualizar as informaes e traar um objetivo Mas como passar a nossa lgica para o computador? Uma das ferramentas para isso o Algoritmo. Prof Angelina V.S.Melar 7
Algoritmo
O objetivo de todo o estudo da Lgica de Programao a construo de Algoritmos coerentes e vlidos. O algoritmo um processo onde voc organiza e coloca passo a passo suas idias para atingir um objetivo pr-definido. Tambm pode-se definir como uma sequncia de passos. Esse processo feito numa linguagem fcil, em seqncias ordenadas e encadeadas, de forma que as pessoas possam us-la sem problemas. O algoritmo uma das primeiras e melhores formas usadas para se conseguir resolver problemas no computador ou mesmo na sua vida cotidiana. Quando voc precisar solucionar um problema a primeira coisa que dever fazer fazer uma anlise do mesmo, coletar os dados e estruturar as operaes que devem ser realizadas. Pense na sua vida real, num problema comum a todos. Vamos imaginar que voc ir organizar uma festa. Quais so os procedimentos a serem tomados? Para fazer um algoritmo desse problema preciso antes coletar as idias: - voc precisa convidar os amigos; - arrumar um som e msicas; - comprar salgados e bebidas; - procurar o local da festa; Depois organiz-las de acordo com suas prioridades. preciso saber qual o primeiro passo a se tomar para depois ver o momento de executar o segundo, no esquecendo que o primeiro deve j estar pronto. como fazer um pudim gostoso de forma rpida. Como voc faria? Voc colocaria a forma no forno aceso antes de fazer a massa? Como voc usaria seu raciocnio lgico nesse procedimento? por isso que devemos aprender a ter um raciocnio lgico. Ser atravs dele que voc conseguir ser um bom programador. Quando comearmos a desenvolver algoritmos estaremos desenvolvendo nosso raciocnio lgico, pois comearemos a prestar mais ateno aos detalhes. Observaremos que cada situao, por mais simples que seja pode-se tornar complicada. Mas como assim? Vocs devem estar pensando. Estado inicial aes empregadas de forma clara e precisa
Perodo de tempo finito
Algoritmo
Pensem neste problema: Como voc faria para comer uma banana? Podemos fazer um Algoritmo que usa o portugus coloquial para resolver isso: 1 Voc ter que saber onde est a banana 2 Pegar a banana 3 Descascar a banana 4 Por fim, comer a banana. Parece ser simples resolver esse problema, onde citamos quatro etapas ordenados de procedimentos. Mas ser que voc pensou em tudo? Ser que a sua lgica est bem desenvolvida? Se voc acha que sim, errou. Voc ainda precisar desenvolver muito o seu raciocnio lgico. Mas por qu? Voc deve estar fazendo est pergunta. Eu respondo na criao de um novo algoritmo: Voc ter que saber onde est a banana Pegar a banana Descascar a banana Verificar se a banana no est estragada por dentro Se estiver estragada o Voc dever jog-la Seno, se estiver inteira boa o Voc dever comer a banana. Nesse caso a sua lgica est mais elaborada, verificando uma situao que pode ocorrer. Mas ainda no est totalmente completa. Pois, voc no acha que a pessoa na hora de pegar a banana j deveria ver o estado da banana por fora? Se ela estiver preta ou amassada, ento a pessoa j deveria t-la jogado fora e pegado outra, de forma que todo o processo seria repetido novamente. Veja no algoritmo abaixo: 1 Voc ter que saber onde est a banana 2 Pegar a banana 3 Verificar o estado da banana por fora 4 Se a banana estiver preta ou amassada - dever ser jogada fora - e pegar outra banana - verificar o estado da banana - se a banana estiver preta, amassada ..... 5 Se a banana estiver com aparncia bonita por fora dever ser descascada 6 Verificar se a banana no est estragada por dentro 7 Se estiver estragada voc dever - jog-la - pegar outra banana - verificar o estado da banana por fora - se a banana estiver preta, amassada - dever ser jogada fora - pegar outra banana - verificar o estado da banana - se a banana estiver preta, amassada ..... Prof Angelina V.S.Melar 9
o Sequncia Linear ou Estrutura Sequencial: onde um conjunto de aes so executadas uma aps a outra, passo a passo, num fluxo contnuo do comeo ao fim. A execuo comea de cima para baixo, da esquerda para a direita o Estrutura Condicional ou Estrutura de Seleo ou Estrutura de Deciso: a ordem de execuo e as aes dependem do valor resultante de uma verificao. Nem sempre se quer que todas as aes sejam executadas, de forma que se pode fazer uma seleo e desvio delas de acordo com um teste condicional. o Estrutura de Repetio: algumas aes podem ser repetidas, executadas vrias vezes. Nessa estrutura a sequncia de execuo depender de uma condio, onde dependendo do resultado dela, ser mudada ou no a sequncia de execuo.
operaes. Lembre-se que quando voc precisar de uma informao e ela no estiver no enunciado, isso significa que ela uma entrada. Verifique as regras que esto explicitas e implcitas: o processamento As sadas podem ser consultas ou operaes de transformao dos dados de entradas em sadas. Defina as informaes que devem ser mostradas no final, ou seja, as respostas do problema. Desenvolva o algoritmo. Verifique se o algoritmo feito est atingindo o seu objetivo: teste Para isso faa alguns testes com dados fictcios e verifique se o algoritmo est mostrando corretamente a soluo do problema. Se o resultado no for satisfatrio, leia novamente o enunciado, revise o algoritmo e efetue novos testes, at conseguir o resultado desejado. ABSTRAO Existe dentro da resoluo de problemas o termo Abstrao. Ao desenvolver um algoritmo voc est preocupado em desenvolver e representar o raciocnio lgico de programao, mas sem se ater a detalhes computacionais, que sero depois pensados e acrescidos na codificao. Ento ao abstrair, se deixa de lado as informaes suprfluas, se atem ao que importante para chegar a resoluo do problema. A abstrao tem como objetivo tirar informaes suprfluas e introduzir uma notao concisa. Para esse objetivo ser alcanado devem-se identificar os objetos e os aspectos importantes, dar-lhes nomes e definir operaes que possam ser aplicadas aos objetos, permitindo assim realizar uma consistncia em relao as regras do problema.
Etapas de Desenvolvimento
No Processamento de Dados se recebem os dados, se realizam as operaes sobre esses dados e no final so geradas as respostas ou resultados como sada. Entrada Processamento Sada
Entrada: A entrada o processo onde voc avalia o enunciado do problema e verifica quais dados esto presentes no enunciado e quais no esto, mas que so essenciais para a soluo do problema. Quando faltar algum dado voc ter que receb-lo de alguma maneira. Sem as entradas no h como resolver um problema. O nmero de entradas muito variado e depende do objetivo do programa. A entrada pode ser recebida por vrios dispositivos de entradas. Pode ser lida de um arquivo ou de qualquer outro perifrico de entrada, como teclado ou scanner. Ento, a entrada pode ser direta, atravs do usurio (receber o salrio) ou indireta, atravs da mquina (pegar a data do sistema). Cuidado: no so entradas os dados que podem ser gerados atravs de um clculo ou de outras entradas. Processamento: um processo que pega os dados de entrada e efetua uma operao (que pode ou no ser matemtica), ou uma atribui. Nessa etapa tambm podem ser feitas comparaes e consultas, gerando dessa forma o resultado e a soluo do problema. Sada: a parte mais fcil e mais importante de todo o processo, onde devem ser exibidos os resultados de todo o processamento. A sada pode ser feita por qualquer dispositivo de sada, desde o monitor at a caixa de som. Vamos mostrar as etapas de desenvolvimento com um exemplo muito simples e fcil de resolver. Depois aumentaremos o grau de complexidade, mostrando sempre as alteraes. 1 Exemplo: O Analista de Sistemas Joaquim pediu para o programador Jlio fazer um programa que efetue a multiplicao de dois nmeros. 1 necessrio ler atentamente todo o exerccio. 2 Retire o que suprfluo, fique apenas com os dados necessrios. 3 Defina as trs etapas principais de seu algoritmo: Entrada: Quais os dados de entrada necessrios? Lendo o enunciado verificamos que para fazer o clculo necessrio ter dois nmeros, s que estes no foram especificados e no sabemos quais so, por isso devemos receb-los. Outro detalhe importante ignorar/desprezar a histria colocada no enunciado, como os nomes e funes dos personagens. Processamento: Qual clculo deve ser feito com os dados de entrada? Lendo o enunciado vemos que a operao a ser feita com os dados de entrada a multiplicao. Prof Angelina V.S.Melar 12
Sada: O que dever ser mostrado? Qual o objetivo do enunciado? O objetivo do enunciado calcular e mostrar o resultado da multiplicao de dois nmeros. Tendo as idias s montar o algoritmo: 1 Saber o valor do primeiro nmero 2 Saber o valor do segundo nmero 3 Fazer a multiplicao dos dois nmeros Nmero 1 x Nmero 2 = ??? 4 Mostrar o resultado da multiplicao 2 exemplo: Juracema foi a livraria e comprou dois livros iguais de programao. Quanto ela pagar? Entrada: Quais so os dados de entrada necessrios? Saber o preo do livro Processamento: Qual clculo deve ser feito com os dados de entrada? Multiplicar o preo pela quantidade comprada, no caso 2. Veja que nessa situao a quantidade j foi informada (2 livros), por isso, j a temos e no devemos solicit-la como entrada. Sada: O que dever ser mostrado? Qual o objetivo do enunciado? Descobrir o valor que Juracema ter que pagar no caixa. Algoritmo: 1 Receber o valor do livro 2 Multiplicar o valor do livro por dois (2). 3 Mostrar o resultado do clculo da multiplicao
Tipos de Algoritmos
Os algoritmos podem ser escritos de diferentes maneiras, dependendo da sua aplicao. Nesta apostila desenvolveremos os algoritmos de forma estruturada e padronizada (pseudocdigo), possibilitando com isso um melhor entendimento dos processos. 1. Tipos de Algoritmos Os tipos de algoritmos mais conhecidos so: Descrio Narrativa Fluxograma Pseudocdigo Diagrama de Chapin Todos esses tipos de algoritmos consistem em analisar o enunciado do problema e descrever os passos necessrios para a resoluo do problema. O que os diferencia a forma de descrever e simbolizar esses passos. At o momento todos os algoritmos feitos foram atravs da Descrio Narrativa. Descrio Narrativa ou Linguagem Natural: A Descrio Narrativa consiste em analisar o enunciado e escrever os passos utilizando uma linguagem natural, usada diariamente pelas pessoas. Vantagem: no necessrio aprender nenhum conceito novo, pois a lngua natural (portugus) j conhecida. Desvantagem: a ambigidade da linguagem coloquial, o uso de adjetivos ou a falta de clareza quanto as frmulas matemticas. A lngua natural abre espao para vrias interpretaes (dependendo da pessoa que o ler), o que posteriormente dificultar a transcrio desse algoritmo para programa.
Fluxograma: O Fluxograma consiste em analisar o enunciado e escrever os passos utilizando smbolos grficos predefinidos. Vantagem: o entendimento de elementos grficos mais fcil que o entendimento de textos. Desvantagem: necessrio aprender a simbologia grfica do fluxograma e as correes so mais trabalhosas por se tratar de representao grfica.
Pseudocdigo (portugus estruturado - portugol - pseudolinguagem): O Pseudocdigo consiste em analisar o enunciado e escrever os passos por meio de regras pr-definidas. As regras usadas neste material so estruturadas de acordo com a programao na linguagem C. Vantagem: a passagem do algoritmo para qualquer linguagem de programao quase imediata, bastando conhecer as palavras reservadas da linguagem de programao que ser utilizada. Ser como uma traduo, j que ser criada a estrutura do algoritmo baseada na linguagem. Desvantagem: necessrio aprender as regras do pseudocdigo.
Pseudocdigo
Como j foi mencionada acima a passagem do pseudocdigo para uma linguagem de programao mais rpida e a probabilidade de erros menor. Regras de criao do Pseudocdigo 1. Todos os programas tm um comeo, um meio e um fim. Dessa forma, deve ser indicado o incio e o fim, internamente as aes que sero executadas. 2. Deve ser usado o recurso de endentao, que deslocamento horizontal, transmitindo o sentido de hierarquia de execuo. 3. Deve ser feito uso de termos nicos que definem uma ao, como: escreva, leia, se..ento. 4. Deve ser feito uso do conceito de variveis, assim como sua declarao. Exemplo de Problema: Receba um nmero real e verifique se este positivo, negativo ou nulo Descrio Narrativa 1 Receber um nmero 2 Se o nmero for maior que zero, ento, mostre uma mensagem alertando que o nmero positivo. 3 Se o nmero for menor ou igual 0 ento, deve aparecer uma mensagem avisando que o nmero negativo ou nulo. Pseudocdigo Incio real num; escreva (Digite um nmero); leia (num); se (num > 0) ento escreva (Nmero positivo); seno escreva (Nmero negativo ou nulo); Fim Qual das formas anteriores voc escolheria para construir um algoritmo? Qual desses exemplos mostra de forma mais clara as aes?
Fluxograma
O fluxograma um tipo de Algoritmo que representa graficamente (figuras geomtricas) os passos necessrios para a resoluo do problema. Para cada passo efetuado, seja o de entrada, o de processamento, o de sada ou condio tem-se um smbolo de representao. Algumas empresas adotam smbolos padronizados no fluxograma. Com a representao por smbolos grficos fica mais rpida a visualizao da lgica empregada para resolver o problema.
Smbolo Nome Terminal Processamento Conexo Direo do Fluxo Deciso Processamento Prdefinido Teclado de Linha Entrada/Sada Documento ou Relatrio Exibio Conector de Pgina Subrotina Finalidade Indica o incio, continuidade ou fim Indica operao, clculo ou atribuio Utilizado para ligar pontos do fluxograma Utilizado para indicar a seqncia da execuo, conecta os smbolos Indica a tomada de uma deciso ou comparao. Podendo provocar desvios na seqncia lgica de execuo Utilizado nas estruturas de repetio Indica a entrada de dados por via teclado Pode ser usado tanto para entrada quanto para a sada de informaes Indica operao de sada via impressora Indica as sadas de informaes por dispositivos visuais Usado para indicar a sequncia em outra folha/pgina Especfica a chamada de uma subrotina
O fluxograma para ser feito com xito, mostrando claramente os processos, deve seguir algumas regras: _ ser bem confeccionado; _ ser legvel; _ ter smbolos bem dimensionados e alinhados; _ ter setas que indiquem a direo do fluxo das informaes; _ a direo dos lados para as condies devem ser fixos; _ o fluxo deve comear de cima para baixo e da esquerda para a direita; _ no pode haver encontro das linhas de indicao do fluxo. _ as informaes escritas dentro dos smbolos devem ser claras, resumidas e bem entendidas.
Estrutura a ser usada
Veja os smbolos a serem usados e uma explicao mais detalhada de suas finalidades.
TERMINAL: A principal representao desse smbolo indicar o incio e o fim de uma srie de procedimentos. Quando usarmos este smbolo devemos identificar sua funo escrevendo dentro dele as palavras INCIO, FIM. DIREO DE FLUXO: Essas setas indicam a direo do prximo passo a ser executado, que pode estar a direita, a esquerda, em baixo ou em cima. Ele conecta os smbolos e o fluxo de execuo, ou seja a sequncia da ao a ser executada.
Existem vrios smbolos que representam a entrada de dados, mas como a maioria dos programas a serem feitos tero os dados digitados via teclado usaremos o smbolo do trapzio.
TECLADO DE LINHA:
Receber SALARIO
PROCESSAMENTO: O smbolo do retngulo deve ser usado toda vez que existir
qualquer tipo de processamento; seja um clculo, uma atribuio de valores as variveis, ou mesmo alterao de qualquer dado.
B=6 C=A+B
SENHA = MARTH
EXIBIO: O smbolo de Exibio um smbolo grfico que representada sada,e serve para mostrar uma mensagem, um resultado.
CONEXO: Algumas vezes o espao reservado para fazer o fluxograma pequeno e temos que dividi-lo em partes, usando o smbolo grfico do conector.
INCIO
A=3
B=6
C=A+B
FIM
Diagrama de Chapin
O Diagrama de Chapin utiliza poucos smbolos e no precisa de nenhum conhecimento especfico. A desvantagem de uso ocorre quando precisa de muito espao na horizontal e fica mais difcil a compreenso. Veja os exemplos abaixo: a) Incio Escreva Mensagem Fim b) Incio Escreva Digite seu nome Leia NOME pelo teclado Escreva Bom Dia + NOME Fim c) Incio Leia A e B no teclado A maior que B? Sim Escreva A maior que B Fim No Escreva B maior que A
Nessa programao a sequncia de aes que sero executadas so seqenciais, obedecendo uma numerao de linhas. O nico modo de fazer desvios usando o V Para (codificando GOTO). Essa linguagem no possui estruturas de controle de repetio como Faa..Enquanto (while) e no permite a estratgia de modularizao. Exemplo de linguagem no estruturada: Assembly e Basic
Algoritmo No Estruturado: 1. V para DESVIO2 2. DESVIO1. 3. Se precisar comprar ento 4. V para DESVIO3 5. V para DESVIO5 6. DESVIO3. 7. Procure a chave do carro 8. Se achou ento 9. V para DESVIO 2 10. V para DESVIO 4 11. DESVIO2.
2. Programao Estruturada (Procedural): Em 1965 Edward Dijkstra apresentou um artigo que sugere a programao estruturada e a eliminao de comandos de desvio. Esse paradigma foi desenvolvido por Bohm e Jacopine em 1966, onde eles demonstraram que a lgica pode ser expressa atravs de algumas estruturas bsicas. Possuem as estruturas: linear (seqencial), deciso (condio ou escolha), de iterao (repetio ou lao) Em 1967, Floyd sugeriu o uso de comentrios intercalados. Em 1970, Nicklaus Wirth sugeriu o processo de decomposio (refinamento sucessivo das etapas). A linguagem estruturada foi desenvolvida em grande parte pela m legibilidade causada pelas instrues de controle de algumas linguagens no estruturadas. Na programao no estruturada se usava muito a instruo de desvio GOTO para criar estruturas de laos (iteraes). Segundo Rinaldi, o que caracteriza a programao estruturada a possibilidade de diviso de tarefas em rotinas ou blocos independentes entre si. A primeira regra para fazer um programa a decomposio lgica do problema em partes independentes. o Exemplo: Prof Angelina V.S.Melar 19
Modularidade
4. Estratgia de Decomposio ou Dividir para Conquistar A decomposio uma estratgia de resoluo de problemas. A idia dividir o problema em problemas menores (subproblemas), at que cada parte (subdiviso) seja pequena o bastante para que a soluo seja facilmente encontrada. Segundo Villas, o termo Dividir para Conquistar veio da guerra, onde mais fcil vencer grupos isolados de inimigos do que todos os inimigos juntos. A decomposio de um problema reduz a complexidade do mesmo, pois a complexidade tambm dividida. O foco da ateno fica isolado, de forma que se concentra em um problema por vez. Quando se tem todos de uma vez, o desenvolvimento da lgica se dispersa e no se chega a nenhum resultado. A soluo mais rpida, j que a complexidade menor que ao original. Como exemplo, podemos destacar o exemplo Folha de Pagamento de uma empresa. Supondo que o objetivo principal gerar o demonstrativo de um funcionrio. Inicialmente parece ser bem complexo, mas se voc analisar com calma tem como dividir esse problema, em problemas menores, como o de calculo de descontos e clculos de benefcios.
Esse processo deve ser feito da seguinte maneira: 1. Divida o problema em suas partes principais no caso da folha, descontos, benefcios seria um subproblema. 2. Analise a diviso e veja a coerncia da diviso
Prof Angelina V.S.Melar 20
3. Se uma diviso ainda estiver complexa, decomponha novamente. os descontos podem ser divididos por especialidade 4. Reavalie tudo novamente. Essa decomposio continua tambm conhecida como refinamento sucessivo. Porque parte de um problema complexo e abrangente que sucessivamente dividido em problemas mais simples e especficos. A tcnica de Refinamento Sucessivo tambm pode se chamar Top-down (de cima para baixo), uma vez que parte de um problema mais abrangente (abstrato) at atingir um nvel mais detalhado e especfico. Normalmente essa tcnica a mais fcil de compreender. Automvel inteiro peas separadas parafusos Existe a tcnica Bottom-up (de baixo para cima), que o inverso dessa. Essa parte dos conceitos mais detalhados e especficos e vai agrupando em nveis mais abrangentes (abstratos), at atingir o nvel desejado. Potenciao multiplicar somar o Segundo Rinaldo, a modulao uma tcnica de resoluo de problemas, onde se divide o problema maior (principal) em problemas menores. A soluo do problema maior ocorre em decorrncia da soluo dos menores.
5. Mdulos Cada subproblema um mdulo ou podemos dizer que um subalgoritmo ou subproblema que realiza tarefas especficas. Em termos funcionais, existem dois tipos de mdulos:
1. Procedimento: um mdulo que executa uma tarefa especfica, que pode ou no gerar
vrias sadas usando as variveis globais ou locais. Ele no retorna valores para o mdulo que o chamou.
2. Funo: um modulo que ir gerar uma nica sada e que ser devolvida para a funo principal ou mdulo que o chamou.
Subdiviso dos algoritmos complexos: facilita o entendimento; Estruturao de algoritmos: facilita deteco de erros e a documentao do sistema Modularizao de sistemas: facilita a manuteno e reutilizao do algoritmo
Linguagem C
A linguagem C foi desenvolvida por programadores para programadores. Ela se popularizou rapidamente devido a sua velocidade, segurana e eficincia. Com ela possvel desenvolver desde um simples programa (uma calculadora) at um sistema operacional.
Origens da linguagem C A linguagem C foi criada por Dennis Ritchie em 1972. Sua origem foi atravs da linguagem BCPL, desenvolvida por Martin Richards, que influenciou Ken Thompson a criar o B, que levou a linguagem C. Com a popularizao dos microcomputadores houve um aumento no desenvolvimento de implementaes em C, criando discrepncias entre elas. Para resolver essa situao, o rgo americano de padronizao (American National Standards Institute), em 1983, criou C padro ANSI, estabelecendo uma definio padronizada da linguagem C. A maioria dos compiladores so compatveis com esse padro. A linguagem C++ foi construda sobre os fundamentos da linguagem C e d suporte para a Programao Orientada a Objetos. Existem vrios ambientes de desenvolvimento para a linguagem C, como: DEV-C++, Visual C++, Turbo C, CodeBlocks. O ambiente a ser usado o Dev-C++, cujo compilador a implementao Mingw do GCC (Gnu C Compiler). Resumo histrico 1966 BCPL (Martin Richards) 1970 - B (Ken Thompson) 1972 C (Dennis Ritchie) 1978 Livro The C Programming Language (Brian Kernigham e Dennis Ritchie) 1983 - C padro ANSI - rgo americano de padronizao (American National Standards Institute) O padro ANSI definiu o contedo da biblioteca padro C, palavras reservadas, estrutura da linguagem (prottipo da funo). 1985 - C++ ( o C projetado para suportar Programao Orientada a Objetos). Caractersticas e Vantagens: Facilidade para aprendizagem de outras linguagens de programao, inclusive as orientadas a objetos Constitudo por funes Linguagem de programao estruturada Ferramenta poderosa de desenvolvimento (pode desenvolver um editor de texto, um aplicativo comercial, um programa para microcontrolador) Portabilidade- em relao a mudana do cdigo para plataforma Windows ou Linux Linguagem compiladora
Uma linguagem de programao pode ser compiladora ou interpretadora. O que as distingue a forma com que elas executam o programa. O interpretador l o cdigo fonte linha a linha, executando-as em seguida. J o compilador, l o cdigo fonte inteiro e se este no tiver erros de sintaxe, ser convertido em um cdigo de mquina, fazendo com que o processador consiga entend-lo e execut-lo. Se forem feitas alteraes no programa, este ter que ser compilado novamente, gerando um novo cdigo de mquina. Um computador s pode executar programas em linguagem de mquina. Cada programa executvel uma seqncia de instrues que o processador interpreta e executa as operaes correspondentes. O cdigo fonte a traduo dos comandos do pseudocdigo para as respectivas instrues da linguagem de programao (por exemplo, linguagem C). Essas instrues depois so traduzidas para a linguagem da mquina (que a linguagem interna que o computador entende). O arquivo objeto somente gerado quando o arquivo fonte no possui erro de sintaxe.
7. Ciclo de Vida do Programa Criao do programa Para se fazer um programa deve-se escrever uma sequncia correta de instrues que devero se executados pelo computador. Para se chegar nessa sequncia deve-se desenvolver o Algoritmo. Essa lgica deve ser desenvolvida numa linguagem natural, parecida com a do ser humano, que pode ser a Descrio Narrativa e o Pseudocdigo. Depois de solucionado o problema e escrito o algoritmo em pseudocdigo, este deve ser passado para uma linguagem de programao, ou seja, codificado. Na nossa disciplina ser usada a linguagem de programao C. O programa codificado e digitado se chama Arquivo Fonte. Este deve ser salvo com a extenso .C. Se no for digitada a extenso, ser assumir a extenso .cpp que padro do ambiente de desenvolvimento (cpp significa c plus plus ou c++). Para executar esse programa necessrio compil-lo e link-lo. Na compilao as instrues (linhas) so verificadas e interpretadas pela mquina (CPU), se no houver erros de sintaxe, ser gerado o arquivo executvel (extenso .exe). O linkeditor (linker) une os cdigos dos arquivos de bibliotecas usados pela linguagem C com os arquivos fontes criados pelo programador. Para ver o programa funcionando basta digitar seu nome ou dar um duplo clique no cone do programa, de acordo com o ambiente que voc estiver (texto ou grfico). Os erros de lgica s podem ser detectados pelo programador depois de gerado o arquivo executvel.
Resumo das etapas da criao de um programa 1. Necessidade de um programa 2. Enunciado do problema 3. Descrio das idias numa linguagem natural Descrio Narrativa Algoritmo 4. Criao da sequncia correta de instrues Pseudocdigo - de acordo com o mtodo da linguagem a ser usada (estruturada) 5. Codificao para uma linguagem de programao Linguagem C 6. Processo de compilao Verificao dos erros de sintaxe, gerao do arquivo objeto, unio com as bibliotecas 7. Criao do arquivo executvel
O ciclo de criao de um programa em C pode ser analisado abaixo, na seqncia de figuras abaixo.
arquivo fonte arquivo objeto arquivo fonte ... arquivo objeto arquivo biblioteca
Linkedio
arquivo executvel
2. Configurando o ambiente e o editor As configuraes padres do compilador, do ambiente e do editor de texto podem ser alteradas atravs do menu Ferramentas. Se o seu ambiente est em ingls mude-o para portugus atravs do menu Tools (ferramentas) opo Environment Options (Opes do Ambiente) guia Interface escolha o portugus. Procure personalizar o seu ambiente de trabalho, criando atalhos e facilidades no processo de digitao. Por exemplo: Menu Ferramentas Opes do Editor Ative a opo Destacar as chaves e os parnteses. Na guia Display ative a opo Nmeros das linhas. No menu Exibir desabilite a exibio do Navegador de classes/projetos clicando apenas uma vez nessa opo.
3. Configuraes para o Windows Vista/7 Para que o Dev funcione corretamente no Windows Vista, algumas configuraes devem ser feitas: No menu Ferramentas escolha a opo Opces do Compilador na guia Diretrios, em Binrios deve ser adicionado o caminho C:\DevCpp\libexec\gcc\mingw32\3.2 (se no houver). Na guia Programas deve ser colocado C:\Dev-Cpp\bin\ em cada linha. Por exemplo, a primeira linha fica assim: C:\Dev-Cpp\bin\gcc.exe 4. Digitao do programa Para a digitao do programa no DEVC++ necessrio seguir os seguintes passos: 1. No menu escolha a opo Arquivo (File); 2. Escolha a opo Novo e depois Arquivo Fonte ou se preferir a tecla de atalho <CTRL> e <N> simultaneamente; 3. Aparecer uma nova janela, com o ttulo: (*) Sem Ttulo 1, onde deve ser feita a digitao do programa fonte. 4. Dependendo da verso, ou mesmo da configurao pr-definida no editor, aparece um programa inicial. Pode-se apag-lo ou deix-lo, aproveitando as linhas de cdigo j digitadas. 5. Gravao do programa Aps a digitao do programa, ele dever ser salvo antes de ser executado, de acordo com as etapas abaixo: 1. No menu Arquivo escolha a opo Salvar ou use a tecla de atalho <CTRL> e <S> simultaneamente. 2. Escolha o diretrio de trabalho, digite o nome do arquivo fonte e pressione o boto Salvar. Observe que a extenso padro do DEV-C++ o .cpp. Ao salvar o arquivo fonte, cuidado para no salva-lo com nome invlido (com espao entre as palavras, iniciado com nmero.
Toda vez que voc pressionar o F9 para compilar e executar o Dev estar salvando automaticamente seu programa.
6. Compilao e execuo do programa Existem diversas maneiras de ver se o programa est sem erros e funcionando, entre elas: 1. Escolhendo a opo Executar (Execute) do menu e dentro dela a opo Compilar e Executar (Compile and Run); ou 2. Pressionando a tecla de funo <F9> ou na barra de ferramentas a opo Compilar e Executar. Se voc quiser apenas verificar se existem erros no programa, poder inicialmente compil-lo (atravs do menu Executar, opo Compilar) e futuramente execut-lo (atravs do menu Executar, opo Executar).
Uma boa forma de configurar o editor criar um modelo inicial de programa fonte, ou seja, toda vez que for iniciado um novo arquivo ir aparecer o modelo que voc definiu. As linhas de comandos e bibliotecas mais comuns ficam digitadas neste modelo. Para criar o modelo de cdigo padro escolha a opo Ferramentas, depois Opes do Editor e a guia Cdigo. Na parte inferior clique no Cdigo Fonte Padro e digite seu cdigo fonte.
Os caracteres especiais acentos, cedilha nesse ambiente console so convertidos.
1. Estrutura bsica Um programa feito na linguagem C constitudo basicamente de: Documentao do programa: comentrios que o programador considera importante, como objetivo do programa. Cabealho: Diretivas de pr-processamento, onde sero definidas as constantes e includos os arquivos de cabealho. Declarao e inicializao de variveis globais. Blocos de instrues: um bloco principal (funo main) e outros blocos de rotinas (outras funes chamadas a partir da main()). 2. Diretivas As diretivas do pr-processador iniciam com o smbolo # e cada diretiva deve ser escrita em linha distinta. As diretivas instruem o compilador a execuo de uma ao dentro do cdigofonte do programa em C. As diretivas do padro C ANSI a serem usadas so: #include, #define. O pr-processador do C um programa que examina o arquivo fonte e executa as devidas modificaes com base nas diretivas. Como por exemplo, ao encontrar a diretiva #include ele faz um desvio, localiza a funo na biblioteca e adiciona seu cdigo ao cdigo do arquivo fonte.
#include Essa diretiva quando lida faz a incluso de um arquivo de cabealho ao arquivo-fonte. Exemplo: #include <stdio.h> arquivo de cabealho: stdio.h
STD standard padro I input O output Funes padres de entrada e sada Funes associadas: scanf(), printf()
#define Essa diretiva define um identificador (constante simblica) e uma string que o substituir toda vez que for encontrado no cdigo-fonte. Estrutura: #define identificador string
Exemplo:
#define EXIBA printf #define TEXTO \nProgramao de Computadores na Fatec main() { EXIBA(TEXTO); }
Ao ser executada a diretiva #define, o compilador associa a palavra EXIBA a palavra printf e toda vez que aparecer a palavra EXIBA ele a substituda por printf e a palavra TEXTO ser substituda por \nProgramao de Computadores.
3. Arquivos de Cabealho (header) Cada funo definida na biblioteca C tem seu respectivo arquivo de cabealho (como citado acima), ou seja, se voc utilizar uma funo de entrada -scanf()- ter que incluir seu respectivo arquivo de cabealho (stdio.h) no incio do programa. Esse arquivo possui a definio de tipo e o prottipo da funo. Os arquivos com a extenso .h, so chamados de arquivos de cabealho, ou header files. Arquivo de cabealho stdio.h conio.h/conio.c math.h stdlib.h time.h string.h Finalidade
Suporta entrada e sada com arquivos Suporta E/S pelo console Possui diversas funes matemticas Declaraes miscelneas Funes de horrio do sistema Funes de string
Dica: O arquivo de cabealho feito pelo programador colocados entre . Exemplo: #include funccondicao.h Prof Angelina V.S.Melar 30
4. Biblioteca Uma biblioteca uma coleo de funes. Um arquivo de biblioteca armazena o nome de cada funo, mais as informaes necessrias para o processo de linkagem. Quando o programa se referencia a uma funo, o linkeditor procura a funo na biblioteca (que possuem vrias) e adiciona a parte do seu cdigo ao programa. As funes padres existentes na biblioteca do compilador C foram definidas pela ANSI. Algumas empresas criaram funes novas e acrescentaram ao compilador, como por exemplo, a Borland, acrescentou ao Turbo C a biblioteca CONIO (Console Input/Output). 5. Bloco de instrues e Funo MAIN() Todos os programas na linguagem C comeam executando o contedo descrito na funo principal (main) e finalizam com o trmino dessa funo. Essa funo determina a execuo e ordem de execuo das demais funes que existirem. As funes possuem um conjunto de instrues (bloco de comandos) com uma tarefa especfica, como por exemplo, uma funo para calcular um desconto ou logaritmo de um nmero. O contedo de uma funo delimitado por chaves { }- incio e fim. O cdigo que estiver dentro das chaves ser executado seqencialmente quando a funo for chamada. 6. Projeto Pode ser criado um projeto em C, onde podem existir vrios programas (arquivos fontes), mas um nico arquivo executvel gerado pelo compilador. Nos projetos sempre haver um arquivo com a funo principal (main()) que indicar o incio do projeto.
Espaos
7. Regras de Digitao e Dicas da Estrutura em C em branco so desconsiderados D preferncia para um cdigo limpo, fcil de entender, com alinhamento e endentao. Como no exemplo que segue: Com espaos Sem espaos (correto e incompreensvel) (correto e compreensvel) #include <stdio.h> #include <stdio.h> main() { .} main() { . }
diferenciao de letras maisculas e minsculas (case sensitive) A linguagem C case sensitive, ou seja, diferencia letra maiscula da minscula. Exemplo: NOME diferente de Nome que diferente de nome. As palavras-chaves de C so minsculas. (else palavra-chave, mas ELSE ou Else no so). Os parnteses aps o nome de uma funo, como a funo main() obrigatrio. As chaves { } servem para delimitar um bloco de instrues. As variveis devem ser declaradas no incio.
No
C para indicar o final de uma instruo deve ser usado o ;(ponto-e-vrgula). Se for necessrio podem ser digitadas vrias instrues numa mesma linha. Como por exemplo: printf Exemplo da Estrutura ; printf de um Programa em C;
Cuidado com as palavras reservadas, exemplo: include, printf, main. Na linguagem C tem 32 palavras, sendo que 27 criadas pelo Dennis Ritchie e 5 do padro ANSI. 8. Comentrios Para facilitar a compreenso coloque comentrios ao decorrer do cdigo. Esses comentrios podem ser feitos de duas maneiras: usando duas barras para comentrios de uma nica linha barra asterisco para comentrios de mais de uma linha.
Exemplos: a) Comentrio de uma linha #include <stdio.h> //Essa linha inclui a biblioteca que tem funes de entrada e sada O comentrio tambm pode ser iniciado no comeo da linha soma = n1 / n2; //o operador de diviso a barra
b) Comentrio com vrias linhas /* Autor: Julia Melar Data: 15/07/2007 Sistema: Cadastro de Fornecedores */
Variveis
Os dados armazenados no computador podem ser apresentados de duas formas diferentes: como constantes ou variveis.
1. O que so variveis? Os dados fornecidos pelos dispositivos de entrada ou aqueles dados processados so armazenados numa rea da memria do computador chamada de varivel. A varivel uma posio reservada da memria que usada para armazenar um valor (tipo de dado) temporariamente. Esse valor pode ser alterado a qualquer momento durante a execuo do programa. Essas variveis so utilizadas como reas de trabalho, ou seja, como uma lousa, onde podemos escrever, modificar e apagar quantas vezes for necessrio. Cuidado: cada varivel armazena um nico contedo por vez, quando for inserido um novo valor, o anterior apagado. Memria Variveis
2. Mas em que parte da memria vo os dados? Cada dado ser armazenado em uma posio diferente da memria, essa posio um endereo fsico da memria RAM. Todos esses endeeos precisam ser identificadas, ou seja, ter um nome de referncia para cada alocao feita na memria. O nome (identificador) da varivel torna-se o seu endereo. Imaginem como voc encontraria uma pessoa sem ter seu endereo ou telefone? Imagine ter que ser saber endereos fsicos: 10CF, 2A00? Identificadores Os identificadores so os nomes dados para as variveis, constantes e funes. A melhor forma de nomear verificar qual ser seu contedo e definir o nome de acordo com ele. Por exemplo, se for definir uma varivel para armazenar o resultado da soma identifique como soma. Imagine as variveis como gavetas etiquetadas, cada uma com um nome, voc somente deve colocar contedos (objetos) nas gavetas de acordo com a identificao e tipo definido para ela. Em C existem algumas regras para a formao dos identificadores: _ o primeira caracter tem que ser obrigatoriamente uma letra ou um sublinhado; _ o nome pode ser formado por nmeros, s que estes no podem ser colocados na primeira posio. _ no pode ter caracteres especiais ou espao, com exceo do caracter _ (underline); _ as letras maisculas e minsculas so tratadas diferentemente (case sensitive). _ no pode ser igual a uma palavra reservada da linguagem. _ no pode ter acento e cedilha () __ somente os 31 caracteres so vlidos Prof Angelina V.S.Melar 33
3. Declarao de varivel
A declarao de variveis obrigatria em quase todas as linguagens de programao, onde nela feita a definio do nome/local de armazenamento (ligada ao endereo fsico) e quanto de espao ser reservado para o contedo a ser armazenado (tipo de dado). A declarao da varivel deve ser feita obrigatoriamente antes da sua utilizao, podendo ser declaradas em lugares diferentes: dentro da funo (varivel local), fora da funo (varivel global), ou dentro de um bloco de instrues.
No se esquea que ao definir o tipo de varivel est se determinado a quantidade de espao (bytes) que ser alocado na memria e o intervalo de valores que ela poder armazenar. Observao:
Exemplos de Declarao de Varivel: tipo_de_varivel nome_varivel, nome_varivel; Pseudocdigo C Dicas em C real salario; float salario; inteiro num_filho; int num_filho; caracter sexo; char sexo; real porc_aum 5.5; float porc_aum =5.5; Pode ser atribudo um contedo a varivel quando ela for declarada. inteiro qtd_pao, qtd_leite; int qtd_pao, qtd_leite; Podem ser declaradas diversas variveis do mesmo tipo ao mesmo tempo.
Constantes
Constantes so dados com valores fixos que no podem ser alterados durante a execuo do programa. Dentro de um programa podem existir vrias constantes, como por exemplo, o ano atual, o valor de PI. As constantes podem ser definidas sem identificador, sendo inseridas diretamente. como na expresso matemtica: VARIVEL CONSTANTE
X +Y+3
O X e o Y seriam as variveis do programa, pois so as incgnitas e contm um valor sujeito a alterao, j o nmero 3 uma constante, o seu valor j conhecido e no poder ser alterado. Em todas as execues ele sempre ser 3. Exemplos: A) Data_atual = 1990 Valor_aumento = 1000 Porc_desconto = 0.10 PI = 3.141592
B) #include <stdio.h> #include <stdlib.h> const int ANO_ATUAL = 1990; main() { // ANO_ATUAL = 300; //no permite mudana de valor printf("%i", ANO_ATUAL); _sleep(2000); }
Tipos de dados
Quando colocamos o termo tipos de dados bsicos nos referimos aos tipos primitivos da linguagem. Cada linguagem tem seus tipos primitivos e a partir deles podem criar novos. Lembre-se que o computador processa dados. Pense que quando se agrega valor a um dado tem-se uma informao. Exemplo: 22 de maro dado, no informa nada, mas se colocarmos o Dia da gua, que ocorre no dia 22 de maro, ele tem outro valor, traz uma informao muito importante, de conscientizao e valorizao do meio de sobrevivncia da espcie humana. Quando voc define o tipo de varivel o computador reserva (aloca) um espao (quantidade de bytes) de acordo com o esse tipo. Mesmo que o valor recebido e armazenado seja menor que o espao reservado o computador ainda conserva o mesmo tamanho pr-definido, havendo um desperdcio de memria. Defina de forma correta o tipo de dado, para que no ocorra falta de memria durante a execuo do programa ou lentido de processamento. Na linguagem C os tipos primitivos so: caracter (char), inteiro (int), real (float e double) e sem valor (void). possvel em C manusear dados numricos nas bases binria, octal, decimal e hexadecimal.
1. Numrico O tipo numrico armazena apenas valores numricos, que podem ser: inteiros ou reais. Numrico Inteiro - int Contm nmeros que no possuem a parte decimal, podendo ser positivos, negativos ou nulos. A representao desse tipo no pseudocdigo ser int, abreviao de inteiro. Na linguagem C int, abreviao de integer. Pseudocdigo Codificao em C int num= -4; int num1 = 6000, num2; Numrico Real- real So os nmeros positivos, negativos ou nulos que possuem a parte fracionria (parte decimal). O separador decimal o ponto e no a vrgula (padro americano). O tipo real pode ser representado pelo real simples ou duplo, a diferena est na preciso e no nmero de casas decimais. O real simples identificado como float na linguagem C e tem at 6 dgitos de casas decimais. Se for necessria uma preciso dupla necessrio usar o tipo double, que suporta at 11 digitos. No pseudocdigo ser definido apenas como real. Pseudocdigo Codificao em C real salario= 350.50; float n1=20.0, n2 = -15.50; float n1=0.0, n2, soma; 2. Literal/ Cadeia de Caracteres Na linguagem C no existe o tipo literal, tambm conhecido como alfanumrico, string, que aceita armazenar vrios caracteres. Quando houver necessidade do armazenamento de um nome dever ser feito uso de uma matriz de caracteres. Prof Angelina V.S.Melar 36
3. Lgicas As variveis definidas como lgicas (booleanas) podem guardar apenas um dos dois estados: Verdadeiro ou Falso, sempre armazenando apenas um dgito. Na linguagem C no existe um tipo especfico para a representao de valores lgicos. O dgito 0 representa o valor lgico falso e 1 representa o valor lgico verdade (todo valor diferente de 1 falso) . Pseudocdigo lgico estado_lampada; Codificao em C while (1) //loop infinito 4. Caracter O tipo char usado para armazenar um caracter da tabela ASCII, que possui letras (a..z, A..Z), nmeros (0..9) e caracteres especiais (, ^, &, =, #, :). Na maioria dos ambientes no pode ser usado para clculo, mesmo tendo armazenado um nmero. Quando for um nico caracter colocamos seu contedo obrigatoriamente entre apostrofe(). Quando for uma cadeia de caracteres, colocamos entre aspas ().
Exemplo de programa: main() { char a='1', b=1; printf("%c - %c", a, b); _sleep(2000); } Perceba que a varivel a armazena o smbolo 1 e a varivel b armazena o primeiro smbolo da tabela ASCII que a carinha. printf("\n%c - %c - %i - %i\n", a, b, a,b); //Resultado:1 carinha 49 1 1 //caracter 1 e o primeiro smbolo na ASCIII - o smbolo 1 a carinha //o smbolo 1 na ASCII tem seu decimal o 49 //o 1 inteiro o 1 na exibio definida como inteiro
5. Espao Alocado de Memria No se esquea que cada byte ocupa 8 bits (de 0 a 7). Cada bit possui dois estados ( 0 ou 1 )- base 2. Ento, um byte possui 28 = 256 combinaes possveis. Ento o tipo caracter que ocupa 1 byte pode armazenar 256 combinaes diferentes de bits.Se a cada 8 bits pode-se ter a representao de um nmero inteiro, ento, o char pode armazenar valores de 0 a 255. Nmero Decimal 49 Caracter 1 (ASCII) Bit 7 6 5 4 3 2 1 0 Base Decimal 128 64 32 16 8 4 2 1 Estado - valor 0 0 1 1 0 0 0 1 Prof Angelina V.S.Melar 37
Um tipo que armazena 2 bytes pode ter 28 x 28 combinaes diferentes de bits, que equivale a 65538. O que armazena 4 bytes pode ter 28 x 28 x 28 x 28 combinaes diferentes, que equivale a 2.147.483.647 (+- 2 bilhes de combinaes).
Tipo de Varivel char int float double void Qtd de bytes 1 4 4 8 0 Qtd de bits 8 32 32 64 0 Exemplo de valores f 1 14 -23 15.655 10.0 -14.7688665
6. Modificadores de Tipos Os modificadores de tipos so usados para modificar o tipo primitivo, fazendo com que ele aceite outra faixa de valores, aceitando nmeros negativos e positivos. O tipo signed faz com que o tipo represente os nmeros positivos e negativos. O unsigned somente aceita os nmeros positivos. A representao de nmeros negativos feita tomando o bit MSB (Most Significant Bit), onde msb=1 o sinal negativo e msb=0 o sinal positivo. Como utilizado bit para representao de sinal os valores a serem representado so metade da faixa padro. Por exemplo, o tipo char que vai de 0 a 255 do tipo signed (s positivos), para aceitar tipos negativos tem que ser unsigned e seus valores vo de -128..0..+127. O padro C padro ANSI define que os tipos so signed e no compilador CCS, MikroC o padro unsigned. O tipo short (reduz) e long (amplia) so usados para aumentar ou diminuir a faixa de valores dos tipos bases.
a)
Exemplo: unsigned char n1= 255; char n2= 255; //padro signed printf("Unsigned %i - signed %i", n1, n2); Resultado: 255 e -1
Dica: Pode-se definir valores em outras bases (diferente da decimal): int hex = 0x80 128 em decimal int oct = 012 10 em decimal Valor = 50 Decimal Valor = 050 Octal Valor = 0x50 Hexadecimal Valor = 0b01010000 Binrio
7. Tabela ASCII (American Standard Code for Information Interchange) Cada combinao de byte pode representar internamente um smbolo (letra, dgito numrico ou caracter especial). Veja no final dessa apostila a explicao detalhada da ASCII. FATEC F A T E C 70 65 84 69 67 01000100 01000001 01010010 01000101 01000011
Exemplo de Cdigo que mostra a ASCII Estendida Unicode Latim I Suplementar (8 bits) main() { int tab; printf("Caracter Decimal Hexadecimal\n"); for(tab=0;tab<=255;tab++) printf("\t%c - %i - %x ", tab, tab, tab); }
8. Cdigo de Barra Invertida Algumas combinaes e representaes da tabela ASCII no podem ser exibidos na tela, pois tem uma funo especial- funo de controle. Por exemplo, o retorno de carro (return ou enter) cujo cdigo decimal o valor 13. Para inserir esses cdigos deve-se usar a barra invertida juntamente com o cdigo desejado.
Cdigo \a \b \n \r \t \b \ \\ \ \v Cdigos de Controle Formato soa um sinal sonoro- alarme o cursor retrocede uma coluna o cursor avana para uma nova linha o cursor retrocede para a primeira coluna da linha o cursor avana para prxima marca de tabulao retrocede - backspace exibe uma aspas duplas exibe a barra invertida exibe a aspas simples faz a tabulao vertical
main() { char ch1= '\a', ch2='\t'; printf("%s", "Alo\n"); printf("%cVeja que esta na proxima linha %c", ch2,ch1);_sleep(2000); } /* Exibe o alfabeto em minsculo, usando um contador definido como char.*/ main() { char ch; for (ch='a'; ch <='z'; ch++) printf("\t%c", ch);_sleep(2000); }
Prof Angelina V.S.Melar 40
Exerccios de Variveis
4) Identifique as variveis nomeando-as e definindo o tipo de dado ideal para armazenamento. Informao Estado civil Nmero que cala Peso Altura Valor da conta de luz Salrio Valor pago pela refeio Nome da Varivel ________________ _________________ _________________ _________________ _________________ _________________ _________________ Tipo de Varivel _________________ _________________ _________________ _________________ _________________ _________________ _________________
Operadores Aritmticos
1. Operadores Aritmticos
Os operadores aritmticos so os operadores usados nas operaes bsicas da matemtica. Esses operadores so usados para representar as expresses matemticas, os resultados so valores numricos. Eles so: +, -, *, /. Ainda existem o mod e o div, que representam o resto da diviso e o quociente da diviso na respectiva ordem. Esses operadores somente podem ser usados para nmeros inteiros.
Exponenciao: usada para elevar um nmero a outro. O operador pode ser o sinal circunflexo (^) ou dois asteriscos (**) ou uma funo (pow ou exp), dependendo da linguagem de programao. Na linguagem escrita quando elevamos um nmero a outro, como o exemplo 2. Desta forma entendemos que o nmero 2 a base e o 3 o expoente. No computador a representao diferente. No lugar de colocarmos o 3 em cima , o colocamos do lado, e no meio o smbolo, que representa o operador de potenciao, ficando da seguinte forma: 3 ** 2 ou 3 ^ 2. A exponenciao tem maior prioridade que os demais operadores. Exemplo: 2 ^ 3 ou 2 ** 3 O resultado dessa operao 8, ou seja, o 2 igual a 8. No C pow(2,3), e em Pascal exp(2 * ln(3)). Mod e Div Em muitas linguagens de programao existem o operador div e mod, que tem a funo de trabalhar com nmeros inteiros. Esses operadores tm a mesma prioridade e devem ser efetuados antes da adio ou subtrao. Quando estivermos fazendo clculos de diviso com nmeros inteiros (10, 4500, -900, 15) podemos utilizar o operador DIV. O resultado da expresso onde foi usado o DIV sempre um nmero inteiro, o quociente. 5 DIV 2 = 2 5 MOD 2 = 1 Obs: Na linguagem C usado o operador % para representar o MOD.
5
Resto da Diviso
2 2
Parte Inteira da Diviso (Quociente)
1
22 DIV 5 = 4 22 MOD 5 = 2 70 MOD 10 = 0 2 DIV 2 = 1 -400 DIV 4 = 100
Exemplos: ou em C 22 % 5 = 2
Operadores Aritmticos da Linguagem C Os operadores aritmticos da linguagem C so: ++, --,*, /, %, +, -. Esses operadores j esto na ordem de precedncia de execuo. O ponto (.) representa o separador decimal e a vrgula (,) o separador de milhar. Os operadores com a mesma precedncia so executados da esquerda para a direita. Operador Operao Exemplo + Adio 1+1 =2 **Cuidado, ao ser usado o operador de diviso a um tipo Subtrao 11 =0 inteiro, ser retornado um valor * Multiplicao 2 * 2 = 4 inteiro. Por exemplo, 5/2 ser / Diviso 2/2 =1 igual a 2. % Mdulo 2%2=0 -Decremento --x x=x-1 **Sempre ser retornado um valor ++ Incremento ++x x = x + 1 real quando houver pelo menos um nmero real envolvido. 2. Operadores de Incremento e Decremento Esses operadores podem ser usados como prefixo ou sufixo, como, ++n1 ou n1++. Quando o operador precede a varivel ((++n1), ele executa a operao (incremento ou decremento) antes de usar o contedo da varivel. Se o operador estiver depois da varivel (n1++), o computador primeiro usa o valor armazenado na varivel para depois executar a operao. Exemplos: a) n1 = 10 n2 = ++ n1 resultado n2 = 11 b) n1 = 10 n2 = n1++ resultado n2 = 10 somente a prxima vez o x vale 11 3. Operadores Aritmticos de Atribuio ou C Reduzido Na linguagem C pode ser feito usado de um operador aritmtico com o comando de atribuio, dessa forma simplificando a programao. Exemplo: num = num + 2 pode ser escrito da seguinte maneira: num+=2; num2 = num1 = 10 o valor 10 atribudo a num1 e, em seguida o valor de num1 atribudo da num2 (da direita para a esquerda).
No exemplo acima o operador += acrescenta 2 ao valor da varivel num e o armazena a varivel num. Esse forma de calculo pode ser usada para qualquer operador aritmtico, como: num-=2 ou num = num 2; num*=2 ou num = num * 2; num/=2 ou num = num / 2; num%=2 ou num = num % 2;
4. Converso de Tipo A linguagem C oferece o recuso de converso automtica de valores. A converso pode ser feita usando o operador cast (operador de molde de tipo). Esse operador colocado entre parnteses antes do valor a ser convertido. Exemplo: a) float x = 5; o valor de x convertido para 5.0; Prof Angelina V.S.Melar 43
b) 5 / 2.0 o valor de 5 convertido para 5.0, porque o segundo operando 2.0. O resultado da expresso 2.5 c) int a, b; a = (int) 3.5; -- atribudo o valor 3 para a varivel a b = (int) 3.5 % 2; -- convertido o valor 3.5 para 3 para depois fazer a operao mdulo, que s pode ser feita com valores do tipo inteiro.
Exemplos de Prioridades: 1) 3 + 4 = 7 A operao da adio pode ser efetuada em primeiro lugar quando no existir nenhuma outra operao com maior prioridade. 2) 9 - 4 * 2 = O operador de maior prioridade nesta expresso a multiplicao, devendo ser realizada em primeiro lugar. 4*2=8 Depois, substitumos a expresso calculada (4 * 2) pelo seu resultado ( 8 ) e efetuamos a segunda operao, que a subtrao. 9 - 4*2 9-8=1 O resultado 1 Percebam que no foi realizada a operao pela ordem que foi escrita, mas sim pela ordem de prioridades, como na matemtica convencional. Se no fosse aplicada a prioridade dos operadores o resultado da expresso seria 10, um valor diferente de 1, o correto. 94*2= 5 * 2 = 10 3) 4 * 3 - 4 / 2 ** 2 = Deve ser realizada em primeiro lugar a operao que tem o operador de maior prioridade, ou seja, a potenciao 2 ** 2. 4 Prof Angelina V.S.Melar 44
Depois, substitumos a expresso de potenciao (2 ** 2) pelo seu resultado (4). 4 * 3 - 4/ 2* 2 4 * 3 - 4/ 4 Agora os operadores de maior prioridade so a multiplicao e a diviso. Esses dois operadores tm valor de prioridade igual, ento tanto faz a ordem de execuo. 4*3 12 Ento, substituindo a operao pelo resultado, temos: 4 * 3 - 4 / 2 ** 2 4*3-4/ 4 12 - 4 / 4 Restaram duas operaes a serem feitas: a subtrao e a diviso. Como a diviso tem maior prioridade a efetuaremos primeiro. 4/4 1 4 * 3 - 4 / 2 ** 2 4*3-4/ 4 12 - 4 / 4 12 - 1 = 11 O resultado da expresso foi 11. Vamos supor que voc no se lembra das prioridades dos operadores e faa pela ordem escrita. Ser que o resultado ser o mesmo? Veja a seguir a execuo da mesma expresso. 4 * 3 - 4 / 2 ** 2 = 12 - 2 ** 2 = 12 - 4 8 O resultado no o mesmo que na resoluo anterior.
4) 5 * 2 ^ (4 - 2) = Neste exerccio temos uma expresso dentro de parnteses. O operador que est dentro do parntese deve ser sempre efetuado em primeiro lugar. ( 4 - 2) 2 Vamos substituir o resultado da expresso dentro de parnteses na expresso geral. 5 * 2 ^ (4 - 2) 5*2^ 2 Agora, como no temos mais nenhum parnteses, efetuaremos o clculo da expresso que tem o operador com maior prioridade. 2^2 4 Substituindo o resultado da potenciao: 5 * 2 ^ (4 - 2) 5*2^ 2 5* 4 20 O resultado 20. Se o clculo fosse feito sem priorizar o parntese o resultado da expresso seria 100. Prof Angelina V.S.Melar 45
1. 3 + 4 * 4 + 8 / 2 = 2. (3 + 4 ) * 4 + (8 / 2) = 3. 64 / 8 - 3 = 4. 4 ^ 3 + 2 * 3 = 5. 81 / 3 ^ 2 = 6. 2 ^ (2 * 1 + 2) / 2 = 7. 4 * 2 ** (4 / 2) = 8. 66 DIV 4 * 2 + 2= 9. 15 MOD 3 * 1 = 10. 27 MOD (3 ** 2) = 11. 17 MOD 2 + 7 DIV 3 = 12. 21 * 16 /4 = 13. 70 DIV 7 = 14. (21 / 2) / 2 * 3 = 15. [12 - (4 * 2) ] + 2 =
Exemplo: bit = 00000011 bit << 2 00001100 bit = 01100000 bit >> 2 00011000
Exemplo:
a)
4 decimal
1. Funo Rand() e SRand() A funo rand() usada para gerar nmeros aleatrios. Os nmeros gerados aleatoriamente vo de 0 a 32767. main() { int num; num = rand(); printf("%i", num); _sleep(2000); } Para haver a delimitao dos nmeros gerados.
rand()%10 + 1; // ajustado para gerar nmeros entre 1 e 10 (soma 1 pois comea no 0)
main() { int num; num = rand()%10+1; printf("%i", num); _sleep(2000); } A funo srand() permite a gerao de nmeros diferentes a cada nova execuo. srand((unsigned int)time((time_t *)NULL)); #include <stdio.h> #include <stdlib.h> #include <time.h> main() { srand((unsigned int)time((time_t *)NULL)); int num; num = rand()%10+1; printf("%i", num); _sleep(2000); } //srand(time(NULL));
printf("%-8i", 10);
(10
printf("%08i", 10);
(0000010)
printf(%.1f,1910.10)
1910.1
so preenchidas com zeros. Deve ser colocada a quantidade de casas decimais a serem exibidas junto com o comando de formato, como no exemplo %.1f
printf(O resultado da soma :); soma =4.51; printf(O resultado : %6.2f, soma); printf (Mostra o smbolo %% %%") printf ("Um tipo caractere %c e um tipo inteiro %i",A',20) printf ("%s uma string","Este") printf ("%s%d%%","Juros de ",10)
O resultado da soma O resultado da soma 4.51 %% Um tipo caractere A e um tipo inteiro 20 Este um exemplo string Juros de 10%
2. Funo de Entrada scanf() A funo scanf() usada para fazer entrada de dados. Essa funo captura o valor digitado no teclado e armazen-o em uma varivel. Os valores capturados so convertidos para o formato interno apropriado. O prottipo dessa funo est no arquivo de cabealho STDIO.H.
Sua estrutura e: scanf(string_de_controle, &lista_de_argumentos); Primeiro se define o tipo de varivel a ser recebido Deve ser colocado o operador & (endereo de memria) antes de cada uma das variveis da lista de argumentos (exceto para strings). Deve ser colocado o mesmo nmero de argumentos e de string de controle. Num tipo string, o espao em branco finaliza a entrada. Podem ser recebidos vrios valores ao mesmo tempo, usando como separador de entrada um espao em branco ou o caracter dois pontos ( : ). Os especificadores %d, %f, %e pulam automaticamente os brancos que precedem os valores numricos.
Comandos de Formato mais usados Cdigo Formato %c caracter %d , %i inteiros decimais com sinal %f , %e, %g ponto flutuante decimal %s string de caracteres Exemplo:
float nota1, nota2; scanf(%f, ¬a1); scanf(%f, ¬a2); scanf(%f%f , ¬a1, ¬a2); int hora, minuto; scanf(%i:%i, &hora,&minuto);
ou
1. Funo de Entrada de caracter getch() e getchar() As funes getch() e getchar() esto na biblioteca conio.c. Elas so usadas para a entrada de um caracter. A diferena entre elas que a getchar() espera aps o caracter digitado a tecla enter e o getch() no.
#include <stdio.h> #include <stdlib.h> #include <conio.c> main() { char caracter; caracter=getch(); printf ("Voce pressionou a tecla %c que equivale ao numero %i Asc",caracter, caracter ); _sleep(2000); }
Exemplos
Exemplo 1 Faa um programa que receba dois nmeros inteiros e efetue as operaes: adio, subtrao, multiplicao, diviso, resto da diviso e exponenciao. Pseudocdigo Incio inteiro n1, n2, soma, subtr, mult, divisao, expo, resto; escreva (Informe primeiro nmero); leia (n1); escreva (Informe segundo nmero); leia (n2); soma n1+ n2; subtr n1 - n2; mult n1 * n2; divisao n1 / n2; resto n1 mod n2; expo = (n1, n2); escreva (Soma:, soma); escreva (Subtracao:, subtr); escreva (Multiplicacao:, mult); escreva (Divisao:, divisao); escreva (Resto da diviso:, resto); escreva (Exponenciao:, expo); Fim Codificao em C #include <stdio.h> #include <stdlib.h> #define escreva printf
main() { int n1, n2, soma, subtr, mult, divisao, expon, resto; escreva ("Informe 2 numeros"); scanf("%i%i", &n1, &n2); soma= n1+ n2; subtr= n1 - n2; mult= n1 * n2; divisao= n1 / n2; resto= n1 % n2; escreva ("Soma: %i - Subtracao: %i \n", soma, subtr); escreva ("Multiplicacao: %i \n", mult); escreva ("Divisao: %i Resto da diviso: %i\n", diviso, resto); _sleep(8000); }
Descrio Narrativa: ANO_NASC Receber o ano de nascimento Receber o ano atual Receber Subtrair o ano atual do ano de nascimento para saber a idade ANO_ATUAL Somar o valor da idade com 30 para saber quantos anos ter daqui 30 anos Mostrar idade atual IDADE = ANO_ATUAL - ANO_NASC Mostrar idade daqui a 30 anos. Pseudocdigo Inicio inteiro ano_nasc, ano_atual, idade, idade30; Escreva (Digite o ano atual); Leia (ano_nasc); Escreva (Digite o ano de nascimento); Leia (ano_atual); Idade ano_atual ano_nasc; Idade30 idade +30; Escreva (A sua idade , idade); Escreva (Daqui a 30 anos voc ter:,Idade30); Fim
Linguagem C #include <stdio.h> #include <stdlib.h> main() { int ano_nasc, ano_atual, idade, idade30; printf(\nDigite o ano atual); scanf(%i,&ano_nasc); printf(\nDigite o ano de nascimento); scanf(%i,&ano_atual); idade = ano_atual ano_nasc; idade30= idade +30; printf(A sua idade %i, idade); printf(Daqui a 30 anos voc ter: %i,idade30); } Linguagem Pascal Program idade; Var ano_nasc, ano_atual, idade, idade30: integer; begin write(Digite o ano atual); readln(ano_nasc); write(Digite o ano de nascimento); readln(ano_atual); idade := ano_atual ano_nasc; idade30 := idade +30; writeln(A sua idade , idade); writeln(Daqui a 30 anos voc ter:, idade30); end
Receber
IDADE30 = IDADE + 30
Mostrar IDADE
Mostrar IDADE30
FIM
Teste de Mesa
1980
IDADE
1998
IDADE30
1980 1998
18
48
ENTRADA
SADA
PROCESSAMENTOS
IDADE = ANO_ATUAL - ANO_NASC IDADE = 1998 1980 IDADE = 18 IDADE30 = IDADE + 30 IDADE30 = 18 + 30 IDADE30 = 48
18 48
Receber NOME_VEND
Receber QUANT
Receber SAL_BRUTO
COMIS = QUANT * 50
FIM
Na linguagem C no existe o tipo lgico (booleano) com os valores true e false (verdadeiro ou falso). Ao verificar uma expresso, o compilador compara e retorna o valor zero ou um. O valor zero representa o falso e, qualquer valor diferente de zero, no caso o valor um, representa o verdadeiro. 2. Operadores Lgicos As expresses lgicas so aquelas que operam com valores lgicos e resultam tambm num valor lgico. Elas podem ser utilizadas em testes de variveis, tomada de deciso e expresses matemticas. A funo do operador lgico NO pode modificar valores e expresses, pois ele serve para negar a expresso. Operador NO E OU Operao Negao Conjuno Disjuno Prioridade 1 2 3 C ! && ||
3. Tabela Verdade: o conjunto das possibilidades combinatrias dos operadores lgicos. E OU NO VeV=V V ou V = V No F = V VeF=F V ou F = V No V =F FeV=F F ou V = V FeF=F F ou F = F
Exemplos: Pseudocdigo No ( Idade = 5 ) num1 5 num2 6 num1 > 7 E num2 > 5 C ! ( Idade = = 5 ) num1 = 5; num2 = 6; num1> num2>5 7 Explicao Nessa expresso temos o resultado Falso, pois o operador lgico NO negou a expresso contida dentro do parnteses. O resultado dessa expresso Falso, pois o operador E exige que as duas condies sejam verdadeiras para o resultado ser Verdadeiro. Veja && que a primeira condio est indicando que o Nmero1 maior que 7, mas isso no verdadeiro, pois o valor do Nmero1 5, e 5 menor que 7. A segunda condio verdadeira, pois 6 maior que 5. O resultado dessa expresso Verdadeiro, pois o operador OU indica que apenas uma das condies precisa ser verdadeira para o resultado ser Verdadeiro. Observem a diferena do operador OU com o operador anterior E.
4. Prioridade dos Operadores A prioridade de execuo pode ser diferente em algumas linguagens de programao Prioridade Operador 1 Parnteses 2 Aritmticos 3 Relacionais 4 Lgicos
Exerccio: Descubra se as expresses abaixo so falsas ou verdadeiras: a) 5 + 6 = 10 b) 5 mod 2 = 2 c) 15 <> 5 + 5 d) 33 > 3 OU carol = carolina e) 16 > 5 * 2 f) 20 < 2 g) 56 > 45 + 4 h) feijo = feijoada i) 56 < = 4 j) 70 > = 3 ** 2 k) 5 >= 5 E 4 = 5 l) 12 + 1 = 13 OU 4 + 2 = 7 m) 18 > 7 E 19 < 7 n) 90 = 3 OU 80 > 5
Estrutura Condicional INCIO Pegar o doce Tirar da embalagem SE o doce estiver estragado ento Jogar fora o doce SENO Comer o doce FIM
INCIO
INCIO
PEGAR O DOCE
PEGAR O DOCE
TIRAR DA EMBALAGEM
TIRAR DA EMBALAGEM
COMER O DOCE
F
FIM COMER O DOCE
EST ESTRAGADO?
V
JOGAR FORA O DOCE
FIM
No exemplo acima podemos ver facilmente a importncia da estrutura de deciso. Na primeira estrutura, a linear, existe apenas trs procedimentos e no h verificao das informaes. Na segunda estrutura foi possvel fazer a verificao de possveis falhas na seqncia de processos, onde, foi constatada a falta do procedimento que verificasse se o doce estava ou no estragado.
Exerccio Resolvido
Elabore um programa que receba dois nmeros e no final mostre o maior nmero digitado. Entrada: Receber dois nmeros Processamento: Verificar qual o maior nmero digitado Linguagem C Sada: #include <stdio.h> Mostrar o nmero maior #include <stdlib.h> main() Pseudocdigo { Inicio float num1, num2; Real num1, num2; printf(\nDigite o primeiro nmero); Escreva (Digite o primeiro nmero); scanf(%f,&num1); Leia num1; printf(\nDigite o segundo nmero); Escreva (Digite o segundo nmero); scanf(%f,&num2); Leia num2; if (num1 > num2) SE (num1 > num2) ento printf(O maior nmero %f, num1); Escreva (O maior nmero : , num1); else Seno printf(O maior nmero %f, num2); Escreva (O maior nmero : , num2); } Fim Teste de Mesa
VALORES SIMULADOS MEMRIA
NUM1
PROCESSAMENTO
NUM2
100 5
100
SADA ENTRADA
100
if (condio) instruo;
Exemplo: a) if (n1 > n2) printf (O primeiro nmero maior que o segundo);
b) if (n1> n2) { printf(O primeiro nmero maior que o segundo); printf(Informe outro valor); scanf(%i, &n3); }
2. Estrutura de Deciso Composta: A condio ser testada e de acordo com o seu resultado (verdadeiro ou falso) ser executado um caminho (instruo) diferente. Essa estrutura usada quando as duas possibilidades dependem de uma mesma condio. Onde uma contradiz a outra.
SE (condio) ENTO instruo; SENO instruo; SE (condio) ENTO Incio instruo 1; instruo n; Fim SENO Incio Instruo 1; Instruo n; Fim
Exemplo: a) if (n1 > n2) printf (O primeiro nmero maior que o segundo); else if (n1 == n2) printf (Os dois nmero so iguais); else printf (O segundo nmero maior que o primeiro);
Essa estrutura usada quando existem vrias verificaes a serem feitas e uma pode depender da outra. Pode ser executada uma condio simples ou composta dentro de outra condio. Pode existir a Estrutura de Deciso Heterognea, quando no existe um padro lgico no encadeamento. Exemplo: se..seno...se...se...seno. Quando existe um padro lgico das estruturas de deciso chamada Estrutura de Deciso Homognea. Exemplo: se..seno..se..seno..se..seno.
SE (condio) ENTO Incio instruo; SE (condio) ENTO instruo; Fim SENO Incio Instruo 1; Instruo n; Fim
else if (n2 == 0) { printf (O segundo nmero no pode ser zero); printf(Informe outro nmero); scanf(%i, &n2); } else if (n1 == n2) { printf (Os dois nmero so iguais); printf(Informe outro nmero); scanf(%i, &n3); }
Prof Angelina V.S.Melar 62
Intervalos
Dentro da estrutura de deciso existe a definio de intervalos. Estes intervalos definem as faixas que esto enquadrados os valores. Elas podem ser definidas de diferentes formas, como nos exemplos abaixo:
Exemplo 1: Receba uma idade qualquer e mostre uma mensagem de acordo com ela. Se a idade for igual ou menos de 5 anos a criana deve ser INCIO vacinada. Pseudocdigo Inicio Inteiro idade; Escreva (Digite sua idade); Leia (idade); SE (idade <= 5) ento Escreva (Deve ser vacinada); Fim
Nesse programa apenas as pessoas que tiverem idade menor ou igual a 5 anos devem ser vacinadas. Ficando excludas as com idade superior a 5 anos. Esse um exemplo de intervalo que contm todos os valores menores ou iguais a 5.
Receber IDADE
IDADE <= 5
FIM
...
Exemplo 2: Receba a idade de uma pessoa e mostre uma mensagem de acordo com ela. As pessoas que tem mais de 11 anos e menos de 18 so consideradas adolescentes. Pseudocdigo
Inicio Inteiro idade; Escreva (Digite sua idade); Leia idade; SE (idade >= 11) ento SE (idade <= 18) ento Escreva (Adolescente); Fim
No exemplo anterior todos os valores menores que 5 seriam vlidos. J nesse exemplo, somente os nmeros que vo de 11 a 18 so vlidos. Nessa expresso pode ser usado o operador lgico E.
Exemplo 3: Receba a idade de uma pessoa e mostre uma mensagem de acordo com ela. As pessoas que tiverem menos de 18 anos e mais de 85 no esto aptas a dirigir e devem ser alertadas com uma mensagem. Pseudocdigo Inicio Inteiro idade; Escreva (Digite sua idade); Leia idade; SE (idade < 18) ento Escreva (No pode dirigir); SE (idade > 85) ento Escreva (No pode dirigir); Fim
As faixas acima mostram claramente que h dois tipos de intervalo diferentes: um intervalo com valores menores de 18 e outro intervalo com valores superiores a 85. Sendo excludos todos os valores internos da faixa. Este tipo de intervalo pode ser definido com o operador lgico OU.
SE idade < 18 OU idade > 85 ento
Operador Ternrio
Em C existe o operador ? (operador condicional) que facilita a verificao de sentenas simples (nicas). Estrutura: condio ? expresso1 : expresso2; A condio avaliada; Se ela for verdadeira o resultado a execuo da expresso1; Se a condio for falsa o resultado a execuo da expresso2.
1) /* O reajuste ser de acordo com o salrio. 2) /*Mostra o quadrado de um nmero Se este for maior que 2000 o reajuste ser de diferente de zero. Se o nmero digitado for 10%, seno, de 30% */ zero aparece a mensagem Erro */
#define escreva printf main() { int sal = 1000; float reajuste; sal>2000 ? reajuste = 0.10 : reajuste = 0.30; escreva ("reajuste : %g\n", reajuste); _sleep(2000); }
#define escreva printf main() { int x; escreva("Entre com o valor de x"); scanf("%i", &x); x!= 0 ? printf("\n Quadrado de x = %i", (x*x)) : printf("\nErro"); _sleep(2000); }
Seleo Mltipla
As linguagens de programao possuem um comando exclusivo para seleo mltipla (verifique...caso). Nessa estrutura o computador far um teste sucessivo, verificando o valor da expresso numa lista seqencial de constantes, ao encontr-lo ele executar o bloco de comandos que esto associados constante. Dependendo da linguagem que for utilizada essa estrutura pode ser exclusiva, ou seja, quando for executado um caso, os demais sero excludos. Na linguagem C se faz a excluso pelo comando break e somente pode ser usada essa estrutura para verificaes de valores de uma varivel do tipo inteiro ou caracter, no existe teste de intervalos, ou mesmo vrias verificaes ao mesmo tempo.
Pseudocdigo: verifique <varivel> incio caso <valor> : <instrues> ; pare; caso <valor> : <instrues >; pare; .... caso no seja nenhuma das opes anteriores: < instrues>; pare; fim do verifique
** tem linguagens que permite o teste de intervalo de valores como: caso valor 1..valor n: case valor1, valor 3, valor 7:
Codificao em C: switch (varivel) { case <valor>: instrues; break; case <valor>: instrues; break; ... default: instrues; }
O comando default executado se nenhum valor for encontrado nos case anteriores, ou seja, nas comparaes ele no encontrar um valor verdadeiro. O uso do default opcional. O comando break serve como um desvio de execuo. Ao ser executado dentro do switch ele finaliza a seqncia de instrues do case e sai do switch. Se no for usado o break o computador continuar dentro do switch executando as instrues dos outros case.
Exemplos: a) #include <stdio.h> #include <conio.c> main() { int num; printf("Informe um valor inteiro"); scanf("%i", &num); switch(num) { case 1:case 2:printf("Valor baixo"); break; case 5:case 8:printf("Valor alto"); break; default: printf("Valor Invalido\n"); break; } getch(); } b)
case / : if( n2 = = 0 ) printf(No existe diviso por zero); else r= n1 / n2; break;
Curiosidade:
Pode existir case sem instruo associada. Caso isso ocorra o computador executar as instrues do prximo case.
Exerccios Resolvidos
01) Faa um programa que classifique as mquinas conforme a produo de cabo para telefones. Veja a tabela abaixo: Produo Classificao maior ou igual a 60.000 Boa menor que 60.000 e maior que 40.000 Regular menor ou igual a 40.000 Ruim
Pseudocdigo Incio Real quantpro; Leia quantpro; SE (quantpro >= 60000) ento Escreva (Produo Boa); SENO SE (quantpro > 40000) ento Escreva (Produo Regular); SENO Escreva (Produo Ruim); Fim Linguagem C #include <stdio.h> #include <stdlib.h> main() { float quantpro; printf(\nDigite a quantidade produzida); scanf(%f,&quantpro); if (quantpro >= 60000) printf (Produo Boa); else if (quantpro > 40000) printf(Produo Regular); else printf(Produo Ruim); }
02) Receba um nmero inteiro e classifique-o como negativo, positivo ou nulo. Essa classificao dever ser exibida por uma mensagem. main() { int numero; scanf(%i, &numero); if (numero = = 0) printf(Nmero Nulo); else if (numero > 0) printf (Nmero Positivo); else printf(Nmero Negativo); } Ou... main() { int numero; scanf(%i, &numero); if (numero = = 0) printf(Nmero Nulo); if (numero > 0) printf (Nmero Positivo); if (numero < 0) printf(Nmero Negativo); }
Variveis de Bloco
Os blocos de instrues que so delimitados pelas {}, podem ser descritos dentro de uma estrutura condicional, de repetio, entre outras. Dentro desse bloco podemos definir variveis locais a eles, de forma que essas so variveis locais ao bloco, ou seja, definidas e acessadas somente no bloco. Podemos ter vrias variveis com o mesmo nome no mesmo cdigo fonte, sendo todas variveis distintas, de acordo com a sua declarao. /* Exemplo do uso de variveis de bloco e a exibio do endereo da memria*/ #include <stdio.h> #include <stdlib.h> main() { int cont=0; printf("\nValor do contador %i", cont); printf("\nEndereco de cont %i\n", &cont); if (cont == 0) { int cont = 5; printf("\n\tValor do contador do bloco %i", cont); printf("\n\tEndereco de cont do bloco %i\n", &cont); } printf("\nValor do contador fora do bloco %i", cont); printf("\nEndereco de cont fora do bloco %i", &cont); getch(); }
Estrutura de Repetio
Lao (Loop) Toda vez que voc ler ou ouvir a palavra loop saiba que ela significa retornar, igual o loop de uma montanha russa, onde voc gira, e gira e repete essa volta vrias vezes. Ento, loop na programao significa repetio, iterao, volta a executar um procedimento j executado.
Pode ser feita a repetio de apenas uma instruo ou de um conjunto de instrues, podendo ser ou no definida a quantidade de vezes que ir repetir. Tome cuidado na hora da definio dos processos a serem repetidos. Se voc quiser que a tela seja limpa toda vez que for exibida uma mensagem; ento a instruo para limpar a tela deve estar dentro do corpo do loop, seno, a tela ser limpa apenas uma vez. A estrutura que aprenderemos a partir de agora usada para tornar automtica a repetio de um programa inteiro ou apenas uma parte dele. Com a repetio automtica os programas tornam-se mais rpidos e geis, no existindo linhas de comandos idnticas repetidas.
Quando for repetido um trecho do programa e j se souber a quantidade de vezes que ele ser executado, ento, voc usar a estrutura de repetio pr-definida com contador. Um exemplo onde podemos usar esta estrutura num programa que faz a exibio do nmero 1 at 300. Mas, quando no conhecido de antemo o nmero de vezes a ser repetido um conjunto de instrues, ento voc usar a estrutura com condio. Essa estrutura consiste em executar as instrues enquanto uma condio pr-definida for verdadeira.
Smbolo de repetio no fluxograma Esse smbolo usado para representar estruturas de repetio, sejam elas pr-definidas ou no.
Condio N=3
Receber N
Incio ... Instruo; validao da condio; ENQUANTO (condio) FAA Instruo; Fim
Obs:Estrutura que repete apenas uma instruo
INSTRUES Incio ... Instruo; validao da condio; ENQUANTO (condio) FAA Incio Instruo; Instruo; Fim Fim
Obs: Sero repetidas vrias instrues, por isso h a necessidade de haver um delimitador (inicio/fim) do bloco de repetio.
2. Repetio com Ps-condio - Faa..Enquanto Na linguagem C existe o teste da condio no final do bloco de repetio:
Faa .. Enquanto
Nesta estrutura a execuo das instrues ocorrer pelo menos uma vez, pois a condio que determina o fim da repetio est no final do bloco de instrues. De forma, que no preciso validar a condio no incio. Enquanto a condio testada for verdadeira ser feita a execuo das instrues repetidamente.
Incio ... Instruo; Faa Incio Instruo1; Instruo2; ... Instruo n; Fim ENQUANTO (condio); Fim
3. Repetio com Ps-condio - Repita..at Na linguagem Pascal existe o tipo de repetio Repeat..until, que no pseudocdigo representamos pelo repita..at. Essa estrutura tambm faz a verificao da condio no final do bloco de instrues, como a estrutura do Faa..enquanto. A diferena que no repita..at, a repetio feito at a condio testada se torne verdadeira, ou seja, enquanto for falsa a condio continua repetindo a execuo.
PENSE: Imagine a situao: Voc tem que desenvolver o mdulo de Saque para um Banco. Como voc faria? permite o saque quantas vezes quiserem e depois deduz do saldo Ou... primeiro faria o programa verificar o saldo para depois permitir o saque.
Exemplos de Pseudocdigo a) num 1; enquanto (num >0) faa incio ... fim faa incio .... fim enquanto (num >0); b) resp s; enquanto (resp = s) faa
c)
a)
b)
4. Comandos Break, Continue funo Exit() Esses comandos so usados para se fazer um desvio na execuo. O break e o continue so usados dentro de laos (for, while). Break: pode ser usado para terminar um case(switch) ou para forar o trmino de um lao. Depois de encerrado o lao ele retorna para o comando seguinte fora do lao. Continue: ele encerra apenas a iterao atual do lao- no executa as instrues aps ele voltando ao incio da repetio. Exit(): finaliza a aplicao, podendo retornar um valor, qualquer valor diferente de 0 significa deu algum tipo de erro.
5. Enquanto Verdadeiro O valor 1 significa verdadeiro, de forma que voc pode colocar uma condio sem definio da expresso lgica.
Exemplo 1: para criar um loop infinito: while (1) { printf("Programao de um loop "); } Exemplo 2: para criar um loop com a condio de trmino definida dentro do estrutura de repetio: #include <stdio.h> #include <stdlib.h> int main() { int num;
while (1) { scanf("%d", &num); if (num ==0) exit(0); }
_sleep(7000); }
Dica: O exit(0) ir finalizar o programa direto. Se for usado o break no lugar do exit(0) ele ir finalizar a repetio e ir continuar o programa executando o _sleep(7000), e as demais instrues que houverem aps a estrutura de repetio.
Faa um programa que receba as notas e faltas de 2 alunos. Faa a consistncia da nota, alertando quando for digitada uma nota invlida (menor que 0 ou maior que 10).
#include <stdio.h> #include <stdlib.h> main() { float cont=1, nota=0, falta; while (cont <= 2) { printf("\nDigite a nota do aluno:"); scanf("%f", ¬a); if ((nota < 0) || (nota > 10)) { printf("\nA nota digitada deve estar entre 0 e 10"); continue; } printf("\nDigite a frequencia do aluno:"); scanf("%f", &falta); cont++; } system("pause"); }
PARA <varivel_controlevalor inicial> AT <valor_final> INC <incremento> FAA Instruo; PARA varivel_controle DE valor inicial AT valor_final PASSO valor_incremento FAA Instruo;
Varivel de controle ou Varivel Contadora atravs dessa varivel que se Valor inicial controla a repetio. Essa varivel pode ser iniciada tanto com valores negativos Varivel de repetio Valor final como positivos, dependendo da forma Valor de Incremento que feita a contagem e controle da varivel: regressiva ou progressiva. REPITA N = 1, 20, 1 Na linguagem C podem existir diversas variveis de controle. Valor inicial: O valor inicial INSTRUES indica qual o primeiro valor a ser armazenado dentro da varivel de controle. PRXIMO N Valor final: atravs desse valor que determinado o fim a repetio. Na linguagem C o que existe no lugar do valor final uma condio. Enquanto essa condio for verdadeira continua a INSTRUES repetio, quando ela se torna falsa o lao finalizado. Incremento ou decremento: O incremento ou decremento um valor ou uma frmula que muda o valor da varivel de controle, de maneira que essa varivel saia do valor inicial e atinja o valor final, e dessa maneira torne falsa a condio testada.
6. Estrutura em C for (varivel de controle = valor inicial; condio que define o fim do lao; valor do incremento ou decremento) instruo; ou, for (varivel de controle = valor inicial; condio que define o fim do lao; valor do incremento ou decremento) { Instruo 1; Instruo 2 ; ... Instruo n; } Exemplos:
a) for (cont =1; cont <=10; cont ++) printf(Ordem crescente: %i, cont); b) for (cont =10; cont >=1; cont --) { printf(Ordem decrescente: %i , cont); _sleep(500); system(cls); }
Dicas: O break encerra o lao a qualquer momento. O continue faz com que o lao seja finalizado sem executar as instrues abaixo e volte ao incio, fazendo um novo ciclo. O uso de mais de uma varivel dentro do for deve ser feito com o uso da vrgula (,). for (n1=1, n2=1; n1+n2 < 10; n1++, n2++) No obrigatria a definio dos trs parmetros, podendo ser feito um lao infinito. for ( ; ; ) printf(Oi!); O lao for pode ser usado para criar um atraso de tempo. Para isso ele no deve possuir nenhuma instruo associada a ele. for (atraso =0 ; atraso < 100; atraso++);
Cuidado: Se a condio a ser testada j inicia sendo falsa, as instrues dentro do lao nunca sero executadas. int cont = 100; for (; cont <1 ; cont++) Cadastre o nmero de identificao das 200 peas.
Incio int numiden, cont; PARA contl AT 200 INC contcont +1 FAA Incio Escreva (Nmero de identificao do funcionrio:); Leia (numiden); Fim Fim
Linguagem C Condio de trmino da repetio: #include <stdio.h> Repete at que o valor de cont fique maior que 200 #include <stdlib.h> Ou main() Enquanto o valor de cont for menor ou igual a 200 repete { int numiden, cont; for (cont=1;cont <=200;cont++) { printf (Nmero de identificao do funcionrio); scanf (%i, &numiden); system(pause); } } Explicao: 1. No exemplo acima inicialmente feita a atribuio do valor 1 a varivel de controle com o valor. 2. Em seguida feita a verificao da condio que determina o fim da repetio, se ela for Verdadeira inicia a execuo do cdigo que est no bloco. Se for falsa j finaliza (mesmo se nunca executou o cdigo dentro do bloco de comandos). 3. Executa o bloco de instrues, que contm a entrada do nmero de identificao. No final da execuo do bloco automaticamente adicionado ao contedo da varivel de controle o valor 1 (anteriormente valia 1, mais 1 de agora, a varivel passa a ter o valor 2). 4. Depois verificado o valor da varivel com o valor final pr-definido (200), como no passo 2. Repetindo todo o processo vrias vezes. At que ... 5. o valor da varivel de controle atinja o valor maior que o definido no intervalo (201). Quando isso ocorrer a repetio pra e ser iniciada uma nova seqncia de comandos definidos fora da repetio, aps o bloco de comandos.
todas as variveis contadoras devem ser zeradas no incio; o contedo da varivel contadora deve ser incrementado com o valor de uma constante (normalmente o valor 1); para a varivel contadora ser incrementada vrias vezes ela deve ser colocada dentro de um lao.
todas as variveis acumuladoras devem ser zeradas no incio do processo; o contedo de uma varivel acumuladora deve ser incrementado com o valor de outra varivel; para a varivel acumuladora ser incrementada vrias vezes ela deve ser colocada dentro de um lao.
SubAlgoritmos/ Modularizao
1. Sub-Rotinas (Mdulos) As sub-rotinas, tambm chamadas de mdulos ou subprogramas, so trechos de instrues que realizam tarefas especficas e que podem ser realizadas diversas vezes durante a execuo do programa. Ao ser decomposto um programa em subprogramas ou sub-rotinas este tem sua complexidade tambm dividida. Desta forma possvel focalizar a ateno em um problema de cada vez, fazer os programas ficarem mais organizados e menores. A linguagem C possibilita o uso de sub-rotinas por meio das funes. Na linguagem C existe a funo principal main(), que sempre a primeira rotina executada, e a partir desta as outras rotinas so executas. A linguagem C formada por funes, como printf(), scanf(), system(), que so includas atravs da diretiva #include (j explicada anteriormente). 2. Declarao da Funo tipo_de_retorno nome_da_funo (tipo_de_parmetro nome_do_parmetro, ....) { declarao das variveis locais; corpo da funo; retorno; }
O tipo_retorno especifica o tipo de valor (int, float) que a funo retornar atravs do return. Os tipos podem ser inteiros (int), reais (float), char (caracter) ou mesmo void (no retorna nada). Se no especificado o tipo o compilador assume um retorno inteiro. O nome_da_funo o identificador da funo. Atravs dele possvel saber o que a funo executar, por exemplo, se a funo for criada para fazer uma adio ela pode ser chamada de soma(). O compilador procura pelo nome da funo para fazer o desvio de execuo. A lista de parmetros separada por vrgula. O tipo_de_parmetro e o seu nome so respectivamente o tipo e o nome da varivel que sero passados para a funo. Uma funo pode no ter parmetros. Esses parmetros estabelecem a comunicao bidirecional entre o subalgoritmo e o algoritmo que o chamou. O corpo da funo contm todas as instrues que devero ser executadas pela funo. Ele deve estar entre chaves { }. A chaves de abertura { marca o incio da funo e a chaves fechada } marca o final da funo.
As variveis locais so variveis declaradas dentro (internamente) da funo onde sero usadas e somente so conhecidas (visveis e acessveis) pela funo que as criou. Exemplo: float media_notas (float nota1, float nota2) { float media; media = (nota1+nota2)/2; return media; } Prof Angelina V.S.Melar 79
3. A funo principal - main() Por padro a funo main() deve ser do tipo inteiro, ou seja seu retorno um valor inteiro. Esse valor pode ser usado pelo sistema operacional para verificar se a execuo do programa foi bem sucedida. Quando o valor retornado zero 0 significa que a execuo foi bem sucedida, caso contrrio ocorreu algum erro. int main() { return 0; } A funo principal pode receber vrios valores (argumentos) quando executada, que depois podem ser processadas. Veja a explicao no exemplo a seguir: Na linha de comando sero passados o nome do programa e 2 nmeros inteiros, como: ANGELINA 8 27 O programa ANGELINA iniciar executando a funo main() que estar recebendo 3 argumentos, o nome do programa, o nmero 8 e o nmero 27. Para que ele possa receber esses valores foi definido da seguinte maneira:
um ponteiro de uma matriz de caracteres. Cada elemento est direcionado para um argumento
int main (int argc, char * argv[]) No caso acima o argc teria o valor 3 e o argv a matriz formada por ANGELINA, 8 e 27.
Exemplo 1 : int main(int argc, char *argv[]) { printf("Total de argumentos passados %i", argc); printf("Nome do programa %s", argv[0]); _sleep(3000); return 0; } Exemplo 2: int main(int argc, char *argv[]) { int i=0; printf("Total de argumentos passados %i", argc); while (i< argc) { printf("\n%d - string informadas %s", argc, argv[i]); i++; } _sleep(3000); return 0; } Prof Angelina V.S.Melar 80
Exemplo 3: int main(int argc, char *argv[]) { int i=0; if (atoi(argv[1]) > 0) printf("\nNumero positivo"); _sleep(3000); return 0; } 4. Comando Return Tem duas formas de uso: ele provoca uma sada imediata das funo que o contm, retornando a funo anterior. retornar um valor para outra funo 5. Tipo Void Todas as funes que no devolvem valores devem ser declaradas como tipo void. Quando uma funo no tem parmetros, deve ser colocado o void entre parnteses. Quando no existe um retorno o tipo de funo void. As funes podem ser usadas como rotinas de entrada, rotinas de criao de ela ou rotinas de exibio de dados. Muitas rotinas so especficas e independem dos valores de variveis de outras rotinas, por isso o uso do tipo void na especificao das funes.
Exemplo: void entrada(void); main() { entrada(); .... system(pause); }
void entrada(void) { system(cls); printf(\n\n\n); printf(<1> - Adio \n); printf(<2> - Subtrao \n); printf(<3> - Multiplicao \n); printf(<4> - Diviso \n); printf(<5> - Sair \n); }
6. Prottipos de Funes O prottipo da funo foi acrescido com o padro C ANSI. O prottipo da funo deve ser usado quando a funo for definida aps a funo principal main(). Ele um cabealho que indica ao compilador a existncia de uma funo dentro do programa, podendo estar no meio ou no final. Definio do Prottipo tipo_de_retorno nome_da_funo (tipo_de_parmetro nome_do_parmetro, ....) float media_notas (float nota1, float nota2);
main() { }
** Se a funo for descrita no incio do programa, antes da funo principal main(), no precisa ser feito o seu prottipo. 7. Chamada (ativao) da Funo A chamada de funo existe quando h uma referncia de uma funo dentro do programa. Durante o acionamento da funo, o fluxo de execuo desviado para ele, e logo aps sua concluso, o fluxo de execuo retorna a linha de origem (a que o desviou). Na linha de chamada da funo pode haver o envio ou no de argumentos para outra funo. Esses argumentos so valores de variveis, que podem ser usadas na outra funo. No so definidos os tipos de dados dos argumentos, pois os mesmos so definidos no incio da funo. Exemplo:
float media_notas (float nota1, float nota2); main() n1 e n2 { nota1 e nota2 float n1,n2,media; media= media_notas (n1, n2); } float media_notas (float nota1, float nota2) { ....}
Os argumentos enviados para a funo devem ser compatveis com os parmetros, ou seja, se foram enviadas duas variveis (argumentos) exemplo nota1 e nota2 devem ser definidos na funo a ser executada duas variveis (parmetros) para estar recebendo os contedos das variveis. Os tipos de variveis devem ser iguais, ou seja, se os dados enviados so inteiros, ento a variveis definidas para receb-los tambm devem ser inteiros.
// chamada da funo media_notas() // fim da funo principal // declarao da funo media_notas // definio das variveis locais //retorna o resultado da mdia para a funo principal // fim da funo media_notas()
** A funo media_notas() do tipo float porque o retorno dela ser uma varivel do tipo float (media). ** Os parmetros (nota1 e nota2) so do tipo float porque seus respectivos argumentos (n1,n2) so do tipo float.
9. Classes de Armazenamento de Variveis Variveis Globais: So variveis definidas fora de qualquer funo especfica, no incio do programa, antes da funo principal. Elas podero ser manipuladas por qualquer funo e parte do programa e seus endereos e alocaes de memria permanecem at o final do programa- ou seja ficam ocupando espao. Essas variveis so definidas como extern. Elas so inicializadas com zero, caso o programador no as inicialize.
Variveis Locais: So variveis declaradas dentro de uma funo especfica e so visveis apenas na funo em que foram criadas. Funes distintas podem ter variveis locais com o mesmo nome. Quando a funo iniciada as variveis locais so criadas e quando essas funes so finalizadas as variveis locais so destrudas e liberados os endereos de memria. Essas variveis so automticas definidas e so definidas como auto. Elas no so inicializadas com zero. Ento, a varivel local ser visvel apenas na funo que a cria e a varivel global ser visvel por todas as funes existentes no programa. Isso pode ser alterado se voc definir a varivel como esttica.
Variveis Estticas: essas variveis so visveis e definidas internamente dentro de uma funo (localmente), mas no perde seu valor depois de finalizada a funo. /* Exemplo do uso de variveis estticas*/ #include <stdio.h> #include <stdlib.h> void contador (); main() { contador(); contador(); contador(); _sleep(2000); }
Register: as variveis definidas como register so armazenadas num registrador do processador e no na memria RAM. Dessa maneira aumentada a velocidade de processamento, j que no precisa do acesso a memria. Essas variveis devem ser int ou char.
main() { float num, qd; //declarao das variveis locais printf ("Entre com um numero: "); scanf ("%f",&num); printf ("Na funo MAIN a varivel num vale %.2f \n", num); qd= quadrado(num); //chama a funo quadrado() e envia o argumento num printf ("O quadrado do %.2f = %.2f\n",num, qd); system(pause); } float quadrado(float num) //declarao da funo quadrado() e do { parmetro num num = num*num; printf ("Na funo QUADRADO a varivel num vale %.2f \n", num); return num; //retorna a funo que a chamou retornando um valor (num) que ser } atribudo a varivel qd. ** A funo quadrado() do tipo float porque o retorno dela ser uma varivel do tipo float (num). ** O parmetro (num) do tipo float porque o argumento (num) do tipo float.
Exerccios Resolvidos 1) Faa uma funo que calcule a soma de dois nmeros recebidos na funo principal. #include <stdio.h> #include <stdlib.h> float soma (float a, float b); // prottipo da funo soma main( ) // incio da funo principal { float n1, n2, total; // definio das variveis locais printf("\n Este programa calcula a soma de dois nmeros"); printf("\n\n Digite o valor do primeiro nmero"); scanf("%f", &n1); printf("\n\n Digite o valor do segundo nmero"); scanf("%f", &n2); total=soma(n1, n2); // chamada da funo soma() printf("\n\n A soma de %.2f com %.2f %.2f \n", n1, n2,total); system("pause"); } // fim da funo principal float soma (float a, float b) { float res; res= a+b; return(res); } ] 2) Elabore um programa que tenha as seguintes funes: _ na funo principal deve ser recebidas pedidas duas notas e feitas s chamadas de funes. _ uma funo que receba a nota do aluno e faa a consistncia; _ uma funo que calcule a mdia; _ uma funo que exiba o resultado, se o aluno est aprovado, reprovado ou em exame. #include <stdio.h> #include <stdlib.h> float ler_nota(void); /* prottipos das funes*/ float calcula_media(float p1, float p2); void exibe_resultado(float med); void pausa(void); main() { float n1, n2, med; printf("Primeira prova: "); n1=ler_nota(); printf("Segunda prova : "); n2=ler_nota(); med=calcula_media(n1, n2); exibe_resultado(med); pausa(); } // definio da funo soma // definio das variveis locais // retorna o resultado da soma dos nmeros enviados // fim da funo soma()
float ler_nota(void) { float n; do { scanf("%f", &n); if (n<0.0 || n>10.0) printf("Nmero Invlido! Redigite..:"); }while (n<0.0 || n>10.0); return(n); } float calcula_media(float p1, float p2) { float res; res = (p1 + p2) / 2; /* Calcula a mdia*/ return(res); } void exibe_resultado(float med) { printf("Media %.1f: ", med); if (med < 3.0) printf("Aluno reprovado\n"); else if (med >= 3.0 && med < 7.0) printf("Aluno em exame\n"); else if(med >= 7.0) printf("Aluno aprovado\n"); } void pausa(void) { system(pause); system(cls); } 3) Exemplo completo de validao de dados, sem usar a funo atoi() ou atof(). int caractermaiusculo(char ch) { return (ch >= 'A' && ch <= 'Z'); } int caracterminusculo(char ch) { return (ch >= 'a' && ch <= 'z'); } int digitonumerico(char ch) { return (ch >= '0' && ch <= '9'); }
int main(void) { char c; while(1) { c=getch( ); putchar(c); if (digitonumerico(c) == 1) puts("Valor Numerico\n"); else if (caractermaiusculo(c) == 1) puts("Caracter Maiusculo\n"); else if (caracterminusculo(c) == 1) puts("Caracter Minusculo\n"); else puts("Caracter especial\n"); } system("pause"); return 0; }
Funes Recursivas
Essas funes tm esse nome por poderem chamar a si mesmas de forma direta ou indireta. Por exemplo, para calcular o fatorial de um nmero pode ser feita uma funo e ela precisar chamar a si mesma (forma direta). Quando uma funo chama outra e depois essa outra chama a que a chamou definida como funo recursiva indireta. As variveis locais de chamadas recursivas so independentes entre si, como se tivessem chamando funes diferentes. Exemplo: Calculo do fatorial de um nmero qualquer. /* N! = N * (N-1)! 4! = 4 * 3* 2 * 1 4! = 4 * 3! 3! = 3 * 2! 2! = 2*1 ! 1!= 1 Se N! for 0 o resultado 1 Seno, N * (N-1) */ #include <stdio.h> #include <stdlib.h> main() { int num, r_fatorial; printf("Informe valor: "); scanf("%i", &num); r_fatorial = 1; if (num == 0) r_fatorial = 1; else { do { r_fatorial *= num; num--; }while (num !=0); } printf("O fatorial desse numero e %i", r_fatorial); _sleep(2000); } Usando funo recursiva direta #include <stdio.h> #include <stdlib.h> int f_fatorial(int num); main() { int num; printf("Informe valor"); scanf("%i", &num);
printf("O fatorial desse numero %i", f_fatorial(num)); _sleep(3000); } int f_fatorial(int num) { if (num == 0) return 1; else return num*f_fatorial(num-1); } As variveis locais de chamadas recursivas so independentes entre si, como se tivessem chamando funes diferentes. Simulao da execuo: Fatorial do nmero 2 A)- envia o argumento 2 - na funo testa o valor - tem o return 2 * f_fatorial(2-1) *** no retorna, pois primeiro tem um funo a ser executada. B) -envia o argumento 1 (do calculo anterior 2-1) - na funo testa o valor - tem o return 1 * f_fatorial(1-1) *** no retorna, pois primeiro tem um funo a ser executada. C) - envia o argumento 0 (do calculo anterior 1-1) - na funo testa o valor - veja que agora tem o return 1 -- esse retorna o valor 1 passo B - tem o return 1 * 1 --esse tambm retorna o valor calculado 1 ao passo A, que calcula return 2 * 1 e retorna o valor 2 a funo principal e exibe o resultado.
Vetores
1. Conceito
Os vetores so matrizes unidirecionais homogneas e podem ser chamadas de: arranjos unidimensionais, variveis indexadas, variveis compostas homogneas unidimensionais ou arrays. O vetor um mecanismo de estruturao de dados usado para representar variveis do mesmo tipo de dado, que so referenciados pelo mesmo nome e cada elemento atravs de sua posio dentro dela. Consiste em locaes contguas de memria. O endereo mais baixo corresponde ao primeiro elemento e o mais alto ao ltimo. Os vetores so variveis indexadas por apenas um ndice (uma dimenso, unidimensional). O elemento do vetor acessado por meio de um ndice. O ndice 0 contm o primeiro elemento armazenado. Uma string (cadeia de caracteres) um vetor de caracteres.
2. Exemplos: float media[10]; 0 2.5 1 4.5 2 6.5 3 3.5 // vetor com 10 elementos do tipo real 4 10 5 8 6 7 7 5.5 8 6 9 8.5
\0
//vetor com 4 elementos do tipo inteiro
3. Declarao: A declarao de um vetor pode ser feita da seguinte maneira: tipo_da_varivel nome_da_varivel [tamanho]; Onde: tipo_da_varivel o tipo base do vetor (int, float, char, etc), ou seja, qual tipo de contedo ser armazenado na varivel; tamanho_da_varivel a quantidade de elementos que o vetor armazenar. Exemplo: float medias[45];
- A linguagem C reservar 180 bytes (45 x 4), ou seja, so 45 variveis do tipo float, onde cada float ocupa 4 bytes. Estes bytes so reservados de maneira contgua.
4. Acessando os elementos Cada elemento do vetor um elemento individual, ou seja, seu contedo no est vinculado com os outros. Para acess-lo eu preciso de uma referncia a mais do que somente seu nome, preciso saber onde se localiza o elemento dentro do vetor. Para isso acessamos os elementos do vetor, individualmente, atravs de um ndice. Na linguagem C os ndices iniciam no 0 e finalizam valendo o tamanho do vetor -1, devendo ser colocados entre colchetes. Exemplo: float media[10]; A primeira mdia ser armazenada na posio 0 do vetor e a ltima ser na posio 9; 0 1 2 3 4 5 6 7 8 9 2.5 4.5 6.5 3.5 10 8 7 5.5 6 8.5
acessa o primeiro elemento do vetor; acessa o ltimo elemento do vetor; acessa o terceiro elemento do vetor;
5. Armazenando os elementos Para ser feito o armazenamento no vetor necessrio de definir seu nome e em qual posio dever ser armazenada (qual ndice). O armazenamento pode ser feito separadamente ou em conjunto, de uma vez s. Veja os exemplos abaixo: media[0] = 2.5; float media[10]= {2.5,4.5,6.5,3.5,10,8,7,5.5,6,8.5}; float media[]= {2.5,4.5,6.5,3.5,10,8,7,5.5,6,8.5}; media[1] = 4.5; ** Cuidado: No se esquea que o ndice sempre inicia no 0. Ao declarar um vetor voc coloca o tamanho total. 6. Endereo do vetor ou matriz unidimensional Quando se refere ao endereo do vetor, pense que o primeiro elemento d incio ao vetor, ou seja, media equivale ao endereo inicial do vetor (media[0] igual a media). Por isso quando for feita a entrada de uma string no se pode colocar o &. Exemplos a) Recebendo elementos de um vetor do tipo inteiro digitados via teclado for ( i=0; i<100; i++ ) { printf(Digite %i elemento do vetor, i++); scanf( %i, &vet[i] ); } b) Mostrando os elementos de um vetor na tela: for ( i=0; i<100; i++ ) printf( %i, vet[i] ); Prof Angelina V.S.Melar 92
c) Inicializando um vetor com zeros for ( i=0; i<100; i++ ) valores[i] = 0; 7. Exerccios Resolvidos: 1) Crie um vetor com 10 elementos do tipo inteiro e depois armazene automaticamente os valores de 0 a 9. main() { int x[10]; //definio do vetor int i; //definio da varivel para controlar o ndice for (i = 0; i < 10; i ++) //definio do lao para gerar o vetor x [i] = i; //atribuio do valor da varivel i ao vetor x system(pause); } 2) Crie um vetor com 10 elementos do tipo inteiro e depois armazene automaticamente os resultados da tabuada do nmero 2. main() { int r[10]; int t; for(t=0;t<10;t++) { r[t]=t*2; printf("%i\n",r[t]); } system("pause"); } 3) O professor de Programao de Computadores precisa de um programa que calcule a mdia geral da sala, verificando dessa forma o desempenho dos alunos. O programa deve receber e armazenar as notas dos 35 alunos e calcular a mdia geral da sala. main() { int notas[35],i,soma =0; for(i=0;i<5;i++) { printf("Digite a nota do aluno %d: ",i); scanf("%f",¬as[i]); soma=soma+notas[i]; } printf("Media das notas: %f.",soma/5); system("pause"); }
for (t=0;t<10;t++) // ou for (t=0; texto[i] != '\0';t++) { if (texto[t] == 'a' || texto[t] == 'e' || texto[t] == 'i' || texto[t] == 'o' || texto[t] == 'u') vogais++; } printf ("Total de vogais: %i\n", vogais); system ("pause"); }
Prof Angelina V.S.Melar 94
Funo strlen() Retorna o tamanho da string #include <stdio.h> #include <stdlib.h> #include <string.h> main() { char nome[40]; printf(Digite seu nome: ); gets(nome); printf(O tamanho do nome : %i\n, strlen(str)); } Funo strcat() Unio de variveis string main() { char nome[40], sobrenome[15]; int i; printf ("\nEntre com um nome: "); scanf ("%s", nome); printf ("\nEntre com um sobrenome: "); scanf ("%s", sobrenome); strcat(nome, " "); strcat(nome, sobrenome); printf ("\nO seu nome %s \n", nome); } Funes: atoi(), atof() Essas funes fazem a converso de uma string em um valor numrico. A atoi() converte a string para um valor inteiro. A atof() converte para um nmero ponto flutuante. Cuidado com o valor informado se for usado o atoi ele somente aceita o valor inteiro e ignora a parte decimal. Exemplo: 287.455 somente aceita o 287 Uma string invlida retorna na converso o valor zero.
Dica: Quando voc quiser que no trave o programa na entrada de dados, de forma que o usurio informe uma letra no lugar de entrar com o nmero, use uma dessas funes. int main() { char num1[3], num2[3]; int inum1; float fnum2; printf("\nInforme o valor"); gets(num1); printf("\nInforme o valor"); gets(num2); inum1= atoi(num1); fnum2= atof(num2); printf("\nOs numeros validos informados sao %i e %.2f",inum1, fnum2); _sleep(3000); }
Funo strcmp() usada para comparar strings. Ela recebe e compara duas strings. Essa funo retorna 0 se as duas forem iguais, seno, se a primeira string for maior que a segunda retorna um valor positivo, seno, retorna um valor negativo. main() { char senha1[10], senha2[10]; printf("\nCadastro de senha\n"); printf("Informe sua senha:"); gets(senha1); printf("Redigite sua senha: "); gets(senha2); if ( strcmp(senha1,senha2) == 0 ) printf ("\nSenha vlida"); else if ( strcmp(senha1,senha2) >0 ) printf ("\nA primeira senha e maior"); if ( strcmp(senha1,senha2) < 0 ) printf ("\nA primeira senha e menor"); getch(); }
Ou int i=0, i =0; char nomes[20]; gets(nome_pes); while(i<20 || !achou) //poderia ser ! (achou == 0) { if (!strcmp(nomes[i], valor) { achou = 1; break; } else i++; }
Funo puts() usada para mostrar uma nica string por vez, mas com a vantagem de pular a linha automaticamente. main() { char senha1[10]= "Fatec", senha2[10]= "Fatec Itu"; puts("Senhas cadastradas\n"); puts(senha1); //aparece Fatec puts(senha2); //aparece Fatec Itu puts(&senha1[4]); //aparece c itu a partir do ndice 4. } Funo strstr() procura uma string dentro de outra string Exemplo: if (strstr(string_lida, string_pesq) != NULL) break; Prof Angelina V.S.Melar 96
Funo strchr() procura um caracter dentro de uma string Exemplo com as duas funes de pesquisa: int main() { char nome[20]="Ana carolina";
if (strstr(nome, "Ana")) printf("O nome possui o Ana"); else printf("O nome no possui o Ana"); if (strchr(nome, 'a')) printf("O nome possui o caracter a"); else printf("O nome no possui o caracter a"); getchar(); return 0; }
Funo fgets() A funo fgets() efetua a leitura de dados do tipo string fornecidos via teclado delimitando seu tamanho. Ela aceita caracteres em branco no meio do string, colocando o caractere de controle \0 apenas quando for pressionada a tecla <Enter>. Para utilizar esta funo, preciso informar trs parmetros, sendo o nome da matrizstring, o seu tamanho e o nome do buffer em uso: fgets(VARIAVEL, TAMANHO, stdin);
Matriz
Segundo Giovanni e Bonjorno: Matriz o conjunto ordenado dos nmeros que formam uma tabela, onde cada nmero um elemento. Matriz transposta: quando temos uma matriz de origem m x n e a transposta n x m 1. Matriz Bidimensional A linguagem C permite que seja declarada uma matriz bidimensional (varivel composta homognea bidirecional) ou mesmo multidimensional. Na matriz bidimensional o primeiro ndice indica a linha e o segundo a coluna. Os ndices iniciam no zero(0). Para calcular o espao de memria necessrio para armazenar a matriz necessrio fazer o seguinte calculo: int pontos_jogos [2] [4];
qtd de linhas * qtd de colunas * qtd do tipo (inteiro) tamanho = 2 * 4 * 2 tamanho = 16 Lembre-se que internamente essa matriz tem seus valores armazenados linearmente, de forma continua na memria, cada elemente armazenado em um endereo, cujo prximo elemento est no endereo seguinte da memria.
2. Declarao: A declarao de uma matriz bidimensional pode ser feita da seguinte maneira: tipo nome [dimenso1] [dimenso2]; ou tipo nome [linha] [coluna]; Exemplos: 1) char tabela[5][5];
3. Armazenando os elementos A inicializao e armazenamento de uma matriz pode ser individual ou coletivo. Como nos exemplos abaixo:
pontos_jogos [0] [1] = 5; pontos_jogos [1] [3] = 60 int i[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; int quadrados[5][2] = {1, 1, 2, 4, 3, 9, 4, 16, 5, 25}; float nota[2][3] = {{9, 8, 7} , {6.5, 4, 2}};
4. Armazenamento feito via teclado A leitura e armazenamento dos elementos de uma matriz via teclado deve ser usando uma estrutura de repetio (lao). O for o mais usado. Supondo que a matriz foi declarada como: int mat [2] [3]; O lao da linha (1 dimenso) inicia no 0 e finaliza no 1 e o lao da coluna (2 dimenso) inicia no 0 e finaliza no 2.
for (l=0; l<2; l++) { for (c=0; c<3; c++) scanf (%i, &mat[ l ] [c ]); }
5. Mostrando os elementos Para mostrar os valores armazenados dentro de uma matriz tambm usada a estrutura do for. Para exibir a matriz mat declarada acima.
for (l=0; l<2; l++) { for (c=0; c<3; c++) printf (%i, mat [ l ] [c ] ); }
Ponteiros
1. Variveis ponteiros Uma varivel ponteiro um tipo especial de varivel, que tem como contedo um endereo de memria de outra varivel, esse endereo em hexadecimal. O tipo dessa varivel ponteiro deve ser o mesmo tipo da varivel para a qual est apontando, por exemplo se ela estiver apontando para um endereo de uma varivel cujo contedo float ento ela (a varivel ponteiro) deve ser definida como float. Para trabalhar com ponteiros usado os operadores unrios & e * antes da varivel. O formato de exibio usado na funo printf() pode ser %p, %x, u %X, a diferena apenas quanto ao formato de exibio. Definio e declarao do ponteiro Define o tipo da varivel e do ponteiro dessa varivel
int *p, v; O que define que a varivel um ponteiro o * antes do nome. O * tambm poderia estar junto com o tipo: int* p.
Atribuio do endereo ou direcionado o ponteiro O endereo de memria da varivel v armazenado no ponteiro p
p = &v; int main() { int *p, v; v= 8; p= &v; printf("\nO endereco de v e %p", &v); printf("\nO conteudo do p e %p", p); printf("\nO endereco do p e %p", &p); getchar(); }
Cuidado com o uso do operador *. O * pode ser usado tanto para declarar o ponteiro quanto para indicar o contedo da varivel para qual ele est apontando. main() Cuidado: voc tem que atribuir { um endereo para o ponteiro int *p, v; v= 8; p= &v; printf("\nO endereco de v e %p", &v); printf("\nO conteudo do p e %p", p); // o endereo memria de v printf("\nO endereco do p e %p", &p); printf("\nO valor de v %d", v); printf("\nO valor de v mostrado atraves do ponteiro p %d", *p); } Podemos usar mais ponteiros para direcionar para o mesmo local da memria. main() { int *p, *p2, v; v= 8; p= &v; p2= p; //no usa o & para pegar o endereo do outro ponteiro printf("\nO endereco de v e %p", &v); printf("\nO conteudo do p e %p", p); printf("\nO endereco do p e %p", &p); printf("\nO valor de v %d", v); printf("\nO valor de v mostrado atraves do ponteiro p %d", *p); printf("\nO valor de v mostrado atraves do ponteiro p2 %d", *p2); } Aritmtica de ponteiros Pode ser feito uso das operaes de adio e subtrao com os ponteiros. Mas cuidado para no pegar o contedo da varivel para o qual ele est apontando e sim seu endereo. Se acrescentarmos no programa anterior o cdigo abaixo: int t; t= sizeof(t); //ver o tamanho do tipo int e quantos bytes vai avanar p++; printf("\nO contedo de p e %p", p); printf("\nO contedo apontado pelo ponteiro p %d", *p);
Est sendo feito uma adio no ponteiro p++, de forma que ele ir avanar 4 bytes na memria, pois, a cada incremento ele acrescentar ao seu endereo a quantidade de bytes de seu tipo. De forma que quiser retroceder e voltar a apontar para v, basta fazer uma subtrao com o ponteiro. p--;
Vendo o contedo da varivel atravs de seu ponteiro de forma indireta main() { double *p, v; v= 8; p= &v; printf("\nO contedo de p e %p", p); //endereo de v printf("\nO contedo apontado pelo ponteiro p %f", *p); p--; printf("\nO contedo de p e %p", p); printf("\nO contedo apontado pelo ponteiro p %f", *p); }
Perceba que o tipo Double oculpa 8 bytes, quando subramos o ponteiro ele voltou 8 bytes. main() { int *p, v; v= 8; p= &v; printf("\nP %d e V %d", *p, v); v+= 10; //somando 10 ao valor de v printf("\nP %d e V %d", *p, v); *p= *p+1;//somando 1 ao valor de v atravs do ponteiro printf("\nP %d e V %d", *p, v); (*p)++; //somando 1 ao valor de v atravs do ponteiro --use () printf("\nP %d e V %d", *p, v); *p++; //erradoooo - voc acrescentou 1 ao valor do ponteiro printf("\nP %d e V %d", *p, v); }
Cuidado para no errar *p++; //errado - voc acrescentou 1 ao valor do ponteiro printf("\nP %d e V %d", *p, v); *p--; //errado - voc subtraiu 1 ao valor do ponteiro printf("\nP %d e V %d", *p, v); 2. Trabalhando com Matriz atravs de Ponteiros muito usado em matriz, a passagem do endereo dessa matriz para outra funo, atravs de ponteiros. Para isso voc deve direcionar o ponteiro para o primeiro elemento da matriz. Isso pode ser feito de duas maneiras: int main() { int mat[4]={10,20,30,40}, *pm; pm = mat; //direciona para o ndice 0 printf("\n1o elemento: %d", *pm); //ou pm = &mat[0]; //tem que colocar o & para informar o ndice 0 printf("\n1o elemento: %d", *pm); printf("\n1o elemento: %d", mat[0]); }
Veja o programa abaixo: int mat[4]={10,20,30,40}, *pm; pm = mat; printf("\n1o elemento: %d", *pm); //ou pm = &mat[0]; //tem que colocar o & para informar a posio 0 printf("\n1o elemento pelo pm %d e pelo mat[0]", *pm, mat[0]); pm= &mat[1]; //apontando para o 2 elemento printf("\n2o elemento pelo pm %d", *pm); pm++; //somando 4 bytes ao endereo do ponteiro e indo para o 3 elemento printf("\n3o elemento pelo pm %d", *pm); *pm = *pm *2; //multiplicando por 2 o contedo do 3 elemento printf("\n3o elemento pelo pm %d", *pm); *(pm++); //apontando para o prximo endereo printf("\n4o elemento pelo pm %d", *pm);
Voc pode fazer o calculo diretamente na exibio int mat[3] = {10, 20, 30}, *pmat; pmat = mat; printf("mat[0] = %d \n", *(pmat)); printf("mat[1] = %d \n", *(++pmat)); printf("mat[2] = %d \n", *(++pmat)); printf("mat[0] = %d \n", *(pmat-=2)); getchar(); Recebendo valores de uma matriz atravs de seu ponteiro #define E 3 main() { int mat[3], *pmat, i; pmat = mat; printf("Informe os valores da unidimensional\n"); for (i=0; i<E; i++) { printf("\n%d valor", i+1); scanf("%d", pmat); pmat++; }
3. Passagem de Matriz por Referncia Na passagem da matriz, voc ir enviar o endereo do elemento 0. Quando for definido o ponteiro para receber o endereo de uma matriz unidimensional, voc no precisa colocar a dimenso (quantidade de elementos) que essa matriz ter, porque na linguagem C ele apenas precisa saber o tipo dessa matriz. Voc que far o controle dos elementos. Quando a matriz for bidimensional obrigatrio informar a quantidade de elementos da segunda dimenso. O operador * no precisa ser colocado, pois quando se passa um matriz unidimensional ou bidimensional sempre ser por referncia.
void recebe(int pmat[], int t); /////////void recebe(int *pmat[], int t); int main() { int mat[3], i ; recebe(mat, 3); for (i=0; i<3; i++) printf("\n%d", mat[i]); _sleep(20000); } void recebe(int pmat[], int t) { int i; for (i=0; i<t; i++) { scanf("%d", pmat); pmat++; } }
Na matriz bidimensional veja a definio da segunda dimenso
void calculamedia(float notas[][3]) { int i; for (i=0; i<3; i++) { notas[i][2]= (notas[i][0]+ notas[i][1])/2.0; } }
int main() { float notas[3][3]; int l, c, i; for (l=0; l<3; l++) { printf("\n\nAluno %d\n", l+1); for (c=0; c<2;c++) { printf("%d Nota", c+1); scanf("%f", ¬as[l][c]); } } calculamedia(notas); printf("\nMedias dos alunos"); for (i=0; i<3; i++) { printf("\n%d aluno teve %.2f", i+1, notas[i][2]);; } _sleep(20000); }
Estruturas
ESTRUTURAS (Struct) VARIVEIS COMPOSTAS HETEROGNEAS Muitas vezes precisamos manipular dados compostos, mas que identificam uma nica representao. Para isso necessrio ter um mecanismo de agrupamento, estruturando os dados em um nico contexto, como por exemplo um ponto representado tanto pela coordenada x quanto pelas coordenada y, elas so dependentes (no devem ser tratadas de forma isolada). Assim como um data, que formada tanto pelo dia, quanto pelo ms e pelo ano.
A sintaxe da deinio de uma estrutura : struct nome_da_estrutura { Componentes/membros dessa estrutura; tipo nome_da_varivel; }; Estruturas permitem definir estruturas complexas de dados, com campos de tipos diferentes. Por meio da palavra-chave struct e type def definimos um novo tipo de dado. Definir um tipo de dado significa informar ao compilador o seu nome, o seu tamanho em bytes e o formato em que ele deve ser armazenado e recuperado na memria. Aps ter sido definido, o novo tipo existe e pode ser utilizado para criar variveis de modo similar a qualquer tipo simples. struct Dados_Pessoais { char nome[81]; int idade; float peso; } P1; foi feita a declarao da varivel P1 que do tipo Dados_Pessoais no final da definio da estrutura, mas, essa declarao poderia ser feito de outra forma, como abaixo: /* Declarao de variveis do tipo struct Dados_Pessoais*/ struct Dados_Pessoais P2, P3;
Definindo um novo tipo de dado com o typedef typedef struct Dados_Pessoais { char Nome [ 81]; int Idade; float Peso; } Pessoa;
Uma vez criada a varivel composta heterognea, denominada estrutura, seus membros podem ser acessados por meio do operador de acesso ponto (.). Esse conecta o nome da varivel estrutura a um dos seus membros. estrutura membro gets(Pessoa.Nome); Pessoa.Idade = 41; Pessoa.Peso = 75.6;
Outro exemplo direto de denominao de um tipo de dado: int main() { typedef float R; //o nome R um mneumnico do tipo float R n1; scanf("%f", &n1); printf("Numero digitado %g", n1); } Resumindo struct ponto { float x; float y; }; typedef struct ponto P;
scanf (%f%f, &p.x, &p.y); printf(As coordenadas so %.2f - %.2f, p.x, p.y)
Exemplos de uso: 2. Recebendo dados main() { struct dados_pessoais { char nome[81]; int idade; float peso; }; struct dados_pessoais aluno;
printf("\nNome do aluno:"); gets(aluno.nome); printf("\nIdade:"); scanf("%i", &aluno.idade); printf("\nPeso:"); scanf("%f", &aluno.peso); printf("%i %s %.2f \n", aluno.idade, aluno.nome, aluno.peso); }
3. Recebe e mostra uma estrutura de horas main() { struct evento { int h, m; float s; }; struct evento ev; printf("Entre com a hora de um evento(hh:mm:sec): "); scanf("%i:%i:%f", &ev.h, &ev.m, &ev.s); printf("A hora fornecida foi: %d:%d:%.2f\n", ev.h, ev.m, ev.s); } 4. Igualando estruturas main() { struct data { int dia; char mes[10]; int ano; }; data natal = { 25, "Dezembro", 1994}; data aniversario = { 30, "Julho", 1998}; printf("%i %s %i \n", aniversario.dia, aniversario.mes, aniversario.ano);
aniversario = natal; printf("%i %s %i \n", natal.dia, natal.mes, natal.ano); printf("%i %s %i \n", aniversario.dia, aniversario.mes, aniversario.ano); }
5. Recebendo e verificando dados #include <stdio.h> #include <stdlib.h> int main() { struct dados_pessoais { char nome[81]; int idade; float peso; };
typedef struct dados_pessoais Aluno; //define o novo tipo Aluno Aluno A; //define a varivel A que do tipo Aluno printf("\nNome do aluno:"); gets(A.nome); Prof Angelina V.S.Melar
110
printf("\nIdade:"); scanf("%i", &A.idade); printf("\nPeso:"); scanf("%f", &A.peso); printf("%i %s %.2f \n", A.idade, A.nome, A.peso); if (A.peso >30) printf("Precisa comer mais\n\n"); system("pause");return 0; }
Ou typedef struct dados_pessoais{ char nome[81]; int idade; float peso; }Aluno; //define o tipo Aluno
int main() { int i; for (i=0;i<3;i++) { printf("\nCadastro n: %i\n", i+1); fflush(stdin); printf("\nNome do aluno:"); gets(aluno[i].nome); printf("\nIdade:"); scanf("%i", &aluno[i].idade); printf("\nPeso:"); scanf("%f", &aluno[i].peso); printf("%i %s %.2f \n", aluno[i].idade, aluno[i].nome, aluno[i].peso); } system("pause"); return 0; } Ou main() { int i; struct dados_pessoais { char nome[81]; int idade;
Prof Angelina V.S.Melar 111
float peso; };
struct dados_pessoais aluno, *paluno;
paluno = &aluno; for (i=0;i<3;i++) { printf("\nCadastro n: %i\n", i+1); fflush(stdin); printf("\nNome do aluno:"); gets(paluno->nome); printf("\nIdade:"); scanf("%i", paluno->idade); printf("\nPeso:"); scanf("%f", paluno->peso); printf("%i %s %.2f \n", *paluno->idade, *paluno->nome, *paluno->peso); } system("pause"); } Usando uma estrutura dentro da outra estrutura typedef data { int dia; int mes; int ano; }; struct dados_pessoais { char nome[81]; int idade; float peso; data data_niver ; } aluno[3]; main() { int i; for (i=0;i<3;i++) { printf("\nCadastro n: %i\n", i+1); fflush(stdin); printf("\nNome do aluno:"); gets(aluno[i].nome); printf("\nIdade:"); scanf("%i", &aluno[i].idade); printf("\nPeso:"); scanf("%f", &aluno[i].peso); printf("\nData de Aniversario:"); scanf("%i-%i%i", &aluno[i].data_niver); printf("%i %s %.2f \n", aluno[i].idade, aluno[i].nome, aluno[i].peso); } Prof Angelina V.S.Melar
112
struct desenho { int basemenor; int basemaior; int altura; float area; }; main() { struct desenho trapezio; trapezio.basemenor =2; trapezio.basemaior= 7; trapezio.altura = 5; trapezio.area= (trapezio.basemenor + trapezio.basemaior) * trapezio.altura/2; exibedesenho(trapezio); } void exibedesenho(struct desenho trapezio) { printf("Base menor: %i \n \r", trapezio.basemenor); printf("Base maior: %i \n \r", trapezio.basemaior); printf("Altura : %i \n \r", trapezio.altura); printf("Area do Trapezio: %.f \n \r", trapezio.area); }
8. Fazendo a referncia de estrutura em uma funo void calculadesenho(struct desenho *ptrapezio); struct desenho { int basemenor; int basemaior; int altura; float area; };
main() { struct desenho trapezio; calculadesenho(&trapezio); printf("Base menor: %i \n \r", trapezio.basemenor); printf("Base maior: %i \n \r", trapezio.basemaior); printf("Altura : %i \n \r", trapezio.altura); printf("Area do Trapezio: %.f \n \r", trapezio.area); system("pause"); }
Prof Angelina V.S.Melar 113
void calculadesenho(struct desenho *ptrapezio) { (*ptrapezio).basemenor =2; (*ptrapezio).basemaior= 7; (*ptrapezio).altura = 5; (*ptrapezio).area= ((*ptrapezio).basemenor + (*ptrapezio).basemaior) * (*ptrapezio).altura/2; }
ou void calculadesenho(struct desenho *ptrapezio) { ptrapezio->basemenor =2; ptrapezio->basemaior= 7; ptrapezio->altura = 5; ptrapezio->area= (ptrapezio->basemenor + ptrapezio->basemaior) * ptrapezio->altura/2; } 9. Fazendo a referncia de estrutura em uma funo void exibe(struct ponto *pponto); struct ponto { float x; float y; };
main() { struct ponto vponto; printf("\nDigite as coordenadas dos pontos x e y: "); scanf("%f %f", &vponto.x, &vponto.y); exibe(&vponto); vponto.x= 5.7; printf("\nOs pontos digitados foram %.2f e %.2f \n", vponto.x, vponto.y); system("pause"); } void exibe(struct ponto *pponto) { printf("\nOs pontos digitados foram %.2f e %.2f \n", pponto->x, pponto->y); }
Ou void exibe(struct ponto cponto); struct ponto { float x; float y; }; Prof Angelina V.S.Melar 114
main() { struct ponto vponto; printf("\nDigite as coordenadas dos pontos x e y: "); scanf("%f %f", &vponto.x, &vponto.y); exibe(vponto); printf("\nOs pontos digitados foram %.2f e %.2f \n", vponto.x, vponto.y); } void exibe(struct ponto cponto) { printf("\nOs pontos digitados foram %.2f e %.2f \n", cponto.x, cponto.y); cponto.x= 5.7; }
10. Fazendo Alocao Dinmica de Memria float media(int n, float *v); main() { int i, n; float *v, med; printf("Quantos elementos serao armazenados: "); scanf("%i", &n); v= (float *) malloc(n * sizeof(float)); //aloca 4*n bytes de memria em tempo de execuo if (v==NULL) { printf ("Memoria Insuficiente"); system("pause"); return 1; }
for (i=0; i<n; i++) { printf(" %i - ", i+1); scanf("%f", &v[i]); } med= media(n,v); printf("Media %.2f \n\n", med); free(v); //libera a memria } main() { float media(int n, float *v) int i, n; float *nota = NULL; { printf(Entre com tamanho n: ); scanf(%d,&n); int i; nota=(float *)malloc(n*sizeof(float)); float s=0; for (i=0; i < n; i++) for (i=0; i<n;i++) { s+= v[i]; printf( Entre a nota %i:, i+1); scanf(%f, nota+i); return s/n; } } for (i=0; i < n; i++) printf(\n %.2f \n, *(nota+i)); free(nota); }
Unio e Enumerao
1. Unio union
O tipo unio usado para compartilhar um mesmo endereo de memria para vrias variveis, que podem ser de tipos diferentes. void main() { union variavel { float valor_hora; float valor_mensal; }; union variavel var; var.valor_hora = 5.5; printf("\nValor da Hora %.2f", var.valor_hora); var.valor_mensal = 346.5; printf("\nValor Mensal%f", var.valor_mensal); printf("Valor da Hora %.2f", var.valor_hora); //permanece o ltimo valor atribudo ao endereo de memria, que o valor 346.5 (mensal) getchar(); } Cuidado: Somente uma varivel pode ser usada por vez, se for usado um outro membro da unio o anterior se perde (sobrescreve). #include <stdio.h> #include <stdlib.h> void main() { union variavel { int valor_hora; float valor_mensal; } var; printf("\nInforme o valor da hora"); scanf("%i", &var.valor_hora); printf("\nValor da Hora informado: %i", var.valor_hora); var.valor_mensal = 346.5; printf("\nValor Mensal pre-definido: %f", var.valor_mensal); printf("\nUltimo valor armazenado %g", var.valor_hora); //permanece o ltimo valor atribudo ao endereo de memria, que o valor 346.5 (mensal) }
2. Tipo enumerao
uma forma de definir inicialmente os valores, ou seja, pr-definidos. enum Mes { Jan = 1, Fev, Mar, Abr, Mai,Jun, Jul, Ago, Set, Out,Nov, Dez}; Se no for definido um valor inial da sequncia definida, ele sempre inicia a partir do zero.
enum meses {Jan = 1, Fev, Mar,Abr, Mai, Jun, Jul, Ago, Set, Out,Nov, Dez}; main() { int dia; meses mes; mes = Set; //ou mes = meses(9); if (mes == Jan || mes == Mar || mes == Mai || mes == Jul || mes == Ago || mes == Out || mes == Dez) dia = 31; else if (mes == Fev) dia = 28; else dia = 30; printf(Numero dias: %d \n,dia); }
Arquivos
A manipulao de um arquivo feita atravs da associao de uma varivel ponteiro (FILE) a um arquivo fsico (Stream), esse arquivo pode ser um arquivo texto (uma planilha do excel, um documento do Word) ou um arquivo binrio (um arquivo do sistema, um arquivo de dados). O contedo do arquivo depende da forma de criao do mesmo, pondendo ser criado e armazenado: Modo binrio, com uma sequncia de bytes gravados, desconhecidos numa leitura pelo usurio. Modo texto, com uma sequncia de caracteres da tabela ASCII, compreensvel numa leitura pelo usurio. Os arquivos gravados em modo binrio tem um tamanho menor, j que esto convertidos em bytes, enquanto que se for gravado em modo texto, cada caracter ter que ser convertido para binrio. A pesquisa de dados em um arquivo binrio mais rpida e fcil. Dessa forma, usamos arquivo binrios para armazenar uma grande quantidade de dados, como vrios cadastros (registros) e que no sejam compreensveis por questo de segurana, e o modo texto para gravar arquivos que podem ser compreensveis pelo usurio e abertos por qualquer editor.
3. Abertura do arquivo Para abrir ou mesmo criar um arquivo usada a funo fopen(). Para fazer uso dessa funo necessrio antes criar um varivel ponteiro (FILE) que direcionar para um endereo de memria do arquivo. FILE *parq; A funo fopen recebe dois argumentos string: a localizao (diretrio) junto com o nome do arquivo, e o modo de abertura do arquivo. A localizao padro o local onde est o arquivo executvel. fopen (nome, modo) parq = fopen(nome_arq, modo );
r w a rt rb - + wt wb at
Existe vrios modo com o quais o arquivo pode ser aberto ou criado. Abre arquivo j existente para leitura Abre para leitura e gravao. Caso o arquivo j exista ele sobrescreve os dados, destruindo os dados armazenados anteriormente, seno, existir ele cria um novo arquivo. Abre para leitura e gravao, mas, antes de tudo se posiciona no final dele. Se o arquivo j existir o abre e depois comea a gravar, acrescentando os dados no final. Se o arquivo no existir ele cria um novo arquivo para gravao. Abre o arquivo texto para leitura. Esse arquivo j deve existir Abre o arquivo binrio para leitura. Esse arquivo j deve existir Abre e grava no arquivo (a opo r+ abre o arquivo, e faz gravao no incio do arquivodiferente do modo append (a)) Cria um novo arquivo texto e o abre para leitura e gravao. Cria um novo arquivo binrio e o abre para leitura e gravao. Se o arquivo no existir, ele ser criado. Se j existir, o contedo anterior ser destrudo. Abre um arquivo texto j existente e adiciona as informaes no final do arquivo (se o arquivo no existir, ele criado).
118
rt ab
Abre um arquivo texto j existente para leitura Abre o arquivo binrio para leitura e gravao (usa os mesmos conceitos anteriores
parq = fopen(var_nome, const_modo ); OU parq = fopen( C:\\LOCAL\\ARQUIVO.TXT, w); A funo fopen() retorna um endereo de memria do arquivo quando esta for executada com sucesso, ou um valor NULL quando der erro (erro de abertura ou criao do arquivo). Com esse retorno possvel fazer verificaes e exibio de mensagem de alerta para o usurio. if (parq == NULL) { printf(Erro de abertura do arquivo); exit(1); }
4. Fechamento do arquivo Para fechar o arquivo usada a funo fclose(). Essa funo atualiza o arquivo com as informaes que esto no buffer (memria) e depois libera a memria. Resumindo efetiva a gravao, fecha o arquivo e libera a memria. fclose(parq); 5. Leitura muito importante definir a forma de leitura e gravao de um arquivo, pois, se for necessrio fazer uma consulta de todos os dados armazenados deve-se iniciar a leitura desde o incio do arquivo (percorrendo todo o arquivo at o final). Leitura de um arquivo binrio A leitura de um arquivo binrio sempre feita de um registro por vez, o computador far a leiutura por intervalos de bytes, onde cada registro tem um tamanho fixo. Essa leitura feita a partir de seu posicionamento no arquivo, por isso importante saber como ser feita a abertura do arquivo (posicionamento no incio ou no final do arquivo). parq = fopen( C:\\LOCAL\\ARQUIVO.TXT, rb);
fread(o endereo onde ser armazenado o contedo lido, tamanho em bytes a ser avanado o cursor, o nmero de registros que vai ler por vez, o ponteiro que indica o nome do arquivo que tem o contedo lido o nome da estrutura (registro) que nome do ponteiro armazenar o contedo lido qtd de registros do arquivo que est qtd de bytes lidos lidos (sempre 1) sendo lido (tamanho da estrutura)
fread(&devedores, sizeof(devedores), 1, parq);
Resumindo: feita a leitura de uma quantidade sequencial de bytes do arquivo fsico e depois guardado na memria atravs de um tipo estrutura. Aps a leitura de um registro o ponteiro fica posicionado no prximo registro do arquivo, podendo ser feita ou no sua leitura. Prof Angelina V.S.Melar 119
Leitura de um arquivo texto Funo fgets() l uma string de caracteres de um arquivo aberto. fgets (varivel que recebe a entrada, nmero de caracteres lidos, ponteirodearquivo); fgets(CAD.nome, 20, parq); //faz a leitura da string e a carrega no ponteiro Cuidado: O tamanho sempre considerando o valor inicial no zero. Se o tamanho total 20, ento se coloca 19, sempre total - 1. Obs: O posicionamento fica no fim da linha atual no arquivo se o caracter de mudana de linha ocorrer antes de serem lidos todos os caracteres. Toda vez que executa o fgets() atualizada a posio de leitura corrente do arquivo aberto. Retornando NULL quando no h mais dados para serem lidos.
Tambm existe as funes: fscanf(), fgetc() para leitura de um arquivo texto. Abaixo esto alguns trechos de cdigo com essas funes: FILE *parq char nome[35]; parq = fopen("dados.txt", rt); fscanf (parq,"Nome: %s",nome); puts(Nome gravado); printf(%s, nome); fclose(fp);
6. Gravao Gravao em modo binrio A gravao no modo binrio realizada atravs da funo fwrite(). Para usar essa funo necessrio passar alguns argumentos, como descrito abaixo: parq = fopen( C:\\LOCAL\\ARQUIVO.TXT, ab);
fwrite (o endereo onde est o contedo a ser gravado, tamanho em bytes a ser gravado, o nmero de elementos que vai gravar(nmero de registros que sero gravados) o ponteiro que indica o endereo para onde vai copiar- nome do arquivo fsico) nome da estrutura (registro) que contm os dados qtd de bytes a serem gravados
fwrite(&devedores, sizeof(devedores),
Cuidado: Se a estrutura foi definida para armazenar um nico registro no se coloca o &.
Resumindo: O fwrite pega o contedo que est posicionado na memria, em um registro, e o grava em um arquivo que est direcionado atravs do ponteiro. Exemplos em modo binrio: 1. Gravao dos dados em modo binrio struct entrada { char nome[40]; float valor; } devedores[4];
main() { int i; FILE *fp; for (i=0; i<4; i++) { fflush(stdin); printf("Digite o nome: "); gets(devedores[i].nome); printf("Valor da Divida: R$"); scanf("%f", &devedores[i].valor); } fp = fopen("devedores.txt","w"); //Etapa de abertura e gravao do arquivo if (fp == NULL) { printf(Erro de abertura do arquivo); exit(1); } fwrite(&devedores, sizeof(devedores), 1, fp); //se for um nico devedor no se deve colocar o &devedores fclose(fp); _sleep(3000); }
2. Leitura dos dados em modo binrio struct entrada { char nome[40]; float valor; } devedores[4];
main() { int i; FILE *fp; printf("Segunga etapa Exibicao dos devedores "); fp = fopen("devedores.txt","r"); fread(&devedores, sizeof(devedores),1,fp); Prof Angelina V.S.Melar
121
fprintf ( ponteiro do arquivo a ser gravado, formato de gravao, valores a serem gravados) fprintf (parq,"<tr> <td>%d x %d = %d </td></tr>", num, tabuada, resultado); fprintf(parq, Cadastro de Alunos); fprintf(parq, %s, nome);
Exemplo de criao e gravao de arquivo texto int main() { FILE *arquivo; int t,c=0,r ; printf ("Digite qual a tabuada...:"); scanf ("%d",&t); arquivo = fopen("tabuada.xls","w"); printf (arquivo,"<table>"); do { r=c*t; fprintf (arquivo,"<tr><td>%d x %d = %d</td></tr>",c,t,r); c++; } while (c<=10);
gets (nome_arquivo); if (! strcmp(nome_arquivo,"")) { puts("No foi informado um nome correto de arquivo. Finalizando!"); exit(0); } existe = access(nome_arquivo,4); if (existe) printf("%s no existe \n",nome_arquivo); } while (existe); parq = fopen (nome_arquivo,"rt"); //abrindo o arquivo no modo leitura while (!(feof (parq))) //enquanto no for final de arquivo continua lendo { fgets(CAD.nome, 20, parq); //faz a leitura da string e a carrega no ponteiro fgets(CAD.senha, 6, parq); printf ("%s%s", CAD.nome, CAD.senha); } fclose (parq); system("pause"); break; default: printf("\nOpcao invalida\n"); exit(0); } system("pause"); } }
Para ser feita a leitura e a gravao de um arquivo necessrio saber a posio ideal para que esse processo seja realizado. Existe a funo fseek() que define um ponto especfico de posicionamento no arquivo:
fseek( ponteiro do arquivo, quantos bytes ir avanar, qual a relao de avano) Voc tem que definir atravs do segundo argumento a quantidade certa de bytes para atingir a posio desejada (registro). O terceiro argumento define a posio que se deve estar para depois avanar. Eles podem ser: SEEK_CUR avano a partir a posio corrente (atual) SEEK_SET avano a partir do incio do arquivo SEEK_END avano iniciando do final do arquivo fseek( parq, 3*sizeof(devedores), SEEK_SET);
Primeiro se posiciona para depois fazer a leitura do registro. No exemplo acima, est se posicionando 4 registro. fread(&devedores, sizeof(devedores), 1, fp); possvel posicionar no final do arquivo para fazer uma gravao com o fseek: fseek(pdevedores, 0, SEEK_END); A funo rewind() posiciona no incio do arquivo. Rewind(pdevedores);
7. Verificando o final do arquivo binrio usada a funo feof() para verificar se est ou no no final do arquivo. Esse funo tem um valor de retorno, podendo ser 0 se ainda no est no final do arquivo, ou outro valor (no caso consideramos 1) para indicar o posicionamento no final do arquivo. while ( !(feof (parq))) ou while (feof (parq) == 0) Usamos essa funo dentro de estruturas de repetio, no exemplo acima feita a leitura enquanto no for final de arquivo. 8. Para apagar um arquivo Para apagar um arquivo fsico usada a funo remove(nomedoarquivo). Esse comando s pode ser executado se o arquivo estiver fechado. remove(devedores.bin);
Conceitos Bsicos
BIT Cada letra do alfabeto, nmero ou smbolo pode ser representado no computador por um
conjunto de sinais eltricos, chamados de Bits. Toda instruo e controle que deve ser executada pelo computador transmitido atravs desses Bits. O termo BIT, vem de Binary Digit, cuja traduo Digito Binrio, usado para representar a passagem ou no da corrente eltrica no computador (ou campo magntico: positivo ou negativo), tendo apenas dois estados. A passagem da corrente ou impulso eltrico pode ser desginado pelo digito 1 e a no passagem da corrente eltrica pelo digito 0. O BIT a menor unidade de medida de dados que o computador tem.Como um nico BIT no consegue representar todas as letras, digitos binrios e smbolos so feitos os agrupamentos de Bits. O conjunto de 8 Bits forma um agrupamento denominado Byte. As informaes em formato binrio so representadas(codificadas) de acordo com algumas tabelas. Existe representao de cdigo de 4 bits (BCD, Gray), cdigo 5 bits (BAUDOT- servios de telex), cdigo de 7 btis (ASCII) e 8 bits (EBCDIC). O nmero de bits utilizado no cdigo determina o nmero mximo de caracteres possveis a serem representados. Exemplo 7 bits = 27 = 128 combinaes. Algumas tabelas foram criadas pelos fabricantes de computadores. Exemplo: ASCII e EBCDIC
ASCII
A Tabela ou Cdigo ASCII (American Standard Code for Information Interchange Cdigo Padro Americano para o Intercmbio de Informao), criada (1963) e atualizada (1968) na dcada de 60, para representar os caracteres (letra, digito ou caracter especial), essa tabela baseada na combinao 7 bits e para representao o ingls. Com essas combinaes possvel fazer 128 representaes vlidas. Existe 1 bit de paridade para verificao de erros. Quando se pressiona a tecla F (01000100), os circuitos do teclado geram um sinal de 8 voltagens diferentes correspondentes ao seu cdigo de 8 bits, feita a verificao da sua representao ASCII e depois produzido o eco na tela do caracter F. Nessa tabela tem: 128 representaes, cujo valor decimal vai de 0 a 127. o 33 representaes no so imprimveis, pois so caracteres de controle, como as representaes: 13 do ENTER, 27 do ESC, 9 do TAB, 127 do DEL. 93 so representaes dos caracteres imprimveis (do cdigo 33 ao 126), como o alfabeto em maisculas e em minsculas, os nmeros de 0 a 9.
Mudanas na tabela de cdigo ASCII ASCII Estendido Prof Angelina V.S.Melar 126
A ASCII inicialmente no atendia a representao do texto em portugus, no considerava o , , , , . Com o tempo, a tabela ASCII foi expandida at o nmero 255, considerando a combinao do 8 bits, essa tabela foi denominada ASCII Estendida. Mas ainda assim, ela no permite representar ao mesmo tempo os grafemas do sistema latino e de outros como o grego, hebraico. Em funo disso, foram criadas vrias tabelas ASCII, cada uma adaptada a uma ortografia especfica.
EBCDIC O cdigo EBCDIC (Extended Binary Coded Decimal Interchange Code- Cdigo BCD Ampliado para Intercmbio) foi criado pela IBM e utiliza 8 bit para fazer uma representao, existindo a possibilidade de fazer 256 combinaes diferentes. Unicode Existe o padro Unicode (www.unicode.org) que se prope a desenvolver um sistema abrangente e padronizado de representao de escrita em computadores. A tabela Unicode abrange os mais variados sistemas de escrita (latino, chins, etc), alm de considerar smbolos matemticos, musicais, de moeda, etc. Ela subdividida em blocos, como: Unicode Latim Bsico, Unicode Latim I Suplementar, Unicode Latim Estendido A, Unicode Latim Estendido B, Unicode Extenses IPA, Unicode Letras modificadoras de espaamento, Unicode Sinais diacrticos combinados A Unicode Latim Bsico equivale exatamente tabela ASCII de 7 bits. A Unicode Latim I Suplementar equivale a ASCII estendida, de 8 bits. Os blocos Extenses IPA, Letras Modificadoras de Espaamento e Sinais Diacrticos combinados so de especial interesse dos lingistas porque trazem a simbologia do Alfabeto Fontico Internacional. Unidade de Medida Ns temos na nossa vida diria as unidades de medidas metro, litro, hertz e no computador os bits. Como a contagem de medida do computador binria (base 2- 2 estados 0 e 1) e o nosso sistema mtrico de medida decimal tem-se: 210 1.024bytes KB Kilo K(mil) 20 2 1.048.576 bytes MB Mega M(milho) 230 1.073.741.824 bytes GB Giga G(bilho)
Hz (hertz)- 1 Hertz equivale a uma oscilao de sinal corrente- em 1 segundo. Ento GHz equivale a mudana do estado 0 e 1- mais de 1 bilho de vezes por segundo (pulsos). Convencionou a usar o digito 1 ( corrente eltrica alta) para a representar a voltagem de 1,2V e o digito 0 para a corrente eltrica baixa, de 0,2V.
Alguns enquadram as linguagens dentro das geraes. Nessas geraes existe a diferenciao do uso ou no, de caractersticas como: banco de dados, interface grfica, linguagem mais natural (inteligncia artificial). Exemplos de linguagens de alto nvel: Pascal, Delphi, Visual C#, Cobol.