C# függvényvisszatérési érték probléma

Címkék
C# függvényvisszatérési érték probléma
2012-09-29T11:51:12+02:00
2012-09-29T16:40:27+02:00
2022-11-27T00:15:36+01:00
Revolver
Sziasztok, adott egy feladatom mely szerint C# nyelven egy két-dimenziós tömbben kellene számokat generálnom úgy, hogy egy szám csak egyszer fordulhasson elő.
1 hónapja foglalkozom ezzel a nyelvvel, ezért annyira még nem ismerem, a problémám a függvény visszatérési értékével kapcsolatos, konkrétan a kulonbozo() nevű függvényem nem akar az x értékével visszatérni csak azzal amit definiálok neki a for cikluson kívül.
Itt a kód:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ok
{
class Program
{
static int kulonbozo(int[] tmb,int n)
{
int x;

Array.Sort(tmb);
for (int k = 1; k < n * n; k++)
{
if (tmb[k] == tmb[k - 1])
{
x = 0;
}
else
x = 1;
}
return x;
}
static void Main(string[] args)
{
Console.WriteLine("kerek negyzet oldalat");
int n = int.Parse(Console.ReadLine());
int[,] matrix = new int[n, n];
int[] tmb = new int[n * n];
Random rnd = new Random();

do {
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
matrix[i, j] = rnd.Next(1, (n * n)+1);
}
}
int add = 0;
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
add++;
for (int k = add - 1; k < n * n; k++)
tmb[k] = matrix[i, j];
}
}

}
while (kulonbozo(tmb,n)==0);
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
Console.Write("{0,5}", matrix[i, j]);

}
Console.WriteLine("\n");

}
for (int i = 0; i < n * n; i++)
{
Console.Write("{0,5}", tmb);
}



Console.ReadKey();
}
}
}



Rev.
Mutasd a teljes hozzászólást!
Több sebből is vérzik a feladat.
A különbözőség vizsgálatra a függvényben azt kellene, hogyha már van egy egyezőség, akkor egyből visszatérni 0-val, nem kell már tovább pörgetni a ciklust.
Jelen esetben teljesen mindegy, hogy megegyezik-e a tömb valamelyik elemével, az utolsó elem vizsgálata adja meg az x-nek a végleges értéket.
Amúgy meg praktikusabb lenne bool-t használni (igaz/hamis), átláthatóbb.

Ha már használsz a mátrix mellet segédtömböt is, akkor így is megvalósítható, külön írt függvény nélkül a tömb Contains metódusával:

pl:

class Program { static void Main(string[] args) { Random rnd = new Random(); Console.WriteLine("Kérem a négyzet oldalát: "); int n = int.Parse(Console.ReadLine()); int[,] matrix = new int[n, n]; int[] tmb = new int[n * n]; int v; int k = 0; for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { do v = rnd.Next(1, (n*n) + 1); while (tmb.Contains(v)); tmb[k] = v; matrix[i, j] = v; k++; } } for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { Console.Write("{0,5}", matrix[i, j]); } Console.WriteLine("\n"); } Console.ReadKey(); } }


BIG W hozzászólása Revolver (11:51) részére előzmény | privát | 2012.09.29. 13:47 | válasz
Mert nem az x-nek kell visszatérnie, hanem az n-nek...


Mutasd a teljes hozzászólást!

  • Mert nem az x-nek kell visszatérnie, hanem az n-nek...
    Mutasd a teljes hozzászólást!
  • Olyan, amilyen, de működik:

    using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ok { class Program { static int kulonbozo(int[,] matrix, int n, int rand) { int x = 1; for (int a = 0; a < n; a++) { for (int b = 0; b < n; b++) { if (matrix[a, b] == rand) { x = 0; break; } } } return x; } static void Main(string[] args) { Console.WriteLine("kerek negyzet oldalat"); int n = int.Parse(Console.ReadLine()); int[,] matrix = new int[n, n]; int rand; Random rnd = new Random(); for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { do { rand = rnd.Next(1, (n * n) + 1); } while (kulonbozo(matrix, n, rand) == 0); matrix[i, j] = rand; } } for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { Console.Write("{0,5}", matrix[i, j]); } Console.WriteLine(); } Console.ReadKey(); } } }
    Mutasd a teljes hozzászólást!
  • Több sebből is vérzik a feladat.
    A különbözőség vizsgálatra a függvényben azt kellene, hogyha már van egy egyezőség, akkor egyből visszatérni 0-val, nem kell már tovább pörgetni a ciklust.
    Jelen esetben teljesen mindegy, hogy megegyezik-e a tömb valamelyik elemével, az utolsó elem vizsgálata adja meg az x-nek a végleges értéket.
    Amúgy meg praktikusabb lenne bool-t használni (igaz/hamis), átláthatóbb.

    Ha már használsz a mátrix mellet segédtömböt is, akkor így is megvalósítható, külön írt függvény nélkül a tömb Contains metódusával:

    pl:

    class Program { static void Main(string[] args) { Random rnd = new Random(); Console.WriteLine("Kérem a négyzet oldalát: "); int n = int.Parse(Console.ReadLine()); int[,] matrix = new int[n, n]; int[] tmb = new int[n * n]; int v; int k = 0; for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { do v = rnd.Next(1, (n*n) + 1); while (tmb.Contains(v)); tmb[k] = v; matrix[i, j] = v; k++; } } for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { Console.Write("{0,5}", matrix[i, j]); } Console.WriteLine("\n"); } Console.ReadKey(); } }


    BIG W hozzászólása Revolver (11:51) részére előzmény | privát | 2012.09.29. 13:47 | válasz
    Mert nem az x-nek kell visszatérnie, hanem az n-nek...


    Mutasd a teljes hozzászólást!
  • Na igen ha ismernék több metódust akkor biztos meg tudtam volna oldani :))) Köszönöm szépen a megoldást
    Mutasd a teljes hozzászólást!
  • Neked egy véletlen permutációt kell előállítanod.

    Erre sokkal jobb megoldások léteznek, mint hogy vizsgálod hogy az adott véletlen generált szám már kijött-e.
    Elméletileg előfordulhat az is, hogy soha nem érsz az algoritmusod végére..

    C++ ban van ilyen függvény, .NET-ben nem találtam, de nem nagyon macerás implementálni. A linken kapásból látható példa implementáció. Könnyen átültethető C# nyelvre.
    shuffle

    Fisher-Yates shuffle algo
    Mutasd a teljes hozzászólást!
  • Ettől függetlenül AlterEgo_2 is jó választ adott, mert ő a példában ki is javította a függvényedet, pont amit kérdeztél, őt illetné a pont.

    Egy másik lehetőség még, ha már úgyis olyan tartományban generálunk véletlen számot, ahány elem lehet összesen, hogy a segédtömböt (ami lehet egy ArrayList, de inkább típusos List-et használjunk) arra használjuk hogy feltöltjük 0-tól n-1-ig számokkal, majd véletlen számként ennek a tömbnek egy sorszámát kapjuk, a sorszám mögötti elemet betesszük a mátrixba, majd töröljük az elemet, legközelebb a véletlenszám már eggyel kisebb tartományra néz.
    pl:


    class Program { static void Main(string[] args) { Random rnd = new Random(); Console.WriteLine("Kérem a négyzet oldalát: "); int n = int.Parse(Console.ReadLine()); int[,] matrix = new int[n, n]; List<int> tmb = new List<int>(); int v; for(int k=0; k < n*n;k++) { tmb.Add(k); } for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { v = rnd.Next(0, tmb.Count); matrix[i, j] = tmb[v]; tmb.RemoveAt(v); } } for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { Console.Write("{0,5}", matrix[i, j]); } Console.WriteLine("\n"); } Console.ReadKey(); }


    vagy ciklus nélkül feltölteni a segédtömböt:


    tmb.AddRange(Enumerable.Range(0, n*n));
    Mutasd a teljes hozzászólást!
  • Vagy a két megoldásod elegye ( ):

    class Program { static void Main(string[] args) { Console.WriteLine("kerek negyzet oldalat"); int n = int.Parse(Console.ReadLine()); int[,] matrix = new int[n, n]; int[] tmb = new int[n * n]; int rand; Random rnd = new Random(); for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { do { rand = rnd.Next(1, (n * n) + 1); } while (tmb[rand-1] == 1); matrix[i, j] = rand; tmb[rand-1] = 1; } } for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { Console.Write("{0,5}", matrix[i, j]); } Console.WriteLine(); } Console.ReadKey(); } }
    Mutasd a teljes hozzászólást!
  • Hogy a LINQ se maradjon ki (kezdem megszeretni ezt a nyelvet):

    class Program { static int kulonbozo(int[,] matrix, int rand) { var arrVals = from int val in matrix where val == rand select val; if (arrVals.Count() > 0) return 0; else return 1; } static void Main(string[] args) { Console.WriteLine("kerek negyzet oldalat"); int n = int.Parse(Console.ReadLine()); int[,] matrix = new int[n, n]; int rand; Random rnd = new Random(); for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { do { rand = rnd.Next(1, (n * n) + 1); } while (kulonbozo(matrix, rand) == 0); matrix[i, j] = rand; } } for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { Console.Write("{0,5}", matrix[i, j]); } Console.WriteLine(); } Console.ReadKey(); } }
    Mutasd a teljes hozzászólást!
Címkék
Tetszett amit olvastál? Szeretnél a jövőben is értesülni a hasonló érdekességekről?
abcd