Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C#: Tekstin rivittäminen maksimipituuden mukaan

Sivun loppuun

Hemuli1769 [18.02.2018 11:37:30]

#

Moro!

Eli homman nimi on se että pitäisi saada splitatusta merkkijonosta käytyä läpi jokainen sana ja sitä mukaan kun sana on käyty läpi, yhdistetään se edellisen sanan kanssa siihen asti kun asetettu merkkijonon pituusraja (esim. 10 merkkiä) tulee täyteen ja tulostetaan lopputulos sitten kun kaikki sanat on käyty läpi. Saan kyllä siis tuon läpikäynnin tehtyä mutta se paljoen yhdistäminen ei ota onnistuakseen.

Havainnollistus: Jos stringi on vaikka "Tämä on esimerkki lauseesta jossa on sanoja" splitataan välilyönneistä ja pituusrajoitin on se 10 merkkiä niin tulostus olisi jotakuinkin näin:

Tämä on
esimerkki
lauseesta
jossa on
sanoja

Eli sanojen pitää pysyä kokonaisina

Vastaus mielellään suoraan koodina kiitos :)

Hemuli1770 [18.02.2018 11:43:44]

#

Hemuli1769 kirjoitti:

Havainnollistus: Jos stringi on vaikka "Tämä on esimerkki lauseesta jossa on sanoja"

Mitä jos stringi on "lentokonesuihkuturbiinimoottori"?

Hemuli1769 kirjoitti:

Vastaus mielellään suoraan koodina kiitos :)

Laita oma yrityksesi suoraan koodina kiitos :)

Hemuli1769 [18.02.2018 14:03:56]

#

Asiallisia vastauksia kiitos...

Metabolix [18.02.2018 14:18:07]

#

Valmiin koodin pyytäminen koulutehtäviin on huono tapa. Asiallista on vähintäänkin näyttää oma yritys ja kertoa selvästi, mikä kohta siinä tuottaa vaikeuksia.

Edellä olevassa vastauksessa on sinänsä olennainen huomio, että et ole määritellyt pitkien sanojen käsittelyä. Jos sana on rajaa pidempi, laitetaanko se silti kokonaisena riville vai katkaistaanko?

C#:ssa tekstejä voi yhdistää +-merkillä. Käytännössä koodin toiminta tulisi suunnilleen tällaiseksi:

teksti = ""

käy läpi jokainen sana:
    jos tekstin pituus + sanan pituus > maksimi:
        tulosta teksti
        teksti = ""
    teksti = teksti + sana + " "

jos tekstin pituus > 0:
    tulosta teksti

Hemuli1769 [18.02.2018 16:48:40]

#

Tuossa nyt mitä siis olen saanut aikaiseksi, saattaa olla monesaskin suhteessa vajavainen mutta sen takia tässä apua kysellään että oppii :D


Ja siis jos sana on > maxpituus niin palautetaan -1

string[] sanat = Lause.Split(' ');
var palat = new List<string>();
string teksti = "";
int palaCount = 0;

foreach (var sana in sanat)
            {
                if (teksti.Length + sana.Length <= maxPituus)
                {
                    teksti = sana + " ";
                    palat.Add(teksti);
                    palaCount++;
                }

                else if (teksti.Length + sana.Length > maxPituus)
                {
                    return -1;
                }

                Console.WriteLine(teksti);
            }
            return 1;

Grez [18.02.2018 17:50:55]

#

Tuossa else if (...) -tarkistuksessasi tuo if (...) -osio on turha, koska tarkistat juuri päinvastaisen kuin mitä alkuperäisessä if:ssä.

Tuossa yrityksessäsi ei hirveästi ole kyllä järkeä tuon foreach-silmukan sisällä. Eli jätä foreach -silmukka ja mieti se sisältö uudelleen.

Pseudokoodinahan se olisi jotakuinkin näin

Käy sanat läpi:
- Jos sana on itsessään liian pitkä, lopeta ja anna -1
- Jos sana ei mahdu puskuriin:
   - Tulosta puskuri ja korvaa puskuri sanalla
- Muuten: lisää sana puskuriin
Lopuksi:
- Jos puskurissa on jotain, tulosta se.

Hemuli1769 [18.02.2018 18:12:23]

#

Grez kirjoitti:

- Jos sana ei mahdu puskuriin: ...

Tyhmä kysymys mutta tarkentaisitko mitä tarkoitat puskurilla?

Grez [18.02.2018 18:15:27]

#

Tuossa omassa koodissasi on muuttuja teksti, jota kutsuisin puskuriksi. Sinne siis on ilmeisesti tarkoitus kerätä yksi tai useampi sana odottamaan seuraavia kierroksia. (Nythän koodissasi ei niin tehdä, mutta olettaisin että tarkoitus olisi).

Toki tuo "ei mahdu puskuriin" on vähän huonosti sanottu, kun kyllähän se string-muuttujaan mahtuisi. Mutta siis jotenkin: jos jo kerättyjen sanojen ja käsiteltävän sanan pituus ylittäisi maksimipituuden.

Hemuli1769 [18.02.2018 19:09:37]

#

Kiitos vinkeistä, nyt toimii jo järkevämmin!


Sivun alkuun

Vastaus

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

Tietoa sivustosta