C# :: Aufgabe #199
5 Lösungen
Ermittlung von Zeilen- und Spaltennummer eines 2D-Array-Feldes
Anfänger - C#
von hollst
- 09.02.2018 um 11:03 Uhr
Die Felder eines "unendlich" großen 2D-Arrays seien nach folgendem "Diagonal-Schema" nummeriert:
1 2 4 7 . . .
3 5 8 . . . .
6 9 . . . . .
10 . . . . . .
. . . . . . usw.
Man schreibe ein Programm, das für eine gegebene Feldnummer N die Zeilen- (ZN) und die Spaltennummer (SN) zurückgibt.
Zeilen- und Spaltennummerierungen beginnen wie üblich mit 0.
Beispiele:
N = 8 -> ZN = 1, SN = 2
N = 31 -> ZN = 2, SN = 5
1 2 4 7 . . .
3 5 8 . . . .
6 9 . . . . .
10 . . . . . .
. . . . . . usw.
Man schreibe ein Programm, das für eine gegebene Feldnummer N die Zeilen- (ZN) und die Spaltennummer (SN) zurückgibt.
Zeilen- und Spaltennummerierungen beginnen wie üblich mit 0.
Beispiele:
N = 8 -> ZN = 1, SN = 2
N = 31 -> ZN = 2, SN = 5
Lösungen:
static void Main(string[] args)
{
int c = 1;
// Die gesuchte Zahl
int input = 10;
for (int i = 0; i < 20; i++)
{
int y = 0;
int x = i;
while (x >= 0)
{
if (c == input)
{
Console.WriteLine("Gesuchte Zeile:" + (y+1) + "Gesuchte Spalte:" + (x+1));
}
c++;
x--;
y++;
}
}
}
using System;
using System.Collections.Generic;
using System.Windows; //WindowBase.dll
namespace TYP199 {
class Program {
static void Main() {
int n = 8;
int[,] a = {
{ 1, 2, 4 },
{ 3, 5, 8 },
};
Point? point = Find(n, a);
Console.Write($"N = {n} -> ZN = {point?.X}, SN = {point?.Y}");
Console.ReadKey(true);
}
static Point? Find<T>(T needle, T[,] heystack) {
for(int i = 0; i < heystack.GetLength(0); i++) {
for(int ii = 0; ii < heystack.GetLength(1); ii++) {
if(EqualityComparer<T>.Default.Equals(heystack[i, ii], needle)) {
return new Point(i, ii);
}
}
}
return null;
}
}
}
using System;
namespace ConsoleFindIndex2DArray
{
static class Program
{
static void Main(string[] args)
{
Console.WriteLine("----- Ermittlung von Zeilen- und Spaltennummer eines unendlich 2D-Array-Feldes im Diagonal-Schema------");
do
{
Console.Write("Geben Sie eine Zahl größer als 0 ein: ");
ulong l;
if (ulong.TryParse(Console.ReadLine(), out l) && l > 0)
{
ulong row, column;
FindIndexInDiagonalSchema(l, out row, out column);
Console.WriteLine($"Zeile: {row}\tSpalte: {column}");
}
} while (true);
}
static void FindIndexInDiagonalSchema(ulong l, out ulong row, out ulong column)
{
double d = Math.Truncate((-0.5 + Math.Sqrt(0.25 + 2 * l)));
ulong step = (ulong)d + 1;
ulong v = (step * step + step) / 2;//Gausssche Summenformel
while (v <= l)
{
v += ++step;
}
ulong dif = l - (v - step + 1);
row = dif;
column = step - (dif + 1);
}
}
}
using System;
using static System.Console;
/*
Ermittlung von Zeilen- und Spaltennummer eines Array-Feldes
Die Felder eines 2D-Arrays seien nach folgendem "Diagonal-Schema" nummeriert:
1 2 4 7 . . .
3 5 8 . . . .
6 9 . . . . .
10 . . . . . .
. . . . . . usw.
Man schreibe ein Programm, das für eine gegebene Feldnummer N die Zeilen- (ZN)
und die Spaltennummer (SN) zurückgibt. Zeilen- und Spaltennummerierungen
beginnen wie üblich mit 0.
Beispiele: N = 8 -> ZN = 1, SN = 2
N = 31 -> ZN = 2, SN = 5
*/
class MAIN {
static void Main() {
uint N = 0;
bool bo_exit = false;
WriteLine(give_1_numbers(100));
while (!bo_exit) {
bool bo_input_ok = false;
while (!bo_input_ok) {
Write("give me N (> 0): ");
bo_input_ok = uint.TryParse(ReadLine(), out N) && (N > 0);
}
Algorith alg = new Algorith(N);
WriteLine($"N = {N,2} -> ZN = {alg.ZN}, SN = {alg.SN}");
InversAlgorith inv_alg = new InversAlgorith(alg.ZN, alg.SN);
WriteLine($"ZN = {alg.ZN}, SN = {alg.SN} -> N = {inv_alg.N}");
WriteLine("press any key (exit ESC)");
bo_exit = ReadKey(true).Key == ConsoleKey.Escape;
}
}
class Algorith {
public uint ZN, SN;
public Algorith(uint N) {
uint s = 0, value = 1;
while (value <= N)
value += s++;
this.ZN = N - value + s - 1;
this.SN = s - 2 - this.ZN;
}
}
class InversAlgorith {
public uint N;
public InversAlgorith(uint ZN, uint SN) {
uint s = 0, value = 1;
while(s <= SN + ZN)
value += s++;
this.N = value + ZN;
}
}
static string give_1_numbers(uint bis) {
System.Text.StringBuilder sb = new System.Text.StringBuilder();
sb.AppendLine("numbers of diagonal elements");
for (uint i = 0; i < bis; i++) {
if (i > 0 && i % 10 == 0)
sb.AppendLine();
InversAlgorith ia = new InversAlgorith(i, i);
sb.Append($"{ia.N.ToString("n0"), 10}");
}
return sb.ToString();
}
}
Consolen-Programm mit Eingabeschleife zum Test unterschiedlicher Werte.
C#-Code
namespace Csharp_199_2DArray
{
using System;
public class Program
{
static void Main(string[] args)
{
string inputString;
// loop to enter and check several numbers in a row
do
{
Console.Write("Enter integer number or 'Q' to quit: ");
inputString = Console.ReadLine();
if(int.TryParse(inputString,out int inputNumber))
{
CalculateArrayIndexes(inputNumber, out int resultColumn, out int resultRow);
Console.WriteLine($"Number={inputNumber} -> Result: Column={resultColumn} Row={resultRow}");
}
} while (inputString.ToLower() != "q");
}
static void CalculateArrayIndexes(int inputNumber, out int resultColumn, out int resultRow)
{
resultColumn = 0;
resultRow = 0;
// value to be added when stepping from one diagonal to the next one
var addValue = 1;
// first and last value in a diagonal
var firstValueOfDiagonal = 1;
var lastValueOfDiagonal = 1;
var continueSearch = true;
while (continueSearch)
{
// check if given number is on this diagonal
if ( inputNumber >= firstValueOfDiagonal
&& inputNumber <= lastValueOfDiagonal)
{
// calculate the index values and terminate loop
resultColumn = lastValueOfDiagonal - inputNumber;
resultRow = inputNumber - firstValueOfDiagonal;
continueSearch = false;
}
else
{
// step to next diagonal
firstValueOfDiagonal += addValue;
lastValueOfDiagonal += addValue + 1;
addValue++;
}
}
}
}
}
