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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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. Use ponteiros. Utilize ponteiro. calcule a média aritmética dos elementos e mostre todos elementos maiores ou iguais à media e sua respectiva posição na vetor.2 Exercícios 1. 2. 47 .9.

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

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

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

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

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

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

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

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

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

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

58 . Elabore funções que. apresentem a equação da circunferência. a relação entre x e y é dada pela equação abaixo (equação da circunferência). y) é um ponto qualquer da circunferência. Se P(x. e verificar se a circunferência passa pela origem. dado o centro C e a distância r. os pontos em que a circunferência corta o eixo Ox e Oy.18. 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.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

APÊNDICE 16.1 Tabela ASCII 83 .16.

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

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

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

Sign up to vote on this title
UsefulNot useful