Baixe o app para aproveitar ainda mais
Prévia do material em texto
Conteúdo das aulas: Algoritmos e Programação Prof. Leandro Brito Material acadêmico adaptado/melhorado de: Instituto CERTI Amazônia. Treinamento para Sistemas Embarcados L in gu ag e m C Bibliografia • LOPES, Anita; GARCIA, Guto. Introdução à programação: 500 algoritmos resolvidos. Rio de Janeiro: Campus, 2002. • MANZANO, Jose Augusto N. G.; OLIVEIRA, Jayr Figueredo de. Algoritmos: lógica para o desenvolvimento de programação . 13. ed. São Paulo: Érica, 2002. • NORTON, Peter. Introdução à informática. São Paulo: Makron Books do Brasil, 1997. 2 L in gu ag e m C • Introdução • Operadores e Expressões • Funções de E/S • Estruturas de Controle • Vetores e Matrizes Conteúdo da Disciplina L in gu ag e m C Introdução • Histórico • C é resultado de um processo iniciado com a linguagem BCPL. BCPL influenciou a linguagem de nome B, que evoluiu posteriormente para C. • Projetada em 1972, nos laboratórios da BELL (empresa de desenvolvimento de software básico), por Brian Kerninghan e Dennis Ritchie para o UNIX do PDP-11. • A simplicidade de sua implementação permitiu a extensão da linguagem e a criação de compila- dores C para praticamente todas as plataformas de hardware e sistemas operacionais. • Em 1983 estabeleceu-se o padrão ANSI. L in gu ag e m C Introdução • Características • Portabilidade • Linguagem estruturada e modular • Geração de código eficiente • Simplicidade • Possui apenas 32 palavras chaves • Uso de biblioteca de funções que implementam os recursos de alto nível para o programador • Linguagem de médio nível • Combina facilidades de uma linguagem de alto nível com a versatilidade e potencialidade do Assembly. • Não efetua verificações em tempo de execução. L in gu ag e m C Introdução • Aplicação – Sistemas Operacionais – Compiladores – Planilhas Eletrônicas – Editores de Texto – Banco de Dados L in gu ag e m C Introdução • Linguagem de máquina: única linguagem que o computador entende, ou seja, que pode ser diretamente executada pelo hardware. Ela é formada por códigos binários que representam as instruções e dados. Tem uso difícil e tedioso. Pode-se dizer que, para se programar em linguagem de máquina é necessário um amplo conhecimento do hardware utilizado. • Linguagem de alto nível: conjunto de instruções mais compatíveis com a linguagem humana e com o modo do ser humano pensar. Estas linguagens, na sua maioria, são de uso genérico e não é necessário ter conhecimento do hardware utilizado. L in gu ag e m C Introdução • Todo programa escrito em linguagem de alto nível é chamado de programa-fonte ou código fonte. • O programa em linguagem de máquina, escrito ou resultante, é chamado de programa-objeto ou código objeto. • Todo o programa-fonte, para ser executado, deve obrigatoriamente, de alguma forma, ser traduzido para programa-objeto. Neste momento é que são utilizados os compiladores e/ou interpretadores. L in gu ag e m C Introdução •Interpretador: lê o código-fonte linha-a-linha, faz uma consistência de sua sintaxe e se não houver erro, converte-a para linguagem de máquina para executá-la. Este processo é realizado até que a última linha seja executada ou a consistência apresente algum erro. O interpretador precisa estar presente todas as vezes que vamos executar o nosso programa e o trabalho de checagem da sintaxe deverá ser repetido. L in gu ag e m C Introdução • Compilador: lê o programa inteiro, faz uma consistência de sua sintaxe e se não houver erro, gera o código-objeto em disco com a extensão .OBJ. Este programa não pode ser executado até que sejam agregadas a ele rotinas em linguagem de máquina (biblioteca da linguagem) que lhe permitirão a sua execução. Este trabalho é feito por um programa chamado linkeditor, que cria o código- executável final em disco com a extensão .EXE. Neste momento não é mais necessária a presença do compilador, pois todo o programa já esta traduzido para linguagem de máquina e armazenado em disco, basta rodá-lo. L in gu ag e m C Introdução • C é uma linguagem compilada Fontes C Executável Compilação Ligação + Arquivos OBJ Bibliotecas L in gu ag e m C Estrutura de um programa em C • Declaração das bibliotecas de funções (#include) • Declarações de constantes e seus valores (#define) • Declaração das variáveis globais (públicas) • Declaração das funções • Única função obrigatória e primeira a ser executada é a função main() • O corpo das funções fica entre { } main() /* função obrigatória */ { printf(“Hello World”); } L in gu ag e m C Estrutura de um programa em C /* declaração dos arquivos de cabeçalho e definições */ #include <stdio.h> #define PI 3.1415 /* definição das variáveis globais */ /* função principal do programa */ void main() { /* definição das variáveis locais */ printf (“Hello World”); } L in gu ag e m C L in gu ag e m C Tipos básicos de dados TIPO BITs BYTEs DESCRIÇÃO DOMÍNIO void 0 0 sem argumento e não retorna valor Sem valor char 8 1 caractere isolado -128 a 127 int 16 2 valor inteiro -32.768 a 32.767 float 32 4 número ponto-flutuante (no contendo um ponto decimal e/ou um expoente) 3.4E-38 a 3.4E+38 double 64 8 número ponto-flutuante de dupla precisão (mais algarismos significativos e um expoente que pode ter mais magnitude) 1.7E-308 a 1.7E+308 L in gu ag e m C Modificadores de tipos básicos signed cha -128 a 127 signed int -32.768 a 32.767 unsigned char 0 a 255 unsigned int 0 a 65.535 short int = int -32.768 a 32.767 unsigned short int = unsigned int a 65.535 long int -2.147.483.648 a 2.147.483.647 (quatro bytes) unsigned long int a 4.294.967.295 long float = double (padrão ANSI) long double dez dígitos de precisão ( 80 bits) L in gu ag e m C Identificadores Identificadores são os nomes das variáreis, funções, rótulos e outros objetos definidos pelo usuário. • O primeiro caracter deve ser uma letra ou sublinhado • Apenas os 32 primeiros caracteres são significativos • É case sensitive, ou seja, maiúsculas se diferem das minúsculas • int x; /* é diferente de int X; */ • As instruções terminam com “;” • Comentários devem ficar entre /* e */ • Palavras-chave são minúsculas L in gu ag e m C Declaração int i; float f;unsigned int inteiro_sem_sinal; char ch; double balanco, lucro, prejuizo; int i, j, k; int _exemplo_de_um_nome_longo; long int A5k; L in gu ag e m C Primeiro Programa 1. Use o IDE Dev C++ para editar, compilar, linkar e executar o programa Hello.c 2. Qual o tamanho dos arquivos C, OBJ e EXE do programa Hello.c ? 3. Que conclusões você tira da resposta da questão 2? L in gu ag e m C L in gu ag e m C Operadores • Operador de Atribuição • Em C o operador de atribuição é o sinal de igual “=”. • É erro comum em programadores iniciantes confundir o “=” com o operador relacional de igualdade “==”. • Exemplos: a = 1; delta = b * b – 4 * a * c; i = j; • O operando esquerdo deve ser um identificador de variável, isto é, não pode ser uma constante ou expressão. São atribuições inválidas: 1 = a; // constante! b + 1 = a; // expressão! L in gu ag e m C Conversões de tipos • Se os dois operandos de uma atribuição não são do mesmo tipo, o valor da expressão ou operador da direita será convertido para o tipo do identificador da esquerda. • Exemplo 1: int i; float r; i = 5; // valor de i: 5 r = i; // valor de r: 5.0 • Exemplo 2: int i; float r = 654.321; i = r; // i será truncado para 654 L in gu ag e m C Conversões de tipos • Pode-se dizer que as conversões potencialmente perigo- sas (onde há possibilidade de perda de informação) são: char int float double • Observe que o compilador C ao encontrar esta operação não gera nenhum aviso de atenção para o programador. Assim este detalhe pode gerar um erro de programação (bug) que passe desapercebido ao programador inexperiente. É possível dizer que a linguagem C possui tipos ”macios” (soft types) pois a operação com variáveis de tipos diferentes é perfeitamente possível. Esta característica do C se contrapõe a algumas linguagens em que isto não é possível. Estas linguagens possuem tipos “duros” (hard types). L in gu ag e m C Operadores • Atribuição Múltipla É possível atribuir um valor a muitas variáveis em uma única instrução. int i, j, k; double max, min; i = j = k = 1; max = min = 0.0; • Operadores Aritméticos Operador Operação + adição - subtração * multiplicação / divisão % módulo (resto da divisão inteira) L in gu ag e m C Conversão de tipo (casting) • O operador cast permite forçar uma expressão a ser de determinado tipo: int num; float valor = 13.0; num = valor % 2; // inválido num =(int) valor % 2; // válido A conversão de tipo é usada para que o dado armazenado em valor fosse transformado no tipo int assim a operação módulo pode ser efetuada. • Regra geral de conversão de tipos: char int float double L in gu ag e m C Incremento/Decremento Utilizados para incrementar e/ou decrementar em uma unidade o valor de uma variável. Eles podem ser utilizados antes (prefixo) ou após (posfixo) a variável, dando resultados ligeiramente diferentes. Ex.: Y = X ++; “Y recebe o valor de X e depois X é incrementado” Y = X --; “Y recebe o valor de X e depois X é decrementado” Y = ++ X; “X é incrementado e depois Y recebe o valor de X” Y = -- X; “X é decrementado e depois Y recebe o valor de X” L in gu ag e m C Operadores Relacionais • As expressões compostas com operadores relacionais comparam dois valores e retornam 0 em caso de expressões falsas e 1 se forem verdadeiras. Operador Operação < Menor que > Maior que < = Menor que ou igual a > = Maior que ou igual a = = Igual a ! = Diferente de L in gu ag e m C Operadores Lógicos • Os operadores lógicos comparam duas expressões e retornam o valor 0 (falso) ou 1 (verdadeiro). Operador Operação && AND (E) || OR (OU) ! NOT (NÃO) • O operador unário ! tem maior precedência, seguido do operador E lógico. O operador OU lógico tem a menor precedência dentre os operadores lógicos. L in gu ag e m C Operadores Bit a Bit • Os operadores de bit só podem ser utilizados com valores do tipo caracter ou inteiro. Operador Operação << Deslocamento à esquerda >> Deslocamento à direita & E bit a bit | OU bit a bit ^ XOU bit a bit ~ Não bit a bit (complemento de um) L in gu ag e m C Operadores Bit a Bit Ex.: a = 15 0 0 0 0 1 1 1 1 a << 1 0 0 0 1 1 1 1 0 a >> 3 0 0 0 0 0 0 1 1 Ex.: a = 15 0 0 0 0 1 1 1 1 b = 56 0 0 1 1 1 0 0 0 a & b 0 0 0 0 1 0 0 0 a | b 0 0 1 1 1 1 1 1 a ^ b 0 0 1 1 0 1 1 1 L in gu ag e m C Operador Condicional (Ternário) • O operador condicional (ou ternário) consiste de um ponto de interrogação (?) e um dois pontos (:) usados juntos e requer três operandos. V resultado = modo > 0 ? 1 : 0; F a variável resultado receberá valor 1 se modo for maior que 0, caso contrário receberá 0. L in gu ag e m C Expressões Reduzidas Expressão normal Expressão reduzida soma = soma + cont; soma += cont; d = d – 3; d-= 3; y = y * (z+1); y*= z+1; i = i / j; i/= j; a = a & b; a &= b; a = a << 3; a <<= 3; L in gu ag e m C Precedência dos Operadores Maior ( ) [ ] -> ! ~ ++ -- - (tipo) * & sizeof * / % + - << >> < <= > >= == != & ^ | && || ?: = += -= *= /= etc. Menor , L in gu ag e m C Problemas 1. Escreva quatro instruções diferentes em C, cada uma subtraindo 1 da variável n. 2. Escreva um bloco de código C que tem o mesmo efeito da instrução n = 100 + m++; sem utilizar o operador de pós-incremento 3. Escreva um bloco de código C que tem o mesmo efeito da instrução n = 100 + ++m; sem utilizar o operador de pré-incremento 4. Escreva uma instrução única em C que subtraia de z a soma de x e y e depois incremente y. 5. Se m=5 e n=2, quais serão os valores de m e n após cada uma das expressões: a. m *= n++; b. m += --n; L in gu ag e m C L in gu ag e m C E/S pelo console FUNÇÃO printf(): A função printf() é utilizada para escrever na tela. O protótipo desta função está descrito no arquivo de cabeçalho <stdio.h>. printf("string de controle", lista de argumentos); A string de controle contém caracteres que serão exibidos na tela, comandos de formatação que dizem a printf() como exibir os argumentos restantes ou ambos. Quando encontra um comando de formatação, a funçãoliga os comandos aos argumentos. L in gu ag e m C E/S pelo console Código Significado %d Exibe um inteiro no formato decimal com sinal %uExibe um inteiro no formato decimal sem sinal %f Exibe um tipo float no formato decimal %c Exibe um caractere %s Exibe uma string %oExibe um número octal sem sinal %x Exibe um número hexadecimal sem sinal (letras minúsculas) %X Exibe um número hexadecimal sem sinal (letras maiúsculas) L in gu ag e m C E/S pelo console Exemplos: printf("%s %d", "Esta é uma string ", 100); exibe: Esta é uma string 100 printf("esta é uma string %d", 100); exibe: esta é uma string 100 printf("o número %d é decimal, %f é ponto flutuante.",10, 110.79); exibe: o número 10 é decimal, 110.79 é ponto flutuante. printf("%s", "Alô\n"); exibe: Alô e avança uma linha printf(“%c, %d”,65,”C”); exibe: A, 67 L in gu ag e m C E/S pelo console FUNÇÃO scanf(): A função scanf() é utilizada para leitura de dados pelo teclado. O protótipo desta função está descrito no arquivo de cabeçalho <stdio.h>. scanf("string de controle", lista de argumentos); A string de controle determina como os valores são lidos para as variáveis apontadas na lista de argumentos. Todas as leituras devem ser finalizadas por <ENTER>. A lista de argumento deve conter os endereços das variáveis a que devem ser atribuídos os valores. L in gu ag e m C Exemplos: E/S pelo console #include <stdio.h> main(){ int idade; printf(“Digite um número: ”); scanf(“%d”, &idade); printf ("\nA minha idade é %d", idade) ; } #include <stdio.h> main(){ int pes; float metros; printf("Informe o número de pes: "); scanf("%d", &pes); metros = pes * 0.3048; printf("\n%d pés é %f metros", pes, metros); } L in gu ag e m C E/S pelo console Instruções Descrição getchar() lê um caracter do teclado aguardando <Enter> getche() lê um caracter do teclado e prossegue getch() lê um caracter sem eco na tela e prossegue putchar() escreve um caracter na tela gets() lê uma string do teclado puts() escreve uma string na tela L in gu ag e m C E/S pelo console Exemplos: #include <stdio.h> main(){ char ch; ch=getchar(); putchar(ch); } Comando printf() Resultado (“%-5.2f”, 123.234) 123.23 (“%5.2f”, 3.234) 3.23 (“%10s”, “alo”) alo (“%-10s”, “alo”) alo (“%5.7s”, “123456789”) 1234567 (“%04d”, 21) 0021 L in gu ag e m C Exercícios 1. Utilize o operador sizeof para exibir quanto espaço em bytes ocupa cada um dos tipos básicos de C (char, int, float e double). 2. Leia uma temperatura em graus Centígrados e apresentá-la convertida em graus Fahrenheit. A fórmula de conversão é: F = (9 * C + 160) / 5. Exiba o resultado com 3 casas decimais. 3. Faça um programa que leia um caractere e exiba seu código ASCII equivalente. 4. Leia e exiba uma string com seu nome completo usando a função scanf(). Qual o resultado obtido? Justifique. L in gu ag e m C L in gu ag e m C Estruturas de Controle • Governam o fluxo de execução do programa. Se dividem em três categorias: – Desvios Condicionais: if, operador ternário (?:) e switch. – Loop: while(), do-while(), for() e os comandos continue e break. – Desvio Incondicional: goto. L in gu ag e m C if Sintaxe: if (expressão) comando; else comando; onde, comando poder ser um único, um bloco de comandos e, neste caso, usa-se os delimitadores de bloco de comandos ( { } ) ou nenhum comando. A cláusula else é opcional. V if (expressão) comando; F else comando; próximo comando; L in gu ag e m C if Exemplo: main() { int a, b; printf(“Digite dois números”); scanf(“%d,%d”,&a,&b); if (b) printf(“%f\n”,(float)a/b); else printf(“divisão por zero\n”); } L in gu ag e m C if aninhados Ocorre quando um comando if é um objeto de um outro if ou else. Sintaxe exemplo: if ( i ) { if ( k ) comando1; if ( j ) comando2; else comando3; } else comando4; L in gu ag e m C Sintaxe exemplo: if – else - if if (expressão) comando; else if (expressão) comando; else if (expressão) comando; else if (expressão) comando; else comando; Neste caso, as expressões são avaliadas de cima para baixo. Assim que uma expressão for diferente de zero (verdadeira), o comando associado a ela é executado e a estrutura encerrada. Se nenhuma expressão for verdadeira, será executado o comando associado ao último else e, se ele não for declarado, nenhum comando será executado. L in gu ag e m C if – else - if main(){ int magico, adivinhacao; randomize(); magico= random(10); printf(“ADIVINHE: ”); scanf(“%d”,&adivinhacao); if (adivinhacao == magico){ printf(“ACERTOU”); printf(“%d é o número mágico\n”, magico); } else if (adivinhacao > magico) printf(“—errado– muito alto\n’); else (“—errado– muito baixo\n’);} L in gu ag e m C Operador Ternário main(){ int x = 3, y = 7, max; max = (x>y)?1:0; printf(“max = %d\n”,max); } L in gu ag e m C switch O comando de seleção switch é utilizado em caso de seleção múltipla. Ele testa o valor de uma expressão contra uma lista de constantes inteiras ou caracter. Quando o valor é igual, os comandos associados àquela constante são executados. Se nenhuma coincidência for encontrada os comandos de default são executados. switch(expressão) { case constante1: comandos; break; case constante2: comandos; break; . default: comandos; } L in gu ag e m C switch O comando break causa a saída imediata do switch. Se não existir um comando break seguindo os comandos de um case, o programa segue executando os comandos dos cases abaixo. Exemplo: void main() { int dia; clrscr(); printf(“Digite um dia da semana: “); scanf(“%d”,&dia); switch(dia) { case 1: printf(“\nDomingo\n”); break; case 2: printf(“\nSegunda\n”); break; . case 7: printf(“\nSábado\n”); break; default: printf(“\nNúmero inválido!!!\n”); }} L in gu ag e m C Comandos de repetição O comando de repetição é utilizado nos casos em que queremos repetir determinados comandos. Laço for Sintaxe: for(inicialização;condição;incremento) comando; ou for(inicialização;condição;incremento) { comandos; } L in gu ag e m C for Inicialização:é geralmente uma atribuição que determina o valor inicial da variável de controle. Esta declaração pode ser feita antes do laço e, desta forma, não necessita ser declarada no escopo do comando. Condição: é uma expressão que determina o final do laço ou o valor final da variável de controle. Incremento: define como a variável de controle do laço varia cada vez que o laço é repetido. L in gu ag e m C Exemplo: int x; for for(x=1;x<=100;x++) printf(“%d”,x); for(x=100;x!=65;x-=5) { z=x*x; printf(“o quadrado de %d é %f”,x,z); } O laço infinito: for( ; ; ) printf(“este laço é infinito\n”); ch=”\0”; for( ; ; ){ ch=getchar(); if (ch==”A”) break; o comando break causa o término imediato do laço } printf(“Você digitou A”); L in gu ag e m C while Sintaxe: while(condição) comando; ou while(condição) { comandos; } A condição pode ser qualquer expressão, e verdadeiro é qualquer valor não-zero. Quando a condição é falsa, o controle do programa passa para o primeiro comando após o bloco de código do comando while. L in gu ag e m C while Exemplo: void main(){ int t=1, dia; while(t) { printf(“Digite um dia da semana, ou <99> para encerrar: “); scanf(“%d”,&dia); switch(dia) { case 1: printf(“\nDomingo\n”); break; . case 7: printf(“\nSábado\n”); break; case 99: printf(“\nEncerrando\n”); t=0; break; default: printf(“\nNúmero inválido!!!\n”); } /* fim switch*/ } /* fim while */ } /* fim main() */ L in gu ag e m C do-while Ao contrário dos laços for e while, que testam as condições no início, o do-while testa a condição no final. Este laço sempre será executado pelo menos uma vez e repete até que a condição se torne falsa. Sintaxe: do { comando } while (condição); Exemplo: do { scanf(“%d”,&num); }while(num!=99); L in gu ag e m C Comandos de desvio São utilizados para realizar desvios dentro de um programa. • break: O comando break tem duas finalidades. A primeira é de terminar um case num comando switch e a segunda é de forçar o término imediato de um laço de repetição. Exemplo: for(t=0;t<100;t++){ print(“%d \n”,t); if(t==10) break; } L in gu ag e m C Comandos de desvio • continue: Força a repetição (retorna ao início do laço e testa a condição). Exemplo: for(x=0;x<100;x++){ if (x%2) continue; print(“%d \n”,x); } L in gu ag e m C Comandos de desvio • goto: Apesar das linguagens possuírem estruturas de controle eficientes, também é disponibilizado o comando de desvio. Deve-se ter um cuidado muito grande, pois a sua utilização em demasia ou de forma incorreta tende a tornar os programas ilegíveis. A sua utilização é simples, basta declarar um rótulo (identificador aceito pela linguagem C seguido de dois pontos) e, de algum ponto do programa estabelecer o desvio através da declaração goto rótulo; Sintaxe: goto rótulo; rótulo: L in gu ag e m C Comandos de desvio Exemplo: int x=1; retorno: printf(“%d”,x); x++; if(x<=100) goto retorno; L in gu ag e m C Comandos de desvio • exit(): Assim como o comando break força o término de um laço, a função exit() força o término de execução de um programa, retornando ao sistema operacional. Sintaxe: void exit(código_de_erro); onde código_de_erro é utilizado para indicar o estado de retorno. Quando for zero, indica término normal de execução e outros valores são utilizados para indicar algum tipo de erro (retornado para a variável ERRORLEVEL em arquivos “batch” do DOS). L in gu ag e m C Lista de Exercícios 1. Anacleto tem 1,50 metro e cresce 2 centímetros por ano, enquanto Felisberto tem 1,10 metro e cresce 3 centímetros por ano. Calcule e exiba quantos anos serão necessários para que Felisberto seja maior que Anacleto. 2. Imprima os números perfeitos menores de 100. Nota: Número perfeito é aquele cuja soma de seus divisores, exceto ele próprio, é igual ao número. Exemplo: 6 é perfeito porque 1 + 2 + 3 = 6. 3. Calcule e apresente o valor de S no seguinte somatório: S = 1/225 – 2/196 + 4/169 – 8/144 + ... + 16384/1 L in gu ag e m C L in gu ag e m C Vetor • Um vetor é uma matriz de uma dimensão capaz de armazenar um conjunto de variáveis de mesmo tipo, referenciadas pelo seu nome e por um índice. • Sintaxe: tipo nome[tamanho]; • As variáveis são alocadas seqüencialmente na memória. • tamanho representa o número de elementos suportado pelo vetor. • O índice do vetor varia de 0 a (tamanho-1). L in gu ag e m C Vetor Exemplo: main(){ int notas[5], i, soma=0; for (i=0; i<5 ; i++) { printf(“Digite a nota %d:”,i); scanf(“%d”,¬as[i]); } for (i=0; i<5 ; i++) soma = soma + notas[i]; printf(“Media = %f”, (float) soma/5); } Vetor notas 10 5 0 7 2 índices 0 1 2 3 4 L in gu ag e m C Verificação de Limites • A linguagem C não faz verificação automática dos limites dos vetores. • O teste dos limites deve ser realizado pelo programa e é erro comum de programação: main() { int a[10],i; for (i=1;i<=10;i++) scanf(“%d”,&a[i]); } L in gu ag e m C Exercícios 1. Leia dois vetores A e B com 5 elementos inteiros cada, calcule e escreva: – O vetor S = A + B; – O vetor W com os elementos intercalados de A e B; – O vetor Z obtido pela inversão da ordem de A; – O vetor Q com os elementos comuns de A e B; – O vetor Y correspondente à união de A e B; – Coloque A em ordem crescente de seus elementos. L in gu ag e m C Conteúdo das aulas: Algoritmos e Programação Prof. Leandro Brito Material acadêmico adaptado/melhorado de: Instituto CERTI Amazônia. Treinamento para Sistemas Embarcados
Compartilhar