Problema contador python

Iniciado por runas3, 30 Mayo 2017, 15:01 PM

0 Miembros y 1 Visitante están viendo este tema.

runas3

Hola a todos,os explico el problema que tengo.
Estoy haciendo un ejercicio, que es crear una matriz i hacer un triangulo con x, en eso no hay problema, solo que el usuario tiene que entrar un numero inicial y hay un contador que va sumando los números, pero cuando hay una x el contador no lo hace bien por ejemplo habría 13, x, 15 y así no, tendría que ser 13 x 14.
Es como el contador sigue funcionando onde hay x pero quiero que vaya al siguiente parámetro y no cuente la x pero no encuentro la manera de hacerlo.
Haber si me podéis dar alguna pista o ayudarme gracias.

def omple_simplista(xifra,num_files) :
    matriu_inicial=[['' for i in range(num_files)] for i in range(num_files)]
    contador=0
    for a in range(num_files):
        for b in range(num_files):
            matriu_inicial[a][b]=int(xifra+contador)
            contador=contador+1
    return matriu_inicial

num_files = int(input(" quantes files "))
xifra= int(input(" primer element "))

matriu=[]
matriu=omple_simplista(xifra,num_files)

numero_columna_inicial=num_files//2-1
numero_columna_final=num_files//2+1

for d in matriu:
    matriu[num_files//2][num_files//2]="x"
   
for q in range (num_files//2+1,num_files,1):
    for w in range (numero_columna_inicial,numero_columna_final+1,1):
        matriu[q][w]="x"
    numero_columna_inicial=numero_columna_inicial-1
    numero_columna_final=numero_columna_final+1

for a in matriu:
    print(a)

Pongo link de la imagen(ejecución programa) que no me deja poner la imagen sola,
https://ibb.co/kbf1na

animanegra

A ver si entiendo tu problema, tu problema es que te pueden meter como parámetros cosas que no sean números y quieres saltártelos ¿no?

Tienes una función de las strings llamada isdigit() que devuelve true o false en caso de que sea o no un numero, simplemente comprueba el argumento que te están pasando y hasta que no sea un numero (osea que la función isdifit te diga true) lee el siguiente parámetro.

42
No contesto mensajes por privado, si tienes alguna pregunta, consulta o petición plantéala en el foro para que se aproveche toda la comunidad.

runas3

El usuario lo único que puedo poner son números pone el numero de filas y columnas, de la matriz y luego el numero inicial con el que empieza.
Básicamente la matriz esta llena de números y luego lo que yo hago es poner x haciendo un triangulo con fors,  pero al poner las x el contador no funciona correctamente.
Si te fijas en la imagen que he puesto veras que esta el numero 13 x y luego 15 pues lo que quiero es que sea 14 y con los otros que siga el contador correctamente.

He intentado poner este if pero no he conseguido que funcione.
if matriu_inicial[num_files//2][num_files//2]=="x":
                contador=contador
            else:
                contador=contador+1


Con esto he intentado decir que cuando encuentre una x en esta posición de la matriz que contador sea igual al anterior.

animanegra

a ver, si quieres que el contador sea igual an anterior. Simplemente no lo cambies y asi no pierdes el tiempo con instrucciones inutiles.
La idea del programa es mostrar un triangulo de X en pantalla. ¿Para que utilizas una matriz?
Usas cosas un tanto, complicadas viendo que lo que estas haciendo es empezar en el tema de programacion.
Simplifica tu problema, porque lo estas enfocando realmente mal.
1 necesitas un contador que cuente la altura que tendra tu triangulo, se llama altura y empezará en un tamaño dado por el usario y terminara en 0.
pinta una X por cada valor de la altura cada una en una linea diferente.

2 ahora planteate el problema de ¿que tengo que hacer en cada altura? Que será dibujar el ancho, empieza en lugar de dibujar un triangulo dibujando un cuadrado. Con lo que el problema se reduce a dibujar X seguidas en la misma linea. un numero ancho de veces.

3 Una vez que tienes eso modifica el programa para que en cada altura quites uno a la anchura que dibujas generando asi un triangulo.

Si lo tienes que meter en una matriz por exigencias del ejercicio, genera una matriz al principio y haz el mismo proceso que pintando en pantalla, usando los mismos indices de altura y anchura pero salvando el la X tambien en la matriz.

42
No contesto mensajes por privado, si tienes alguna pregunta, consulta o petición plantéala en el foro para que se aproveche toda la comunidad.

runas3

Estoy obligado a ponerlo en la matriz, y realmente el único problema que tengo es con el contador lo del triangulo sino me equivoco esta bien, lo siento seguramente lo he explicado mal.

Voy a poner el enunciado de lo que estoy haciendo

Ex1.Una matriz es simplista si es una matriz cuadrada de nxn (n es non) y cada elemento de la matriz es igual al elemento anterior incrementado en 1, excepto el triángulo inferior, que tiene el carácter X.
Crea un programa que escribe una matriz simplista según los parámetros que escribe el usuario.

Pongo aquí unas imágenes con los ejemplos del resultado que quiero que me de.
Se puede ver que en el contador salta correctamente por ejemplo cuando esta en 12 y luego encuentra la x y en el siguiente pone 13, pues el problema que yo tengo es que se pone 14
https://ibb.co/bQRKqv

tincopasan

#5
Comparto con animanegra que el planteo de solución está muy mal:
1)igual modifique lo básico del código para que muestre lo que quieres, usando la lógica antes expuesta
2)la solución al planteo del triángulo para mí, también está mal, pero usaré tu mismo código
3) supongo que si solo importa el resultado antes descripto ya con esto funciona.

Código (python) [Seleccionar]

#-*- coding: utf -8 -*-
filas=int(input("Cantidad de filas: "))
primero=int(input("Número inicial:"))

matriz= [[0]*filas for a in range(filas)]
numero_columna_inicial=filas//2-1
numero_columna_final=filas//2+1

for d in matriz:
   matriz[filas//2][filas//2]="x"

descontar= 1
for q in range (filas//2+1,filas,1):
   for w in range (numero_columna_inicial,numero_columna_final+1,1):
       matriz[q][w]="x"
       descontar+=1
   numero_columna_inicial=numero_columna_inicial-1
   numero_columna_final=numero_columna_final+1

for f in range(filas):
   for c in range(filas):
       if matriz[f][c] == 0 :
           matriz[f][c]= primero
           primero+=1

for a in matriz:
   print(a)


Por supuesto no es absoluto! python da muchas formas de resolución, aunque traté de mantenerme en el código, algunas cosas las salté por obvias e innecesarias
Saludos

runas3