Baixe o app para aproveitar ainda mais
Prévia do material em texto
+ COMPUTAÇÃO João Quadros + Roteiro � Objetivo do curso � Componentes de programação/Algoritmos � Características da linguagem C � Sistemas de tipos � Variáveis e operadores � Estruturas de controle � Funções � Entrada e Saída � Gerencia de Memória + Objetivo do curso � Aprender a programar � Usar em C e C++ como ferramenta � Entender bem o funcionamento do programa na memória do computador � Será que só isso basta? + DETALHES Verificação de aprendizado 1P 27/03/2014 2P 22/05/20134 Bibliografia: -ASCENCIO, A. F. G. e CAMPOS, E. A V., Fundamentos da Programação de Computadores - algoritmos, Pascal, C/C++ e Java. São Paulo: Pearson Education – Prentice Hall. -DAMAS, L. M. D., Linguagem C, 10a edição, São Paulo: LTC, 2007. -SCHILDT, H., C Completo e Total, 3a edição, São Paulo: Pearson Education, Makron Books. - SZWARCFITER, J. L. e MARKENSON, L., Estruturas de Dados e seus Algoritmos, 3a edição, São Paulo: LTC, 2010. PF 29/05/2014 + INTRODUÇÃO João Quadros + O que caracteriza uma Linguagem de Programação? � Gramática e significado bem definidos � Implementável (executável) com eficiência ‘‘aceitável’’ � Universal: deve ser possível expressar todo problema computável � Natural para expressar problemas (em um certo domínio de aplicação) + Smalltalk C PROLOG 1980....................Ada...........DBASE-II.................................................. 1990.....................................................................Haskell..........Godel... 1950........................................................................................................ FORTRAN 1960.......................ALGOL-60...........COBOL......LISP......................... SIMULA ALGOL-68 PL/I BASIC 1970..................Pascal............................................................................ Modula-2 ML Miranda Eifell C++ Delphi Java C# Imperativo Funcional LógicoOrientado a objetos Um breve histórico Erlang F#Erlang F# 2000.............................PHP......................Phyton.................................. + Modelo Computacional mais comum Entrada Programa Saída Estado + Evolução centrada em níveis crescentes de abstração � Linguagens de máquina � Endereços físicos e operation code � Linguagens Assembly � Mnemônicos e labels simbólicos � Linguagens de “alto nível” � Variáveis e atribuição (versus acesso direto à memória) � Estruturas de dados (versus estruturas de armazenamento) + Evolução centrada em níveis crescentes de abstração � Estruturas de controle (ao invés de jumps e gotos) � Estrutura de blocos como forma de encapsulamento � Generalização e parametrização (abstração de tipos de valores) + � INSTRUÇÃO: � Cada um dos passos, cada uma das ações a tomar (obedecendo a seqüência lógica) para ir resolvendo o problema, ou para ir executando a tarefa � Em informática, é a informação que indica a um computador uma operação elementar a executar � Ex.: “somar”, “subtrair”, “comparar se é maior”, etc � Uma só instrução não resolve problemas � Executar um conjunto de instruções � Executar em uma seqüência lógica Programação + � EXEMPLO: � para “fazer omelete” � Instruções: “quebrar ovos”, “bater ovos”, “pôr sal”, “ligar fogão”, “pôr óleo na frigideira”, “pôr frigideira no fogo”, “fritar ovos batidos”, etc... � Quanto às instruções isoladas: � Só “quebrar ovos”, ou só “pôr óleo na frigideira”, não é suficiente para cumprir a tarefa “fazer omelete” � Quanto à seqüência lógica: � Se executarmos “fritar ovos batidos” antes de “bater ovos”, ou pior, antes de “quebrar ovos”, não iremos cumprir a tarefa “fazer omelete” Programação + ALGORITMOS João Quadros + �Definição de Algoritmo �Algoritmo é uma seqüência de instruções organizadas de forma lógica e estruturada, expressas em linguagem próprial (Português estruturado), que tem por finalidade resolver um problema ou descrever uma tarefa. + � PROGRAMA: � Algoritmo escrito em uma linguagem de computador (linguagem de programação - C, Pascal, COBOL, Fortran, Basic, Java, etc.) � Interpretado e executado por um computador � Interpretação rigorosa, exata, do computador ⇒ ⇒ escrita do algoritmo na linguagem de prog. tem que seguir regras mais rigorosas + � PSEUDOCÓDIGO: � Facilita descrever o algoritmo antes de passá-lo para uma linguagem de programação � Intermediária: linguagem natural – linguagem de programação � Pseudocódigo = “códigofalso” � FLUXOGRAMA: � É uma forma universal de representação, pois se utiliza de figuras geométricas para ilustrar passos a serem seguidos para a resolução de problemas Tipos de algoritmos + � PSEUDOCÓDIGO: �Descrição do algoritmo, menos rigorosa que na linguagem de programação (código fonte) � Fácil de entender e fácil de codificar depois � Independente da linguagem de programação � Simples e objetivo → Técnicas: + � FASES para desenvolver o algoritmo: � Determinar o problema, definí-lo bem � Dividir a solução nas três fases: � Exemplo: � Problema: calcular a média de quatro números � Dados de entrada: os números, N1, N2, N3 e N4 � Processamento: somar os quatro números e dividir a soma por 4 � Dados de saída: a média final ENTRADA PROCESSAMENTO SAÍDA N1 + N2 + N3 + N4 4 ALGORITMO: + �Algoritmo: �Receber o primeiro número �Receber o segundo número �Receber o terceiro número �Receber o quarto número �Somar todos os números �Dividir a soma por 4 �Mostrar o resultado da divisão ALGORITMO: + � ALGORITMO: � Ex. “somar dois números”: � Escrever primeiro número no retângulo A � Escrever segundo número no retângulo B � Somar o número do retângulo A com o número do retângulo B e escrever o resultado no retângulo C A B C + = Realidade O que você abstrai dessa realidade? ALGORITMO e ABSTRAÇÃO + � Importante: abordar o máximo de detalhes em um algoritmo. � Não esquecer: como será interpretado o que foi escrito? ALGORITMO + Exemplo de algoritmo Quando uma dona de casa prepara um bolo, segue uma receita, que nada mais é do que um algoritmo em que cada instrução é um passo a ser seguido para que o prato fique pronto com sucesso: 1. Bata 4 claras em neve 2. Adicione 2 xícaras de açúcar 3. Adicione 2 colheres de farinha de trigo, 4 gemas, uma colher de fermento e duas colheres de chocolate 4. Bata por 3 minutos 5. Unte uma assadeira com margarina e farinha de trigo 6. Coloque o bolo para assar por 20minutos + Exemplo de algoritmo Um motorista que necessita efetuar a troca de um pneu furado segue uma rotina para realizar essa tarefa: 1. Verifica qual pneu está furado 2. Posiciona o macaco para levantar o carro 3. Pega o estepe 4. Solta os parafusos 5. Substitui o pneu furado 6. Recoloca os parafusos 7. Desce o carro 8. Guarda o macaco e o pneu furado + Exemplo de algoritmo + Exemplo de algoritmo + Exemplo de algoritmo + Problemas – Divisão de Água � Inicialmente o recipiente de 8 litros está cheio e os demais vazios; � Os recipientes não possuem escala de medição, sabe-se apenas o volume total de cada; � Cada transferência(entre os recipientes) deve ser feita no volume total do recipiente receptor; � Ao final das transferências o recipiente com capacidade para 8 litros deve possuir apenas 4 litros de água e o recipiente de 5 litros deve possuir apenas 4 litros de água. + � Solução: Problemas – Divisão de Água + Problemas – Transporte Chinês � Transportar todos os elementos de um lado para outro do rio, sendo que: � Somente o pai,a mãe e o policial sabem pilotar o barco; � A mãe não pode ficar sozinha com os filhos; � O pai não pode ficar sozinho com as filhas; � O prisioneiro não pode ficar sozinho com nenhum integrante da família; � O barco só pode transportar duas pessoas por vez; � Você pode ir e vir com as pessoas quantas vezes precisar. + Problemas – Transporte Chinês � Solução + Exercícios A. Escreva a seqüência de passos para que uma pessoa abra um arquivo armazenado em um pen-drive utilizando o Word do Windows B. Escreva os passos necessários para uma pessoa efetuar um saque em um caixa eletrônico + Exercícios 1) Identifique os dados de entrada, processamento e saída no algoritmo abaixo · Receba código da peça · Receba valor da peça · Receba Quantidade de peças · Calcule o valor total da peça (Quantidade * Valor da peça) · Mostre o código da peça e seu valor total 2) Faça um algoritmo para “Calcular o estoque médio de uma peça”, sendo que ESTOQUEMÉDIO = (QUANTIDADE MÍNIMA + QUANTIDADE MÁXIMA) /2 + TESTE DE MESA � Todo algoritmo deve ser testado � Usar dados e resultados previamente calculados, seguir precisamente as instruções do algoritmo e verificar se o procedimento está correto ou não � Exemplo: Fazer teste de mesa para o algoritmo da média + CONCEITOS GERAIS DE PROGRAMAÇÃO Programação de Sistema Computacional � Exemplo 2 – Exibir se o aluno está aprovado ou reprovado ProcessamentoEntrada Saída Dispositivo de Entrada Dispositivo de Saída Memória UCP Ana, 5, 3 Se (5+3)/2>=7 aprovado Senão reprovado Ana, reprovado Programação de Sistema Computacional �Tipos de Linguagens de Programação � 1 - Totalmente codificadas em binário (0´s e 1´s) � 2 - Usa instruções simbólicas para representar os 0´s e 1´s � 3 - Voltadas para facilitar o raciocínio humano Linguagem Assembly ( Mnem ô nica ) LOAD R1, val1 LOAD R2, val2 ADD R1, R2 STORE R1, val2 Linguagem de M á quina 0010 0001 1110 0010 0010 1111 0001 0001 0010 0011 0001 1111 Linguagem de Alto N í vel val2 = val1+val2 Baixo Nível Alto Nível (1) (2) (3) Instruções Delimitadoras � Servem para especificar o início e o fim do algoritmo. início ... fim + Variável �Representa uma posição na memória, onde pode ser armazenado um dado �Possui um nome e um valor �Durante a execução do algoritmo, pode ter seu valor alterado (seu valor pode variar) �Mudanças no valor das variáveis: � Por entrada de dados (“Ler N1”) � Por atribuição (“MEDIA = <um certo valor>”) + � Exemplo SEQÜENCIAL: “Calcular a média de quatro números” �PSEUDOCÓDIGO: � Ler N1 � Ler N2 � Ler N3 � Ler N4 �MEDIA = (N1+N2+N3+N4) / 4 �Mostrar MEDIA VARIÁVEIS: mais clareza no pseudocódigo VARIÁVEL Declaração de Variáveis � Exemplos: declare a,b,c: real; declare nome: string; declare sexo: caracter; declare pratica_esporte: lógico; + Atribuição � Atribui o valor da direita à variável da esquerda � O valor pode ser uma constante, uma variável ou uma expressão �MEDIA = (N1+N2+N3+N4) / 4 � (Lê-se media recebe N1+...) � Neste caso, estamos atribuindo o resultado da fórmula à variável média, ou seja, a variável média está recebendo como valor o resultado da fórmula � Outros Exemplos: � a = 3; � a = x; + Operadores Aritméticos Exemplos: MEDIA = (N1+N2+N3+N4) / 4 + Exercícios 1) Tendo como dados de entrada a altura de uma pessoa, construa um algoritmo que calcule seu peso ideal, utilizando a seguinte fórmula: � peso ideal = (72.7*h) – 58 2) Faca um algoritmo que receba como entrada uma determinada temperatura em graus Celsius e mostre a temperatura em fahrenheit � OBS: Fahrenheit = (9/5)*(Celsius) + 32 3) Tendo como entrada o total vendido por um funcionário no mês de abril, faça um algoritmo que mostres a sua comissão e salário bruto neste mês, sabendo que o seu salário base é R$1.200,00 e sua comissão é de 10% sobre o total vendido. + � Operadores relacionais são muito usados quando temos que tomar decisões nos algoritmos. Com eles fazemos testes, comparações, que resultam em valores lógicos (verdadeiro ou falso): Exemplo: tendo duas variáveis, A = 5 e B = 3: + Exercícios 6) Tendo as variáveis SALARIO, IR e SALLIQ, e considerando os valores abaixo. Informe se as expressões são verdadeiras ou falsas. 7) Sabendo que A=3, B=7 e C=4, informe se as expressões abaixo são verdadeiras ou falsas. a) (A+C) > B ( ) b) B >= (A + 2) ( ) c) C = (B –A) ( ) d) (B + A) <= C ( ) e) (C+A) > B ( ) + � Operadores lógicos combinam resultados lógicos, gerando novos valores lógicos (verdadeiro ou falso). A “tabela-verdade” abaixo mostra todos os valores possíveis de se obter com oper. lógicos: T = Verdad. F = Falso AND = E OR = OU NOT = NÃO + � Combinando operadores relacionais e operadores lógicos criamos operações lógicas, que produzirão resultados lógicos (verdadeiro ou falso). Por exemplo, se A = 5, B = 8 e C = 1: � (A = B) E (B > C) é falso (f e v) � (A <> B) OU (B < C) é verdadeiro (v ou f) � NÃO (A > B) é verdadeiro (não f) � (A < B) E (B > C) é verdadeiro (v e v) � (A >= B) OU (B = C) é falso (f ou f) � NÃO (A <= B) é falso (não v) � São usadas em decisões nos algoritmos... + Exercícios 8. Considere a seguinte atribuição de valores para as variáveis: A=3, B=4, C=8. Avalie as expressões a seguir indicando o resultado final: verdadeiro ou falso. 1) A > 3 E C = 8 ( ) 2) A <> 2 OU B <= 5 ( ) 3) A = 3 OU B >= 2 E C = 8 ( ) 4) A = 3 E NÃO B <= 4 E C = 8 ( ) 5) A <> 8 OU B = 4 E C > 2 ( ) 6) B > A E C <> A ( ) 7) A > B OU B < 5 ( ) 8) A <> B E B = C ( ) 9) C > 2 OU A < B ( ) 10) A > B OU B > A E C <> B ( ) + Exercícios 9) Sabendo que A=5, B=4 e C=3 e D=6, informe se as expressões abaixo são verdadeiras ou falsas. a) (A > C) AND (C <= D) ( ) b) (A+B) > 10 OR (A+B) = (C+D) ( ) c) (A>=C) AND (D >= C) ( ) + Exercícios 10) Sabe-se que o uso incorreto da precedência de operadores ocasiona erros. Pensando nisso, determine o resultado das expressões a seguir (valores: A= 8, B = 5, C = -4, D = 2) a) Delta = B2 – 4 * A * C b) J = “Hoje” <> “HOJE” c) Media = (A + B + C + D) / 4 d) Media = A + B + C + D / 4 e) Resultado = A + B – 10 * C f) Y = A > 8 E B + C > D g) Y = A > 3 * 2 OU B + C <> D Estruturas de Controle � Baseado na lógica estruturada, Bohn e Jacopini provaram que apenas três estruturas são suficientes para explicar a solução de qualquer problema, inclusive tornando-os estruturados e mais legíveis. Estruturas de Controle � São elas: �Estrutura Seqüencial: os comandos ou instruções vão sendo executados na ordem em que aparecem no algoritmo. Estruturas de Controle � Estrutura de Repetição: comandos são executados repetidas vezes até que uma condição de parada seja satisfeita Estruturas de Controle � Estrutura de Seleção: Conforme o resultado de uma expressão lógica, determinados comandos são executados e outros não, caracterizando assim uma seleção de comandos TRUE FALSE Instruções de Seleção � Tipo simples: se <sentença> então <comandos>; fim-se OBS.: <comandos> serão executados apenas se <sentença> resultar em TRUE. Instruções de Seleção � Exemplo: se A>0 então B =A + 1; A =0; fim-se Instruções de Seleção � Tipo composto: se <sentença> então <comandos1>; senão <comandos2>; fim-se OBS.: <comandos1> serão executados apenas se <sentença> resultar em TRUE. Em caso contrário, <comandos2> serão executados. Instruções de Seleção� Exemplo: se A>B então B = A + 1; senão B = 0; fim-se Instruções de Repetição � Enquanto / Fim-Enquanto enquanto <sentença> faça <comandos>; fim-enquanto; OBS.: <comandos> serão executados enquanto <sentença> resultar em TRUE. Instruções de Repetição � Exemplo: A = 10; enquanto A>0 faça leia(B); escreva(B); A = A - 1; fim-enquanto; Instruções de Repetição � Repita / Até repita <comandos>; até <sentença>; OBS.: <comandos> serão executados até que <sentença> resulte em TRUE. Instruções de Repetição � Exemplo: A=10; repita leia(B); escreva(B); A =A - 1; até A<1; Instruções de Repetição � Para / Até / Fim-Para para <variável>=<inicial> até <final> faça <comandos>; fim-para; OBS.: <variável> - contador do tipo inteiro <inicial> - valor inicial da variável <final> - valor final da variável Instruções de Repetição � Exemplo: { Comandos para escrever 10 vezes uma frase na tela do computador } para i=1 até 10 faça escreva(“Último tipo de repetição”); fim-para; Estrutura de um Algoritmo � Um algoritmo em Portugol tem a seguinte estrutura: início <declaração de variáveis> <inicialização de variáveis> <corpo lógico do algoritmo> fim Lógica de Programação & Algoritmo �Estruturas básicas de um algoritmo: �Seqüência – Início/Fim �Define uma estrutura onde as instruções serão executadas na ordem que aparecem. �Seleção – Se-Então/Senão �Define uma estrutura condicional que dada a sua avaliação (V ou F) determina qual “caminho” do algoritmo será executado �Repetição – Repita, Enquanto ou Para �Define uma estrutura de iteração condicional (V ou F) ou contada (pré-definida) de instruções Lógica de Programação & Algoritmo � Algoritmo para ligar de um telefone público - Seqüência Início 1. Tirar o fone do gancho; 2. Ouvir o sinal de linha; 3. Introduzir o cartão; 4. Teclar o número desejado; 5. Conversar; 6. Desligar; 7. Retirar o cartão; Fim. Este algoritmo só usa uma estrutura de seqüência “Início/Fim” Lógica de Programação & Algoritmo � Algoritmo para ligar de um telefone público – Seleção E se o telefone público estiver com defeito? Início 1. Tirar o fone do gancho; 2. Se ouvir o sinal de linha, então 1. Introduzir o cartão; 2. Teclar o número desejado; 3. Conversar; 4. Desligar; 5. Retirar o cartão; 3. Senão 1. ir para o próximo telefone; Fim. Este algoritmo usa uma estrutura de decisão “Se-então/Senão” Lógica de Programação & Algoritmo � Algoritmo para ligar de um telefone público – Repetição E se o próximo telefone público também estiver com defeito? Início 1. Repita 1. Tirar o fone do gancho; 2. Se ouvir o sinal de linha então 1. Introduzir o cartão; 2. Teclar o número desejado; 3. Conversar; 4. Desligar; 5. Retirar o cartão; 3. Senão 1. ir para o próximo telefone; 2. Até ouvir o sinal de linha Fim. Este algoritmo usa uma estrutura de repetição “Repita/Até” Lógica de Programação & Algoritmo � Algoritmo para ligar de um telefone público – Repetição � E se o telefone chamado estiver com defeito? � E se o telefone chamado estiver ocupado? � E se acabarem os créditos do cartão telefônico? � E se ...? Um algoritmo SEMPRE sofre melhorias sucessivas. (Técnica de refinamentos sucessivos) Fluxogramas - Exemplo 1 �Achar o valor da expressão: D = B2 - 4AC. Início Ler A, B, C D = B^2 - 4*A*C 1 1 Escrever D Fim Fluxogramas: Exemplo 2 �Achar o maior de dois números A e B. Início Ler A, B A=B A<BA>B Comparar A com B Escrever: “A e B iguais” Fim Escrever: “A é maior” Escrever: “B é maior” Português Estruturado - Exemplo 1 �Achar o valor da expressão: D = B2 - 4AC. Ler os valores de A, B e C Calcular a expressão D = B2 - 4AC Mostrar o resultado desse cálculo Português Estruturado - Exemplo 2 �Achar o maior de dois números A e B. Ler dois números A e B Comparar A com B Mostrar o resultado dessa comparação Pseudocódigo - Exemplo 1 �Achar o valor da expressão: D = B2 - 4AC. Início Declare A,B,C,D; { Declaração de variáveis } Leia(A,B,C); D B^2 - 4*A*C; { Operação de atribuição } Escreva(D); Fim. Pseudocódigo - Exemplo 2 �Achar o maior de dois números A e B. Início Declare A,B; { Declaração de variáveis } Leia(A,B); Se A = B Então Escreva(“A e B iguais”); Senão Se A>B Então Escreva(“A é maior”); Senão Escreva(“B é maior”); Fim-Se Fim-Se Fim. Atividade 3 � Reescreva corretamente o algoritmo abaixo � Algoritmo aprovação Início 1. Obter as 2 notas do aluno; 2. Repita 1. Se Média do aluno >=7, então 1. Repita 1. Informar que o aluno está REPROVADO; 2. Até Média < 7 2. Senão Média >= 7 1. Informar que o aluno está APROVADO; 3. Até último aluno; Fim. RESPOSTA - Atividade 3 � Algoritmo aprovação Início 1. Repita 1. Obter as 2 notas do aluno; 2. Se Média do aluno >=7, então 1. Informar que o aluno está APROVADO 3. Senão 1. Informar que o aluno está REPROVADO; 2. Até último aluno Fim UM EXERCÍCIO � Construa um algoritmo para escolher as duas maiores laranjas de um balaio 1) leia um número inteiro e mostre uma mensagem indicando se este número é par ou ímpar, e se é positivo ou negativo 2) leia quatro números inteiros e encontre a média aritmética simples entre as que correspondem a números pares. Lembre- se que não pode haver divisão por zero 3) leia 4 notas, calcule a média dessas e escreva: Reprovado (média < 5), Recuperação (média >= 5 e < 7) e Aprovado (média >= 7) Outros exercícios... 4) leia a idade de um nadador e exiba sua categoria segundo as regras: A(5 até 7); B(8 até 10); C(11 até 13); D(14 até 18) e E( Idade > 18) 5) leia dois números inteiros, uma operação matemática (+,-,*,/) e faça o calculo destes números segundo a operação lida 6) leia o nome e a idade de três pessoas e informe o nome da pessoa mais velha e o nome da pessoa mais nova. Considere que não existem idades iguais mais exercícios... 7) leia os números inteiros A e B e informe se A é múltiplo, divisor ou nada de B 8) leia três números e mostre-os em ordem crescente 9) leia uma milhar e informe se esse número é palíndromo. Exemplos de números palíndromos: 9889, 7337 e 2002 10) leia um número inteiro entre 20 e 59 e mostre seu extenso. Exiba um erro se o número estiver fora do intervalo ainda mais exercícios... + CONCEITOS GERAIS C/C++ + Características � Paradigma Procedural (C) e OO (C++) � Flexível � Alta performance � Poucas restrições � Ótima iteração com: � Sistemas Operacionais � Dispositivos de Hardware � Outras Linguagens + Palavras Reservadas 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 Obs.: C/C++ é case sensitive + Tipos � São as formas que utilizamos para representar dados � C possui 5 tipos básicos: � char, int, float, double e void � E 4 modificadores básicos: � signed, unsigned, long e short � Os 4 podem ser aplicados ao int � long pode ser aplicado ao double � signed e unsigned aplicados ao char + Tipos � Modificadores de acesso: � const: a variável não pode ter o seu valor alterado � volatile: a variável pode ter o seu valor modificado fora do controle do programa � Classes de Armazenamento: � auto: indica que uma variável é local (opcional), também é usada na declaração de funções aninhadas � extern: variável declarada em outro arquivo � register: armazena, se possível, a variável em um registrador na própriaCPU. + Tipos � Classes de Armazenamento (Cont.): � static: não permite que um módulo externo possa alterar nem ver uma variável global, também é usado para manter o valor de uma variável local em uma função de uma chamada para outra. + Tipos � O tamanho do inteiro depende da arquitetura do sistema: � Sistemas de 32 bits � inteiro de 32 bits � Sistemas de 64 bits � inteiro de 64 bits � Restrições: � short int e int devem ter pelo menos 16 bits � long int com no mínimo 32 bits � short int <= int <= long int + Variáveis � Declaração: � tipo nome = inicialização; � Escopo da variáveis: � globais: podem ser usadas em qualquer lugar do programa � locais: podem ser usadas apenas na função onde foi declarada + Declarações � Declaram as variáveis e seus tipos � Os nomes das variáveis devem conter apenas letras, dígitos e o símbolo _ � Os principais tipos são: int, float, double e char � Exemplos int n; int quantidade_valores; float x, y, somaValores; char sexo; char nome[40]; C diferencia letras maiúsculas de minúsculas! int n, N; n é diferente de N! + Variáveis � Restrições � O nome das variáveis deve começar com uma letra ou um sublinhado “_” � Os demais caracteres podem ser letras, números ou sublinhado � O nome da variável não pode ser igual a uma palavra reservada e aos nomes das funções � Tamanho máximo para o nome de uma variável: � 32 caracteres + Algoritmo Real: n1, n2, n3, media Na Linguagem C... #include <stdio.h> #include <stdlib.h> main() { double n1, n2, n3, media; system("PAUSE"); } + Exemplo int a, b = 10; // Variáveis globais void f(char c) { double d = 10.0; // Variável local int i = a; // Variável local // ... } int main() { int i = b; // Variável local ao main return 0; } + Constantes � São valores que são mantidos fixos pelo compilador � Também podem ser: � Octais - 0NUMERO_OCTAL � Hexadecimais - 0xNUMERO_HEXADECIMAL � Exemplos: � ‘\n’ (caractere), “C++” (string), 10 (inteiro), 15.0 (float), 0xEF (239 em decimal), 03212 (1674 em decimal) + Constantes de Barra Invertida Código Significado \b Retrocesso (backspace) \f Alimentação de Formulário (form feed) \t Tabulação Horizontal (tab) \n Nova Linha \” Aspas \’ Apostrofo \0 Nulo \\ Barra Invertida \a Sinal Sonoro (Beep) \N Constante Octal (N é o valor da constante) \xN Constante Hexadecimal (N é o valor da constante) + Comando de atribuição � Atribui o valor da direita à variável da esquerda � O valor pode ser: � uma constante, � uma variável ou � uma expressão � Exemplos x = 4; --> lemos x recebe 4 y = x + 2; y = y + 4; valor = 2.5; sexo = 'F' + Operadores de Atribuição Equivale a x = x % yx %= y%= Equivale a x = x / yx /= y /= Equivale a x = x * yx *= y *= Equivale a x = x – yx -= y-= Equivale a x = x + yx += y += Atribui o valor de y a xx = y= ComentárioExemploOperador + Operadores Aritméticos Operador Ação + Soma - Subtração ou troca de sinal * Multiplicação / Divisão % Resto da divisão inteira ++ Incremento -- Decremento + Operadores Matemáticos Decrementa em 1 o valor de xx---- Incrementa em 1 o valor de xx++++ Resto da divisão de x por yx % y % Divide x por yx / y / Multiplica x e yx * y* Subtrai y de xx – y - Soma x e yx + y+ ComentárioExemploOperador + Exercícios 1) Qual o valor das variáveis x, y e z após o seguinte trecho de código: int x, y, z; x = y = 10; z = ++x; x = -x; y++; x = x + y - (z--); 2) Utilize o DEVCPP para compilar e rodar código do exercício anterior. + Operadores Relacionais Operador Relação > Maior que >= Maior que ou igual a < Menor que <= Menor que ou igual a == Igual a != Diferente de + Operadores Relacionais O conteúdo de x é maior que o de yx > y> O conteúdo de x é menor que o de yx < y < O conteúdo de x é maior ou igual ao de yx >= y >= O conteúdo de x é menor ou igual ao de yx <= y<= O conteúdo de x é diferente do de yx != y != O conteúdo de x é igual ao de yx == y== ComentárioExemploOperador As expressões relacionais em C retornam : • 1 se verdadeiro e; • 0 se falso. + Operadores Lógicos Operador Função && AND || OR ! NOT + Operadores Lógicos � && (E lógico): retorna verdadeiro se ambos os operandos são verdadeiros e falso nos demais casos. Exemplo: if( a>2 && b<3). � || (OU lógico): retorna verdadeiro se um ou ambos os operandos são verdadeiros e falso se ambos são falsos. Exemplo: if( a>1 || b<2). � ! (NÃO lógico): usada com apenas um operando. Retorna verdadeiro se o operando é falso e vice-versa. Exemplo: if( !var ). + Operadores Lógicos F ou F → FF e F → F F ou V → VF e V → F Não V → FV ou F → VV e F → F Não V → FV ou V → VV e V → V Tabela NÃOTabela OUTabela E + Operadores Lógicos Bit a Bit Operador Ação & AND Lógico | OR Lógico ^ XOR (OR exclusivo) ~ NOT >> Shift Rigth << Shift Left + Exercícios 3) Qual o valor das variáveis a, b, c, d, e, f após a execução do seguinte trecho de código: int x = 2, y = 4; int a, b, c, d, e, f; a = x & y; b = x | y; c = x ^ y; d = ~x; e = x << 3; f = x >> 1; + Tabela de Precedências , = += -= *= /= ? || && | ^ & == != << = >> = << >> + - * / % ! ~ ++ -- . - * & ( ) [ ] -> Precedência +- + Casts � Sintaxe: � (tipo) expressão � Exemplo: long a = 10, b = 4; // f = 2.5 double f = (double) a/b; + Controladores de Fluxo � C possui 7 controladores de fluxo básicos: � if � ?: � switch � for � while � do-while � goto + if if (condição) { declaração } if (condição) { declaração1 } else { declaração2 } if (condição1) { declaração1 } else if (condição2) { declaração2 } else { declaração3 } + Exemplo int a = 2; if (2) { a = 4; } else if (0) { a = 0; } if (a) { a = -a; } + ?: � condição ? expressão1 : exepressão2; � Equivalente a: if (condição) { expressão1 } else { expressão2 } � O operador ? é restrito, mas pode simplificar expressões grandes � Uma expressão é diferente de uma declaração + Exemplo int a = 9, b = -4, c; b = (a > b) ? a : b; c = (a > b) ? b : a; + switch switch (variável) { case (constante1): declaração1; break; // O break é opcional case (constanteN): declaraçãoN; break; // O break é opcional default: declaraçãoDefault; } + Exemplo switch (a) { case (1): // ... break; case (2): // ... break; default: // ... } + for for (comando; condição; comando) { declaração; } � Exemplo: // o i não pode ser declarado no for int i; int a = 0; for (i = 0; i < 100; i++) { a = a + 14; } + while while (condição) { declaração; } �Executa a declaração zero ou mais vezes �Exemplo: int i = 0; int a = 0; while (i < 100) { a = a + 14; i++; } + do-while do { declaração; } while (condição); � Executa a declaração pelo menos uma vez, já que a verificação da condição é feita apenas no final de cada iteração do loop + Exemplo int i = 0; int a = 0; do { a = a + 14; i++; } while (i < 0); + break, continue e goto � O break é usado para interromper o switch ou um loop � Exemplo: while (1) { a = a + 14; i++; if (i > 99) { break; } } + continue � O continue é usado para fazer um loop pular para a próxima iteração � Exemplo: while (1) { i++; if (i % 2 == 0) { continue; } a = a + 14; } + goto � O goto pode ser usado para dar um salto incondicional no fluxo do programa � Exemplo:int a = 0; inicio: a++; if (a < 10) { goto inicio; } + Funções � Sintaxe: tipoDeRetorno nomeDaFunção(declaraçãoDosParâmetros) { corpoDaFunção; } declaraçãoDosParâmetros = tipo1 nome1,..., tipoN nomeN � Funções que não possuem retorno são void �O retorno de uma função é feito através do comando return + Exemplos int dobro(int a) { return 2 * a; } int main(int a) { int c; c = 8; c = dobro(c); return 0; } + Exercícios 4) Escreva um programa que lê um inteiro do teclado responde ‘sim’ se ele é um múltiplo de 3 e ‘não’ caso contrário Tome como base a seguinte estrutura de programa: #include <stdio.h> int main() { return 0; } 5) Implemente um programa que lê 10 inteiros do teclado ou para quando dois inteiros consecutivos sejam digitados. Após a leitura o programa deverá imprimir o maior, o menor, a média e a soma dos números digitados. 6) Modifique a sua resposta para o exercício anterior trocando os loops (for, while, do-while) para goto + Biblioteca de C ANSI � Podemos utilizar a biblioteca através da diretiva #include #include <stdio.h> #include <stdlib.h> #inlcude <string.h> ... + Principais Headers DescriçãoHeader Limites para pontos flutuantesfloat.h Macros com os limites para tipos inteiroslimits.h Criação de funções como scanf e printfstdargs.h Manipulação de tempo/datastime.h Funções matemáticasmath.h Funções para manipulação de stringsstring.h Funções diversasstdlib.h Funções de E/S padrãostdio.h + stdio.h � Contém diversas funções para o tratamento de entrada e saída � Contém as principais funções que utilizamos: � scanf(),printf(), fopen(), fclose(), ... + Entrada e Saída de Dados � A função scanf é utilizada para a leitura dados do dispositivo de entrada padrão � A função printf é utilizada para a escrita de dados do dispositivo de saída padrão + Tabela de Formato para E/S Tipo Formato para escrita e leitura [signed | unsigned] char %c [signed] int %i ou %d unsigned int %u [signed] short int %hi unsigned short int %hu [signed] long int %li unsigned long int %lu float %f double %lf long double %Lf + Entrada de Dados � Função scanf scanf ("formatos", &var1, &var2,...) Exemplos: int i, j; float x; char c; scanf("%d", &i); scanf("%d %f", &j, &x); scanf("%c", &c); scanf("%s", nome); %d inteiro %f float %lf double %c char %s palavra + Entrada de Dados (Exemplo 2) Algoritmo Real: n1, n2, n3, media Na Linguagem C... #include <stdio.h> #include <stdlib.h> main() { double n1, n2, n3, media; scanf ("%lf",&n1); scanf ("%lf",&n2); scanf ("%lf",&n3); scanf ("%lf %lf %lf",&n1, &n2, &n3); system("PAUSE"); } ler n1 ler n2 ler n3 ler n1, n2, n3 + Entrada de Dados (exemplo 3) Real: n1, n2, n3, media Na Linguagem C... #include <stdio.h> #include <stdlib.h> main() { double n1, n2, n3, media; scanf ("%lf %lf %lf",&n1, &n2, &n3); media=(n1+n2+n3)/3; system("PAUSE"); } ler n1, n2, n3 media=(n1+n2+n3)/3 Algoritmo + Saída de Dados � Função printf printf ("formatos", var1, var2,...) Exemplos: int i, j; float x; char c; printf("%d", i); printf("%d, %f", j, x); printf("%c", c); printf("%s", nome); %d inteiro %f float %lf double %c char %s palavra + Saída de Dados (Exemplo 4) #include <stdio.h> #include <stdlib.h> main() { int i, j; float x; char c; char nome [10]; i = 1; j = 2; x = 3; printf("%d", i); printf("%d, %f", j, x); system("PAUSE"); } + Saída de Dados (Exemplo 5) #include <stdio.h> #include <stdlib.h> main() { // definicao de variaveis double n1, n2, n3, media; // entrada de dados scanf ("%lf %lf %lf",&n1, &n2, &n3); // operacao media=(n1+n2+n3)/3; // saida de dados printf("%f", n1); printf("%f", n2); printf("%f", n3); printf("%f", media); system("PAUSE");} + Saída de Dados (Exemplo 6)#include <stdio.h> #include <stdlib.h> main() { // definicao de variaveis int i, j; float x; char c; char nome[30]; //entrada de dados scanf("%d", &i); scanf("%d %f", &j, &x); scanf("%c", &c); scanf("%s", nome); // exibicao de dados printf("%d", i); printf("%d, %f", j, x); printf("%c", c); printf("%s", nome); system("PAUSE"); } + Exemplo 7 #include <stdio.h> #include <stdlib.h> main() { //declaracao de variaveis int n; int quantidade_valores; float x, y, somaValores; char sexo; char nome[40]; // operacao somaValores =1+1; //saida de dados printf("somaValores=%f", somaValores); system("PAUSE")} + Exemplo 8 #include <stdio.h> #include <stdlib.h> main() { // definicao de vairiaveis int n; int quantidade_valores; float x, y, somaValores; char sexo; char nome[40]; x = 1; y = 2; //atribuicao somaValores = x + y; // mostra mensagem de texto na tela printf("alo mundo"); // mostra valor na tela printf("somaValores=%f", somaValores); system("PAUSE"); } + Exemplos int a; scanf(“%d”, &a); // lê a printf(“%d”, a); // escreve a char ch; scanf(“%c”, &ch); // lê c printf(“%c”, ch); // escreve c float num; scanf(“%f”, &num); // lê f printf(“%f”, num); // escreve f Obs.: Cuidado para não esquecer do & no uso da função scanf + Entrada e Saída Exemplo 10 #include <stdio.h> #include <stdlib.h> main() { double n1, n2, n3, media; printf("Digite 3 notas: "); scanf ("%lf %lf %lf",&n1, &n2, &n3); media=(n1+n2+n3)/3; printf ("Media: %.2lf",media); system("PAUSE");} Exemplo 9 #include <stdio.h> #include <stdlib.h> main() { double n1, n2, n3, media; scanf ("%lf %lf %lf",&n1, &n2, &n3); media=(n1+n2+n3)/3; printf ("%lf",media); system("PAUSE");} + Exemplo 11 1) Tendo como dados de entrada a altura e o sexo de uma pessoa, construa um programa que calcule seu peso ideal, utilizando a seguinte fórmula: peso ideal = (72.7*h) – 58 #include <stdio.h> #include <stdlib.h> #include <conio.h> main() { float altura, pesoIdeal; char sexo; printf ("\nDigite sua altura em metros: "); scanf ("%f",&altura); printf ("\nDigite seu sexo (F/M): "); sexo=getche(); pesoIdeal=(72.7*altura)-58; printf ("\nO sexo digitado foi %c e o peso ideal desta pessoa eh %.2f quilos\n", sexo, pesoIdeal); system("PAUSE"); } + E/S C++ � C++ possui uma biblioteca de E/S chamada iostream.h � Esta possui alguns dispositivos predefinidos: Nome Tipo Buffered Descrição cin istream Sim Entrada padrão (normalmente o teclado) cout ostream Sim Saída Padrão (normalmente o monitor) clog ostream Sim Saída de erro padrão (normalmente o monitor) cerr ostream Não Saída de erro padrão (normalmente o monitor) + O tipo ostream � É um tipo de saída de dados � Podemos enviar dados para objetos deste tipo através do operador << (operador de inserção) � O operador << pode ser utilizado mais de uma vez na mesma sentença e não adiciona um ‘\n’ no final da linha � Exemplos: cout << “CEFET\n”; //endl = a quebra de linha cerr << “CIn” << endl; clog << “C++” << “\n”; + O tipo istream � É um tipo de entrada de dados � Podemos ler dados de objetos deste tipo através do operador >> � O operador >> também pode ser utilizado mais de uma vez na mesma sentença � A leitura só é realizada até um ‘\r’, ‘\n’ ou ‘ ’ � Exemplo: int a; float b; cin >> a >> b; + cout � Objeto pelo qual são efetuadas as operações de saída em direção a saída padrão do SO com utilização de buffer � Utiliza o símbolo << (operador de inserção) Int main() { cout << 10 << “ ”; cout<< “Uma string”; return 0; } + cout � Salto de linhas �Usar \n ou então endl Int main() { cout << 10 << “\n”; cout << “Uma string” << endl; return 0; } + cout � Exemplo de saída em C e C++ int x = 25; double dob = 8.1; char ch = ‘F’; // C++ C cout << “x = “ << x; printf("x=%d",x); cout << dob << “e “ << ch; printf("%Lf e %c",dob, ch); � A formatação da saída dos dados é feita automaticamente. + Formatação de Saída : � Manipuladores (incluir IOMANIP) � São “Funções” usadas junto com o cout: cout << manipulador; manipulador exemplo dec sair inteiro como decimal cout << dec << i; hex sair inteiro como hexadecimal cout << hex << i; oct sair inteiro como octal cout << oct << i; endl insere linha (‘\n’) cout << endl; ends insere término de string (‘\0’) setw(int n) ajusta o tamanho do campo para n caracteres cout << setw(20) << ‘*’; setfill(char n) preenche o campo com n cout << setfill(‘#’); flush libera o buffer setprecision (int n) real com n casas decimais depois do ponto cout << setprecision(2) << f; + Exemplo de uso // setfill example #include <iostream> #include <iomanip> using namespace std; int main () { cout << setfill ('x') << setw (10); cout << 77 << endl; return 0; } Saída: xxxxxxxx77 + cin � Objeto pelo qual são efetuadas as operações de entrada em a partir da entrada-padrão do SO com utilização de buffer � Utiliza o símbolo >> (operador de extração) Int main(){ int idade; cout << “Digite a idade: “; cin >> idade; cout << “Voce tem “ << idade << ‘” anos”; return 0; } + cin � Exemplo de entrada em C e C++ // C++ C int x; cin >> x; scanf("%d",&x); float f,g; cin >> f >> g; scanf("%f%f",&f,&g); char ch; double dob; cin>>dob>>ch scanf("%Lf%c",&dob,&ch); � A formatação dos dados, explícita em C, é automática em C++. + cerr e clog � Operações de saída em direção a saída de erro padrão do sistema � Cerr = sem buffer � Clog = com buffer � Exemplo ..... if( ! div ) { cerr << “O dividor nao pode ser zero “ << endl; } ..... + string.h � Contém um conjunto de funções para manipulação de strings � Principais funções: � strcmp(), strlen(), strcpy(), strcat(), ... � Já foi amplamente abordado na aula sobre strings + stdlib.h � Possui diversas funções de utilidade geral � Útil para � Alocação dinâmica de memória � Conversão de tipos � Controle de processos � Ordenação � Busca � Geração de números pseudo-aleatórios � ... + stdlib.h � Funções para conversão de tipos: � int atoi(char *str); � Converte uma string para um int � float atof(char *str); � Converte uma string para um float � Exemplo: � exemploConversao.c + stdlib.h � Funções para controle de processos: � void exit(int status); � Encerra o programa � int system(const char *comando); � Executa um comando do Sistema Operacional � Retorna 0 se o comando foi executado com sucesso, ou –1 caso contrário � int atexit(void (* funcao) (void)); � Faz com que o programa chame a função passada como parâmetro no seu fim � Várias funções podem ser adicionadas e são chamadas na ordem inversa + stdlib.h � Ordenação: � void qsort( void *elementos, int numeroDeElementos, int tamanhoDoTipo, int (* funcDeComparacao) ( const void *e1, const void *e2 ) ); + stdlib.h � Ordenação: � A função qsort() é uma implementação genérica do algoritmo Quick Sort � elementos é o array que será ordenado � numeroDeElementos é quantidade de posições preenchidas no array � tamanhoDoTipo é tamanho em bytes do tipo dos elementos do array � funcDeComparacao é função que será utilizada para a comparação entre elementos do array + stdlib.h � Busca binária: � void *bsearch( void *chave, void *elementos, int numeroDeElementos, int tamanhoDoTipo, int (* funcDeComparacao) ( const void *e1, const void *e2 ) ); + stdlib.h � chave é um ponteiro para o elemento que se busca � elementos é o array onde a busca será realizada � numeroDeElementos é quantidade de posições preenchidas no array � tamanhoDoTipo é tamanho em bytes do tipo dos elementos do array � funcDeComparacao é função que será utilizada para a comparação entre elementos do array � Retorna um ponteiro para o elemento encontrado ou NULL se a chave não existe + stdlib.h � Ordenação: � A função bsearch() é uma implementação genérica do algoritmo de Busca Binária � Para que o algoritmo funcione o array deve esta ordenado de acordo com a função de comparação + stdlib.h � Geração de números pseudo-aleatórios: � void srand(unsigned int semente); � Inicializa o gerador de números pseudo-aleatórios � int rand(); � Gera um número pseudo-aleatório entre 0 RAND_MAX � RAND_MAX é uma constante definida em stdlib.h e o seu valor depende do compilador e do S.O. + Exemplo clássico #include <stdio.h> #include <stdlib.h> main() { printf ("Alo mundo!"); system("PAUSE"); } + Caracteres especiais � Tambem chamadas de sequencias de escape usam o \ � Exemplo: int main(){ char letra1 = ‘\x043’; // hexa char letra2 = ‘\103’; // octal cout << letra1 << “ “ << letra2 <<endl; cout << “\x043\x02B\x02B”<< endl; } Saida: C C++ + Funções Matemáticas Tangente de xtan(x)tan Raiz quadrada de xsqrt(x)sqrt Seno de xsin(x)sin Calcula x elevado à potência ypow(x, y)pow Logaritmo decimal de xlog10(x)log10 Logaritmo natural de xlog(x)log Arredonda o número deal para baixo; floor(3.2) é 3floor(x)floor Valor absoluto de xfabs(x)fabs e elevado à potencia xexp(x)exp Cosseno de x (x em radianos)cos(x)cos Arredonda o número real para cima; ceil(3.2) é 4ceil(x)ceil ComentárioExemploFunção #include <math.h> + Exemplo 12 2) Construa um programa que tendo como entrada dois pontos quaisquer do plano P(x1,y1) e Q(x2,y2), imprima a distância entre eles. A fórmula da distância é: #include <stdio.h> #include <stdlib.h> #include <math.h> main() { float x1, y1, x2, y2; distancia; printf ("\nDigite o valor de x1: "); scanf ("%f",&x1); printf ("\nDigite o valor de y1: "); scanf ("%f",&y1); printf ("\nDigite o valor de x2: "); scanf ("%f",&x2); printf ("\nDigite o valor de y2: "); scanf ("%f",&y2); distancia=sqrt(pow((x2-x1),2)+pow((y2-y1),2)); printf ("\nA distancia entre os pontos P1 e P2 eh %.2f\n", distancia); system("PAUSE");} + Exercicio I 3) Construa um programa que calcule a quantidade de latas de tinta necessárias e o custo para pintar tanques cilíndricos de combustível, onde são fornecidos a altura e o raio desse cilindro. Sabendo que: - a lata de tinta custa R$20,00 - cada lata contém 5 litros - cada litro de tinta pinta 3 metros quadrados. Sabendo que: Área do cilindro=3.14*raio2 + 2*3.14*raio*altura e que raio e altura são dados de entrada. + Resposta do Exercício I #include <stdio.h> #include <stdlib.h> #include <math.h> main() { float altura, raio, areaCilindro, qtdadeLitros, qtdadeLatas, custo; printf ("\nDigite o valor da altura em metros: "); scanf ("%f",&altura); printf ("\nDigite o valor do raio em metros: "); scanf ("%f",&raio); areaCilindro=3.14*raio*raio + 2*3.14*raio*altura; printf ("\nA area do cilindro eh %.2f metros quadrados", areaCilindro); qtdadeLitros=areaCilindro/3; printf ("\nA qtidade de litros necessaria eh de %.2f ", qtdadeLitros); qtdadeLatas=qtdadeLitros/5; printf ("\nA qtidade de latas necessaria eh de %.2f ", qtdadeLatas); custo=qtdadeLatas*20;printf ("\nO valor total das tintas eh de R$ %.2f \n", custo); system("PAUSE"); } + Roteiro � Vetores � Strings � Matrizes + Vetores � São Matrizes com uma única dimensão � Declaração � tipo nome[tamanho]; � Exemplo: int array1[3]; � Representação: ? ? ? + Inicialização � Vetores podem ser inicializados na sua declaração: int array2[4]={-1,20,3}; int array3[]={1,0,3}; -1 20 3 ? 1 0 3 + Inicialização � Podemos ter vetores de qualquer tipo: char array1[4] = { ‘A’, ‘B’, ‘C’ }; float array2[] = { 10.0, 5.4, 6.33 }; double array3[] = { -0.2, 4.3, 3.14 }; unsigned int array4[10]; ... + Acessando um Vetor int array[3] = { 1, 2, 3 }; array[1] = -5; array[0] = array[0] + 2; printf(“%d”, array[0]); 3 -5 3 + Exemplo #include <stdio.h> int main() { int numeros[10] = {1, 1}; int i; for (i = 2; i < 10; i++) { numeros[i] = numeros[i-1] + numeros[i-2]; } for (i = 0; i < 10; i++) { printf("%d\n", numeros[i]); } return 0; } + Vetores � Cuidados importantes ao utilizar vetores � O compilador não verifica se o índice é válido: int a[10]; int b = a[32]; int b = a[-32]; // converte f para int int c = a[‘F’]; � O código acima compila sem problemas, mas o que irá acontecer quando ele for rodado? � Ninguém sabe!!! + Strings � Uma string é vetor de caracteres terminado pelo caractere nulo ‘\0’ � Sintaxe: � char nomeDaString[] = “conteudo”; � Exemplos: char frase[] = “Eu adoro C”; char centro[4] = “CIn”; char faculdade[10] = {‘U’,‘F’,‘P’,‘E’,‘\0’}; + Cuidados Importantes � Lembre-se sempre do ‘\0’ � O tamanho do vetor deve ser o número de caracteres que ele irá armazenar + 1 � Erro comum: � char faculdade[] = {'U', 'F', ‘U'}; � faculdade não é uma string! + string.h � Principais funções: � int strlen(str) � int strcmp(str1, str2) � string strcpy(destino, origem) � string strcat(destino, origem) � Existem diversas outras que veremos mais adiante + strlen � int strlen(str); � Retorna o tamanho da string passada como parâmetro � Exemplo: char string[50] = “Linguagem”; // imprime 9 printf(“%d”, strlen(string)); � Obs.: O caractere ‘\0’ não é contado. + strcmp � int strcmp(str1, str2) � Compara duas strings � A ordem lexicográfica é utilizada para a comparação Condição Retorno <0 Se str1 é menor que str2 0 Se str1 é igual à str2 >0 Se str1 é maior que str2 + Exemplo #include <stdio.h> #include <string.h> int main() { char pergunta[] = “qual é a sua linguagem favorita?”; char resposta[15]; do { printf(“%s”, pergunta); scanf(“%s”, resposta); } while (strcmp(resposta, “C”)); return 0; } + strcpy � string strcpy(destino, origem) � Copia o segundo parâmetro no primeiro � Exemplo: char ori[] = “ABC”; char dest[12] = “”; strcpy(dest, ori); // dest = “ABC”; + strcat � string strcat(destino, origem) � Concatena o segundo parâmetro no primeiro � Exemplo: char ori[] = “DEF”; // Não esqueça de inicializar: char dest[12] = “ABC”; // dest = “ABCDEF” strcat(dest, ori); + Outras funções � string gets(string) � Lê uma string do dispositivo de entrada padrão � Também lê espaços � Não verifica o tamanho máximo da string � int puts(string) � Imprime uma string no dispositivo de saída padrão � Ambas estão definidas no header stdio.h + Matrizes Multidimensionais � Sintaxe: � tipo nomoDaMatriz[dim1][dim2]...[dimN]; � Exemplos: // Matriz Bidimensional int m1[2][2] = { 1, 2, 3, 4 }; // Outra maneira int m2[2][2] = { { 1, 2 }, { 3, 4 } }; // Matriz Tridimensional int m3[2][2][2] = { 1, 2, 3, 4, 5, 6, 7, 8 }; printf("%d\n", m1[1][1]); printf("%d\n", m3[1][0][0]); + Exercícios 1) Escreva um programa que lê strings do teclado até que duas strings iguais sejam digitadas consecutivamente. A saída é a concatenação de todas as strings lidas e os tamanhos da maior a da menor. 2) Faça um programa que calcula o determinante de uma matriz 2*2. O usuário entra com a matriz e o programa imprime o determinante na tela + PONTEIROS + Ponteiro e Alocação Dinâmica de Memória �Ponteiro �Ponteiros ou apontadores (em inglês pointers)são variáveis cujo conteúdo é um endereço. �Declaração de Variável de tipo Ponteiro �Na linguagem C para declarar um ponteiro usa-se o tipo com os nomes das variáveis precedidos pelo caractere *. �Assim é necessário na declaração de um ponteiro, especificar para qual tipo de variável ele irá apontar. O operador * indica que a variável é um apontador. �por exemplo, declarar uma variável de nome p que pode armazenar endereços de memória em que existe um inteiro armazenado. � int *p; + Ponteiro e Alocação Dinâmica de Memória �Declaração de Variável de tipo Ponteiro (Exemplos) �por exemplo: �int *pi; // ponteiro para int �char *pc; // ponteiro para char �float *pf; // ponteiro para float �double *pd; // ponteiro para double O operador & significa “endereço de”. Lembra-se do scanf? Agora ficará explicado porque as variáveis no scanf devem vir precedidas por &. + Ponteiro e Alocação Dinâmica de Memória �Usos de Ponteiros 112 --- 108 --- 104 // variável inteiro int a; // variável ponteiro // para inteiro int *p; Efeito de declarações de variáveis na pilha de execução a p + Ponteiro e Alocação Dinâmica de Memória �Usos de Ponteiros 112 --- 108 5 104 // a recebe o valor 5 a = 5; 112 104 108 5 104 112 104 108 6 104 // p recebe o endereço de //a diz-se p aponta para a p = &a; // conteúdo de p recebe o // valor 6 *p = 6; a p a p a p + Ponteiro e Alocação Dinâmica de Memória # include <stdio.h> int main(void) { int a; int *p; p= &a; *p = 2; printf(“%d”,a); return 0; } # include <stdio.h> int main(void) { int a, b,*p; a=2; *p = 3; b=a+(*p); printf(“%d”,a); return 0; } ERRO : p não foi inicializadoIMPRIME 2 + Ponteiro e Alocação Dinâmica de Memória #include <stdio.h> main() {int a, *pa; double b, *pb; char c, *pc; // atribuições de endereços pa = &a; pb = &b; pc = &c; // atribuição de valores a = 1; b = 2.34; c = '@'; printf("\n valores:%5d %5.2lf %c", a, b, c); printf("\n ponteiros:%5d %5.2lf %c", *pa, *pb, *pc); printf("\n enderecos:%p %p %p", pa, pb, pc); // mais atribuições de valores usando os ponteiros *pa = 77; *pb = 0.33; *pc = '#'; printf("\n valores :%5d %5.2lf %c", a, b, c); printf("\n ponteiros:%5d %5.2lf %c", *pa, *pb, *pc); printf("\n enderecos:%p %p %p", pa, pb, pc); } + Ponteiro e Alocação Dinâmica de Memória valores: 1 2.34 @ ponteiros: 1 2.34 @ enderecos:1004 1016 1025 valores : 77 0.33 # ponteiros: 77 0.33 # enderecos:1004 1016 1025 RESULTADO: + Ponteiro e Alocação Dinâmica de Memória �Passando Ponteiros para Funções �Já vimos anteriormente, no estudo das funções em C, que para que tenhamos parâmetros de retorno, isto é, parâmetros que são alterados dentro da função e retornam com esse novo valor, é necessário que passemos o endereço da variável como parâmetro. O endereço nada mais é que um ponteiro. + Ponteiro e Alocação Dinâmica de Memória �Passando Ponteiros para Funções �Exemplo: uma função que troca o conteúdo de duas variáveis #include <stdio.h> void troca (double *a, double *b) {double aux; aux = *a; *a = *b; *b = aux; } int main () // principal {int a=5, b=7; troca(&a, &b); printf(‘’%lf %lf‘’,a,b); return 0; } + Ponteiro e Alocação Dinâmica de Memória �Ponteiro e Vetor �O nome do ponteiro também é um vetor int v[100]; *v = 33; //é o mesmo que v[0] = 33; *(v+2) = 44; é o mesmoque v[2] = 44; for (i=0; i<100; i++) *(v+i) = 0; //zera o vetor v + Ponteiro e Alocação Dinâmica de Memória �Ponteiro e Vetor �Podemos também usar um ponteiro como um vetor. int v[100]; int *pv; pv = v; //também pode ser pv = &v[0]; for (i = 0; i < 100; i++) pv[i] = 0; �Passando Vetor para função �Passar um vetor para uma função consiste em passar o endereço da primeira posição do vetor + Ponteiro e Alocação Dinâmica de Memória �Passando Vetor para função (Continuação) �Os elementos do vetor não são copiados para a função o argumento copiado é apenas o endereço do primeiro elemento + Ponteiro e Alocação Dinâmica de Memória �Passando Vetor para função (Continuação) �Exemplo: #include <stdio.h> #include <stdlib.h> // Função que calcula média float media(int n, float *v) { int i; float s = 0.0f; for (i = 0 ; i<n; i++) s += v[i]; return s/n; } int main(int argc, char *argv[]) { float v[5], float med; int i; for (i = 0 ; i<5; i++) scanf("%f", &v[i]); med = media(5,v); printf("media = %.2f\n ", med); system("PAUSE"); return 0; } + Ponteiro e Alocação Dinâmica de Memória �Alocação de Memória �Consiste em requisitar espaços (tamanhos) de memória em tempo de execução do programa. �O espaço alocado dinamicamente permanece reservado até que seja explicitamente liberado pelo programador + Ponteiro e Alocação Dinâmica de Memória �Alocação Esquematizado de Memória Código do programa Variáveis globais e estáticas Memória alocada dinamicamente Pilha Memória Livre + Ponteiro e Alocação Dinâmica de Memória �Funções para Alocação de Memória �Existem funções, presentes na biblioteca padrão stdlib que permitem alocar e liberar memória dinamicamente: �malloc () �free() �Exemplo1: int* v; v = malloc(10 * v); + Ponteiro e Alocação Dinâmica de Memória �Funções para Alocação de Memória Código do programa Variáveis globais e estáticas --- Código do programa Variáveis globais e estáticas 40 bytes 504 v = (int *) malloc(10* sizeof(v));int * v; v v 504 + �Atividade � Desenvolva um algoritmo que carregue uma matriz 12 X 4 com os valores das vendas de uma loja, em que a cada linha represente um mês do ano, e cada coluna, uma semana do mês. Calcule e imprima: 1. Total vendido em cada mês do ano; 2. Total vendido em cada semana durante todo o ano; 3. Total vendido no ano.
Compartilhar