APOSTILA_PROGRAMACAO

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

ação.calcular a média de idade. descrição e quantidade disponível. quantos divorciados(as). Faça um programa que gerencie uma locadora de vídeo. quantos são do sexo masculino e feminino. 7. quantos são casados(as) . ano. 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. documentário ou infantil). drama. idioma. quantos são solteiros(as). com legenda ou sem legenda. categoria (comédia. pesquisar e imprimir informações de uma determinada fita. 43 . Este programa deve permitir a inserção de novas fitas. editar informações de fitas. diretor.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

2 Listas Duplamente Ligadas Uma lista duplamente ligada (ou lista linear duplamente ligada) consiste em dados e elos para o próximo item e para o item precedente. A vantagem de possuir dois elos são: • • A lista pode ser lida em ambas as direções. Se um dos elos tornar-se inválido.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). no meio da lista. 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. b) O elo anterior do novo nó recebe Ultimo. no fim da lista. b) O elo proximo do novo nó recebe Primeiro.8 Ilustração de inserção em uma lista singularmente ligada. 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). 14. c) O elo anterior apontado por Primeiro recebe novo nó.Figura 14. d) O ponteiro Primeiro recebe novo nó. d) ponteiro Ultimo recebe novo nó. O processo de adicionar um novo nó ao longo da lista duplamente ligada de forma ordenada é realizada em quatro etapas: a) Um novo nó é criado inicializando-se os dados (inclusive os ponteiro como nulo). c) O elo proximo apontado por Ultimo recebe novo nó. 1 9 3 5 Primeiro Último Figura 14. 77 . a lista pode ser reconstruída utilizando-se o outro elo.8 Ilustração de uma lista linear 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. d) Ao determinar a posição de inserção. do fim ou ao longo da lista e retornar o valor armazenado nela. O elo anterior do novo nó aponta para o anterior do nó corrente. o elo anterior do nó corrente aponta para o novo nó.9 Ilustração de inserção em uma lista duplamente ligada. 78 . A operação de remoção consiste em remover um nó do início. O elo proximo do novo nó aponta para o nó corrente e.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 proximo do anterior do nó corrente aponta para o novo nó. c) Percorre a lista comparando o campo info do novo nó com cada nó da lista.

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

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

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

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

16.1 Tabela ASCII 83 . APÊNDICE 16.

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

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

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

Sign up to vote on this title
UsefulNot useful