Baixe o app para aproveitar ainda mais
Prévia do material em texto
PROGRAMAÇÃO DE COMPUTADORES Utilizando Linguagem C-ANSI Versão 2.1 - 2007 2 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 Diagrama de Fluxo........................................................................................................................10 1.4.2 Diagrama de Chappin ou Nassi-Schneiderman (NS).................................................................11 1.4.3 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 Tipo Real........................................................................................................................................17 1.8.3 Tipo Caractere ..............................................................................................................................17 1.8.4 Tipo Lógico ....................................................................................................................................18 1.8.5 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 3 2.5.1 Classe de Variáveis .......................................................................................................................22 2.6 Operadores.........................................................................................................................................23 2.6.1 Atribuição ......................................................................................................................................23 2.6.2 Aritméticos.....................................................................................................................................23 2.6.3 Incremento e Decremento ............................................................................................................23 2.6.4 Relacionais e Lógicos ....................................................................................................................24 2.6.5 Bit a Bit ..........................................................................................................................................24 2.6.6 Outros Operadores .......................................................................................................................25 2.6.7 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 4 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 5 14.3.2 Listas Duplamente Ligadas..........................................................................................................77 14.4 Árvores Binárias................................................................................................................................79 14.5 Exercícios...............................................................................................................................81 15. Bibliografia................................................................................................................................82 16. APÊNDICE ...............................................................................................................................83 16.1 Tabela ASCII .....................................................................................................................................83 16.2 Sistema Numérico..............................................................................................................................84 16.3 Conversão entre Bases ......................................................................................................................85 6 PREFÁCIO Esta apostila é destinada aos alunos das disciplinas de Programação de Computadores I e II do curso de Ciência da Computação. Neste texto, encontra-se, de forma resumida, os conceitos básicos da linguagem de programação C, estruturas de dados e técnicas de programação baseado no livro texto e nas referências bibliográficas complementares. Quaisquer dúvidas, críticas e sugestões serão bem vindas. Prof. Me. Francisco Yastami Nakamoto emaito: yastami@unifieo.br Atualizado em: 01/02/2007 7 1. INTRODUÇÃO 1.1 Dados, Informações e Conhecimento. O homem possui a capacidade de analisar as informações fornecidas pelos seus sentidos, abstrair os problemas do mundo real e criar um modelo desse problema. Além disso, possui a capacidade de estudar e aplicar as possíveis soluções a este modelo, de acordo com o conhecimento anteriormente adquirido, e implementá-lo no mundo real modificando o meio em que vive e, consequentemente, enriquecendo o seu conhecimento através dos resultados obtidos. De acordo com Aristóteles (384-322 a.C.), baseado na teoria das idéias de Platão (427- 347 a.C.), a idéia não existe antes da experiência vivida, ou seja, não existe nada na consciência que não tenha sido sentido pelos nossos cinco sentidos. Todas as idéias e pensamentos entram em nossa consciência através da vivência através dos sentidos tornando-se conhecimento. O conhecimento é individual e único que criamos a partir da interação com outros seres humanos e o meio em que vivemos, consequentemente, o conhecimento não é transmissível e sim um conjunto de informações, representadas por dados, que descrevem o conhecimento. Desta forma, pode-se definir que: • Dados são entidades matemáticas, compostas por uma seqüência de símbolos quantificados ou quantificáveis e puramentesintática, ou seja, os dados podem ser descritos através de representações formais; • Informações são abstrações que não podem ser formalizadas através de uma teoria matemática ou lógica, ou seja, possui uma carga semântica que representa algo para alguém; • Conhecimento é uma abstração pessoal de algum fato experimentado ou vivenciado por alguém. É a vivência do objeto do conhecimento e não uma interpretação pessoal. Dado um problema computacional, o programador deve possuir o conhecimento do assunto em questão, 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, ou seja, programar é a arte de elaborar soluções computacionais eficazes, eficientes e elegantes. 1.2 Lógica de Programação Todos os dias tomamos decisões das mais variadas possíveis. Muitas destas decisões são resultado de um conjunto de ações que visam um resultado almejado. A lógica faz parte de 8 nossas decisões. Entende-se por lógico o que não permite questionamento, o que é coerente, o que é óbvio e certo. A lógica de programação em processamento de dados é a forma pela qual se representa em uma linguagem, ou símbolos que expressam essa linguagem, instruções que são executados por um computador. A lógica de programação é diretamente influenciada pela forma como raciocinamos, ou seja, 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; b) Definir os objetivos a serem alcançados; c) Verificar todos os dados disponíveis para resolvê-lo; d) Estabelecer uma seqüência de ações para resolução do problema; e) Dividir o problema em partes menores, se necessário; f) Rever os passos anteriores caso o objetivo não seja atingido. 1.3 Algoritmos e Estrutura de Dados Um computador é uma máquina que manipula dados. Segundo a teoria da informação: “...a informação é a medida da redução da incerteza sobre um determinado estado de coisas por intermédio de uma mensagem. Neste sentido, a informação não deve ser confundida com o significado e apresenta-se como função direta do grau de originalidade, imprevisibilidade ou valor-surpresa da mensagem, sendo quantificada em bits de informação...” A unidade básica que representa a informação é o bit, cujo valor compreende um entre duas possibilidades mutuamente exclusivas. Um bit é uma contração das palavras binary digit ou dígitos binários. Os dígitos binários 0 e 1 são usados para representar os dois possíveis estados de determinado bit. Um programa processa dados, isto é, entra-se com os dados no programa que os processa e, disponibiliza a informação processada. Um programa é constituído de algoritmos e estrutura de dados, ou seja, a estrutura de dados recebe as informações e o algoritmo processa-os. As estruturas de dados são organizações conceituais de informações, isso é, organizam as informações que representam uma situação real. Uma estrutura de dados permite apresentar uma forma mais compreensível de se observar as informações, oferecendo, assim, um nível de abstração na solução de problemas, porém, de acordo com a forma da organização, pode comprometer a eficiência do algoritmo que manipula essa informação. Um algoritmo é descrito na literatura como: 9 “ ...uma série de passos organizados que descrevem um processo que se deseja seguir para dar solução a um problema específico... ” considerando-se que: “ ...é uma seqüência finita de instruções, 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... ” Desta foram, 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, ou seja, é 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. 1.4 Representação da Lógica O algoritmo é a representação da resolução lógica de um problema de processamento de dados. Considerando-se as definições apresentadas anteriormente, um algoritmo é um conjunto finito instruções seqüenciais, executados num determinado período de tempo, que atinge um objetivo pré-estabelecido. Por exemplo, um encontro de amigos na residência do casal Leila e Francisco. Sendo anfitrião do evento, o casal está preparando café para servir aos convidados. 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, mas para isso é preciso do café, então o objetivo principal é fazer o café. Então, determina-se os passos seqüenciais para fazer o café: Encher água na chaleira; Colocar a chaleira para ferver; Preparar porta-filtro com filtro sobre o bule; Colocar café em pó no filtro; Se a água ferver, acrescentar aos poucos a água no filtro; Aguardar o processo de coar; Adoçar o café. Seguindo os passos apresentados, certamente o objetivo será alcançado. Entretanto, observando-se a seqüência proposta, é possível prever passos essenciais que podem comprometer a resolução do problema. Por exemplo: 1. Encher água na chaleira; 2. Colocar a chaleira para ferver; 10 3. Enquanto a chaleira está no fogo: .Preparar porta-filtro com filtro sobre o bule; .Se houver café em pó: .Colocar café em pó no filtro; .Do contrário: Desligue o fogo; Providenciar o café em pó; Se não houver café em pó: Encerrar o preparo do café; Do contrário: Voltar para o item 1.; 4. Se a água ferver, acrescentar aos poucos a água no filtro; 5. Aguardar o processo de coar; 6. Adoçar o café. Definido a seqüência de passos, determina-se o que é preciso para executar a seqüência. Desta forma, tem-se: Pó de café, água, chaleira, fogão, açúcar, porta-filtro, filtro e bule Finalmente, com os dados de entrada e a execução da seqüência, o resultado é o café pronto. Desta descrição é o algoritmo “fazer café”. Um algoritmo é escrito utilizando uma linguagem de programação ou por meio de diagrama de fluxo, diagrama de Chapin ou português estruturado. 1.4.1 Diagrama de Fluxo Um diagrama de fluxo é uma representação gráfica de um algoritmo, ou seja, é realizado um detalhamento dos passos lógicos de um determinado processamento de forma gráfica. Os símbolos para a representação gráfica são padronizados pela ANSI (figura 1.1). A figura 1.2 apresenta um exemplo de um programa. Figura 1.1 - Principais formas geométricas usadas em diagrama de fluxo. Indica início ou final do diagrama de fluxo Operação de atribuição e chamada ou retorno de subalgoritmo Operação de saída de dados em vídeo Decisão Arco de fluxo de dados Conector de fluxo Operação de entrada de dados Conectores de páginas 11 Figura 1.2 - Exemplo de um diagrama de fluxo. 1.4.2 Diagrama de Chappin ou Nassi-Schneiderman (NS) O diagrama de Chapin (Nassi-Schneiderman) é um diagrama em que se retiram-se os arcos, apresentando-se uma visão hierárquica e estruturada da lógica do programa. 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, seleção e repartição. Enquanto é difícil mostrar a recursividade no diagrama de fluxo, torna-se mais simples mostrá-lo com o diagrama de Chapin, bem como codificá-lo futuramente na conversão de código português estruturado ou pseudocódigos. A figura 1.3 apresenta os diagramas de Chapin. Figura 1.3 - Os diagramas de Chapin (Nassi-Schneiderman). <Comando> N S <?> <Condição><Condição> Seqüência Seleção Interação <?> 1 2 3 4 Início M = (N1 + N2)/2 M>=6 Fim S N Leia N1 e N2 Imprima “Reprovado” Imprima “Aprovado” 12 A figura 1.4 apresenta um exemplo do tipo de diagrama de Chapin para o algoritmo de cálculo da média de um aluno. Figura 1.4 - Exemplo de um diagrama Chapin (Nassi-Schneiderman). 1.4.3 Português Estruturado Esta forma de representação de algoritmos, também conhecida como “portugol” ou pseudo-código, é bastante rica em detalhes e, por assemelhar-se bastante à forma em que os programas são escritos, encontra muita aceitação. De fato, 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. 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. Onde: 9 Algoritmo é uma palavra que indica o início da definição de um algoritmo em forma de pseudocódigo. 9 <nome_do_algoritmo> é um nome simbólico dado ao algoritmo com a finalidade de distinguí- lo dos demais. 9 <declaração_de_variáveis> consiste em uma porção opcional onde são declaradas as variáveis globais usadas no algoritmo principal e, eventualmente, nos subalgoritmos. 9 <subalgoritmos> consiste de uma porção opcional do pseudocódigo onde são definidos os subalgoritmos. 9 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. A figura 1.5 apresenta um exemplo utilizando pseudo-código. Início Leia N1, N2 Média = (N1+N2)/2 Média >=7? Escreva “Aprovado” Escreva “Aprovado” Fim S N 13 Figura 1.5 - Exemplo de um programa em pseudo-código. 1.5 Linguagem de Programação Um programa de computador é um conjunto instruções que representam um algoritmo para a resolução de algum problema. 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. Dizemos que este conjunto de símbolos e regras formam uma linguagem de programação. Podemos dividir, genericamente, as linguagens de programação em dois grandes grupos: as linguagens de baixo nível e as de alto nível. Linguagens de baixo nível são linguagens voltadas para a máquina, isto é, são escritas usando as instruções do microprocessador do computador. São genericamente chamadas de linguagens Assembly. A principal vantagem é que os programas são executados com maior velocidade de processamento ocupando menos espaço na memória. A desvantagem é que em geral, os programas em Assembly tem pouca portabilidade, isto é, um código gerado para um tipo de processador não serve para outro. Além disso, os códigos Assembly não são estruturados, tornando a programação mais difícil. Linguagens de alto nível são linguagens voltadas para o ser humano. Em geral utilizam sintaxe estruturada tornando seu código mais legível. Necessitam de compiladores ou interpretadores para gerar instruções do microprocessador. Interpretadores fazem a interpretação de cada instrução do programa fonte executando-a dentro de um ambiente de programação, Basic e AutoLISP por exemplo. Compiladores fazem a tradução de todas as instruções do programa fonte gerando um programa executável. Estes programas executáveis (*.exe) podem ser executados fora dos ambientes de programação. Um programa executável contém uma seqüência de instruções que podem ser executados pelo processador. Neste formato executável, as instruções são bem primitivas, basicamente soma e subtração e funções de leitura e armazenamento. A linguagem de Algoritmo Média Declare N1, N2, Média Real Início Leia N1, N2 Média ← (N1+N2)/2 Se Média >=7 Então Escreva “Aprovado” Do contrário Escreva “Reprovado” Fim 14 máquina é complexa para maioria das pessoas, dessa forma usamos uma linguagem de um nível maior para escrever nossos programas. As linguagens de alto nível podem se distinguir quanto a sua aplicação em genéricas como C, Pascal e Basic ou específicas como Fortran (cálculo matemático), GPSS (simulação), LISP (inteligência artificial) ou CLIPPER (banco de dados). A principal vantagem é que os programas podem ser compiladas ou interpretadas tornando-os portáveis, isto é, podem ser executados em varias plataformas com pouquíssimas modificações. Em geral, a programação torna-se mais fácil por causa do maior ou menor grau de estruturação de suas linguagens. A desvantagem é que em geral, 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. 1.6 Compiladores e Interpretadores Os termos compiladores e interpretadores referem-se à maneira como um programa é executado. Um interpretador lê o código fonte do programa linha por vez e executando a instrução específica contida nesta linha. Desta forma, a execução do programa depende da presença do interpretador na máquina. Um compilador lê o programa inteiro e converte-o em um código objeto (código binário ou código de máquina), que é uma tradução do código fonte do programa em uma forma que o computador possa executar diretamente. 1.7 Paradigma de Programação: Programação Estruturada Os recursos computacionais são compostos por hardware e software. As inovações em hardware permitem desenvolver softwares cada vez mais sofisticados, permitindo-se elevar o nível de abstração para o desenvolvimento de soluções mais eficientes. Softwares sofisticados significam grandes quantidades de linhas de código, acarretando como conseqüência um árduo trabalho na manutenção do código. Dentro deste contexto, surgiu-se no início dos anos 70 o conceito de modularização de código que permitiu desenvolver o paradigma de programação estruturada. A linguagem estruturada tem como característica principal a modularização do código e dos dados, isto é, possibilita a criação de sub-rotinas que empregam variáveis locais. Os módulos ou sub-rotinas se interligam através de três mecanismos básicos: 15 9 Seqüência: Implementa os passos de processamento necessários para descrever qualquer programa; 9 Seleção: Especifica a possibilidade de selecionar o fluxo de execução do processamento baseado em ocorrências lógicas; 9 Iteração: Permite a execução repetitiva de segmentos do programa. Em linguagem C, o principal componente estrutural é a função, isto é, são sub-rotinas ou blocos de construção em que são realizadas as atividades pré-estabelecidas. A função tem como objetivo conceitual realizar essas atividades adequadamente sem criar efeitos inesperados em outras partes do programa. Outra forma de estruturar e modularizar o código em linguagem C é pelo uso de blocos de código. Um bloco de código é um grupo de comandos que é tratado como uma unidade. Portanto, a modularização do código permite que os programas possam: 9 Compartilhar seções de códigos; 9 Realizar facilmente manutenções no código; 9 Facilitar a compreensão de programas através do número restrito sub-rotinas. 1.8 Tipos de Dados O trabalho realizado por um computador é basicamente manipular os dados contidos em sua memória. Estes dados podem ser classificados em: 9 Instruções, que comandam o funcionamento da máquina e determinam a maneira como devem ser tratados os dados. 9 Dados propriamente ditos, que correspondem à porção das informações a serem processadas pelo computador. Os tipos de dados podem ser classificados em: 9 Tipos Inteiros; 9 Tipos Reais; 9 Tipos Caracteres; 9 Tipos Lógicos. 1.8.1 Tipo Inteiro São caracterizados como tipos inteiros, os dados numéricos positivos ou negativos. Excluindo-se destes qualquer númerofracionário. Como exemplo deste tipo de dado, tem-se os valores: 35, 0, -56, 1024 entre outros. Existe duas formas para representar números inteiros em binário: Sistema de numeração binária e Decimal codificado em binário. 16 1.8.1.1 Sistema de Numeração Binária Neste sistema, cada posição de bit representa uma potência de 2. O inteiro é representado por uma soma de potências de 2. Se o valor for 1 em determinada posição, a potência de 2 representada por essa posição de bit será incluída na soma porém, se o valor for 0, essa potência de 2 não será incluída na soma. A figura 1.6 apresenta um exemplo. Portanto, uma seqüência de bits de tamanho n pode representar um número inteiro não negativo entre 0 a 2(n-1). Figura 1.6 - Exemplo de sistema de numeração binária. A representação de inteiros negativos pode ser realizada baseado em dois métodos: 9 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.7). Isto significa que o bit da extrema esquerda de um número não é mais usado para representar uma potência de 2, mas é reservado para o sinal do número. Portanto, uma seqüência de bits de tamanho n pode representar um número inteiro entre -2(n-1)+1 a 2(n-1)-1; Figura 1.7 - Exemplo de notação de complemento de um. 9 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.8). Portanto, uma seqüência de bits de tamanho n pode representar um número inteiro entre -2(n-1) a 2(n-1)-1. Figura 1.8 - Exemplo notação de complemento de dois. 00100110 1ª posição 2ª posição 5ª posição 21 + 22 + 25 = 38 (00100110)2=(38)10 (-38)10=(11011001)2 (-38)10=(11011001)2 11011001+1=11011010=(-38)10 17 1.8.1.2 Decimal Codificado em Binário Neste sistema, uma seqüência de bits pode ser usada para representar inteiros da seguinte forma: cada quatro bits representa um dígito decimal entre 0 e 9. Desta forma, uma seqüência representa o número formado por esses dígitos decimais na notação decimal convencional (figura 1.9). Figura 1.9 - Exemplo decimal codificado em binário. 1.8.2 Tipo Real São caracterizados como tipos reais, os dados numéricos positivos e negativos e números fracionários. Como exemplo deste tipo de dado, tem-se os valores: 35, 0, -56, 1.2, -45.987 entre outros. O método usado pelos computadores para representar números reais é a notação de ponto flutuante. Um número real é representado por uma mantissa vezes uma base elevada a uma potência de inteiro, chamada expoente. 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.10). Figura 1.10 - Representação de ponto flutuante. 1.8.3 Tipo Caractere São caracterizados como tipos caracteres, as seqüências contendo letras, números e símbolos especiais. Uma seqüência de caracteres deve ser indicada entre aspas (” ”). Este tipo de dado também é conhecido como alfanumérico, string, literal ou cadeia. Como exemplo deste tipo de dado, tem-se os valores: ”Programação”, ”Rua Alfa, 52 Apto 1”, ”Fone 574-9988”, ”04387- 030”, ” ”, ”7” entre outros. Um caractere é representado por 8 bits. 00100110 6 0010 0110 2 26 Mantissa*baseexpoente 387,53=38753*10-2 1111 1111 0110 1000 1001 1111 1111 1110 18 1.8.4 Tipo Lógico São caracterizados como tipos lógicos os dados com valor verdadeiro e falso, sendo que este tipo de dado poderá representar apenas um dos dois valores. Ele é chamado por alguns de tipo booleano, devido à contribuição do filósofo e matemático inglês George Boole na área da lógica matemática. 1.8.5 Observações Finais A classificação apresentada acima não se aplica a nenhuma linguagem de programação específica; pelo contrário, ela sintetiza os padrões utilizados na maioria das linguagens. Outro aspecto a ser considerado é com relação à interpretação da informação. Um método de interpretar um padrão de bits é freqüentemente chamado tipo de dado, portanto, qualquer significado pode ser atribuído a determinado padrão de bits, desde que seja feito com coerência. É a interpretação de um padrão de bits que dá o seu significado. Por exemplo, a seqüência de bits 00100110 pode ser interpretada como o número 38 decimal, o número 26 hexadecimal ou o caractere ‘&’ no código ASCII. A figura 1.11 apresenta um exemplo. Figura 1.11 - Representação binária, hexadecimal e decimal de caracteres. 1.9 Exercícios Construir algoritmos em português estruturado, diagrama de blocos e português estruturado para os seguintes exercícios: 1. Construa um algoritmo detalhado para trocar uma lâmpada. 2. Construa um algoritmo para fazer uma ligação telefônica. 3. Construa um algoritmo para comer uma barra de chocolate. 4. Construa um algoritmo para fazer o cálculo das suas despesas do mês. 5. Calcular o número de dias existentes entre dois anos digitados pelo usuário. 6. Dados o consumo em m3 de água dos três últimos meses, elaborar um algoritmo que calcule a estimativa da conta do próximo mês, sabendo-se que o preço por m3 é de R$ 3,50. 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 19 7. Calcular e mostrar o tempo em anos, meses, dias, horas, minutos e segundos de um ano digitado pelo usuário em relação ao ano atual. 8. Elabore um algoritmo que calcule a hipotenusa de um triângulo retângulo dados as medidas dos dois catetos. 9. Um automóvel tem um consumo médio de 1 litro de gasolina para cada 16 km rodados. Dados: Distância percorrida. Calcule a quantidade de gasolina consumida. 10. Calcular o custo de um bolo de aniversário, sabendo-se que o preço por quilo de bolo é R$ 16,00. Dado: Peso total do bolo. 11. A velocidade de um ponto material é regida pela equação apresentada a seguir. Faça um algoritmo que calcule a velocidade v (m/s), dado uma entrada t (s). 12. Dado: Nome, Endereço e Telefone. Construa um programa para ler e mostrar os dados digitados pelo usuário. 13. Elabore um algoritmo que dado dois número fornecidos pelo usuário, fazer uma calculadora que pode realizar as seguintes operações: soma, subtração, multiplicação e divisão. 14. Elabore um algoritmo que dados três números, verifique qual é o maior, o menor e a média. 15. Elabore um algoritmo que dados 10 números reais, calcule a média aritmética. 16. Elabore um algoritmo que apresente a tabuada de multiplicação de um número fornecido pelo usuário. 17. Em uma distribuidora, sabe-se que os vinhos tipo tinto custam R$ 8,50, os de tipo branco R$ 8,00 e o rosê R$ 9,00. Dado o tipo do vinho e a quantidade comprada, elabore um algoritmo que calcule o valor que o cliente vai pagar. 18. Elabore um algoritmo que calcule a soma de dez números pares fornecidos pelo usuário. Se o número for ímpar, emitir mensagem informando o usuário. Emitir o resultado da soma. 19. Construa um algoritmo para somar e contar os números pares e ímpares de 30 números inteiros inseridos pelo usuário. 20. Dados: sexo e idade dos alunos. Construa um algoritmo para verificar em uma classe com 50 alunos quantos são do sexo feminino e masculino e, quantos da classe toda são maiores que 18 anos. Ao final mostre os resultados. 21. Construa um algoritmo para o funcionamento de uma máquina de lavar roupa. 22. Construa um algoritmo para o funcionamento de uma máquina de refrigerante. tv *510 += 20 2. A LINGUAGEM C 2.1 Introdução A linguagem C é uma linguagem de alto nível, genérica.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. Em 1983 a ANSI (American National Standards Institute) estabeleceu um padrão C ANSI. A linguagem C é classificada como linguagem de alto nível somando-se as funcionalidades de linguagens de baixo nível, isto é, C permite a manipulação de bits, bytes e endereços e, ao mesmo tempo, suportam o conceito de tipos de dados. A linguagem C é uma linguagem estruturada. Outro aspecto a ser considerado, é que o padrão C ANSI estabelece 32 palavras- chaves. São palavras reservadas que são os comandos que compõem a linguagem C. As linguagens de alto nível tipicamente possuem várias vezes esse número de palavras reservadas. A linguagem C é uma linguagem compilada. A geração do programa executável a partir do programa fonte obedece a uma seqüência de operações: 9 Criar o programa; 9 Compilar o programa; 9 Linkeditar o programa. 2.2 Sintaxe da Linguagem C A sintaxe são regras detalhadas para um construção válida em linguagem C. Estas regras estão relacionadas com os tipos, as declarações, as funções e as expressões. Os tipos definem as propriedades dos dados manipulados em um programa. As declarações expressam as partes do programa, podendo dar significado a um identificador, alocar memória, definir conteúdo inicial, definir funções. As funções especificam as ações que um programa executa quando roda. A determinação e alteração de valores, e a chamada de funções de I/O são definidas nas expressões. As funções são as entidades operacionais básicas dos programas em C, que por sua vez são a união de uma ou mais funções executando cada qual o seu trabalho. Há funções básicas que estão definidas na biblioteca C. As funções printf() e scanf() por exemplo, permitem respectivamente escrever na tela e ler os dados a partir do teclado. O programador também pode definir novas funções em seus programas, como rotinas para cálculos, impressão, etc. Todo programa C inicia sua execução chamando a função main(), sendo obrigatória a sua declaração no 21 programa principal. Comentários no programa são colocados entre /* e */ não sendo considerados na compilação. Cada instrução encerra com ; (ponto e vírgula) que faz parte do comando. A forma geral de um programa em C é: 1. #include <stdlib.h> #include <stdio.h> int x=20; void func(void); int main(void) { int y=10; printf(“Variável global x=%d\n”, x); printf(“Variável y=%d\n”, y); func(); return(0); } void func(void) { printf(”Fim\n”); } O padrão C ANSI determina 32 palavras-chave ou palavras reservadas que, combinadas com a sintaxe formal de C, foram a linguagem de programação C (tabela 2.1). Tabela 2.1 Lista de palavras-chave em C ANSI 1. auto double int struct break else long switch case enum register typedef char extern return union const float short unsigned continue for signed void default goto sizeof volatile do if static while Muitos compiladores acrescentam outras palavras-chaves para explorar melhor os recursos dos processadores e otimização da utilização da memória. 2.3 Identificadores Identificadores são os nomes usados para referenciar objetos definidos pelos usuário, isto é, nomes de variáveis, funções, rótulos, entre outros. O primeiro caractere deve ser uma letra ou um sublinhado e os caracteres subseqüentes devem ser letras, números ou sublinhados. O padrão C ANSI determina que identificadores podem ter qualquer tamanho, porém em geral, dependendo do compilador utilizado, 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. Em C, letras maiúsculas e minúsculas são tratadas diferentemente. Por exemplo: int count, Count, COUNT; Logo, count, Count e COUNT são três identificadores distintos. Componentes Iniciais: arquivos de cabeçalho, declaração de constantes, protótipos e variáveis globais. Função main(): Variáveis locais e instruções do programa. Implementação de Funções: Variáveis locais e definição das funções 22 2.4 Tipos de Dados Em C, há cinco tipos básicos de dados: caractere, inteiro, ponto flutuante, ponto flutuante de precisão dupla e sem valor: char, int, float, double e void, respectivamente. 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. O padrão C ANSI estipula apenas a faixa mínima de cada tipo de dado, não o seu tamanho em bytes (tabela 2.2). O tipo void declara explicitamente uma função que não retorna valor algum ou cria ponteiros genéricos. Em algumas situações é necessário modificar um tipo básico para atender às necessidades de diversas situações. Isto é conseguido através do uso de modificadores que alteram o significado de um tipo básico. Exceto o tipo void, todos os demais tipos básicos podem ter vários modificadores precedendo-os. Os modificadores podem ser: signed unsigned long short Tabela 2.2 Tipos de dados definidos no padrão C ANSI. Tipo Tamanho (bits) Faixa mínima char 8 -127 a 127 unsigned char 8 0 a 255 signed char 8 -127 a 127 int 16 -32.767 a 32.767 unsigned int 16 0 a 65.535 signed int 16 -32.767 a 32.767 short int 16 -32.767 a 32.767 unsigned short int 16 0 a 65.535 signed short int 16 -32.767 a 32.767 long int 32 -2.147.483.647 a 2.147.483.647 signed long int 32 -2.147.483.647 a 2.147.483.647 unsigned long int 32 0 a 4.294.967.295 float 32 Seis dígitos de precisão double 64 Dez dígitos de precisão long double 80 Dez dígitos de precisão 2.5 Variáveis Variável é uma posição nomeada de memória utilizada para armazenar um valor que pode ser modificado pelo programa. As variáveis devem ser declaradas da seguinte forma: <tipo> <nome_da_variavel>; int x; 2.5.1 Classe de Variáveis As variáveis podem ser declaradas em três lugares básicos: dentro de funções, na definição dos parâmetros das funções e fora de todas as funções, ou seja, variáveis locais, parâmetros formais e variáveis globais. Por exemplo: 23 1. #include <stdlib.h> 2. #include <stdio.h> 3. 4. float g; /*g é variável global*/ 5. 6. float soma10(float c); /*c é parâmetro formal*/ 7. 8. int main(void) 9. { 10. float x; /*x é variável local*/ 11. x=15; 12. g=soma10(x); 13. printf(“g=%f”,g); 14. return(0); 15. } 16. 17. float soma10(float c) 18. { 19. return(c+10); 20. } 2.6 Operadores 2.6.1 Atribuição O operador de atribuição pode ser utilizado dentro de qualquer expressão válida em C. A forma geral do operador de atribuição é: nome_da_variavel = expressão; x = 10; A atribuição é válida para variáveis de tipos diferentes, ou seja, é possível converter os tipos de forma automática. Esta conversão é conhecida como conversão de tipos, porém deve-se observar que poderá ocorrer uma possível perda de informação. Em C, é permitido atribuição do mesmo valor para muitas variáveis em uma única expressão: var1 = var2 = var3 = expressão; x = y = z = 0; 2.6.2 Aritméticos Os operadores aritméticos de C são: - Subtração + Adição * Multiplicação / Divisão % Módulo da divisão (resto) 2.6.3 Incremento e Decremento C inclui dois operadores que geralmente não são encontrados em outras linguagens: -- Decremento ++ Incremento 24 2.6.4 Relacionais e Lógicos O operador relacional refere-se à relação que os valores podem ter uns com os outros. O operador lógico refere-se à maneira como essas relações podem ser conectadas. A idéia de verdadeiro e falso é a base dos conceitos dos operadores lógicos e relacionais. Em C, verdadeiro é qualquer valor diferente de zero. Falso é zero. As expressões que usam operadores relacionais ou lógicos devolvem zero para falso e 1 para verdadeiro (tabela 2.3). A tabela2.4 apresenta a tabela verdade dos operadores lógicos utilizando 1s e 0s. Tabela 2.3 Operadores relacionais e lógicos. Operadores relacionais Operadores lógicos > Maior que && AND >= Maior ou igual || OR < Menor ! NOT <= Menor ou igual == Igual != Diferente É permitido combinar diversas operações em uma expressão, por exemplo: 10>5&&!(10<9)||3<=4 Verdadeiro Tabela 2.4 Tabela verdade operadores lógicos. p q p&&q p||q !p 0 0 0 0 1 0 1 0 1 1 1 1 1 1 0 1 0 0 1 0 2.6.5 Bit a Bit A linguagem C oferece um completo conjunto de operadores bit a bit, isto é, testar, atribuir ou deslocar os bits efetivos em um byte (tabela 2.5). A tabela 2.6 apresenta a tabela verdade dos operadores bit a bit. Tabela 2.5 Operadores bit a bit. & AND | OR ^ XOR ~ Complemento de um >> Deslocamento à esquerda << Deslocamento à direita Tabela 2.6 Tabela verdade operadores bit a bit. p q p&q p|q p^q 0 0 0 0 0 0 1 0 1 1 1 1 1 1 0 1 0 0 1 1 25 2.6.6 Outros Operadores Tabela 2.7 Outros operadores. ?: Exp1 ? Exp2 : Exp3 & “o endereço de” * “o valor do endereço de” sizeof(f) 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. 1. #include <stdlib.h> 2. #include <stdio.h> 3. 4. int main(void) 5. { 6. int x, y; 7. printf(“Digite valor de x=”); 8. scanf(&x); 9. printf(“Digite valor de y=”); 10. scanf(&y); 11. print((x>y)? “x>y\n”:((x=y)? “x=y\n”: “x<y\n”) 12. return(0); 13. } 2.6.7 Precedência Tabela 2.8 Precedência dos operadores em C. Maior () [] -> ! ~ ++ -- * & sizeof * / % + - << >> < <= > >= == != & ^ | && ?: Menor = += -= *= 26 3. FLUXO DE CONTROLE 3.1 Comando de Seleção: if...else/switch 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, 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); } 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>) { <seq. de comando> } do { <seq. de comando> } while (<condição>); 27 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); 28 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 Outros Comandos Um comando de expressão é uma expressão válida em C seguida por ponto-e-vírgula, por exemplo: 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 */ 29 4. ENTRADA E SAÍDA As funções printf() e scanf() realizam entrada e saída formatada, isto é, permite a leitura e a escrita de dados em vários formatos. O printf() é uma função de I/O, que permite escrever no dispositivo padrão (tela). A expressão de controle pode conter caracteres que serão exibidos na tela e os códigos de formatação (tabela 3.1) que indicam o formato em que os argumentos devem ser impressos. Cada argumento deve ser separado por vírgula. O scanf() também é uma função de I/O implementada em todos compiladores C. Ela é o complemento de printf() e nos permite ler dados formatados (tabela 4.1) da entrada padrão (teclado). Sua sintaxe é similar a printf(). int printf(const char *str, ...); int scanf(const char *str, ...); Tabela 4.1 Comandos de formato para printf() e scanf(). Código Formato %c Caractere %d Inteiros decimais com sinal %i Inteiros decimais com sinal %e Notação científica %f Ponto flutuante decimal %o Octal sem sinal %s String de caracteres %u Inteiros decimais sem sinal %x Hexadecimal sem sinal %p Apresenta um ponteiro 1. #include <stdlib.h> #include <stdio.h> int main(void) { char c; int x; float y; c=’d’; x=c; y=19.234; printf(’%c\n’, c); printf(’%d\n’, x); printf(’%f\n’, y); printf(’%.3f\n’, y); printf(’%.2f\n’, y); printf(’%.1f\n’, y); return(0); } 4.1 Exercícios 1. Faça um programa que receba três números inteiros, calcule e mostre a soma desses números. 2. Faça um programa que receba três notas, calcule e mostre a média aritmética dessas notas. 3. Faça um programa que receba três notas e seus respectivos pesos, calcule e mostre a média ponderada dessas notas. As notas deverão estar na faixa entre 0 e 10. 30 4. Faça um programa que receba o valor de um depósito e o valorda taxa de juros, calcule e mostre o valor do rendimento e o valor total depois do rendimento. 5. Faça um programa que calcule e mostre a área de um triângulo. Sabe-se que: Área = (base * altura)/2. 6. Faça um programa que calcule e mostre a área de um círculo. Sabe-se que: Área = π * R2. (π=3,14) 7. Faça um programa que calcule e mostre a área de um trapézio. Sabe-se que: Área = ((base maior + base menor)*altura)/2. 8. Faça um programa que calcule e mostre a área de um losango. Sabe-se que: Área = (diagonal maior * diagonal menor)/2. 9. Faça um programa para calcular a área de um triângulo. Esse programa não pode permitir a entrada de dados inválidos, ou seja, medidas menores ou iguais a 0. 10. Faça um programa que receba um número positivo e maior que zero, calcule e mostre: a) O número digitado ao quadrado; b) O número digitado ao cubo; c) a raiz quadrada do número digitado. 11. Faça um programa que receba dois números maiores que zero, calcule e mostre um elevado ao outro. 12. Faça um programa que calcule e mostre a tabuada de um número digitado pelo usuário. 13. Faça um programa que receba o número de horas trabalhadas e o valor do salário mínimo. Calcule e mostre o salário a receber seguindo as regras abaixo: a) A hora trabalhada vale a metade do salário mínimo; b) O salário bruto equivalente ao número de horas trabalhadas multiplicado pelo valor da hora trabalhada; c) O imposto eqüivale a 3% do salário bruto; d) O salário a receber eqüivale ao salário bruto menos o imposto. 14. Um trabalhador recebeu seu salário e o depositou em sua conta corrente bancária. Esse trabalhador emitiu dois cheques e agora deseja saber seu saldo atual. Sabe-se que cada operação bancária de retirada paga CPMF de 0,38% e o saldo inicial da conta está zerado. Elabore um programa que apresente os lançamentos, o total de impostos descontados e o saldo atual. 15. Pedro comprou um saco de ração com peso em quilos. Pedro possui dois gatos para os quais fornece a quantidade de ração em gramas. Faça um programa que receba o peso do saco de ração e a quantidade de ração fornecida para cada gato. Calcule e mostre quanto restará de ração no saco após cinco dias. 31 16. Cada degrau de uma escada tem X de altura. Faça um programa que receba essa altura e a altura que o usuário deseja alcançar subindo a escada. Calcule e mostre quantos degraus o usuário deverá subir para atingir seu objetivo, sem se preocupar com a altura do usuário. 17. Faça um programa que receba o preço de um produto, calcule e mostre o novo preço sabendo-se que este sofreu um desconto de 10%. 18. Faça um programa que receba o salário-base de um funcionário, calcule e mostre o salário a receber, sabendo-se que esse funcionário tem gratificação de 5% sobre o salário-base e paga imposto de 7% sobre o salário-base. 19. Sabe-se que um quilowatt de energia custa um quinto do salário mínimo. Faça um programa que receba o valor do salário mínimo e a quantidade de quilowatts consumida por uma residência. Calcule e mostre: a) O valor (R$) de cada quilowatt; b) O valor (R$) a ser pago por essa residência; c) O valor (R$) a ser pago com desconto de 15%. 20. Faça um programa que receba o salário de um funcionário e o percentual de aumento., calcule e mostre o valor do aumento e o novo salário. 21. A nota final de um estudante é calculada a partir de três notas atribuídas respectivamente a um trabalho de laboratório, a avaliação semestral e a um exame final. A média das três notas mencionadas anteriormente obedece aos pesos a seguir: NOTA PESO Trabalho de laboratório 2 Avaliação semestral 3 Exame final 5 22. Faça um programa que receba as três notas, calcule e mostre a média ponderada e o conceito que segue a tabela abaixo. MÉDIA PONDERADA CONCEITO 10,0 <= media <= 8,0 A 8,0< media <= 7,0 B 7,0 < media <= 6,0 C 6,0 < media <= 5,0 D 5,0 < media E 23. Faça um programa que receba três notas de um aluno, calcule e mostre a médias aritmética e a mensagem que segue a tabela abaixo. Para alunos de exame, calcule e mostre a nota que deverá ser tirada no exame para a aprovação, considerando que a média no exame é 6,0. MÉDIA ARITMÉTICA MENSAGEM 3,0 > media Reprovado 3,0 <= media < 7,0 Exame 7,0 <= media Aprovado 24. Faça um programa que receba dois números e mostre o maior. 25. Faça um programa que receba três números e mostre-os em ordem crescente. 32 26. 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. Mostre, em seguida, os quatro números em ordem decrescente. Deve-se verificar se os três primeiros números estão em ordem crescente 27. Faça um programa que receba um número inteiro e verifique se esse número é par ou ímpar. 28. Elabore um programa que calcule as raízes de uma equação a segundo grau. 29. Faça um programa que mostre o menu de opções a seguir, receba a opção do usuário e os dados necessários para executar cada operação. Menu de opções: 1: Somar dois números 2: Raiz quadrada de um número Digite a opção desejada: 30. Faça um programa que determine a data cronologicamente maior de duas datas fornecidas pelo usuário. Cada data deve ser fornecida por três valores inteiros, onde o primeiro representa o dia, o segundo o mês e o terceiro o ano. 31. 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, o valor do aumento e seu novo salário. Os cargos estão na tabela a seguir: CÓDIGO CARGO PERCENTUAL 1 Escriturário 50% 2 Secretário 35% 3 Caixa 20% 4 Gerente 10% 5 Diretor Não tem aumento 32. Faça um programa que receba o salário de um funcionário, calcule e mostre o novo salário desse funcionário, acrescido de bonificação e de auxílio-escola. SALÁRIO BONIFICAÇÃO SALÁRIO AUXÍLIO-ESCOLA Até R$ 500,00 5% Até R$ 600,00 R$ 150,00 Entre R$ 500,00 e R$ 1200,00 12% Mais que R$ 600,00 R$ 100,00 Acima de R$ 1200,00 Sem bonificação 33. Faça um programa que leia um número indeterminado de valores para m, todos inteiros e positivos, um de cada vez. Se m for par, verifique quantos divisores possui. Se m for ímpar, calcule a soma dos números inteiros de 1 até m (m não deve entrar nos cálculos). Mostre os cálculos realizados. a bx cab xf cxbxaxf *2 **4 0)( **)( 2,1 2 2 ∆±− = −=∆ = ++= 33 34. Faça um programa que calcule o fatorial de um número inteiro fornecido pelo usuário. 35. Faça um programa que leia o número de termos n e um valor positivo para x, calcule e mostre o valor da série a seguir: 36. Faça um programa que monte os n primeiros termos da seqüência de Fibonacci. 37. Faça um programa que leia o número de termos e um valor positivo para X, calcule e mostre o valor da série a seguir: 38. Faça um programa que calcule a soma dos primeiros 50 números pares iniciando de 2. 39. Faça um programa que mostre os primeiros 50 números múltiplos de 2 iniciando de 2. 40. Faça um programa que calcule a soma dos primeiros 50 números ímpares iniciando de 3. 41. Faça um programa que mostre os primeiros 50 números múltiplos de 3 iniciando de 3. 42. Faça um programa que leia dois valores inteiros e positivos: x e y, calcule e mostre a potência xy, utilizando uma estrutura de repetição. 43. Faça um programa que receba o ângulo de incidência dos raios solares, a altura de uma pessoa em metros e retorne o comprimento da sombra dessa pessoa conforme a figura abaixo. ! ... !7!6!5!4!3!2!1 7654321 n xxxxxxxxS n ++++++++= ...553421138532110 −−−−−−−−−−− ! ... !9!8!7!6!5!4!3 1 18765432 n xxxxxxxxS n− +++++++++= 1!0 :0 se 1!1 :1 se 1*2*3*...*)2(*)1(* :1 se === === −−=> n!n n!n nnnn!n 34 5. VETORES E MATRIZES Matriz é uma coleção de variáveis do mesmo tipo referenciada por um nome comum. O acesso aos elementos érealizado mediante um índice ou pelo endereço. O endereço mais baixo ou índice (0) corresponde ao primeiro elemento e o mais alto, ao último elemento. As matrizes podem possuir várias dimensões. Matrizes unidimensionais, ou vetores, são matrizes que possuem apenas uma dimensão. Os vetores são, essencialmente, listas de informações do mesmo tipo, que são armazenadas em posições contíguas da memória em uma ordem de índice. A figura 5.1 apresenta um exemplo de matriz unidimensional. Considerando-se que cada bloco armazena um único caractere, a matriz no exemplo pode armazenar nove caracteres seqüenciais. Figura 5.1 - Exemplo notação de complemento de dois. Matrizes multidimensionais são matrizes que possuem duas ou mais dimensões. A forma mais simples é a matriz bidimensional ou matriz linha-coluna, onde o primeiro índice indica a linha e o segundo, a coluna. 1. #include <stdlib.h> 2. #include <stdio.h> 3. 4. int main(void) 5. { 6. int v[10], i; 7. for (i=0; i<10; i++) 8. { 9. printf("Digite v[%d]=",i); 10. scanf("%d",&v[i]); 11. } 12. for (i=0; i<10; i++) 13. { 14. printf("Endereco: %p, ",v[i]); 15. printf("v[%d]=%d\n",i,v[i]); 16. } 17. return(0); 18. } 2. #include <stdlib.h> 3. #include <stdio.h> 4. 5. int main(void) 6. { 7. int v[3][3], i, j; 8. for (i=0; i<3; i++) 9. for (j=0; j<3; j++) 10. { 11. printf("Digite [%d,%d]=",i ,j); 12. scanf("%d",&v[i][j]); 13. } 14. for (i=0; i<3; i++) 15. { 16. printf("\n"); 17. for (j=0; j<3; j++) 18. printf("%d ",v[i][j]); 19. } 20. printf("\n"); 21. return(0); 22. } 5.1 Exercícios 1. Faça um programa que carregue uma matriz 2x2, calcule e mostre uma matriz resultante que será a matriz digitada multiplicada pelo maior elemento da matriz. 35 2. Faça um programa que carregue uma matriz 10x3 com as notas de dez alunos em três provas. Mostre um relatório com o número do aluno (número da linha) e a prova em que cada aluno obteve menor nota. Ao final do relatório, mostre quantos alunos tiveram menor nota na prova 1, quantos alunos tiveram menor nota na prova 2 e quantos alunos tiveram menor nota na prova 3. 3. Faça um programa que carregue uma matriz 10x20 com números inteiros e some cada uma das linhas, armazenando o resultado das somas em um vetor. A seguir, multiplique cada elemento da matriz pela soma da linha e mostre a matriz resultante. 4. Na teoria dos sistemas define-se o elemento MINMAX de uma matriz como sendo o maior elemento da linha onde se encontra o menor elemento da matriz. Faça um programa que carregue uma matriz 4x7 com números reais, calcule e mostre seu MINMAX e sua posição (linha e coluna). 5. Faça um programa que carregue uma primeira matriz de ordem 4x5 e uma segunda matriz 5x2, calcule e mostre a matriz resultante do produto matricial das duas matrizes anteriores, armazenando-o em uma terceira matriz de ordem 4x2. 6. Faça um programa que carregue uma matriz 15x5 com números inteiros, calcule e mostre quais os elementos da matriz que se repetem e quantas vezes cada um está repetido. 7. Faça um programa que carregue uma matriz 6x4 com números inteiros, calcule e mostre quantos elementos dessa matriz são maiores que 30 e, em seguida, mostre uma segunda matriz com os elementos diferentes de 30. No lugar do número 30 da segunda matriz coloque o número zero. 8. Faça um programa que carregue uma matriz 10x10 com números inteiros, execute as trocas especificadas a seguir e mostre a matriz resultante. • A linha 2 com a linha 8; • A coluna 4 com a coluna 10; • A diagonal principal com a diagonal secundária; • A linha 5 com a coluna 10. 9. 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, coluna). 10. Faça um programa que carregue uma matriz 8x8 com números inteiros e mostre a quantidade de números pares e ímpares. 11. Faça um programa que carregue uma matriz 8x8 com números reais, 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. 36 12. Faça um programa que carregue uma matriz 5x5 de números reais, calcule a média aritmética dos elementos e mostre todos elementos maiores ou iguais à media e sua respectiva posição na matriz. 13. Faça um programa que construa a tabela apresentada a seguir em uma matriz. Dado um número digitado pelo usuário, exiba o mês do ano correspondente de acordo com a tabela. Emitir mensagem de erro se o código for inválido. Código Mês Código Mês 1 Janeiro 7 Julho 2 Fevereiro 8 Agosto 3 Março 9 Setembro 4 Abril 10 Outubro 5 Maio 11 Novembro 6 Junho 12 Dezembro 14. Faça um programa que leia um vetor de 20 números inteiros. Dado uma entrada do usuário, verifique se há esse número no vetor, quantos números e em qual posição. 15. Elabore um programa que calcule o produto de duas matrizes de ordem 3. 16. Elabore um programa que calcule a soma e a subtração de duas matrizes A e B. 17. Elabore um programa que calcule a determinante de uma matriz de ordem 2. 18. Elabore um programa que calcule a determinante de uma matriz de ordem 3. 19. Considere o triângulo de vértices A(2;1), B(5; 2) e C(3; 4) apresentado na figura a seguir. A área do triângulo ABC é calculada de acordo com a fórmula abaixo, onde D é a determinante da matriz de ordem 3, onde a primeira coluna é formada pelas abscissas dos pontos A, B e C, a segunda coluna é formada pelas respectivas ordenadas e a terceira coluna é unitária. Elabore um − = +−+ ++ = + − 88 115 1935 9223 13 91 95 23 cbda dc ba D ** −= = payncxmbznazmcypbx pnm cba zyx D ************ −−−++= = 37 programa que receba as coordenadas dos vértices A, B e C e calcule a área do triângulo. ATENÇÃO: Se a determinante D=0 então os três pontos não formam um triângulo, portanto, são pontos de uma mesma reta!!! 20. Numa matriz quadrada, os elementos aij tais que i=j formam o que chamamos de diagonal principal da matriz. Elabore um programa que imprima os elementos da diagonal principal de qualquer matriz mxm. 21. Dada uma matriz A(mxn), a matriz que se obtém trocando ordenadamente as linhas pelas colunas chama-se transposta de A, e é indicada por At (ou por At). Elabore um programa que receba uma matriz A(3x2) e crie a matriz At. DS cc bb aa D ABC yx yx yx * 2 1 1 1 1 = = 38 6. MANIPULAÇÃO DE “STRINGS” String é uma cadeia de caracteres armazenadas uma matriz unidimensional (vetor) de caracteres finalizada pelo caractere nulo, ou seja, por meio de ‘\0’, isto é, indica o fim da string. Desta forma, deve-se declarar sempre o vetor com uma posição a mais para armazenar o caractere nulo. Por exemplo, a seguinte instrução declara um vetor nome que guarda uma string de 10 caracteres: char nome[11]; Em programação, é comum o uso de matrizes de string. Para criar uma matriz de strings, utiliza-se uma matriz bidimensional de caracteres. O seguinte exemplo apresenta o uso de uma matriz de string. 1. #include <stdlib.h> 2. #include <stdio.h> 3. 4. #define MAX 10 5. #define LEN 31 6. 7. char lista[MAX][LEN]; 8. 9. int main(void) 10. { 11. int i; 12. for (i=0; i<MAX; i++) 13. { 14. printf(”Digite um nome:”); 15. scanf(”%s”,lista[i]); 16. } 17. for (i=0; i<MAX; i++) 18. printf(”%d - %s\n”, i+1, lista[i]); 19. return(0); 20. } 6.1 Exercícios 1. Faça um programa que receba uma palavra, calcule e mostre a quantidade de caracteres. 2. Faça um programa que receba uma palavra, calcule e mostre a quantidade de vogais. 3. Faça um programa que receba uma palavra, troque todas as vogais por * e apresente o resultado4. Faça um programa que receba duas palavras e gere uma terceira que represente a combinação das duas anteriores. 5. Faça um programa que receba uma palavra e coloque os caracteres em ordem crescente. 6. Faça um programa que receba uma palavra e inverta a ordem dos caracteres. 7. Faça um programa eu receba uma frase, calcule e mostre a quantidade de vezes que o caractere a aparece. 8. Faça um programa que receba uma frase, calcule e mostre a quantidade de consoantes da frase digitada. 9. Faça um programa que receba uma frase, calcule e mostre a quantidade de vogais da frase digitada. 39 10. Faça um programa que receba uma frase e mostre a quantidade total de cada caractere na frase. 11. Faça um programa que armazene 10 nomes. 12. Faça um programa que armazene 10 nomes. Dado uma entrada do usuário, pesquise e apresente se encontrado o nome (em que posição do vetor). 13. Faça um programa que receba uma frase, calcule e mostre a quantidade de palavras da frase digitada. 14. Faça um programa que receba uma frase. Caso a frase possua meses por extenso substitua-os pelo seu número correspondente. 15. Faça um programa que mostre a data do sistema nos seguintes formatos: “dia/mês/ano” e “São Paulo, 14 de setembro de 2001”. 16. Elabore um programa que receba uma frase e mostre a quantidade de palavras, quais os caracteres existentes e a quantidade de cada caractere. 40 7. ESTRUTURAS, ENUMERAÇÕES E UNIÕES A linguagem C permite criar tipos de dados utilizando: • Estruturas; • Uniões; • Enumerações. 7.1 Estruturas Estrutura (structure) é um tipo de dado formado por um conjunto de variáveis referenciadas por um 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. Em C é declarada uma estrutura da seguinte maneira: struct <nome_da_struct> { <tipo> <variável_1>; <tipo> <variável_2>; ... <tipo> <variável_n>; }; struct cliente { char nome[41]; char sobrenome[41]; }; A palavra struct define uma declaração, seguida do nome da estrutura e das respectivas variáveis delimitadas pelas chaves. As variáveis são denominadas membros da estrutura. A declaração de variáveis do tipo estrutura pode ser realizada da seguinte maneira: struct cliente { char nome[41]; char sobrenome[41]; }*x, y, z[5]; struct cliente { char nome[41]; char sobrenome[41]; }; ... struct cliente *x, y, z[5]; 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>.<membro> <nome_da_estrutura>-><membro> Exemplo: 1. #include <stdlib.h> 2. #include <stdio.h> 3. 4. struct cliente 5. { 6. char nome[41]; 7. char sobrenome[41]; 8. }*x, y, z[5]; 9. 10. int main(void) 11. { 12. x=&y; 13. printf("Digite seu nome: "); 14. scanf("%s", &y.nome); 15. printf("Ola %s!\n", y.nome); 16. printf("Digite seu nome: "); 17. scanf("%s", &x->nome); 18. printf("Ola %s!\n", x->nome); 19. printf("Digite seu nome: "); 20. scanf("%s", &z[0].nome); 21. printf("Ola %s!\n", z[0].nome); 22. return(0); 23. } 41 7.2 Enumerações Enumeração é um conjunto de constantes inteiras que especifica todos os valores legais que uma variável desse tipo pode ter. Considere o seguinte exemplo: 1. #include <stdio.h> 2. #include <stdlib.h> 3. 4. enum dia_da_semana {Segunda, terca, quarta, quinta, sexta, sabado, domingo}; 5. 6. int main(void) 7. { 8. enum dia_da_semana dia; 9. printf("Digite um numero de 0 a 6:"); 10. scanf("%d", &dia); 11. switch(dia) 12. { 13. case Segunda: 14. printf("Segunda"); 15. break; 16. case terca: 17. printf("terca"); 18. break; 19. case quarta: 20. printf("quarta"); 21. break; 22. case quinta: 23. printf("quinta"); 24. break; 25. case sexta: 26. printf("sexta"); 27. break; 28. case sabado: 29. printf("sabado"); 30. break; 31. case domingo: 32. printf("domingo"); 33. break; 34. default: 35. printf("Fora da faixa!\n"); 36. } 37. return(0); 38. } O valor do primeiro elemento do conjunto enum é 0. 7.3 Uniões Uniões (union) é uma posição de memória que é compartilhada por duas ou mais variáveis diferentes, geralmente de tipos diferentes. A definição e um exemplo é apresentada a seguir: union <identificador> { <tipo> <nome_da_vairável_01>; <tipo> <nome_da_vairável_02>; ... <tipo> <nome_da_variável_n>; }<variáveis union>; union cliente { int i; char c; }; No exemplo acima, tanto o inteiro i como o caractere c compartilham a mesma porção de memória, o mesmo endereço. Porém i ocupa 2 bytes e c apenas 1 byte. Quando uma union é declarada, o compilador cria automaticamente uma variável grande o bastante para conter o maior 42 tipo de variável da union. 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. #include <stdio.h> 2. #include <stdlib.h> 3. 4. union tipoespecial 5. { 6. int x; 7. float y; 8. }W; 9. 10. int main(void) 11. { 12. printf("Digite um inteiro:"); 13. scanf("%d", &W.x); 14. printf("O endereco da variavel x e: %p\n", &W.x); 15. printf("Voce digiou inteiro %d\n", W.x); 16. printf("Digite um ponto flutuante:"); 17. scanf("%f", &W.y); 18. printf("O endereco da variavel y e: %p\n", &W.y); 19. printf("Voce digiou ponto flutuante %f\n", W.y); 20. return(0); 21. } 7.4 Exercícios 1. Elabore um programa que armazene as seguintes informações de 10 alunos de uma turma: nome, sobrenome, prontuário, turma e data de nascimento. 2. Elabore um programa que imprima as seguintes informações de 10 alunos de uma turma: nome, sobrenome, prontuário, turma e data de nascimento. 3. Considerando os exercícios 1 e 2, elabore um programa que edite as informações de um determinado aluno escolhido pelo usuário. 4. Elabore um programa que leia um valor. Este valor pode ser inteiro, ponto flutuante ou caractere. 5. 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. O banco permitirá o cadastramento de apenas 15 contas e não pode haver mais de uma conta com o mesmo número. 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. Faça um programa de cadastro de clientes. Este programa deve permitir a inserção de novos clientes, editar dados de clientes cadastrados, imprimir informações de um determinado cliente, excluir um cliente do cadastro, pesquisar clientes e relatorio. São necessários as seguintes informações do cliente: nome, sobrenome, rg, sexo, estado civil, data de nascimento, endereço, numero, complemento, cep, bairro, cidade, estado, telefone, fax e celular. O relatorio deve 43 calcular a média de idade, quantos são do sexo masculino e feminino, quantos são solteiros(as), quantos são casados(as) , quantos divorciados(as), listar as cidades e a respectiva quantidade de clientes por cidade. 7. Faça um programa que gerencie uma locadora de vídeo. Este programa deve permitir a inserção de novas fitas, editar informações de fitas, pesquisar e imprimir informações de uma determinada fita. São necessários as seguintes informações das fitas de vídeo: título, categoria (comédia, drama, ação, documentário ou infantil), diretor, ano, com legenda ou sem legenda, idioma, descrição e quantidade disponível. 44 8. PONTEIROS Ponteiros são variáveis que contém um endereço de memória, isto é, armazenam a posição de uma outra variável na memória. Um ponteiro pode armazenar a posição de uma variável
Compartilhar