Problem Matrizenrechner / Methodenaufruf c#


#1

Hallo zusammen.
Ich habe ein kleines Problem bei meinem Programm zum Addieren, Subtrahieren und Multiplizieren von Matritzen. Das Aufrufen von “ReadMatrix” im Main funktioniert nicht. Vielleicht kann mir jemand helfen.
Danke schonmal
Lg
[CSHARP]
class Matrix
{
int n;
int m;
int[,] data;

    public Matrix(int n, int m)
    {
        this.n = n;
        this.m = m;
        data = new int[n, m];         
    }

    public void ReadMatrix1()
    {
        
        Console.WriteLine("

Please Enter Details of First Matrix");
Console.Write(“Number of Rows in First Matrix : “);
m = int.Parse(Console.ReadLine());
Console.Write(“Number of Columns in First Matrix : “);
n = int.Parse(Console.ReadLine());
int[,] A = new int[m, n];
Console.WriteLine(“Enter the elements of First Matrix : “);
for (int i = 0; i < A.GetLength(0); i++)
{
for (int j = 0; j < A.GetLength(1); j++)
{
try
{
Console.WriteLine(“Enter Element " + (1 + i).ToString() + " " + (1 + j).ToString());
A[i, j] = int.Parse(Console.ReadLine());
Console.WriteLine(” Value Accepted”);
}
catch
{
try
{
Console.WriteLine(“Enter Element " + (1 + i).ToString() + " " + (1 + j).ToString());
Console.WriteLine(“
Please Enter a Valid Value”);
A[i, j] = int.Parse(Console.ReadLine());
Console.WriteLine(” Value Accepted”);
}
catch
{
Console.WriteLine(“
Please Enter a Valid Value(Final Chance)”);
Console.WriteLine(“Enter Element " + (1 + i).ToString() + " " + (1 + j).ToString());
A[i, j] = int.Parse(Console.ReadLine());
Console.WriteLine(” Value Accepted”);
}
}
}
}
}
public void ReadMatrix2()
{
Console.WriteLine(“Please Enter Details of Second Matrix”);
Console.Write(“Number of Rows in Second Matrix :”);
m = int.Parse(Console.ReadLine());
Console.Write(“Number of Columns in Second Matrix :”);
n = int.Parse(Console.ReadLine());
int[,] B = new int[m, n];
Console.WriteLine(“Please Enter Elements of Second Matrix:”);
for (int i = 0; i < B.GetLength(0); i++)
{
for (int j = 0; j < B.GetLength(1); j++)
{
try
{
Console.WriteLine(“Enter Element " + (1 + i).ToString() + " " + (1 + j).ToString());
B[i, j] = int.Parse(Console.ReadLine());
Console.WriteLine(” Value Accepted”);
}
catch
{
try
{
Console.WriteLine(“
Please Enter a Valid Value”);
B[i, j] = int.Parse(Console.ReadLine());
Console.WriteLine(” Value Accepted”);
}
catch
{
Console.WriteLine(“
Please Enter a Valid Value(Final Chance)”);
B[i, j] = int.Parse(Console.ReadLine());
Console.WriteLine(" Value Accepted");
}
}
}
}
}
public void Print()
{
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
Console.Write(data[i, j] + " ");
}
Console.WriteLine();
}
}

 public static Matrix operator +(Matrix A, Matrix B)
    {     
        Matrix C= new Matrix(A.n, A.m);
        for (int i = 0; i < A.n; i++)
        {
            for (int j = 0; j < A.m; j++)
            {
                C.data[i,j] = A.data[i,j] + B.data[i,j];
            }                    
        }
        return C;
    }
}

public static void Main(string[] args)
{

        bool isRunning = true;
        while (isRunning)
        {                     
            int n = int.Parse(Console.ReadLine());
            int m = int.Parse(Console.ReadLine());
            Matrix A = new Matrix(n, m);
            A.ReadMatrix1();
            Matrix B = new Matrix(n, m);
            B.ReadMatrix2();   
            Console.WriteLine("**** MENU For Matrix Operations *****");
            Console.WriteLine(" 1. Addition");
            Console.WriteLine(" 2. Subtraction");
            Console.WriteLine(" 3. Multiplication");
            Console.WriteLine(" 4. End");
            Console.WriteLine("Please Choose The Operation You Want.");
            int choice = Convert.ToInt16(Console.ReadLine());

            switch (choice)
            {
                case 1:

                 Console.WriteLine();
                 Matrix C = A + B;
                 C.Print();
                    break;

[/CSHARP]


#2

Wenn ich eine Antwort auf dem Niveau Deiner Frage geben müsste wäre sie: “Schade!”

Da ich Dir aber helfen will muss ich nachfragen:

Was bedeutet “funktioniert nicht”?

Wo ist der fehlende Code? (das was Du gepostet hast kann nicht kompilieren).

Bitte erzeuge einen SSCCE der Dein Problem zeigt und beschreibe es genauer.

bye
TT


#3

Hallo TT!
Danke das du mir helfen willst. Ich sehe ein das meine Frage etwas dumm gestellt war also versuche ich es nochmal.
Ich habe ja die Methode ReadMatrix1 und ReadMatrix2 in welchen man eine n*mgroße Matrix eingeben kann. Diese möchte ich im Hauptprogramm so aufrufen, dass die Punkte abgefragt werden und ich mit den Matrizen A und B weiterarbeiten kann. Ich hoffe es ist nun annähernd ein SSCCE.
Lg
hier nochmal der komplette Code:

[CSHARP]
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace xxxxx
{
class Matrix
{
int n;
int m;
int[,] data;

    public Matrix(int n, int m)
    {
        this.n = n;
        this.m = m;
        data = new int[n, m];
    }

    public void ReadMatrix1()
    {

        Console.WriteLine("

Please Enter Details of First Matrix");
Console.Write(“Number of Rows in First Matrix : “);
m = int.Parse(Console.ReadLine());
Console.Write(“Number of Columns in First Matrix : “);
n = int.Parse(Console.ReadLine());
int[,] A = new int[m, n];
Console.WriteLine(“Enter the elements of First Matrix : “);
for (int i = 0; i < A.GetLength(0); i++)
{
for (int j = 0; j < A.GetLength(1); j++)
{
try
{
Console.WriteLine(“Enter Element " + (1 + i).ToString() + " " + (1 + j).ToString());
A[i, j] = int.Parse(Console.ReadLine());
Console.WriteLine(” Value Accepted”);
}
catch
{
try
{
Console.WriteLine(“Enter Element " + (1 + i).ToString() + " " + (1 + j).ToString());
Console.WriteLine(“
Please Enter a Valid Value”);
A[i, j] = int.Parse(Console.ReadLine());
Console.WriteLine(” Value Accepted”);
}
catch
{
Console.WriteLine(“
Please Enter a Valid Value(Final Chance)”);
Console.WriteLine(“Enter Element " + (1 + i).ToString() + " " + (1 + j).ToString());
A[i, j] = int.Parse(Console.ReadLine());
Console.WriteLine(” Value Accepted”);
}
}
}
}
}
public void ReadMatrix2()
{
Console.WriteLine(“Please Enter Details of Second Matrix”);
Console.Write(“Number of Rows in Second Matrix :”);
m = int.Parse(Console.ReadLine());
Console.Write(“Number of Columns in Second Matrix :”);
n = int.Parse(Console.ReadLine());
int[,] B = new int[m, n];
Console.WriteLine(“Please Enter Elements of Second Matrix:”);
for (int i = 0; i < B.GetLength(0); i++)
{
for (int j = 0; j < B.GetLength(1); j++)
{
try
{
Console.WriteLine(“Enter Element " + (1 + i).ToString() + " " + (1 + j).ToString());
B[i, j] = int.Parse(Console.ReadLine());
Console.WriteLine(” Value Accepted”);
}
catch
{
try
{
Console.WriteLine(“
Please Enter a Valid Value”);
B[i, j] = int.Parse(Console.ReadLine());
Console.WriteLine(” Value Accepted”);
}
catch
{
Console.WriteLine(“
Please Enter a Valid Value(Final Chance)”);
B[i, j] = int.Parse(Console.ReadLine());
Console.WriteLine(" Value Accepted");
}
}
}
}
}
public void Print()
{
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
Console.Write(data[i, j] + " ");
}
Console.WriteLine();
}
}

    public static Matrix operator +(Matrix A, Matrix B)
    {
        //if (A.n == B.n && A.m == B.m)
        //{
        Matrix C = new Matrix(A.n, A.m);
        for (int i = 0; i < A.n; i++)
        {
            for (int j = 0; j < A.m; j++)
            {
                C.data[i, j] = A.data[i, j] + B.data[i, j];
            }
        }
        return C;
        // }
        //   else
        //   {
        //       Console.WriteLine("

Number of rows or columns in Matrix1 is not equal to Number of rowsor colums in Matrix2.");
// Console.WriteLine(“
Addition of Matrix1 with Matrix2 is not possible”);
// Environment.Exit(-1);
// }
}

    public static Matrix operator -(Matrix A, Matrix B)
    {
        //if (A.n == B.n && A.m == B.m)
        // {
        Matrix D = new Matrix(A.n, A.m);
        for (int i = 0; i < A.n; i++)
        {
            for (int j = 0; j < A.m; j++)
            {
                D.data[i, j] = A.data[i, j] - B.data[i, j];
            }
        }
        return D;
        // }
        //else
        // {
        //    Console.WriteLine("

Number of rows or columns in Matrix1 is not equal to Number of rows or colums in Matrix2.");
// Console.WriteLine(“
Subtraction of Matrix1 with Matrix2 is not possible”);
// Environment.Exit(-1);
//}
}

    public static Matrix operator *(Matrix A, Matrix B)
    {
        // if (A.n == B.m && A.n == B.m)
        // {
        Matrix E = new Matrix(A.n, A.m);
        for (int i = 0; i < A.n; i++)
        {
            for (int j = 0; j < A.n; j++)
            {
                E.data[i, j] = 0;
                for (int k = 0; k < A.n; k++)
                {
                    E.data[i, j] = E.data[i, j] + A.data[k, j] * B.data[i, k];
                }
            }
            return E;
            //  }
            //  else
            //   {
            //      Console.WriteLine("

Number of columns in Matrix1 is not equal to Number of rows in Matrix2.");
// Console.WriteLine(“
Multiplication of Matrix1 with Matrix2 is not possible”);
// Environment.Exit(-1);
// }
}
}
}
}

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace xxxxx
{
class Program
{
public static void Main(string[] args)
{

        bool isRunning = true;
        while (isRunning)
        {
            int n = int.Parse(Console.ReadLine());
            int m = int.Parse(Console.ReadLine());
            Matrix A = new Matrix(n, m);
            A.ReadMatrix2();
            Matrix B = new Matrix(n, m);
            B.ReadMatrix2();
            Console.WriteLine("**** MENU For Matrix Operations *****");
            Console.WriteLine(" 1. Addition");
            Console.WriteLine(" 2. Subtraction");
            Console.WriteLine(" 3. Multiplication");
            Console.WriteLine(" 4. End");
            Console.WriteLine("Please Choose The Operation You Want.");
            int choice = Convert.ToInt16(Console.ReadLine());

            switch (choice)
            {
                case 1:

                    Console.WriteLine();
                    Matrix C = A + B;
                    C.Print();
                    break;

                case 2:

                    Console.WriteLine();
                    Matrix D = A - B;
                    D.Print();
                    break;

                case 3:

                    Console.WriteLine();
                    Matrix E = A * B;
                    E.Print();
                    break;

                case 4:
                    isRunning = false;
                    break;

                default:
                    Console.WriteLine("1 - 4");
                    break;

            }
            Console.WriteLine("Press any key to continue");
            Console.ReadKey();
        }


    }
}

}
[/CSHARP]


#4

Schon besser, danke.

fehlt nur noch die beschreibung wie genau das Programm von deiner Erwartung abweicht.

bye
TT


#5

Naja ich hätte erwartet, dass das Programm die Methoden ReadMatrix1 und 2 ausführt sobald das Programm gestartet wird. Es kommt jedoch nur die leere Console und wenn ich eine Taste drücke kommt der Fehler:

Unbehandelte Ausnahme: System.FormatException: Die Eingabezeichenfolge hat das f
alsche Format.
bei System.Number.StringToNumber(String str, NumberStyles options, NumberBuff
er& number, NumberFormatInfo info, Boolean parseDecimal)
bei System.Number.ParseInt32(String s, NumberStyles style, NumberFormatInfo i
nfo)
bei System.Int32.Parse(String s)
bei xxxxx.Program.Main(String[] args) in c:\FH\Programmieren\SS 2014\xxxxx\xx
xxx\Program.cs:Zeile 18.
Drücken Sie eine beliebige Taste . . .

lg


#6

[quote=CrazyLoops;102752]Naja ich hätte erwartet, dass das Programm die Methoden ReadMatrix1 und 2 ausführt sobald das Programm gestartet wird. Es kommt jedoch nur die leere Console[/quote]Wenn ich Dir die Lösung sage lernst Du nichts, daher frage ich mal weiter:

In welcher Code-Zeile startet Dein Programm?

Was machen die ersten 3 Anweisungen in dieser Methode?

Wo ist die erste Ausgabe nach dem Programmstart?

Wo ist die erste Eingabe nach dem Programmstart?

Was steht in der Dokumentation von [INLINE]int.Parse()[/INLINE] über die erlaubten Werte für Parameter?

Wo wird geprüft, dass die Eingabe die von [INLINE]int.Parse()[/INLINE] geforderten Bedingungen erfüllt?

Wie wird der Benutzer über Falscheingaben informiert?

bye
TT


#7

Es startet dort wo ich den boolschen Wert auf true setze.
die erste setzt den boolschen Wert auf true
die zweite sagt solange isrunning besteht mach das
die dritte konvertiert n in die Zahl
Erste Ausgabe Zeile 22
Erste Eingabe dann Zeile 28
int.Parse() = string
ka
lg


#8

Wenn Du auf Deine Antworten schaust: verstehst Du jetzt, warum Dein Programm so reagiert wie es das tut?

bye
TT

*** Edit ***

[quote=CrazyLoops;102754]Erste Eingabe dann Zeile 28[/quote]Nein, die erste eingabe ist in Zeile 202, nämlich die dritte Anweisung in [INLINE]Main[/INLINE]…

bye
TT


#9

Nja trotzdem danke für deine Zeit. Ich werd schon noch draufkommen wies geht.
cya


#10

Also erstens

readMatrix1 und readMatrix2 sind völlig identisch

bei der Multiplikation ist das Zeilen/Spaltenzahl des Ergebnisses nicht von der Größe von B abhängig, das kann nicht sein (warum auskommentiert)

dein Programm startet mit int n = int.Parse(Console.ReadLine()); ohne Fehlerabfrage: zuerst einen String lesen, dann versuchen in int zu verwandeln