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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

APÊNDICE 16.16.1 Tabela ASCII 83 .

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

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

500 * 2 = 1.011) 2 86 .375 * 2 = 0. A lei de Formação para números fracionários é: Número = an * b n + an −1 * b n −1 + an−2 * b n−2 + K + a0 * b0 + a−1 * b −1 + a−2 * b −2 + K + a−m * b − m onde: an = algarismo.750 * 2 = 1.000 →0 →1 →1 (37. (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.000 → Fim (8.0625)10 = (25.0625 *16 = 1 → 1 0.750 0.000 → Fim (37.375)10 = (?) 2 (8)10 = (1000) 2 0.500 0. b = base do número. (8.Existem uma relação estreita entre o sistema binário e o hexadecimal. A parte fracionária é utilizado o processo das multiplicações sucessivas pela base desejada. A parte inteira resultante dos produtos formará os dígitos da parte fracionária do número convertido.1)16 0. Esta relação vem do fato que o número 16 pode ser escrito como 24.0625)10 = (?)16 (37)10 = ( 25)16 0. m = quantidade de algarismos da parte fracionária. n = quantidade de algarismos da parte inteira –1.375)10 = (1000. a parte inteira é convertida separadamente pelo processo das divisões sucessivas. Para a conversão de base 10 para base 2 ou base 16.

Sign up to vote on this title
UsefulNot useful