








Estude fácil! Tem muito documento disponível na Docsity
Ganhe pontos ajudando outros esrudantes ou compre um plano Premium
Prepare-se para as provas
Estude fácil! Tem muito documento disponível na Docsity
Prepare-se para as provas com trabalhos de outros alunos como você, aqui na Docsity
Os melhores documentos à venda: Trabalhos de alunos formados
Prepare-se com as videoaulas e exercícios resolvidos criados a partir da grade da sua Universidade
Responda perguntas de provas passadas e avalie sua preparação.
Ganhe pontos para baixar
Ganhe pontos ajudando outros esrudantes ou compre um plano Premium
Comunidade
Peça ajuda à comunidade e tire suas dúvidas relacionadas ao estudo
Descubra as melhores universidades em seu país de acordo com os usuários da Docsity
Guias grátis
Baixe gratuitamente nossos guias de estudo, métodos para diminuir a ansiedade, dicas de TCC preparadas pelos professores da Docsity
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
1 / 14
Esta página não é visível na pré-visualização
Não perca as partes importantes!
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.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)
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.