Vinnaren i pepparkakshustävlingen!
  • 1
  • 2
2017-04-20, 12:13
  #13
Medlem
Citat:
Ursprungligen postat av John-Paul
Du måste validera användarens input om du vill undvika fel, använd metoden som heter TryParse när du vill typkonvertera värdetyper (och undvik att fånga fel slentrianmässigt)
https://msdn.microsoft.com/en-us/library/bb397679.aspx

Edit: Tvåa på bollen.

De är tryparse jsg använt, men de blir fortfarande tokfel
Citera
2017-04-20, 12:38
  #14
Moderator
Protons avatar
Citat:
Ursprungligen postat av valdo
De är tryparse jsg använt, men de blir fortfarande tokfel
Hur ser koden ut i nuvarande skick och vad blir fel?

Har du läst mitt föregående inlägg om att kommentera ut kod?
Citera
2017-04-20, 16:17
  #15
Medlem
Citat:
Ursprungligen postat av Proton
Hur ser koden ut i nuvarande skick och vad blir fel?

Har du läst mitt föregående inlägg om att kommentera ut kod?


Jorå! läste ditt svar! detta är hur min kod är nu:
Kod:
{
    class Program
    {
        static int ytilld(int ålder)
        {

            int dagar = ((ålder * 365));
            return dagar;


        }
        static void Main(string[] args)
        {

            Console.ForegroundColor = ConsoleColor.Yellow;
            Console.Write("Skriv in din ålder för att räkna ut den i dagar: ");             // skriver man ej ålder i siffror crashar hela programmet
            int dagar = Convert.ToInt32(Console.ReadLine());
            int ålder = ytilld(dagar);                                                // -Fel som uppstod: ålder var skriven i parantesen vilket gav felmeddelandet " Use of unassigned local variable "ålder" , lösning: Sätta "dagar" i parantesen för fullt sammanhang

            // Int32.TryParse(Console.ReadLine(), out dagar);

            Console.WriteLine(dagar + " år gör dig till " + ålder + " dagar gammal ");
            Console.ReadLine();
            Console.WriteLine(" Nu ska vi räkna ut hur många sekunder du levt! ");
            Console.ReadLine();

            
            try
            {
                
                Console.WriteLine(" ... och då blir du ungefär såhär många sekunder gammal: " + 86400 * ålder);
                dagar = Convert.ToInt32(Console.ReadLine());
                                                                                                                   // Räknar ut Åldern i sekunder genom att ta Åldern i dagar multiplicerat med antalet sekunder på ett dygn vilket är 24 timmar
            }                                                                                                      // 24 timmar = 86 400 sekunder * ÅLDER I DAGAR                      
            catch (FormatException) { 
            {
                Console.WriteLine("Bara bokstäver! :( ");
            }
            
            

                Console.ReadKey();
            }
        }
    }
}

Vad jag inte vill ha är detta: http://imgur.com/a/kS9Wk så fort man skriver något annat en siffror, de är det som är hela poängen, att felmeddelandet ska vara något anvädarvänligt som kommer längre ner i min kod, men jag får helt enkelt inte till det o jag vet inte vad jag ska ändra på
__________________
Senast redigerad av Proton 2018-01-21 kl. 11:11.
Citera
2017-04-20, 16:41
  #16
Medlem
Citat:
Ursprungligen postat av John-Paul
Du måste validera användarens input om du vill undvika fel, använd metoden som heter TryParse när du vill typkonvertera värdetyper (och undvik att fånga fel slentrianmässigt)
https://msdn.microsoft.com/en-us/library/bb397679.aspx

Edit: Tvåa på bollen.

Har tittat på den sidan, o try parse har jag ju med? men även där är det något som går galet till, vette fan vad jag gör längre då de har blivit helt rörigt
Citera
2017-04-20, 16:51
  #17
Medlem
Sane?s avatar
TryParse returnerar true om strängen kunde konverteras till siffra annars false.

Så.. Istället för din try+catch kan du ha en if sats som kollar om TryCatch gick bra.

Kod:
int siffra;
if (
int.TryParse("123"out siffra)) {
  
// det var en siffra!
} else {
  
// det var inte en siffra

Citera
2017-04-20, 17:02
  #18
Medlem
Citat:
Ursprungligen postat av Sane?
TryParse returnerar true om strängen kunde konverteras till siffra annars false.

Så.. Istället för din try+catch kan du ha en if sats som kollar om TryCatch gick bra.

Kod:
int siffra;
if (
int.TryParse("123"out siffra)) {
  
// det var en siffra!
} else {
  
// det var inte en siffra


Känns smidigare så, men även om jag skriver t.ex : dfasfsdf i början på ålder, så får jag upp en hel radda med meddelanden som är obegripligt, + att programmet crashar, det måste ju ligga fel någon annanstans? jag kan då inte hitta felet o blir snart galen
Citera
2017-04-20, 21:06
  #19
Moderator
Protons avatar
Citat:
Ursprungligen postat av valdo
Känns smidigare så, men även om jag skriver t.ex : dfasfsdf i början på ålder, så får jag upp en hel radda med meddelanden som är obegripligt, + att programmet crashar, det måste ju ligga fel någon annanstans? jag kan då inte hitta felet o blir snart galen
Istället för att läsa in en massa krafs rån readline, vad händer om du hårdkodar in nånting som skulle kunna tolkas som ett nummer då, funkar det bättre då?
Citera
2017-04-20, 23:06
  #20
Medlem
Citat:
Ursprungligen postat av valdo
Jag har just nu fastnat lite på en uppgift jag gör o kan fan i mig inte komma på varför de de blir fel, har suttit o stirrat ihjäl mig nu i 1,5 timmar detta är min kod:

Kod:
{
    class Program
    {
        static int ytilld(int ålder)
        {

            int dagar = ((ålder * 365));
            return dagar;


        }
        static void Main(string[] args)
        {

            Console.ForegroundColor = ConsoleColor.Yellow;
            Console.Write("Skriv in din ålder för att räkna ut den i dagar: ");             // skriver man ej ålder i siffror crashar hela programmet
            int dagar = Convert.ToInt32(Console.ReadLine());
            int ålder = ytilld(dagar);                                                // -Fel som uppstod: ålder var skriven i parantesen vilket gav felmeddelandet " Use of unassigned local variable "ålder" , lösning: Sätta "dagar" i parantesen för fullt sammanhang

            Int32.TryParse(Console.ReadLine(), out dagar);

            Console.WriteLine(dagar + " år gör dig till " + ålder + " dagar gammal ");
            Console.ReadLine();
           Console.WriteLine(" Nu ska vi räkna ut hur många sekunder du levt! ");
            Console.ReadLine();

            try
            {

                Console.WriteLine(" ... och då blir du ungefär såhär många sekunder gammal: " + 86400 * ålder);   // Räknar ut Åldern i sekunder genom att ta Åldern i dagar multiplicerat med antalet sekunder på ett dygn vilket är 24 timmar
            }                                                                                                      // 24 timmar = 86 400 sekunder * ÅLDER I DAGAR                      
            catch (DivideByZeroException )
            {
                Console.WriteLine("Kan ej räkna bokstäver! :( ");
            }
            catch (Exception )
            {
                Console.WriteLine("Något gick lite fel :/");
            }

                Console.ReadKey();
            }
        }
    }
och jag får detta felmeddelande ifall man skriver något annat än en siffra i början, vilket jag vill att den ska säga till om .. inte allt detta : http://imgur.com/a/d0lUv

Hoppas ni ser vad jag försöker göra, jag får även nått skumt på denna " Int32.TryParse(Console.ReadLine(), out dagar); " , kör man den så säger den 0 istället för de siffrorna man skriver, utan den linjen funkar det, förutom felmeddelandet i CMD dåra..

Mvh

Valdo


Jag är medveten om att man när man börjar programmera anser att static är guds gåva till mänskligheten... men jag fick lära mig den hårda vägen (dvs jag fick skriva om ett helt program) att static kan vara allt annat än vänligt mot dig, i synnerhet om du börjar använda dig av externa klasser och liknande. Personligen tycker jag att man i programmeringskurser borde göra ett jämfotahopp på just static metoder. Det finns lägen då de är bra, men för det mesta bör man inte använda sig av statiska metoder.

Variabler bör som redan nämnts döpas på engelska, men framför allt bör de få namn som beskriver dem på ett korrekt sätt.

Exempelvis "int dagar" låter ju bra... tills man inser att det värde du läser in i dem är år... då blir det förvirrande, och vad värre är så kan det göra att folk som försöker läsa koden tycker att allt ser ok ut men att det inte är det.

Du läser in två värden från konsollen

Kod:
int dagar = Convert.ToInt32(Console.ReadLine());
Int32.TryParse(Console.ReadLine(), out dagar);

Det första tar bara glatt värdet och försöker konvertera det, om det sen är en tom sträng eller bokstäver så smäller det duktigt. Den första ska du plocka bort helt.

Den andra är bättre, men den saknar liksom nämnts tidigare i tråden en ifsats som kollar om konverteringen lyckades eller inte.

I ditt fall så skulle klassen TimeSpan kunna vara av intresse. Den mäter skillnaden mellan två datum... vad som är viktigt att veta dock är att den som högsta värde har dagar, inte år.

Om du vill få in åren som en timespan så kan du göra på följande sätt

Kod:
TimeSpan span = DateTime.MinValue.AddYears(years) - DateTime.MinValue;

Det som sker här är att jag tar det lägsta värdet för datum, lägger på det inlästa antalet år och sen tar jag bort det lägsta värdet för datum igen. Detta ger dig ett tidsspann du kan arbeta vidare med.

TimeSpan har egenskaper för dagar, timmar, minuter och sekunder... MEN... dessa visar bara hur många av varje det är. Det finns även TotalXxx vilket returnerar en summering av tiden som en double.

De värden du skulle önska är således

Kod:
int days = (int)span.TotalDays;
int seconds = (int)span.TotalSeconds;

Sen som tips och trix så i C# 6 så introducerades stränginterpolering vilket är ett väldigt trevligt sätt att skriva strängar på.

Dessa två sätt att skriva ger samma resultat

Kod:
 Console.WriteLine(dagar + " år gör dig till " + ålder + " dagar gammal ");
 Console.WriteLine($"{dagar} år gör dig till {ålder} dagar gammal ");

Om ni kör med äldre versioner av visual studio är det inte säkert att det sistnämnda sättet fungerar.
Citera
2017-04-22, 14:03
  #21
Medlem
Där finns en schysst liten specialare du borde använda dig av när man sysslar med nummer

Kod:
int number = 0;

while (!Int.TryParse(Console.ReadLien(), out number)
        Console.WriteLine("Foo, Bar");
Citera
  • 1
  • 2

Stöd Flashback

Flashback finansieras genom donationer från våra medlemmar och besökare. Det är med hjälp av dig vi kan fortsätta erbjuda en fri samhällsdebatt. Tack för ditt stöd!

Stöd Flashback