Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Legendaryz®

Redução de ifs

Recommended Posts

Estou no 1º ano de "Ciência da Computação", linguagem C# (C Sharp). Usando "Matriz Mulridimensional" no qual crio uma tabela 4x4, o usuário escolhe um valor para linha e coluna no qual a matriz correspondente pinta (x[a, b] = 1) e quando não pinta (x[a,b =0). O programa tem que dizer quantos quadros foram pintados e quantas imagens (pontos pintados juntos, não importando a ordem) se formaram. Estou fazendo vários ifs, existe uma fórmula que reduza esses ifs (Neste exemplo coloquei só 2 ifs) ? Alguém poderia me ajudar o mais rápido possível ? Um abraço !

 

int[,] x = new int[4, 4];

 

if (x[1, 1] == 1 && x[1, 2] == 0 && x[1, 3] == 0 && x[2, 1] == 0 && x[2, 2] == 0 && x[2, 3] == 0 && x[3, 1] == 0 && x[3, 2] == 0 && x[3, 3] == 0)

{

Console.Write("------------------------------------");

Console.Write("\n1 quadro pintado -> (1,1) = 1 imagem");

Console.Write("\n------------------------------------\n\n");

}

 

if (x[1, 1] == 1 && x[1, 2] == 1 && x[1, 3] == 0 && x[2, 1] == 0 && x[2, 2] == 0 && x[2, 3] == 0 && x[3, 1] == 0 && x[3, 2] == 0 && x[3, 3] == 0)

{

Console.Write("------------------------------------");

Console.Write("\n2 quadros pintados -> (1,1) e (1,2) = 1 imagem");

Console.Write("\n------------------------------------\n\n");

}

Imagem Postada

Imagem Postada

Compartilhar este post


Link para o post
Compartilhar em outros sites

acho que seria basicamente isso:

 

function getPintado(x,y,matriz) {
    return matriz[x,y] == 1 //retorna bool true ou false
}


for(i=0;i<=3;i++) {
  for(j=0;j<=3;j++) {
      Console.Write(getPintado(i,j,x);
    }
  }
}

só adapta a saida, para ficar mais apresentável para o que você precisa.

 

tb não sou programador C# mas imagino que seja assim.

 

 

esqueci do detalhe das imagens uma do lado da outra....

 

esse FOR juntamente com um SWITCH pode te ajudar tb caso isso não resolva.

nunca li nada confirmando isso, mas ouvi dizer que o case eh mais eficiente do que vários ifs.

Compartilhar este post


Link para o post
Compartilhar em outros sites

só a quantidade neh?

 

function setPintado(x,y,matriz) {
    if(matriz[x,y] == 1) {
      qtdPintado = qtdPintado + 1;
      if(pintei) { //se pintei == true eh pq a posicao anterior foi pintada, entao adiciona o par.
        qtdPar = qtdPar +1;
      }
      pintei = true;
      if(x > 0) { //se nao eh a primeira linha, 
        if(matriz[x-1,y] == 1) { //compara se a linha anterior foi pintada.
          qtdPar = qtdPar +1;
        }
      }
    } else {
      pintei = false;
    }
}

for(i=0;i<=3;i++) {
  for(j=0;j<=3;j++) {
      setPintado(i,j,x);
    }
  }
}

francamente estou meio com preguiça de pensar a respeito, principalmente por não ter o problema para ir testando, mas acho que assim funciona, talvez tenha esquecido de algum detalhe, qualquer coisa você arruma http://forum.imasters.com.br/public/style_emoticons/default/joia.gif

Compartilhar este post


Link para o post
Compartilhar em outros sites

Alguém entende de C# ? Para cria uma função percebi que tive que criar numa classe.

 

class Class1

{

 

public int setPintado(int a, int b, **?**) {

 

Como declaro uma matriz multidimensional na função, já tentei "int[,] matriz) " e não funcionou ! Algué sabe como ?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Creio que consegui, pois o "int[, ] matriz" não fica mais sublinhado na tela de digitação, porém está aparecendo o seguinte:

 

class Class1

{

 

public int setPintado(int a, int b, int[, ] matriz) {

 

**Retorna o seguinte erro: 'matriz_pintada.Class1.setPintado(int, int, int[*,*])': not all code paths return a value

Compartilhar este post


Link para o post
Compartilhar em outros sites

em C# não tem um esquema tipo java pra quando a função não retorna nada...

 

function int void

 

se não o google deve saber :P

 

aí o que achei:

 

using System;
 
namespace Akadia.NoDelegate
{
    public class MyClass
    {
        public void Process()
        {
            Console.WriteLine("Process() begin");
            Console.WriteLine("Process() end");
        }
    }
 
    public class Test
    {
        static void Main(string[] args)
        {
            MyClass myClass = new MyClass();
            myClass.Process();
        }
    }
}

soh existe um pequeno problema no algoritmo que te passei, não é complicado de resolver...

 

se a posicao 0,3 == 1 e a posicao 1,0 == 1 acho que meu algoritmo vai interpretar como um par isso.

 

seria algo tipo:

 

 

_ _ _ o

o _ _ _

_ _ _ _

_ _ _ _

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não entendi, usando este último código na classe, onde devo acrescentar aquele código de redulão de ifs ? E como ativo a função no Program ? Como ficaria o código completo ?

 

Um abraço !

Compartilhar este post


Link para o post
Compartilhar em outros sites

o melhor seria um programador C# te dar uma mão, mas se colar um estrutura básica de um código acho que posso tentar...

(estava com problemas na super internet da Oi...)

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.