C# :: Aufgabe #153

3 Lösungen Lösungen öffentlich

Mehrdimensionale Arrays

Anfänger - C# von zefcat - 27.11.2016 um 10:46 Uhr
Sie sollen ein C Programm schreiben, welches eine 4x4 Matrix um 90° nach rechts dreht. Eine Drehung soll somit folgendermaßen aussehen:

a11 a12 a13 a14
a21 a22 a23 a24
a31 a32 a33 a34
a41 a42 a43 a44

wird zu

a41 a31 a21 a11
a42 a32 a22 a12
a43 a33 a23 a13
a44 a34 a24 a14

Folgende Matrizen sollen Sie insgesamt 4 mal drehen:


- - - - - - - - - - - - - - o -
- o - - - o o - - o - - - - o -
o o o - o o - - - o - - - - o -
- - - - - - - - - o o - - - o -


Die Matrizen sollen insgesamt 5 mal ausgegeben werden, einmal bevor eine Drehung durchgeführt wurde und anschließend nach jeder Drehung (die letzte Ausgabe entspricht also der ersten Ausgabe).

Als Trennzeichen dienen ein Leerzeichen zwischen den einzelnen Symbolen innerhalb einer Matrix, zwei Leerzeichen zwischen zwei horizontal angeordnete Matrizen und eine Leerzeile zwischen den einzelnen Versionen. Beachten Sie das Fehlen von abschließenden Leerzeichen nach der letzten Matrize. Siehe dazu auch die Beispielausgabe.

Lösungen:

vote_ok
von daniel59 (3950 Punkte) - 29.11.2016 um 12:00 Uhr
Program.cs
Quellcode ausblenden C#-Code
using System;

namespace ConsoleMehrDimensionaleArrays
{
    static class Program
    {
        static void Main(string[] args)
        {
            string[,] array0 = new string[4, 4]
            {
                {"a11", "a12", "a13", "a14" },
                {"a21", "a22", "a23", "a24" },
                {"a31", "a32", "a33", "a34" },
                {"a41", "a42", "a43", "a44" },
            };
            string[,] array90 = array0.TurnRight();
            string[,] array180 = array90.TurnRight();
            string[,] array270 = array180.TurnRight();
            string[,] array360 = array270.TurnRight();

            array0.PrintArray();
            array90.PrintArray();
            array180.PrintArray();
            array270.PrintArray();
            array360.PrintArray();
            Console.ReadLine();
        }

        static T[,] TurnLeft<T>(this T[,] source)
        {
            int rows = source.GetLength(0);
            int columns = source.GetLength(1);

            int c = columns - rows - 1;

            T[,] result = new T[columns, rows];
            for (int y = 0; y < rows; y++)
            {
                for (int x = 0; x < columns; x++)
                {
                    result[rows - x + c, y] = source[y, x];
                }
            }

            return result;
        }

        static T[,] TurnRight<T>(this T[,] source)
        {
            int rows = source.GetLength(0);
            int columns = source.GetLength(1);

            int c = rows - columns - 1;

            T[,] result = new T[columns, rows];
            for (int y = 0; y < rows; y++)
            {
                for (int x = 0; x < columns; x++)
                {
                    result[x, columns - y + c] = source[y, x];
                }
            }

            return result;
        }

        static void PrintArray<T>(this T[,] source, bool seperateLines = true)
        {
            int rows = source.GetLength(0);
            int columns = source.GetLength(1);

            for (int y = 0; y < rows; y++)
            {
                for (int x = 0; x < columns; x++)
                {
                    Console.Write(source[y, x] + " ");
                }
                Console.WriteLine();
            }
            if(seperateLines)
            {
                Console.WriteLine();
            }
        }
    }
}

vote_ok
von Robi (390 Punkte) - 01.12.2016 um 11:08 Uhr
Quellcode ausblenden C#-Code
using System;
using System.Collections.Generic;
using System.Text;

namespace Übungen_Zu_CSharp_153
{
    internal class Program
    {
        private static void Main()
        {
            string[,] matrix1 =
            {
                {"-", "-", "-", "-"},
                {"-", "0", "-", "-"},
                {"0", "0", "0", "-"},
                {"-", "-", "-", "-"}
            };

            string[,] matrix2 =
            {
                {"-", "-", "-", "-"},
                {"-", "0", "0", "-"},
                {"0", "0", "-", "-"},
                {"-", "-", "-", "-"}
            };

            string[,] matrix3 =
            {
                {"-", "-", "-", "-"},
                {"0", "-", "-", "-"},
                {"0", "-", "-", "-"},
                {"0", "0", "-", "-"}
            };

            string[,] matrix4 =
            {
                {"-", "-", "0", "-"},
                {"-", "-", "0", "-"},
                {"-", "-", "0", "-"},
                {"-", "-", "0", "-"}
            };

            var list = new List<string[,]>() { matrix1, matrix2, matrix3, matrix4 };

            Console.WriteLine(ConvertArrayListToString(list));
            for (var i = 0; i < 5; i++)
            {
                Console.WriteLine(ConvertArrayListToString(RotateMatrizen(list)));
            }

            Console.ReadLine();
        }

        //Nur eine ausgelagerte Funktion, welche die gesamte Liste der Matrizen dreht
        private static List<string[,]> RotateMatrizen(List<string[,]> matrizenlList)
        {
            for (var i = 0; i < matrizenlList.Count; i++)
            {
                matrizenlList[i] = RotateMatrix(matrizenlList[i]);
            }
            return matrizenlList;
        }

        //Rotiert die übergebene, quadratische Matrix um 90 Grad
        private static string[,] RotateMatrix(string[,] matrix)
        {
            var size = matrix.GetLength(0);
            var result = new string[size, size];
            for (var i = 0; i < size; i++)
            {
                for (var j = 0; j < size; j++)
                {
                    result[i, j] = matrix[size - j - 1, i];
                }
            }
            return result;
        }

        //Bildet aus der Liste von Matrizen einen String
        private static string ConvertArrayListToString(IReadOnlyList<string[,]> arrayList)
        {
            var sb = new StringBuilder();
            var length = arrayList[0].GetLength(0);

            for (var i = 0; i < length; i++)
            {
                for (var r = 1; r <= arrayList.Count; r++)
                {
                    var array = arrayList[r - 1];
                    for (var j = 0; j < length; j++)
                    {
                        sb.Append(array[i, j] + " ");
                    }
                    sb.Append(r != arrayList.Count ? " " : "\n");
                }
            }
            return sb.ToString();
        }
    }
}
vote_ok
von hollst (9410 Punkte) - 21.12.2016 um 13:53 Uhr
Quellcode ausblenden C#-Code
using System;
using System.Text;

namespace aufgabe_153
{
    class Program
    {
        static void Main() {

            String[] input = new String[] {
                "- - - - - - - - - - - - - - o -",
                "- o - - - o o - - o - - - - o -",
                "o o o - o o - - - o - - - - o -",
                "- - - - - - - - - o o - - - o -"
            };

            String[][] input_matrix = input.vec_to_matrix();
            
            for (var i = 0; i < 5; i++) {
                Console.Write(input_matrix.ToMyString());
                Console.WriteLine();
                input_matrix = input_matrix.rotate();
            }

            Console.ReadKey();
        }
    }

    public static class myExtensions
    {
        public static String[][] vec_to_matrix(this String[] input) {
            int lines = input.Length;
            String[][] result = new String[lines][];
            for(var i = 0; i < lines; i++) {
                String[] chars = input[i].Split(new Char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
                result[i] = new String[chars.Length];
                for(var j = 0; j < chars.Length; j++)
                    result[i][j] = chars[j];
            }
            return result;
        }

        public static String ToMyString(this String[][] input) {
            StringBuilder sb = new StringBuilder();
            for(var i = 0; i < input.Length; i++) {
                String lz = " ";
                for(var j = 0; j < input[i].Length; j++) {
                    if(j == input[i].Length - 1)
                        lz = String.Empty;
                    sb.Append(input[i][j] + lz);
                }
                sb.AppendLine();
            }
            return sb.ToString();
        }

        public static String[][] rotate(this String[][] input) {
            String[][] result = new String[input[0].Length][];
            for(var i = 0; i < input[0].Length; i++) {
                result[i] = new String[input.Length];
                for (var j = 0; j < input.Length; j++)
                    result[i][j] = input[input.Length - j - 1][i];
            }
            return result;
        }
    }
}