·
Ciência da Computação ·
Introdução à Lógica e Programação
Send your question to AI and receive an answer instantly
Recommended for you
69
Um Estudo Comparativo sobre Uso de Modelos de Dados para Notas Fiscais Eletrônicas
Introdução à Lógica e Programação
UFPB
27
Introdução aos Arquivos em Linguagem C
Introdução à Lógica e Programação
UFPB
23
Estruturas, Uniões e Enumerações em Linguagem C - Introdução à Programação
Introdução à Lógica e Programação
UFPB
19
Introdução à Programação em C: Strings e Vetores de Caracteres
Introdução à Lógica e Programação
UFPB
13
Citus Distributed PostgreSQL for Data-Intensive Applications
Introdução à Lógica e Programação
UFPB
1
Verificação de Sorteio para Visto de Estágio
Introdução à Lógica e Programação
UFAL
18
Conceitos sobre Vetores em Programação
Introdução à Lógica e Programação
UFAL
35
Introdução a Ponteiros e Arrays em C
Introdução à Lógica e Programação
UFAL
10
Introdução às Strings em C++
Introdução à Lógica e Programação
UFAL
7
Implementação de Busca Binária e Funções de Ordenação em C++
Introdução à Lógica e Programação
UFAL
Preview text
Linguagem C Ponteiros Recursividade A função main Introdução à Programação 20221 Profa Giorgia de Oliveira Mattos giorgiamattosgmailcom Linguagem C Ponteiros Introdução à Programação 20221 Profa Giorgia de Oliveira Mattos giorgiamattosgmailcom Ponteiros Qualquer variável em um programa em C possui um endereço em memória que indica o local onde a mesma é armazenada na memória Frequentemente é necessário utilizar o endereço da variável em vez do seu próprio valor por exemplo na função scanf O endereço de uma variável é determinado por meio da utilização do operador de endereço int x x resulta no endereço atribuído em memória à variável x Não é permitido modificar o endereço de uma variável por meio da atribuição x 5000 INVÁLIDO Ponteiros Ponteiro ou apontador é um tipo especial de variável capaz de conter um endereço em memória Um ponteiro que contém um endereço em memória válido é dito apontador para tal endereço Um ponteiro pode apontar para qualquer tipo armazenado em memória int float char struct Declaração tipoapontado variávelponteiro Exemplo int ptrInt variável ptrInt é um ponteiro capaz de apontar para uma posição de memória que contenha uma variável do tipo int Ponteiros Variáveis do tipo ponteiro podem ser inicializadas da mesma forma que outros tipos de variáveis int meuInt int ptrInt meuInt Endereços e ponteiros podem ser impressos na saída padrão utilizando o printf com o formato p Ponteiros Podese acessar o conteúdo da memória apontada por uma variável do tipo ponteiro através da indireção do ponteiro A indireção de um ponteiro resulta no valor contido na posição de memória para onde o ponteiro aponta Para acessar conteúdo é preciso usar o operador de indireção float meuF 314 float ptrF meuF O valor conteúdo de ptrF é 314 enquanto o valor de ptrF é o endereço atribuído à variável meuF Ponteiros Podese atribuir um valor ao conteúdo da posição de memória apontada por um ponteiro usando o operador de indireção ptrF 16 Atribui 16 ao conteúdo da posição de memória apontada por prtF Importante observar que isso é equivalente a modificar o conteúdo da variável meuF Equivalente a meuF 16 Atenção não confunda A linguagem C utiliza o mesmo símbolo para declaração de ponteiros e indireção float ptrF meuF declaração do ponteiro ptrF 16 atribuição do valor 16 ao conteúdo da memória Ponteiros Um ponteiro nulo é um ponteiro que não aponta para nenhum endereço válido um ponteiro tornase nulo quando recebe o valor inteiro 0 char p p 0 Tornase um ponteiro nulo A utilização de macros pode tornar expressões de atribuição e comparação envolvendo ponteiros nulos mais legíveis define NULL 0 padrão ISO 0 é um valor inteiro compatível com qualquer ponteiro define NULL void 0 compiladores mais antigos Ponteiros NULL é definida no arquivo stdlibh e o programador não precisa se preocupar em definila Quando um ponteiro recebe o valor 0 ele não está recebendo um endereço com este valor mas sim um valor que depende de implementação o SO sempre reconhece este endereço como inválido e aborta o programa O ponteiro nulo é utilizado para indicar que no ponto do programa onde o ponteiro é nulo não existe nenhum valor válido para lhe atribuir Ponteiros e Structs typedef struct char nome50 short dia mes ano tRegistro tPtrRegistro tRegistro registroPessoa Fulano de Tal 19 12 1963 tPtrRegistro ptrRegistro registroPessoa Campo registroPessoa ptrRegistro nome registroPessoanome ptrRegistronome dia registroPessoadia ptrRegistrodia mes registroPessoames ptrRegistromes ano registroPessoaano ptrRegistroano ptrRegistroano é o mesmo que ptrRegistroano registroPessoaano 1966 é equivalente a ptrRegistroano 1966 O ponteiro ptrRegistro foi iniciado com o endereço da variável registroPessoa Cada campo da variável registroPessoa pode ser acessado de duas maneiras Linguagem C Recursividade Introdução à Programação 20221 Profa Giorgia de Oliveira Mattos giorgiamattosgmailcom Funções Recursivas Funções recursivas são funções que chamam direta ou indiretamente a sim mesmas Uma função recursiva deve conter pelo menos duas partes casos a saber Caso nãorecursivo estabelece uma condição de parada da recursão e sem o qual a recursão será infinita Esta parte da definição da função não deve fazer referência à própria função Caso recursivo a função chama a si mesma O programador deve garantir que uma das chamadas recursivas atinja eventualmente a condição de parada A função recursiva pode ter mais de um caso recursivo e mais de uma condição de parada Funções Recursivas Exemplo Função que calcula a soma dos inteiros compreendidos entre 1 e n int somaAteN int n if n 1 return n caso nãorecursivo else return n somaAteN n1 caso recursivo Somar os números de 1 a 5 ou seja n5 somaAteN 5 5 somaAteN 4 4 somaAteN 3 3 somaAteN 2 2 somaAteN 1 Funções Recursivas somaAteN 5 5 somaAteN 4 4 somaAteN 3 3 somaAteN 2 2 somaAteN 1 1 3 6 15 10 Quando a função encontra a condição de parada a função retorna 1 Com este valor é possível voltar sucessivamente ao passo anterior até que a chamada original seja atingida A cada chamada da função o valor do argumento n é cada vez menor a condição de parada será atingida A função produz resultados indesejáveis se o valor de n 1 int somaAteN int n if n 1 printf ERRO Numeros menores do que 1 não são aceitos return 0 else if n 1 return n caso nãorecursivo else return n somaAteN n1 caso recursivo Funções Recursivas Exemplo Calcular o fatorial de um número n qualquer Definição n n n1 Se n0 n 1 Este é o caso base se o valor de n 0 sabese que o resultado é 1 Se n0 n n n1 Este é o caso recursivo será chamado n vezes até que o problema seja reduzido ao caso base int fatorial int n if n 0 return 1 else return n fatorial n1 Exemplo fatorial 4 Chamada 1 4 fatorial 3 Chamada 2 4 3 fatorial 2 Chamada 3 4 3 2 fatorial 1 Chamada 4 4 3 2 1 fatorial 0 Chamada 5 4 3 2 1 1 Resultado retornado 24 Linguagem C A função main Introdução à Programação 20221 Profa Giorgia de Oliveira Mattos giorgiamattosgmailcom A função main A função main pode ter parâmetros formais mas o programador não pode escolher quais serão eles A declaração mais completa que se pode ter para a função main é int main int argc char argv Os parâmetros argc e argv dão ao programador acesso à linha de comando com a qual o programa é chamado A função main O argc argument count é um inteiro e possui o número de argumentos com os quais a função main foi chamada na linha de comando Ele é no mínimo 1 pois o nome do programa é contado como sendo o primeiro argumento O argv argument values é um ponteiro para um vetor de strings Cada string deste vetor é um dos parâmetros da linha de comando O argv0 sempre aponta para o nome do programa considerado o primeiro argumento É para saber quantos elementos temos em argv que temos argc A função main Exemplo Escreva um programa que faça uso dos parâmetros argv e argc O programa deverá receber da linha de comando o dia o mês e o ano correntes Mostrar a data em formato apropriado Supondo que o programa executável se chame dataexe data 17 11 22 O programa deverá mostrar 17 de Novembro de 2022 Argc 4 Argv 0 1 2 3 data 17 11 22 A função main include stdioh include stdlibh int main int argc char argv int mes char meses Janeiro Fevereiro Março Abril Maio Junho Julho Agosto Setembro Outubro Novembro Dezembro if argc 4 Testa se o numero de parâmetros fornecidos está correto nome do programa o dia o mês e os dois últimos dígitos do ano mes atoi argv2 argv contêm strings A string referente ao mês deve ser transformada em um numero inteiro A função atoi faz a conversão recebe a string e transforma no inteiro equivalente if mes 1 mes 12 Testa se o mês é valido printf Erro Mês inválido else printf s de s de 20s argv1 mesesmes1 argv3 else printf Erro Formato Inválido Uso data dia mes ano inteiros return 0 A função main Como usar os parâmetros da função main Criar o arquivo com o seu programa e dar um nome para o arquivo por exemplo datac Compilar o seu programa são gerados 2 arquivos o e exe Usar o Prompt de comando ou cmdterminal e chamar o seu arquivo exe passando como parâmetros de execução as informações correspondentes ao argc e argv Veja o exemplo A função main CGIORGIAIPdir O volume na unidade C é OS O Número de Série do Volume é 12D7C2BA Pasta de CGIORGIAIP 16112022 1829 DIR 16112022 1829 DIR 16112022 1825 1003 datac 16112022 1829 28104 dataexe 16112022 1828 1196 datao 3 arquivos 30303 bytes 2 pastas 787837677568 bytes disponíveis CGIORGIAIP CGIORGIAIPdata 17 11 22 17 de Novembro de 2022 Erro Mes invalido CGIORGIAIPdata 17 20 22 Erro Formato Invalido Uso data dia mes ano inteiros CGIORGIAIP Exercícios práticos Recursividade e função main 1 Faça um programa que usando os parâmetros argc e argv e funções recursivas receba um vetores A10 calcule e mostre o vetor B10 O vetor B deve conter o fatorial de cada elemento de A A 4 1 0 3 B 24 1 1 6 2 A operação de potenciação pode ser representada por xy Faça uma função recursiva que execute esta operação recebendo dois números inteiro positivos a base x e o expoente y Use a definição x elevado a potência y é igual a x elevado a potencia y1 vezes x 3 Escreva uma função que recursiva que identifique e retorne o maior elemento de um vetor de inteiros 4 Faça uma função recursiva que retorne a soma de todos os elementos de um vetor de float 5 Escreva uma função recursiva que inverte uma frase 6 Escreva uma função recursiva que reca o número do termo de uma sequência de Fibonacci e retorne o seu valor Por exemplo se o argumento for 7 a função retornará 13 Use a definição Os dois primeiros termos da sequência tem valor igual a 1 cada um dos próximos termos vale a soma dos dois anteriores
Send your question to AI and receive an answer instantly
Recommended for you
69
Um Estudo Comparativo sobre Uso de Modelos de Dados para Notas Fiscais Eletrônicas
Introdução à Lógica e Programação
UFPB
27
Introdução aos Arquivos em Linguagem C
Introdução à Lógica e Programação
UFPB
23
Estruturas, Uniões e Enumerações em Linguagem C - Introdução à Programação
Introdução à Lógica e Programação
UFPB
19
Introdução à Programação em C: Strings e Vetores de Caracteres
Introdução à Lógica e Programação
UFPB
13
Citus Distributed PostgreSQL for Data-Intensive Applications
Introdução à Lógica e Programação
UFPB
1
Verificação de Sorteio para Visto de Estágio
Introdução à Lógica e Programação
UFAL
18
Conceitos sobre Vetores em Programação
Introdução à Lógica e Programação
UFAL
35
Introdução a Ponteiros e Arrays em C
Introdução à Lógica e Programação
UFAL
10
Introdução às Strings em C++
Introdução à Lógica e Programação
UFAL
7
Implementação de Busca Binária e Funções de Ordenação em C++
Introdução à Lógica e Programação
UFAL
Preview text
Linguagem C Ponteiros Recursividade A função main Introdução à Programação 20221 Profa Giorgia de Oliveira Mattos giorgiamattosgmailcom Linguagem C Ponteiros Introdução à Programação 20221 Profa Giorgia de Oliveira Mattos giorgiamattosgmailcom Ponteiros Qualquer variável em um programa em C possui um endereço em memória que indica o local onde a mesma é armazenada na memória Frequentemente é necessário utilizar o endereço da variável em vez do seu próprio valor por exemplo na função scanf O endereço de uma variável é determinado por meio da utilização do operador de endereço int x x resulta no endereço atribuído em memória à variável x Não é permitido modificar o endereço de uma variável por meio da atribuição x 5000 INVÁLIDO Ponteiros Ponteiro ou apontador é um tipo especial de variável capaz de conter um endereço em memória Um ponteiro que contém um endereço em memória válido é dito apontador para tal endereço Um ponteiro pode apontar para qualquer tipo armazenado em memória int float char struct Declaração tipoapontado variávelponteiro Exemplo int ptrInt variável ptrInt é um ponteiro capaz de apontar para uma posição de memória que contenha uma variável do tipo int Ponteiros Variáveis do tipo ponteiro podem ser inicializadas da mesma forma que outros tipos de variáveis int meuInt int ptrInt meuInt Endereços e ponteiros podem ser impressos na saída padrão utilizando o printf com o formato p Ponteiros Podese acessar o conteúdo da memória apontada por uma variável do tipo ponteiro através da indireção do ponteiro A indireção de um ponteiro resulta no valor contido na posição de memória para onde o ponteiro aponta Para acessar conteúdo é preciso usar o operador de indireção float meuF 314 float ptrF meuF O valor conteúdo de ptrF é 314 enquanto o valor de ptrF é o endereço atribuído à variável meuF Ponteiros Podese atribuir um valor ao conteúdo da posição de memória apontada por um ponteiro usando o operador de indireção ptrF 16 Atribui 16 ao conteúdo da posição de memória apontada por prtF Importante observar que isso é equivalente a modificar o conteúdo da variável meuF Equivalente a meuF 16 Atenção não confunda A linguagem C utiliza o mesmo símbolo para declaração de ponteiros e indireção float ptrF meuF declaração do ponteiro ptrF 16 atribuição do valor 16 ao conteúdo da memória Ponteiros Um ponteiro nulo é um ponteiro que não aponta para nenhum endereço válido um ponteiro tornase nulo quando recebe o valor inteiro 0 char p p 0 Tornase um ponteiro nulo A utilização de macros pode tornar expressões de atribuição e comparação envolvendo ponteiros nulos mais legíveis define NULL 0 padrão ISO 0 é um valor inteiro compatível com qualquer ponteiro define NULL void 0 compiladores mais antigos Ponteiros NULL é definida no arquivo stdlibh e o programador não precisa se preocupar em definila Quando um ponteiro recebe o valor 0 ele não está recebendo um endereço com este valor mas sim um valor que depende de implementação o SO sempre reconhece este endereço como inválido e aborta o programa O ponteiro nulo é utilizado para indicar que no ponto do programa onde o ponteiro é nulo não existe nenhum valor válido para lhe atribuir Ponteiros e Structs typedef struct char nome50 short dia mes ano tRegistro tPtrRegistro tRegistro registroPessoa Fulano de Tal 19 12 1963 tPtrRegistro ptrRegistro registroPessoa Campo registroPessoa ptrRegistro nome registroPessoanome ptrRegistronome dia registroPessoadia ptrRegistrodia mes registroPessoames ptrRegistromes ano registroPessoaano ptrRegistroano ptrRegistroano é o mesmo que ptrRegistroano registroPessoaano 1966 é equivalente a ptrRegistroano 1966 O ponteiro ptrRegistro foi iniciado com o endereço da variável registroPessoa Cada campo da variável registroPessoa pode ser acessado de duas maneiras Linguagem C Recursividade Introdução à Programação 20221 Profa Giorgia de Oliveira Mattos giorgiamattosgmailcom Funções Recursivas Funções recursivas são funções que chamam direta ou indiretamente a sim mesmas Uma função recursiva deve conter pelo menos duas partes casos a saber Caso nãorecursivo estabelece uma condição de parada da recursão e sem o qual a recursão será infinita Esta parte da definição da função não deve fazer referência à própria função Caso recursivo a função chama a si mesma O programador deve garantir que uma das chamadas recursivas atinja eventualmente a condição de parada A função recursiva pode ter mais de um caso recursivo e mais de uma condição de parada Funções Recursivas Exemplo Função que calcula a soma dos inteiros compreendidos entre 1 e n int somaAteN int n if n 1 return n caso nãorecursivo else return n somaAteN n1 caso recursivo Somar os números de 1 a 5 ou seja n5 somaAteN 5 5 somaAteN 4 4 somaAteN 3 3 somaAteN 2 2 somaAteN 1 Funções Recursivas somaAteN 5 5 somaAteN 4 4 somaAteN 3 3 somaAteN 2 2 somaAteN 1 1 3 6 15 10 Quando a função encontra a condição de parada a função retorna 1 Com este valor é possível voltar sucessivamente ao passo anterior até que a chamada original seja atingida A cada chamada da função o valor do argumento n é cada vez menor a condição de parada será atingida A função produz resultados indesejáveis se o valor de n 1 int somaAteN int n if n 1 printf ERRO Numeros menores do que 1 não são aceitos return 0 else if n 1 return n caso nãorecursivo else return n somaAteN n1 caso recursivo Funções Recursivas Exemplo Calcular o fatorial de um número n qualquer Definição n n n1 Se n0 n 1 Este é o caso base se o valor de n 0 sabese que o resultado é 1 Se n0 n n n1 Este é o caso recursivo será chamado n vezes até que o problema seja reduzido ao caso base int fatorial int n if n 0 return 1 else return n fatorial n1 Exemplo fatorial 4 Chamada 1 4 fatorial 3 Chamada 2 4 3 fatorial 2 Chamada 3 4 3 2 fatorial 1 Chamada 4 4 3 2 1 fatorial 0 Chamada 5 4 3 2 1 1 Resultado retornado 24 Linguagem C A função main Introdução à Programação 20221 Profa Giorgia de Oliveira Mattos giorgiamattosgmailcom A função main A função main pode ter parâmetros formais mas o programador não pode escolher quais serão eles A declaração mais completa que se pode ter para a função main é int main int argc char argv Os parâmetros argc e argv dão ao programador acesso à linha de comando com a qual o programa é chamado A função main O argc argument count é um inteiro e possui o número de argumentos com os quais a função main foi chamada na linha de comando Ele é no mínimo 1 pois o nome do programa é contado como sendo o primeiro argumento O argv argument values é um ponteiro para um vetor de strings Cada string deste vetor é um dos parâmetros da linha de comando O argv0 sempre aponta para o nome do programa considerado o primeiro argumento É para saber quantos elementos temos em argv que temos argc A função main Exemplo Escreva um programa que faça uso dos parâmetros argv e argc O programa deverá receber da linha de comando o dia o mês e o ano correntes Mostrar a data em formato apropriado Supondo que o programa executável se chame dataexe data 17 11 22 O programa deverá mostrar 17 de Novembro de 2022 Argc 4 Argv 0 1 2 3 data 17 11 22 A função main include stdioh include stdlibh int main int argc char argv int mes char meses Janeiro Fevereiro Março Abril Maio Junho Julho Agosto Setembro Outubro Novembro Dezembro if argc 4 Testa se o numero de parâmetros fornecidos está correto nome do programa o dia o mês e os dois últimos dígitos do ano mes atoi argv2 argv contêm strings A string referente ao mês deve ser transformada em um numero inteiro A função atoi faz a conversão recebe a string e transforma no inteiro equivalente if mes 1 mes 12 Testa se o mês é valido printf Erro Mês inválido else printf s de s de 20s argv1 mesesmes1 argv3 else printf Erro Formato Inválido Uso data dia mes ano inteiros return 0 A função main Como usar os parâmetros da função main Criar o arquivo com o seu programa e dar um nome para o arquivo por exemplo datac Compilar o seu programa são gerados 2 arquivos o e exe Usar o Prompt de comando ou cmdterminal e chamar o seu arquivo exe passando como parâmetros de execução as informações correspondentes ao argc e argv Veja o exemplo A função main CGIORGIAIPdir O volume na unidade C é OS O Número de Série do Volume é 12D7C2BA Pasta de CGIORGIAIP 16112022 1829 DIR 16112022 1829 DIR 16112022 1825 1003 datac 16112022 1829 28104 dataexe 16112022 1828 1196 datao 3 arquivos 30303 bytes 2 pastas 787837677568 bytes disponíveis CGIORGIAIP CGIORGIAIPdata 17 11 22 17 de Novembro de 2022 Erro Mes invalido CGIORGIAIPdata 17 20 22 Erro Formato Invalido Uso data dia mes ano inteiros CGIORGIAIP Exercícios práticos Recursividade e função main 1 Faça um programa que usando os parâmetros argc e argv e funções recursivas receba um vetores A10 calcule e mostre o vetor B10 O vetor B deve conter o fatorial de cada elemento de A A 4 1 0 3 B 24 1 1 6 2 A operação de potenciação pode ser representada por xy Faça uma função recursiva que execute esta operação recebendo dois números inteiro positivos a base x e o expoente y Use a definição x elevado a potência y é igual a x elevado a potencia y1 vezes x 3 Escreva uma função que recursiva que identifique e retorne o maior elemento de um vetor de inteiros 4 Faça uma função recursiva que retorne a soma de todos os elementos de um vetor de float 5 Escreva uma função recursiva que inverte uma frase 6 Escreva uma função recursiva que reca o número do termo de uma sequência de Fibonacci e retorne o seu valor Por exemplo se o argumento for 7 a função retornará 13 Use a definição Os dois primeiros termos da sequência tem valor igual a 1 cada um dos próximos termos vale a soma dos dois anteriores