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

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

Quaisquer dúvidas. estruturas de dados e técnicas de programação baseado no livro texto e nas referências bibliográficas complementares. os conceitos básicos da linguagem de programação C. Francisco Yastami Nakamoto emaito: yastami@unifieo. Prof.br Atualizado em: 01/02/2007 6 .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. Me. de forma resumida. encontra-se. críticas e sugestões serão bem vindas. Neste texto.

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

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

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. Considerando-se as definições apresentadas anteriormente.. determina-se os passos seqüenciais para fazer o café: Encher água na chaleira. Aguardar o processo de coar. Então.. é possível prever passos essenciais que podem comprometer a resolução do problema. 1. o casal está preparando café para servir aos convidados. 2. Preparar porta-filtro com filtro sobre o bule.. mas para isso é preciso do café.é uma seqüência finita de instruções. certamente o objetivo será alcançado. Por exemplo.. Entretanto. observando-se a seqüência proposta. ” Desta foram.. ou seja. que atinge um objetivo pré-estabelecido. ” considerando-se que: “ . Colocar café em pó no filtro. Seguindo os passos apresentados. um encontro de amigos na residência do casal Leila e Francisco. 9 . Adoçar o café.. Encher água na chaleira.. Sendo anfitrião do evento. um algoritmo é um conjunto finito instruções seqüenciais. então o objetivo principal é fazer o café.uma série de passos organizados que descrevem um processo que se deseja seguir para dar solução a um problema específico.“ . 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. 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. Colocar a chaleira para ferver. Por exemplo: 1.. 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.4 Representação da Lógica O algoritmo é a representação da resolução lógica de um problema de processamento de dados. Colocar a chaleira para ferver. executados num determinado período de tempo. Se a água ferver.

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

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

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.4.Exemplo de um diagrama Chapin (Nassi-Schneiderman). N Escreva “Aprovado” 1. Início Leia N1.3 Português Estruturado Esta forma de representação de algoritmos. por assemelhar-se bastante à forma em que os programas são escritos. também conhecida como “portugol” ou pseudo-código. é bastante rica em detalhes e. <nome_do_algoritmo> é um nome simbólico dado ao algoritmo com a finalidade de distinguílo dos demais. 12 . 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. De fato.4 apresenta um exemplo do tipo de diagrama de Chapin para o algoritmo de cálculo da média de um aluno. encontra muita aceitação. <subalgoritmos> consiste de uma porção opcional do pseudocódigo onde são definidos os subalgoritmos. A figura 1. nos subalgoritmos. <declaração_de_variáveis> consiste em uma porção opcional onde são declaradas as variáveis globais usadas no algoritmo principal e.A figura 1. N2 Média = (N1+N2)/2 Média >=7? S Escreva “Aprovado” Fim Figura 1. eventualmente. 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.4 . Onde: Algoritmo é uma palavra que indica o início da definição de um algoritmo em forma de pseudocódigo.5 apresenta um exemplo utilizando pseudo-código.

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

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

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

7).6 apresenta um exemplo. Isto significa que o bit da extrema esquerda de um número não é mais usado para representar uma potência de 2. (00100110)2=(38)10 (-38)10=(11011001)2 Figura 1.7 . uma seqüência de bits de tamanho n pode representar um número inteiro entre -2(n-1)+1 a 2(n-1)-1. Portanto. Portanto. 16 .8.Exemplo notação de complemento de dois.1.8 . Se o valor for 1 em determinada posição. O inteiro é representado por uma soma de potências de 2.6 .8).1. uma seqüência de bits de tamanho n pode representar um número inteiro não negativo entre 0 a 2(n-1). a potência de 2 representada por essa posição de bit será incluída na soma porém. se o valor for 0. essa potência de 2 não será incluída na soma.Exemplo de sistema de numeração binária. mas é reservado para o sinal do número. Portanto. uma seqüência de bits de tamanho n pode representar um número inteiro entre -2(n-1) a 2(n-1)-1. (-38)10=(11011001)2 11011001+1=11011010=(-38)10 Figura 1.Exemplo de notação de complemento de um. 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. 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.1 Sistema de Numeração Binária Neste sistema. cada posição de bit representa uma potência de 2. 00100110 1ª posição 2ª posição 5ª posição Figura 1. A figura 1.

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

2.8. É a interpretação de um padrão de bits que dá o seu significado.1. 1. 1.8. devido à contribuição do filósofo e matemático inglês George Boole na área da lógica matemática. 4.9 Exercícios Construir algoritmos em português estruturado. Calcular o número de dias existentes entre dois anos digitados pelo usuário. Outro aspecto a ser considerado é com relação à interpretação da informação. Construa um algoritmo para fazer o cálculo das suas despesas do mês. A figura 1. Por exemplo. portanto. pelo contrário. Construa um algoritmo para fazer uma ligação telefônica. 6.Representação binária. 3. elaborar um algoritmo que calcule a estimativa da conta do próximo mês. desde que seja feito com coerência. 5. hexadecimal e decimal de caracteres.5 Observações Finais A classificação apresentada acima não se aplica a nenhuma linguagem de programação específica.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.11 apresenta um exemplo. ela sintetiza os padrões utilizados na maioria das linguagens. 18 . 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. sabendo-se que o preço por m3 é de R$ 3. Construa um algoritmo para comer uma barra de chocolate. Um método de interpretar um padrão de bits é freqüentemente chamado tipo de dado.50. Construa um algoritmo detalhado para trocar uma lâmpada. sendo que este tipo de dado poderá representar apenas um dos dois valores.11 . diagrama de blocos e português estruturado para os seguintes exercícios: 1. Dados o consumo em m3 de água dos três últimos meses. a seqüência de bits 00100110 pode ser interpretada como o número 38 decimal. Ele é chamado por alguns de tipo booleano. o número 26 hexadecimal ou o caractere ‘&’ no código ASCII.

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

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

} 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. Comentários no programa são colocados entre /* e */ não sendo considerados na compilação.programa principal.1). entre outros. printf(“Variável y=%d\n”. foram a linguagem de programação C (tabela 2. y). Logo. A forma geral de um programa em C é: Componentes Iniciais: arquivos de cabeçalho. funções. O primeiro caractere deve ser uma letra ou um sublinhado e os caracteres subseqüentes devem ser letras. rótulos. O padrão C ANSI determina que identificadores podem ter qualquer tamanho. 1. Função main(): Variáveis locais e instruções do programa. letras maiúsculas e minúsculas são tratadas diferentemente. Por exemplo: int count. } void func(void) { printf(”Fim\n”).3 Identificadores Identificadores são os nomes usados para referenciar objetos definidos pelos usuário. declaração de constantes. combinadas com a sintaxe formal de C. 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. func(). 2. dependendo do compilador utilizado. int main(void) { int y=10. #include <stdlib.h> int x=20. números ou sublinhados. nomes de variáveis. printf(“Variável global x=%d\n”. x). isto é. 21 . 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. Count e COUNT são três identificadores distintos. porém em geral. return(0).h> #include <stdio. (ponto e vírgula) que faz parte do comando. void func(void). Em C. Count. COUNT. protótipos e variáveis globais. count. Cada instrução encerra com .1 Lista de palavras-chave em C ANSI 1. considera-se apenas os 31 primeiros caracteres. Tabela 2.

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

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

A tabela 2. isto é.4 Tabela verdade operadores lógicos.6.5 Bit a Bit A linguagem C oferece um completo conjunto de operadores bit a bit. A tabela 2.6 Tabela verdade operadores bit a bit.3).6 apresenta a tabela verdade dos operadores bit a bit.5). Tabela 2. 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. testar. 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 . O operador lógico refere-se à maneira como essas relações podem ser conectadas. 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. A idéia de verdadeiro e falso é a base dos conceitos dos operadores lógicos e relacionais. verdadeiro é qualquer valor diferente de zero.6.4 Relacionais e Lógicos O operador relacional refere-se à relação que os valores podem ter uns com os outros.5 Operadores bit a bit.4 apresenta a tabela verdade dos operadores lógicos utilizando 1s e 0s. Falso é zero.3 Operadores relacionais e lógicos. 2. As expressões que usam operadores relacionais ou lógicos devolvem zero para falso e 1 para verdadeiro (tabela 2. & | ^ ~ >> << AND OR XOR Complemento de um Deslocamento à esquerda Deslocamento à direita Tabela 2. atribuir ou deslocar os bits efetivos em um byte (tabela 2. Tabela 2.2. Em C.

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

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

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

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

00 Mais que R$ 600.00 e R$ 1200. Mostre. acrescido de bonificação e de auxílio-escola. 31. Mostre os cálculos realizados. Se m for ímpar. um de cada vez. 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. SALÁRIO Até R$ 500. calcule a soma dos números inteiros de 1 até m (m não deve entrar nos cálculos). Cada data deve ser fornecida por três valores inteiros. f ( x) = a * x 2 + b * x + c f ( x) = 0 ∆ = b2 − 4 * a * c x1. o valor do aumento e seu novo salário.00 AUXÍLIO-ESCOLA R$ 150. Faça um programa que receba o salário de um funcionário. 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 Entre R$ 500. 2 = −b± ∆ 2*a 29. onde o primeiro representa o dia. Menu de opções: 1: Somar dois números 2: Raiz quadrada de um número Digite a opção desejada: 30. receba a opção do usuário e os dados necessários para executar cada operação.00 BONIFICAÇÃO 5% 12% Sem bonificação SALÁRIO Até R$ 600.00 33. 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 R$ 100. 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.26. Faça um programa que mostre o menu de opções a seguir. 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. todos inteiros e positivos. 32 . em seguida. Faça um programa que receba um número inteiro e verifique se esse número é par ou ímpar. Se m for par. o segundo o mês e o terceiro o ano. os quatro números em ordem decrescente. Faça um programa que determine a data cronologicamente maior de duas datas fornecidas pelo usuário. 28.00 Acima de R$ 1200. verifique quantos divisores possui.

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

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

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

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

Elabore um programa que receba uma matriz A(3x2) e crie a matriz At. 37 . 21. portanto. Numa matriz quadrada. Dada uma matriz A(mxn).programa que receba as coordenadas dos vértices A. Elabore um programa que imprima os elementos da diagonal principal de qualquer matriz mxm. e é indicada por At (ou por At). os elementos aij tais que i=j formam o que chamamos de diagonal principal da matriz. B e C e calcule a área do triângulo. ATENÇÃO: Se a determinante D=0 então os três pontos não formam um triângulo. a matriz que se obtém trocando ordenadamente as linhas pelas colunas chama-se transposta de A. 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.

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

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

printf("Digite seu nome: "). return(0). 4.<membro> <nome_da_estrutura>-><membro> 14. 13. x->nome). z[5]. seguida do nome da estrutura e das respectivas variáveis delimitadas pelas chaves. char sobrenome[41]. 7. int main(void) { x=&y. }*x. ESTRUTURAS. printf("Ola %s!\n".7. 15.nome). <tipo> <variável_2>. 16. }*x. 9. printf("Digite seu nome: "). printf("Digite seu nome: "). 21. #include <stdlib. y. 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>. 7.. 10. 6. 19.h> #include <stdio. scanf("%s".1 Estruturas Estrutura (structure) é um tipo de dado formado por um conjunto de variáveis referenciadas por um nome. 23. &x->nome). 17. 11. A declaração de variáveis do tipo estrutura pode ser realizada da seguinte maneira: struct cliente { char nome[41]. sobrenome[41].nome). Em C é declarada uma estrutura da seguinte maneira: struct <nome_da_struct> { <tipo> <variável_1>. &y. Uniões. 8. z[5]. struct cliente nome[41].. 2. printf("Ola %s!\n". char sobrenome[41]. }. 18.nome). &z[0].. } Exemplo: 1. A palavra struct define uma declaração. cliente *x. . ENUMERAÇÕES E UNIÕES A linguagem C permite criar tipos de dados utilizando: • • • Estruturas. y. y. scanf("%s". As variáveis são denominadas membros da estrutura. struct cliente { char nome[41]. scanf("%s". printf("Ola %s!\n". . z[0]. Enumerações. }. z[5]. 3.nome). <tipo> <variável_n>. struct { char char }. char sobrenome[41]. 20. 22.h> struct cliente { char nome[41]. y. 40 . 12. 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. 5..

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

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

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

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

7. Utilize um ponteiro. *s=*r. . 4. s=k. 2. apresente o conteúdo e o endereço de cada posição do vetor. *s=k[5]. Justifique cada uma delas. *r=j. 6. 9. 8. *s.8.. int j.. s=k[0]. Elabore um programa que leia três números. r=&j. 3. 5.. k[10].. 2. s=&k[0]. 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. r=j.1 Exercícios 1. Utilize um ponteiro. calcule e mostre o maior e o menor número. Elabore um programa que um vetor de 10 números reais. 1. *r. . *s=k. 10. *r=&j. 45 .

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

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

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

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

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

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

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

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

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

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

retornando o valor do desvio padrão. 3.h): void randomize(void). Elabore uma função que receba 10 números reais e retorna a média aritmética.7 Outras Funções Função randomize() e rand(): A função rand() devolve um número aleatório entre 0 e RAND_MAX.h> #include <time. Elabore uma função que aceita como parâmetro dois números reais e retorna a média aritmética.h> #include <stdio. 11. int rand(void). 7.h> int main(void) { int i. 4. 8. i<10. µ= ∑X i =1 n i n 8. 1. Elabore uma função que aceita como parâmetro dois catetos e retorna o valor da hipotenusa. 3. 12. for(i=0. ABC.DEF . Sintaxe (time.10. 56 . 5. 6. } 10.h e stdlib. i++) printf("%d\n". 2. Elabore uma função que receba uma string e troque todos os caracteres ‘a’ por ‘@’.h>. 7. 2. randomize(). rand() % 100). printf("Dez números randômicos de 0 a 99\n\n"). A constante RAND_MAX é definida na biblioteca <stdlib. A função randomize() inicia a geração de números aleatórios. 9.8 Exercícios 1. Elabore uma função que aceita como parâmetro 5 números reais e retorna o maior número. 10. 4. Elabore uma função que receba uma palavra (string) e retorna a quantidade de caracteres. return(0). 13. #include <stdlib. Elabore uma função que receba 10 números reais e a média.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. 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. 6.

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

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

para o armazenamento da informação. 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. 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. void *malloc(size_t size). sempre que necessário e houver a disponibilidade de espaço em memória. 59 . A alocação dinâmica é o processo de alocar espaço de memória do computador em tempo de execução. 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. A primeira forma é através de variáveis locais e globais (alocação estática). O armazenamento é realizado em uma região de memória livre. cada variável recebe um endereçamento de memória e o respectivo tamanho. ALOCAÇÃO DINÂMICA Um programa necessita de memória para armazenar informações. Existem duas maneiras fundamentais de um programa alocar memória do computador. um programa em execução pode. que é fixo durante todo o tempo de execução do programa. Pilha Heap Variáveis Globais Código do Programa Figura 11.1 mostra conceitualmente como um programa utiliza a memória (a posição e o tamanho variam de acordo com o tipo de processador).11. ou seja. isto é. void *calloc(size_t num.1 Utilização da memória de um programa. solicitar a alocação do espaço e utilizar convenientemente os dados. size_t size). A segunda forma é através da alocação dinâmica. A figura 11. ou heap. Para este tipo de alocação necessita-se definir de antemão a quantidade de armazenamento necessária.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

4 Ilustração de uma fila circular. 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. b) O campo info do nó é inicializado com um valor em particular. As listas encadeadas podem ser singularmente (simples) ou duplamente encadeadas. 14. uma lista encadeada.4). o elo proximo se torna um ponteiro para o primeiro nó da lista. A adição de um nó pode ser realizada no início ou ao longo de uma lista ligada.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. o valor corrente de topo. A adição de um nó no início de uma lista ligada é realizada em quatro etapas: a) Um nó vazio é criado. ou seja.3.3 Listas Ligadas São estruturas de armazenagem e recuperação de dados de forma randômica. 14. Cada item de informação consiste em uma estrutura que inclui campos de informação e ponteiro de enlace.qualquer número de itens poderia ser colocado na fila. 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ó. 74 . 14. isto é. desde que itens também estejam sendo retirados (Fig. c) Devido ao nó ser incluído no início da lista. A B Figura 14.

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.5 Ilustração de uma lista singularmente ligada. c) Percorre a lista comparando o campo info do novo nó com cada nó 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. c) A remoção do primeiro nó da lista com pelo menos dois nós exige a atualização do ponteiro Primeiro.d) O novo nó precede todos os nós da lista. mas esse fato tem que ser refletido no valor do Primeiro. A A A Primeiro (1) Tmp Primeiro (2) Tmp Primeiro (3) 75 . o elo proximo do novo nó aponta para o elo proximo do nó corrente. Consequentemente. 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ó. Deve-se observar que: a) Não se pode remover um nó de uma lista vazia. d) Ao determinar a posição de inserção. 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. o elo proximo do anterior do nó corrente aponta para o novo nó e. b) O campo info do nó é inicializado com um valor em particular. b) A remoção de um único nó de uma lista ligada de apenas um nó. o ponteiro Primeiro é atualizado para se tornar o ponteiro para o novo nó. o ponteiro Primeiro deve ser atualizado. 1 2 5 8 4 Primeiro Figura 14.

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.Figura 14.6 Ilustração de inserção em uma lista singularmente ligada.7 Ilustração de inserção em uma lista singularmente ligada.

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). no meio da lista.Figura 14. no fim da lista. d) ponteiro Ultimo recebe novo nó. c) O elo proximo apontado por Ultimo recebe novo nó. c) O elo anterior apontado por Primeiro recebe novo nó. a lista pode ser reconstruída utilizando-se o outro elo. 1 9 3 5 Primeiro Último Figura 14. b) O elo anterior do novo nó recebe Ultimo. b) O elo proximo do novo nó recebe Primeiro. 77 . 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). A vantagem de possuir dois elos são: • • A lista pode ser lida em ambas as direções.8 Ilustração de inserção em uma lista singularmente ligada.3. 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.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 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). Se um dos elos tornar-se inválido.8 Ilustração de uma lista linear duplamente ligada. 14.

Deve-se observar que: a) Não se pode remover um nó de uma lista vazia. o elo proximo do anterior do nó corrente aponta para o novo nó. 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. 78 . do fim ou ao longo da lista e retornar o valor armazenado nela.b) O campo info do nó é inicializado com um valor em particular. O elo anterior do novo nó aponta para o anterior do nó corrente. 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ó.9 Ilustração de inserção em uma lista duplamente ligada. d) Ao determinar a posição de inserção. 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.

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. 14. Em cada nó contém um registro.4 Árvores Binárias Árvore binária é um conjunto finito de elementos que está vazio ou é particionado basicamente em três subconjuntos disjuntos: raiz. Cada elemento de uma árvore binária é chamado nó da árvore.9 Ilustração de uma lista circular duplamente ligada com cabeçalho. para cada nó. c) A remoção do primeiro nó da lista com pelo menos dois nós exige a atualização do ponteiro Primeiro. Grau de uma árvore é o mais alto dentre os graus de seus nós. 79 . O número de subárvores de um nó é chamado grau daquele nó. e. Os outros nós são chamados de nó interno. d) A remoção do ultimo nó da lista com pelo menos dois nós exige a atualização do ponteiro Ultimo. o ponteiro Primeiro e Ultimo deve ser atualizado. Um nó de grau zero é chamado de nó externo ou folha.b) A remoção de um único nó de uma lista ligada de apenas um nó. 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. 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. subárvore esquerda e subárvore direita. Se um nó está no nível i então a raiz de suas subárvores estão no nível i+1. Árvore binária são árvores de grau 2. O nível do nó raiz é 0.

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

4. 14.11 Exemplo de árvore binária.Figura 14. Elaborar as funções pop() e push() de uma pilha. Elaborar um programa que simule o armazenamento e recuperação de uma pilha. 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. 3. Elaborar as funções para armazenar e recuperar dados em uma fila. Elaborar um programa que simule uma fila de atendimento.5 EXERCÍCIOS 1. 2. 81 .

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

1 Tabela ASCII 83 .16. APÊNDICE 16.

84 . Utiliza 10 símbolos (algarismos) para representar qualquer quantidade: 0 1 2 3 4 5 6 7 8 9. 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. Para a representação de quantidades maiores que a base adota-se pesos para cada posição do algarismo. É um sistema muito utilizado em circuitos lógicos e aritméticos. b = base do número. 5 dezenas e 2 unidades. 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. um sistema de 60 unidades para minutos e segundos. Cada algarismo ou dígito de um número binário é chamado de bit (binary digit). um sistema de 12 unidades para os meses e um sistema de 10 unidades para os anos.2 Sistema Numérico O homem é resultado contínuo da sua própria evolução. 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. 4 centenas. Para medir essas grandezas o homem criou os sistemas numéricos. o número 3452 é composto 4 algarismos.16. Em um determinado momento ao longo desse processo. surgiu a necessidade de medir grandezas. É um sistema muito utilizado na área de microprocessadores. n = quantidade de algarismos –1. o tempo é medido utilizando um sistema de 24 unidades para as horas. 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. isto é. Por exemplo. por 3 milhares.

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

375 * 2 = 0. b = base do número.000 →0 →1 →1 (37.0625)10 = (25.500 0.750 * 2 = 1. 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. Para a conversão de base 10 para base 2 ou base 16. n = quantidade de algarismos da parte inteira –1. Esta relação vem do fato que o número 16 pode ser escrito como 24.000 → Fim (37. a parte inteira é convertida separadamente pelo processo das divisões sucessivas.Existem uma relação estreita entre o sistema binário e o hexadecimal.0625 *16 = 1 → 1 0.0625)10 = (?)16 (37)10 = ( 25)16 0.375)10 = (1000.750 0.500 * 2 = 1. A parte fracionária é utilizado o processo das multiplicações sucessivas pela base desejada. A parte inteira resultante dos produtos formará os dígitos da parte fracionária do número convertido.011) 2 86 .1)16 0. (8.375)10 = (?) 2 (8)10 = (1000) 2 0. m = quantidade de algarismos da parte fracionária.000 → Fim (8. (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.

Sign up to vote on this title
UsefulNot useful