Kirjautuminen

Haku

Tehtävät

Kilpailu

Algoritmikisa
Putka Open 2020 -kisan
Finalistit julkaistaan pian...

Keskustelu: Ohjelmointiongelmat: C# - Array ja int.Parse

Sivu 1 / 1

Sivun loppuun

Alkukoodari [13.09.2020 07:19:55]

#

Terve,

koulutehtävän kanssa ongelmia. Pitäisi kirjoittaa ohjelma, joka lajittelee luvut pienimmästä suurimpaan (bubble sort). Itse lajittelun kanssa ei (kaiketi) ole ongelmaa, mutta en saa niitä ruudulle asti. Ruudulle saan vain argumenttien määrän verran nollia - "0 0 0 0 .. ". Vinkkinä tarjottiin, että

Hint: prepare an int array with the same size as string args length (use args.Length). Use foreach statement to traverse through all arguments and use int.Parse(argument) to convert the data to int and assign to the prepared int array.

Olen sen verran tuota nyt pyöritellyt, etten enää edes tiedä mitä olen pyöritellyt. Alla viimeisin versio koodista, joka antaa virheen CS1503: "Argument 1: cannot convert from 'string[]' to 'System.ReadOnlySpan<char>'".

Mitenkähän tuon taulukon kääntö intiksi foreachin avulla muka käy - olettaen että ylipäätään se tässä ongelma on?

using System;

namespace BubbleSort
{
    class Bubblesort
    {

        public static void Main(string[] args)
        {

            int[] iLista = new int[args.Length];
            int iValilista;

            foreach (int iX in iLista)
            {
                int.Parse(args);
            }

            for (int i = 0; i < iLista.Length; i++)
            {

                for (int k = 0; k < iLista.Length; k++)
                {
                    if (iLista[i] < iLista[k])
                    {
                        iValilista = iLista[i];
                        iLista[i] = iLista[k];
                        iLista[k] = iValilista;
                    }

                }

            }

            for (int i = 0; i < iLista.Length; i++)
            {
                Console.Write(iLista[i] + " ");
            }

        }

    }
}

Metabolix [13.09.2020 08:07:44]

#

Vika piilee rivillä int.Parse(args), joka ei tee mitään järkevää. Sinun pitäisi saada yksi kohta args-taulukosta vastaavaan kohtaan iLuvut-taulukkoon, eli tarvitset riville ainakin indeksejä ja sijoituksen, ja foreach ei oikein sovellu silloin.

Alkukoodari [13.09.2020 09:42:20]

#

No juu, kiitosta vaan. Juutuin nyt aivan liikaa tuohon tehtävänannon vihjeeseen, että olisi hyvä käyttää foreachia. Laitoin foreachin tilalle

for (int iX = 0; iX < args.Length; iX++)
            {
                iLista[iX] = int.Parse(args[iX]);
            }

Onko tuo nyt sitten paras tapa - siitä en tiedä, mutta ainakin se nyt toimii.

Metabolix [13.09.2020 11:26:19]

#

Enpä tosiaan tiedä, miksi tuossa ehdotetaan foreach-silmukkaa tähän tilanteeseen. Käytännössä foreach sopii, jos halutaan käydä läpi yhden taulukon arvot ja indekseillä ei ole merkitystä. Tavallaan foreachilla voisi kyllä käydä args-taulukon läpi, mutta pitäisi olla silti erikseen laskuri, jotta luvut saataisiin iLista-taulukkoon oikein. Tai voihan toki C#:ssa olla jokin hieno niksi, jota en tunne.

Grez [14.09.2020 08:24:57]

#

Sinänsä muunnos onnistuu esim

var lista = Array.ConvertAll(args, a => int.Parse(a));

Tuossa tehtävässä on tietenkin tarkoitus opetella bubble sortia ja ilmeisesti varsinainen C# ja .Net frameworkin opettaminen on tarkoitus tehdä sitten myöhemmin. Yleisesti ottaen kuitenkin kannattaa huomata, että ilman vahvasti perusteltua syytä ei tulisi itse implementoida lajittelualgoritmia. Jos C#:ssa tarvitsee ihan vaan saada syötteet lajiteltua, niin tarpeen saa ratkaistua yksinkertaiseti:

var lajiteltu = args.Select(a => int.Parse(a)).OrderBy(a => a).ToArray();

Huomaan myös että on ilmeisesti käytetty unkarilaista notaatiota (iLista eikä lista), jota ei yleensä suositella käytettäväksi C#-projekteissa.

Alkukoodari [16.09.2020 06:31:15]

#

Jollain youtube-videolla oman lajittelualgoritmin vääntämistä kutsuttiinkin "idiootin hommaksi" tai jotain tuonne päin. Tässä vaiheessa kurssia ei kuitenkaan ollut mitään tietoa OrderBystä ja harjoituksen nimi oli "Bubble sort", niin sillä mentiin. OrderByä en kyllä toimimaan saanut - en siis edes googletettujen esimerkkien avulla. Saisitko väännettyä rautalangasta? ConvertAll hoiti kyllä hommansa.

Unkarilaisen notaation käyttö tuli itselleni jostain 10 vuoden takaa kun ensimmäisen - tai ehkä toisen - kerran yritin enemmän tosissaan ohjelmointia opetella. Jossain tätä hehkutettiin "hyväksi tavaksi" niin käyttöönhän se tuli. Kieltä en kyllä muista, että saattoipa olla jokin muu kuin C#. Pitää kaiketi tuosta sitten luopua. Näyttää Torvaldskin luonnehtivan tapaa "aivovaurioituneeksi".

Oli nyt joka tapauksessa miten oli... veikkaan, että tässä tulee useampi typerä kysymys koskien näitä tehtäviä, niin olisiko uusien ketjujen avaamisen sijaan fiksuinta vain jatkaa tähän perään ja rukata otsikkoa johonkin vähän kuvaavampaan muotoon ("Typeriä kysymyksiä koulutehtävistä" tmv)?

Grez [16.09.2020 08:24:50]

#

Alkukoodari kirjoitti:

OrderByä en kyllä toimimaan saanut - en siis edes googletettujen esimerkkien avulla. Saisitko väännettyä rautalangasta?

Tässä kokonaisuudessaan Program.cs joka toimii .Net Framework 3.5 tai uudemmassa

Ja tämä olisi siis yksinkertainen ratkaisu siihen, miten argumentit saa tulostettua nuemrojärjestyksessä. Tätä ei tietenkään voi käyttää vastauksena tehtävään "miten lajittelen ja tulostan luvut käyttäen bubble sortia".

Eli ottaa argumentit, muuttaa ne kokonaisluvuiksi, järjestää suuruusjärjestykseen ja tulostaa välilyönnillä eroteltuina.

using System;
using System.Linq;

namespace ConsoleApp
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine(string.Join(" ",
                args.Select(a => int.Parse(a)).OrderBy(a => a)
                ));
        }
    }
}

Alkukoodari kirjoitti:

olisiko uusien ketjujen avaamisen sijaan fiksuinta vain jatkaa tähän perään ja rukata otsikkoa johonkin vähän kuvaavampaan muotoon ("Typeriä kysymyksiä koulutehtävistä" tmv)?

En näe että sellaisesta "keräilyketjusta" olisi vastaavien ongelmien kanssa paniville mitään iloa. Eli minusta olisi parempi (sen jälkeen kun ongelma ei tosiaan kovan yrittämisenkään jälkeen itse ratkea) tehdä vaan hyvin otsikoitu uusi ketju juuri siitä uudesta ongelmasta.

Itse toki olen vain tavallinen keskustelija ja tuo on vain minun mielipiteeni.

The Alchemist [17.09.2020 18:36:12]

#

Alkukoodari kirjoitti:

Jollain youtube-videolla oman lajittelualgoritmin vääntämistä kutsuttiinkin "idiootin hommaksi" tai jotain tuonne päin. Tässä vaiheessa kurssia ei kuitenkaan ollut mitään tietoa OrderBystä ja harjoituksen nimi oli "Bubble sort", niin sillä mentiin.

Kannattaa toki ymmärtää harjoitustehtävän ja oikean sovelluksen ero. Itsekään en tunne lajittelualgoritmeja nimeltä kovin hyvin – muistan ulkoa vain juuri kuplalajittelun – mutta kyllä tietojenkäsittelyn perusteisiin tulee osata jollain tasolla koodata edes yksi järkevä lajittelualgoritmi.

Opiskelun tasosta riippuen ne ovat esillä kai ainakin pseudokoodin tasolla, mutta pseudokoodi ei usein mäppäydy 1:1 ihan mille tahansa todelliselle ohjelmointikielelle.


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta