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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

2.6.6

Outros Operadores
Tabela 2.7 Outros operadores.

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

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

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

2.6.7

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

Maior

Menor

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

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

*

&

sizeof

+=

-=

*=

25

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

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

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

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

3.2

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

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

26

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

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

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

3.3
• • •

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

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

• •

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

return (<expressão>);

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

void exit(int codigo_de_retorno);

27

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

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

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

3.4
por exemplo:

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

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

28

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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.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.Figura 14.

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

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

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

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

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

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

16. APÊNDICE 16.1 Tabela ASCII 83 .

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

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

375)10 = (1000.750 0. Para a conversão de base 10 para base 2 ou base 16.000 → Fim (37.500 0.000 →0 →1 →1 (37.375 * 2 = 0. (8.500 * 2 = 1.750 * 2 = 1. A parte fracionária é utilizado o processo das multiplicações sucessivas pela base desejada.000 → Fim (8. m = quantidade de algarismos da parte fracionária.0625)10 = (25.0625 *16 = 1 → 1 0.1)16 0. a parte inteira é convertida separadamente pelo processo das divisões sucessivas.Existem uma relação estreita entre o sistema binário e o hexadecimal. Esta relação vem do fato que o número 16 pode ser escrito como 24. 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. 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. (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.375)10 = (?) 2 (8)10 = (1000) 2 0.011) 2 86 .0625)10 = (?)16 (37)10 = ( 25)16 0.

Sign up to vote on this title
UsefulNot useful