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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

13.g). 10. 20. 2. 5. 6.h> float g.1 Atribuição O operador de atribuição pode ser utilizado dentro de qualquer expressão válida em C. g=soma10(x). 7. A atribuição é válida para variáveis de tipos diferentes. Esta conversão é conhecida como conversão de tipos. 15. 14.3 Incremento e Decremento -++ Decremento Incremento C inclui dois operadores que geralmente não são encontrados em outras linguagens: 23 .6 Operadores 2. } float soma10(float c) { return(c+10). printf(“g=%f”. 2.1. x = y = z = 0. 4. 19.6. 8. 18. return(0). 17.6. é permitido atribuição do mesmo valor para muitas variáveis em uma única expressão: var1 = var2 = var3 = expressão.h> #include <stdio. 9. /*x é variável local*/ x=15. } 2. 12. /*g é variável global*/ float soma10(float c). 3. ou seja. Em C. porém deve-se observar que poderá ocorrer uma possível perda de informação.6. #include <stdlib. 11. é possível converter os tipos de forma automática. 16. /*c é parâmetro formal*/ int main(void) { float x. x = 10. A forma geral do operador de atribuição é: nome_da_variavel = expressão.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 Tabela verdade operadores bit a bit. & | ^ ~ >> << AND OR XOR Complemento de um Deslocamento à esquerda Deslocamento à direita Tabela 2. Falso é zero.4 Relacionais e Lógicos O operador relacional refere-se à relação que os valores podem ter uns com os outros. atribuir ou deslocar os bits efetivos em um byte (tabela 2.6. Tabela 2.6.3). testar. isto é. O operador lógico refere-se à maneira como essas relações podem ser conectadas. A idéia de verdadeiro e falso é a base dos conceitos dos operadores lógicos e relacionais. A tabela 2.5). Em C. 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 .4 apresenta a tabela verdade dos operadores lógicos utilizando 1s e 0s. 2. por exemplo: 10>5&&!(10<9)||3<=4 p 0 0 1 1 q 0 1 1 0 p&&q 0 0 1 0 p||q 0 1 1 1 Verdadeiro !p 1 1 0 0 Tabela 2.2. Operadores relacionais > Maior que >= Maior ou igual < Menor <= Menor ou igual == Igual != Diferente Operadores lógicos && AND || OR ! NOT É permitido combinar diversas operações em uma expressão.5 Operadores bit a bit. As expressões que usam operadores relacionais ou lógicos devolvem zero para falso e 1 para verdadeiro (tabela 2.5 Bit a Bit A linguagem C oferece um completo conjunto de operadores bit a bit. Tabela 2. verdadeiro é qualquer valor diferente de zero. A tabela 2.6 apresenta a tabela verdade dos operadores bit a bit.4 Tabela verdade operadores lógicos.3 Operadores relacionais e lógicos.

2.6.6

Outros Operadores
Tabela 2.7 Outros operadores.

?: & * sizeof(f) , . -> () []
1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. #include <stdlib.h> #include <stdio.h>

Exp1 ? Exp2 : Exp3 “o endereço de” “o valor do endereço de” Retorna o tamanho em bytes de f Separa seqüência de operações Referência a elementos individuais de estruturas e uniões. Organizar precedência. Indexação de matrizes.

int main(void) { int x, y; printf(“Digite valor de x=”); scanf(&x); printf(“Digite valor de y=”); scanf(&y); print((x>y)? “x>y\n”:((x=y)? “x=y\n”: “x<y\n”) return(0); 13. }

2.6.7

Precedência
Tabela 2.8 Precedência dos operadores em C.

Maior

Menor

() ! * + << < == & ^ | && ?: =

[] -> ~ ++ -/ % >> <= > >= !=

*

&

sizeof

+=

-=

*=

25

3. FLUXO DE CONTROLE 3.1 Comando de Seleção: if...else/switch
1. #include <stdlib.h> #include <stdio.h> int main(void) { int x, y; printf(“Digite valor de x=”); scanf(“%d”,&x); printf(“Digite valor de y=”); scanf(“%d”,&y); if (x>y) printf(“x>y\n”); else { if (x=y) printf(“x=y\n”); else printf(“x<y\n”); } return(0); }

if (<condicao>) <expressão>; else <expressão>;

switch (<expressão>) { case constante1 : <seq. de comandos> break; case constante2 : <seq. de comandos> break; . . . default : <seq. de comandos> }
1. #include <stdlib.h> #include <stdio.h> int main(void) { int x; printf(“Digite valor de x=”); scanf(“%d”,&x); switch (x) { case 0: printf(“x=0\n”); break; case 1: printf(“x=1\n”); break; case 2: printf(“x=2\n”); break; case 3: printf(“x=3\n”); break; default: printf(“3<x<0\z”); } /*Fim switch*/ return(0); }

1. #include <stdlib.h> #include <stdio.h> int main(void) { char y; printf(“Escolha a, b, c ou d:”); y=getchar(); switch (x) { case ’a’: printf(“Escolhido a\n”); break; case ’b’: printf(“Escolhido b\n”); break; case ’c’: printf(“Escolhido c\n”); break; case ’d’: printf(“Escolhido d\n”); break; default: printf(“Escolha invalida\n”); } /*Fim switch*/ return(0); }

3.2

Comando de Iteração: for/while/do...while

for (<inicialização>, <condição>, <incremento>) <seq. de comando> while (<condição>) do { { <seq. de comando> <seq. de comando> } } while (<condição>);

26

1. #include <stdlib.h> #include <stdio.h> int main(void) { int i; for (i=0; i<10; i++) printf(“%d ”,i); return(0); }

1. #include <stdlib.h> #include <stdio.h> int main(void) { int i; i=0; while (i<10) { printf(“%d ”,i); } return(0); }

1. #include <stdlib.h> #include <stdio.h> int main(void) { int i; i=0; do { printf(“%d ”,i); } while (i<10); return(0); }

3.3
• • •

Comando de Desvio
Na linguagem C há quatro comandos que realizam um desvio incondicional:

return: É usado para retorno de uma função. A função será finalizada tão logo encontre o primeiro return; goto: É um comando de desvio que deve ser utilizado com precaução pois pode causar vazamento do fluxo de informação; break: Este comando possui duas formas de uso. A primeira é utilizada para terminar um case em um comando switch. A segunda forma é utilizada para forçar uma terminação imediata de um laço. O comando break provoca uma saída apenas do laço mais interno;

• •

exit: Este comando provoca uma terminação imediata do programa inteiro, forçando um retorno ao sistema operacional; continue: É um comando similar ao break porém em vez de forçar a terminação do laço, continue força que ocorra a próxima iteração do laço, pulando qualquer código intermediário. Para o laço for, continue faz com que o teste condicional e a porção de incremento do laço sejam executados. Para os laços while e do-while, o controle do programa passa para o teste condicional.

return (<expressão>);

goto <rótulo>; ... <rótulo>:

void exit(int codigo_de_retorno);

27

1. #include <stdlib.h> #include <stdio.h> int main(void) { int x; x=1; volta1: x++; if (x<50) { printf(”%d\n”,x); goto volta1; } return(0); }

1. #include <stdlib.h> #include <stdio.h> int main(void) { int x; for (x=0; x<50; x++) { printf(”%d\n”,x); if (x==25) break; } return(0); }

1. #include <stdlib.h> #include <stdio.h> int main(void) { char s[80], *str; int esp; printf("Digite uma string:"); gets(s); str=s; for (espaco=0; *str; str++) { if (*str!=' ') continue; esp++; } printf("%d espacos\n", esp); return (0); }

3.4
por exemplo:

Outros Comandos
Um comando de expressão é uma expressão válida em C seguida por ponto-e-vírgula,

soma(); /* Chamada de função */ a=sqrt(pow(b,2)+pow(c,2)); /* Comando de atribuição */ b+raiz(z); /* Comando válido, que não faz nada */ ; /* Comando vazio */

28

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

2.2 Exercícios 1.9. 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 . Utilize ponteiro. Escreva um programa que inverta a ordem dos caracteres de uma cadeia de caracteres. Faça um programa que carregue um vetor 10 de números reais.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Elaborar as funções pop() e push() de uma pilha.11 Exemplo de árvore binária. 4. 3. Uma árvore binária ordenada é aquela em que a subárvore da esquerda contém nós que são menores ou iguais à raiz e os da direita são maiores que a raiz.5 EXERCÍCIOS 1. Elaborar as funções para armazenar e recuperar dados em uma fila.Figura 14. 81 . Elaborar um programa que simule uma fila de atendimento. Elaborar um programa que simule o armazenamento e recuperação de uma pilha. 2. 14.

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

16. APÊNDICE 16.1 Tabela ASCII 83 .

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

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

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

Sign up to vote on this title
UsefulNot useful