PROGRAMAÇÃO DE COMPUTADORES

Utilizando Linguagem C-ANSI

Versão 2.1 - 2007

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

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

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

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

2.

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

2.5.1

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

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

3.

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

4.

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

5.

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

6.

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

7.

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

8.

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

9.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

o elo proximo do 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. o elo anterior do nó corrente aponta para o novo nó. do fim ou ao longo da lista e retornar o valor armazenado nela. A operação de remoção consiste em remover um nó do início.b) O campo info do nó é inicializado com um valor em particular. d) Ao determinar a posição de inserção. 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.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. 78 . O elo proximo do novo nó aponta para o nó corrente e. O elo anterior do novo nó aponta para o anterior do nó corrente.

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

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

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

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

1 Tabela ASCII 83 .16. APÊNDICE 16.

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

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

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

Sign up to vote on this title
UsefulNot useful