·

Ciência da Computação ·

Introdução à Lógica e Programação

Envie sua pergunta para a IA e receba a resposta na hora

Fazer Pergunta

Texto de pré-visualização

Caso somaprod Com base no que estudamos até agora escreva um programa em C que execute uma função chamada somaprod para calcular a soma e o produto de dois número inteiros var1 e var2 e armazenar o resultado respectivamente em var3 e var4 A função somaprod é executada com osomaprodvar1 var2 var3 var4 onde oVar1 e var2 são dois números inteiros conhecidos quaisquer oVar3 será o resultado de var1 var2 oVar4 será o resultado de var1 var2 somaprod é uma função do tipo void 2 Código C 3 include iostream using namespace std void somaprodint a int b int c int d c a b d a b int main int var15 var23 var3 var4 somaprodvar1 var2 var3 var4 cout Soma var3 endl cout Produto var4 endl return 0 O resultado não é o esperado 5 Variáveis e Endereços Memória abstrata Memória concreta associações Memória de fato x y z w k 5 7 9 1 3 Variáveis Valor x y z w k 13 72 91 100 15 Variáveis Endereço 13 72 91 100 15 5 7 9 1 3 x y z w k Variáveis Endereço Valor 6 Ponteiros Toda variável tem um endereço ou uma posição associados na memória O endereço é visto como um ponteiro ou apontador É uma referência para a posição de memória de uma variável Ponteiros fornecem um modo de acesso à variável sem referenciá la diretamente Um endereço pode ser armazenado em uma variável do tipo ponteiro ponteiro variável Ponteiro variável é uma variável que contém o endereço de outra variável o P aponta para V Valor 1 Endereço 4 Endereço 5 Endereço 4 Endereço 3 Endereço 2 Endereço 1 P V P endereço da variável V 7 Ponteiros Declaração Declarando uma variável de nome var1 que ponde armazenar valores inteiros int var1 Para declarar uma variável do tipo ponteiro Forma Geral otipo variável otipo variavel otipo variavel int p int p int p Declara uma variável de nome p que pode armazenar um endereço de memória para um inteiro E se a declaração for int p x y Qual o resultado Ponteiros Operador é um operador unário que fornece o endereço de uma variável Forma Geral o variavel O operador não pode ser aplicado à expressões ou constantes Exemplo x 178 8 int p declara p tipo ponteiro para inteiro int v declara v tipo inteiro p v atribui o endereço de v ao ponteiro p ou seja apontase p para v A variável p de tipo ponteiro para inteiro recebe o endereço da variável v de tipo inteiro Ponteiros Operador A carga inicial de ponteiros se faz com o operador 9 int a 15 float fab 82 int p a declara p tipo ponteiro para inteiro iniciado com o endereço de a float pab fab declara e incializa pab para floar com o endereço de fab Ponteiros Operador de Indireção é chamado de Operador de Indireção Quando aplicado a uma variável do tipo ponteiro acessa o conteúdo apontado por ela Forma Geral ovariavel 10 int p declara p tipo ponteiro para inteiro int v 3 declara v tipo inteiro com valor igual a 3 p v atribui o endereço de v à variável p p 4 armazena no endereço v o valor 4 4 Endereço 4 Endereço 5 Endereço 4 Endereço 3 Endereço 2 Endereço 1 P V Operações com Ponteiros Uma vez declarado um ponteiro podem ser realizados sobre ele praticamente todos os tipos de operações que podem ser realizadas sobre um inteiro Ex p p p1 p2 p1 aponta para o mesmo lugar de p2 p1 p2 p1 terá o mesmo conteúdo que p2 No entanto reiterando um ponteiro serve sobretudo para acessar outros objetos a partir de seus endereços 11 Usando Ponteiros 12 int i j int ip i 12 ip i j ip ip 21 A variável ip armazena um ponteiro para um inteiro O endereço de i é armazenado em ip O conteúdo da posição apontada por ip é armazenado em j O conteúdo da posição apontada por ip passa a ser 21 Cuidados 13 include iostream int main int a p p a p 2 printf da return 0 include iostream int main int abp a 2 p 3 b a p printfdb return 0 Qual o resultado da execução destes códigos Cuidados 14 Talvez o principal cuidado ao usar ponteiros seja saber para onde o ponteiro está apontando Nunca use um ponteiro que não foi inicializado Ex Como não usar ponteiros int main Errado Nao Execute int xp x13 px return0 Vamos ao Compilador C include iostream using namespace std int main int a c cin a c a cout o endereco de a a endl cout o endereco de c c endl cout o valor de a a endl cout o valor de c c endl cout o valor de onde c aponta c endl return 0 15 11 o endereco de a 0x7ffce50f010c o endereco de c 0x7ffce50f0110 o valor de a 11 o valor de c 0x7ffce50f010c o valor de onde c aponta 11 Caso SWAP 16 include iostream using namespace std void swapint a int b protótipo da função int main int a8 b12 inicializa variáveis a e b swapab esta função troca os valores entre a e b cout endl cout No programa principal endl print dos valores de a e b cout O valor de a a endl após o retorno da função cout O valor de b b endl swap return 0 void swapint a int b int temp a variável temporária iniciada com o valor de a a b troca de valores a b b temp b recebe o valor de temp que foi inicilizada com a cout Na funcao swap o valor de a a endl cout Na funcao swap o valor de b b endl Caso SWAP 17 include iostream using namespace std void swapint pa int pb protótipo da função int main int a8 b12 inicializa variáveis a e b int pta ptb cout endl cout Valores inciais endl cout Valor de a a Endereco de a a endl cout Valor de b b Endereco de b b endl endl swapab esta função troca os valores a por b b por a cout endl cout Valores apos SWAP endl cout Valor de a a Endereco de a a endl cout Valor de b b Endereco de b b endl endl return 0 void swapint pa int pb int temp pa variável temporária iniciada com o valor de a pa pb troca de valores a b pb temp b recebe o valor de temp que foi inicilizada com a Caso somaprod Com base no que estudamos até agora escreva um programa em C que execute uma função chamada somaprod para calcular a soma e o produto de dois número inteiros var1 e var2 e armazenar o resultado respectivamente em var3 e var4 A função somaprod é executada com osomaprodvar1 var2 var3 var4 onde oVar1 e var2 são dois números inteiros conhecidos quaisquer oVar3 será o resultado de var1 var2 oVar4 será o resultado de var1 var2 somaprod é uma função do tipo void 19 Código C 20 include iostream using namespace std void somaprodint a int b int c int d c a b d a b int main int var15 var23 var3 var4 somaprodvar1 var2 var3 var4 cout Soma var3 endl cout Produto var4 endl return 0 Qual correção deve ser feita Ponteiros e Funções O retorno explícito de valores não permite transferir mais de um valor para a função que a chama Como uma função pode alterar variáveis de quem a chamou função chamadora passa os endereços dos valores que devem ser modificados função chamada deve declarar os endereços recebidos como ponteiros Passagem por referência 21 Arrays Arrays são agrupamentos de dados adjacentes na memória Declaração tipodado nomearraytamanho define um arranjo de tamanho elementos adjacentes na memória do tipo tipodado 23 Arrays 24 Ex float m10 pf pf m Referenciando Arrays 25 Em float m10 m é uma constante que endereça o primeiro elemento do array Portanto não é possível mudar o valor de m Ex float m10 n10 float pf m n pf m erro m é constante ok Referenciando Elementos de Arrays 26 Podese referenciar os elementos de um array através de ponteiros float m 10 30 575 2345 float pf pf m2 cout pf 575 Referenciando Elementos de Arrays 27 Podese utilizar ponteiros e colchetes float m 10 30 575 2345 float pf pf m2 cout pf1 2345 Note que o valor entre colchetes é o deslocamento a ser considerado a partir do endereço de referencia pfn indica enésimo elemento a partir de pf Vamos ao código C Crie um programa C Parte I No programa principal defina um array vetor de 5 posições Inicialize os elementos desse vetor com a seguinte regra o vetori i 2 o Utilize a estrutura for Crie uma estrutura de repetição for para imprimir esses 5 elemento do vetor Teste o seu programa Parte II Crie uma função chamada initvetor para iniciar esse vetor o O código criado para inicializar o vetor deve ser movido para essa função Crie uma função chamada listvetor para listar os elementos desse vetor o O código criado para imprimir os elementos desse vetor deve ser movido para essa função Teste o seu programa Analise e reflita sobre as alterações 28 Aritmética de Ponteiros 29 É possível fazer operações aritméticas e relacionais entre ponteiros e inteiros Soma ao somarse um inteiro n a um ponteiro endereçamos n elementos a mais n positivo ou a menos n negativo Operação Resultado pf2 Equivale a pf2 pf n Acessa o conteúdo de n posições à frente pf n Acessa o conteúdo de n posições anteriores pf Endereça o ponteiro uma posição à frente pf Endereça o ponteiro uma posição anterior Operações válidas 30 Válido Não é válido Subtrair ponteiros pf pi produz inteiro Somar ponteiros pi pf Incrementar ou decrementar ponteiros pi pi Multiplicar ou dividir ponteiros pi pf Somar ou subtrair um inteiro a um ponteiro pi int Operar ponteiros com double ou float pi 20 Comparar ponteiros Cuidados CC não controla os limites dos arrays o programador deve fazêlo Um ponteiro deve sempre apontar para um local válido antes de ser utilizado 31 Ponteiros genéricos Ponteiro que pode apontar para qualquer tipo de dado sendo definido como tipo void Deve ser controlado pelo programados usando typecast conversão de tipo 32 pv x cout Inteiro intpv 10 pv f cout Real floatpv 35 void pv int x10 float f35 pv x aqui pv aponta para um inteiro pv f aqui para um float Ponteiros e Strings Strings são arrays de caracteres e podem ser acessadas usando char O incremento de pc o posiciona sobre o próximo caractere byte a byte 33 int main char str abcdef pc for pc str pc 0 pc cout pc Resultado abcdef Ponteiros e String Com base na função StrCopyC abaixo você deverá construir um programa em C com duas variáveis chamadas frase1 e frase2 A variável frase1 deverá conter uma frase qualquer a qual será copiada para a variável frase2 utilizando a função abaixo 34 void StrCopyCchar destino char origem while origem destino origem origem destino destino 0