Miért nem működik az értékadásom? (c#, rövid)
Van egy véletlen számokkal feltöltött 5 elemű tömböm (kétszer ugyanaz a szám nem szerepel benne)a legnagyobb elemet utolsó helyre kell rakni és az utolsót a legnagyobb helyére, egyszerűen hangzik, de akkor sem jövök rá mi lehet a probléma
részlet :
(int[] tomb = new int[5];)
int max = tomb[0];
int csere = 0;
for (int j = 0; j < tomb.Length; j++)
{
for (int i = 0; i < tomb.Length - j - 1; i++)
{
if (tomb[i] > max)
{
max = tomb[i];
index = i;
}
csere = tomb[tomb.Length - 1];
tomb[index] = csere;
tomb[tomb.Length - 1] = max;
}
}
Mert így a legnagyobb elemet legutoljára beteszi, csakhogy a legnagyobb helyére nem teszi be az a utolsót, hanem ugyanúgy a "max" marad ott.
(Bocs ha elég triviális a probléma fáradt vagyok, csak eléggé idegeít)
A kérdező szemmel láthatóan a programozási tételeket tanulja, semmi haszna az eddigi, magas lóról odavetett és számára érthetetlen válaszokból.
Így ránézésre azt gondolom, hogy az értékadások rossz helyen vannak, a belső cikluson kívül kéne lenniük (a két záró } jel között).
using System;
namespace Test
{
class Program
{
static void Main(string[] args)
{
int[] tomb = new int[5] { 7, 6, 8, 3, 4 };
int maxIndex = 0;
int csere = 0;
for (int i = 0; i < tomb.Length; i++) {
if (tomb[maxIndex] < tomb[i]) {
maxIndex = i;
}
}
csere = tomb[tomb.Length - 1];
tomb[tomb.Length - 1] = tomb[maxIndex];
tomb[maxIndex] = csere;
foreach (int v in tomb) {
Console.Write("{0} ",v);
}
Console.WriteLine();
}
}
}
Kérdés, hogy te most mit is akarsz csinálni. Azt, amit leírtál a kérdésben, vagy maximumkiválasztásos rendezést (amire jobban hasonlít a kódod)?
Ha utóbbi, akkor számos probléma van. Nem az értékadással van probléma, hanem rosszul van megírva a program algoritmusa. Például:
- Az értékek kicserélését a külső ciklus végén kell végrehajtani, nem a belső ciklusban.
- Nem mindig az utolsó elemre kell kicserélni, hanem a külső ciklus minden lépésében az eggyel előrébb lévőt. (tomb.Length-1 helyett tomb.Length-j-1)
- A belső ciklust nem nem 0-tól kell kezdeni, hanem 1-től, és nem az utolsó előtti elemig, hanem az utolsóig (a legutolsó elemet is meg kell nézned, az-e a maximális elem, nemde? Ellenben az elsőt nem kell nézni, mert alapból az első van beállítva)
- A max, index változókat a külső ciklus elején mindig újra be kell állítani az első elemre (max = tomb[0] és index = 0).
A kód helyesen valahogy így néz ki:
int max = tomb[0];
int index = 0;
int csere = 0;
for (int j = 0; j < tomb.Length; j++)
{
    max = tomb[0];
    index = 0;
    for (int i = 1; i < tomb.Length - j; i++)
    {
        if (tomb[i] > max)
        {
            max = tomb[i];
            index = i;
        }
    }
    csere = tomb[tomb.Length - j - 1];
    tomb[index] = csere;
    tomb[tomb.Length - j - 1] = max;
}
Köszönöm szépen a segítségek, az utolsó válaszoló jól fején találta a szöget ez valóban a maximum kiválasztásos rendezés részlete (az akart volna lenni :)), köszönöm.
Lehet az a baj velem, hogy nem teljesen gondolom át mit is csinál egy-egy program részletem.
Kapcsolódó kérdések:
Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!