C# forritun ToUpper vandræði

Skjámynd

Höfundur
Posus
Nýliði
Póstar: 24
Skráði sig: Þri 31. Ágú 2010 22:25
Reputation: 0
Staða: Ótengdur

C# forritun ToUpper vandræði

Pósturaf Posus » Sun 18. Mar 2012 20:23

Ég sé ekki hvað ég er að gera vitlaust í þessu alla fyrstu stafina í orðunum til þess að vera stórir en restinn litlir.

Error 1 Property or indexer 'string.this[int]' cannot be assigned to -- it is read only

Kóði: Velja allt

           
            string nafn = null, rettnafn = null;
           


            Console.WriteLine("Sláðu inn nafn");
            nafn = Console.ReadLine();


            nafn = nafn.ToLower();

            nafn[0] = char.ToUpper(nafn[0]);


            for (int i = 0; i <= nafn.Length;i++)
            {
                if (nafn[i-1] == ' ' && char.IsLower(nafn[i]))
                {
                    nafn[i] = char.ToUpper(nafn[i]);
                }
            }


            Console.ReadKey();
Síðast breytt af Posus á Fös 08. Jan 2016 19:16, breytt samtals 2 sinnum.



Skjámynd

appel
Stjórnandi
Póstar: 5592
Skráði sig: Fös 13. Jún 2003 16:46
Reputation: 1053
Staða: Ótengdur

Re: C# forritun ToUpper vandræði

Pósturaf appel » Sun 18. Mar 2012 20:29

Fullt af "out of bounds" villum þarna, og hví kemuru ekki með villuboðin sem koma?

Þú verður að passa að ekki sé reynt að vísa í element í arrayinu sem er ekki til.


*-*


Garri
1+1=10
Póstar: 1109
Skráði sig: Lau 31. Okt 2009 21:34
Reputation: 3
Staðsetning: Akureyri
Hafðu samband:
Staða: Ótengdur

Re: C# forritun ToUpper vandræði

Pósturaf Garri » Sun 18. Mar 2012 20:43

Lagaði kóðann aðeins til fyrir þig..

Eyddi sumu, færði sumt til og litaði annað. Skoðaðu þetta sjálfur fyrst.

Kóði: Velja allt

if nafn.length > 0 //Verður að prófa hvort eitthvað hafi verið slegið inn
{
  nafn = nafn.ToLower();  //Allt sett í lágstafi
  nafn[0] = char.ToUpper(nafn[0]);  //Fyrsti stafur settur sem hástafur
  if nafn.length > 1  //hvort lengd sé meiri en 1
    for (int i = 1; i < nafn.Length;i++)  //byrja á staki nr.2, ath! Má alls ekki telja til nafn.length því byrjað er að telja i núll
             if (nafn[i] == ' ' && char.IsLower(nafn[i])) //Í upprunalega kóða þá var hér verulega slæm villa, i-1 0 - 1 = 65535
                          nafn[i] = char.ToUpper(nafn[i]);
}
Síðast breytt af Garri á Sun 18. Mar 2012 20:54, breytt samtals 1 sinni.



Skjámynd

Höfundur
Posus
Nýliði
Póstar: 24
Skráði sig: Þri 31. Ágú 2010 22:25
Reputation: 0
Staða: Ótengdur

Re: C# forritun ToUpper vandræði

Pósturaf Posus » Sun 18. Mar 2012 20:53

villan sem að ég fæ er í
nafn[i] = char.ToUpper(nafn[i]);

Error 1 Property or indexer 'string.this[int]' cannot be assigned to -- it is read only




Garri
1+1=10
Póstar: 1109
Skráði sig: Lau 31. Okt 2009 21:34
Reputation: 3
Staðsetning: Akureyri
Hafðu samband:
Staða: Ótengdur

Re: C# forritun ToUpper vandræði

Pósturaf Garri » Sun 18. Mar 2012 20:55

Posus skrifaði:villan sem að ég fæ er í
nafn[i] = char.ToUpper(nafn[i]);

Error 1 Property or indexer 'string.this[int]' cannot be assigned to -- it is read only

Lastu ekki innleggið sem ég setti inn?



Skjámynd

Höfundur
Posus
Nýliði
Póstar: 24
Skráði sig: Þri 31. Ágú 2010 22:25
Reputation: 0
Staða: Ótengdur

Re: C# forritun ToUpper vandræði

Pósturaf Posus » Sun 18. Mar 2012 21:09

Svona lítur hann út hjá mér núna en þessi villa er enn hangandi inni


Kóði: Velja allt

            string nafn = null, rettnafn = null;
           


            Console.WriteLine("Sláðu inn nafn");
            nafn = Console.ReadLine();

            if (nafn.Length > 0)
            {
                nafn = nafn.ToLower();

                nafn[0] = char.ToUpper(nafn[0]);//hérna

                if (nafn.Length > 1)
                {
                    for (int i = 1; i < nafn.Length; i++)
                    {
                        if (nafn[i] == ' ')
                        {
                            nafn[i+1] = char.ToUpper(nafn[i]);//hérna
                        }
                    }
                }
            }


            Console.ReadKey();




Garri
1+1=10
Póstar: 1109
Skráði sig: Lau 31. Okt 2009 21:34
Reputation: 3
Staðsetning: Akureyri
Hafðu samband:
Staða: Ótengdur

Re: C# forritun ToUpper vandræði

Pósturaf Garri » Sun 18. Mar 2012 21:19

Afhverju ertu með nafn[i+1] þarna inni?

Og hvað á þessi lína að þýða?

if (nafn[i] == ' ')

Ef þú ert að reyna að hækka í upcase á eftir bili, þá þarftu að bæta inn í kóðan öðru iffi
Síðast breytt af Garri á Sun 18. Mar 2012 21:24, breytt samtals 1 sinni.



Skjámynd

Höfundur
Posus
Nýliði
Póstar: 24
Skráði sig: Þri 31. Ágú 2010 22:25
Reputation: 0
Staða: Ótengdur

Re: C# forritun ToUpper vandræði

Pósturaf Posus » Sun 18. Mar 2012 21:23

Garri skrifaði:Afhverju ertu með nafn[i+1] þarna inni?

Og hvað á þessi lína að þýða?

if (nafn[i] == ' ')



hún er til þess að finna bil og ef að það er bil þá á að skipta út fyrsta stafinum efrtir bilið í stóran staf

t.d
Halló ég er

Halló Ég Er




Garri
1+1=10
Póstar: 1109
Skráði sig: Lau 31. Okt 2009 21:34
Reputation: 3
Staðsetning: Akureyri
Hafðu samband:
Staða: Ótengdur

Re: C# forritun ToUpper vandræði

Pósturaf Garri » Sun 18. Mar 2012 21:27

ok..

Kóði: Velja allt

            string nafn = null, rettnafn = null;
           


            Console.WriteLine("Sláðu inn nafn");
            nafn = Console.ReadLine();

            if (nafn.Length > 0)
            {
                nafn = nafn.ToLower();

                nafn[0] = char.ToUpper(nafn[0]);

                if (nafn.Length > 1)
                    for (int i = 1; i < nafn.Length; i++)
                        if (nafn[i] == ' ') && (nafn.length > (i+1))  //&& = And
                            nafn[i+1] = char.ToUpper(nafn[i+1]);
               
            }



Skjámynd

Höfundur
Posus
Nýliði
Póstar: 24
Skráði sig: Þri 31. Ágú 2010 22:25
Reputation: 0
Staða: Ótengdur

Re: C# forritun ToUpper vandræði

Pósturaf Posus » Sun 18. Mar 2012 21:38

ef að það hjálpar eitthvað þá er lýsingin á verkefninu

Búið til forrit sem spyr notanda að nafni. Forritið svarar síðan notandanum en gætir þess að
fyrsti stafur í hverju nafni sé hástafur en aðrir stafir lágstafir.
Dæmi:
HALLUR KARLSSON
verður Hallur Karlsson
og
hallur karlsson
verður Hallur Karlsson
og
haLLur einar KArlsson
veður Hallur Einar Karlsson




Garri
1+1=10
Póstar: 1109
Skráði sig: Lau 31. Okt 2009 21:34
Reputation: 3
Staðsetning: Akureyri
Hafðu samband:
Staða: Ótengdur

Re: C# forritun ToUpper vandræði

Pósturaf Garri » Sun 18. Mar 2012 21:41

Yebb.. það hefði hjálpað okkur að leysa verkefnið fyrir þig, en þú hefðir ekkert lært af því.

Betra að fá aðstoð við eitthvað sem maður "sér" ekki sama hversu mikið maður rýnir, leysa síðan hugverkið sjálfur.



Skjámynd

Höfundur
Posus
Nýliði
Póstar: 24
Skráði sig: Þri 31. Ágú 2010 22:25
Reputation: 0
Staða: Ótengdur

Re: C# forritun ToUpper vandræði

Pósturaf Posus » Sun 18. Mar 2012 21:43

Þegar að maður festist þá getur maður ekki gert neitt annað en að leita sér að aðstoð og lært af því




Garri
1+1=10
Póstar: 1109
Skráði sig: Lau 31. Okt 2009 21:34
Reputation: 3
Staðsetning: Akureyri
Hafðu samband:
Staða: Ótengdur

Re: C# forritun ToUpper vandræði

Pósturaf Garri » Sun 18. Mar 2012 21:50

Posus skrifaði:Þegar að maður festist þá getur maður ekki gert neitt annað en að leita sér að aðstoð og lært af því

Vissulega..

Sýnist þetta vera komið eins og ég setti þetta inn síðast.

Það sem ég mundi skoða í þínum sporum er hvers vegna i-1 var svona mikið rosa villa. Þú byrjaðir að telja i=0 og dróst samt frá i-1 í lúppunni. Ef i er 16bita tala og alveg sama þótt hún sé "sign" eða með 1 bita sem mínus merki, þá verður hún að risa tölu í cpu-rekistríunum eða 65535 (hex = $FFFF)

Loks. Alltaf að tékka á jaðarskilyrðum. Ef ekkert er slegið er inn. Ef bara einn stafur er sleginn inn, bara bil, mörg bil osfv.

Annars, þá var mikið af villum þarna. Þú þarft greinilega að læra að sjá fyrir þér hólfin í array-inu og lesa kóðann með þá mynd í kollinum.

Annars hef ég alltaf verið á móti C, forritaði í því fyrir c.a. 25 árum og einmitt ein af þeim ástæðum að ég er á móti C er sú gegnheila heimska að byrja að telja í 0

Varla til minni rökhyggja en að byggja heilt forritunarmál sem gengur út á rökhyggju á jafn mikilli ó-rökhyggju.




Garri
1+1=10
Póstar: 1109
Skráði sig: Lau 31. Okt 2009 21:34
Reputation: 3
Staðsetning: Akureyri
Hafðu samband:
Staða: Ótengdur

Re: C# forritun ToUpper vandræði

Pósturaf Garri » Sun 18. Mar 2012 22:19

Loks..

Svona leysti ég þetta í Delphi

Kóði: Velja allt

PROCEDURE TForm1.Button1Click(Sender: TObject);
  VAR
    Str_Nafn          : STRING;
    i                 : INTEGER;
BEGIN
  Str_Nafn := Edit1.TEXT;
  IF Length(Str_nafn) > 0 THEN
  BEGIN
    Str_Nafn := Str_LoCase (Str_nafn);
    Str_Nafn[1] := UpCase(Str_Nafn[1]);
    IF (Length(Str_Nafn) > 1) THEN
      FOR i := Length(Str_Nafn) - 1  DOWNTO 2 DO
        IF (Str_Nafn[i] = ' ') THEN
          Str_Nafn[i+1] := UpCase(Str_Nafn[i+1]);
    Edit1.Text := Str_Nafn;
  END;
END;


Munurinn á þessu og C er að lógíkin skín í gegn að sjálfu sér. Str_Nafn[1] er fyrsta stak í array. Ég byrja á næst aftasta stakinu þar sem að ég veit að array-ið er lengra en 1 stak, það er, tvö eða fleiri. Enda í staki númer 2 og eins og þú, hækka alltaf fyrsta stak í hástaf. Þessi rútína ræður við næstum allar uppákomur, byrjar á bili, endar á bili (villa ef þú endar á tveimur bilum) osfv.
Síðast breytt af Garri á Sun 18. Mar 2012 23:13, breytt samtals 1 sinni.



Skjámynd

hagur
Besserwisser
Póstar: 3120
Skráði sig: Mið 17. Des 2003 16:11
Reputation: 454
Hafðu samband:
Staða: Ótengdur

Re: C# forritun ToUpper vandræði

Pósturaf hagur » Sun 18. Mar 2012 22:26

Úúúúú, Delphi. Fyrsta forritunarmálið sem ég gerði eitthvað af viti í. Delphi 3,4 og 5 í kringum aldamótin síðustu.

Hvernig er Delphi í dag? Er alveg kominn yfir í C# og elska það.

EDIT: Svona myndi ég leysa þetta í C#:

Kóði: Velja allt

      static void Main(string[] args)
      {
         Console.WriteLine("Sláðu inn nafn:");
         string name = Console.ReadLine();
         if (!String.IsNullOrEmpty(name))
         {
            string[] nameparts = name.ToLower().Split(" ".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);

            for (int i = 0; i < nameparts.Length; i++)
            {
               nameparts[i] = nameparts[i].Substring(0, 1).ToUpper() + nameparts[i].Substring(1);
            }

            Console.WriteLine(String.Format("Sæll {0}", String.Join(" ", nameparts)));
         }
         else
         {
            Console.WriteLine("Ekkert nafn slegið inn!");
         }

         Console.ReadKey();
      }


Getur borið þetta saman við lausnirnar sem þú ert þegar með.
Síðast breytt af hagur á Sun 18. Mar 2012 22:44, breytt samtals 1 sinni.




Garri
1+1=10
Póstar: 1109
Skráði sig: Lau 31. Okt 2009 21:34
Reputation: 3
Staðsetning: Akureyri
Hafðu samband:
Staða: Ótengdur

Re: C# forritun ToUpper vandræði

Pósturaf Garri » Sun 18. Mar 2012 22:34

hagur skrifaði:Úúúúú, Delphi. Fyrsta forritunarmálið sem ég gerði eitthvað af viti í. Delphi 3,4 og 5 í kringum aldamótin síðustu.

Hvernig er Delphi í dag? Er alveg kominn yfir í C# og elska það.

Þetta er reyndar orðinn sama grauturinn í aðeins öðruvísi skál.

API gerir það að verkum að Delphi hefur þurft að aðlagast að C-bullinu sem og talningu frá 0 í nánast öllu, enn sem komið er, fyrir utan strengi.

Þessi mál er mjög lík í dag. Einhver smá munur á objectum og multi-inheritance ef ég man rétt, skilst að C# sjái betur um garbage collection og class creation eins og í Java, það er, sjálfvirkt en síðan er allt að breytast með nýjustu afurðum frá Embarcaderio, það er, Delphi XE2

En sú afurð er svo sannanlega að blása nýju lífi í Delphi

Allskonar platform eins og 64 bita, Linux, Mac OS, Android, iPhone osfv.

Delphi XE2
Embarcadero® Delphi® XE2, now with FireMonkey™, is the fastest way to deliver ultra-rich and visually stunning native applications for Windows, Mac and iOS – including 64-bit Windows applications. Dramatically reduce coding time and build applications 5x faster. Delphi XE2 provides component-based visual development and a fully visual two-way RAD IDE with high performance access to popular databases.

Og síðan er VCL-ið alveg hreint magnað og mikið til af kóða




coldcut
Vaktari
Póstar: 2192
Skráði sig: Mið 21. Nóv 2007 02:25
Reputation: 0
Staðsetning: /dev/random
Staða: Ótengdur

Re: C# forritun ToUpper vandræði

Pósturaf coldcut » Sun 18. Mar 2012 22:39

@Posus

Í hvaða skóla ertu að gera þetta verkefni?



Skjámynd

tdog
Vaktari
Póstar: 2012
Skráði sig: Mán 06. Des 2010 17:32
Reputation: 24
Staða: Ótengdur

Re: C# forritun ToUpper vandræði

Pósturaf tdog » Sun 18. Mar 2012 22:46

Ég myndi byrja á því að gera alla stafina litla. Og síðan þann fyrsta í hverju orði stóra.

Kóði: Velja allt

private string TurnFirstToUpper(string input)
{
string temp = input.Substring(0,1);
return temp.ToUpper() + input.Remove(0,1);
}




SteiniP
Bara að hanga
Póstar: 1573
Skráði sig: Mán 16. Jún 2008 21:54
Reputation: 1
Hafðu samband:
Staða: Ótengdur

Re: C# forritun ToUpper vandræði

Pósturaf SteiniP » Mán 19. Mar 2012 00:00

Upprunalega villan er einfaldlega vegna þess að strengir eru ekki "mutable" í C# (þ.e. þú getur ekki breytt þeim eftir að þeir eru búnir til). Ef þú ætlar að skipta út fyrsta stafnum, þá þarftu að búa til nýjann streng með breytingunni + hluta af fyrrir strengnum.

hagur skrifaði:
EDIT: Svona myndi ég leysa þetta í C#:

Kóði: Velja allt

      ...snip....


Getur borið þetta saman við lausnirnar sem þú ert þegar með.


Myndi gera fall úr þessu. Mér finnst alltaf voða ljótt að henda svona stórum blokkum inn í if setningu.

Svona myndi ég tækla þetta.

Kóði: Velja allt

        static string Capitalize(string value){
            string result = "";
            if (string.IsNullOrWhiteSpace(value)){
                //tómur strengur eða bara bil = gerum ekki neitt
                return result;
            }
            string[] words = value.ToLower().Split(" ".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);

            for(int i=0;i<words.Length;i++){           
                string firstchar = words[i].Substring(0,1);
                result += firstchar.ToUpper() + words[i].Substring(1);
                if (i < words.Length){
                    result += " "; //setja bil á milli orða
                }
            }
            return result;
        }



Skjámynd

Frantic
FanBoy
Póstar: 797
Skráði sig: Mið 04. Mar 2009 17:43
Reputation: 6
Staða: Ótengdur

Re: C# forritun ToUpper vandræði

Pósturaf Frantic » Mán 19. Mar 2012 13:02

Það er alltof langt síðan ég notaði C# svo maður er smá ryðgaður en þetta virkar:

Kóði: Velja allt

        static void Main(string[] args)
        {
            string nafn = "";
            string newNafn = "";

            Console.Write("Skrifaðu nafn: ");
            nafn = Console.ReadLine(); // Taka inn nafnið.

            for (int i = 0; i < nafn.Length; i++) // Rúlla í gegnum alla stafina í streng.
            {
                if (i == 0 || nafn[i - 1] == ' ') // Ef þetta er fyrsti stafurinn í streng EÐA það var bil á undan þessum staf sem við erum að rúlla í gegnum for lúppuna
                {
                    newNafn += char.ToUpper(nafn[i]); // If setning jákvæð og stafur stækkaður.
                }
                else
                {
                    newNafn += char.ToLower(nafn[i]); // If setning neikvæð og stafur er lækkaður.
                }
               
            }
            Console.WriteLine("Nafnið: " + newNafn); // Skrifa út nafnið
            Console.ReadLine(); // Stoppa forritið
        }



Skjámynd

dori
Besserwisser
Póstar: 3606
Skráði sig: Fim 12. Feb 2009 10:46
Reputation: 142
Staða: Ótengdur

Re: C# forritun ToUpper vandræði

Pósturaf dori » Mán 19. Mar 2012 13:30

Rosa fínt að nota python...

Kóði: Velja allt

nafn = raw_input("Nafn: ")
nafn = nafn.title()

:troll

Ég veit að þetta er skóladæmi og það er verið að kanna basic þekkingu. Ég veit líka að C# er með svipaða hluti innbyggða.




codec
Vélbúnaðarníðingur
Póstar: 342
Skráði sig: Fös 07. Ágú 2009 12:53
Reputation: 17
Staða: Ótengdur

Re: C# forritun ToUpper vandræði

Pósturaf codec » Mán 19. Mar 2012 15:01

Ég myndi nota string builder, þetta hér fall er líklega eitthvað hraðari:


public static string TitleCapsStringBuilder(string value)
{
if( value == null )
throw new ArgumentNullException("value");
if( value.Length == 0 )
return value;

StringBuilder result = new StringBuilder(value);
result[0] = char.ToUpper(result[0]);
for( int i = 1; i < result.Length; ++i )
{
if( char.IsWhiteSpace(result[i - 1]) )
result[i] = char.ToUpper(result[i]);
}
return result.ToString();
}




Skjámynd

Frantic
FanBoy
Póstar: 797
Skráði sig: Mið 04. Mar 2009 17:43
Reputation: 6
Staða: Ótengdur

Re: C# forritun ToUpper vandræði

Pósturaf Frantic » Mán 19. Mar 2012 15:39

codec skrifaði:Ég myndi nota string builder, þetta hér fall er líklega eitthvað hraðari:


public static string TitleCapsStringBuilder(string value)
{
if( value == null )
throw new ArgumentNullException("value");
if( value.Length == 0 )
return value;

StringBuilder result = new StringBuilder(value);
result[0] = char.ToUpper(result[0]);
for( int i = 1; i < result.Length; ++i )
{
if( char.IsWhiteSpace(result[i - 1]) )
result[i] = char.ToUpper(result[i]);
}
return result.ToString();
}



Þetta er nú bara til að flækja málin fyrir honum.
Þar sem hann þyrfti að geta skilið kóðann sem hann á að skila þá bendi ég á núbbavæna lausn mína hér




Garri
1+1=10
Póstar: 1109
Skráði sig: Lau 31. Okt 2009 21:34
Reputation: 3
Staðsetning: Akureyri
Hafðu samband:
Staða: Ótengdur

Re: C# forritun ToUpper vandræði

Pósturaf Garri » Mán 19. Mar 2012 16:12

Það er greinilegt að forritun er ástríða hjá fleirum en mér..

Og gaman að sjá mismunandi lausnir hér, lausnin hjá JoaKulp er í raun réttasta lausnin miðað við þetta verkefni. Hugsa að verkefnið sé að hluta að kenna á array/string í C#

Réttasta allavega út frá CPU-tíma. Nokkuð nálægt hámörkun nema farið sé í að maska innput sem er allt annað verkefni. Hann rúllar bara einu sinni í gegnum array-ið, breytir í hástaf ef fyrsta eða bil var á stakinu fyrir undan annars breytir hann í lágstafi. Lausnin mín í delphi rúllar tvisvar í gegnum arrayið, fyrst þegar hún breytir öllum stökum í því í lágstafi og síðan þegar fyrsti og stafar á eftir bili breytist í hástaf.

Lausn upphafshöfundar eða hugverk hans er engu að síður framkvæmanlegt og sjálfsagt að virða hans verkfræði og hjálpa honum með það sem upp á vantar.

En ég verð að viðurkenna að ég kveiki ekki alveg á afhverju sett eru blokkar merki á hverja einustu skipun á eftir if, er það nauðsyn í C# /C-sharp ?

Loks. Þetta með að strengir séu ekki breytanlegir. Er það til að styðja þræði (threads)? Að þá þurfi ekki að læsa þessum "smá" breytum/klössum þegar unnið er með þá í þráðum. Vekur samt upp spurningar hjá mér hvort ekki sé hægt að búa til "static" ( breytur af strengum í C#

Sé að þekking mín í C dugar ekki fyrir C-sharp og þess vegna sótt ég myndbönd í morgun sem ég ætla að rúlla yfir þegar tími gefst á næstunni. Annars, er það rétt tilfinning hjá mér (eftir þennan þráð) að C# sé algjörlega og eingöngu klassa drifið forritunarmál?



Skjámynd

dori
Besserwisser
Póstar: 3606
Skráði sig: Fim 12. Feb 2009 10:46
Reputation: 142
Staða: Ótengdur

Re: C# forritun ToUpper vandræði

Pósturaf dori » Mán 19. Mar 2012 16:26

Ég þekki C# reyndar ekki vel en ég er nokkuð viss um að það sé allt byggt á klössum en hafi samt fengið slatta af functional goodies í síðari útgáfum.