Informática, perguntado por dragonoath69, 8 meses atrás

(Python). Faça um programa, usando funções, que leia da entrada padrão o nome de um arquivo texto, contendo matriz bidimensional de números inteiros. Suponha que cada linha do arquivo contenha todos os números de uma linha da matriz, separados por espaços em branco. Leia o arquivo e escreva na saída padrão qual(is) é(são) a(s) linha(s) que possuem apenas números primos. Escreva também qual(is) é(são) a(s) linha(s) que possuem apenas números primos

Soluções para a tarefa

Respondido por GeBEfte
1

Como é pedida a utilização de funções, vamos focar em deixar o programa principal mais "limpo" possível.

As funções podem estar dispostas no mesmo arquivo (no cabeçalho), em um arquivo separado (módulo ou pacote). Por simplicidade, deixei tudo no mesmo arquivo.

Ainda, é importante destacar que o programa não conta com uma validação da matriz, logo, se for disponibilizada um arquivo contendo, por exemplo, linhas com diferentes quantidades de elementos, o programa irá rodar, mas sem garantia de apresentar os resultados esperados.

Da mesma forma, o programa não apresenta um tratamento de erros/exceções, logo, se for disponibilizado, por exemplo, um arquivo com dados não Inteiros, o programa será paralisado.

----------------------------------------------------------------------------------------------------

def numPrimo(num):

.....ac=0

.....for c in range(1,num+1):

..........if num%c==0:

...............ac+=1

.....return True if ac==2 else False

def retornaMatriz():

.....global f

.....nome=str(input('Nome do arquivo: ')).strip()

.....f=open(nome,"r")

.....matriz=list()

.....linhas=f.readlines()

.....for c in linhas:

..........matriz.append(c.split())

.....return matriz

 

def linhaPrimos(lst):

.....for c,v in enumerate(lst):

..........test=True

..........for i in v:

...............test&=numPrimo(int(i))

..........if test==True:  

...............print(f'A \033[31m{c+1}ª linha\033[m possui todos elementos primos\n')

def colunaPrimos(lst):

.....for i in range(0,len(lst[0])):

..........test=True

..........for c in lst:

...............test&=numPrimo(int(c[i]))

..........if test==True:

...............print(f'A \033[31m{i+1}ª coluna\033[m possui todos elementos primos\n')

#Programa principal

matriz=retornaMatriz()

linhaPrimos(matriz)

colunaPrimos(matriz)

f.close()

----------------------------------------------------------------------------------------------------

Comentários:

--> Vamos começar entendendo o programa principal, note como ficou compacto.

Iniciamos guardando na variável matriz a lista retornada pela função retornaMatriz().

Depois, chamamos duas funções linhaPrimos() e colunaPrimos() que recebem como parâmetro a matriz guardada na variável de mesmo nome e  mostram na tela quais são as linhas e colunas que apresentam apenas números primos.

No final, fechamos o arquivo.

--> A função numPrimo() recebe um numero e retorna True, caso seja primo, ou False, caso não seja primo.

Fazemos isso com um laço for, verificando o resto da divisão do numero avaliado por todo numero inteiro menor ou igual a ele. Quando achamos um divisor, o acumulador "ac" é incrementado.

Caso "ac" seja igual a 2 (divisores) no final do laço, o numero avaliado é dado como primo (retorno True).

--> Na função retornaMatriz(), declaramos a variável "f" como global para podermos fechar o arquivo posteriormente fora da função.

A função recebe do usuário o nome do arquivo contendo a matriz, e abre o arquivo (função open), sendo "f" o nome utilizado para o arquivo-objeto.

Declaramos a variável "matriz" como uma lista (a matriz será uma lista composta de outras listas).

Guardamos na variável "linhas" todo conteúdo do arquivo (método readlines), note que o método retorna uma lista com todas linhas do aquivo.

Utilizando um laço for, cada linha guardada em "linhas" será adicionada a lista "matriz" (metodo append).

É importante perceber também que, ao adicionar na matriz, utilizamos o método split() na linha para que seja "quebrada".

Assim, em cada linha, temos os números devidamente separados, ou seja, a variável matriz contém uma lista, nesta lista temos todas linhas como sublistas ex.: [ [1,2,3] , [4,5,6] , [7,8,9] ].

--> Seguindo, temos a função linhaPrimos(), esta função irá receber uma matriz em forma de lista e dirá ao usuário (print) quais linhas possuem apenas números primos.

Aqui, a variável booleana test irá dizer se a linha é ou não composta apenas por números primos.

Utilizamos dois laços for para percorrer os as linhas "v" da lista (matriz) e as colunas "i" de cada linha "v".

Para cada numero da linha, verificamos se é primo utilizando a função numPrimo(). A variável test é "atualizada" com auxilio da operação AND, assim "test" só terá valor True se todos números forem primos.

Se a linha satisfazer os critérios, indicamos ao usuário com um print o índice da linha.

--> A função colunaPrimo() é semelhante a anterior, no entanto foi imposto aqui que o numero de colunas da matriz será igual ao numero de colunas da primeira linha.

Lembrando que, caso a matriz esteja com linhas incompletas, o programa não apresenta, necessariamente, os resultados esperados.

Assim, a função percorre as colunas "i" e as linhas "c" da lista (matriz).

Da mesma forma, "test" só terá valor True se todos elementos da coluna forem primos.

Anexos:
Perguntas interessantes