Baixe o app para aproveitar ainda mais
Prévia do material em texto
INF01202INF01202INF01202INF01202 Algoritmos e ProgramaçãoAlgoritmos e ProgramaçãoAlgoritmos e ProgramaçãoAlgoritmos e Programação Prof. Anderson Maciel amaciel@inf.ufrgs.br Aula 3 – Estrutura de um programa em C sequencial LinguagemLinguagem de de ProgramaProgramaçãoçãoLinguagemLinguagem de de ProgramaProgramaçãoção fornece conjunto de convenções e regras que • fornece conjunto de convenções e regras que possibilitam instruir o computador na execução de tarefas;execução de tarefas; • lê programa escrito na linguagem específica (li d ã )(linguagem de programação); • verifica sintaxe: se correta, traduz para p linguagem de máquina; • executa programa em linguagem de máquina p g m m g g m m q (execução). 2 Definição de Linguagem de Definição de Linguagem de g gg g ProgramaçãoProgramação • Sintática: Uma linguagem de programação é uma notação utilizada pelo programador para especificar p p p p ações a serem executadas por um computador : ¾construções corretas do programa, de ç p g acordo com a linguagem. • Semântica: Uma linguagem de programação g g p g ç compreende um conjunto de conceitos que um programador usa na resolução dos problemas t propostos: ¾recursos disponíveis, compatíveis com o di d liparadigma da linguagem. 3 Sintaxe da linguagem CSintaxe da linguagem CSintaxe da linguagem CSintaxe da linguagem C • Componentes reconhecidos pela linguagem C• Componentes reconhecidos pela linguagem C (sintaxe da linguagem): • tipos – propriedades dos dados;tipos propriedades dos dados; • declarações – partes do programa, podendo dar significado a um identificador, alocar memória, ú l g definir conteúdo inicial e definir funções; • funções – ações executadas pelo programa; • expressões – define e altera valores e chama funções de I/O; á i ili ã • comentários – auxilia a compreensão, sem tradução para o executável. 4 Sintaxe: Livre ou Sensível ao Sintaxe: Livre ou Sensível ao ContextoContexto C - linguagem sensível ao contexto: maiúsculas e minúsculas são diferentesf no programa ( nada a ver com dados!!!) ¾ palavras reservadas sempre em minúsculas! ¾ variáveis: maiúsculas e minúsculas; m m ; ¾ prática adotada: programa: todo em minúsculas; p g exceção(adotada): nome de constantes (define) 5 Elementos léxicos do C Elementos léxicos do C -- caracterescaracteres • Letras: maiúsculas e minúsculas • Dígitos: 0 a 9 • Sublinhado: _ • Outros símbolos especiais:• Outros símbolos especiais: # /* “ . , ; .. ( ) { } : = == ^, ( ) { } 6 ComentárioComentárioComentárioComentário Permitem a inclusão de observações que visam• Permitem a inclusão de observações, que visam auxiliar a compreensão do que está sendo t d lexecutado pelo programa. • Podem adotar 2 formas: • // identifica início de comentário, reserva até o fim da linha. • /* ..... */ delimita início e fim de comentário, podendo utilizar mais de uma linha entre eles. • SEMPRE incluir comentário na 1ª linha contendo• SEMPRE incluir comentário na 1ª linha, contendo descrição do programa!!!!! 7 IdentificadoresIdentificadoresIdentificadoresIdentificadores 9 Nomes que servem para identificar fazer referência 9 Nomes que servem para identificar, fazer referência e definir o conteúdo de variáveis, funções e outros objetos definidos pelo usuário.objetos def n dos pelo usuár o. 9 Sintaxe de identificador: 1º caractere: letra ou ´ ´ (sublinhado) (usar letra)– 1º caractere: letra ou _ (sublinhado) (usar letra) – 2º caractere em diante: letras, dígitos e/ou ´_´ 8 Palavras Reservadas Palavras Reservadas Identificadores associados aos Palavras Reservadas Palavras Reservadas • Identificadores associados aos comandos que compõem esta linguagem de programaçãode programação. • As 32 palavras reservadas padrão são: • 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 signed sizeof static struct switch typedef union unsigned void volatile while Não existe na programacao estruturada 9 Tipos de dadosTipos de dadospp D i úd h d á d • Determina o conteúdo e tamanho de área de memória reservada para o dado. N C s ti s bási s d d d s sã• No C, os tipos básicos de dados são: Tipo Tamanho Valores Válidos char 1 byte Caracteres do Código ASCII int 2 bytes -2 e31 a 2 e32 float 4 bytes -2 e63 a 2 e64 double 8 bytes ... Estrutura básica de um programa CEstrutura básica de um programa CEstrutura básica de um programa CEstrutura básica de um programa C /* Nome e objetivo do programa */ /* diretivas para o pré-processador – bibliotecas*/ #include <biblioteca> Declarações (opcional)/* declaração de constantes e variáveis globais */ # define CONSTANTES /* declaração de funções*/ (opcional) tipo função (parâmetros) { } /* função obrigatória que compõem o programa principal */ int main() /* int opcional, indica retorno */ { Programa /* declaração de variáveis locais da função main */ /* comandos da função main */ return 0; // retorno normal da função main Programa principal } 11 Diretivas para o processador Diretivas para o processador Bibli tBibli t-- BibliotecaBiblioteca • Bibliotecas contêm funções pré-definidas, utilizadas nos programas para ações específicas. • A biblioteca desejada é inserida pelo pré-processador a partir da diretiva #include. • Exemplos de bibliotecas disponíveis no C:Exemplos de bibliotecas disponíveis no C: Funções de entrada e saída#include <stdio h> Funções matemáticas#include <math.h> Funções padrão#include <stdlib.h> Funções de entrada e saída#include <stdio.h> Funções de texto#include <string.h> Funções do sistema#include <system.h> Declaração de variáveisDeclaração de variáveisDeclaração de variáveisDeclaração de variáveis Sintaxe: <tipo> <nome da variavel>;<tipo> <nome_da_variavel>; 9 declaração das variáveis / conteúdos usadas no programa;ç p g 9 nomes: letra inicial + letras, dígitos ou _ (até 32) – minúsculas! 9 tipos principais: 9 tipos principais: int /inteiro float /decimal, precisão simples double /decimal precisão dupladouble /decimal, precisão dupla char / 1 único caractere 9 exemplos: int n;int n; int quantidade_valores; float x, y, somavalores; char sexo; 13 Entrada Entrada formatada de dados: formatada de dados: função função scanfscanffunção função scanfscanf Sintaxe: scanf ("formatos", &var1, &var2,...); Exemplos: int i, j; %d 1 número inteiro, j; float x; char c; %i mesmo que %d %f 1 número float %lf 1 número double; scanf("%d", &i); scanf("%d %f", &j, &x); %c 1 caractere char ( , j, ); scanf("%c", &c); 14 Saída Saída formatada de dados: formatada de dados: f ã f ã i tfi tffunção função printfprintf%c char %d inteiro %i inteiroSintaxe: Exemplos: %f float ou double com notação comum %e float ou double com notação científica printf ("formatos", var1, var2,...); Exemplos: int i, j; float x; \ Função notação científica %g dependendo do conteúdo, usa %f ou %e char c; printf(“Resultados: i=%d \n j=%d \n“,i,j); \ Função \b BackSpace \n New Line (mudança de Li h )\n ,i,j); printf("%d", i); printf("%d, %f", j, x); i tf("% " ) Linha) \t Tabulação Horizontal \v Tabulação Vertical printf("%c", c); \\ imprime o próprio caractere \ \' imprime o caractere 'p \" imprime o caractere " \? imprime o caractere ? Comando (operador) de Comando (operador) de pp atribuiçãoatribuiçãoSintaxe: id tifi d ã • Atribui o valor da direita à variável da esquerda identificador = expressão; • Atribui o valor da direita à variável da esquerda • O valor pode ser uma constante,uma variável ou uma expressãouma expressão • Exemplos x = 4; // significa que a variável X recebe conteúdo 4; g f q y = x + 2; y = y + 4; valor = 2.5; //casa decimal indicada pelo ponto úsexo = 'F’; /*atribuição de 1 único caractere para uma variável char é entre apóstrofos*/ 16 Expressões Lógicas e Expressões Lógicas e Expressões Lógicas e Expressões Lógicas e AritméticasAritméticas Operadores 17 Operadores MatemáticosOperadores MatemáticosOperadores MatemáticosOperadores Matemáticos ComentárioExemploOperador Subtr i d xx y Soma x e yx + y+ Multiplica x e yx * y* Subtrai y de xx – y- Resto da divisão de x por y ( qux % y% Divide x por y (se operandos inteiros, executa divisão inteira) x / y/ Incrementa em 1 o valor de xx++++ Resto da divisão de x por y (requer operandos inteiros) x % y% Decrementa em 1 o valor de xx---- 18 Operadores de Operadores de Atribuição Atribuição pp CombinadaCombinada á Atribui o valor de y a xx = y= ComentárioExemploOperador 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%= q yy 19 Funções Matemáticas Funções Matemáticas çç (#(#include <include <mathmath.h>).h>) Arredonda o número real para cima; ceil(3.2) é 4ceil(x)ceil ComentárioExemploFunção e elevado à potencia xexp(x)exp Cosseno de x (x em radianos)cos(x)cos L itm n tu l d xl (x)l Arredonda o número deal para baixo; floor(3.2) é 3floor(x)floor Valor absoluto de xfabs(x)fabs Calcula x elevado à potência ypow(x, y)pow Logaritmo decimal de xlog10(x)log10 Logaritmo natural de xlog(x)log Raiz quadrada de xsqrt(x)sqrt Seno de xsin(x)sin Calcula x elevado à potência ypow(x, y)pow Tangente de xtan(x)tan 20 Modeladores Modeladores -- castscasts • Altera o tipo retornado por operações parciais Sintaxe: (tipo) expressão Altera o tipo retornado por operações parciais de uma expressão. • Funcionamento: ... float num_real; // variável real int x=1,y=2,z=1; // valores inteiros – inicializados na ,y , declaração /*expressão com operadores inteiros,todos resultados parciais em inteiro: */p num_real= x/2+ y/2 + z/2; int int int 0 + 1 + 0 ↔ 1 int int int int int int int 21 intint float Modeladores em Modeladores em expressões aritméticasexpressões aritméticas /*testa cast (modeladores) nos operandos*/ #include <stdio.h> #include <stdlib.h> int main()m () { float num_real; // variável real int x=1,y=2,z=1; // valores inteiros – inicializados na declaração system ("color f3"); // modifiquei cores do ambiente de execução system ( color f3 ); // modifiquei cores do ambiente de execução //expressão com operadores inteiros,todos resultados parciais em inteiro: num_real=x/2 + y/2 + z/2; printf("Caso 1: %f\n",num_real); // float sem formatação: 6 casa decimais //operadores inteiros 1o resultado parcial em real//operadores inteiros, 1o resultado parcial em real num_real=(float)x/2 + y/2 + z/2; //operadores inteiros, 1 resultado parcial em real printf("Caso 2: %f\n",num_real); //operadores inteiros todos resultados parciais em real//operadores inteiros,todos resultados parciais em real num_real=(float)x/2 + (float)y/2 + (float)z/2; printf("Caso 3: %f\n",num_real); //expressão com operadores inteiros e reais, todos resultados parciais em real;real; num_real = x / 2.0 + y / 2.0 + z / 2.0; // inserção de espaços : + legibilidade printf("Caso 4: %f\n",num_real); return 0; 22 return 0; } Operadores lógicos ou booleanosOperadores lógicos ou booleanos FV&& FV||Significado Operador Tipo FFF FVV FVF VVV “ou”|| binário “e”&& binário FVF FV! negação! unário ou|| binário VF Em C, as expressões lógicas retornam um valor: • 0, se falso; 23 , ; • 1 ou outro valor que não zero, se verdadeiro. Operadores RelacionaisOperadores RelacionaisOperadores RelacionaisOperadores Relacionais ComentárioExemploOperador O conteúdo de x é diferente do de yx != y != O conteúdo de x é igual ao de yx == y== O úd d é l d 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 é menor que o de yx < y < O conteúdo de x é maior ou igual ao de yx >= y >= O conteúdo de x é maior que o de yx > y> Em C, as expressões relacionais retornam um valor: • 0, se falso; • 1 ou outro valor que não zero, se verdadeiro. 24 q , Operadores RelacionaisOperadores RelacionaisOperadores RelacionaisOperadores Relacionais A é maior que 10? (a > 10)(a > 10) X é negativo? ( )(x < 0) y é diferente de 10? (y != 10) nota é igual a 5?nota é igual a 5? (nota == 5) 25 A expressão lógica em CA expressão lógica em C Sintaxe: <operando> <operador booleano> <operando A expressão lógica em CA expressão lógica em C p p p ou <operando> <operador relacional> <operando> ¾ Retorna um valor lógico: – falso: zero; – verdadeiro: qualquer valor diferente de zero. ¾ Operandos podem ser expressões aritméticos ou lógicas, incluindo operadores aritméticos, relacionais e lógicos. ¾ Exemplos: (a > b ) || ( c < d ) valor > 10 !(a+c<b) (a == b) (a==b) && ( a>=c)(a==b) && ( a>=c) (a!=b) !((a>=b) || ( a>=c) 26 Expressões lógicas ou relacionaisExpressões lógicas ou relacionaisExpressões lógicas ou relacionaisExpressões lógicas ou relacionais a) codigo entre 1 e 100 (valores limites considerados): (codigo > 0 && codigo < 101) (0 < codigo < 101) b) contador maior ou igual a maximo ou valor igual a procurado:procurado: ( contador >= maximo || valor == procurado ) c) valor igual a 1 ou 2 ou entre 5 e 7 (inclusive): (valor == 1 || valor == 2 || (valor >=5 && valor <=7)) 27 Precedência Precedência de operadores em Cde operadores em Cpp Na expressão: (x != 10 || y > 1 && y < 10) P l dê i d d i i ã ordem operador 1o ! funções Pela precedência dos operadores, primeiro serão resolvidos “>” e “ <“: y > 1 e y < 10 O próximo operador a ser considerado, pela dê á “! “2o * / % 3o + - precedência será “!=“ x != 10 Restam os operadores “&&” e “||”, como “&&” é o de maior prioridade, será o próximo: 4o < > <= >= 5o == != p p y < 1 && y < 10 Finalmente o “||” será resolvido. A versão a seguir com parênteses mostra a 5 ! 6o && 7o || g p ordem de execução da expressão: ( (x != 10) || ( ( y > 1) && (y < 10) ) ) RECOMENDAÇÃO ê ã ó 7o || RECOMENDAÇÃO: usar parênteses não só para alterar a precedência de operadores, como também para tornar mais claras as expressõesexpressões. Seja a seguinte expressãoSeja a seguinte expressãoSeja a seguinte expressãoSeja a seguinte expressão (x != 10 || y > 1 && y < 10) if (x != 10 || y > 1 && y < 10) (x != 10 || y > 1 && y < 10) Pela precedência dos operadores, primeiro serão resolvidos “>” e “ <“ y > 1 e y < 10y 1 e y 10 O próximo operador a ser considerado, pela precedência será “!=“ x != 10 Restam os operadores “&&” e “| |”, como “&&” é o de maior prioridade, será o próximo: y < 1 && y < 10 Finalmente o “||” será resolvido. A versão a seguir com parênteses mostra a ordem de execução da expressão: ( (x != 10) || ( ( y > 1) && (y < 10) ) ) RECOMENDAÇÃO: usar parênteses não só para alterar a precedência deRECOMENDAÇÃO: usar parênteses não só para alterar a precedência de operadores, como também para tornar mais claras as expressões. 29 ExercíciosExercíciosExercíciosExercícios 1) Faça um algoritmo que: – leia um valor inteiro; – calcule o menor número de cédulas necessárias para completar este valor. Lembre de que as cédulas correntes no real são 100, 50, 20, 10,5, 2 e 1 (incluindo aqui também a moeda)1 (incluindo aqui também a moeda). 9 Ob ã li i d d t 9 Obs: não vamos analisar ainda o caso da parte fracionária. Podemos implementar o mesmo algorimo para ele tratando-o como um inteiro para ele tratando o como um inteiro. Análise e Definição do ProblemaAnálise e Definição do Problema Especificação do Problema: Enunciado Análise e Definição do ProblemaAnálise e Definição do Problema Dada uma quantia (inteira) em reais, calcular e mostrar o mínimo de notas (R$ 100, 50, 20, 10, 5 , 2 ou 1) que totalizem este valor. Objetivo: calcular notas equivalentes a valor Entradas: valor inteiro Saída: notas correspondentes ao valor Tela da ExecuçãoTela da ExecuçãoTela da ExecuçãoTela da Execução AlgoritmoAlgoritmo algoritmo calculanotas; /* calcula o nro mínimo de notas equivalentes a valor entradas: valor (inteiro)entradas: valor (inteiro) saídas: n100, n50, n20, n10, n5, n2 e n1 ( notas ) */ 1. início 2. ler valor 3 v = valor //copia para outra variável para preservar valor lido3. v = valor //copia para outra variável, para preservar valor lido 4. n100 = v / 100 //se for menor, n100 fica 0 5. v = v % 100 // recebe resto da div inteira por 100 6. n50 = v / 50 //se for menor, n50 fica 0 % 7. v = v % 50 // recebe resto da div inteira por 50 8. n20 = v / 20 //se for menor, n20 fica 0 9. v = v % 20 // recebe resto da div inteira por 20 10 n10 = v / 10 //se for menor, n10 fica 010. n10 v / 10 //se for menor, n10 fica 0 11. v = v % 10 // recebe resto da div inteira por 10 12. n5 = v / 5 //se for menor, n5 fica 0 13. v = v % 5 // recebe resto da div inteira por 5 14 n2 = v / 2 //se for menor n2 fica 014. n2 = v / 2 //se for menor, n2 fica 0 15. n1 = v % 2 // recebe resto da div inteira por 2: já está pronto 16. ...... //informa notas calculadas... 17. fim ResoluçãoResolução do do problemaproblema /* C lcul qu ntid d d c d cédul ( u m d ) c sp nd nt um l /* Calcula quantidade de cada cédula (ou moeda) correspondente a um valor inteiro Entrada: valor inteiro Saida: quandidade de cedulas/moedas de 100, 50, 20, 10, 5, 2 e 1 reais */ #i l d tdi h#include <stdio.h> #include <stdlib.h> int main( ) { i l // l i i lid d ál lint valor, v; //valores inteiros lido e usado nos cálculos int n100, n50,n20,n10,n5,n2,n1; printf(“Informe valor inteiro:“); scanf("%d", &valor); // ( ) v = valor; // copia, para preservar valor lido n100 = v/100; // RESULTADO DA DIVISÃO INTEIRA POR 100 v = v%100; // RESTO DA DIVISÃO INTEIRA POR 100 n50 = v/50;; v = v%50; n20 = v/20; v = v%20; n10 = v/10;n10 v/10; v = v%10; n5 = v/5; v = v % 5; n2 = v/2; // RESULTADO DA DIVISÃO INTEIRA POR 2n2 v/2; // RESULTADO DA DIVISÃO INTEIRA POR 2 n1 = v%2; // RESTO DA DIVISÃO INTEIRA POR 2 Resolução do problemaResolução do problema // ti ã// ... continuação //quebra 2 linhas e insere caracteres ,00 depois do valor: printf("\n\nValor lido: R$%d,00\n",valor); // insere vírgula zero zero printf("notas de 100: %d\n" n100);printf( notas de 100: %d\n ,n100); printf("notas de 50: %d\n",n50); printf("notas de 20: %d\n",n20); printf("notas de 10: %d\n" n10);printf( notas de 10: %d\n ,n10); printf("notas de 5: %d\n",n5); printf("notas de 2: %d\n",n2); printf("notas de 1: %d\n" n1);printf( notas de 1: %d\n ,n1); system("pause>>null"); // segura tela, mas NÃO imprime mensagem!! return 0; } } Cuidado (pegaCuidado (pega--ratão)ratão) A lógica utilizada no problema anterior valeria se tivéssemos apenas notas de R$ 100, 40 e 1? NÃO!!! P l j i i R$ 120 00NÃO!!! Por exemplo, veja o que ocorre se quisemos retirar R$ 120,00 Obs Não é trivial mostrar que a estratégia adotada no problema Obs. Não é trivial mostrar que a estratégia adotada no problema anterior realmente funciona para as cédulas que realmente temos... Exercício para a próxima aula!Exercício para a próxima aula!Exercício para a próxima aula!Exercício para a próxima aula! 3) Faça um algoritmo que: – leia um valor real, com casas decimais; – tranforme este valor real em dois valores inteiros correspondentes, respectivamente, à parte inteira e à parte real do valor lido (se o l lid f 123 98 t i t d b 123 t f 98)valor lido for 123,98, parte_int deve receber 123 e part_frac, 98); – calcule o menor número de notas e moedas necessárias para completar este valor. Lembre-se de que as notas correntes no real são 100 50 20 10 5 2 e 1 (incluindo aqui também a moeda) e as são 100,50,20,10,5, 2 e 1 (incluindo aqui também a moeda) e as moedas 50, 25, 10, 5 e 1 centavos. – implemente em C um programa que corresponda ao algoritmo
Compartilhar