Você está na página 1de 180

Lgica de Programao

Prof. Mrcio Soussa Centro Universitrio Jorge Amado

Referncias Bibliogrficas
FORBELLONE, Andr L.V., EBERSPACHER, H.F. Lgica de Programao A construo de Algoritmos e Estruturas de Dados. Pearson Brasil. MANZANO, Jos Augusto N.G., OLIVEIRA, Jair Figuereido de. Algoritmos Lgica para Desenvolvimento de Programao de Computadores. rica. So Paulo. SCHILDT, Herbert, C Completo e Total, Ed. Makron Books DEITEL H.M. P.J., C++ Como Programar Bookman 2001 Porto Alegre Obs.: Agradecimento ao Prof. Arleys pelo material cedido

O que Lgica ?

Exemplo Dia-a-Dia
Joo mais velho que Maria Maria mais velha que Carlos

Joo mais velho que Carlos

Exemplo Dia-a-Dia
Todo mamfero um animal Todo cachorro um mamfero

Todo cachorro um animal

Exemplo Dia-a-Dia
Seria possvel trocar uma lmpada dessa forma?

1. 2. 3. 4. 5. 6.

Pegar uma escada Posicionar a escada embaixo da lmpada Buscar uma lmpada nova Colocar a lmpada nova Retirar a lmpada velha Subir na escada

Definies Bsicas
a arte de pensar corretamente Ensina a usar corretamente o Pensamento

Coloca Ordem no Pensamento

Definies Bsicas
A cincia das leis ideais do pensamento e a arte de aplic-los demonstrao da verdade

Importncia
A lgica necessria para pessoas que desejam trabalhar com informtica (analistas, programadores, suporte) Ela permite definir a sequncia lgica para a soluo de um problema com eficincia e eficcia.

Importncia
Se aplica a qualquer linguagem de programao;

Agiliza a codificao da escrita e da programao;


Facilita a depurao da leitura do mesmo;

Permite a verificao de possveis falhas;


Facilita as alteraes e atualizaes dos programas.

Definies Bsicas
Lgica de Programao
a contextualizao da lgica na programao de computadores, buscando a melhor sequncia de aes para solucionar determinado problema. Essa sequncia de aes chamada de algoritmo

Algoritmo
Exemplo de um Algoritmo para trocar uma lmpada

1. 2. 3. 4. 5. 6.

Pegar uma escada Posicionar a escada embaixo da lmpada Buscar uma lmpada nova Subir na escada Retirar a lmpada velha Colocar a lmpada nova

Algoritmo
Outros Exemplos do dia-a-dia:

1. 2. 3. 4.

Manual de um aparelho eletrnico Tutorial de utilizao de um software Forma de clculo de uma hora extra Uma receita para o preparo de uma moqueca
Qual a sua receita?

5. Passos para realizar uma ligao telefnica

Descrio narrativa do Algoritmo


Exemplo: Receita de Bolo: 1. 2. 3. 4. 5. 6. 7. 8. Providencie manteiga, ovos, 2 Kg de massa, etc. Misture os ingredientes Despeje a mistura na frma de bolo Leve a frma ao forno Espere 20 minutos Retire a frma do forno Deixe esfriar Prove

Algoritmo
uma sequncia de passos que visa atingir um objetivo definido Um conjunto finito de regras que prov uma sequncia de operaes para resolver um tipo de problema especfico Sequncia ordenada, e no ambgua, de passos que levam soluo de um dado problema Processo de clculo, ou de resoluo de um grupo de problemas semelhantes, em que se estipulam, com generalidade e sem restries, as regras formais para a obteno do resultado ou da soluo do problema [AURLIO]

Algoritmo
Propriedades de um algoritmo:

Aes Simples e bem definidas (no ambguas)


Sequncia ordenada de aes

Sequncia finita de passos

Algoritmo
Deve ser composto por quatro passos fundamentais:
Escrever as instrues em sequncia ligadas entre si por apenas estruturas sequenciais; Escrever instrues em grupos pequenos e combinalas; Distribuir os mdulos do programa entre os diferentes programadores; Revisar o trabalho executado.

Representao
Descrio Narrativa:
Representaes textuais que expressam uma ordem do fluxo dos pensamentos a serem executados
1-Ler Salrio 2-Ler Horas Mensais 3-Ler tipo da H Extra 4-Ler quantidade de H. extras realizadas 5-Calcular o valor da hora extra 6-Informar o valor da hora extra calculada

Representao
Grfica:
Representaes grficas que expressam uma ordem do fluxo dos pensamentos a serem executados

Representao Grfica
Fluxograma
Geralmente usada por profissionais de anlise de sistema, bem como profissionais de Organizao e Mtodos.

Diagrama de Blocos
Ferramenta usada basicamente por profissionais que esto envolvidos diretamente com a programao.

Diagrama de Bloco

S N

Simbologia Bsica
Formas de representao grfica:
Terminal Seta de Fluxo Conectores Deciso

Processamento

Entrada manual de dados

Display

Entrada e Sada de dados

Princpios de Resoluo Problemas


Problema
uma proposta duvidosa, que pode ter numerosas solues.
Questo no resolvida e que objeto de discusso

Problema a ser resolvido


No final do ano de uma determinada escola, necessrio saber se o aluno foi aprovado ou no. O clculo da mdia realizado atravs de 4 notas bimestrais. O aluno considerado aprovado se tiver mdia maior ou igual a 7.

Tcnicas Bsicas de Programao


A Programao Estruturada pode ser entendida como uma forma de programar que visa facilitar a escrita, entendimento, validao e manuteno de programas. Para Dijkstra, a arte de programar consiste na arte de organizar e dominar a complexidade. Procura reduzir o nvel de complexidade em trs nveis:
a) desenvolvimento do programa em diferentes fases por refinamento sucessivo (desenvolvimento top-down); b) decomposio do programa total em mdulos funcionais, organizados de preferncia num sistema hierrquico; c) uso de um nmero limitado de estruturas bsicas de fluxo de controle dentro de cada mdulo.

Tcnicas Bsicas de Programao


Estruturada
N S

Tcnicas Bsicas de Programao

Um programa de computador composto por dos tipos bsicos de informaes: dados e instrues

Tcnicas Bsicas de Programao


Dados

So representados pelas informaes a serem tratadas (processadas) pelo computador. Caracteriza-se por trs tipos de dados:
Dados numricos Dados caracteres Dados lgicos

Tcnicas Bsicas de Programao


Tipos inteiros:
Nmeros inteiros, positivos ou negativos:
35, 0, -35 .....

Tipos Reais:
Abrangem inteiros, negativos, positivos e fracionrios:
35, 0, -35, 1.25, -45.1245547 ...... s

Tcnicas Bsicas de Programao


Tipos Caracteres:
Sequncia de textos e letras, vlida quando estiver entre () aspas:
oi.. Tudo bem, Telefone: 5555-4444 ....

Tipos Lgicos:

Assumem apenas dois valores:


Verdadeiro ou Falso. Podendo ser representado como:
Sim ou No True ou False .V. ou .F. Etc...

Tcnicas Bsicas de Programao


Uso de variveis:
Varivel: Tudo aquilo que sujeito a variaes, que incerto, instvel ou inconstante.

Uso de constantes:
tudo aquilo que fixo ou estvel;
O valor do PI = 3,14156

Tcnicas Bsicas de Programao

Tcnicas Bsicas de Programao


Expresses aritmticas ou frmulas matemticas
REA= PI. RAIO
2

REA = PI * RAIO^2

X = 43.

55 30+2

X = (43*(55/(30+2)))

Tcnicas Bsicas de Programao


Operadores matemticos Operadores + * / ^ % Operao Soma Subtrao Multiplicao Diviso Exponenciao Resto da Diviso

Tcnicas Bsicas de Programao


Operadores lgicos

Operadores = == != > < >= <=

Operao Atribuio Igualdade Diferena Maior Que Menor Que Maior e Igual Menor e Igual

Tcnicas Bsicas de Programao


Operadores de incremento
Operadores Operao ++ Incremento -Decremento

Tcnicas Bsicas de Programao


Instrues
So representadas pelo conjunto de palavraschave de uma linguagem de programao
Portugus estruturado (Portugol)
Inicio, fim, var, programa, enquanto, se, ento, para, escreva, leia, faa, repita e at que.

Tcnicas Bsicas de Programao


Regras bsicas:
Todo problema a ser resolvido ser previamente entendido, passado para uma descrio narrativa, para depois ser representado graficamente; Toda tarefa feita a uma instruo ser escrita em letra minscula em formato negrito. As instrues no sero indicadas dentro dos diagramas de blocos; Qualquer valor atribudo a uma varivel ser feito com smbolo = (igual) tanto no diagrama de blocos quanto em cdigo portugus estruturado.

Tcnicas Bsicas de Programao


Problema:
Ler dois valores, efetuar a soma e apresentar o resultado em tela.
Incio

Descrio narrativa:
1 Ler dois valores, no caso variveis A e B; 2 Efetuar a soma das variveis A e B, implicando o seu resultado na varivel SOMA; 3 Apresentar o valor da varivel SOMA aps a operao de soma dos dois valores fornecidos.

SOMA = A + B

SOMA

Fim

Tcnicas Bsicas de Programao


Portugus estruturado
programa SOMA_DOIS_NUMEROS var SOMA : inteiro A B incio leia A leia B SOMA = A + B escreva SOMA fim : inteiro : inteiro

Tcnicas Bsicas de Programao


Problema:
Ler dois valores, efetuar a soma e verificar se maior que 10. Se for, apresentar o resultado na tela.

Pede-se:
Descrio Narrativa Diagrama de Bloco Portugus Estruturado

Estrutura de Controle Tomada de Decises


Desvio condicional Simples.
Ajuda a tomada de decises Verifica uma condio. Se for verdadeira, sero executadas todas as instrues que estiverem entre a instruo Se ... Ento. Trabalharemos com uma instruo na codificao em portugus estruturado a seguir:
se ... ento ... fim_se

Estrutura de Controle Tomada de Decises


So utilizadas as letras S e N no diagrama de tomada de deciso.
N

Condio

O S representa Sim conseqentemente a proposio Verdadeira e o N representa o No. Alm das linhas com setas indicando a direo do processamento.

Condio Verdadeira

Condio Falsa

Estrutura de Controle Tomada de Decises


Portugus estruturado
se ( <condio> ) ento
<instrues para a condio verdadeira> fim_se <instrues para a condio falsa>

Estrutura de Controle Tomada de Decises


Problema:
Ler dois valores numricos, efetuar a adio e apresentar o seu resultado caso o valor somado seja maior que 10.
Descrio Narrativa:
1 Ler dois valores respectivamente nas variveis A eB 2 efetuar a soma dos valores das variveis A e B implicando o valor da soma na varivel X 3 Verificar se o valor de X maior que 10 3.1 Se valor de X for maior que 10, apresentar o valor de X em tela.
Incio A, B X=A+B
N

X > 10

Fim

Estrutura de Controle Tomada de Decises


Portugus estruturado
programa SOMA_NUMEROS var X : inteiro A : inteiro

B : inteiro
incio leia A, B X = A + B

se ( X > 10 ) ento
escreva X fim_se fim

Tcnicas Bsicas de Programao


Problema:
Ler dois valores numricos, efetuar a adio e caso o valor somado seja menor ou igual a 10 apresentar o resultado somando-se 5 e se o resultado for maior que 10, apresentar o resultado subtrado 7.

Pede-se:
Descrio Narrativa Diagrama de Bloco Portugus Estruturado

Estrutura de Controle Tomada de Decises


Desvio condicional Composto.
Ajuda a tomada de decises Verifica uma condio. Se for verdadeira, sero executadas todas as instrues que estiverem entre a instruo Se ... Ento. Se for falsa, sero executadas todas as instrues que estiverem entre seno... Fim_se Trabalharemos com uma instruo na codificao em portugus estruturado a seguir:
se ... ento ... fim_se

Estrutura de Controle Tomada de Decises


Diagrama de Bloco.

Condio

Condio Falsa

Condio Verdadeira

Estrutura de Controle Tomada de Decises


Portugus Estruturado
se ( <condio> ) ento <instrues para a condio verdadeira> seno

<instrues para a condio falsa>


Fim_se

Estrutura de Controle Tomada de Decises


Problema:
Reajuste salarial, obter o salrio e calcular o reajuste do salrio sendo:
Salrio < que 500, reajuste ser de 15%; Salrio >= a 500 mais <= 1000, reajuste ser de 10%; Salrio > 1000, reajuste ser de 5%.

Pede-se:
Algoritmo Diagrama de Bloco Portugus Estruturado

Estrutura de Controle Tomada de Decises


Desvio condicional Encadeado.
Quando necessrio se estabelecer verificaes de condies sucessivas, para determinada ao, e que ocorra em um conjunto anterior de instrues ou condies para que se estabelea satisfatria a proposio.

53

Estrutura de Controle Tomada de Decises


Diagrama de blocos
N

Condio 1

Condio 2

Instruo executada quando a Condio 1 Verdadeira

Instruo executada quando a Condio 1 for Falsa e a Condio 2 Falsa

Instruo executada quando a Condio 1 for Falsa e a Condio 2 Verdadeira

54

Estrutura de Controle Tomada de Decises


Portugus estruturado
se ( <condio 1> ) ento <instrues para a condio 1 verdadeira>

seno
se ( <condio 2> ) ento
<instrues para a condio 1 falsa e condio 2 verdadeira>

seno
<instrues para a condio 1 falsa e condio 2 falsa>

fim_se fim_se

55

Reajuste salarial, obter o salrio e calcular o reajuste do salrio sendo:


Salrio < que 500, reajuste ser de 15%; Salrio >= a 500 mais <= 1000, reajuste ser de 10%; Salrio > 1000, reajuste ser de 5%.

Estrutura de Controle Tomada de Decises

Descrio Narrativa
1 Definir uma varivel para o salrio reajustado como NOVO_SALARIO; 2 Ler um valor para a varivel SALARIO; 3 Verificar se o valor de SALARIO < 500, se sim reajustar em 15%; 4 Verificar se o valor de SALARIO <= 1000, se sim reajustar em 10% 5 Verificar se o valor de SALARIO > 1000, se sim reajustar em 5%; 6 Apresentar o valor reajustado implicando na varivel NOVO_SALARIO.

56

Estrutura de Controle Tomada de Decises


Diagrama de blocos
N SALARIO < 500

Incio SALARIO
S

N SALARIO <= 1000

NOVO_SALARIO = SALARIO * 1.15 NOVO_SALARIO = SALARIO * 1.05 NOVO_SALARIO = SALARIO * 1.10

NOVO_SALARIO

Fim

57

Estrutura de Controle Tomada de Decises


Operador Lgico (para tabela verdade)
Pode ser que necessitemos utilizar em algum momento, com o relacionamento de duas ou mais condies ao mesmo tempo na mesma condio SE.
Neste caso aplicaremos os seguintes operadores lgicos.
.e. (and, &&) .ou. (or, ||) .no. (not, !)

Em portugus estruturados est sempre entre os pontos (.).

58

Estrutura de Controle Tomada de Decises


Operador Lgico .e. (and, &&) CONDIO 1 CONDIO 1 RESULTADO
Falso Verdade Falso Falso Falso Verdade Falso Falso Falso

Verdade

Verdade

Verdade

59

Estrutura de Controle Tomada de Decises


Operador Lgico .e. (and, &&)
Diagrama de Blocos
N

Condio 1 .e. Condio 2

Instruo executada se ambas as condies forem verdadeiras

60

Estrutura de Controle Tomada de Decises


Operador Lgico .e. (and, &&)
Portugus estruturado
se ( <condio1> ) .e. ( <condio2> ) ento
<Instruo executada se ambas as condies forem verdadeiras>

fim_se

61

Tcnicas Bsicas de Programao


Operador Lgico .ou. (or, ||)

CONDIO 1 CONDIO 1 RESULTADO


Falso Verdade
Falso Verdade

Falso Falso
Verdade Verdade

Falso Verdade
Verdade Verdade

62

Estrutura de Controle Tomada de Decises


Operador Lgico .ou. (or, ||)
Diagrama de Blocos
N

Condio 1 .ou. Condio 2

Instruo executada se pelo menos uma das condio for verdadeira

63

Estrutura de Controle Tomada de Decises


Operador Lgico .ou. (or, ||)
Portugus estruturado
se ( <condio1> ) .ou. ( <condio2> ) ento
<Instruo executada se pelo menos uma condio for verdadeiras>

fim_se

64

Estrutura de Controle Tomada de Decises


Operador Lgico .no. (not, !) CONDIO 1 RESULTADO
Falso Verdade Verdade Falso

65

Estrutura de Controle Tomada de Decises


Operador Lgico .no. (not, !)
Diagrama de Blocos
N

.no. Condio

Instruo executada se condio for falsa

66

Estrutura de Controle Tomada de Decises


Operador Lgico .no. (not, !)
Portugus estruturado
se .no. ( <condio> ) ento <Instruo executada se a condio for falsa> fim_se

67

Exerccio:

Estrutura de Controle Tomada de Decises

O ndice de Massa Corporal (IMC) uma frmula que indica se um adulto est acima do peso, se est obeso ou abaixo do peso ideal considerado saudvel. A frmula para calcular o ndice de Massa Corporal : IMC = peso / (altura)2. Desenvolva a descrio narrativa, Diagrama de blocos e codificao em portugus estruturado, para o seguinte problema:
Ler dois valores, peso e altura em seguida calcular o ndice de massa corporal (IMC) e apresentar em tela se a pessoa est abaixo do peso, no peso normal, acima do peso ou obeso obedecendo a tabela da Organizao Mundial de Sade.
Condio IMC em adultos Abaixo do peso
Tabela da Organizao Mundial de Sade

Abaixo de 18.5 Entre 18.6 e 25 Entre 25.1 e 30 Acima de 30

No peso normal Acima do peso Obeso

68

Estrutura de Controle de Laos


Desenvolva um programa que leia cinco vezes um determinado valor e que este valor seja multiplicado por trs e apresentado o resultado em tela. Como solucionar este problema ?

69

Estrutura de Controle de Laos


Repetio do tipo: Teste lgico no incio do Looping.
Caracteriza-se por uma estrutura que efetua um teste lgico no incio do looping, verificando se permitido executar o trecho de instrues subordinado ao looping.
A estrutura e denominada de enquanto.
enquanto ... faa .... fim_enquanto

70

Estrutura de Controle de Laos


Diagrama de blocos
Condio
S N

Instruo executada Enquanto a condio verdadeira

71

Estrutura de Controle de Laos


Portugus estruturado
enquanto ( <condio> ) faa <Instruo para condio verdadeira> fim_enquanto

72

Estrutura de Controle de Laos


Resolvendo o nosso problema anterior:
Descrio narrativa:
1 Criar uma varivel para servir como contador com o valor inicial igual a um; 2 Enquanto o valor do contador for menor ou igual a 5, processar os passos 3, 4 e 5; 3 Ler um valor para a varivel X; 4 Efetuar a multiplicao da varivel X por 3 implicando na varivel R; 5 Apresentar o valor calculado contido na varivel R; 6 Quando o contador for maior que 5, encerrar o processamento.

73

Estrutura de Controle de Laos


Diagrama de blocos
Incio Cont = 1

Cont <= 1
S

R=X*3

R Cont ++

Cont = Cont + 1

Incio

74

Estrutura de Controle de Laos


Portugus estruturado
programa LOOPING_1A var X, R, CONT : inteiro incio

CONT = 1
enquanto ( CONT < = 5 ) faa leia X R = X * 3 escreva R CONT = CONT + 1 CONT ++ fim_enquanto /// ou

75

Estrutura de Controle de Laos


Exerccio:
Desenvolva um programa que leia cinco vezes um determinado valor e que este valor seja multiplicado por trs e apresentado o resultado em tela.
Alterar o problema sendo que s sair do looping quando o usurio queira, efetuando uma pergunta em tela se deseja continuar ?

76

Estrutura de Controle de Laos


Repetio do tipo: Teste lgico no fim do Looping.
Caracteriza-se por uma estrutura que efetua um teste lgico no fim do looping
A estrutura e denominada de repita.
repita ... at_que

77

Estrutura de Controle de Laos


Resolvendo o nosso problema anterior:
Descrio narrativa:
1 Criar uma varivel contador; 2 Ler um valor para a varivel X; 3 Efetuar a multiplicao da varivel X por 3 implicando na varivel R; 4 Apresentar o valor calculado contido na varivel R; 5 Acrescentar um ao contador; 6 Repetir os passos 2, 3, 4 e 5 at que o contador seja maior que 5.

78

Estrutura de Controle de Laos


Diagrama de blocos
Incio Cont = 1

X R=X*3 R

Cont ++

Cont = Cont + 1

Cont > 5
S

Fim

79

Estrutura de Controle de Laos


Portugus estruturado
programa LOOPING_2A var X, R, CONT : inteiro incio CONT = 1

repita
leia X R = X * 3 escreva R CONT = CONT + 1 CONT ++ at_que ( CONT > 5 ) /// ou

80

Estrutura de Controle de Laos


Repetio do Tipo: Varivel de controle.
Possibilita o uso de contadores finitos, sem o uso das condies anteriores. Os loopings que possuem um nmero finito de execuo podero ser executados atravs de estrutura de laos contados para, sendo conseguida com a utilizao do conjunto de instrues:
para ... de ... at ... faa ... fim_para

81

Estrutura de Controle de Laos


Diagrama de blocos

Varivel = Incio, Fim, Incremento

Instrues

82

Estrutura de Controle de Laos


Portugus estruturado
para <varivel> de <incio> at <fim> passo <incremento>

<Instrues>
fim_para

83

Estrutura de Controle de Laos


Exemplo:
Pedir a leitura de um valor para a varivel X, multiplicar este valor por 3 implicando-o varivel de resposta R e apresentar o valor obtido, repetindo esta seqncia por cinco vezes.

84

Estrutura de Controle de Laos


Descrio narrativa:
1 Definir um contador variando de 1 a 5; 2 Ler um valor para a varivel X; 3 Efetuar a multiplicao do valor de X por 3, implicando o resultado na varivel R; 4 Apresentar o valor calculado contido na varivel R; 5 Repetir os passos 2, 3, 4 e 5 at que o contador seja encerrado.

85

Estrutura de Controle de Laos


Diagrama de blocos
Incio Cont = 1, 5, 1

R=X*3

Fim

86

Estrutura de Controle de Laos


Portugus estruturado
programa LOOPING_2A var X, R, CONT : inteiro incio para CONT de 1 at 5 passo 1

leia X
R = X * 3 escreva R fim_para

87

Exerccio
Aps desenvolver um algoritmo ele dever sempre ser testado. Este teste chamado de TESTE DE MESA, que significa, seguir as instrues do algoritmo de maneira precisa para verificar se o procedimento utilizado est correto ou no.

88

Exerccio
programa LOOPING_2A var X, R, CONT : inteiro incio para CONT de 1 at 5 passo 1 leia X R = X * 3 escreva R fim_para fim
Passo CONT

X 3 2 1 9 4

R 3 * 3 = 9 2 * 3 = 6 1 * 3 = 3 9 * 3 = 27 4 * 3 = 12

1 2 3 4 5

1 2 3 4 5

Introduo a C
A linguagem C foi criada na dcada de 70 por Dennis M. Ritchie a partir de uma outra linguagem: o B, criada por Ken Thompson. O B, por sua vez, veio da linguagem BCPL, inventada por Martin Richards. A linguagem C tornou-se muito importante e popular por possuir tanto caractersticas de alto nvel quanto de baixo nvel sendo considerada uma linguagem de programao de nvel mdio . Outra caracterstica muito importante ser portvel, isto , poder ser usada em vrias mquinas de portes e sistemas operacionais diferentes. Alto nvel : comandos com sintaxe prxima a linguagem humana e tipos de dados inteiro, real, caracter e string. Exemplo de linguagens de alto nvel: Pacal, Delphi, Basic, Visual Basic, Clipper, etc. Baixo nvel: manipulao de bits, bytes e endereos. Exemplo: Assembler. Nvel mdio: combina elementos das linguagens de alto nvel com a funcionalidade das de baixo nvel. Exemplo: Linguagem C.

Estrutura bsica de um programa em C


Um programa em C consiste em uma ou mais funes, sendo que a nica funo que necessariamente precisa estar presente a denominada main() (principal), que a primeira funo a ser executada quando o programa se inicia. As outras funes podem proceder ou suceder a funo main().

Estrutura bsica de um programa em C


main(){ // corpo da funo bloco de comandos } Os parnteses aps a palavra main(), indica que uma funo. O nome das demais funes desenvolvidas em C, pode ser qualquer um, menos main.

Estrutura bsica de um programa em C


A linguagem C Case Sensitive, isto , maisculas e minsculas fazem diferena. Se for declarada uma varivel com o nome soma ela ser diferente de Soma, SOMA, SoMa ou sOmA. Da mesma forma que os comandos em C devem ser sempre escritos com letras minsculas.

Estrutura bsica de um programa em C


Os comentrios e as observaes do programa podem aparecer em qualquer lugar desde que colocados entre os delimitadores /* comentrio */ ou // comentrio.

Em C as instrues so sempre encerradas por ; .

Estrutura bsica de um programa em C


Tipos Bsicos de dados

Tipo char int float double void

Bit 8 16 32 64 0

Byte 1 2 4 8 0

Escala -128 a 127 -32768 a 32767 3.4E-38 a 3.4E+38 1.7E-308 a 1.7E+308 sem valor

Estrutura bsica de um programa em C


Modificadores de tipo
Exceto o void, os tipos de dados bsicos podem ter vrios modificadores precedendo-os. Um modificador usado para alterar o significado de um tipo bsico para adapt-lo mais precisamente s necessidades de diversas situaes: signed (com sinal) unsigned (sem sinal) long (mxima preciso) short (menor preciso)

Estrutura bsica de um programa em C


Modificadores de tipo
TIPO Char Unsigned char Signed char Int Unsigned int Signed int Short int Unsigned short int Signed short int Long int Signed long int Unsigned long int Float Double Long double 1 1 1 2 2 2 2 1 1 4 4 4 4 8 16 TAM.(bytes) ESCALA -127 a 127 0 a 255 -127 a 127 -32767 a 32767 0 a 65535 -32767 a 32767 -32767 a 32767 0 a 65535 -32767 a 32767 -2147483647 a 2147483647 -4294967295 a 4294967295 0 a 4294967295 3.4 *(10-38) a 3.4 * (10+38) 1.7*(10-308) a 1.7*(10+308) 3.4*(10-4983) a 3.4*(10+4983)

Estrutura bsica de um programa em C


IDENTIFICADORES
So usados para dar nomes s variveis, constantes, tipos e ou funes. Para a criao desses identificadores dever ser consideradas as informaes a seguir:
Podem ser formados por letras, nmeros ou sublinhado(_); Tem que comear por letra ou sublinhado; Letras maisculas e minsculas so caracteres distintos; No podem ser palavras reservadas;

Podem conter qualquer tamanho porm somente os 31primeiros caracteres so significativos.

Estrutura bsica de um programa em C


VARIVEL
uma posio de memria com um nome, que usada para armazenar uma informao de um tipo especfico que pode ser modificada pelo programa. Forma Geral : tipo lista_de variveis; Exemplo: int a,b,d; float x,y; unsigened int w;

Estrutura bsica de um programa em C

Inicializao de variveis:
As variveis podem ser inicializadas no mesmo momento em que elas so declaradas, colocando um sinal de igual e a informao desejada.
Exemplo: char op=S;
simples */ /* as informaes do tipo caracter so envolvidas por aspas

int primeiro=0; char mensagem[20]=Bom Dia !!;


envolvidas por aspas */

/* as

strings so

Estrutura bsica de um programa em C


MODIFICADORES DE TIPO DE ACESSO Constantes : No podem ser modificadas pelo programa. Forma Geral: const tipo identificador; Exemplo: const int max=10; const float taxa1=0.7,taxa2=0.5;

Bibliotecas de funes .h
Existem bibliotecas com funes que auxiliam a manipulao dos comando de entrada e saia e tambm de manipulao de telas.

Elas so descritas no incio do programa C:


#include <nome_da_biblioteca.h>

Bibliotecas de funes .h
FUNES DE TELA
Biblioteca <conio.h>

#include <conio.h> Nela encontramos as seguintes funes mais usadas:


clrscr() - limpar a tela; Linux : printf("\033[2J"); clreol() - limpa a linha; gotoxy(coluna,linha) - posiciona o cursor; window(coluna incial,linha inicial,coluna final, linha final) cria uma janela na tela; textcolor(cor) - seleciona a cor dos caracteres de texto; textbackground(cor) seleciona a cor do fundo da tela;

Bibliotecas de funes .h
TABELA DE CORES:
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 PRETO AZUL VERDE CIANO VERMELHA MAGENTA MARROM CINZA CLARO CINZA ESCURO AZUL CLARO VERDE CLARO CIANO CLARO ALARANJADO MAGENTA CLARO AMARELO BRANCO

Bibliotecas de funes .h
FUNES DE ENTRADA E SADA DE DADOS
Biblioteca <stdio.h>

#include <stdio.h>
getchar() - entrada de um caracter individual; getch() - entrada de um caracter. O caracter no exibido na tela no necessrio teclar <enter>; getche() - entrada de um caracter. O caracter exibido na tela no necessrio teclar <enter>; putchar - exibe um caracter na tela; gets() - entrada de string; puts() - sada de string; scanf() - entrada de dados formatada com string de controle de acordo com o tipo da varivel; printf() - sada de dados formatada com string de controle de acordo com o tipo da varivel; cprintf() - sada de dados formatada colorida com string de controle de acordo com o tipo da varivel;

Estrutura bsica de um programa em C


CONSTANTES BARRA INVERTIDA
So utilizadas para controlar a exibio de dados na tela e na impressora.
CDIGO \n \b \t \v \a \ \\ \f \r \0 SIGNIFICADO nova linha (line feed) retrocesso (backspace) tabulao horizontal tabulao vertical alerta(beep) para exibir aspas para exibir barra invertida salto de folha (form fee) retorna ao incio da linha (return) nulo

Estrutura bsica de um programa em C


COMANDOS DE FORMATO
So constantes que definem o tipo e o formato dos dados a serem exibidos.
Comando %c %d %i %f %s %e %o %x %l %lf %u Formato caracter inteiros decimais com sinal inteiros decimais com sinal decimais com ponto flutuante string notao cientfica octal hexadecimal inteiro longo double decimal sem sinal

Utilizao das funes C.


A funo printf( )
A funo printf serve para exibir uma informao no vdeo ou na impressora e possui a seguinte estrutura.
Forma Geral: printf(expresso de controle, lista de argumentos);

Exemplo1: int i=4; float j=5.5; printf(%d\n, i); printf(Este numero e inteiro: %d e este e real: %f, i , j); Resultado: 4 Este nmero inteiro: 4 e este real: 5.5

Utilizao das funes C.


A Funo scanf()
A funo scanf() outra das funes de E/S implementadas em todos os compiladores C. Ela o complemento de printf() e nos permite ler dados formatados da entrada padro (teclado).
Forma Geral: scanf(expresso de controle, lista de argumentos)

Utilizao das funes C.


A lista de argumentos deve consistir nos endereos das variveis. C oferece um operador para tipos bsicos chamado operador de endereo e referenciado pelo smbolo & que retorna o endereo do operando. Na funo scanf() cada nome de varivel deve ser precedida por um ampersand(&) ou Ecomercial. Somente strings no devem conter & na frente.

Utilizao das funes C.


Exemplo1: O programa a seguir exibe a idade em dias de uma pessoa.
#include <stdio.h>

#include <conio.h> void main() { int anos, dias; printf(Digite sua idade em anos: ); scanf(%d,&anos); dias = anos*365; printf(Sua idade em dias %.d\n,dias); getchar(); } Resultado:
Digite sua idade em anos: 4 Sua idade em dias 1460

Utilizao das funes C.


Exerccio:
Calcula a mdia aritmtica de duas notas de um aluno.
#include <stdio.h> #include <conio.h> void main() { float media,nota1,nota2; clrscr(); printf(\t Digite a 1 nota: ); scanf(%f",&nota1); printf("\t Digite a 2 nota: "); scanf("%f",&nota2); media=(nota1 + nota2)/2; printf(\t A mdia : %5.2f, media); getch(); }

Comandos em C
112

Comandos de Seleo
if (x>9) y=100; else y=200;

if((x == 2) && (x!=1)){ a=10; b=20; c=30; } else a=b=c=0;

if ((x == 2) && (x!=1)) { a=10; b=20; c=30; } else { a=1; b=c=0; }

Comandos em C
113

Comando de Seleo Mltipla


char ch; switch (ch){ case 1 : printf(Incluso); break; case 2 : printf(Consulta); break; default : printf(Fim); }

int num,a,b; switch (num) { case 1,2 : a=2*2; b=-1; break; case 3,4,5 : a=2*3; b=0; break; }

Comandos em C
114

Comandos de Repetio while - do


while (ch!=A){ c=a+b; printf(%d,c); scanf(%c,&ch); }
do{ a++ printf(%d,a); } while (a<100); while ((a>0) || (b>0)){ c+=b; --a; --b; }

do{ scanf(%f,&a); scanf(%d,&b); } while ((a<=0) || (b<=0));

Comandos em C
115

Comandos de Repetio - for


for ( x=1;x<=100;x++ ) printf(%d,x); for (x=0,y=0;x<10;x++,y--) printf(%d %d,x,y);

for (x=100;x!=65;x-=5) { z = x*x; printf(O quadrado de %d }

%d,x,z);

for(x=0; ;x++) { printf(%d,x); if (x==10) break; }

Estrutura de Dados Matriz ou Vetor


116

Matrizes ou vetores (Tabelas em memria) so do tipo de dados que podem ser Construdos medida que se fazem necessrio. Ilustrao de uma matriz ou vetor (1x5)

notas[4]
5 3

ou
4

notas[1..4]
87 9

Significa dizer que a varivel notas na posio 0 ou 1 (a depender qual sintaxe utilize) valer 5 notas[0] = 5 , notas[1] = 3 ......... notas[4] = 9

Estrutura de Dados Matriz ou Vetor


117

Diagrama de blocos de uma matriz / vetor


Somar um vetor chamado MD[1..8]
MD[1] = 4.5 MD[2] = 6.5 MD[3] = 8.0 MD[4] = 3.5 MD[5] = 6.0 MD[6] = 7.0 MD[7] = 6.5 MD[8] = 6.0
Mdia SOMA = SOMA + MD[i] MD[i] Incio SOMA = 0

i = 1, 8, 1

Mdia =SOMA/8

Fim

Estrutura de Dados Matriz ou Vetor


118

Portugus estruturado
programa Mdia var MD : conjunto[1..8] de real SOMA, Mdia : real i : inteiro incio SOMA = 0 para i de 1 at 8 passo 1 leia MD[i] SOMA = SOMA + MD[i] fim_para Mdia = SOMA/8 escreva Mdia fim

Estrutura de Dados Matriz ou Vetor


119

STRING
Em linguagem C no existe o tipo string. A utilizao desse tipo de varivel se d atravs da utilizao de um cadeia de caracteres, isto um vetor de caracteres terminados por um nulo (\0). Para implementar esse tipo de dado deve-se ter sempre um caracter a mais para armazenar o terminador nulo Para declarar um tipo string: char nome[11];

0 P

1 a

2 u

3 l

4 o

5 6 \0

10

Estrutura de Dados Matriz ou Vetor


120

Para manipular as informaes armazenadas em uma string podemos utilizar as funes string ou utilizamos as funes caracter , j que uma string um vetor de caracteres.
arquivo de cabealho para funes de string <string.h>
arquivo de cabealho para funes caracter <ctype.h>

Estrutura de Dados Matriz ou Vetor


121

Algumas Funes de Manipulao de Strings usando a biblioteca <string.h>


Funo Descrio Forma Geral

strcpy()
strcmp() strcat() strlen() strchr() strstr()

copia uma string em outra.


compara duas strings. junta o contedo de duas strings. fornece o tamanho de uma string. verifica se um pertence a string. caracter

strcpy (s1,s2);

// copia o contedo de s2 em s1 e termina com nulo.

x=strcmp(s1,s2); strcat(s1,s2); x=strlen(s1);

// x==0 se as strings forem iguais ou x!=0 se forem diferentes. // s1 ir conter o resultado da juno das 2 strings. // x vai conter o nmero de caracteres ocupados na string .

x=strschr(s1,ch); x=strstr(s1,s2);

// x !=0 se existir o caracter ou x==0 se no existir. // x !=0 se s2 existir em s1 ou x==0 se no existir.

verifica se uma string existe dentro da outra string.

Estrutura de Dados Matriz ou Vetor


122

Algumas Funes de Manipulao de caracter usando a biblioteca <ctype.h>


Funo isdigit() Descrio verifica se o caracter um nmero de 0-9. Forma Geral isdigit(a);
nmero. // !=0 nmero; =0 no

isalpha()
isupper() ispunct() isspace() toupper()

tolower()

verifica se o caracter uma letra verifica se um caracter est em maiscula verifica se um caracter pontuao. verifica se um caracter espao. transforma um caracter em letra maiscula. transforma um caracter em letra minscula.

isalpha(a);
letra.

// !=0 letra; =0 no

isupper(a);
.

// !=0 maiscula =0 no

ispunct(a);
.

// !=0 pontuao; =0 no

isspace(a); // !=0 espao; =0 no . a=toupper(a);


em maiscula. // o contedo de a

a=tolower(a);
minscula.

// o contedo de a em

Estrutura de Dados Matriz ou Vetor


123

Uma matriz um tipo de dado usado para representar uma certa quantidade de variveis de valores homogneos. Imagine o seguinte problema: ler a mdia final de 5 alunos e calcular a media geral. Voc poderia declarar:

Estrutura de Dados Matriz ou Vetor


124

void main() { float notas[7],media=0; int i; for (i=0; i<7; i++) { pritf(Digite a nota do aluno %d: ,i); scanf(%f, &notas[i]); media+=notas[i]; } media=media/8; printf(A mdia Geral= %5.2f,media); }

Exemplos usando Matriz ou Vetor


#include <stdio.h> #include <conio.h> #include <ctype.h> void main(){ char nome[20],op='S'; float va,rl; do { clrscr(); printf("\t\tAPLICACOES\n"); printf("\t Nome.....: "); gets(nome); printf("\t Valor....: "); scanf("%f",&va); if (va<=10000.00) rl=va*0.014-0.002*va; else rl=va*0.018-0.002*va; printf("\t Rendimento .. : %8.2f\n\n",rl); printf("Deseja Continuar %s <s/n > ? ",nome); do { gotoxy(50,6); clreol(); scanf("%c",&op); op=toupper(op); } while ((op!='S') && (op!='N')); getchar(); } while (op=='S'); }
125

Exemplos usando Matriz ou Vetor


126

Matriz multidimensional:
#include <stdio.h> #include <conio.h> void main(){ int j,i,num[4][4]; clrscr(); for(j=0;j<4;++j){ for(i=0;i<4;++i){ num[j][i] = (j*4)+i+1; printf("%2.0d ",num[j][i]); } printf("\n"); } getchar(); }

Resultado:
j/i

0
1 5 9 13

1
2 6 10 14

2
3 7 11 15

3
4 8 12 16

0 1 2 3

Agora efetue a soma da Diagonal principal da Matriz e apresente na tela.

Funo
127

Funo um seguimento independente do programa que executa uma tarefa especfica. Todo o programa em C formado por uma ou mais funes.

Funo
128

Forma Geral:
tipo nomeDaFuno (lista de parmetros){ corpo da funo; }

Toda funo dever ter seu prottipo declarado no incio do programa, ou em um arquivo de cabealho .h

Funo
129

Em C podemos ter dois tipos de parmetros: passagem de parmetros por valor e passagem de parmetros por referncia. Na passagem de parmetros por valor as informaes dos parmetros so copiadas para a funo receptora. As alteraes nesses parmetros no tem nenhum efeito na funo de origem da informao. Na passagem de parmetros por referncia, enviado o endereo do parmetro para a funo receptora, dessa forma o endereo usado para acessar as informaes originais. Isto significa que qualquer alterao efetuada no parmetro estar modificando o contedo original da informao enviada.

Funo Passagem por Valor e Referncia


130

#include <stdio.h> #include <conio.h> void calculo (int *a,int *b); float sqr (float num); void main(){ int num1=100,num2=200; float num,sq; calculo (&num1,&num2); printf("\n Os valore atuais de num1= %d e num2 = %d",num1,num2); printf ("\n\n\nEntre com um numero: "); scanf ("%f",&num); sq=sqr(num); printf ("\n\nO numero original e: %f\n",num); printf ("O seu quadrado vale: %f\n",sq); } void calculo (int *a, int *b){ *a = *a * 2; *b = *b - 50; } float sqr (float num){ num=num*num; return num; }

Por referncia

Por Valor

Observe os resultados.

Ponteiros

131

Um ponteiro proporciona um modo de acesso a variveis sem referenci-las diretamente. O mecanismo usado para isto o endereo da varivel. Um ponteiro uma varivel que contm um endereo de memria. Esse endereo normalmente a posio de uma outra varivel na memria. Se uma varivel contm o endereo de uma outra, ento diz-se que a 1 varivel aponta para a segunda.

Ponteiros
132

Ponteiro a

30

Varivel X

Ponteiro a aponta para o endereo da varivel X

Operadores Associados a Ponteiros

& - operador unrio que devolve o endereo da memria do seu operando; * - operador unrio que devolve o contedo da varivel localizada no endereo de memria do seu operando, que uma varivel ponteiro. Ponteiros tambm tem tipos. Quando declaramos um ponteiro ns informamos ao compilador para que tipo de varivel o ponteiro est apontando.

Forma Geral : tipo *identificador;

Ponteiros
133

Exemplo: int *px,*py; Para atribuir valores as variveis ponteiro e para acessar as informaes usamos: *px=3; *py=5; Na declarao, o smbolo * indica o tipo apontado (o ponteiro) em outras situaes indica o contedo da varivel apontada. O ponteiro deve ser inicializado (apontado para algum lugar conhecido) antes de ser usado. Ponteiros so sempre inicializados com o valor 0 ou NULL ento antes de us-los devemos atribuir algum endereo vlido a eles.

Ponteiros
134

#include <stdio.h> #include <conio.h> void main(){ int x=5,y=6; int *px,*py; px=&x; py=&y; printf(px=%p, printf(py=%p, } *px=%d, *py=%d, &px=%p\n, px,*px,&px); &py=%p\n, py,*py,&py);

O resultado ser: px=65488, *px=5, &px=65492 py=65490, *py=6, &py=65494 OBS: O formato %p no printf indica que vai ser exibido um endereo.

Ponteiros
135

Y 6 Onde: px => retorna o endereo para o qual o ponteiro aponta; &px => retorna o endereo do ponteiro; *px => retorna o contedo da varivel apontada.

65488
pX 65488

65490
pY 65490

65492

65494

Ponteiros
136

Podemos fazer algumas operaes aritmticas com ponteiros. A primeira, e mais simples, a de igualar dois ponteiros p1=p2, assim p1 aponta para o mesmo lugar que p2. Se quisermos que a varivel apontada por p1 tenha o mesmo contedo da varivel apontada por p2 devemos fazer *p1=*p2. Outras operaes com ponteiros tambm bastante usadas so o incremento e o decremento. Quando incrementamos um ponteiro ele passa a apontar para o prximo valor do mesmo tipo para o qual o ponteiro aponta (avana um nmero de bytes na memria) como por exemplo: int *p; p++; // avana dois bytes na memria p--; // decrementa dois bytes na memria Para incrementar o contedo da varivel apontada pelo ponteiro p temos: *p++; Outras operaes podem ser efetuadas com ponteiros como a adio e subtrao de inteiros com ponteiros, bem como os operadores de (== , !=, >, <, >=,<=). Exemplos: p=p+15; // desloca o ponteiro 15 posies; *(p+15); // utiliza o contedo do ponteiro 15 posies adiante; p1>p2; // compara qual dos dois ponteiros est mais adiante na memria. Existem operaes que no podem ser efetuadas com ponteiros, como por exemplo dividir ou multiplicar ponteiros

Ponteiros
137

#include <stdio.h> void main(){ int num,valor; int *p; num=70; p=&num; // recebe o endereo de num valor=*p; // valor recebe o mesmo contedo de num printf(\n\n %d \n,valor); printf(Endereo para onde o ponteiro aponta: %p \n,p); printf(Valor da varivel apontada: %d \n,*p); *p=100; // modifica o contedo da varivel num indiretamente printf(Valor da varivel modificada %d \n,*p); }

Ponteiros e Matrizes
138

Uma das aplicaes mais importantes com ponteiros e a varredura seqencial de uma matriz, isto , quando temos que percorrer todos os elementos de uma matriz de uma forma seqencial, podemos usar um ponteiro incrementando-o at o final da matriz.

Ponteiros e Matrizes
139

Em uma matriz o prprio nome da matriz o endereo do primeiro elemento da matriz. Se x uma matriz unidimensional, ento, o endereo do primeiro elemento da matriz pode ser expresso &x[0] ou simplesmente x. Alm disso o endereo do segundo elemento da matriz pode ser expresso por &x[1] ou (x + 1), e assim por diante at o ensimo elemento da matriz &x[ i ] ou (x + i) .
Podemos ento ter 2 modos diferentes de acessar os elementos de uma matriz

Ponteiros e Matrizes
140

Na expresso (x + i) x representa o endereo e i representa uma quantidade inteira que significa i elementos depois do primeiro (deslocamento). Como &x[ i ] e (x + i) representam o endereo do insimo elemento de x, x[ i ] e *(x + i) representam o contedo desse endereo.

Ponteiros e Matrizes
141

Exemplo:
#include <stdio.h> #include <conio.h> void main(){ int x[10], i; clrscr(); for (i=0;i<=9;i++){ scanf(%d,&x[i]); printf(\n i= %d x[i]= %d %p,i , x[i], *(x+i), &x[i], x+i); } getchar(); }

*(x+i) = %d &x[i] = %p

x+1 =

i=0 i=1 i=2 i=3 i=4

x[ i ]= 10 x[ i ]= 11 x[ i ]= 12 x[ i ]= 13 x[ i ]= 14

*(x+i) = 10 *(x+i) = 11 *(x+i) = 12 *(x+i) = 13 *(x+i) = 14

Resultado &x[ i ] = 72 &x[ i ] = 74 &x[ i ] = 76 &x[ i ] = 78 &x[ i ] = 7A

x + i=72 x + i=74 x + i=76 x + i=78 x + i=7A

Ponteiros e Matrizes
142

Exerccio:
Desenvolver um programa que dado um vetor de 10 elementos numricos inteiros calcular um outro vetor que dever conter os elementos do 1 vetor elevados ao quadrado. Usar aritmtica de ponteiros.
#include <stdio.h> #include <conio.h> #include <math.h> void main() { int vet1[10],vet2[10],x; clrscr(); for(x=0;x<10;x++) { scanf("%d",(vet1+x));//no prec. & *(vet2+x)=pow(*(vet1+x),2); printf("%d\n",*(vet2+x)); } getchar(); }

void main() { int vet1[10],vet2[10],x,*pt; clrscr(); pt=vet1; // no precisa & porque o //Nome de uma matriz um ponteiro for(x=0;x<10;x++) { scanf("%d",(pt+x)); *(vet2+x) = pow (*(pt+x),2); printf("%d\n",*(vet2+x);} getchar(); }

Estruturas, Unies, Tipos Definidos e Enumeraes


143

A Linguagem C permite que se crie vrios tipos diferentes de dados que possam ser agrupados de formas definidas.
Essas formas so um tipo de dado definido pelo programador e so conhecidas como:
Estruturas e Unies.

Estruturas, Unies, Tipos Definidos e Enumeraes


144

ESTRUTURA Uma estrutura uma coleo de tipos diferentes referenciadas por um nome, isto , a estrutura uma forma de se ter informaes agrupadas.
Forma Geral: struct nome { tipo nome_da_varivel; tipo nome_da_varivel; elem. da estrutura .... } variveis da estrutura; OBS: A struct um tipo de dado, no existe um espao reservado na memria para ela at que seja declarada uma varivel para armazenar o tipo definido.

Estruturas, Unies, Tipos Definidos e Enumeraes


145

Exemplo:
struct veculo { char modelo[25]; char marca[15]; float custo; }; veculo carro; // onde vaculo e o tipo e carro a varivel

Outra forma de declarar uma estrutura pode ser:


struct veculo { char modelo[25]; char marca[15]; float custo; } carro; struct xy { int x; float y; } a,b; // Duas variveis com // mesmo tipo de struct

Estruturas, Unies, Tipos Definidos e Enumeraes


146

Para referenciar cada elemento da estrutura utiliza-se o operador ponto. Forma Geral:
nome_da_varivelnome_do_elemento;

Exemplo:a.x =10; b.x =5; a.y =2.5; b.y = 0.5; gets(carro.modelo); scanf(%f,&carro.custo);

Estruturas, Unies, Tipos Definidos e Enumeraes


147

possvel tambm ter-se uma matriz de estruturas. Exemplos: struct veculo { char modelo[20]; char marca[15]; float custo; } carro[100];
/* isto cria 100 conjuntos de variveis que esto organizadas com os elementos acima */.

Para referenciar cada elemento da estrutura utiliza-se: float aux; gets(carro[0].marca); gets(carro[0].modelo); scanf(%f, &aux);} carro[x].custo = aux; .... Para simplificar esta estrutura poderamos ter: float aux; for (x=0;x<100;x++){ gets(carro[x].marca); gets(carro[x].modelo); scanf(%f, &aux);} carro[x].custo = aux;

Exerccio
148

Elaborar um programa que contenha uma estrutura que armazena o nmero da conta e o saldo de 5 clientes. O programa calcula o saldo mdio dos 5 clientes e exibe na tela quais os clientes que possuem saldo acima ou igual a mdia

Soluo
149

#include <stdio.h> #include <conio.h> void main(){ struct cliente{ char conta[20]; float saldo; } cli[5]; float saldo_medio=0,aux; int x; for (x=0;x<5;x++){ clrscr(); printf("\t\t\t CONTROLE BANCARIO \n"); printf("\t Nr da Conta.........: ");gets(cli[x].conta); printf("\t Saldo ..............: ");scanf("%f",&aux); cli[x].saldo=aux; saldo_medio += cli[x].saldo; getchar(); } saldo_medio=saldo_medio/5; clrscr(); printf("\t\t CLIENTES COM SALDO ACIMA DA MEDIA \n\n\n"); printf("\t Nr da conta \t Saldo \n\n"); for (x=0;x<5;x++){ if (cli[x].saldo >=saldo_medio) printf("\t %s \t\t %8.2f \n", cli[x].conta,cli[x].saldo); } getchar();

Exerccio

150

Vamos supor que vrias pedras do jogo de xadrez esto no tabuleiro. Para facilitar a indicao das peas, vamos convencionar:
1 pees 2 cavalos 3 torres 4 bispos 5 reis 6 rainhas 0 ausncia de peas

O tabuleiro
1 3 0 0 1 5 0 4 0 0 1 2 0 1 0

a) Construa um programa que determine a soma total entre pees e bispos e a quantidade de posies com ausncia de peas; b) Escreva outro programa que determine qual a quantidade de cada tipo de pea no tabuleiro.

0
1 0 0 1 1

0
0 1 0 0 0

0
0 0 3 6 5

0
1 4 1 6 0

1
1 0 0 0 1

0
0 0 0 0 1

6
0 1 1 1 0

0
1 0 1 0 6

Soluo
151

#include <stdio.h> #include <conio.h> void main(){ int tabuleiro[8][8] = { {1,3,0,5,4,0,2,1}, {1,0,1,0,0,1,0,0}, {0,0,0,0,1,0,6,0}, {1,0,0,1,1,0,0,1}, {0,1,0,4,0,0,1,0}, {0,0,3,1,0,0,1,1}, {1,0,6,6,0,0,1,0}, {1,0,5,0,1,1,0,6} }; int i,j; int branco=0, peao=0, cavalo=0, torre=0, bispo=0, rei=0, rainha=0; printf("\tApresentao do tabuleiro\n"); for (i=0;i<8;i++){ for (j=0;j<8;j++){ printf("%2.0d",tabuleiro[i][j]); } printf("\n"); } // Continua ..

Soluo --- Continuao ---152

for (i=0;i<8;i++){ for (j=0;j<8;j++){ switch (tabuleiro[i][j]){ case 0: branco++; break; case 1: peao++; break; case 2: cavalo++; break; case 3: torre++; break; case 4: bispo++; break; case 5: rei++; break; case 6: rainha++; break; } } } printf("\n"); printf("Soma de Peoes ou bispos e brancos =%d\n",(peao + bispo + branco)); printf("Peoes =%d, cavalos=%d, torres=%d, bispos=%d, reis=%d, rainhas=%d, branco=%d",peao, cavalo, torre, bispo, rei, rainha, branco); }

Arquivos
153

ARQUIVO : um conjunto de registros logicamente organizados armazenados em um dispositivo de memria secundria (disco rgido, disquetes, fitas magnticas, cd, etc), onde cada registro compreende um conjunto de informaes denominadas campos. Em um arquivo possvel armazenar um volume grande de dados.
Arquivo Registro Campo

Arquivos
154

ARQUIVO : um conjunto de registros logicamente organizados armazenados em um dispositivo de memria secundria (disco rgido, disquetes, fitas magnticas, cd, etc), onde cada registro compreende um conjunto de informaes denominadas campos. Em um arquivo possvel armazenar um volume grande de dados.
Arquivo Registro Campo

Acesso a disco
155

Linguagem C divide as categorias de acesso a disco em dois grupos.


Alto nvel, ou leitura e gravao bufferizada Baixo nvel, ou leitura e gravao no bufferizada.

Iremos estudar a categoria do grupo de alto nvel por possuir algumas vantagens sobre a de baixo nvel. facilidade para ler e gravar qualquer tipo de dado e a portabilidade

Acesso a disco
156

possvel classificar os arquivos conforme a forma como eles so abertos:


Modo texto Modo binrio

Um arquivo aberto em modo texto interpretado em C como sendo uma seqncia de caracteres agrupados em linhas que devem ser separadas por um caracter de nova linha, as informaes numricas tambm so armazenadas em cadeias de caracteres, enquanto que, no modo binrio tudo muito mais simples.
No h necessidade de nenhuma converso de tipos. Para os tipos numricos na forma binria eles so armazenados como esto na memria, nem mesmo a indicao de final de arquivo necessria pois acaba sendo interpretada automaticamente. Sendo assim estaremos utilizando leitura e gravao em alto nvel com modo de acesso binrio

OPERAES BSICAS COM ARQUIVO


157

Abrir Fechar Apagar Copiar Renomear

OPERAES BSICAS COM ARQUIVO


158

ABRIR O ARQUIVO: Para podermos utilizar as informaes contidas no arquivo ou para guard-las nesse arquivo devemos primeiramente abrir o arquivo:
necessria a declarao de uma estrutura do tipo FILE que receber um ponteiro para o arquivo que est sendo aberto.

Para que o S.O. possa abrir o arquivo trs informaes devem ser fornecidas: o nome do arquivo, o tipo de abertura (se o arquivo est sendo lido ou gravado) e onde guardar as informaes sobre o arquivo.
Usando a funo fopen().

A estrutura FILE contm informaes sobre o arquivo tais como: seu tamanho atual, a localizao de seus buffers de dados, se o arquivo est sendo lido ou gravado, etc.

159

OPERAES BSICAS COM ARQUIVO


Nome do arquivo e tipo de abertura

Programa em C
Ponteiro para estrutura FILE
MODO

S.O.

Disco

SIGNIFICADO Abre um arquivo texto para leitura. O arquivo deve existir. Cria um arquivo texto para escrita. Se o arquivo exitir ser recriado por cima caso no exista ser criado. Abre um arquivo texto para gravao.Se o arquivo existir os dados sero anexados no final do arquivo se no existir ser criado um novo. Abrir um arquivo texto para leitura e gravao. O arquivo tem que existir. Abre um arquivo texto para leitura e gravao. Se o arquivo existir ser recriado por cima. Se no existir ser criado. Abre um arquivo texto para atualizao e para adicionar dados no fim do arquivo se ele existir se no cria-se um novo arquivo Abre um arquivo binrio para leitura. O arquivo deve existir.

r w a r+ w+ a+ rb

wb
ab rb+ wb+ ab+

Cria um arquivo binrio para escrita. Se o arquivo exitir ser recriado por cima caso no exista ser criado.
Abre um arquivo binrio para gravao.Se o arquivo existir os dados sero anexados no final do arquivo se no existir ser criado um novo. Abre um arquivo binrio para leitura e gravao. O arquivo deve existir e pode ser atualizado. Abrir um arquivo binrio para leitura e gravao. Se o arquivo existir ele ser destrudo e reinicializado. Se no existir ser criado. Abrir um arquivo binrio para atualizao e para adicionar dados ao fim do arquivo existente ou um novo arquivo ser criado.

OPERAES BSICAS COM ARQUIVO


160

Exemplo.:
#include <stdio.h> #include <conio.h> void main(){ struct aluno { char ra[9]; char nome[20]; }teste; FILE *ARQ; int x; long N; gets(teste.ra); gets(teste.nome); ARQ=fopen ("curso.dat","ab+"); fseek(ARQ,sizeof(teste),SEEK_END); N=(ftell(ARQ)/sizeof(teste)-1); fseek(ARQ,N*sizeof(teste),SEEK_CUR); fwrite(&teste,sizeof(teste),1,ARQ); fclose(ARQ); }

A funo ftell() retorna um nmero inteiro longo que representa o nmero de bytes do comeo do arquivo at a posio atual.

FECHAR ARQUIVO: Todo arquivo aberto dever ser fechado para garantir a integridade dos dados armazenados, caso isso no ocorra poder haver perda de informaes.
fclose().

OPERAES BSICAS COM ARQUIVO


161

APAGAR ARQUIVO: Deleta um arquivo existente. Todo arquivo antes de ser apagado deve ser fechado. Forma Geral: remove(nome fsico do arquivo); RENOMEAR ARQUIVO: Permite mudar o nome do arquivo existente para um outro nome diferente. Antes de renomear o arquivo deve ser fechado.
Forma Geral: rename(nome fsico do arquivo,novo nome fsico do arquivo); onde: Nome dado ao arquivo de dados e o novo nome que ser dado

OPERAES BSICAS COM ARQUIVO


162

LER REGISTRO DO ARQUIVO: quando lemos um registro de um arquivo estamos transferindo os dados do registro do arquivo, armazenados em memria secundria, para a memria principal do computador (memria RAM). Para isto utilizamos a seguinte instruo: Forma Geral: fread(&estrutura,sizeof(estrutura),1,ponteiro); Onde: &estrutura - o endereo na memria onde os dados sero lidos; sizeof(estrutura) operador que retorna o tamanho da estrutura; 1: quantidade de estruturas a ser lida (normalmente 1); ponteiro: o nome do ponteiro da estrutura FILE.

OPERAES BSICAS COM ARQUIVO


163

ESCREVER UM REGISTRO NO ARQUIVO (GRAVAR) : quando escrevemos (gravamos) um registro num arquivo, estamos transferindo os dados do registro, armazenados em memria principal, para a memria secundria do computador (disquete, disco rgido, CD, etc). Utilizamos a seguinte instruo: Forma Geral: fwrite(&estrutura,sizeof(estrutura),1,ponteiro); Onde:&estrutura- o endereo na memria onde os dados sero armazenados; sizeof(estrutura) operador que retorna o tamanho da estrutura; 1: quantidade de estruturas a ser gravada (normalmente 1); ponteiro: o nome do ponteiro da estrutura FILE.

ORGANIZAO DE ARQUIVOS
164

Existem duas formas diferentes de acesso aos registros de um arquivo:


O acesso seqencial, O acesso direto (tambm randmico)
conhecido como

Existem outras formas de acesso que so variaes destas que no sero tratadas.

ORGANIZAO DE ARQUIVOS
165

Acesso Seqencial:
Quando desejamos ter acesso aos dados de um determinado registro mas no sabemos a localizao desse registro no arquivo devemos vasculhar o arquivo desde o incio em busca do registro desejado at o final do arquivo se necessrio. Esta operao dever ser repetida seqencialmente, isto , avanando pelos registros armazenados at que se encontre o registro procurado. Isto significa que para acessar um registro especfico precisamos obedecer a ordem com que os registros foram armazenados no arquivo, o que implica em percorrer todos os registro que o antecedem.

ORGANIZAO DE ARQUIVOS
166

Acesso Direto ou Randmico:


Neste caso para acessarmos o registro desejado necessrio que saibamos a sua posio fsica (posio do registro no arquivo no instante da gravao). Dessa forma possvel se posicionar instantaneamente no registro desejado sem ter que percorrer todos os registros que o antecedem. Para isto, necessrio conhecer o nmero da posio fsica do registro dentro do arquivo. A posio fsica de um registro um nmero nico, pois nunca dois registros diferentes podero ter a mesma localizao.

167

COMANDOS E FUNES PARA MANIPULAO DE REGISTROS


Para posicionar o ponteiro de arquivo para o registro:
fseek(ponteiro,sizeof(estrutura),deslocamento); Onde: ponteiro: o nome do ponteiro da estrutura FILE. sizeof(estrutura) operador que retorna o tamanho da estrutura; Deslocamento tambm chamado de modo : posio especificada para o ponteiro do arquivo;

DESCRIO Comeo do arquivo Posio corrente do ponteiro Final do arquivo

Pode ser uma macro SEEK_SET SEEK_CUR SEEK_END

MODO Pode ser um nmero 0 1 2

COMANDOS E FUNES PARA MANIPULAO DE REGISTROS


168

Para indicar o final do arquivo usamos a funo feof( ) que retorna um nmero inteiro enviado pelo S.O que indica final de arquivo. Forma Geral: feof(ponteiro); Onde: ponteiro o nome da varivel do tipo FILE;
No DOS a funo feof() retorna 1 caso seja final de arquivo e 0 caso contrrio.

Exemplo:

while ( !feof(ponteiro)) fread(&estrutura,sizeof(estrutura),1,ponteiro);

COMANDOS E FUNES PARA MANIPULAO DE REGISTROS


169

Para posicionar o ponteiro de arquivo no incio do arquivo, isto , no 1 registro temos: Forma Geral: rewind(ponteiro); Onde: Ponteiro o nome da varivel do tipo FILE. A funo ftell() retorna um nmero inteiro longo que representa o nmero de bytes do comeo do arquivo at a posio atual. Forma Geral: ftell(ponteiro); Onde: Ponteiro o nome da varivel do tipo FILE. Se o nmero que retornou dessa funo for dividido pelo tamanho da estrutura teremos o nmero da posio fsica do registro.

Exemplo prtico
170

#include #include #include #include #include #include

<stdio.h> <conio.h> <dos.h> <ctype.h> <stdlib.h> <string.h>

void main(){ abre_arquivo1(); menu(); fclose(parq); }

struct veiculo { char modelo[20]; char marca[20]; float preco; }reg; FILE *parq; void void void void void void void void void void void char menu(); abre_arquivo1(); abre_arquivo2(); inclusao(); consulta_s(); consulta_d(); alteracao(); exclusao(); reorganizar(); tela1(); tela2(); resposta();

void abre_arquivo1(){ parq=fopen("t3.dad","ab+"); if (parq==NULL){ printf("Ocorreu um erro o arquivo nao pode ser aberto\n"); delay(1000); exit(1); } } void abre_arquivo2(){ parq=fopen("t3.dad","rb+"); if (parq==NULL){ printf("Ocorreu um erro o arquivo nao pode ser aberto\n"); delay(1000); exit(1); } }

Exemplo prtico ...

Continuao
171

void menu(){ int op; do{ clrscr(); gotoxy(20,2);printf("<<< M E N U D E O P C O E S >>>"); gotoxy(30,6);printf("1 - INCLUSAO "); gotoxy(30,8);printf("2 - CONSULTA SEQUENCIAL"); gotoxy(30,10);printf("3 - CONSULTA DIRETA"); gotoxy(30,12);printf("4 - ALTERACAO"); gotoxy(30,14);printf("5 - EXCLUSAO"); gotoxy(30,16);printf("6 - FIM "); gotoxy(25,18);printf("Digite a opcao <1-6> ?"); do{ gotoxy(47,18);clreol();scanf("%d",&op); } while (op<1 || op>6); if (op!=6){ switch (op){ case 1:inclusao();break; case 2:consulta_s();break; case 3:consulta_d();break; case 4:alteracao();break; case 5:exclusao();break; } } }while (op!=6); }

Exemplo prtico ...

Continuao
172

void inclusao(){ char op; int x; long N; fseek(parq,sizeof(reg),SEEK_END); N=(ftell(parq)/sizeof(reg)-1); do { tela1(); getchar(); gotoxy(10,6);printf("O NUMERO DO REGISTRO: %ld",N); gotoxy(40,8);gets(reg.modelo); gotoxy(40,10);gets(reg.marca); gotoxy(40,12);scanf("%f",&reg.preco); fseek(parq,N*sizeof(reg),SEEK_CUR); fwrite(&reg,sizeof(reg),1,parq); op=resposta(); N++; }while(op!='N'); }

Exemplo prtico ...

Continuao
173

void consulta_s(){ int num,lin=8; tela2(); rewind(parq); fread(&reg,sizeof(reg),1,parq); while (!feof(parq)){ gotoxy(10,lin);printf("%s",reg.modelo); gotoxy(40,lin);printf("%s",reg.marca); gotoxy(60,lin);printf("%10.2f",reg.preco); fread(&reg,sizeof(reg),1,parq); lin++; } getch(); }

Exemplo prtico ...


void consulta_d(){ int num; long tam;

Continuao
174

char op; fseek(parq,sizeof(reg),SEEK_END); tam=(ftell(parq)/sizeof(reg))-2; do{ tela1(); gotoxy(10,6);printf("QUAL REGISTRO DESEJA CONSULTAR ?"); do{ gotoxy(45,6);clreol();scanf("%d",&num); }while (num<0 || num>tam); fseek(parq,num*sizeof(reg),SEEK_SET); fread(&reg,sizeof(reg),1,parq); gotoxy(40,8);printf("%s",reg.modelo); gotoxy(40,10);printf("%s",reg.marca); gotoxy(40,12);printf("%10.2f",reg.preco); op=resposta(); }while(op!='N'); }

Exemplo prtico ...


void alteracao(){ int num; long tam; char op, resp[20]=""; fclose(parq); abre_arquivo2(); fseek(parq,sizeof(reg),SEEK_END); tam=(ftell(parq)/sizeof(reg))-2; do{

Continuao
175

tela1(); gotoxy(10,6);printf("QUAL REGISTRO DESEJA ALTERAR ?"); do{ gotoxy(45,6);clreol();scanf("%d",&num); }while (num<0 || num>tam); fseek(parq,num*sizeof(reg),SEEK_SET); fread(&reg,sizeof(reg),1,parq); gotoxy(40,8);printf("%s",reg.modelo); gotoxy(40,10);printf("%s",reg.marca); gotoxy(40,12);printf("%10.2f",reg.preco); getchar(); gotoxy(40,8);gets(resp); if (strcmp(resp,"") !=0){ strcpy(reg.modelo,resp); gotoxy(40,8);clreol();printf("%s",reg.modelo); } // Continua

Exemplo prtico ...

Continuao
176

// Continuao gotoxy(40,10);gets(resp); if (strcmp(resp,"") !=0){ strcpy(reg.marca,resp); gotoxy(40,10);clreol();printf("%s",reg.marca); } do{ gotoxy(40,12);gets(resp); if (strcmp(resp,"") !=0){ reg.preco=atof(resp); gotoxy(40,12);clreol();printf("%8.2f",reg.preco); } }while (reg.preco <=0); fseek(parq,num*sizeof(reg),SEEK_SET); fwrite(&reg,sizeof(reg),1,parq); op=resposta(); }while(op!='N'); fclose(parq); abre_arquivo1(); }

Exemplo prtico ...


void exclusao(){ int num,cont=0; long tam; char op;

Continuao
177

fclose(parq); abre_arquivo2(); fseek(parq,sizeof(reg),SEEK_END); tam=(ftell(parq)/sizeof(reg))-2; do{ tela1(); gotoxy(10,6);printf("QUAL REGISTRO DESEJA CONSULTAR ?"); do{ gotoxy(45,6);clreol();scanf("%d",&num); }while (num<0 || num>tam); fseek(parq,num*sizeof(reg),SEEK_SET); fread(&reg,sizeof(reg),1,parq); if (strcmp(reg.modelo,"***") == 0){ gotoxy(20,22);printf("Registro ja excluido !!"); delay(1000); } else // Continuao

Exemplo prtico ...

Continuao
178

// Continuao { gotoxy(40,8);printf("%s",reg.modelo); gotoxy(40,10);printf("%s",reg.marca); gotoxy(40,12);printf("%10.2f",reg.preco); gotoxy(40,19);printf("Confirma Exclusao ?"); op=resposta(); if (op=='S'){ strcpy(reg.modelo,"***"); fseek(parq,num*sizeof(reg),SEEK_SET); fwrite(&reg,sizeof(reg),1,parq); cont++; gotoxy(40,19);printf("Registro Excluido !!");delay(1000); } } gotoxy(40,19);clreol(); op=resposta(); }while(op!='N'); fclose(parq); abre_arquivo1(); if (cont > 0) reorganizar(); }

Exemplo prtico ...


void reorganizar(){ FILE *parq2; parq2=fopen("t3.bak","wb+"); fclose(parq); abre_arquivo2(); rewind(parq); while (! feof(parq)){ if (fread(&reg,sizeof(reg),1,parq) >=1) if (strcmp(reg.modelo,"***") !=0) fwrite(&reg,sizeof(reg),1,parq2); } fclose(parq); fclose(parq2); remove("t3.dad"); rename("t3.bak","t3.dad"); abre_arquivo1(); }

Continuao
179

Exemplo prtico ...


void tela2(){ clrscr(); gotoxy(30,3); printf("CADASTRO DE VEICULOS "); gotoxy(10,5);printf("MODELO \t\t\t MARCA \t\t\t }

final
180

PRECO R$\n");

void tela1(){ clrscr(); gotoxy(40,2);printf("CADASTRO DE VEICULOS"); gotoxy(10,8);printf(" MODELO............: "); gotoxy(10,10);printf(" MARCA.............: "); gotoxy(10,12);printf(" PRECO.............: R$"); }

char resposta(){ char op; gotoxy(40,20);printf("Deseja Continuar <S/N> ?"); do{ gotoxy(65,20);clreol();scanf("%c",&op); op=toupper(op); }while (op!='N' && op !='S'); return(op); }