Síða 1 af 3

C# forritun ToUpper vandræði

Sent: Sun 18. Mar 2012 20:23
af Posus
É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();

Re: C# forritun ToUpper vandræði

Sent: Sun 18. Mar 2012 20:29
af appel
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.

Re: C# forritun ToUpper vandræði

Sent: Sun 18. Mar 2012 20:43
af Garri
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]);
}

Re: C# forritun ToUpper vandræði

Sent: Sun 18. Mar 2012 20:53
af Posus
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

Re: C# forritun ToUpper vandræði

Sent: Sun 18. Mar 2012 20:55
af Garri
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?

Re: C# forritun ToUpper vandræði

Sent: Sun 18. Mar 2012 21:09
af Posus
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();

Re: C# forritun ToUpper vandræði

Sent: Sun 18. Mar 2012 21:19
af Garri
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

Re: C# forritun ToUpper vandræði

Sent: Sun 18. Mar 2012 21:23
af Posus
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

Re: C# forritun ToUpper vandræði

Sent: Sun 18. Mar 2012 21:27
af Garri
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]);
               
            }

Re: C# forritun ToUpper vandræði

Sent: Sun 18. Mar 2012 21:38
af Posus
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

Re: C# forritun ToUpper vandræði

Sent: Sun 18. Mar 2012 21:41
af Garri
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.

Re: C# forritun ToUpper vandræði

Sent: Sun 18. Mar 2012 21:43
af Posus
Þ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í

Re: C# forritun ToUpper vandræði

Sent: Sun 18. Mar 2012 21:50
af Garri
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.

Re: C# forritun ToUpper vandræði

Sent: Sun 18. Mar 2012 22:19
af Garri
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.

Re: C# forritun ToUpper vandræði

Sent: Sun 18. Mar 2012 22:26
af hagur
Úúúúú, 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ð.

Re: C# forritun ToUpper vandræði

Sent: Sun 18. Mar 2012 22:34
af Garri
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

Re: C# forritun ToUpper vandræði

Sent: Sun 18. Mar 2012 22:39
af coldcut
@Posus

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

Re: C# forritun ToUpper vandræði

Sent: Sun 18. Mar 2012 22:46
af tdog
É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);
}

Re: C# forritun ToUpper vandræði

Sent: Mán 19. Mar 2012 00:00
af SteiniP
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;
        }

Re: C# forritun ToUpper vandræði

Sent: Mán 19. Mar 2012 13:02
af Frantic
Þ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ð
        }

Re: C# forritun ToUpper vandræði

Sent: Mán 19. Mar 2012 13:30
af dori
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.

Re: C# forritun ToUpper vandræði

Sent: Mán 19. Mar 2012 15:01
af codec
É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();
}


Re: C# forritun ToUpper vandræði

Sent: Mán 19. Mar 2012 15:39
af Frantic
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

Re: C# forritun ToUpper vandræði

Sent: Mán 19. Mar 2012 16:12
af Garri
Þ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?

Re: C# forritun ToUpper vandræði

Sent: Mán 19. Mar 2012 16:26
af dori
É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.