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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

2 Exercícios 1. 47 .9. Faça um programa que carregue um vetor 10 de números reais. 2. 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. Escreva um programa que inverta a ordem dos caracteres de uma cadeia de caracteres. Use ponteiros.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

6 Ilustração de inserção em uma lista singularmente ligada. C A C A C A Tmp (1) Primeiro Tmp (2) Primeiro Primeiro (3) Figura 14. C S R A A Primeiro (1) Tmp C S R A A Primeiro (2) Tmp C S R A A Primeiro (3) 76 .Figura 14.7 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).2 Listas Duplamente Ligadas Uma lista duplamente ligada (ou lista linear duplamente ligada) consiste em dados e elos para o próximo item e para o item precedente. d) ponteiro Ultimo recebe novo nó. no meio da lista. 14. d) O ponteiro Primeiro recebe novo nó. b) O elo proximo do novo nó recebe Primeiro. no fim da lista. 77 . b) O elo anterior do novo nó recebe Ultimo. a lista pode ser reconstruída utilizando-se o outro elo.3.8 Ilustração de inserção em uma lista singularmente ligada. Se um dos elos tornar-se inválido. 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). 1 9 3 5 Primeiro Último Figura 14. 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ó.Figura 14.8 Ilustração de uma lista linear duplamente ligada. 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. A vantagem de possuir dois elos são: • • A lista pode ser lida em ambas as direções. c) O elo anterior apontado por Primeiro recebe novo nó.

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

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

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

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

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

APÊNDICE 16.16.1 Tabela ASCII 83 .

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

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

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

Sign up to vote on this title
UsefulNot useful