sábado, 30 de novembro de 2013

Gerador de Matrizes

Boa noite pessoal!

Vamos começar então a série de postagens de implementação de algoritmos!

Hoje, para iniciar a série vou deixar aqui pra vocês um script que gera matrizes.


Uma grande parte do algoritmos que vamos ver nos próximos artigos trabalham em cima de dados matriciais, então é a partir das matrizes que começaremos.

O Script que apresento a seguir nos possibilita criar matrizes com dados aleatórios, digitar os valores linha a linha, ou digitar já a matriz inteira. Esta matriz será salva como um arquivo texto formatado de forma que cada linha da matriz ocupe uma linha do arquivo e os elementos da matriz serão separados por espaços.

#!/usr/bin/env python
# -*- coding:utf8 -*-
'''
Created on 27/11/2013

@author: julio
'''
from os import system
from random import randrange
import random
import string


menu_dict = {
    1:'criar_matriz_aleatoria()',
    2:'criar_matriz_linha()',
    3:'ler_matriz()',
    0:'sair()'
}

menu_str = '''Gerador de Matrizez

Escolha a opção desejada:

1 - Criar uma matriz com dados aleatórios
2 - Criar uma matriz digitada linha a linha
3 - Criar uma matriz digitada inteiramente
0 - Sair
>> '''

def cls():
    x = system('clear')
    if x!=0:
        system('cls')
    
def gerar_matriz(linhas, colunas, a, b):
    return [[randrange(a, b) for i in xrange(colunas)] for j in xrange(linhas)] 

def recebe_num_colunas():
    while True:
        try:
            return input('Insira o número de colunas')
        except:
            print('\nO valor digitado não é um número válido\n\n')

def recebe_num_linhas():
    while True:
        try:
            return input('Insira o número de linhas')
        except:
            print('\nO valor digitado não é um número válido\n\n')

def ler_linhas():
    print(
'''Insira os dados da matriz linha a linha
Digite os valores separados por espaços
Pra finalizar, digite somente ENTER''')
    matriz = []
    while True:
        linha = raw_input('>>')
        try:
            linha = [eval(x) for x in linha.strip().split()]
        except:
            print('\nOs dados não foram digitados da forma correta.'+
                  ' Insira a linha novamente\n\n')
            continue
        if len(linha)==0:
            return matriz
        matriz.append(linha)

def ler_numero_linhas():
    while True:
        try:
            return input('Insira o número de linhas da matriz\n>> ')
        except:
            print('\nO número digitado não é válido. Tente novamente\n\n')
            
def ler_numero_colunas():
    while True:
        try:
            return input('Insira o número de colunas da matriz\n>> ')
        except:
            print('\nO número digitado não é válido. Tente novamente\n\n')

def ler_range_de_valores():
    while True:
        string = raw_input(
'''Insira o intervalo de valores para os elementos da matriz
Use a forma (a, b)
>> ''')
        try:
            return eval(string)
        except:
            print('\nOs valores não foram digitados no padrão correto.'+
                  ' Tente novamente\n\n')

def ler_matriz():
    matriz = None
    while True:
        try:
            matriz = eval(raw_input('Digite os dados da matriz na forma'+
                        ' [[a1, a2,...,an],[b1,b2,...,bn],...,[m1,m2,...,mn]]')) 
        except:
            print('\nA matriz não foi digitada da forma correta\n\n')
            
    salvar_matriz(matriz)
    
def gera_caractere_aleatoria():
    return random.choice(string.ascii_uppercase + string.digits)
            
def salvar_matriz(matriz):
    nome_mat = 'matriz'+''.join(
                        gera_caractere_aleatoria() for x in range(5))+'.dat'
    f = open(nome_mat,'w')
    mat = ''
    for i in xrange(len(matriz)):
        for j in xrange(len(matriz[0])):
            mat += str(matriz[i][j])+' '
        mat+='\n'
    f.write(mat)
    f.close()

def criar_matriz_aleatoria():
    a, b = ler_range_de_valores()
    
    linhas = ler_numero_linhas()
    colunas = ler_numero_colunas()
    
    matriz =  gerar_matriz(linhas, colunas, a, b)
    salvar_matriz(matriz)

def criar_matriz_linha():
    matriz = ler_linhas()
    salvar_matriz(matriz)

def sair():
    exit(0)
    
def mostra_menu():
    while True:
        opcao = -1
        try:
            opcao = input(menu_str)
        except:
            cls()
            print('\nA opção digitada não é um número válido\n\n')
            continue
        try:
            eval(menu_dict[opcao])
        except Exception as e:
            cls()
            print('\nA opção digitada não é uma opção válida\n\n')


if __name__ == '__main__':
    mostra_menu()

Procurei criar o script da forma mais intuitiva possível, espero que possam entendê-lo facilmente!

Qualquer dúvida, fiquem à vontade para comentar, guardem este script para os próximos posts, e até a próima!

Abraços!

Nenhum comentário:

Postar um comentário