Docsity
Docsity

Prepare-se para as provas
Prepare-se para as provas

Estude fácil! Tem muito documento disponível na Docsity


Ganhe pontos para baixar
Ganhe pontos para baixar

Ganhe pontos ajudando outros esrudantes ou compre um plano Premium


Guias e Dicas
Guias e Dicas

Implementação e Análise de Funções Algorítmicas em Linguagem de Programação, Trabalhos de Engenharia Elétrica

Este relatório apresenta a implementação e análise de um conjunto de funções algorítmicas, desenvolvidas para resolver problemas relacionados à manipulação de números inteiros, vetores e matrizes. As funções abordam uma variedade de operações matemáticas, incluindo a inversão de números, verificação de propriedades numéricas (como números meliantes e legais), manipulação de matrizes, ordenação de vetores e outras análises relacionadas a dígitos e elementos de sequências. O relatório discute a eficiência dos algoritmos em termos de complexidade computacional, fornecendo uma visão crítica sobre a viabilidade e a aplicabilidade das abordagens adotadas para cada tipo de problema.

Tipologia: Trabalhos

2025

Compartilhado em 17/01/2025

luan-montserrat
luan-montserrat 🇧🇷

2 documentos

1 / 14

Toggle sidebar

Esta página não é visível na pré-visualização

Não perca as partes importantes!

bg1
1
CEFET-RJ — Centro Federal de Educação Tecnológica Celso
Suckow da Fonseca — Campus Nova Friburgo
Curso de Bacharelado em Engenharia Ele trica
— 2024.2
Implementação e Análise de Funções e Algoritmos
Luan Mont Serrat da Silva Mat.: 1912474GEEL
Professora: Josiele da
Silva Teixeira
pf3
pf4
pf5
pf8
pf9
pfa
pfd
pfe

Pré-visualização parcial do texto

Baixe Implementação e Análise de Funções Algorítmicas em Linguagem de Programação e outras Trabalhos em PDF para Engenharia Elétrica, somente na Docsity!

CEFET-RJ — Centro Federal de Educação Tecnológica Celso

Suckow da Fonseca — Campus Nova Friburgo

Curso de Bacharelado em Engenharia Ele trica

Implementação e Análise de Funções e Algoritmos

Luan Mont Serrat da Silva Mat.: 1912474GEEL

Professora: Josiele da

Silva Teixeira

Introdução: Este relatório apresenta a implementação e análise de um conjunto de funções algorítmicas, desenvolvidas para resolver problemas relacionados à manipulação de números inteiros, vetores e matrizes. As funções abordam uma variedade de operações matemáticas, incluindo a inversão de números, verificação de propriedades numéricas (como números meliantes e legais), manipulação de matrizes, ordenação de vetores e outras análises relacionadas a dígitos e elementos de sequências. As soluções propostas exploram conceitos fundamentais de programação, como a iteração, a recursão e a manipulação de dados estruturados. Além disso, o relatório discute a eficiência dos algoritmos em termos de complexidade computacional, fornecendo uma visão crítica sobre a viabilidade e a aplicabilidade das abordagens adotadas para cada tipo de problema. Este estudo tem como objetivo não apenas resolver os problemas propostos, mas também demonstrar a importância de uma análise cuidadosa da eficiência de cada algoritmo, além de ilustrar o uso de técnicas comuns de programação para lidar com dados numéricos e estruturados. As funções implementadas representam uma base para a construção de soluções mais complexas e podem ser expandidas para lidar com uma variedade maior de cenários computacionais. 2.1 Função para Inverter um Número Inteiro

Primeiro, o número fornecido é convertido para seu valor absoluto, o que permite lidar com números negativos sem problemas. A conversão de número para lista de dígitos é feita de maneira simples, extraindo os dígitos um por um através da operação de módulo (n_abs % 10 ) e reduzindo o número através da divisão inteira (n_abs // 10 ). Esse processo é repetido até que todos os dígitos sejam extraídos, resultando em uma lista de dígitos, mas na ordem inversa. Após a extração dos dígitos, a lista é invertida manualmente. Isso é feito criando-se uma nova lista, digitos_invertidos, e percorrendo a lista original de trás para frente, copiando cada elemento para a nova lista. Essa etapa é fundamental porque os dígitos foram extraídos da ordem inversa, e agora precisamos restaurá-los para a sequência correta. A verificação da sequência "171" é realizada de forma manual, verificando os três dígitos consecutivos na lista invertida. O código percorre a lista e, para cada posição, compara os três dígitos subsequentes com a sequência desejada. Se a sequência for encontrada, a função retorna uma mensagem indicando que o número é meliante; caso contrário, uma mensagem indicando que não é. 2.3 Verificação de Número Legal

A função lida com números negativos convertendo-os para seus valores absolutos, o que simplifica o processo sem a necessidade de tratamento específico para números negativos. A extração dos dígitos é feita manualmente, utilizando o operador de módulo (% 10 ) para acessar o último dígito do número e a divisão inteira (// 10 ) para remover esse dígito. Essa abordagem é uma maneira direta de acessar os dígitos sem recorrer à conversão do número para uma string, o que estaria em desacordo com a restrição de não usar funções prontas. O código também monitora a presença de dígitos pares e calcula a soma dos dígitos ao mesmo tempo. Em cada iteração, verifica-se se o dígito é par, e caso seja, a variável tem_digito_par é marcada como True. Além disso, a soma dos dígitos é acumulada. Ao final do processo, duas condições são avaliadas: se o número contém algum dígito par ou se a soma dos seus dígitos é ímpar. Se qualquer uma dessas condições for verdadeira, o número não é legal. Caso contrário, ele é considerado legal. 2.4 Função para Dividir os Dígitos por 2 A função começa lidando com números negativos, convertendo-os para seus valores absolutos. Isso permite que a lógica de manipulação dos dígitos se concentre apenas na parte numérica, sem a preocupação com o sinal. Após a divisão dos dígitos, o sinal negativo será reaplicado no final, caso o número original tenha sido negativo, o que garante que a função também lida corretamente com números negativos. A extração de cada dígito do número é realizada utilizando o operador de módulo (% 10 ) para pegar o último dígito e a divisão inteira (// 10 ) para descartar esse dígito após o processamento. O

2.6 Matriz e Diagonal Principal A função de leitura dos elementos da matriz foi implementada de forma bastante direta, utilizando dois laços for aninhado: o primeiro para percorrer as linhas e o segundo para preencher as colunas. A entrada do usuário é tratada de forma simples, com a conversão dos valores digitados em inteiros para serem armazenados na matriz. Isso mantém a solução simples e alinhada com a exigência de não usar funções prontas que facilitem a manipulação de listas ou outras estruturas de dados mais complexas. Após preencher a matriz, a função percorre os índices correspondentes à diagonal principal, onde o índice da linha e da coluna são iguais, e imprime os elementos encontrados. Isso é feito de forma eficiente, utilizando um único laço for para acessar os elementos da diagonal e imprimir cada um deles. A forma como os elementos são acessados (com matriz[i][i]) é direta e funciona corretamente para matrizes quadradas. 2.7 Soma dos Elementos de Cada Coluna

O código usa dois laços for aninhado para percorrer a matriz, o que é uma abordagem bastante direta para preencher as linhas e colunas. Em seguida, a soma dos elementos de cada coluna é calculada de forma manual. Para isso, é criada uma lista chamada soma colunas, com o mesmo número de elementos que o número de colunas, inicializada com zeros. O segundo laço percorre cada elemento da matriz, somando os valores nas posições adequadas da lista soma colunas. Essa abordagem respeita a exigência de não usar funções prontas, implementando toda a lógica manualmente. Ao final, o programa imprime as somas de cada coluna de maneira simples, o que facilita a compreensão e visualização dos resultados. O uso de listas para armazenar as somas e de laços for para percorrer os dados foi uma escolha prática e eficiente, considerando que o problema não exige a utilização de funções avançadas ou complexas.

2.8 Função para Ordenação de Vetor

2.10 Função Recursiva para Identificar Dígitos Iguais O primeiro dígito é armazenado logo na primeira chamada da função, o que é importante para a comparação com os dígitos subsequentes. A cada chamada recursiva, o número vai sendo reduzido ao remover o último dígito (com a operação n // 10 ), enquanto a comparação é feita entre o último dígito e o primeiro. Se em qualquer momento um dígito for diferente do primeiro, a função retorna False, indicando que os dígitos não são todos iguais. A função é simples, seguindo a lógica recursiva e respeitando o problema proposto. O uso do caso base if n == 0 é crucial, pois trata a condição de término da recursão quando todos os dígitos foram analisados. 2.11 Maior Elemento de um Vetor (Iterativo e Recursivo)

  • Versão sem recursividade : A função começa assumindo que o primeiro elemento do vetor é o maior. Em seguida, percorre o vetor a partir do segundo elemento e compara cada um com o valor armazenado em maior. Se encontrar um valor maior, o valor de maior é atualizado. O laço é executado até o final do vetor, e a função retorna o maior valor encontrado.
  • Versão com recursividade : A versão recursiva funciona de maneira semelhante, mas ao invés de um laço for, usa chamadas recursivas para percorrer os elementos do vetor. A função mantém o índice atual (indice) e o maior valor encontrado até o momento (maior). Quando o índice atinge o comprimento do vetor (caso base), a função retorna o maior valor. Durante cada chamada recursiva, a função verifica se o valor no índice atual é maior que o valor de maior e atualiza se necessário. 2.12 Contagem de Dígitos de um Número (Iterativo e Recursivo)
  • Versão sem recursividade : A função começa com um contador iniciado em 0. Enquanto o número for maior que 0, o último dígito é removido através da operação n // 10 , e o contador é incrementado. Isso continua até que o número se torne 0, e o contador finalmente armazenará a quantidade total de dígitos.
  • Versão com recursividade : A função recursiva usa a mesma ideia, mas em vez de um laço while, ela chama a si mesma. A cada chamada, o número é reduzido removendo o último dígito com n // 10 , e a função acumula o valor 1 para cada chamada recursiva, que representa um dígito. O caso base é quando o número chega a 0, indicando que não há mais dígitos a contar.

2.14 Bucket Sort O cálculo do índice de cada bucket é feito de maneira proporcional ao valor de cada elemento, considerando a diferença entre o valor máximo e mínimo do vetor. Isso garante que os elementos sejam distribuídos corretamente nos buckets. O uso do número de elementos do vetor para determinar o número de buckets também está alinhado com a prática comum no Bucket Sort, embora, em algumas situações, otimizações possam ser feitas dependendo da distribuição dos dados. A implementação utiliza uma estrutura de dados de lista para armazenar os buckets, o que é uma escolha razoável dado o Python e a simplicidade da implementação

Conclusão Os programas desenvolvidos ao longo das resoluçoes abordaram conceitos fundamentais de programaçao, como manipulaçao de numeros e strings, laços de repetiçao, recursao e algoritmos de ordenaçao, como Bubble Sort e Bucket Sort. O uso de recursao e tecnicas como divisao e conquista tambem foram explorados, reforçando o aprendizado sobre como dividir problemas grandes em subproblemas menores. Em geral, as soluçoes mostraram a importancia de entender os fundamentos para resolver desafios de programaçao de maneira mais analítica e pratica.