• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

coss

C# Ajuda

8 mensagens neste tópico

Viva pessoal,

ando aqui com umas dúvidas, pois iniciei agora o curso de C#.

Já fiz aqui alguns exercicios que o professor pediu, porém estou com dúvidas em 3 por agora.

1º Multiplicação de matrizes:

Bem, eu fiz a soma de matrizes com o seguinte código:

static void Main(string[] args)
        {
            int[,] Matriz1 = { { 4, 2 }, { 5, 3 } };
            int[,] Matriz2 = new int[2, 2];
            int[,] Matriz3 = new int[2, 2];

            for (int i = 0; i < 2; i++)
            {
                for (int j = 0; j < 2; j++)
                {
                    Matriz2[i, j] = Convert.ToInt32(System.Console.ReadLine());
                }
            }
            for (int i = 0; i < 2; i++)
            {
                System.Console.Write("\n");
                for (int j = 0; j < 2; j++)
                {
                    Matriz3[i, j] = Matriz1[i, j] * Matriz2[j, i];
                    System.Console.Write("\t{0}", Matriz3[i, j]);
                }
            }
            System.Console.ReadLine();

Porém, isso é a soma e só recentemente vi como se faz manualmente a multiplicação.

Então a dúvida agora é que enquanto a soma é directo (a11 + b11; a21 + b21;), a multiplicação é (a11*b11+a12*b21, a21*b11+a22*b21) e por ai...

Então, podem dar-me alguma informação em como obter isso?

pois tenho que ter uma terceira variável, não é? E multiplicar linha com coluna, não?

2º Criptografia:

imaginemos que tenho o alfabeto assim:

A  B  C  D  E  F  G  H  I  J    K  L  M

Z  Y  X  W  V  U  T  S  R  Q  P  O  N

Então, digamos que eu escrevia: teste, o resultado seria: gvhgv ... irá trocar.

Então pensei numa string e depois converter num conjunto de char [].

Mas neste caso terei que passar o char para número pela tabela ascii e somar + 13 ou diminuir 13?

Pois pelo que andei a ler, deu-me essa ideia.

Agradecia um exemplo da conversão de ascii.

3º Decimal para binário:

static void Main(string[] args)
        {
            int dec = 0;
            dec = Convert.ToInt32(Console.ReadLine());
            
            int acumulador = 0;
            
            
            for (; dec > 2; )
            {
                acumulador += dec % 2;
                
               
                dec = dec / 2;
                
            }

            Console.WriteLine(acumulador);
            Console.ReadLine();

Ora, isso vai fazer a soma do resto de divisão, e cheguei até ai...

o que eu pretendo agora é após o "acumulador += dec % 2;" fazer a união dos números.

ou seja, passar o int para string e depois a união.

pensei em algo do tipo:  string binario = int.toString(acumulador);

isso passaria o inteiro para binário e depois o que me falta é o unir: 10100 (este número foi de exemplo).

Seria esse o passo?

Obrigado pelas ajudas :D

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

1º Problema:

Resolvido aqui: http://www.guergolet.com.br/?p=67

2º Problema:

Em C# não podes fazer essas batotas de somar chars com ints (penso eu). Assim a solução é:

// Pegando na ideia de começar pela string (de maneira a isto funcionar mesmo que o abecedário seja diferente)
var abecedario = "abcdefghijklmnopqrstuvwxyz"; // Espero não me ter esquecido de nenhuma letra
var metadeDeCima = abecedario.Substring(0,abecedario.Length/2);
var metadeDeBaixo = abecedario.Substring(abecedario.Length/2,abecedario.Length/2);

// Falta aqui inverter a string metadeDeBaixo. Acho que consegues fazer isso sozinho.

var stringParaConverter = "xpto";
var stringConvertida = string.Empty;

foreach(char c in stringParaConverter)
{
    if(abecedario.indexOf(c) < metadeDeCima.Length)
         stringConvertida += metadeDeBaixo[metadeDeCima.indexOf(c)];
    else
         stringConvertida += metadeDeCima[metadeDeBaixo.indexOf(c)];
}

Não testei, até pode não compilar, mas a ideia será esta.

3º problema: Pegando no teu código...

static void Main(string[] args)
        {
            int dec = 0;
            // Assim o código fica mais legível (e é mais correcto, acho eu)
            dec = int.Parse(Console.ReadLine());
            
            // Só mudei esta linha
            string acumulador = string.Empty;
            
            
            for (; dec > 2; )
            {
                // Basta isto, ele lá se encarrega de fazer a conversão para string, seguida da concatenação
                // Se bem me lembro das minhas aulas de sistemas digitais o número em binário é a ordem inversa dos restos, por isso tem que se adicionar sempre no início.
                acumulador = dec % 2 + acumulador;
                
               
                dec = dec / 2;
                
            }

            Console.WriteLine(acumulador);
            Console.ReadLine();

Mais uma vez, não testei, mas se o número em binário aparecer invertido então basta alterares a ordem na linha que eu indiquei.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Viva....

no decimal para o binário, aquela da string vazia foi o segredo sim :D

depois também esta "acumulador = dec % 2 + acumulador;"

e tive que meter outra linha no lado de fora: acumulador = dec + acumulador;

pois quando o valor é 1, logo é menor que 2 e assim já não juntava.

Obrigado pela dica...

Fica o código em baixo completo:

static void Main(string[] args)
        {
            int dec = 0;
            dec = Convert.ToInt32(Console.ReadLine());

            string acumulador = string.Empty;
            
            
            for (; dec >= 2; )
            {
                acumulador = dec % 2 + acumulador;
                
               
                dec = dec / 2;
                
            }
            acumulador = dec + acumulador;
            Console.WriteLine(acumulador);
            Console.ReadLine();

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Sobre a criptografia, funcionou logo à primeira.

só a multiplicação da matriz tenho de ver o que se passa.

Logo eu posto no fórum o código para o resto dos trabalhos.

obrigado pela ajuda :D

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

int[,] Matriz1 = { { 4, 2 }, { 5, 3 } };
            int[,] Matriz2 = { { 1, 3 }, { 1, 2 } };
            int[,] Matriz3 = new int[2,2];

           
            for (int i = 0; i < 2; i++)
            {
                System.Console.Write("\n");
                for (int j = 0; j < 2; j++)
                {
                    System.Console.Write("\n");
                    for (int k = 0; k < 2; k++)
                    {

                        Matriz3[i, j] += Matriz1[i, k] * Matriz2[k, j];
                       System.Console.Write("\t{0}", Matriz3[i, j]);
                    }
                }
            }
            System.Console.ReadLine();

Viva, no código da multiplicação, alguém pode dar-me mais uma ajuda?

pois não estou a ver o porque de sair algo mal.

Pois isso dá-me dois valores diferentes.

Uns valores que estão bem e outros não.

Muito obrigado.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Tens a certeza que está errado? Não te esqueças que o resultado final é calculado em 2 passos e tu estás a imprimir ambos os passos.

Mete um breakpoint no final e ve como ficou a Matriz3 ou então imprime-a:

for (int i = 0; i < 2; i++)
            {
                System.Console.Write("\n");
                for (int j = 0; j < 2; j++)
                {
                       System.Console.Write("\t{0}", Matriz3[i, j]);
                }
            }

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

ah é calculado em dois passos?

não sabia que era em dois passos, sendo assim é diferente.

Pois pensei que ia só mostrar o resultado final.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Sim, é em dois passos, mas não sei se me expliquei bem, o código é só esse. A questão é que como disseste, a multiplicação é feita segundo a "fórmula"  (a11*b11+a12*b21, a21*b11+a22*b21).

O que o código faz é primeiro calcula a11*b11 e guarda, na iteração seguinte faz a12*b21 e soma com o que já lá estava.

Portanto com o código que tinhas, a imprimir todas as iterações do for(k), imprimes (a11*b11) e depois (a11*b11+a12*b21).

Daí teres um valor correcto e outro errado.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora