PROGRAMAÇÃO DE COMPUTADORES

Utilizando Linguagem C-ANSI

Versão 2.1 - 2007

SUMÁRIO
Sumário................................................................................................................................................2 Prefácio................................................................................................................................................6 1. Introdução ...................................................................................................................................7
1.1 Dados, Informações e Conhecimento.................................................................................................7 1.2 Lógica de Programação ......................................................................................................................7 1.3 Algoritmos e Estrutura de Dados.......................................................................................................8 1.4 Representação da Lógica ....................................................................................................................9 1.4.1 1.4.2 1.4.3 Diagrama de Fluxo........................................................................................................................10 Diagrama de Chappin ou Nassi-Schneiderman (NS).................................................................11 Português Estruturado .................................................................................................................12

1.5 Linguagem de Programação.............................................................................................................13 1.6 Compiladores e Interpretadores ......................................................................................................14 1.7 Paradigma de Programação: Programação Estruturada..............................................................14 1.8 Tipos de Dados...................................................................................................................................15 1.8.1 Tipo Inteiro....................................................................................................................................15

1.8.1.1 Sistema de Numeração Binária....................................................................................................16 1.8.1.2 Decimal Codificado em Binário ...................................................................................................17 1.8.2 1.8.3 1.8.4 1.8.5 Tipo Real........................................................................................................................................17 Tipo Caractere ..............................................................................................................................17 Tipo Lógico ....................................................................................................................................18 Observações Finais........................................................................................................................18

1.9 Exercícios ...........................................................................................................................................18

2.

A Linguagem C..........................................................................................................................20
2.1 Introdução..........................................................................................................................................20 2.2 Sintaxe da Linguagem C...................................................................................................................20 2.3 Identificadores ...................................................................................................................................21 2.4 Tipos de Dados...................................................................................................................................22 2.5 Variáveis.............................................................................................................................................22
2

2.5.1

Classe de Variáveis .......................................................................................................................22

2.6 Operadores.........................................................................................................................................23 2.6.1 2.6.2 2.6.3 2.6.4 2.6.5 2.6.6 2.6.7 Atribuição ......................................................................................................................................23 Aritméticos.....................................................................................................................................23 Incremento e Decremento ............................................................................................................23 Relacionais e Lógicos ....................................................................................................................24 Bit a Bit ..........................................................................................................................................24 Outros Operadores .......................................................................................................................25 Precedência....................................................................................................................................25

3.

Fluxo de Controle......................................................................................................................26
3.1 Comando de Seleção: if...else/switch................................................................................................26 3.2 Comando de Iteração: for/while/do...while .....................................................................................26 3.3 Comando de Desvio ...........................................................................................................................27 3.4 Outros Comandos..............................................................................................................................28

4.

Entrada e Saída .........................................................................................................................29
4.1 Exercícios ...........................................................................................................................................29

5.

Vetores e Matrizes .....................................................................................................................34
5.1 Exercícios ...........................................................................................................................................34

6.

Manipulação de “Strings” ........................................................................................................38
6.1 Exercícios ...........................................................................................................................................38

7.

Estruturas, Enumerações e Uniões ..........................................................................................40
7.1 Estruturas ..........................................................................................................................................40 7.2 Enumerações......................................................................................................................................41 7.3 Uniões .................................................................................................................................................41 7.4 Exercícios ...........................................................................................................................................42

8.

Ponteiros ....................................................................................................................................44
8.1 Exercícios ...........................................................................................................................................45

9.

Ponteiros, Vetores e Matrizes....................................................................................................46
9.1 Vetores e Matrizes de Ponteiros.......................................................................................................46
3

9.2 Exercícios ...........................................................................................................................................47

10. Funções......................................................................................................................................48
10.1 Ponteiros para Funções.....................................................................................................................48 10.2 Recursividade ....................................................................................................................................49 10.3 Função main.......................................................................................................................................50 10.4 Funções de String ..............................................................................................................................50 10.5 Funções Matemáticas ........................................................................................................................52 10.6 Funções de Hora e Data ....................................................................................................................55 10.7 Outras Funções..................................................................................................................................56 10.8 Exercícios ...........................................................................................................................................56

11. Alocação Dinâmica ...................................................................................................................59
11.1 Exercícios ...........................................................................................................................................60

12. Manipulação de Arquivos .........................................................................................................62
12.1 “Streams” e Arquivos .......................................................................................................................62 12.2 Tipos de Acesso..................................................................................................................................63 12.3 Funções Manipulação de Arquivos..................................................................................................63 12.4 Exercícios ...........................................................................................................................................66

13. Ordenação..................................................................................................................................68
13.1 Ordenação por Troca........................................................................................................................68 13.2 Ordenação por Seleção .....................................................................................................................69 13.3 Ordenação por Inserção ...................................................................................................................69 13.4 “Shell Sort” ........................................................................................................................................70 13.5 “Quicksort”........................................................................................................................................70

14. Estruturas de Dados ..................................................................................................................72
14.1 Pilhas ..................................................................................................................................................72 14.2 Filas.....................................................................................................................................................73 14.2.1 Filas Circulares .............................................................................................................................73 14.3 Listas Ligadas ....................................................................................................................................74 14.3.1 Listas Singularmente Ligadas......................................................................................................74
4

............................................................83 16..................................................................1 Tabela ASCII .........................................79 14.................................2 Sistema Numérico...............................5 Exercícios....................................................81 15..................84 16...83 16.................................................... APÊNDICE ...............................................3.................................................................... Bibliografia................................................................................................3 Conversão entre Bases ..14..............................................................................................................................................................................................77 14..............................85 5 ............................................................................................82 16..........................4 Árvores Binárias.......2 Listas Duplamente Ligadas .........................................................................................

Francisco Yastami Nakamoto emaito: yastami@unifieo.PREFÁCIO Esta apostila é destinada aos alunos das disciplinas de Programação de Computadores I e II do curso de Ciência da Computação. Prof. Quaisquer dúvidas. encontra-se. de forma resumida. os conceitos básicos da linguagem de programação C.br Atualizado em: 01/02/2007 6 . Neste texto. críticas e sugestões serão bem vindas. estruturas de dados e técnicas de programação baseado no livro texto e nas referências bibliográficas complementares. Me.

ou seja. • Informações são abstrações que não podem ser formalizadas através de uma teoria matemática ou lógica. INTRODUÇÃO 1. dominar a sintaxe (dados) da linguagem de programação para elaborar a melhor semântica (informação) que represente no mundo computacional o conhecimento aplicado para a solução do problema. a idéia não existe antes da experiência vivida. O conhecimento é individual e único que criamos a partir da interação com outros seres humanos e o meio em que vivemos. o programador deve possuir o conhecimento do assunto em questão. ou seja. É a vivência do objeto do conhecimento e não uma interpretação pessoal. ou seja. Desta forma. não existe nada na consciência que não tenha sido sentido pelos nossos cinco sentidos. os dados podem ser descritos através de representações formais. Todas as idéias e pensamentos entram em nossa consciência através da vivência através dos sentidos tornando-se conhecimento. programar é a arte de elaborar soluções computacionais eficazes. representadas por dados. Muitas destas decisões são resultado de um conjunto de ações que visam um resultado almejado.). o conhecimento não é transmissível e sim um conjunto de informações. pode-se definir que: • Dados são entidades matemáticas. A lógica faz parte de 7 . 1.C.1 Dados. Dado um problema computacional.C. • Conhecimento é uma abstração pessoal de algum fato experimentado ou vivenciado por alguém. compostas por uma seqüência de símbolos quantificados ou quantificáveis e puramente sintática. que descrevem o conhecimento. enriquecendo o seu conhecimento através dos resultados obtidos. De acordo com Aristóteles (384-322 a. consequentemente. eficientes e elegantes. Além disso. baseado na teoria das idéias de Platão (427347 a. e implementá-lo no mundo real modificando o meio em que vive e.1. possui uma carga semântica que representa algo para alguém. ou seja. abstrair os problemas do mundo real e criar um modelo desse problema.2 Lógica de Programação Todos os dias tomamos decisões das mais variadas possíveis. de acordo com o conhecimento anteriormente adquirido. consequentemente. O homem possui a capacidade de analisar as informações fornecidas pelos seus sentidos. Informações e Conhecimento. possui a capacidade de estudar e aplicar as possíveis soluções a este modelo.).

isso é. Os dígitos binários 0 e 1 são usados para representar os dois possíveis estados de determinado bit. pode comprometer a eficiência do algoritmo que manipula essa informação. oferecendo. imprevisibilidade ou valor-surpresa da mensagem. b) Definir os objetivos a serem alcançados. ou seja.3 Algoritmos e Estrutura de Dados Um computador é uma máquina que manipula dados. 1. e) Dividir o problema em partes menores.. um nível de abstração na solução de problemas. o que é coerente. Um programa processa dados. porém. Segundo a teoria da informação: “. As estruturas de dados são organizações conceituais de informações. organizam as informações que representam uma situação real. Um algoritmo é descrito na literatura como: 8 . Uma estrutura de dados permite apresentar uma forma mais compreensível de se observar as informações. a estrutura de dados recebe as informações e o algoritmo processa-os. A lógica de programação em processamento de dados é a forma pela qual se representa em uma linguagem. sendo quantificada em bits de informação. f) Rever os passos anteriores caso o objetivo não seja atingido. entra-se com os dados no programa que os processa e.a informação é a medida da redução da incerteza sobre um determinado estado de coisas por intermédio de uma mensagem. ou seja. Um programa é constituído de algoritmos e estrutura de dados. assim. disponibiliza a informação processada. Entende-se por lógico o que não permite questionamento.. Neste sentido. ou símbolos que expressam essa linguagem. o que é óbvio e certo. A lógica de programação é diretamente influenciada pela forma como raciocinamos. instruções que são executados por um computador.nossas decisões. isto é... de acordo com a forma da organização. Um bit é uma contração das palavras binary digit ou dígitos binários.” A unidade básica que representa a informação é o bit. dado um problema de processamento de dados os passos realizados para a análise podem deve-se realizar uma análise seguindo os seguintes passos: a) Entender o problema proposto. d) Estabelecer uma seqüência de ações para resolução do problema. cujo valor compreende um entre duas possibilidades mutuamente exclusivas. se necessário. c) Verificar todos os dados disponíveis para resolvê-lo. a informação não deve ser confundida com o significado e apresenta-se como função direta do grau de originalidade.

que atinge um objetivo pré-estabelecido.. As seguintes perguntas devem ser respondidas: a) Qual é o problema? b) Qual é o objetivo? c) Como atingir o objetivo? O problema é servir o café aos convidados.. Seguindo os passos apresentados.. um encontro de amigos na residência do casal Leila e Francisco. Sendo anfitrião do evento. ” Desta foram. Preparar porta-filtro com filtro sobre o bule.. Entretanto. Colocar a chaleira para ferver. Aguardar o processo de coar.4 Representação da Lógica O algoritmo é a representação da resolução lógica de um problema de processamento de dados. acrescentar aos poucos a água no filtro. é um conjunto seqüencial de ações executáveis ao longo de um tempo finito para obtenção de uma solução para um determinado tipo de problema.uma série de passos organizados que descrevem um processo que se deseja seguir para dar solução a um problema específico. Colocar café em pó no filtro.é uma seqüência finita de instruções.. Colocar a chaleira para ferver. Se a água ferver. é possível prever passos essenciais que podem comprometer a resolução do problema. então o objetivo principal é fazer o café.. defini-se que os algoritmos são instruções que descrevem um padrão de comportamento expresso em termos de um conjunto finito de ações. cada uma das quais possuem um significado claro e pode ser executada com uma quantidade finita de esforço ao longo de um tempo também finito. o casal está preparando café para servir aos convidados. certamente o objetivo será alcançado. executados num determinado período de tempo. determina-se os passos seqüenciais para fazer o café: Encher água na chaleira. Encher água na chaleira.. mas para isso é preciso do café. Adoçar o café. Então. Considerando-se as definições apresentadas anteriormente. Por exemplo: 1. 1. 9 . ou seja..“ . ” considerando-se que: “ . observando-se a seqüência proposta. Por exemplo. um algoritmo é um conjunto finito instruções seqüenciais. 2.

com os dados de entrada e a execução da seqüência. Se não houver café em pó: Encerrar o preparo do café. A figura 1. 10 . diagrama de Chapin ou português estruturado. . . Enquanto a chaleira está no fogo: . porta-filtro. fogão. 4. Indica início ou final do diagrama de fluxo Operação de atribuição e chamada ou retorno de subalgoritmo Conectores de páginas Operação de saída de dados em vídeo Operação de entrada de dados Arco de fluxo de dados Conector de fluxo Decisão Figura 1.3. ou seja. Adoçar o café. Um algoritmo é escrito utilizando uma linguagem de programação ou por meio de diagrama de fluxo. chaleira. Definido a seqüência de passos. Os símbolos para a representação gráfica são padronizados pela ANSI (figura 1. determina-se o que é preciso para executar a seqüência.4.Principais formas geométricas usadas em diagrama de fluxo. 5. Desta forma. 6.Se houver café em pó: . filtro e bule Finalmente.Preparar porta-filtro com filtro sobre o bule.Do contrário: Desligue o fogo.1 .. Se a água ferver. Do contrário: Voltar para o item 1.2 apresenta um exemplo de um programa. tem-se: Pó de café.1 Diagrama de Fluxo Um diagrama de fluxo é uma representação gráfica de um algoritmo. o resultado é o café pronto.1). água. Desta descrição é o algoritmo “fazer café”. Providenciar o café em pó. 1.Colocar café em pó no filtro. é realizado um detalhamento dos passos lógicos de um determinado processamento de forma gráfica. Aguardar o processo de coar. acrescentar aos poucos a água no filtro. açúcar.

Os diagramas de Chapin (Nassi-Schneiderman).3 apresenta os diagramas de Chapin. 11 . Enquanto é difícil mostrar a recursividade no diagrama de fluxo. A figura 1. A grande vantagem de usar este tipo de diagrama é a representação das estruturas que tem um ponto de entrada e um ponto de saída e são compostas pelas estruturas básicas de controle de seqüência. seleção e repartição.2 Diagrama de Chappin ou Nassi-Schneiderman (NS) O diagrama de Chapin (Nassi-Schneiderman) é um diagrama em que se retiram-se os arcos. torna-se mais simples mostrá-lo com o diagrama de Chapin.4. apresentando-se uma visão hierárquica e estruturada da lógica do programa. 1.Início Leia N1 e N2 M = (N1 + N2)/2 N M>=6 Imprima “Reprovado” S Imprima “Aprovado” Fim Figura 1.2 . Seqüência Seleção S <Comando> <?> N 1 2 <?> 3 4 Interação <Condição> <Condição> Figura 1.Exemplo de um diagrama de fluxo. bem como codificá-lo futuramente na conversão de código português estruturado ou pseudocódigos.3 .

também conhecida como “portugol” ou pseudo-código.4 . por assemelhar-se bastante à forma em que os programas são escritos. é bastante rica em detalhes e. encontra muita aceitação.4. A figura 1.5 apresenta um exemplo utilizando pseudo-código.A figura 1. 12 .Exemplo de um diagrama Chapin (Nassi-Schneiderman). Onde: Algoritmo é uma palavra que indica o início da definição de um algoritmo em forma de pseudocódigo. nos subalgoritmos.4 apresenta um exemplo do tipo de diagrama de Chapin para o algoritmo de cálculo da média de um aluno. N Escreva “Aprovado” 1. <nome_do_algoritmo> é um nome simbólico dado ao algoritmo com a finalidade de distinguílo dos demais. <subalgoritmos> consiste de uma porção opcional do pseudocódigo onde são definidos os subalgoritmos. De fato. A representação de um algoritmo na forma de pseudo-código é a seguinte: Algoritmo <nome_do_algoritmo> <declaração_de_variáveis> <subalgoritmos> Início <corpo_do_algoritmo> Fim. eventualmente. Início Leia N1. N2 Média = (N1+N2)/2 Média >=7? S Escreva “Aprovado” Fim Figura 1. esta representação é suficientemente geral para permitir que a tradução de um algoritmo nela representado para uma linguagem de programação específica seja praticamente direta. Início e Fim são respectivamente as palavras que delimitam o início e o término do conjunto de instruções do corpo do algoritmo.3 Português Estruturado Esta forma de representação de algoritmos. <declaração_de_variáveis> consiste em uma porção opcional onde são declaradas as variáveis globais usadas no algoritmo principal e.

5 Linguagem de Programação Um programa de computador é um conjunto instruções que representam um algoritmo para a resolução de algum problema. basicamente soma e subtração e funções de leitura e armazenamento. Compiladores fazem a tradução de todas as instruções do programa fonte gerando um programa executável. as linguagens de programação em dois grandes grupos: as linguagens de baixo nível e as de alto nível. tornando a programação mais difícil. as instruções são bem primitivas. Um programa executável contém uma seqüência de instruções que podem ser executados pelo processador.exe) podem ser executados fora dos ambientes de programação. isto é. Linguagens de alto nível são linguagens voltadas para o ser humano. N2.Exemplo de um programa em pseudo-código. Este conjunto de códigos possui regras de estruturação lógica e sintática própria.Algoritmo Média Declare N1. Além disso. são escritas usando as instruções do microprocessador do computador. Basic e AutoLISP por exemplo. Interpretadores fazem a interpretação de cada instrução do programa fonte executando-a dentro de um ambiente de programação. Linguagens de baixo nível são linguagens voltadas para a máquina. Neste formato executável. A principal vantagem é que os programas são executados com maior velocidade de processamento ocupando menos espaço na memória. São genericamente chamadas de linguagens Assembly. Média Real Início Leia N1. os programas em Assembly tem pouca portabilidade. N2 Média ← (N1+N2)/2 Se Média >=7 Então Escreva “Aprovado” Do contrário Escreva “Reprovado” Fim Figura 1. os códigos Assembly não são estruturados. Podemos dividir. 1.5 . A desvantagem é que em geral. isto é. genericamente. um código gerado para um tipo de processador não serve para outro. A linguagem de 13 . Necessitam de compiladores ou interpretadores para gerar instruções do microprocessador. Em geral utilizam sintaxe estruturada tornando seu código mais legível. Estas instruções são escritas através de um conjunto de códigos (símbolos e palavras). Dizemos que este conjunto de símbolos e regras formam uma linguagem de programação. Estes programas executáveis (*.

7 Paradigma de Programação: Programação Estruturada Os recursos computacionais são compostos por hardware e software. LISP (inteligência artificial) ou CLIPPER (banco de dados). Desta forma. A linguagem estruturada tem como característica principal a modularização do código e dos dados. Os módulos ou sub-rotinas se interligam através de três mecanismos básicos: 14 . As linguagens de alto nível podem se distinguir quanto a sua aplicação em genéricas como C. que é uma tradução do código fonte do programa em uma forma que o computador possa executar diretamente.máquina é complexa para maioria das pessoas. as rotinas geradas (em linguagem de maquina) são mais genéricas e portanto mais complexas e por isso são mais lentas e ocupam mais memória. possibilita a criação de sub-rotinas que empregam variáveis locais. dessa forma usamos uma linguagem de um nível maior para escrever nossos programas. podem ser executados em varias plataformas com pouquíssimas modificações. GPSS (simulação). A desvantagem é que em geral. isto é. acarretando como conseqüência um árduo trabalho na manutenção do código. Pascal e Basic ou específicas como Fortran (cálculo matemático). Softwares sofisticados significam grandes quantidades de linhas de código. 1. Dentro deste contexto. Um compilador lê o programa inteiro e converte-o em um código objeto (código binário ou código de máquina). surgiu-se no início dos anos 70 o conceito de modularização de código que permitiu desenvolver o paradigma de programação estruturada. isto é. a programação torna-se mais fácil por causa do maior ou menor grau de estruturação de suas linguagens. A principal vantagem é que os programas podem ser compiladas ou interpretadas tornando-os portáveis. permitindo-se elevar o nível de abstração para o desenvolvimento de soluções mais eficientes.6 executado. As inovações em hardware permitem desenvolver softwares cada vez mais sofisticados. Em geral. Compiladores e Interpretadores Os termos compiladores e interpretadores referem-se à maneira como um programa é Um interpretador lê o código fonte do programa linha por vez e executando a instrução específica contida nesta linha. 1. a execução do programa depende da presença do interpretador na máquina.

0. Estes dados podem ser classificados em: Instruções. isto é. são sub-rotinas ou blocos de construção em que são realizadas as atividades pré-estabelecidas.8. 15 . Portanto.8 Tipos de Dados O trabalho realizado por um computador é basicamente manipular os dados contidos em sua memória. 1. Iteração: Permite a execução repetitiva de segmentos do programa. -56. Um bloco de código é um grupo de comandos que é tratado como uma unidade. Dados propriamente ditos. 1.Seqüência: Implementa os passos de processamento necessários para descrever qualquer programa. A função tem como objetivo conceitual realizar essas atividades adequadamente sem criar efeitos inesperados em outras partes do programa. Como exemplo deste tipo de dado. 1024 entre outros. Existe duas formas para representar números inteiros em binário: Sistema de numeração binária e Decimal codificado em binário. Em linguagem C. Seleção: Especifica a possibilidade de selecionar o fluxo de execução do processamento baseado em ocorrências lógicas. tem-se os valores: 35. a modularização do código permite que os programas possam: Compartilhar seções de códigos. os dados numéricos positivos ou negativos. Tipos Lógicos. que correspondem à porção das informações a serem processadas pelo computador. Excluindo-se destes qualquer número fracionário. Facilitar a compreensão de programas através do número restrito sub-rotinas. Tipos Reais. o principal componente estrutural é a função. Realizar facilmente manutenções no código. Tipos Caracteres. Os tipos de dados podem ser classificados em: Tipos Inteiros.1 Tipo Inteiro São caracterizados como tipos inteiros. Outra forma de estruturar e modularizar o código em linguagem C é pelo uso de blocos de código. que comandam o funcionamento da máquina e determinam a maneira como devem ser tratados os dados.

16 . Notação de complemento de dois: Um número negativo é representado somando-se 1 à representação de complemento de um de um número negativo (figura 1.Exemplo de sistema de numeração binária. (00100110)2=(38)10 (-38)10=(11011001)2 Figura 1. A figura 1. Portanto. a potência de 2 representada por essa posição de bit será incluída na soma porém.6 .8. Isto significa que o bit da extrema esquerda de um número não é mais usado para representar uma potência de 2. uma seqüência de bits de tamanho n pode representar um número inteiro não negativo entre 0 a 2(n-1). 00100110 1ª posição 2ª posição 5ª posição Figura 1. O inteiro é representado por uma soma de potências de 2.1.8).Exemplo de notação de complemento de um.1.8 . Se o valor for 1 em determinada posição. mas é reservado para o sinal do número.Exemplo notação de complemento de dois. Portanto. cada posição de bit representa uma potência de 2. uma seqüência de bits de tamanho n pode representar um número inteiro entre -2(n-1) a 2(n-1)-1.7 . 21 + 22 + 25 = 38 A representação de inteiros negativos pode ser realizada baseado em dois métodos: Notação de complemento de um: Um número negativo é representado mudando-se cada bit em seu valor absoluto para a definição do bit oposto (figura 1. essa potência de 2 não será incluída na soma.6 apresenta um exemplo. Portanto. uma seqüência de bits de tamanho n pode representar um número inteiro entre -2(n-1)+1 a 2(n-1)-1.7). se o valor for 0.1 Sistema de Numeração Binária Neste sistema. (-38)10=(11011001)2 11011001+1=11011010=(-38)10 Figura 1.

” ”. 1. 2 00100110 0010 0110 6 Figura 1. Como exemplo deste tipo de dado.8.2 Decimal Codificado em Binário Neste sistema. 1.Exemplo decimal codificado em binário.2. Desta forma. Um número real representado por uma seqüência de 32 bits consiste de uma mantissa de 24 bits seguida por um expoente de 8 bits de base 10 (figura 1. -45. Um caractere é representado por 8 bits.9). os dados numéricos positivos e negativos e números fracionários. Como exemplo deste tipo de dado. 26 1.1.10 .987 entre outros.8. ”04387. ”Fone 574-9988”. literal ou cadeia. Mantissa*baseexpoente 387. uma seqüência representa o número formado por esses dígitos decimais na notação decimal convencional (figura 1.10).1. ”Rua Alfa. O método usado pelos computadores para representar números reais é a notação de ponto flutuante. Uma seqüência de caracteres deve ser indicada entre aspas (” ”). chamada expoente. tem-se os valores: ”Programação”.030”.53=38753*10-2 1111 1111 0110 1000 1001 1111 1111 1110 Figura 1. -56. Este tipo de dado também é conhecido como alfanumérico.Representação de ponto flutuante. tem-se os valores: 35. Um número real é representado por uma mantissa vezes uma base elevada a uma potência de inteiro.3 Tipo Caractere São caracterizados como tipos caracteres.8. string.2 Tipo Real São caracterizados como tipos reais. 17 . as seqüências contendo letras. 52 Apto 1”. números e símbolos especiais. uma seqüência de bits pode ser usada para representar inteiros da seguinte forma: cada quatro bits representa um dígito decimal entre 0 e 9.9 . 0. ”7” entre outros.

6. elaborar um algoritmo que calcule a estimativa da conta do próximo mês. 4.5 Observações Finais A classificação apresentada acima não se aplica a nenhuma linguagem de programação específica. hexadecimal e decimal de caracteres.8. 5. pelo contrário. A figura 1. 18 . sendo que este tipo de dado poderá representar apenas um dos dois valores. Construa um algoritmo detalhado para trocar uma lâmpada. desde que seja feito com coerência.4 Tipo Lógico São caracterizados como tipos lógicos os dados com valor verdadeiro e falso. qualquer significado pode ser atribuído a determinado padrão de bits. 3. Calcular o número de dias existentes entre dois anos digitados pelo usuário. 1011001 10000001 1010011 1010100 10000001 1001101 1001001 59 41 53 54 41 4D 49 89 65 83 84 65 77 73 Y A S T A M I Figura 1. É a interpretação de um padrão de bits que dá o seu significado. ela sintetiza os padrões utilizados na maioria das linguagens.50. a seqüência de bits 00100110 pode ser interpretada como o número 38 decimal. diagrama de blocos e português estruturado para os seguintes exercícios: 1. sabendo-se que o preço por m3 é de R$ 3. Construa um algoritmo para fazer o cálculo das suas despesas do mês. Construa um algoritmo para fazer uma ligação telefônica.Representação binária. o número 26 hexadecimal ou o caractere ‘&’ no código ASCII.11 apresenta um exemplo. 2. Ele é chamado por alguns de tipo booleano.1. Outro aspecto a ser considerado é com relação à interpretação da informação. devido à contribuição do filósofo e matemático inglês George Boole na área da lógica matemática.8. Dados o consumo em m3 de água dos três últimos meses.9 Exercícios Construir algoritmos em português estruturado. Construa um algoritmo para comer uma barra de chocolate. Por exemplo. 1.11 . portanto. 1. Um método de interpretar um padrão de bits é freqüentemente chamado tipo de dado.

A velocidade de um ponto material é regida pela equação apresentada a seguir. Construa um algoritmo para somar e contar os números pares e ímpares de 30 números inteiros inseridos pelo usuário. dado uma entrada t (s).00. Construa um algoritmo para o funcionamento de uma máquina de refrigerante.50. Elabore um algoritmo que apresente a tabuada de multiplicação de um número fornecido pelo usuário. multiplicação e divisão. Calcular e mostrar o tempo em anos.7. 10. Construa um algoritmo para o funcionamento de uma máquina de lavar roupa. meses. Dado: Nome. Elabore um algoritmo que calcule a soma de dez números pares fornecidos pelo usuário. Calcular o custo de um bolo de aniversário. calcule a média aritmética. Um automóvel tem um consumo médio de 1 litro de gasolina para cada 16 km rodados. 13. Faça um algoritmo que calcule a velocidade v (m/s). 8. elabore um algoritmo que calcule o valor que o cliente vai pagar. 20. sabe-se que os vinhos tipo tinto custam R$ 8. Elabore um algoritmo que dado dois número fornecidos pelo usuário. horas.00 e o rosê R$ 9. 17. Ao final mostre os resultados. 15. quantos da classe toda são maiores que 18 anos. verifique qual é o maior. Em uma distribuidora. 19. o menor e a média. Dados: Distância percorrida. 18. 11. fazer uma calculadora que pode realizar as seguintes operações: soma. v = 10 + 5 * t 12. 14. 9. Elabore um algoritmo que calcule a hipotenusa de um triângulo retângulo dados as medidas dos dois catetos. Elabore um algoritmo que dados 10 números reais. Construa um programa para ler e mostrar os dados digitados pelo usuário. Se o número for ímpar. 21. 22.00. subtração. Dado o tipo do vinho e a quantidade comprada. dias. Construa um algoritmo para verificar em uma classe com 50 alunos quantos são do sexo feminino e masculino e. Dados: sexo e idade dos alunos. emitir mensagem informando o usuário. os de tipo branco R$ 8. Elabore um algoritmo que dados três números. Emitir o resultado da soma. Endereço e Telefone. 19 . Dado: Peso total do bolo. 16. minutos e segundos de um ano digitado pelo usuário em relação ao ano atual. sabendo-se que o preço por quilo de bolo é R$ 16. Calcule a quantidade de gasolina consumida.

A linguagem C é uma linguagem estruturada. bytes e endereços e. suportam o conceito de tipos de dados. Outro aspecto a ser considerado. As declarações expressam as partes do programa. é que o padrão C ANSI estabelece 32 palavraschaves.1 Introdução A linguagem C é uma linguagem de alto nível. Todo programa C inicia sua execução chamando a função main(). Linkeditar o programa. genérica. impressão. As funções printf() e scanf() por exemplo. Há funções básicas que estão definidas na biblioteca C. as declarações. definir funções. etc. A linguagem C é uma linguagem compilada. O programador também pode definir novas funções em seus programas. isto é. sendo obrigatória a sua declaração no 20 . As linguagens de alto nível tipicamente possuem várias vezes esse número de palavras reservadas. Compilar o programa. As funções especificam as ações que um programa executa quando roda. C permite a manipulação de bits. 2.2 Sintaxe da Linguagem C A sintaxe são regras detalhadas para um construção válida em linguagem C. As funções são as entidades operacionais básicas dos programas em C. que por sua vez são a união de uma ou mais funções executando cada qual o seu trabalho. A determinação e alteração de valores. permitem respectivamente escrever na tela e ler os dados a partir do teclado. Estas regras estão relacionadas com os tipos. podendo dar significado a um identificador. Os tipos definem as propriedades dos dados manipulados em um programa. alocar memória.2. O C foi criada no centro de pesquisas da Bell Laboratories em 1972 por Dennis Ritchie tendo como meta características de flexibilidade e portabilidade. definir conteúdo inicial. e a chamada de funções de I/O são definidas nas expressões. as funções e as expressões. como rotinas para cálculos. Em 1983 a ANSI (American National Standards Institute) estabeleceu um padrão C ANSI. ao mesmo tempo. A LINGUAGEM C 2. A geração do programa executável a partir do programa fonte obedece a uma seqüência de operações: Criar o programa. São palavras reservadas que são os comandos que compõem a linguagem C. A linguagem C é classificada como linguagem de alto nível somando-se as funcionalidades de linguagens de baixo nível.

Em C. void func(void). Função main(): Variáveis locais e instruções do programa. 2. Count. declaração de constantes. printf(“Variável y=%d\n”. dependendo do compilador utilizado. O padrão C ANSI determina que identificadores podem ter qualquer tamanho. combinadas com a sintaxe formal de C.programa principal. protótipos e variáveis globais.h> #include <stdio. return(0). } Implementação de Funções: Variáveis locais e definição das funções O padrão C ANSI determina 32 palavras-chave ou palavras reservadas que. Tabela 2. int main(void) { int y=10. 21 . y). 1. funções. func(). A forma geral de um programa em C é: Componentes Iniciais: arquivos de cabeçalho. Por exemplo: int count.1 Lista de palavras-chave em C ANSI 1. Comentários no programa são colocados entre /* e */ não sendo considerados na compilação. foram a linguagem de programação C (tabela 2. (ponto e vírgula) que faz parte do comando. x). Cada instrução encerra com . Os identificadores não podem ser igual a uma palavra-chave de C ou nome de funções criadas pelo usuário ou que estão nas bibliotecas C. #include <stdlib. porém em geral. rótulos. isto é.1). } void func(void) { printf(”Fim\n”). nomes de variáveis. entre outros. letras maiúsculas e minúsculas são tratadas diferentemente. números ou sublinhados. printf(“Variável global x=%d\n”.h> int x=20. count. COUNT.3 Identificadores Identificadores são os nomes usados para referenciar objetos definidos pelos usuário. auto break case char const continue default do double else enum extern float for goto if int long register return short signed sizeof static struct switch typedef union unsigned void volatile while Muitos compiladores acrescentam outras palavras-chaves para explorar melhor os recursos dos processadores e otimização da utilização da memória. considera-se apenas os 31 primeiros caracteres. O primeiro caractere deve ser uma letra ou um sublinhado e os caracteres subseqüentes devem ser letras. Count e COUNT são três identificadores distintos. Logo.

double e void. As variáveis devem ser declaradas da seguinte forma: <tipo> <nome_da_variavel>.647 a 2.767 a 32.767 a 32.647 -2.767 a 32. não o seu tamanho em bytes (tabela 2.147.5 Variáveis Variável é uma posição nomeada de memória utilizada para armazenar um valor que pode ser modificado pelo programa.967. Exceto o tipo void.767 a 32.4 Tipos de Dados Em C. O tipo void declara explicitamente uma função que não retorna valor algum ou cria ponteiros genéricos. ponto flutuante.647 0 a 4.2 Tipos de dados definidos no padrão C ANSI.2).767 -2.767 0 a 65. Em algumas situações é necessário modificar um tipo básico para atender às necessidades de diversas situações.767 -32.2. 2.483. Por exemplo: 22 . Isto é conseguido através do uso de modificadores que alteram o significado de um tipo básico.147.767 0 a 65. variáveis locais. todos os demais tipos básicos podem ter vários modificadores precedendo-os.1 Classe de Variáveis As variáveis podem ser declaradas em três lugares básicos: dentro de funções.535 -32. ponto flutuante de precisão dupla e sem valor: char. int. na definição dos parâmetros das funções e fora de todas as funções.147. ou seja. 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 Tamanho (bits) 8 8 8 16 16 16 16 16 16 32 32 32 32 64 80 Faixa mínima -127 a 127 0 a 255 -127 a 127 -32. Os modificadores podem ser: signed unsigned long short Tabela 2.483.483.647 a 2.535 -32. O tamanho e a faixa desses tipos de dados variam de acordo com o tipo de processador e com a implementação do compilador em C. parâmetros formais e variáveis globais. float.295 Seis dígitos de precisão Dez dígitos de precisão Dez dígitos de precisão 2.147. int x.5. inteiro.294. há cinco tipos básicos de dados: caractere.483. O padrão C ANSI estipula apenas a faixa mínima de cada tipo de dado. respectivamente.

8. 9. 2. 2. 18.2 Aritméticos + * / % Subtração Adição Multiplicação Divisão Módulo da divisão (resto) Os operadores aritméticos de C são: 2. 6. return(0). } 2. 7. /*c é parâmetro formal*/ int main(void) { float x. 3.3 Incremento e Decremento -++ Decremento Incremento C inclui dois operadores que geralmente não são encontrados em outras linguagens: 23 .6. 14. é possível converter os tipos de forma automática.6 Operadores 2.h> float g. 15. 5. é permitido atribuição do mesmo valor para muitas variáveis em uma única expressão: var1 = var2 = var3 = expressão. 12. /*x é variável local*/ x=15. A atribuição é válida para variáveis de tipos diferentes.1 Atribuição O operador de atribuição pode ser utilizado dentro de qualquer expressão válida em C.6. Em C. /*g é variável global*/ float soma10(float c).6. #include <stdlib. ou seja. 11. 4. x = 10. 13. 19. 16. 20. } float soma10(float c) { return(c+10). porém deve-se observar que poderá ocorrer uma possível perda de informação.1.h> #include <stdio. g=soma10(x). Esta conversão é conhecida como conversão de tipos. 17.g). 10. x = y = z = 0. A forma geral do operador de atribuição é: nome_da_variavel = expressão. printf(“g=%f”.

testar.6.3). Operadores relacionais > Maior que >= Maior ou igual < Menor <= Menor ou igual == Igual != Diferente Operadores lógicos && AND || OR ! NOT É permitido combinar diversas operações em uma expressão.5 Bit a Bit A linguagem C oferece um completo conjunto de operadores bit a bit. por exemplo: 10>5&&!(10<9)||3<=4 p 0 0 1 1 q 0 1 1 0 p&&q 0 0 1 0 p||q 0 1 1 1 Verdadeiro !p 1 1 0 0 Tabela 2. verdadeiro é qualquer valor diferente de zero. 2.6 apresenta a tabela verdade dos operadores bit a bit.4 Relacionais e Lógicos O operador relacional refere-se à relação que os valores podem ter uns com os outros. Tabela 2.4 apresenta a tabela verdade dos operadores lógicos utilizando 1s e 0s.5). & | ^ ~ >> << AND OR XOR Complemento de um Deslocamento à esquerda Deslocamento à direita Tabela 2. Tabela 2. p 0 0 1 1 q 0 1 1 0 p&q 0 0 1 0 p|q 0 1 1 1 p^q 0 1 0 1 24 .3 Operadores relacionais e lógicos.6. isto é.6 Tabela verdade operadores bit a bit.4 Tabela verdade operadores lógicos. A idéia de verdadeiro e falso é a base dos conceitos dos operadores lógicos e relacionais. As expressões que usam operadores relacionais ou lógicos devolvem zero para falso e 1 para verdadeiro (tabela 2. A tabela 2.5 Operadores bit a bit. atribuir ou deslocar os bits efetivos em um byte (tabela 2. Em C. A tabela 2. O operador lógico refere-se à maneira como essas relações podem ser conectadas.2. Falso é zero.

2.6.6

Outros Operadores
Tabela 2.7 Outros operadores.

?: & * sizeof(f) , . -> () []
1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. #include <stdlib.h> #include <stdio.h>

Exp1 ? Exp2 : Exp3 “o endereço de” “o valor do endereço de” Retorna o tamanho em bytes de f Separa seqüência de operações Referência a elementos individuais de estruturas e uniões. Organizar precedência. Indexação de matrizes.

int main(void) { int x, y; printf(“Digite valor de x=”); scanf(&x); printf(“Digite valor de y=”); scanf(&y); print((x>y)? “x>y\n”:((x=y)? “x=y\n”: “x<y\n”) return(0); 13. }

2.6.7

Precedência
Tabela 2.8 Precedência dos operadores em C.

Maior

Menor

() ! * + << < == & ^ | && ?: =

[] -> ~ ++ -/ % >> <= > >= !=

*

&

sizeof

+=

-=

*=

25

3. FLUXO DE CONTROLE 3.1 Comando de Seleção: if...else/switch
1. #include <stdlib.h> #include <stdio.h> int main(void) { int x, y; printf(“Digite valor de x=”); scanf(“%d”,&x); printf(“Digite valor de y=”); scanf(“%d”,&y); if (x>y) printf(“x>y\n”); else { if (x=y) printf(“x=y\n”); else printf(“x<y\n”); } return(0); }

if (<condicao>) <expressão>; else <expressão>;

switch (<expressão>) { case constante1 : <seq. de comandos> break; case constante2 : <seq. de comandos> break; . . . default : <seq. de comandos> }
1. #include <stdlib.h> #include <stdio.h> int main(void) { int x; printf(“Digite valor de x=”); scanf(“%d”,&x); switch (x) { case 0: printf(“x=0\n”); break; case 1: printf(“x=1\n”); break; case 2: printf(“x=2\n”); break; case 3: printf(“x=3\n”); break; default: printf(“3<x<0\z”); } /*Fim switch*/ return(0); }

1. #include <stdlib.h> #include <stdio.h> int main(void) { char y; printf(“Escolha a, b, c ou d:”); y=getchar(); switch (x) { case ’a’: printf(“Escolhido a\n”); break; case ’b’: printf(“Escolhido b\n”); break; case ’c’: printf(“Escolhido c\n”); break; case ’d’: printf(“Escolhido d\n”); break; default: printf(“Escolha invalida\n”); } /*Fim switch*/ return(0); }

3.2

Comando de Iteração: for/while/do...while

for (<inicialização>, <condição>, <incremento>) <seq. de comando> while (<condição>) do { { <seq. de comando> <seq. de comando> } } while (<condição>);

26

1. #include <stdlib.h> #include <stdio.h> int main(void) { int i; for (i=0; i<10; i++) printf(“%d ”,i); return(0); }

1. #include <stdlib.h> #include <stdio.h> int main(void) { int i; i=0; while (i<10) { printf(“%d ”,i); } return(0); }

1. #include <stdlib.h> #include <stdio.h> int main(void) { int i; i=0; do { printf(“%d ”,i); } while (i<10); return(0); }

3.3
• • •

Comando de Desvio
Na linguagem C há quatro comandos que realizam um desvio incondicional:

return: É usado para retorno de uma função. A função será finalizada tão logo encontre o primeiro return; goto: É um comando de desvio que deve ser utilizado com precaução pois pode causar vazamento do fluxo de informação; break: Este comando possui duas formas de uso. A primeira é utilizada para terminar um case em um comando switch. A segunda forma é utilizada para forçar uma terminação imediata de um laço. O comando break provoca uma saída apenas do laço mais interno;

• •

exit: Este comando provoca uma terminação imediata do programa inteiro, forçando um retorno ao sistema operacional; continue: É um comando similar ao break porém em vez de forçar a terminação do laço, continue força que ocorra a próxima iteração do laço, pulando qualquer código intermediário. Para o laço for, continue faz com que o teste condicional e a porção de incremento do laço sejam executados. Para os laços while e do-while, o controle do programa passa para o teste condicional.

return (<expressão>);

goto <rótulo>; ... <rótulo>:

void exit(int codigo_de_retorno);

27

1. #include <stdlib.h> #include <stdio.h> int main(void) { int x; x=1; volta1: x++; if (x<50) { printf(”%d\n”,x); goto volta1; } return(0); }

1. #include <stdlib.h> #include <stdio.h> int main(void) { int x; for (x=0; x<50; x++) { printf(”%d\n”,x); if (x==25) break; } return(0); }

1. #include <stdlib.h> #include <stdio.h> int main(void) { char s[80], *str; int esp; printf("Digite uma string:"); gets(s); str=s; for (espaco=0; *str; str++) { if (*str!=' ') continue; esp++; } printf("%d espacos\n", esp); return (0); }

3.4
por exemplo:

Outros Comandos
Um comando de expressão é uma expressão válida em C seguida por ponto-e-vírgula,

soma(); /* Chamada de função */ a=sqrt(pow(b,2)+pow(c,2)); /* Comando de atribuição */ b+raiz(z); /* Comando válido, que não faz nada */ ; /* Comando vazio */

28

). y).234. permite a leitura e a escrita de dados em vários formatos.2f\n’. 3.4. O scanf() também é uma função de I/O implementada em todos compiladores C. isto é. calcule e mostre a média aritmética dessas notas. c). ENTRADA E SAÍDA As funções printf() e scanf() realizam entrada e saída formatada. Faça um programa que receba três notas e seus respectivos pesos. Faça um programa que receba três notas. float y. y=19. int x. Ela é o complemento de printf() e nos permite ler dados formatados (tabela 4. #include <stdlib.. printf(’%. 29 .1 Exercícios 1.3f\n’.1f\n’. int scanf(const char *str. O printf() é uma função de I/O. . Sua sintaxe é similar a printf().h> #include <stdio. As notas deverão estar na faixa entre 0 e 10. y). c=’d’. Código %c %d %i %e %f %o %s %u %x %p 1. } Formato Caractere Inteiros decimais com sinal Inteiros decimais com sinal Notação científica Ponto flutuante decimal Octal sem sinal String de caracteres Inteiros decimais sem sinal Hexadecimal sem sinal Apresenta um ponteiro 4. que permite escrever no dispositivo padrão (tela). y). . calcule e mostre a média ponderada dessas notas. y).1) da entrada padrão (teclado). Cada argumento deve ser separado por vírgula..1 Comandos de formato para printf() e scanf(). printf(’%f\n’. A expressão de controle pode conter caracteres que serão exibidos na tela e os códigos de formatação (tabela 3.. printf(’%. return(0). printf(’%d\n’. int printf(const char *str. x). Faça um programa que receba três números inteiros.h> int main(void) { char c.).. printf(’%.1) que indicam o formato em que os argumentos devem ser impressos. printf(’%c\n’. x=c. Tabela 4. calcule e mostre a soma desses números. 2.

8. calcule e mostre um elevado ao outro. c) O imposto eqüivale a 3% do salário bruto. Sabe-se que: Área = π * R2. 9. Sabe-se que cada operação bancária de retirada paga CPMF de 0. Sabe-se que: Área = (base * altura)/2. Faça um programa que receba dois números maiores que zero. Faça um programa que calcule e mostre a tabuada de um número digitado pelo usuário. ou seja. Faça um programa que receba um número positivo e maior que zero. 30 . 14. Faça um programa que calcule e mostre a área de um triângulo. Faça um programa que calcule e mostre a área de um trapézio. 10. 11. Pedro comprou um saco de ração com peso em quilos. (π=3. Faça um programa que calcule e mostre a área de um círculo. 5. Um trabalhador recebeu seu salário e o depositou em sua conta corrente bancária. Pedro possui dois gatos para os quais fornece a quantidade de ração em gramas. Sabe-se que: Área = (diagonal maior * diagonal menor)/2.38% e o saldo inicial da conta está zerado. Calcule e mostre o salário a receber seguindo as regras abaixo: a) A hora trabalhada vale a metade do salário mínimo. Faça um programa que receba o número de horas trabalhadas e o valor do salário mínimo. b) O número digitado ao cubo. Elabore um programa que apresente os lançamentos.14) 7. 6. o total de impostos descontados e o saldo atual. Faça um programa que receba o peso do saco de ração e a quantidade de ração fornecida para cada gato. 15. d) O salário a receber eqüivale ao salário bruto menos o imposto. Esse trabalhador emitiu dois cheques e agora deseja saber seu saldo atual. calcule e mostre: a) O número digitado ao quadrado. Faça um programa que receba o valor de um depósito e o valor da taxa de juros. b) O salário bruto equivalente ao número de horas trabalhadas multiplicado pelo valor da hora trabalhada.4. Calcule e mostre quanto restará de ração no saco após cinco dias. 13. calcule e mostre o valor do rendimento e o valor total depois do rendimento. Faça um programa para calcular a área de um triângulo. Esse programa não pode permitir a entrada de dados inválidos. medidas menores ou iguais a 0. c) a raiz quadrada do número digitado. Sabe-se que: Área = ((base maior + base menor)*altura)/2. Faça um programa que calcule e mostre a área de um losango. 12.

c) O valor (R$) a ser pago com desconto de 15%.0 < media CONCEITO A B C D E 23. sem se preocupar com a altura do usuário.0< media <= 7. Para alunos de exame.0 <= media < 7. a avaliação semestral e a um exame final. Faça um programa que receba o salário-base de um funcionário. calcule e mostre o salário a receber. Faça um programa que receba as três notas. calcule e mostre a média ponderada e o conceito que segue a tabela abaixo. Calcule e mostre quantos degraus o usuário deverá subir para atingir seu objetivo. Faça um programa que receba três números e mostre-os em ordem crescente. Sabe-se que um quilowatt de energia custa um quinto do salário mínimo.0 < media <= 6.0 < media <= 5. calcule e mostre a nota que deverá ser tirada no exame para a aprovação. A média das três notas mencionadas anteriormente obedece aos pesos a seguir: NOTA Trabalho de laboratório Avaliação semestral Exame final PESO 2 3 5 22.0 5.0 <= media <= 8. Faça um programa que receba dois números e mostre o maior. Faça um programa que receba três notas de um aluno. MÉDIA ARITMÉTICA 3.0 > media 3. Cada degrau de uma escada tem X de altura.0 8. Faça um programa que receba o salário de um funcionário e o percentual de aumento. 21.16. considerando que a média no exame é 6.0 <= media MENSAGEM Reprovado Exame Aprovado 24. Faça um programa que receba essa altura e a altura que o usuário deseja alcançar subindo a escada. 17. calcule e mostre o valor do aumento e o novo salário. MÉDIA PONDERADA 10. b) O valor (R$) a ser pago por essa residência. 19. 18. calcule e mostre o novo preço sabendo-se que este sofreu um desconto de 10%. Faça um programa que receba o preço de um produto.0. A nota final de um estudante é calculada a partir de três notas atribuídas respectivamente a um trabalho de laboratório.0 7. sabendo-se que esse funcionário tem gratificação de 5% sobre o salário-base e paga imposto de 7% sobre o salário-base. Calcule e mostre: a) O valor (R$) de cada quilowatt. 20.0 7. Faça um programa que receba o valor do salário mínimo e a quantidade de quilowatts consumida por uma residência. calcule e mostre a médias aritmética e a mensagem que segue a tabela abaixo..0 6. 25. 31 .

um de cada vez. 31. Se m for ímpar.26. 32 . f ( x) = a * x 2 + b * x + c f ( x) = 0 ∆ = b2 − 4 * a * c x1. Faça um programa que receba o salário de um funcionário. Faça um programa que receba três números inteiros em ordem crescente e um quarto número também inteiro que não siga esta regra. onde o primeiro representa o dia.00 e R$ 1200. Se m for par.00 Entre R$ 500. Faça um programa que determine a data cronologicamente maior de duas datas fornecidas pelo usuário. Faça um programa que receba um número inteiro e verifique se esse número é par ou ímpar. calcule a soma dos números inteiros de 1 até m (m não deve entrar nos cálculos). Mostre os cálculos realizados.00 Mais que R$ 600. verifique quantos divisores possui. Faça um programa que receba o código correspondente ao cargo de um funcionário e seu salário atual e mostre o cargo. Elabore um programa que calcule as raízes de uma equação a segundo grau. Deve-se verificar se os três primeiros números estão em ordem crescente 27. SALÁRIO Até R$ 500.00 33. 2 = −b± ∆ 2*a 29. os quatro números em ordem decrescente. Os cargos estão na tabela a seguir: CÓDIGO 1 2 3 4 5 CARGO Escriturário Secretário Caixa Gerente Diretor PERCENTUAL 50% 35% 20% 10% Não tem aumento 32.00 AUXÍLIO-ESCOLA R$ 150. o segundo o mês e o terceiro o ano. Menu de opções: 1: Somar dois números 2: Raiz quadrada de um número Digite a opção desejada: 30. Faça um programa que leia um número indeterminado de valores para m. calcule e mostre o novo salário desse funcionário.00 BONIFICAÇÃO 5% 12% Sem bonificação SALÁRIO Até R$ 600. o valor do aumento e seu novo salário. 28.00 Acima de R$ 1200. Faça um programa que mostre o menu de opções a seguir. Cada data deve ser fornecida por três valores inteiros. em seguida. acrescido de bonificação e de auxílio-escola. receba a opção do usuário e os dados necessários para executar cada operação. todos inteiros e positivos.00 R$ 100. Mostre.

. * 3 * 2 *1 se n = 1 : n! = 1!= 1 se n = 0 : n! = 0!= 1 35. a altura de uma pessoa em metros e retorne o comprimento da sombra dessa pessoa conforme a figura abaixo. se n > 1 : n! = n * (n − 1) * (n − 2) * . 43... Faça um programa que mostre os primeiros 50 números múltiplos de 3 iniciando de 3.. 0 − 1 − 1 − 2 − 3 − 5 − 8 − 13 − 21 − 34 − 55 − . calcule e mostre o valor da série a seguir: S = 1+ x 2 x3 x 4 x5 x 6 x 7 x8 x n−1 + + + + + + + . + 1! 2! 3! 4! 5! 6! 7! n! 36. 37.. calcule e mostre o valor da série a seguir: S= x1 x 2 x 3 x 4 x 5 x 6 x 7 xn + + + + + + + .. 39. 40. Faça um programa que calcule o fatorial de um número inteiro fornecido pelo usuário. utilizando uma estrutura de repetição.. Faça um programa que calcule a soma dos primeiros 50 números ímpares iniciando de 3. Faça um programa que receba o ângulo de incidência dos raios solares. + 3! 4! 5! 6! 7! 8! 9! n! 38. Faça um programa que mostre os primeiros 50 números múltiplos de 2 iniciando de 2. Faça um programa que leia dois valores inteiros e positivos: x e y. calcule e mostre a potência xy.34. 41.. Faça um programa que monte os n primeiros termos da seqüência de Fibonacci. Faça um programa que leia o número de termos n e um valor positivo para x. 33 . Faça um programa que leia o número de termos e um valor positivo para X. Faça um programa que calcule a soma dos primeiros 50 números pares iniciando de 2. 42.

j. i++) for (j=0. 5.h> int main(void) { int v[10]. } for (i=0. ao último elemento. O endereço mais baixo ou índice (0) corresponde ao primeiro elemento e o mais alto.1 Exercícios 1. 19. a coluna. 15. scanf("%d".&v[i][j]). Os vetores são. 9.v[i]). 17.j).i. } return(0).v[i][j]). 9. } printf("\n"). i<10. 18. 13. 34 . Matrizes unidimensionais. A forma mais simples é a matriz bidimensional ou matriz linha-coluna. i.v[i]).h> int main(void) { int v[3][3]. 3. 6.%d]=". j<3. 12. 16. 17. VETORES E MATRIZES Matriz é uma coleção de variáveis do mesmo tipo referenciada por um nome comum. #include <stdlib.i . Matrizes multidimensionais são matrizes que possuem duas ou mais dimensões. 7. 6. 18. 1. for (j=0. 16.h> #include <stdio. 14. ou vetores. printf("v[%d]=%d\n".1 . listas de informações do mesmo tipo. calcule e mostre uma matriz resultante que será a matriz digitada multiplicada pelo maior elemento da matriz.&v[i]). #include <stdlib. for (i=0. i<3. i. scanf("%d". 22. Figura 5. i++) { printf("Endereco: %p.5. 4. ". que são armazenadas em posições contíguas da memória em uma ordem de índice. 13. } for (i=0. } 5.1 apresenta um exemplo de matriz unidimensional. 3. i<10. 14. return(0). 7. 8. 4. i++) { printf("\n"). 12. 15.i). onde o primeiro índice indica a linha e o segundo. 11. Faça um programa que carregue uma matriz 2x2. 11. A figura 5. As matrizes podem possuir várias dimensões. O acesso aos elementos é realizado mediante um índice ou pelo endereço.h> #include <stdio. i++) { printf("Digite v[%d]=". 2. 21.Exemplo notação de complemento de dois. Considerando-se que cada bloco armazena um único caractere. 10. j++) { printf("Digite [%d. 5. 8. são matrizes que possuem apenas uma dimensão. for (i=0. essencialmente. a matriz no exemplo pode armazenar nove caracteres seqüenciais. j<3. 10. j++) printf("%d ". } 2. 20. i<3.

Faça um programa que carregue uma matriz 8x8 com números inteiros e mostre a quantidade de números pares e ímpares. 35 . coluna). • • • • A linha 2 com a linha 8. mostre quantos alunos tiveram menor nota na prova 1. 5. Ao final do relatório. calcule e mostre quantos elementos dessa matriz são maiores que 30 e. Faça um programa que carregue uma matriz 8x8 com números reais. Mostre um relatório com o número do aluno (número da linha) e a prova em que cada aluno obteve menor nota. 3.2. calcule a média de todos os elementos e mostre a quantidade de números que são maiores ou iguais a média e sua respectiva posição. Na teoria dos sistemas define-se o elemento MINMAX de uma matriz como sendo o maior elemento da linha onde se encontra o menor elemento da matriz. A coluna 4 com a coluna 10. Faça um programa que carregue uma matriz 10x10 com números inteiros. A diagonal principal com a diagonal secundária. 4. armazenando o resultado das somas em um vetor. A linha 5 com a coluna 10. armazenando-o em uma terceira matriz de ordem 4x2. 6. 11. No lugar do número 30 da segunda matriz coloque o número zero. mostre uma segunda matriz com os elementos diferentes de 30. Faça um programa que carregue uma matriz 6x4 com números inteiros. 9. calcule e mostre seu MINMAX e sua posição (linha e coluna). calcule e mostre quais os elementos da matriz que se repetem e quantas vezes cada um está repetido. em seguida. Faça um programa que carregue uma matriz 8x8 com números inteiros e mostre o maior e menor número com as respectivas posições (linha. quantos alunos tiveram menor nota na prova 2 e quantos alunos tiveram menor nota na prova 3. 8. calcule e mostre a matriz resultante do produto matricial das duas matrizes anteriores. multiplique cada elemento da matriz pela soma da linha e mostre a matriz resultante. Faça um programa que carregue uma matriz 10x20 com números inteiros e some cada uma das linhas. 7. Faça um programa que carregue uma matriz 10x3 com as notas de dez alunos em três provas. A seguir. Faça um programa que carregue uma matriz 4x7 com números reais. Faça um programa que carregue uma primeira matriz de ordem 4x5 e uma segunda matriz 5x2. 10. execute as trocas especificadas a seguir e mostre a matriz resultante. Faça um programa que carregue uma matriz 15x5 com números inteiros.

calcule a média aritmética dos elementos e mostre todos elementos maiores ou iguais à media e sua respectiva posição na matriz. Faça um programa que construa a tabela apresentada a seguir em uma matriz. Elabore um 36 . Elabore um programa que calcule o produto de duas matrizes de ordem 3. 15. verifique se há esse número no vetor. Faça um programa que leia um vetor de 20 números inteiros. 3 2  1 9 3 + 2 2 + 9  5 11  5 − 9 + 3 1 = 5 + 3 − 9 + 1 = 8 − 8         17. Emitir mensagem de erro se o código for inválido. a b  D=  = a *d − b*c c d  18. B e C. exiba o mês do ano correspondente de acordo com a tabela. Considere o triângulo de vértices A(2. B(5.12. Código 1 2 3 4 5 6 Mês Janeiro Fevereiro Março Abril Maio Junho Código 7 8 9 10 11 12 Mês Julho Agosto Setembro Outubro Novembro Dezembro 14.1). 13. Elabore um programa que calcule a soma e a subtração de duas matrizes A e B. Dado um número digitado pelo usuário. A área do triângulo ABC é calculada de acordo com a fórmula abaixo. onde a primeira coluna é formada pelas abscissas dos pontos A. Dado uma entrada do usuário. 16. onde D é a determinante da matriz de ordem 3. quantos números e em qual posição. x y D = a b  m n  z c  = x *b * p + y *c * m + z * a * n − z *b * m − x *c * n − y * a * p  p  19. 4) apresentado na figura a seguir. Elabore um programa que calcule a determinante de uma matriz de ordem 2. a segunda coluna é formada pelas respectivas ordenadas e a terceira coluna é unitária. Faça um programa que carregue uma matriz 5x5 de números reais. Elabore um programa que calcule a determinante de uma matriz de ordem 3. 2) e C(3.

37 . Numa matriz quadrada. B e C e calcule a área do triângulo. são pontos de uma mesma reta!!! a x  D = bx  cx  a y 1  by 1 c y 1  1 S ABC = * D 2 20. 21. Dada uma matriz A(mxn). a matriz que se obtém trocando ordenadamente as linhas pelas colunas chama-se transposta de A.programa que receba as coordenadas dos vértices A. e é indicada por At (ou por At). Elabore um programa que imprima os elementos da diagonal principal de qualquer matriz mxm. ATENÇÃO: Se a determinante D=0 então os três pontos não formam um triângulo. portanto. Elabore um programa que receba uma matriz A(3x2) e crie a matriz At. os elementos aij tais que i=j formam o que chamamos de diagonal principal da matriz.

calcule e mostre a quantidade de vezes que o caractere a aparece. 14.6. 19. 3.h> #include <stdio. MANIPULAÇÃO DE “STRINGS” String é uma cadeia de caracteres armazenadas uma matriz unidimensional (vetor) de caracteres finalizada pelo caractere nulo. } for (i=0. Faça um programa que receba uma palavra e inverta a ordem dos caracteres. deve-se declarar sempre o vetor com uma posição a mais para armazenar o caractere nulo. ou seja. Desta forma. return(0). 8.%s\n”.1 Exercícios 1. Faça um programa que receba uma palavra. 5. scanf(”%s”. i++) { printf(”Digite um nome:”). lista[i]). troque todas as vogais por * e apresente o resultado 4.h> #define MAX 10 #define LEN 31 char lista[MAX][LEN]. calcule e mostre a quantidade de vogais. Faça um programa que receba duas palavras e gere uma terceira que represente a combinação das duas anteriores. por meio de ‘\0’. 12. Faça um programa eu receba uma frase. Faça um programa que receba uma frase. O seguinte exemplo apresenta o uso de uma matriz de string. for (i=0. 5. 6.lista[i]). 8. 18. 9. 10. Para criar uma matriz de strings. 7. 9. 2. Faça um programa que receba uma palavra. Faça um programa que receba uma frase. 38 . Faça um programa que receba uma palavra. calcule e mostre a quantidade de vogais da frase digitada. 17. 2. 6. a seguinte instrução declara um vetor nome que guarda uma string de 10 caracteres: char nome[11]. isto é. 20. 13. #include <stdlib. indica o fim da string. 11. i++) printf(”%d . Faça um programa que receba uma palavra e coloque os caracteres em ordem crescente. } 6. calcule e mostre a quantidade de caracteres. i<MAX. Por exemplo. 1. 7. int main(void) { int i. 3. i<MAX. 4. utiliza-se uma matriz bidimensional de caracteres. i+1. 15. calcule e mostre a quantidade de consoantes da frase digitada. Em programação. é comum o uso de matrizes de string. 16.

pesquise e apresente se encontrado o nome (em que posição do vetor). 16. quais os caracteres existentes e a quantidade de cada caractere. 11. Caso a frase possua meses por extenso substitua-os pelo seu número correspondente. Faça um programa que receba uma frase e mostre a quantidade total de cada caractere na frase. Faça um programa que mostre a data do sistema nos seguintes formatos: “dia/mês/ano” e “São Paulo. 12. 14. 39 . Dado uma entrada do usuário. calcule e mostre a quantidade de palavras da frase digitada. 14 de setembro de 2001”. Faça um programa que armazene 10 nomes.10. 15. Faça um programa que armazene 10 nomes. Faça um programa que receba uma frase. Elabore um programa que receba uma frase e mostre a quantidade de palavras. 13. Faça um programa que receba uma frase.

1 Estruturas Estrutura (structure) é um tipo de dado formado por um conjunto de variáveis referenciadas por um nome. 7. printf("Ola %s!\n". printf("Digite seu nome: "). scanf("%s". ESTRUTURAS. 4. A referência ou o acesso a um determinado membro da estrutura é dado por uma construção do tipo para variáveis e ponteiros: <nome_da_estrutura>. z[5]. 17. 11. 40 . sobrenome[41]. A palavra struct define uma declaração. }*x. 15. int main(void) { x=&y. y.h> #include <stdio. 22. }. . y. As variáveis são denominadas membros da estrutura. <tipo> <variável_n>..<membro> <nome_da_estrutura>-><membro> 14.h> struct cliente { char nome[41]. 6. } Exemplo: 1. printf("Ola %s!\n". return(0). 12. 10.. char sobrenome[41]. 20. 8. }*x. scanf("%s". z[5]. 7. Em C é declarada uma estrutura da seguinte maneira: struct <nome_da_struct> { <tipo> <variável_1>. 5. ENUMERAÇÕES E UNIÕES A linguagem C permite criar tipos de dados utilizando: • • • Estruturas. 19. . As estruturas permitem organizar os dados na memória e estabelecer um inter-relacionamento entre os mesmo de modo que facilite a manipulação dos dados e ofereça maior clareza aos programas.nome). scanf("%s". x->nome). 18. char sobrenome[41]. cliente *x. &y. Uniões.nome). 16. struct cliente { char nome[41]. 3. }. 2. 9. <tipo> <variável_2>. &z[0]. 21. printf("Digite seu nome: "). printf("Digite seu nome: "). printf("Ola %s!\n". y. 23. 13. &x->nome). z[0].nome).. seguida do nome da estrutura e das respectivas variáveis delimitadas pelas chaves. struct cliente nome[41]. char sobrenome[41]. z[5].nome).7. Enumerações.. struct { char char }. #include <stdlib. A declaração de variáveis do tipo estrutura pode ser realizada da seguinte maneira: struct cliente { char nome[41]. y.

2 Enumerações Enumeração é um conjunto de constantes inteiras que especifica todos os valores legais que uma variável desse tipo pode ter. break. 29. 15. break. &dia). switch(dia) { case Segunda: printf("Segunda"). tanto o inteiro i como o caractere c compartilham a mesma porção de memória. 24. 3. case sexta: printf("sexta"). quarta. 26. } return(0). 7. 14. 19. }<variáveis union>. 16. domingo}. 30. 37. 9. case terca: printf("terca"). 22. o compilador cria automaticamente uma variável grande o bastante para conter o maior 41 . 10. int main(void) { enum dia_da_semana dia. sabado. break. scanf("%d". 34. 28. . 21. A definição e um exemplo é apresentada a seguir: union <identificador> { <tipo> <nome_da_vairável_01>.3 Uniões Uniões (union) é uma posição de memória que é compartilhada por duas ou mais variáveis diferentes. break. geralmente de tipos diferentes. 6. Porém i ocupa 2 bytes e c apenas 1 byte. 2.. 8. break. 33. printf("Digite um numero de 0 a 6:"). sexta. 32. 11. break.h> #include <stdlib. 31. 7. default: printf("Fora da faixa!\n"). 18. 25. 27. terca. 20. char c. union cliente { int i. <tipo> <nome_da_variável_n>.. Considere o seguinte exemplo: 1. Quando uma union é declarada. o mesmo endereço. 13. }. quinta. case sabado: printf("sabado"). } O valor do primeiro elemento do conjunto enum é 0. 38. 36. case quinta: printf("quinta"). 12. 17.7. 5. No exemplo acima. 23. 35. case quarta: printf("quarta"). break.h> enum dia_da_semana {Segunda. <tipo> <nome_da_vairável_02>. #include <stdio. case domingo: printf("domingo"). 4.

bairro. O relatorio deve 42 . 7. scanf("%f". scanf("%d". Considerando os exercícios 1 e 2. prontuário. 2. Elabore um programa que imprima as seguintes informações de 10 alunos de uma turma: nome. 19. 15. turma e data de nascimento. turma e data de nascimento. return(0). 11. Faça um programa de cadastro de clientes. 12. rg. Crie o menu de opções a seguir: Menu de opcoes: Cadastrar Visualizar todas as contas de um determinado cliente Excluir a conta com o menor saldo Sair Opcao?: 6.y). cidade. &W.tipo de variável da union. W. 16. printf("O endereco da variavel x e: %p\n".x). excluir um cliente do cadastro. Elabore um programa que leia um valor. sexo. numero. 6. int main(void) { printf("Digite um inteiro:"). ponto flutuante ou caractere. imprimir informações de um determinado cliente. 14. 10. &W. 2. W. Elabore um programa que armazene as seguintes informações de 10 alunos de uma turma: nome.x). nome do cliente e saldo. cep. sobrenome. estado civil. telefone. O banco permitirá o cadastramento de apenas 15 contas e não pode haver mais de uma conta com o mesmo número. 3. printf("Voce digiou inteiro %d\n". 3. }W. printf("Digite um ponto flutuante:"). 20.4 Exercícios 1. Este programa deve permitir a inserção de novos clientes. 18. editar dados de clientes cadastrados. #include <stdio. data de nascimento. 5. 5. Este valor pode ser inteiro. endereço. } 7. sobrenome. 4. elabore um programa que edite as informações de um determinado aluno escolhido pelo usuário. Faça um programa que realize o cadastro de contas bancárias com as seguintes informações: número da conta. 17. &W. fax e celular. 4. 9.h> #include <stdlib. 8. São necessários as seguintes informações do cliente: nome.y). sobrenome.h> union tipoespecial { int x. float y. &W. complemento. A utilização de union pode ajudar na produção de código portáveis e na utilização de conversões de tipos. prontuário. 1. 21. 13.x). printf("O endereco da variavel y e: %p\n". printf("Voce digiou ponto flutuante %f\n". estado. pesquisar clientes e relatorio.y).

ano. com legenda ou sem legenda. drama. Este programa deve permitir a inserção de novas fitas. categoria (comédia. São necessários as seguintes informações das fitas de vídeo: título.calcular a média de idade. quantos são solteiros(as). 43 . idioma. pesquisar e imprimir informações de uma determinada fita. 7. quantos são do sexo masculino e feminino. descrição e quantidade disponível. Faça um programa que gerencie uma locadora de vídeo. listar as cidades e a respectiva quantidade de clientes por cidade. editar informações de fitas. ação. diretor. documentário ou infantil). quantos divorciados(as). quantos são casados(as) .

A forma geral para declarar uma variável ponteiro é: <tipo> *<nome_do_ponteiro>. O segundo loop (for) o ponteiro q é do tipo é double (8 bytes).p).” Em geral.h> int main(void) { float *p. Existem dois operadores especiais para ponteiros: * = ”No endereço de. 16. 13. 5. 44 . v[5]. o ponteiro p é incrementado. Considerando-se o seguinte exemplo: 1.. } return 0. O mesmo ocorre com as demais iterações. É importante declarar o ponteiro corretamente pois de acordo com o tipo base pode ser realizado a aritmética de ponteiros.h> #include <stdlib. 9. PONTEIROS Ponteiros são variáveis que contém um endereço de memória. p++. Um ponteiro pode armazenar a posição de uma variável de dado. #include <stdio..p). No primeira iteração do primeiro loop (for). 2. logo. i<5. 11.” & = ”O endereço de. float *p O tipo base do ponteiro define que tipo de variáveis o ponteiro pode apontar. o novo valor é o antigo mais 4 bytes (0063FDE4 + 4 = 0063FDE8).8.. 3. 8. int i. 10. 6.. p=&v[0]. soma-se 8 bytes. 14. 4. Existem apenas duas operações aritméticas que podem ser usadas com ponteiros: adição e subtração. Sendo p um ponteiro para ponto flutuante (float). 15. as expressões envolvendo ponteiros concordam com as mesmas regras de qualquer outra expressão de C. isto é. printf("p armazenou endereco %p\n". Após um ponteiro ser declarado o ponteiro possui um valor desconhecido. } O ponteiro p armazena inicialmente o primeiro byte do vetor v (Hexa 0063FDE4). Portanto é necessário atribuir um valor antes de utilizá-lo. for (i=0. ao ser incrementado. um trecho de código executável ou ainda outro ponteiro. armazenam a posição de uma outra variável na memória. i++) { printf("O endereco armazenado e %p\n". 7. 12.

*r=&j. apresente o conteúdo e o endereço de cada posição do vetor. 7. *r. 9. calcule e mostre o maior e o menor número. int j. 1. Considere o trecho de código a seguir e responda se as seguintes expressões são construções válidas ou inválida. 3.. *s=*r. s=k[0]. .. 10. 6. s=&k[0]. *s=k[5]. 3. 2. 2. 5. 4. *s. . 8. 45 . *s=k.. Utilize um ponteiro. k[10]. *r=j. r=&j. s=k. Justifique cada uma delas.8. r=j.1 Exercícios 1. Elabore um programa que leia três números.. Elabore um programa que um vetor de 10 números reais. Utilize um ponteiro.

10. "Erro quatro\n". 24. 23.1 Vetores e Matrizes de Ponteiros Ponteiros podem ser organizados em matrizes como qualquer outro tipo de dado. x=*(p+10). p=&v[0]. i. i. 9.9. Em seguida é atribuído ao ponteiro p a posição 0 da variável vetor str.h> int main(void) { int *p. 9. 5. i++) mostra_erro(i). 6. } 46 . é: int *x[10]. Para x receber o conteúdo do vetor str posição 10. 3. 8. i++) printf("O endereco de p[%d] e: %p\n". i<10.h> #include <stdio. 14. 21. "Erro tres\n". #include <stdlib. as seguintes expressões são válidas: x=str[10]. for (i=0. 19. Por exemplo. 15. i<5. printf("p armazenou endereco %p\n". i++) printf("O endereco de p+%d e: %p\n". 13. 3.h> #include <stdlib. } void mostra_erro(int num) { /*Inicia um vetor de ponteiros*/ char *erro[]= { "Erro zero\n". erro[num]). VETORES E MATRIZES Ponteiros e matrizes possuem uma estreita relação. 8. i<10. return(0). }. de tamanho 10. 20. Considere o seguinte exemplo: 1. 18. 14. Exemplo: 1. 7. 26. 7. 15. 2. v[10]. 10. As duas expressões retornam o valor do décimo primeiro elemento do vetor str. 25. PONTEIROS. i. 4. 17. return 0. 2. 5. é criado um vetor tipo char e um ponteiro para char. p+i). &p[i]). A linguagem C permite o acesso aos elementos de uma matriz de duas formas: aritmética de ponteiros e indexação de matrizes. 16. 13. 11. 22. } 9. 4.h> void mostra_erro(int num). 12. int main(void) { int i. #include <stdio. 6. 12. printf("%s". for(i=0. "Erro um\n". for (i=0. "Erro dois\n". A declaração de uma matriz de ponteiros int. 11.p). printf("\n\n").

2. Use ponteiros. Utilize ponteiro. Faça um programa que carregue um vetor 10 de números reais. 47 . calcule a média aritmética dos elementos e mostre todos elementos maiores ou iguais à media e sua respectiva posição na vetor.9.2 Exercícios 1. Escreva um programa que inverta a ordem dos caracteres de uma cadeia de caracteres.

Isto implica que quaisquer alterações no parâmetro afetam a variável usada para chamar a rotina. 24. portanto. 2.. Os argumentos podem ser passados de duas maneiras: • Chamada por Valor: Este método faz uma cópia do valor de um argumento no parâmetro formal. O escopo da função é a porção de código e dados (variáveis locais) que constitui o corpo da função que é oculto do resto do programa. #include <stdio. A forma geral de uma função é: <Tipo_de_retorno> <nome_da_função>(<lista de parâmetros>) { <Corpo da Função> } OBS: <lista de parâmetros> = <tipo> <Var1>. return(0). O endereço de uma função é o ponto de entrada da função. z).h> #include <stdlib. <tipo> <Var2>. 28. return(x).10. 17. Quando é feita 48 . 6. y. 8. 3. printf(”Chamada por Referencia:\n”). printf(”y=%f. z=valor(y). 13. quaisquer alterações feitas no parâmetro não têm nenhum efeito nas variáveis usadas para chamá-la. não pode afetar ou ser afetado por outras partes do programa. 7. 4. z). z=%f\n”. Os argumentos são chamados de parâmetros formais da função. <tipo> <Varn> Cada função é um bloco discreto de código. o código fonte é transformado em código objeto e um ponto de entrada é estabelecido. . printf(”Chamada por valor:\n”). } float referencia(float *x) { x=x*x. 10. 19. 22. 21. float referencia(float *x). printf(”y=%f. 16. 25. z=valor(y). int main(void) { float y=10. FUNÇÕES Funções são blocos de construção em C. 23. • Chamada por Referência: Este método o endereço do argumento é copiado para o parâmetro formal. 15. 26. 14. 1.. a menos que utilize variáveis ou dados globais. 20. } 10. um ponteiro de função pode ser usado para chamar uma função. 9. 5. 27. Desta forma. } 18. 11. return(x). exceto por meio de uma chamada de função. São variáveis locais que pertencem à função e são criadas na entrada e destruídas na saída.1 Ponteiros para Funções As variáveis possuem uma posição física na memória assim como o próprio código executável do programa. z=%f\n”. float valor(float x) { x=x*x. y.h> float valor(float x).z. 12. sendo que é privativo à função e não pode ser acessado por nenhum comando em uma outra função. Quando uma função é compilada. portanto..

int main(void) { int i. uma função que chama a si mesma repetidamente um número finito de vezes. 14. answer. 34. 31. 19.h> #include <stdio. 22. 33. 26. } 10. isto é. 24. 1. i++) p(i). void mostra_erro1(int num) { char *erro[]= { "Primeiro Erro zero\n". } void mostra_erro2(int num) { char *erro[]= { "Segundo Erro zero\n". é efetuada uma chamada em linguagem de máquina para o endereço desse ponto de entrada. "Segundo Erro um\n". 13. enquanto o programa está sendo executado. funções podem chamar a si mesmas. 43. 42. 27. printf("%s". 28. A recursão é o processo é o processo de definir algo em termos de si mesmo.. i<5. void (*p)(int). erro[num]). 16. i++) p(i). 8. p). "Primeiro Erro dois\n". 23. } 21. printf("End. 20. 15. A recursividade talvez seja a mais importante vantagem das funções em C. i<5. da funcao: %p\n". Não existe ganho de velocidade ou espaço de memória significativo com o uso de funções recursivas. 25. 38. 9. 37. Um exemplo não recursivo: int fact(int n) { int t. 4. "Segundo Erro dois\n". Por exemplo: O cálculo do fatorial de um número é definido pela seguinte expressão: n! = n * ( n − 1) * ( n − 2) * .. } /*Declaração das variáveis t e answer*/ /*retorna answer*/ Um exemplo recursivo: 49 . printf("%s". p). for (t=1.uma chamada de função. "Primeiro Erro um\n". 12. 17. 6.2 Recursividade Em C. 39. 45. 5. 29. t<=n. #include <stdlib. "Primeiro Erro quatro\n". p=mostra_erro2. t++) answer=answer*(t). p=mostra_erro1. Uma propriedade dos fatoriais é: n! = n * ( n − 1)! Uma função recursiva cria a cada chamada um novo conjunto de variáveis locais. A principal vantagem das funções recursivas é que pode ser utilizadas para criar versões mais claras e simples de vários algoritmos. 2. 7. 10. }. 3. return(answer). 11. Este recurso é muito útil em alguns tipos de algoritmos chamados de algoritmos recursivos. * 3 * 2 * 1 5! = 4 * 3 * 2 * 1 = 4 * 3! onde n é o número inteiro positivo. printf("End. 35. 32. }. 41. return 0. 30. A função é recursiva se um comando no corpo da função a chama.h> void mostra_erro1(int num). 44. "Segundo Erro quatro\n". void mostra_erro2(int num). answer=1. 36. for(i=0. "Segundo Erro tres\n". for(i=0. erro[num]). 40. 18. "Primeiro Erro tres\n". da funcao: %p\n".

5. return(answer). i++) printf(" argv[%d]: %s\n". if (n==1) return(1). 10. 8. return(0). argv[i]). answer=fact_r(n-1)*n. A função gets() não testa limites na matriz em que é chamada. 5. #include <stdio. } 1. else printf(”Ola %s!\n”. printf("These are the %d command-line arguments passed to main:\n\n". 6. 7. 1. Sintaxe (conio. i. char * argv[]) { int i. 11.h> int main(int argc.h> int main(void) { char string[80]. 7. 3. 8. printf("The value of argc is %d \n\n". 6. printf("Input a string:"). for (i = 0.4 Funções de String Função gets(): É utilizada para leitura de uma string através do dispositivo padrão.h> int main(int argc. até que o ENTER seja pressionado. #include <stdio. printf("\nThe environment string(s) on this system are:\n\n"). Um argumento da linha de comando é a informação que segue o nome do programa na linha de comando do sistema operacional. argc). 2. } 10. argv[1]). 9. return(0). 6. 5. } /*Declaração das variáveis t e answer*/ /*retorna answer*/ 10.h> #include <stdlib. 2. 8.h): char *gets(char *str). 3. 4. i < argc. Ele é sempre pelo menos 1 porque o nome do programa é qualificado como primeiro argumento. 2. O parâmetro argv é um ponteiro para uma matriz de ponteiros para caractere. 4.int fact_r(int n) { int t.h> #include <stdlib. answer. 7. int main(int argc. char* argv[]) O parâmetro argc contém o número de argumentos da linha de comando. argc).3 Função main A função main pode aceitar parâmetros via argumentos da linha de comando. 9. 3. 11. #include <stdlib. 10.h> #include <stdio. gets(string). 12. 50 . 1. 4. 13. Cada elemento nessa matriz aponta para o argumento da linha de comando. Há dois argumentos internos especiais: argc e argv. char * argv[]) { if (argc!=2) prinf(”Voce esqueceu de digitar seu nome\n”).

11.h> #include <stdio. Reconhece os códigos de barra invertida. return(0). return(0). 1. const char *origem).h): char *strcpy(char *destino.h> #include <stdio. 1. const char *str2). return(0). char *str1 = "abcdefghi". string). printf("%s\n". 2.h> int main(void) { char *buf1 = "aaa". 10. s1). 1. Sintaxe (stdio. 9. 10.h> int main(void) { char s1[80]. } Função strcat(): Concatena duas strings. gets(s2). } Função strcpy(): Copia o conteúdo de uma string. 2. str1).9. 12. 7.h): int strcmp(const char *str1. #include <stdlib. const char *str2). 2. se forem iguais devolve 0. 6. Sintaxe (string.h): char *strcat(char *str1. 5. 3. 5. 11. 4. printf("The string input was: %s\n". #include <stdlib. 8. s2[80]. 7.h> #include <stdio. Sintaxe (string. Do contrário se str1 < str2. s2). 13. coloca um '\n' no final.h): int puts(const char *str). 1. 4. 5. } Função puts(): Escreve o seu argumento no dispositivo padrão de saída (vídeo). 4. Não verifica tamanho. printf("%s\n". return(0).h> #include <stdio. 3. 6. devolve < 0. *buf2 = "bbb". strcat(s2. *buf3 = "ccc". #include <stdlib. string).h> int main(void) { char string[] = "This is an example output string\n". 8. 3. 4. 10.h> int main(void) { char string[10]. strcpy(string. #include <stdlib. 6. 9. 2. 7. puts(string). Se str1 > str2. } Função strcmp(): Compara duas strings. 5. 6. Sintaxe (string. 8. devolve > 0. 3. 9. gets(s1). 11. 51 .

return(0). result). 4. 8. 6. 12.h> #include <math. 11.h> #include <stdio. 2. 9. 14. is less than buffer 1\n"). 9. 4. printf("The arc tangent of %lf is %lf\n".5. x. 5. 3. if (ptr > 0) printf("buffer 2 else printf("buffer 2 ptr = strcmp(buf2. 3. 10. double x = 0. #include <stdlib. 16. 8.h): double acos(double arg).h): double asin(double arg). result = acos(x). 2. result = asin(x). 5. 1.h> int main(void) { double result. 7. } 52 .h> #include <stdio. 8. printf("The arc cosine of %lf is %lf\n".5.h): double atan(double arg). ptr = strcmp(buf2. 6.h> int main(void) { double result. 12. 8.7. #include <stdlib. 9. buf3). Sintaxe (math. 2. 11. #include <stdlib. Sintaxe (math. double x = 0. 3. 13. } Função atan(): Devolve o arco tangente do argumento. Sintaxe (math. if (ptr > 0) printf("buffer 2 else printf("buffer 2 return(0). 7. is greater than buffer 3\n"). 12. 7. result). result = atan(x).h> #include <math. 10. } int ptr. buf1). } Função asin(): Devolve o arco seno do argumento. result). 9.h> int main(void) { double result. return(0). 17. 19. double x = 0. is less than buffer 3\n"). 4. 1. 10. x. 18.5.h> #include <stdio. 15. return(0). 6. 5. 1. 11. 12. 11. 10.h> #include <math.5 Funções Matemáticas Função acos(): Devolve o arco co-seno do argumento. 10. is greater than buffer 1\n"). 20. printf("The arc sin of %lf is %lf\n". x.

printf("The tan of %lf is %lf\n". Sintaxe (math. 10. x. x = 0. 9.h> #include <math. 3. 5. return(0).h> int main(void) { double result.Função cos(): Devolve o co-seno do argumento.h): double sin(double arg). #include <stdlib. 5. 8. 7. #include <stdlib. 11. 11. x. x. result = sin(x). printf("'e' raised to the power of %lf (e ^ %lf) = %lf\n". } Função exp(): Devolve o logaritmo natural e elevado à potência arg.h> #include <stdio. result = cos(x). 9. 6. return(0). 8. 6. result). 9.h> int main(void) { double result. 10.h): double exp(double arg). 11.5. result = exp(x). 1.h> #include <stdio. 7. 2. } Função tan(): Devolve a tangente do argumento. x. 6. return(0).5. 10. result).0. printf("The sin of %lf is %lf\n".h> #include <stdio. return(0). 2. #include <stdlib. 3. 4. 1. 7. x = 0. 5. } Função sin(): Devolve o seno do argumento. Sintaxe (math. 3.h> int main(void) { double result. 8.h> #include <math. 7. 1. Sintaxe (math. #include <stdlib. result). 1. 8.h> #include <math.h> int main(void) { double result.h> #include <stdio. 2. double x = 0. printf("The cosine of %lf is %lf\n". } 53 . result = tan(x). result).h): double tan(double arg).h): double cos(double arg).h> #include <math. 10. x. 6. 4. double x = 4. 4. 11. 12.5. 12. 4. Sintaxe (math. 2. 9. 5. 3.

2. 12.h> int main(void) { float number = -1234. 6. fabs(number)). y. y = 3. } #include <stdlib.0. double expoente). 7. 3. Sintaxe (math. double x = 8. #include <stdlib. 1.h): double fmod(double x. pow(x.h> int main(void) { double x = 5. 3.h> #include <stdio.h> #include <stdio. #include <stdlib. 5. 12. 11. } Função log(): Devolve o logaritmo natural do argumento.h> #include <stdio. return(0).h> int main(void) { double result. Sintaxe (math. 9. 4.0. x.h> #include <math. x. 8. 8. Sintaxe (math. result = log(x). 10. printf("%lf raised to %lf is %lf\n". 1. y. 11.h): double fabs(double arg). 6. 7. 1. 9. #include <stdlib. 3. 4. 2. 8.h): double pow(double base. double y). } Função fmod(): Devolve o resto de x/y. 5.h> #include <math. 1. Sintaxe (math. number. 1.h> #include <stdio. 4. printf("number: %f absolute value: %f\n".y).0. 6. return(0). 7. 3. 10.h> #include <math. result = fmod(x. result). y = 2. } Função pow(): Devolve base elevada à potência. result).h): double log(double arg).0. 5.h> #include <stdio. 10.h> #include <math. printf("The remainder of (%lf / %lf) is %lf\n". 9. 6.Função fabs(): Devolve o valor absoluto do argumento. 7. 4.6872. 5. return(0).0. double result.h> int main(void) 54 . 5. return(0). #include <stdlib.h> int main(void) { double x = 2. y)). printf("The natural log of %lf is %lf\n". 3. 9. 4. 2. 2. 8.h> #include <math. x. 10. 2.

h> #include <stdio. time(&t). 10. return(0). 6. y.0. 9.h> #include <time. 3. 5.h> #include <time. return(0). result. 2. #include <stdlib.h> #include <stdio. 8. 11.h): double sqrt(double arg).h> int main(void) { double x = 4. 1. double x = 2. 9. ctime(&t)). 9. { 7. Sintaxe (time. t = time(NULL). 4. 11.t). 4. 1970 is %ld".h): time_t time(time_t *time).0. #include <stdlib. 8.h): char *ctime(const time_t *time). } Função sqrt(): Devolve a raiz quadrada do argumento.6. return(0). 2. y = 3. #include <stdlib. printf("Hoje é: %s\n". } Função ctime(): Devolve um ponteiro para o horário de calendário na forma: dia mês ano horas:minutos:segundos ano \n\0 Sintaxe (time. 5. 3.h> #include <stdio. result). 3. exp(y*log(x))).h> #include <math. 7. 7. result = sqrt(x). 1. 8. 10.0. 11.6 Funções de Hora e Data Função time(): Devolve o horário atual de calendário do sistema. return(0). printf("The number of seconds since January 1. 10. 2. x. 7. 9. 6. printf("%lf raised to %lf is %lf\n".h> int main(void) { time_t t. 4. Sintaxe (math. x.h> int main(void) { time_t t. 6. 8. 5. } 10. 1. 10. printf("The square root of %lf is %lf\n". } 55 .

rand() % 100). 1. ABC. printf("Dez números randômicos de 0 a 99\n\n"). Sintaxe (time. i++) printf("%d\n".7 Outras Funções Função randomize() e rand(): A função rand() devolve um número aleatório entre 0 e RAND_MAX. 6. 12. Elabore uma função que receba 10 números reais e a média. 4. Elabore uma função que receba 10 números reais e retorna a média aritmética. 11. Elabore uma função que aceita como parâmetro dois números reais e retorna a média aritmética. #include <stdlib. retornando o valor do desvio padrão. 9.h> int main(void) { int i. randomize(). int rand(void). 8. Elabore uma função que receba uma string e troque todos os caracteres ‘a’ por ‘@’. 56 . Elabore uma função que aceita como parâmetro dois catetos e retorna o valor da hipotenusa. 7. Elabore uma função que receba uma palavra (string) e retorna a quantidade de caracteres. 3.h>. µ= ∑X i =1 n i n 8. return(0).h e stdlib. i<10. 4. Elabore uma função que aceita como parâmetro 5 números reais e retorna o maior número.DEF . } 10. 7. A função randomize() inicia a geração de números aleatórios.h> #include <time. 13.h): void randomize(void).10.h> #include <stdio. for(i=0. 3.8 Exercícios 1. Elabore uma função que aceita como parâmetro o número do CPF e retorna 1 para válido e 0 para inválido. 5. 2. A constante RAND_MAX é definida na biblioteca <stdlib.GHI − JK S1 = A *10 + B * 9 + C * 8 + D * 7 + E * 6 + F * 5 + G * 4 + H * 3 + I * 2 d1 = 11 − ( S1 MOD 11) IF d1 >= 10 THEN Dígito _ 01 = 0 ELSE Dígito _ 01 = d1 S 2 = A *11 + B *10 + C * 9 + D * 8 + E * 7 + F * 6 + G * 5 + H * 4 + I * 3 + Dígito _ 01 * 2 d 2 = 11 − ( S 2 MOD 11) IF d 2 >= 10 THEN Dígito _ 02 = 0 ELSE Dígito _ 02 = d 2 IF J = Dígito _ 01 AND K = Dígito _ 02 THEN Válido ELSE Inválido 5. 10. 6. 2.

Elabore uma função que receba como parâmetro um número real e retorne o número elevado a potência 5. 14. 13. Elabore uma função que receba como parâmetro um número real e retorne 10% do valor. Elabore uma função que receba como parâmetro um número real e retorne a raiz quadrada. 12.σ= ∑ (X i =1 n i − µ) 2 n 9. Elabore uma função que receba como parâmetro um número inteiro e imprima o valor em extenso na tela. cotangente. 16. Elabore um programa e implemente as funções para o cálculo de: sen (a + b ) = sen (a )* cos(b ) + sen (a )* cos(b ) cos(a + b ) = cos(a )* cos(b ) − sen (a )* sen (b ) tg (a ) + tg (b ) tg (a + b ) = 1 − tg (a )* tg (b ) sen (2 * a ) = 2 * sen (a )* cos(a ) cos(2 * a ) = cos 2 (a ) − sen 2 (a ) sen (a − b ) = sen (a )* cos(b ) − sen (a )* cos(b ) cos(a − b ) = cos(a )* cos(b ) + sen (a )* sen (b ) tg (a ) − tg (b ) tg (a − b ) = 1 + tg (a )* tg (b ) cos(2 * a ) = 2 * cos 2 (a ) − 1 cos(2 * a ) = 1 − 2 * sen 2 (a ) 2 * tg (a ) tg (2 * a ) = 1 − tg 2 (a ) 57 . V = 4 * π * R3 3 10. 15. secante e cossecante de um ângulo α. Elabore um programa e implemente as funções para o cálculo da tangente. Elabore uma função que receba como parâmetro um número real e retorne o número elevado a potência 3. São apresentados as seguintes fórmulas da trigonometria. Elabore uma função que receba como parâmetro um raio de uma esfera e retorne o volume de acordo com a fórmula abaixo. São apresentados as seguintes fórmulas da trigonometria. sen α cos α cos α cotgα = sen α tgα = sec α = 1 cos α 1 sen α cos sec α = 17. 11. Elabore uma função que receba como parâmetro um número real e retorne o número elevado a potência 2.

Se P(x. o conjunto de pontos formado num plano cuja distância a C é igual a r é denominado circunferência de centro C. apresentem a equação da circunferência. dado o centro C e a distância r. os pontos em que a circunferência corta o eixo Ox e Oy. y) é um ponto qualquer da circunferência. e verificar se a circunferência passa pela origem. Dado um ponto C e uma distância r. Elabore funções que. a relação entre x e y é dada pela equação abaixo (equação da circunferência).18. 58 .

Função calloc() :Aceita como parâmetro num números de elementos de size bytes de memória e retorna um ponteiro para o bloco alocado (num*size) ou nulo (NULL) se indisponível. para o armazenamento da informação. As variáveis globais são alocadas em uma região pré-definida e as variáveis locais são alocadas em uma parte da memória definida como pilha. A figura 11.11. A segunda forma é através da alocação dinâmica. Existem duas maneiras fundamentais de um programa alocar memória do computador. 59 . cada variável recebe um endereçamento de memória e o respectivo tamanho. A primeira forma é através de variáveis locais e globais (alocação estática). Em C ANSI são definidos quatro funções: Função malloc() :Aceita como parâmetro size bytes de memória e retorna um ponteiro para o bloco alocado ou nulo (NULL) se indisponível. solicitar a alocação do espaço e utilizar convenientemente os dados.1 Utilização da memória de um programa. um programa em execução pode. Pilha Heap Variáveis Globais Código do Programa Figura 11. sempre que necessário e houver a disponibilidade de espaço em memória. void *malloc(size_t size). size_t size). Para este tipo de alocação necessita-se definir de antemão a quantidade de armazenamento necessária. ALOCAÇÃO DINÂMICA Um programa necessita de memória para armazenar informações. A alocação dinâmica é o processo de alocar espaço de memória do computador em tempo de execução. que é fixo durante todo o tempo de execução do programa.1 mostra conceitualmente como um programa utiliza a memória (a posição e o tamanho variam de acordo com o tipo de processador). O armazenamento é realizado em uma região de memória livre. ou heap. void *calloc(size_t num. isto é. ou seja.

Um ponteiro para o bloco de memória é devolvido porque realloc() pode precisar mover o bloco para aumentar seu tamanho. bairro. Por exemplo: void free(void *p).1 Exercícios 1. 11. 4. a memória apontada por p é liberada. size_t size). 16. 3. carregue. 19.Função realloc() :Aceita como parâmetro o ponteiro do bloco de memória já alocada e um novo tamanho size bytes. printf(”O endereço de y é %p\n”. realloc() aloca size bytes de memória e devolve um ponteiro para a memória alocada. numero. excluir um cliente do cadastro. cep. 12. } *y=10. printf(”O endereço do bloco alocado é %p\n”. 17. apresente o conteúdo e o endereço de cada posição do vetor.h> int main(void) { float *y. 2. 7. complemento. Este programa deve permitir a inserção de novos clientes. 1. } 11. 60 . leia. o conteúdo do bloco antigo é copiado para o novo bloco. endereço. calcule e mostre o maior e o menor número. void *realloc(void *p. Se isso ocorrer. pesquisar clientes e relatório. Faça um programa de cadastro de clientes. estado civil. Elabore um programa que aloque dinamicamente um vetor 10 de números reais. 8. Elabore um programa que aloque dinamicamente três números reais. 9. printf(”O conteúdo para que y aponta é %f\n”. if (!y) { printf(”Memória indisponível!\n”). 13. calcule a média aritmética dos elementos e mostre todos elementos maiores ou iguais à media e sua respectiva posição na vetor. free(y). imprimir informações de um determinado cliente. data de nascimento. fax e celular. 6. sobrenome. estado. São necessários as seguintes informações do cliente: nome. 4. telefone. Elabore um programa que aloque dinamicamente um vetor de 10 números reais. 3. 10. return(0).&y). Se p é nulo. carregue. editar dados de clientes cadastrados. Elabore um programa que aloque dinamicamente um vetor de n números reais. Função free() :Aceita como parâmetro o ponteiro do bloco de memória alocada e devolve ao heap. 5. rg. 2.h> #include <stdlib. calcule e apresente a média aritmética e o desvio padrão. exit(0). 18. y=(float*)malloc(sizeof(float)). Se size é zero. #include <stdio. sexo.*y).y). 15. cidade. 5. 14.

cliente). utilize um vetor de ponteiros (deve-se iniciar todos ponteiros com nulo). a média dos valores. quantos são solteiros(as). aloca-se dinamicamente um registro e atribui o endereço desse bloco a uma posição do vetor. juntamente com a descrição desse serviço e a data de sua realização. o nome do cliente que realizou o serviço mais caro. quantos são casados(as) . data. ao final. 61 . listar as cidades e a respectiva quantidade de clientes por cidade. • • • Para armazenar as informações dos clientes. Leia as informações sobre várias ordens de serviço e determine. Faça um programa contendo os serviços que uma oficina mecânica pode realizar: • • Ordem de serviço (número da OS.• relatório deve calcular a média de idade. Cada novo cliente. valor. serviço realizado. quantos divorciados(as). Criar também uma função para ordenar os clientes. quantos são do sexo masculino e feminino. 6.

Essa abstração é chamada de stream e o dispositivo real é chamado de arquivo. o sistema de E/S do C fornece um nível de abstração entre o programador e o dispositivo utilizado. enquanto o tipo FILE será discutido na próxima seção. O sistema de arquivos ANSI é composto de diversas funções para a manipulação de arquivos. o sistema de arquivos com buffer transforma-os em um dispositivo lógico chamado stream.12. Nem todos os arquivos apresentam os mesmos recursos.H é definida também a macro EOF (geralmente definida como –1). Isto é. Quando não for mais necessário trocar informações com o arquivo. desde um arquivo em disco até um terminal ou uma impressora. incluindo terminais. sendo tal valor devolvido quando uma função de entrada tenta ler além do final de um arquivo. O tipo size_t é essencialmente o mesmo que um unsigned. independente do dispositivo real sendo acessado. como o console. Em STDIO. a mesma função pode escrever dados em um arquivo em disco ou em algum outro dispositivo.1 “Streams” e Arquivos O sistema de E/S do C fornece ao programador uma interface consistente.H fornece protótipos para as funções de E/S e define também os tipos size_t e FILE. algumas das quais serão vistas no decorrer deste capítulo. Um stream é associado com um arquivo específico através de uma operação de abertura. O sistema de arquivos do C ANSI foi projetado para trabalhar com uma grande variedade de dispositivos de E/S. um arquivo em disco pode suportar acesso aleatório enquanto um teclado não pode. Embora cada um dos dispositivos seja muito diferente. Uma vez aberto o arquivo. geralmente no final do processamento. Por exemplo. devemos desassociar o stream do arquivo através de uma operação de fechamento. acionadores de discos e acionadores de fita. 62 . Em C um arquivo pode ser qualquer coisa. FILE *arq. informações podem ser trocadas entre ele e o programa. Todos os streams se comportam de maneira semelhante. MANIPULAÇÃO DE ARQUIVOS 12. Pelo fato dos streams serem independentes dos dispositivos reais. Isso revela um ponto importante sobre o sistema de E/S do C: todos os streams são iguais.H seja incluído nos programas que as utilizem. mas não todos os arquivos. Essas funções exigem que o cabeçalho STDIO. O arquivo STDIO.

return 1. 9. FILE *fopen(const char nome_arquivo. return 1. 11. 10. No acesso seqüencial.12. 12. "r"))== NULL) { printf("Cannot open input file. a leitura e a transferência de dados devem ser feitas percorrendo seqüencialmente os bytes no arquivo. } 63 . Este posicionamento aleatório é feito em relação a três possíveis origens que são passados como argumento de funções: Início.\n"). 14. } while (!feof(in)) fputc(fgetc(in). Função fopen() : Abre um arquivo. out). 3. 23. fclose(out).\n"). 4. 15. 22.1. Isto pode ser feito através de funções que alteram indicador de posição corrente para determinada localização no arquivo. } if ((out = fopen("TESTFILE. 18. 19. int fclose(FILE *arq). 16.3 Funções Manipulação de Arquivos Função fclose() : Fecha um arquivo. que indica a localização de início de leitura ou gravação. 7. 21. 5. 2.h> #include <stdlib. 17. Modo r w rb wb 1. 20. 13. 12.h> Abre Cria Abre Cria um um um um arquivo arquivo arquivo arquivo Significado texto para leitura texto para escrita binário para leitura binário para escrita int main(void) { FILE *in. "w"))== NULL) { printf("Cannot open output file. Enquanto que no acesso aleatório é feito em qualquer posição do arquivo sem que informações anteriores precisem ser acessadas. posição corrente ou fim. 6.2 Tipos de Acesso Os tipos de acesso aos arquivos podem ser seqüencial ou aleatório. O modo de abertura de arquivo pode ser conforme apresentada na tabela 12.BAK".1 Os valores para o modo de abertura de arquivo. return(0). fclose(in). O acesso aos dados é feito através de um ponteiro indicador da posição corrente no arquivo.DAT". if ((in = fopen("TESTFILE. 8. *out. Tabela 12. const char* modo). #include <stdio.

11. return 0. SEEK_END). Função rewind() : Recoloca o indicador de posição de arquivo no início do arquivo. 7. 1.h> long filesize(FILE *stream). int i = 100. SEEK_SET). if (!stream) exit(1). 13. . 2. f).. 17. float f = 1. 11. "%d %c %f".Função fprintf() : Escreve argumento em um arquivo. #include <stdio. int origin).TXT is %ld bytes\n". 9. fseek(stream. return length. void rewind(FILE *arq). 15. "w+"). c. fclose(stream). length.2 Os valores para o modo de abertura de arquivo.h> #include <stdlib. } long filesize(FILE *stream) { long curpos. 12. return 0. "w"). 8. 4. 23. length = ftell(stream). 20.h> int main(void) { FILE *stream. 16. 9. 21. stream = fopen("MYFILE. int remove(const char *nome_arquivo). 3. fprintf(stream. "This is a test"). 6. 10. fseek(stream. 18.h: Tabela 12. fprintf(stream. filesize(stream)).234. 14. 5. stream = fopen("DUMMY. 6. const char *control_string. 3. long numbytes. 13. i. 64 . 7. Macro SEEK_SET SEEK_CUR SEEK_END 1. 12. 10. 19. int fprintf(FILE *arq. } Função ferror() : Devolve verdadeiro se ocorreu um erro durante a última operação no arquivo. int fseek(FILE *arq. Origin Início do arquivo Posição atual Final de arquivo int main(void) { FILE *stream.). } Função fseek() : Posiciona o arquivo em um byte específico. 22. 5.FIL". 8. #include <stdio. Função remove() : Apaga um arquivo. 2.h> #include <stdlib. 16. 15. char c = 'C'. 24. curpos. fclose(stream). curpos = ftell(stream).. 0L. 14.TXT". printf("Tamanho de MYFILE. 4. O parâmetro origin é uma das seguintes macros definidas em stdio. int ferror(FILE *arq).

4.h> int main(void) { FILE *stream. 15. 13. 16. 16. stream). "%d %c %f". 8. 6. int s[10]. c. . 3. 10. size_t fread(void *buffer. 5. 1. fgetc(stream)..FIL". 12. i++) { fread (&s[i]. int fscanf(FILE *arq. "Cannot open output file. fclose(stream). 14.h> #include <stdlib. } Função feof() : Devolve verdadeiro se fim de arquivo for atingido. "r").h> int main(void) { FILE *stream. 11. &c. 4. 1. Função fscanf() : Lê argumento de um arquivo. return 0. 2. 8. 6. 19. i. } fclose(stream). 5. 18.).\n"). 14. #include <stdio. 9. 8. } 65 . 10. return 1. 2. size_t num_bytes. 3. sizeof(int). int i. 7. 5.FIL". 4. char c.h> #include <stdlib. 9. int feof(FILE *arq). 17. fscanf(stream. if (!stream) exit(1). s[i]). 11.i. return 0. 12. float f. 2.. #include <stdio. } Função fread() : Lê count blocos de num_bytes de arq para buffer.h> int main(void) { FILE *stream. printf("%d %c %f". 9. const char *control_string. 20. printf("x[%d]=%d\n". "r")==NULL) exit(1).h> #include <stdlib. 11. 3.$$$". 7. 17. fclose(stream). 13. return 0. if ((stream = fopen("DUMMY. &f). i. "rb")) == NULL) { fprintf(stderr. 1. size_t count. 14. stream = fopen("DUMMY. 7. FILE *arq). 6. int fflush(FILE *arq).Função fflush() : Esvazia um stream. 15. 12. 13. Se não ocorrer erro retorna count. if (feof(stream)) printf("We have reached end-of-file\n"). &i. #include <stdio. 1. 10. f). if ((stream = fopen("TEST. i<10. } for (i=0.

1. "w+").h> int main(void) { FILE *stream. 27. } for (i=0. Se não ocorrer erro retorna count. char ch. 8. 24. 15. i<10. 10. São necessários as seguintes 66 . 21.$$$". 20. FILE *arq). stream). scanf("%d". 11. 1. editar dados de clientes cadastrados. 29. 14. i. 4. int s[10]. 21.Função fwrite() : Escreve count blocos de num_bytes de buffer para arq. return 0. Este programa deve permitir a inserção de novos clientes. 6. 12. excluir um cliente do cadastro. 31. fwrite(&s[i]. /* display the character */ putchar(ch). "Cannot open output file. 18. 5. #include <stdio. 7. if ((stream = fopen("TEST. /* write a string into the file */ fwrite(string. strlen(string). SEEK_SET). 25. 26. 12. 28. "wb")) == NULL) { fprintf(stderr. 3. 16.\n"). 2. 23. /* open a file for update */ stream = fopen("DUMMY. #include <string.h> #include <stdlib. 9. size_t num_bytes. /* seek to the beginning of the file */ fseek(stream.4 Exercícios 1. return 0. 20. 1. 19. 1.&s[i]). fclose(stream). 17. size_t fwrite(void *buffer. char string[] = "This is a test". } fclose(stream). pesquisar clientes e relatório.h> #include <stdio. int fgetc(FILE *arq). 4. 6. } 12. } while (ch != EOF). stream). Faça um programa de cadastro de clientes. 10. i++) { printf("x[%d]=". sizeof(int).h> int main(void) { FILE *stream. 19. 2. return 1. 0. do { /* read a char from the file */ ch = fgetc(stream).FIL". 14. 13. 5. 17.i). 11. 30. } Função fgetc() : Devolve o próximo caractere da stream de entrada na posição atual e incrementa o indicador de posição do arquivo. 7. 13. 18. size_t count. 8. imprimir informações de um determinado cliente. 3. 22. 15. 9. 16.

3. juntamente com a descrição desse serviço e a data de sua realização. 2. complemento. Cada novo cliente.informações do cliente: nome. aloca-se dinamicamente um registro e atribui o endereço desse bloco a uma posição do vetor. Criar também uma função para ordenar os clientes. A cada venda deve-se atualizar a quantidade no arquivo. O programa consulta um arquivo (exercício 3) que contém a disponibilidade dos produtos. telefone. cliente . bairro. Implementar operações para manipular arquivos. quantos são solteiros(as). endereço. cep. • • • • Para armazenar as informações dos clientes. cidade. Faça um programa contendo os serviços que uma oficina mecânica pode realizar: • • Ordem de serviço (número da OS. 4. • relatório deve calcular a média de idade. valor. Faça um programa que gerencia os produtos armazenados em uma farmácia. Deve-se criar um arquivo que armazene as informações dos produtos e a quantidade disponível. a média dos valores. quantos são casados(as) . Leia as informações sobre várias ordens de serviço e determine. ao final. Faça um programa que gerencie a venda de produtos de uma farmácia. estado civil. o nome do cliente que realizou o serviço mais caro. rg. estado. 67 . data de nascimento. data. utilize um vetor de ponteiros (deve-se iniciar todos ponteiros com nulo). fax e celular. quantos divorciados(as).ler informações de um arquivo). listar as cidades e a respectiva quantidade de clientes por cidade. numero. sexo. serviço realizado. quantos são do sexo masculino e feminino. sobrenome.

printf("\n"). 21. 27. int count). shakesort(int *p. troca(int *p. } print(q. 4. ORDENAÇÃO Ordenação é o processo de arranjar um conjunto de informações semelhantes numa ordem crescente ou decrescente. for (i=0. } void print(int *p. 14. exchange. &q[i]). a>0.h> void void void void void void void void selecao(int *p.n). i<count. do { exchange=0. for (i=0.h> #include <stdlib. insercao((int *p. Geralmente. for (a=count-1. 31. int count). e compara a si próprio (j) com o anterior (j+1).. int count) { int i. 22. return 0. a<count. shakesort(q. i<n. 33. a++) for (b=count-1. print(q. int count) { int a. free(q). Consiste em dois loops.13. 25. 13. printf("\n"). 17. e ele passa por cada item da tabela (do fim para o início). Essa chave é utilizada nas comparações. i++) { printf("x[%d]=". int count). int count). int count). b. int count) { int a. 10. 11. temp.\n"). scanf("%d". qs(int *p. int count). q=(int*)malloc(n*sizeof(int)). count). scanf("%d". ele volta ao final e i é incrementado. 42. 39. Caso seja maior que o próximo. um dentro do outro (i e j). shell(int *p. quando uma troca se torna necessária. estes dois são trocados. apenas uma porção dessa informação é usada como chave da ordenação. 12. 7. Troca. printf("Quantos números deseja:"). Seleção. 24. Após j ter passado por toda a tabela. 38. print(p.i). quando a informação é ordenada. void shakesort(int *p. 18. 29. } . if (!q) exit(1).n). n. 36. 16. 5. se necessário. #include <stdio.1 Ordenação por Troca A ordenação por troca envolve repetidas comparações e. &n).. 32. 15. quicksort((int *p.n). 3. Considerando-se o seguinte exemplo são apresentados os algoritmos de ordenação a int main(void) { int *q. 28. int left. int count). 30. temp. 9. print(int *p. a--) { if (p[a-1]>p[a]) { 68 . 13. mas.. printf("\nOrdenando. O loop j é o loop interno. 40. 35. 19. i++) printf("%d ". p[i]). 26. 34. 6. b--) { if (p[b-1]>p[b]) { temp=p[b-1]. int right). 41. Essa operação é repetida tantas vezes quantas sejam o número de registros da tabela. 2. for (a=1. i. void troca(int *p.. b>=a. 23. Inserção. Existem três método básicos para ordenar matrizes: • • • seguir: 1. a troca de dois elementos adjacentes. toda a estrutura de dados é transferida. 20. 8. 37.

As etapas(ou varreduras) como já descrito acima consiste em buscar o maior elemento da lista não ordenada e colocá-lo na lista ordenada. p[a-1]=p[a]. exchange=1. b++) { if (p[b]<temp) { c=b. uma contendo os itens já ordenados e a outra com os restantes ainda não ordenados. p[a]=temp. p[a]=temp. p[a]=temp. quando todas as "cartas" foram inseridas. A mão esquerda começa "vazia" e a mão direita insere uma "carta" de cada vez na posição correta.3 Ordenação por Inserção O algoritmo de ordenação por inserção é bastante simples e eficiente para uma quantidade pequena de números. exchange. A idéia de funcionamento é semelhante ao ordenamento de cartas de baralho na mão de um jogador. a++) { if (p[a-1]>p[a]) { temp=p[a-1]. em cada etapa. temp. p[b]=temp.2 Ordenação por Seleção A ordenação por seleção consiste. } } } while (exchange).No final do processo a sub lista ordenada apresentará (n-1) itens e a outra apenas 1. void selecao(int *p. a++) { exchange=0. No início a sub lista ordenada é vazia e a outra contém todos os demais. for (a=0. } } } 13. } } } temp=p[a-1]. p[a-1]=p[a]. b<count. } } if (exchange) { p[c]=p[a]. temp=p[a]. a<count-1. c=a. exchange=1. elas já 69 . exchange=1. a<count. em selecionar o maior (ou o menor)elemento e alocá-lo em sua posição correta dentro da futura lista ordenada. int count) { int a. b. c. } 13. for(b=(a+1). } } for (a=1. temp=p[b]. Durante a aplicação do método de seleção a lista com n registros fica decomposta em duas sub listas.p[b-1]=p[b]. Ao final.

for (a=1. int count) { int a. O gap.2. a cada etapa i.4 “Shell Sort” O algoritmo de ordenação shell é um algoritmo de ordenação por inserção. é igual à parte inteira da divisão do número de elementos da lista por 2.3. } } } 13. void insercao(int *p. começamos a procurar um elemento maior do que x. A maior parte dos elementos já vão para suas posições aproximadas. for (j=i-gap. p[b+1]=temp. 70 . O mesmo processo ocorre a partir da posição n-1. for (i=gap. count). j=j-gap) p[j+gap] = p[j]. Neste algoritmo. até encontrarmos. procurando um elemento menor do que x. x. A partir da posição 0. k++) { gap = a[k]. gap. x<p[j] && j>=0.5 “Quicksort” O algoritmo de ordenação quicksort é um algoritmo de ordenação por troca. o gap é diminuído em 1 e é feita uma nova passagem. } } 13. uma com os elementos já ordenados e a outra com elementos ainda por ordenar. e 8o. 2o. Por exemplo. é criado um gap. temp. No início.. Nos métodos de ordenação por inserção. i<count. k. for (k=0. k<5. no início. ao invés dos dados serem comparados com os seus vizinhos. Ao terminar de passar por todos os elementos da lista. e assim por diante. p[j+gap] = x. São então comparados os elementos 1o. i++) { x=p[i]. a<count. void shell(int *p. a[5]={9. Shell em 1959. o i-ésimo elemento é inserido em seu lugar apropriado entre os(i-1) elementos já ordenados. b. e 9o.1}. o gap inicial é igual a 7. for (b=(a-1). j. O algoritmo foi criado por Donald L. se a nossa lista tem 15 elementos. a++) { temp=p[a]. b--) p[b+1] = p[b]. int count) { int i. Isso é repetido até que o gap seja igual a 0. a sub lista ordenada é formada trivialmente apenas pelo primeiro elemento da lista. print(p.. Baseia-se na escolha de um elemento central. b>=0 && temp<p[b]. Durante o processo de ordenação por inserção a lista fica dividida em duas sub listas.5.estão ordenadas.

void quicksort(int *p. O processo se repete de forma recursiva para cada subconjunto (esquerda e direita do elemento x). int right) { int i. até termos um subconjunto com um único elemento. j--. i. right). while ((x<p[j]) && (j>left)) j--. do { while ((p[i]<x) && (i<right)) i++. i++. if (left<j) qs(p. } }while (i<=j). p[j]=y. if (i<=j) { y=p[i]. 0. } 71 . x=p[(left+right)/2]. int count) { qs(p. left. int left. p[i]=p[j]. i=left. j. if (i<right) qs(p. até que i>=j. j=right. count-1). trocamos estes valores. } void qs(int *p. y. j).Quando o índice da esquerda (i) for menor do que o índice da direita (j). x.

De acordo com a forma de acesso (armazenamento e recuperação) aos dados.1 Pilhas Pilhas são estruturas de armazenagem e recuperação de dador em ordem LIFO (Last-in. Listas. A estrutura de dados é importante para armazenar os dados e recuperá-los. W U G P A U G P A G P A P A A Figura 14. existem basicamente quatro tipos de estruturas: • • • • Pilha. quando necessário. ESTRUTURAS DE DADOS Um programa consiste de duas coisas: algoritmos e estruturas de dados. As duas operações básicas (armazenar e recuperar) são tradicionalmente chamadas de push e pop. First-out). isto é. Árvores Binárias. 72 . A P G U W W U G P A A P A G P A U G P A Figura 14.2 Ilustração exemplo da função pop. respectivamente. de forma automática em uma ordem predeterminada. o último item colocado na pilha será o primeiro a ser removido.1 Ilustração exemplo da função push. 14.14. Filas.

First Out).2 Filas Filas são estruturas de armazenagem e recuperação de dados em ordem FIFO (First In. isto é. Um melhoramento das Filas simples seria a Fila Circular. X X Y Z X Y Y Z X X Y Z Z Y X Y Z Z Figura 14. entre outros. 73 .3 Ilustração função entra e função sai de uma fila.14.2. distribuição de eventos. o primeiro item colocado na fila será o primeiro a ser removido. Desta forma. A fila opera utilizando duas funções: entra e sai. 14.1 Filas Circulares Quando uma Fila atinge o limite do vetor de armazenamento. não é mais possível colocar nenhum item na fila. As filas podem ser utilizadas em simulações.

3 Listas Ligadas São estruturas de armazenagem e recuperação de dados de forma randômica. b) O campo info do nó é inicializado com um valor em particular. A adição de um nó pode ser realizada no início ou ao longo de uma lista ligada. A B Figura 14. o valor corrente de topo.4 Ilustração de uma fila circular. ou seja.qualquer número de itens poderia ser colocado na fila.4). 74 . o elo proximo se torna um ponteiro para o primeiro nó da lista. desde que itens também estejam sendo retirados (Fig. isto é. A adição de um nó no início de uma lista ligada é realizada em quatro etapas: a) Um nó vazio é criado. 14. Cada item de informação consiste em uma estrutura que inclui campos de informação e ponteiro de enlace. 14. uma lista encadeada.1 Listas Singularmente Ligadas Uma lista singularmente encadeada requer que cada item de informação contenha um elo com o próximo item da lista. Cada porção de informação é armazenada em um item de informação e que carrega consigo um elo ao próximo item de informação. c) Devido ao nó ser incluído no início da lista.3. Ele está vazio no sentido de que o programa que realiza a inserção não atribui quaisquer valores aos campos de dados do nó. As listas encadeadas podem ser singularmente (simples) ou duplamente encadeadas. 14.

1 2 5 8 4 Primeiro Figura 14. Consequentemente. o elo proximo do anterior do nó corrente aponta para o novo nó e. Ele está vazio no sentido de que o programa que realiza a inserção não atribui quaisquer valores aos campos de dados do nó. A A A Primeiro (1) Tmp Primeiro (2) Tmp Primeiro (3) 75 . c) Percorre a lista comparando o campo info do novo nó com cada nó da lista. b) O campo info do nó é inicializado com um valor em particular.d) O novo nó precede todos os nós da lista. O processo de adicionar um novo nó ao longo da lista de forma ordenada é realizada em quatro etapas: a) Um nó vazio é criado. mas esse fato tem que ser refletido no valor do Primeiro. o elo proximo do novo nó aponta para o elo proximo do nó corrente. o ponteiro Primeiro é atualizado para se tornar o ponteiro para o novo nó.5 Ilustração de uma lista singularmente ligada. o ponteiro Primeiro deve ser atualizado. b) A remoção de um único nó de uma lista ligada de apenas um nó. A operação de remoção consiste em remover um nó do início ou ao longo da lista e retornar o valor armazenado nela. c) A remoção do primeiro nó da lista com pelo menos dois nós exige a atualização do ponteiro Primeiro. Deve-se observar que: a) Não se pode remover um nó de uma lista vazia. d) A remoção de um nó no meio de uma lista deve ser realizada somente após efetuar as ligações necessárias afim de manter a consistência da lista. d) Ao determinar a posição de inserção.

C S R A A Primeiro (1) Tmp C S R A A Primeiro (2) Tmp C S R A A Primeiro (3) 76 . C A C A C A Tmp (1) Primeiro Tmp (2) Primeiro Primeiro (3) Figura 14.7 Ilustração de inserção em uma lista singularmente ligada.Figura 14.6 Ilustração de inserção em uma lista singularmente ligada.

2 Listas Duplamente Ligadas Uma lista duplamente ligada (ou lista linear duplamente ligada) consiste em dados e elos para o próximo item e para o item precedente. d) O ponteiro Primeiro recebe novo nó. O processo para a inserção no início da lista é realizado em quatro etapas: a) Um novo nó é criado inicializando-se os dados (inclusive os ponteiro como nulo). A inserção de um nó de forma ordenada em uma lista duplamente ligada pode ser realizada basicamente de três formas: • • • no início da lista. 1 9 3 5 Primeiro Último Figura 14. Se um dos elos tornar-se inválido. no fim da lista. A vantagem de possuir dois elos são: • • A lista pode ser lida em ambas as direções.Figura 14. 77 .3. O processo de adicionar um novo nó ao longo da lista duplamente ligada de forma ordenada é realizada em quatro etapas: a) Um novo nó é criado inicializando-se os dados (inclusive os ponteiro como nulo). b) O elo anterior do novo nó recebe Ultimo. 14. d) ponteiro Ultimo recebe novo nó.8 Ilustração de inserção em uma lista singularmente ligada. c) O elo proximo apontado por Ultimo recebe novo nó. O processo para a inserção no fim da lista é realizado em quatro etapas: a) Um novo nó é criado inicializando-se os dados (inclusive os ponteiro como nulo).8 Ilustração de uma lista linear duplamente ligada. no meio da lista. a lista pode ser reconstruída utilizando-se o outro elo. c) O elo anterior apontado por Primeiro recebe novo nó. b) O elo proximo do novo nó recebe Primeiro.

b) O campo info do nó é inicializado com um valor em particular. S S Primeiro (1) Ultimo Primeiro (2) Ultimo E S tmp Primeiro (3) Ultimo S S S S tmp Primeiro (4) Ultimo Primeiro (5) Ultimo Figura 14. O elo proximo do novo nó aponta para o nó corrente e. c) Percorre a lista comparando o campo info do novo nó com cada nó da lista. A operação de remoção consiste em remover um nó do início. o elo anterior do nó corrente aponta para o novo nó. do fim ou ao longo da lista e retornar o valor armazenado nela. 78 . Deve-se observar que: a) Não se pode remover um nó de uma lista vazia.9 Ilustração de inserção em uma lista duplamente ligada. o elo proximo do anterior do nó corrente aponta para o novo nó. d) Ao determinar a posição de inserção. O elo anterior do novo nó aponta para o anterior do nó corrente.

Cada elemento de uma árvore binária é chamado nó da árvore. Em cada nó contém um registro. 14. O nível do nó raiz é 0. d) A remoção do ultimo nó da lista com pelo menos dois nós exige a atualização do ponteiro Ultimo. Uma outra construção possível é a lista circular ligada que pode conter ou não a indicação para o início da lista 1 9 3 5 Início Figura 14. Se um nó está no nível i então a raiz de suas subárvores estão no nível i+1. Grau de uma árvore é o mais alto dentre os graus de seus nós.9 Ilustração de uma lista circular duplamente ligada com cabeçalho. para cada nó. o ponteiro Primeiro e Ultimo deve ser atualizado. c) A remoção do primeiro nó da lista com pelo menos dois nós exige a atualização do ponteiro Primeiro. 79 . e. Árvore binária são árvores de grau 2. e) A remoção de um nó no meio de uma lista deve ser realizada somente após efetuar as ligações necessárias afim de manter a consistência da lista. Um nó de grau zero é chamado de nó externo ou folha. a seguinte propriedade é verdadeira: • • • • • • Todos os registros com chaves menores estão na subárvore esquerda e todos os registros com chaves maiores estão na subárvore direita. O número de subárvores de um nó é chamado grau daquele nó.b) A remoção de um único nó de uma lista ligada de apenas um nó. subárvore esquerda e subárvore direita. Os outros nós são chamados de nó interno.4 Árvores Binárias Árvore binária é um conjunto finito de elementos que está vazio ou é particionado basicamente em três subconjuntos disjuntos: raiz.

As subárvores (sucessores diretos) da raiz possuem profundidade 1. Na maneira pré-ordenada. a subárvore da direita e. em seguida. a ordem de acesso à árvore usando cada método é: d Ordenada a b c d e f g Pré-ordenada d b a c f e g Pós-ordenada a c b e g f d a b f c e g 80 . Usando a forma ordenada. Considerando-se o exemplo da figura 14. A raiz possui profundidade 0. As árvores podem ser utilizadas para administrar grandes quantidades de dados em uma ordem qualquer. O procedimento de acesso a cada nó na árvore é chamado de transversalização da árvore. cada nó é visitado da raiz. A altura de uma árvore é a altura do nó raiz. a subárvore da direita. A maioria das funções que usam árvore é recursiva porque a própria árvore é uma estrutura de dados recursiva. 13. em seguida. podem representar processos decisórios.11.• • • A altura de um nó é o comprimento do caminho mais longo deste nó até um nó folha. 12 e 20 Nível 3: 10. cada subárvore é ela própria uma árvore. a raiz e. a subárvore da direita. a subárvore da esquerda e. Existem três maneiras de percorrer uma árvore: de forma ordenada. administrando-as de forma hierárquica. Embora árvores sejam fáceis de visualizar. 18 e 23 Nível 4: 6 Nível 5: 7 Altura da árvore: 7 Figura 14. Raiz: 15 Grau da árvore: 2 Nível 0: 15 Nível 1: 5 e 16 Nível 2: 2. elas apresentam alguns problemas difíceis de programação. cada nó é visitado da subárvore da esquerda. pré-ordenada e pósordenada. Um nó no nível n possui a profundidade n. Com a pós-ordenada. depois. permitem o uso de listas ligadas e a divisão de um conjunto de dados em subconjuntos. A profundidade é o número de arestas da raiz até um determinado nó. a raiz.10 Ilustração de uma árvore binária. Isto é. cada nó é visitado da subárvore da esquerda. Além disso.

14. 4. Elaborar um programa que simule o armazenamento e recuperação de uma pilha. Elaborar um programa que simule uma fila de atendimento. Uma árvore binária ordenada é aquela em que a subárvore da esquerda contém nós que são menores ou iguais à raiz e os da direita são maiores que a raiz.5 EXERCÍCIOS 1.11 Exemplo de árvore binária.Figura 14. 81 . 3. Elaborar as funções para armazenar e recuperar dados em uma fila. Elaborar as funções pop() e push() de uma pilha. 2.

Stroustrup. Ziviani.. Tenenbaum. Rivest. S..Algoritmos. Ferreira. B. “Software Engineering: A Practitioner’s Approach (European Adaptation)” 5thEdition. A. Pressman. São Paulo/SP.F. Rio de Janeiro/RJ. M. “C Completo e Total” 3ªEdição Makron Books Ltda. “A Linguagem de Programação C++”.M. C. Editora Bookman. Editora Campus. Drozdek. “Matemática Básica”.Teoria e Prática”. Alves Cruz. Editora Prentice Hall. H. São Paulo. Editora Pioneira Informática. A.V.L. Langsam. “Estruturas de Dados Usando C” Makron Books Ltda. “Dominando Algoritmos com C” Editora Ciência Moderna. 2002.Edição. Angerami. Ince. Porto Alegre/RS. P.V. “Circuitos Digitais” 3ªEdição. Augenstein. Salles.. A. São Paulo/SP. Campos.Edição Americana. “Fundamentos de Programação C: Técnicas e Aplicações” 2ªEdição. 1994. Berkshire/UK. Tradução da 2ª. Loudon. São Paulo/SP. São Paulo/SP. Editora Atual.A.S. Choueri Júnior.L..G.H. Schildt. O.M. “Estrutura de Dados e Algoritmos em C++”. 1997.. Stein.. D. Editora Érica. 1992.. “Algoritmos . MacGraw-Hill International.. V.E.. Leiserson. Rio de Janeiro/RJ. 1984. R. “Treinamento em Linguagem C++ . N. Editora Pioneira Thomson. A. D.15.. E. R. “Projeto de Algoritmos com Implementações em Pascal e C” 4ªEdição. 2000. Mizrahi. Aoki. Rio de Janeiro/RJ. “Fundamentos da Programação de Computadores .S. Editora Makron Books. T.R. 2000.. 2002. BIBLIOGRAFIA Arakaki. K. S. Y. Livros Técnicos e Científicos Editora.. Pascal e C/C++”.Módulo 2”.C.. São Paulo/SP.J. 1996. 82 ... 1995.C. C. R. São Paulo/SP. 1999. 3ª. Lourenço. Neto. J. A. Ascencio. 2002. 2000. Arakaki. E. Cormen.

APÊNDICE 16.1 Tabela ASCII 83 .16.

Por exemplo. ou de acordo com a lei de formação: 3452 = 3 * 10 3 + 4 * 10 2 + 5 * 101 + 2 * 10 0 Sistema Binário (base 2): O sistema binário ou base 2 utiliza apenas dois símbolos para representar qualquer quantidade: 0 1. Em um determinado momento ao longo desse processo. um sistema de 12 unidades para os meses e um sistema de 10 unidades para os anos. 4 centenas. surgiu a necessidade de medir grandezas. Para a representação de quantidades maiores que a base adota-se pesos para cada posição do algarismo. Por exemplo. Sistema Hexadecimal (base 16): O sistema hexadecimal ou base 16 possui 16 símbolos para representar qualquer quantidade: 0 1 2 3 4 5 6 7 8 9 A B C D E F. Para a compreensão de um circuito digital até um computador são importantes três sistemas numéricos: Sistema Decimal (base 10): O sistema decimal ou base 10 é o sistema mais utilizado no diaa-dia. o tempo é medido utilizando um sistema de 24 unidades para as horas. É um sistema muito utilizado em circuitos lógicos e aritméticos. 84 . n = quantidade de algarismos –1.16.2 Sistema Numérico O homem é resultado contínuo da sua própria evolução. É um sistema muito utilizado na área de microprocessadores. Utiliza 10 símbolos (algarismos) para representar qualquer quantidade: 0 1 2 3 4 5 6 7 8 9. b = base do número. Para medir essas grandezas o homem criou os sistemas numéricos. o número 3452 é composto 4 algarismos. isto é. Cada algarismo ou dígito de um número binário é chamado de bit (binary digit). 5 dezenas e 2 unidades. por 3 milhares. Os números de todos os sistemas numéricos podem ser decompostos de acordo com a lei de formação: Número = an * bn + an −1 * b n −1 + an − 2 * bn − 2 + K + a0 * b0 onde: an = algarismo. um sistema de 60 unidades para minutos e segundos.

Equivalência entre os sistemas numéricos.. O último quociente da divisão e os restos das divisões sucessivas.. Hexadecimal 0 1 2 3 4 5 6 7 8 9 A B C D E F 10 11 . correspondem ao número na base b.. 16.. (58)10 = (?) 2 58 / 2 = 29 resto = 0 29 / 2 = 14 resto = 1 14 / 2 = 7 resto = 0 7 / 2 = 3 resto = 1 3 / 2 = 1 resto = 1 (58)10 = (111010) 2 (58)10 = (?)16 58 / 16 = 3 resto = 10 (58)10 = (3A)16 85 .. tomados na ordem inversa. Decimal 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 ..1 . Binário 0 1 10 11 100 101 110 111 1000 1001 1010 1011 1100 1101 1110 1111 10000 10001 . basta aplicar a lei de formação: (1001) 2 = 1 * 2 3 + 0 * 2 2 + 0 * 21 + 1 * 2 0 = (9)10 (3A )16 = 3 * 161 + A * 160 = 3 * 16 + 10 * 1 = (58)10 Dado um número inteiro na base 10.3 Conversão entre Bases Para converter um número de um sistema numérico qualquer para a base decimal. para obter o equivalente em uma base b qualquer. divide-se o número por b sucessivamente até que o quociente da divisão seja menor que b.A equivalência entre os números dos três sistemas numéricos é apresentado na seguinte tabela: Tabela 16.

(8.000 → Fim (37.750 * 2 = 1.000 →0 →1 →1 (37.375 * 2 = 0.500 * 2 = 1.500 0.000 → Fim (8.0625)10 = (?)16 (37)10 = ( 25)16 0. n = quantidade de algarismos da parte inteira –1.1)16 0. A parte inteira resultante dos produtos formará os dígitos da parte fracionária do número convertido.Existem uma relação estreita entre o sistema binário e o hexadecimal.375)10 = (?) 2 (8)10 = (1000) 2 0.0625 *16 = 1 → 1 0. m = quantidade de algarismos da parte fracionária. b = base do número. A lei de Formação para números fracionários é: Número = an * b n + an −1 * b n −1 + an−2 * b n−2 + K + a0 * b0 + a−1 * b −1 + a−2 * b −2 + K + a−m * b − m onde: an = algarismo.0625)10 = (25. (3A )16 = (?) 2 3 → 0011 A → 1010 (3A )16 = (00111010) 2 (111010) 2 = (?)16 0011 → 3 1010 → A (111010) 2 = (3A )16 A conversão de números fracionários é realizada por partes: a parte inteira e a parte fracionária. A parte fracionária é utilizado o processo das multiplicações sucessivas pela base desejada.375)10 = (1000.750 0. Para a conversão de base 10 para base 2 ou base 16. a parte inteira é convertida separadamente pelo processo das divisões sucessivas.011) 2 86 . Esta relação vem do fato que o número 16 pode ser escrito como 24.

Sign up to vote on this title
UsefulNot useful