PROGRAMAÇÃO DE COMPUTADORES

Utilizando Linguagem C-ANSI

Versão 2.1 - 2007

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

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

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

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

2.

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

2.5.1

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

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

3.

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

4.

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

5.

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

6.

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

7.

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

8.

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

9.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

16. APÊNDICE 16.1 Tabela ASCII 83 .

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

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

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