Prévia do material em texto
1 Algoritmos e Técnicas de Programação Variáveis, Constantes e Operações Profa. Dra. Jenai Oliveira Cazetta Contextualização Pensar sobre o problema;Pensar sobre o problema; Rascunhar uma primeira solução;Rascunhar uma primeira solução; Preocupar com os detalhes.Preocupar com os detalhes. DOCUMENTAÇÃO Resolução de problemas Fonte: https://cutt.ly/EfFOiyK Programas de computadores são construídos seguindo um conjunto de regras e técnicas bastante especificas. Nessa era digital é imprescindível que profissionais de diversas áreas aprendam essas ferramentas, para que possam contribuir e evoluir em sua área de atuação. Fonte: https://cutt.ly/EfFOiyK Como abordar um problema de programação? • Projete seu programa antes de programá-lo; • Escreva um código legível; • Comente seu código enquanto escreve, não depois; • Utilize margens e indentação apropriadamente; • Use nomes sugestivos para as variáveis, funções e procedimentos; • Utilize funções e procedimentos curtos e objetivos. Observações • A maior parte do tempo que se gasta programando corrigindo e modificando código existente; • Você gastará muito tempo lendo o seu código faz sentido gastar algum tempo aprendendo a escrever um código legível; • Código legível fácil de escrever, fácil de depurar e/ou compilar e fácil de manter. DADOS PRIMITIVOS DADOS PRIMITIVOS DADOS COMPOSTOS DADOS COMPOSTOS OPERAÇÕES E EXPRESSÕES OPERAÇÕES E EXPRESSÕES Nossa teleaula 2 Tipos de dados e modificadores Variáveis e constantes • São endereços de memória de trabalho que guardam, temporariamente, um valor utilizado/calculado pelo programa. • Independente da linguagem, os dados serão armazenados em variáveis. • Para cada tipo de dado será especificado um tipo de variável e, consequentemente, um determinado espaço físico. Memória de Trabalho A B Cuidado!!! Fonte: https://cutt.ly/EfFOiyK As variáveis, quando criadas, existem de fato na memória de trabalho e, portanto, ocupam um espaço físico. O mesmo se aplica às constantes, porém, o valor armazenado nunca será alterado. Fonte: https://cutt.ly/EfFOiyK definição do rótulo de identificação da variável na memória! quantidade de bytes que será reservada na memória! Declaração de uma variável <tipo> <nome_da_variável>; • Inteiro: armazena os números inteiros; int valor1,valor2,soma; • Real: armazena valores de pontos flutuantes; float valor1,valor2,soma; • Caractere: caracteres, números e símbolos especiais (‘ ‘) / (” “). char nome1,nome2; Observações • Ao criar uma variável podemos optar por já atribuir um valor; • Quando a variável for: • numérica inicialize-a com zero; • booleana inicialize-a com falso; • caractere inicialize-a com “ “ para atribuir vazio. #include <stdbool.h> void main() { int idade; float salario=7500; double qtd_atomos; bool confirma=false; char genero=“ ”; } 3 Limitação dos valores e modificadores • Quantidade de espaço alocado para determinada variável depende do tipo de variável tipo de dado limita o valor que pode ser guardado naquele espaço; • Exemplo: • variável do tipo int alocados 4 bytes na memória 32 bits; • 1 byte unidade de informação digital 8 bits; • 1 bit só pode armazenar um 0 ou um 1. Modificadores de tipos • Comandos usados na declaração da variável que modificam sua capacidade padrão suprem parte da limitação; Tipo Tamanho (bytes) Valores int 4 −2.147.423.648 𝑎 2.147.423.648 unsigned int 4 4.294.967.296 short int 2 −32.768 𝑎 32.767 float 4 −3,4 𝑎 3,4 double 8 −1,7 𝑎 1,7 long double 16 −3,4 𝑎 1,1 Processamento de dados Processamento de dados • As variáveis e as constantes podem ser utilizadas na elaboração de cálculos matemáticos com o auxílio de operadores aritméticos; • Um dos maiores desafios garantir que a lógica esteja correta; • Ao escrever uma expressão matemática é preciso se atentar à ordem de precedência dos operadores. Ordem de precedência: (1) ( ); (2) potenciação e radiciação; (3) multiplicação, divisão e módulo; (4) soma e subtração. Operadores aritméticos Operador Descrição Exemplo Resultado + soma 4 + 2 6 − subtração 4 − 2 2 ∗ multiplicação 4 ∗ 2 8 / divisão 4/2 2 = atribuição 𝑥 = 4 𝑥 = 4 % resto 4%2 0 21%2 1 Operador Descrição Exemplo Resultado + manutenção de sinal +2 2 − inversão de sinal −2 −2 + + incremento de 1 em 1 𝑥 + + + +𝑥 𝑥 + 1 − − decremento de 1 em 1 𝑥 − − − −𝑥 𝑥 − 1 BI N ÁR IO S U N ÁR IO S // biblioteca necessária #include <math.h> 𝑥 pow(x,y) 𝑥 sqrt(x) Potenciação e radiciação? Fonte: https://bit.ly/3aLma1DFonte: https://cutt.ly/EfFOiyK 4 Atribuição de valores e operações aritméticas ( ou =) função de indicar valores para as variáveis, ou seja, atribuir informação para a variável. valor 5; valor = 5; soma valor1 + valor2; soma = valor1 + valor2; 𝑥 = 43 55 ÷ 30 + 2 𝑦 = 𝑥 + 2𝑥 + 3 𝐴 = 𝜋𝑟 𝐴 = 𝑏ℎ 2 𝑥 = (43 ∗ 55/(30 + 2)); 𝑦 = 𝑥^2 + 2 ∗ 𝑥 + 3; 𝑎𝑟𝑒𝑎 = 𝑀_𝑃𝐼 ∗ 𝑟𝑎𝑖𝑜^3; 𝑎𝑟𝑒𝑎 = 𝑏𝑎𝑠𝑒 ∗ 𝑎𝑙𝑡𝑢𝑟𝑎 /2; Operadores relacionais – Expressões booleanas Comparações entre valores resultado verdadeiro (1) ou falso (0). Operador Descrição Exemplo == igual a 𝑥 == 𝑦 ! = diferente de 𝑥! = 𝑦 > maior que 𝑥 > 𝑦 < menor que 𝑥 < 𝑦 > = maior ou igual a 𝑥 > = 𝑦 < = menor ou igual a 𝑥 < = 𝑦 Exemplo: Comparando dois números #include<stdio.h> int main() { //declarando variáveis int N1=0; int N2=0; //armazenando dados printf("Digite o 1º numero: "); scanf("%d",&N1); printf("Digite o 2º numero: "); scanf("%d",&N2); //comparando os dados armazenados e fornecendo o resultado (booleano) printf(“ \nN1 e N2 sao iguais? %d",N1==N2); printf(“ \nN1 e maior que N2? %d",N1>N2); printf(“ \nN1 e menor ou igual a N2? %d",N1<=N2); //finalizando o programa printf(“ \nPressione a tecla enter para sair!"); return 0; } Operadores lógicos e teste de mesa Operadores lógicos Descrição Exemplo Resultado ! negação (not) ! (𝑥 == 𝑦) inverte o resultado && conjunção (and) 𝑥 > 𝑦 && (𝑎 == 𝑏) todas as alternativas devem ser V V ∥ disjunção (or) 𝑥 > 𝑦 ∥ (𝑎 == 𝑏) basta uma condição ser V V 5 #include<stdio.h> int main() { //declarando variáveis int a, b, c; //armazenando dados printf(“ \nDigite o valor de a: "); scanf(“%d“,a); printf(" \nDigite o valor de b: "); scanf(“%d“,b); printf(" \nDigite o valor de c: "); scanf(“%d“,c); //comparando dados e imprimindo resultados printf(“ \n(a=b) e (a=c)? %d",((a==b)&&(a==c))); printf(" \n(a=b) ou (a=c)? %d",((a==b)||(a==c))); printf(" \n(a!=b) ou (a=c)? %d",((a!=b)||(a==c))); //encerrando o programa printf(" \nPressione a tecla enter para sair!"); return 0; } Teste de mesa Se você estiver confuso ao tentar procurar algum problema no seu programa, tente explicá-lo para você mesmo. Dessa forma é possível notar inconsistências ou fugas ao algoritmo planejado! Fonte: https://cutt.ly/EfFOiyK Teste de mesa – Exemplo1 #include <stdio.h> #include <stdlib.h> int main(void) { //declarando variávies float nota1,nota2,media; //armazenando dados printf(“ \nDigite a primeira nota: "); scanf("%f",¬a1); printf(" \nDigite a segunda nota: "); scanf("%f",¬a2); Digite a primeira nota: nota1 = 4.0 Digite a segunda nota: nota2 = 8.0 8.0 4.0 1 //calculando média media = (nota1+nota2)/2; //fornecendo resultados printf(" \nMedia do aluno = %.2f",media); printf(" \nMedia e maior ou igual a 6.0? %d",media>=6.0); printf(" \nPressione a tecla enter para sair!"); return 0; } media =(4.0+8.0)/2 Media do aluno=6.00 Media e maior ou igual a 6? Teste de mesa – Exemplo 2 #include<stdio.h> int main() { //declarando variáveis int a, b, c; //armazenando dados printf(“\nValor de a: "); scanf(“%d“,a); printf(“\nValor de b: "); scanf(“%d“,b); printf(“\nValor de c: "); scanf(“%d“,c); //imprimindo valores printf(“ \n(a=b) e (a=c)? %d",((a==b)&&(a==c))); printf(" \n(a=b) ou (a=c)? %d",((a==b)||(a==c))); printf(" \n(a!=b) ou (a=c)? %d",((a!=b)||(a==c))); printf(" \nPressionea tecla enter para sair!"); return 0;} Valor de a: Valor de b: Valor de c: 4 2 4 (a=b) e (a=c)? (a=b) ou (a=c)? (a!=b) ou (a=c)? 0 1 1 6 Calculando o salário de um funcionário Atividade • Programa em C calcular o salário líquido de um funcionário de certa empresa levando em consideração o número de horas trabalhadas. Salário bruto = (horas trabalhadas).(valor hora) Valor hora trabalhada = (1/10).(salário mínimo) Imposto = 3% do salário bruto Salário líquido = (salário bruto) – (imposto) ENTRADAENTRADA • Número de horas trabalhadas • Valor do salário mínimo PROCESSAMENTOPROCESSAMENTO • Valor da hora trabalhada • Salário bruto • Imposto • Salário líquido SAÍDASAÍDA • Valor da hora trabalhada • Salário bruto • Imposto • Salário líquido #include<stdio.h> int main() { //declarando variáveis float num_horas, salario_min,valor_hora,salario_bruto, imposto, salario_liquido; //lendo e armazenando dados printf(“ \nDigite o numero de horas trabalhadas: "); scanf("%f",&num_horas); printf(“ \nDigite o valor do salario minimo: "); scanf("%f",&salario_min); //processando os dados valor_hora = salario_min/10; salario_bruto = num_horas*valor_hora; imposto = 0.03*salario_bruto; salario_liquido = salario_bruto – imposto; //imprimindo dados processados printf(“ \n\nValor da hora trabalhada: %.2f", valor_hora); printf(“ \nSalario bruto: %.2f",salario_bruto); printf(“ \nImposto arrecadado: %.2f",imposto); printf(“ \nSalario a receber: %.2f",salario_liquido); //encerrando o programa printf(“ \n Pressione a tecla enter para sair!"); return 0; } 7 Variáveis e constantes Variáveis e constantes Há diferença entre a declaração de uma variável e a de uma constante? Fonte: https://cutt.ly/EfFOiyK Variáveis compostas Considere a seguinte situação • Você precisa cadastrar as notas de 6 alunos e calcular a média semestral de cada um deles. Existe problema técnico em criar 18 variáveis para armazenar os valores? Fonte: https://cutt.ly/EfFOiyK Variáveis compostas – Estruturas de dados Melhor solução para armazenar diversos valores dentro de um mesmo contexto armazenar diversos valores em um endereço de memória. Estrutura de dados: vetores, matrizes, registros, filas, pilhas, etc. Fonte: https://cutt.ly/EfFOiyK Memória de Trabalho A B Memória de Trabalho A B Memória de Trabalho A 8 Se os vários valores têm os mesmos endereços, como diferenciar um do outro? Fonte: https://cutt.ly/EfFOiyK Variáveis compostas ou indexadas • Variáveis compostas ou variáveis indexadas possuem um endereço na memória e índices para identificar seus subespaços; • Formadas a partir dos tipos primitivos; • Classificadas em: • homogêneas e heterogêneas, • unidimensionais ou multidimensionais, • estáticas ou dinâmicas. Destacam-se em termos de performance, pois cada dado é alocado sequencialmente na memória, tornando seu acesso extremamente rápido. Fonte: https://cutt.ly/EfFOiyK Variáveis compostas homogêneas //criação <tipo> <nome_do_vetor>[tamanho]; Variáveis compostas homogêneas unidimensionais • Vetores estrutura de uma tabela contendo apenas 1 coluna e N linhas (1 linha e N colunas); • Estrutura estática seu tamanho deve ser informado no momento da criação e não é alterado por nenhum recurso em tempo de execução. //criação int V[3]; //armazenamento printf(“Digite um valor: “); scanf(“%d”,&V[1]); //impressão printf (“ ∖nV[1] = %d”,V[1]); V[0] V[1] V[2] Memória de TrabalhoMemória de Trabalho V[0] V[1] V[2] //atribuição de valores V[0] = 2; V[2] = 1; 2 1 9 Variáveis compostas homogêneas multidimensionais • Matrizes estrutura de uma tabela contendo N colunas e M linhas; • Estrutura estática seu tamanho deve ser informado no momento da criação e não é alterado por nenhum recurso em tempo de execução. //criação <tipo> <nome_da_matriz>[linhas][colunas]; //criação int M[3][2]; //armazenamento printf(“Digite um valor: “); scanf(“%d”, &M[2][1]); //impressão printf (“ ∖nM[2][1] = %d”,M[2][1]); M[0][0] M[0][1] M[1][0] M[1][1] M[2][0] M[2][1] Memória de Trabalho M[0][0] M[0][1] M[1][0] M[1][1] M[2][0] M[2][1] 0 -2 //atribuição valores A[0][1] = 1; A[1][0] = 0; A[2][1] = -2; 1 Exemplo #include<stdio.h> main() { //declarando variáveis float notas[2][3]; //armazenando dados ENTRADAENTRADA • Notas de dois alunos PROCESSAMENTOPROCESSAMENTO • Média das notas dos dois alunos SAÍDASAÍDA • Média das notas dos dois alunos //Aluno 1 printf(“ \n\nAluno 1"); printf(“ \nDigite a 1ª nota: "); scanf("%f",¬a[1][0]); printf(“ \nDigite a 2ª nota: "); scanf("%f",¬a[1][1]); //Aluno 2 printf(“ \n\nAluno 2"); printf(“ \nDigite a 1ª nota: "); scanf("%f",¬a[2][0]); printf(“ \nDigite a 2ª nota: "); scanf("%f",¬a[2][1]); //calculando e imprimindo dados printf(“ \n\nAluno 1"); nota[1][2] = (nota[1][0] + nota[1][1])/2; printf(" \nNota 1: %.2f",nota[1][0]); printf(" \nNota 2: %.2f",nota[1][1]); printf(“ \nMedia: %.2f",nota[1][2]); printf(“ \n\nAluno 2"); nota[2][2] = (nota[2][0] + nota[2][1])/2; printf(“ \nNota 1: %.2f",nota[2][0]); printf(“ \nNota 2: %.2f",nota[2][1]); printf(“ \nMedia: %.2f",nota[2][2]); printf(“ \nPressione enter para sair!"); return 0 } Eu não poderia declarar uma estrutura com 2 linhas e 4 colunas e armazenar o nome do aluno? Fonte: https://cutt.ly/EfFOiyK Variáveis compostas heterogêneas 10 Variáveis compostas heterogêneas • Estruturas ou registros structs; • Exemplo: ficha de cadastro de um cliente com diversos campos nome, idade, CPF e endereço; • Exemplo: Nome, notas e médias de um conjunto de alunos; • Criação antes da função main(). struct <nome> { <tipo> <nome_variavel1>; <tipo> <nome_variavel2>; //... //... }; Acesso aos dados da struct O acesso aos dados é feito usando o nome da variável, que recebeu como tipo a estrutura composta heterogênea, com um ponto (.) e o nome do campo: dadosvariavel.campo1 //no programa principal, antes de utilizar a estrutura, ela deverá ser invocada struct nome dadosnome1; //... dadosautomovel1.modelo dadosautomovel1.ano dadosautomovel1.valor struct automovel { char modelo[20]; int ano; float valor; }; Exemplo • Programa variável composta heterogênea armazenar os dados de um automóvel; • Programa deverá receber os dados digitados (modelo, ano e valor) pelo usuário e armazenar nos respectivos campos e, por fim, imprimir os valores que foram atribuídos. #include<stdio.h> //definindo o tipo de registro struct automovel { char modelo[20]; int ano; float valor; }; main() { //”chamando” o registro struct automovel dadosautomovel1; //pedindo ao usuário para digitar os dados e armazenando-os nos respectivos campos printf(“ \nDigite o modelo do automovel: "); scanf("%s",&dadosautomovel1.modelo); printf(“ \nDigite o ano do automovel: "); scanf("%d",&dadosautomovel1.ano); printf(“ \nDigite o valor do automovel: "); scanf("%f",&dadosautomovel1.valor); 11 //imprimindo os dados informados printf(“ \nDados"); printf(" \nModelo: %s",dadosautomovel1.modelo); printf(" \nAno: %d",dadosautomovel1.ano); printf(" \nValor: %f",dadosautomovel1.valor); //encerrando o programa printf(“ \nPressione a tecla enter para sair!"); return 0; } Estatística de veículos Atividade • Programa em C calcular a quantidade média de veículos registrados no estado de São Paulo em cada ano, usando os dados da tabela. Tipo de Veículo Quantidade de veículos por ano 2017 2018 2019 Carro 16.319.979 16.834.629 17.247.123 Moto 4.133.366 4.268.872 4.378.772 Caminhão 658.713 664.617 669.056 Dados em português! • Qual a média de veículos registrados em 2017, em 2018 e em 2019? • Qual ano obteve a maior média? • Quantidade anual de carros, motos e caminhões ENTRADAENTRADA • Média anual de carros, motos e caminhões PROCESSAMENTOPROCESSAMENTO • Média anual de carros, motos e caminhões • Ano em que a média foi maior SAÍDASAÍDA Estrutura de dados homogênea unidimensional! Fonte: https://cutt.ly/EfFOiyK #include<stdio.h>main() { //declarando variáveis int ano_2017[3]={0}; int ano_2018[3]={0}; int ano_2019[3]={0}; float media_2017=0; float media_2018=0; float media_2019=0; //inserindo os valores e armazenando os dados printf(“ \nNumero de carros em 2017: ”); scanf(“%d”,&ano_2017[0]); printf(" \nNumero de motos em 2017: ”); scanf(“%d”,&ano_2017[1]); printf(" \nNumero de caminhões em 2017: ”); scanf(“%d”,&ano_2017[2]); printf(" \nNumero de carros em 2018: ”); scanf(“%d”,&ano_2018[0]); printf(" \nNumero de motos em 2018: ”); scanf(“%d”,&ano_2018[1]); printf(" \nNumero de caminhoes em 2018: ”); scanf(“%d”,&ano_2018[2]); 12 printf(“ \nNumero de carros em 2019: ”); scanf(“%d”,&ano_2019[0]); printf(" \nNumero de motos em 2019: ”); scanf(“%d”,&ano_2019[1]); printf(" \nNumero de caminhões em 2019: ”); scanf(“%d”,&ano_2019[2]); //calculando as médias media_2017=(ano_2017[0]+ano_2017[1]+ano_2017[2])/3; media_2018=(ano_2018[0]+ano_2018[1]+ano_2018[2])/3; media_2019=(ano_2019[0]+ano_2019[1]+ano_2019[2])/3; //imprimindo as médias calculadas printf(“ \nMedia em 2017: %.2f”,media_2017); printf(“ \nMedia em 2018: %.2f”,media_2018); printf(“ \nMedia em 2019: %.2f”,media_2019); //comparando as médias printf(“ \n2017 obteve a maior media? %d”, ((media_2017 > media_2018)&&(media_2017 > media_2019))); printf(“ \n2018 obteve a maior media? %d”, ((media_2018 > media_2017)&&(media_2018 > media_2019))); printf(“ \n2019 obteve a maior media? %d”, ((media_2019 > media_2017)&&(media_2019 > media_2018))); //encerrando o programa printf(“ \nPressione a tecla enter para sair!"); return 0; } Vetores de caracteres Caracteres Como eu posso ler uma frase digitada na tela do computador para, depois, imprimí-la? Fonte: https://cutt.ly/EfFOiyK Recapitulando 13 Variáveis int −2.147.423.648 𝑎 2.147.423.648 unsigned int 4.294.967.296 short int −32.768 𝑎 32.767 float −3,4 𝑎 3,4 double −1,7 𝑎 1,7 long double −3,4 𝑎 1,1 char −128 𝑎 127 Operadores aritméticos + soma + manutenção de sinal − subtração − inversão de sinal ∗ multiplicação + + incremento de 1 em 1 / divisão − − decremento de 1 em 1 = atribuição % resto (1) ( ); (2) potenciação e radiciação; (3) multiplicação, divisão e módulo; (4) soma e subtração. #include<math.h> 𝑥 pow(x,y) 𝑥 sqrt(x) Operadores relacionais == igual a 𝑥 == 𝑦 ! = diferente de 𝑥! = 𝑦 > maior que 𝑥 > 𝑦 < menor que 𝑥 < 𝑦 > = maior ou igual a 𝑥 > = 𝑦 < = menor ou igual a 𝑥 < = 𝑦 Operadores lógicos ! negação (not) ! (𝑥 == 𝑦) && conjunção (and) 𝑥 > 𝑦 && (𝑎 == 𝑏) ∥ disjunção (or) 𝑥 > 𝑦 ∥ (𝑎 == 𝑏) Estruturas de dados estáticas homogêneas Vetor <tipo> <nome_do_vetor>[tamanho]; scanf(“%d”,&vetor[1]); printf(“vetor[1] = %d”,vetor[1]); Matriz <tipo> <nome_da_matriz>[linhas][colunas]; scanf(“%d”,&matriz[2][1]); printf (“matriz[2][1] = %d”,matriz[2][1]); Estruturas de dados estáticas heterogêneas - Registro struct <nome> { <tipo> <nome_variavel1>; <tipo> <nome_variavel2>; //... }; struct automovel { char modelo[20]; int ano; float valor; }; variavel.campo; dadosautomovel1.modelo scanf("%d",&dadosautomovel1.ano); printf("%s",dadosautomovel1.valor);