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 :)
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 :)
Asiallisia vastauksia kiitos...
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
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;
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.
Grez kirjoitti:
- Jos sana ei mahdu puskuriin: ...
Tyhmä kysymys mutta tarkentaisitko mitä tarkoitat puskurilla?
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.
Kiitos vinkeistä, nyt toimii jo järkevämmin!
Aihe on jo aika vanha, joten et voi enää vastata siihen.