Vinnaren i pepparkakshustävlingen!
  • 1
  • 2
2016-03-03, 15:58
  #13
Medlem
Lite halvsvårt att hänga med i vad du behöver hjälp med

Citat:
Den koden som jag skrev här nu under är väl en metod alltså hela? och static float [namn] är variablerna. Jag måste skriva Static innan float [namn] för att den skall kunna komma med i main metoden elle ? Det funkar ju inte ifall jag tar bort static.

Ja det är en metod, och ja du behöver Static, men varför är detta relevant till uppgiften?

Hursomhelst, följande kod fungerar och gör det du vill tror jag. Skulle dock föreslå att du inte kopierar koden rakt av utan använder den för att bygga ett eget program, har lagt kommentarer på nästan varje rad för att beskriva vad som utförs, om du har fler funderingar så tveka inte på att fråga!

Kod:
class Program
    
{
        static 
void Main(string[] args)
        {
            const 
int max_temp 176// 80 Celsius - Const är ej nödvändigt, men specifierar att värdet inte kommer komma att ändras.
            
const int min_temp 158// 70 Celsius -                                -||-

            
Console.WriteLine("Ange antal grader i Fahrenheit: ");

            
float fahrenheit Convert.ToSingle(Console.ReadLine()); // Läser input från consolen och tilldelar den siffran till Fahrenheit variabeln
            
float celsius FahrenheitToCelsius(fahrenheit); // Konverterar tidigare inputt'ade värdet till celsius och tilldelar det värdet till celsius variabeln

            
while(true// While true - kommer köras tills det manuellt bryts (break;)
            
{
                if(
fahrenheit max_temp// Om Fahrenheit är STÖRRE än max temp så händer följande: \/
                
{
                    
Console.WriteLine("Sänk temperaturen!"); //Consolen skriver att du ska sänka temperaturen
                    
Console.WriteLine("Ange ny temperatur: "); // Ber dig om en ny temperatur
                    
fahrenheit Convert.ToSingle(Console.ReadLine()); // Läser den nya temperaturen du angav och försöker igen genom att börja om från "While(true)"
                    
celsius FahrenheitToCelsius(fahrenheit);
                }
                else if(
fahrenheit min_temp// Om Fahrenheit är MINDRE än minsta temp som händer samma sak som ovan fast den ber dig att HÖJA temperaturen istället
                
{
                    
Console.WriteLine("Höj temperaturen!");
                    
Console.WriteLine("Ange ny temperatur: ");
                    
fahrenheit Convert.ToSingle(Console.ReadLine());
                    
celsius FahrenheitToCelsius(fahrenheit);
                }
                else 
// ELSE - om temperaturen varken är lägre än minimum, eller högre än maximum, så har vi uppenbarligen hamnat inom godkänd intervall av temperatur, och isåfall: 
                
{
                    
Console.WriteLine("Nu går det bra att basta nu, temperaturen är " celsius "grader celsius"); // Säg att det går bra att basta och tala om för användaren vad temperaturen ligger på i celsius
                    
Console.ReadKey(); //Pausar programmet så att det inte stängs ned direkt
                    
break; // Breaka loopen (avsluta while)
                
}
            }
        }

        static 
float FahrenheitToCelsius (float fahrenheit// En metod för att konvertera Fahrenheit till Celsius
        
{
            
float celsius = (fahrenheit 32) * 9// Här är formeln som gör om Fahrenheit till Celsius

            
return celsius// Returnera värdet i Celsius
        
}
    } 
Citera
2016-03-03, 20:11
  #14
Medlem
ojns avatar
Mitt bidrag. Mest för skojs skull. Saknar konverteringen f -> c, kollar bara att f är "in range". TS rekommenderas naturligtvis att inte använda denna kod, men kan förhoppningsvis lära sig något av den även om den inte är optimal.

Kod:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace 
CtoF
{
  class 
Program
  
{
    static 
bool checkTemp(float f)
    {
      if ( (
180) || (158) )
      {
        
Console.WriteLine"För " + ((180) ? "hög " "låg ") + "temperatur");
        return 
false;
      }
      return 
true;
    }

    static 
void Main(string[] args)
    {
      
float fah 0;
      while (!
checkTemp(fah))
      {
        
Console.WriteLine("Fahrenheit: ");
        
fah float.Parse(Console.ReadLine());
      }
      
Console.WriteLine("Perfekt temperatur");
      
Console.ReadKey();
    }
  }

Citera
2016-03-28, 09:14
  #15
Medlem
PGriffins avatar
Hej!

Jag drar upp denna gamla tråd igen. Jag är på samma uppgift men satsar på ett högre betyg så jag ska även inkludera en trycatch-sats.

Mitt problem är att när catch-villkoret uppfylls (t ex bokstaven A) så ser man även meddelande som gäller onskadTempCe, alltså att tempen är för låg eller hög, beroende på vad som ligger i variabeln.

Jag vill att try-catch ska köra och ifall det blir en catch så ska den stanna i catchen och återvända till try, inte gå vidare genom nästa loop.

Det första man kommer att tänka på är att lägga hela programmet i try-delen, men det avråder läraren ifrån.

Någon idé?

Kod:
    class Program
    {
        static void Main(string[] args)
        {
            // Här fastställer jag temperaturen som användaren har att anpassa sig till för att komma igenom programmet. 
            double optimalTempCe = 75;
            double lagstaTempCe = optimalTempCe - 2;
            double hogstaTempCe = optimalTempCe + 2;

            // Här deklareras variablerna för önskad temperatur. Användaren ska ange i Fahrenheit men programmet räknar om till Celsius så att bastuns styrenhet kan förstå. 
            double onskadTempCe = 0;
            double onskadTempFa = 0;

            // Denna bool-variabel används för att trycatchsatsen ska köra så länge som det krävs. 
            bool success = true;

            // Här inleds while-loopen som fortgår så länge som önskad temperatur inte ligger inom spannet optimal temperatur +- 2. 
            while (onskadTempCe > hogstaTempCe || onskadTempCe < lagstaTempCe)
            {
                do
                {
                    Console.Write("Uppge temperatur i fahrenheit som du vill ha i bastun: ");

                    // Trycatch-satsen rensar bort svar som inte uppfyller kriteriet (int eller double). 
                    try
                    {
                        onskadTempFa = double.Parse(Console.ReadLine());
                        success = false;
                    }
                    catch (Exception)
                    {
                        Console.WriteLine("Slå in ett giltigt tal (heltal eller decimaltal)");
                        Console.ReadKey();
                    }
                } while (success);

                // Här använder jag metoden som finns längre ned i detta dokument för att omvandla Fahrenheit till Celsius. 
                onskadTempCe = MyMethods.FahrenheitToCelsius(onskadTempFa);

                // If-loopen kör på tills att användaren gissar rätt och man får lämpliga svar beroende på vad man svarar.  
                if (onskadTempCe > hogstaTempCe || onskadTempCe < lagstaTempCe)
                {
                    Console.WriteLine("Du har ställt in för "+ ((onskadTempCe > hogstaTempCe) ? "hög" : "låg") +" temperatur. Försök igen!");
                    Console.ReadKey();
                    Console.Clear();
                }
                else
                {
                    string avslutning = string.Format("Välkommen att basta i denna ljuvliga temperatur! Du angav {0:0.##} i grader Fahrenheit och {1:0.##} i grader Celsius", onskadTempFa, onskadTempCe);
                    Console.WriteLine(avslutning);
                    Console.WriteLine("Tryck på valfri tangent för att avsluta programmet.");
                    Console.ReadKey();
                    Console.Clear();
                }
            }
        }
        class MyMethods
        { 
            public static int FahrenheitToCelsius(int f)
            {
                int celsius = (int)FTC(f);
                return celsius;
            }

            public static double FahrenheitToCelsius(double f)
            {
                double celsius = FTC(f);
                return celsius;
            }

            private static double FTC(double f)
            {
                return (5.0 / 9.0) * (f - 32);
            }

            public static int CelsiusToFahrenheit(int c)
            {
                int celsius = (int)CTF(c);
                return celsius;
            }

            public static double CelsiusToFahrenheit(double c)
            {
                double celsius = CTF(c);
                return celsius;
            }

            private static double CTF(double c)
            {
                return (((c * 9.0) / 5) + 32);
            }
        }
    }
Citera
2016-03-28, 09:47
  #16
Moderator
Protons avatar
Citat:
Ursprungligen postat av PGriffin
Hej!

Jag drar upp denna gamla tråd igen. Jag är på samma uppgift men satsar på ett högre betyg så jag ska även inkludera en trycatch-sats.

Mitt problem är att när catch-villkoret uppfylls (t ex bokstaven A) så ser man även meddelande som gäller onskadTempCe, alltså att tempen är för låg eller hög, beroende på vad som ligger i variabeln.

Jag vill att try-catch ska köra och ifall det blir en catch så ska den stanna i catchen och återvända till try, inte gå vidare genom nästa loop.

Det första man kommer att tänka på är att lägga hela programmet i try-delen, men det avråder läraren ifrån.

Någon idé?

Kod:
    class Program
    {
        static void Main(string[] args)
        {
            // Här fastställer jag temperaturen som användaren har att anpassa sig till för att komma igenom programmet. 
            double optimalTempCe = 75;
            double lagstaTempCe = optimalTempCe - 2;
            double hogstaTempCe = optimalTempCe + 2;

            // Här deklareras variablerna för önskad temperatur. Användaren ska ange i Fahrenheit men programmet räknar om till Celsius så att bastuns styrenhet kan förstå. 
            double onskadTempCe = 0;
            double onskadTempFa = 0;

            // Denna bool-variabel används för att trycatchsatsen ska köra så länge som det krävs. 
            bool success = true;

            // Här inleds while-loopen som fortgår så länge som önskad temperatur inte ligger inom spannet optimal temperatur +- 2. 
            while (onskadTempCe > hogstaTempCe || onskadTempCe < lagstaTempCe)
            {
                do
                {
                    Console.Write("Uppge temperatur i fahrenheit som du vill ha i bastun: ");

                    // Trycatch-satsen rensar bort svar som inte uppfyller kriteriet (int eller double). 
                    try
                    {
                        onskadTempFa = double.Parse(Console.ReadLine());
                        success = false;
                    }
                    catch (Exception)
                    {
                        Console.WriteLine("Slå in ett giltigt tal (heltal eller decimaltal)");
                        Console.ReadKey();
                    }
                } while (success);

                // Här använder jag metoden som finns längre ned i detta dokument för att omvandla Fahrenheit till Celsius. 
                onskadTempCe = MyMethods.FahrenheitToCelsius(onskadTempFa);

                // If-loopen kör på tills att användaren gissar rätt och man får lämpliga svar beroende på vad man svarar.  
                if (onskadTempCe > hogstaTempCe || onskadTempCe < lagstaTempCe)
                {
                    Console.WriteLine("Du har ställt in för "+ ((onskadTempCe > hogstaTempCe) ? "hög" : "låg") +" temperatur. Försök igen!");
                    Console.ReadKey();
                    Console.Clear();
                }
                else
                {
                    string avslutning = string.Format("Välkommen att basta i denna ljuvliga temperatur! Du angav {0:0.##} i grader Fahrenheit och {1:0.##} i grader Celsius", onskadTempFa, onskadTempCe);
                    Console.WriteLine(avslutning);
                    Console.WriteLine("Tryck på valfri tangent för att avsluta programmet.");
                    Console.ReadKey();
                    Console.Clear();
                }
            }
        }
        class MyMethods
        { 
            public static int FahrenheitToCelsius(int f)
            {
                int celsius = (int)FTC(f);
                return celsius;
            }

            public static double FahrenheitToCelsius(double f)
            {
                double celsius = FTC(f);
                return celsius;
            }

            private static double FTC(double f)
            {
                return (5.0 / 9.0) * (f - 32);
            }

            public static int CelsiusToFahrenheit(int c)
            {
                int celsius = (int)CTF(c);
                return celsius;
            }

            public static double CelsiusToFahrenheit(double c)
            {
                double celsius = CTF(c);
                return celsius;
            }

            private static double CTF(double c)
            {
                return (((c * 9.0) / 5) + 32);
            }
        }
    }
Du kanske kan sätta en flagga i din catch-sats som indikerar om den kört eller inte. Då kan du ju kolla denna flagga i loopen och om den är satt kan du hoppa över lämpliga delar.

Glöm bara inte att nollställa flaggan för varje varv, annars blir det troligen knasigt nån annanstans i koden.

Flaggor som denna sätts lämpligen med en boolesk variabel.
Citera
2016-03-28, 10:13
  #17
Medlem
PGriffins avatar
Hej igen

Kan du ge mig ett exempel, tack. Jag är nybörjare och är inte bekant med flaggor.
Citera
2016-03-28, 10:23
  #18
Moderator
Protons avatar
Citat:
Ursprungligen postat av PGriffin
Hej igen

Kan du ge mig ett exempel, tack. Jag är nybörjare och är inte bekant med flaggor.
Kod:
bool flaggafalse;

if(!
flagga){
//do something
flagga true;


Där är principen. Flagga i detta fallet kan ju heta vad som helst, det blir kanske klarare om du kallar den "undantagKastat" om du sätter den i ditt Catch-block?
Citera
2016-03-28, 10:43
  #19
Medlem
PGriffins avatar
Hej igen

Nu förstår jag vad du menade med flagga.

Jag har ju redan gjort så i koden med bool success. Se koden. Ändå fungerar det inte.

Jag förtydligar problemet med denna bild: https://db.tt/wEq1i7vf

Här slog jag in ett "a" och skulle således bara fått ett meddelande om att slå in ett giltigt tal, inte att jag ställt in för låg temperatur. Variabeln onskadTempCe ligger på en låg temp sedan ett tidigare försök, därför kommer det meddelandet upp.

Kolla på koden igen och se om du kan se var jag gjort fel.

Tack!

Tillägg: Jag har funderat mer och problemet är ju att success är i läge true tills att try-satsen lyckas. På så vis kommer man ju igenom hela catchen och sedan vidare till nästa loop som hanterar meddelandena beroende på inmatad temperatur. Jag experimenterar runt men lyckas inte...
__________________
Senast redigerad av PGriffin 2016-03-28 kl. 11:02.
Citera
2016-03-28, 11:15
  #20
Moderator
Protons avatar
Citat:
Ursprungligen postat av PGriffin
Hej igen

Nu förstår jag vad du menade med flagga.

Jag har ju redan gjort så i koden med bool success. Se koden. Ändå fungerar det inte.

Jag förtydligar problemet med denna bild: https://db.tt/wEq1i7vf

Här slog jag in ett "a" och skulle således bara fått ett meddelande om att slå in ett giltigt tal, inte att jag ställt in för låg temperatur. Variabeln onskadTempCe ligger på en låg temp sedan ett tidigare försök, därför kommer det meddelandet upp.

Kolla på koden igen och se om du kan se var jag gjort fel.

Tack!

Tillägg: Jag har funderat mer och problemet är ju att success är i läge true tills att try-satsen lyckas. På så vis kommer man ju igenom hela catchen och sedan vidare till nästa loop som hanterar meddelandena beroende på inmatad temperatur. Jag experimenterar runt men lyckas inte...
Till att börja med existerar inga if-loopar, möjligen if-satser. En if kan i sig aldrig vara en iteration.

Du sätter ju aldrig om din variabel success när undantaget kastas, meningen var ju att du skulle använda denna för att avgöra om nåt gick galet, men den använder du ju aldrig? Varför?

I ditt Catch-block måste du ju sätta om flaggan så borde det kunna funka.

För övrigt bör det nu finnas uppdaterad kod att kolla på (om du gjort några ändringar). Funkar det inte efter dessa ändringar underlättar det om vi får se den ändrade koden.
Citera
2016-03-28, 12:10
  #21
Medlem
PGriffins avatar
Citat:
Ursprungligen postat av Proton
Till att börja med existerar inga if-loopar, möjligen if-satser. En if kan i sig aldrig vara en iteration.

Du sätter ju aldrig om din variabel success när undantaget kastas, meningen var ju att du skulle använda denna för att avgöra om nåt gick galet, men den använder du ju aldrig? Varför?

I ditt Catch-block måste du ju sätta om flaggan så borde det kunna funka.

För övrigt bör det nu finnas uppdaterad kod att kolla på (om du gjort några ändringar). Funkar det inte efter dessa ändringar underlättar det om vi får se den ändrade koden.

Hej igen

Helt rätt. If-satsen ligger i en while-loop, men If-satsen i sig är inte en loop.

Nu fungerar programmet, men jag förstår inte riktigt varför. Jag stegar igenom koden och övervakar variabeln success.

Den sätts ju till true tidigt i programmet. Sedan testar den try och misslyckas om jag slår in ett a, det vill säga success fortsätter att vara true. Sedan körs catch och eftersom success fortfarande är true så borde do while-loopen som trycatch-satsen ligger i köras om utan att blanda in if-satserna som kommer efteråt. Men det gör det bara om jag lägger in i catch-satsen att success = true. Se koden nedan. Jag förstår inte varför jag behöver skriva att success = true, då success redan är true. sedan tidigare. Detta har jag som sagt bekräftat genom att ha stegat igenom koden.

Här följer uppdaterad och fungerande kod:
Kod:
    class Program
    {
        static void Main(string[] args)
        {
            // Här fastställer jag temperaturen som användaren har att anpassa sig till för att komma igenom programmet. 
            double optimalTempCe = 75;
            double lagstaTempCe = optimalTempCe - 2;
            double hogstaTempCe = optimalTempCe + 2;

            // Här deklareras variablerna för önskad temperatur. Användaren ska ange i Fahrenheit men programmet räknar om till Celsius så att bastuns styrenhet kan förstå. 
            double onskadTempCe = 0;
            double onskadTempFa = 0;

            // Denna bool-variabel används för att trycatchsatsen ska köra så länge som det krävs. 
            bool success = true;

            // Här inleds while-loopen som fortgår så länge som önskad temperatur inte ligger inom spannet optimal temperatur +- 2. 
            while (onskadTempCe > hogstaTempCe || onskadTempCe < lagstaTempCe)
            {
                do
                {
                    Console.Write("Uppge temperatur i fahrenheit som du vill ha i bastun: ");

                    // Trycatch-satsen rensar bort svar som inte uppfyller kriteriet (int eller double). 
                    try
                    {
                        onskadTempFa = double.Parse(Console.ReadLine());
                        success = false;
                    }
                    catch (Exception)
                    {
                        Console.WriteLine("Slå in ett giltigt tal (heltal eller decimaltal)\n");
                        Console.ReadKey();
                        Console.Clear();
                        success = true;
                    }
                } while (success);

                // Här använder jag metoden som finns längre ned i detta dokument för att omvandla Fahrenheit till Celsius. 
                onskadTempCe = MyMethods.FahrenheitToCelsius(onskadTempFa);

                // If-loopen kör på tills att användaren gissar rätt och man får lämpliga svar beroende på vad man svarar.  
                if (onskadTempCe > hogstaTempCe || onskadTempCe < lagstaTempCe)
                {
                    Console.WriteLine("Du har ställt in för "+ ((onskadTempCe > hogstaTempCe) ? "hög" : "låg") +" temperatur. Försök igen!");
                    Console.ReadKey();
                    Console.Clear();
                }
                else
                {
                    string avslutning = string.Format("Välkommen att basta i denna ljuvliga temperatur! Du angav {0:0.##} i grader Fahrenheit och {1:0.##} i grader Celsius", onskadTempFa, onskadTempCe);
                    Console.WriteLine(avslutning);
                    Console.WriteLine("Tryck på valfri tangent för att avsluta programmet.");
                    Console.ReadKey();
                    Console.Clear();
                }
            }
        }

UPDATE:
Nu har jag löst det! Det är ju så enkelt att om success en gång ställs om till false så blir den kvar i false. Alltså fungerar do while loopen endast om man inte kört igenom try-delen. Detta löstes så klart genom att lägga in success = true som en del av catch.

Tack för hjälpen!
__________________
Senast redigerad av PGriffin 2016-03-28 kl. 12:27.
Citera
2016-03-28, 12:42
  #22
Moderator
Protons avatar
Citat:
Ursprungligen postat av PGriffin
Hej igen

Helt rätt. If-satsen ligger i en while-loop, men If-satsen i sig är inte en loop.

Nu fungerar programmet, men jag förstår inte riktigt varför. Jag stegar igenom koden och övervakar variabeln success.

Den sätts ju till true tidigt i programmet. Sedan testar den try och misslyckas om jag slår in ett a, det vill säga success fortsätter att vara true. Sedan körs catch och eftersom success fortfarande är true så borde do while-loopen som trycatch-satsen ligger i köras om utan att blanda in if-satserna som kommer efteråt. Men det gör det bara om jag lägger in i catch-satsen att success = true. Se koden nedan. Jag förstår inte varför jag behöver skriva att success = true, då success redan är true. sedan tidigare. Detta har jag som sagt bekräftat genom att ha stegat igenom koden.

Här följer uppdaterad och fungerande kod:
Kod:
    class Program
    {
        static void Main(string[] args)
        {
            // Här fastställer jag temperaturen som användaren har att anpassa sig till för att komma igenom programmet. 
            double optimalTempCe = 75;
            double lagstaTempCe = optimalTempCe - 2;
            double hogstaTempCe = optimalTempCe + 2;

            // Här deklareras variablerna för önskad temperatur. Användaren ska ange i Fahrenheit men programmet räknar om till Celsius så att bastuns styrenhet kan förstå. 
            double onskadTempCe = 0;
            double onskadTempFa = 0;

            // Denna bool-variabel används för att trycatchsatsen ska köra så länge som det krävs. 
            bool success = true;

            // Här inleds while-loopen som fortgår så länge som önskad temperatur inte ligger inom spannet optimal temperatur +- 2. 
            while (onskadTempCe > hogstaTempCe || onskadTempCe < lagstaTempCe)
            {
                do
                {
                    Console.Write("Uppge temperatur i fahrenheit som du vill ha i bastun: ");

                    // Trycatch-satsen rensar bort svar som inte uppfyller kriteriet (int eller double). 
                    try
                    {
                        onskadTempFa = double.Parse(Console.ReadLine());
                        success = false;
                    }
                    catch (Exception)
                    {
                        Console.WriteLine("Slå in ett giltigt tal (heltal eller decimaltal)\n");
                        Console.ReadKey();
                        Console.Clear();
                        success = true;
                    }
                } while (success);

                // Här använder jag metoden som finns längre ned i detta dokument för att omvandla Fahrenheit till Celsius. 
                onskadTempCe = MyMethods.FahrenheitToCelsius(onskadTempFa);

                // If-loopen kör på tills att användaren gissar rätt och man får lämpliga svar beroende på vad man svarar.  
                if (onskadTempCe > hogstaTempCe || onskadTempCe < lagstaTempCe)
                {
                    Console.WriteLine("Du har ställt in för "+ ((onskadTempCe > hogstaTempCe) ? "hög" : "låg") +" temperatur. Försök igen!");
                    Console.ReadKey();
                    Console.Clear();
                }
                else
                {
                    string avslutning = string.Format("Välkommen att basta i denna ljuvliga temperatur! Du angav {0:0.##} i grader Fahrenheit och {1:0.##} i grader Celsius", onskadTempFa, onskadTempCe);
                    Console.WriteLine(avslutning);
                    Console.WriteLine("Tryck på valfri tangent för att avsluta programmet.");
                    Console.ReadKey();
                    Console.Clear();
                }
            }
        }

UPDATE:
Nu har jag löst det! Det är ju så enkelt att om success en gång ställs om till false så blir den kvar i false. Alltså fungerar do while loopen endast om man inte kört igenom try-delen. Detta löstes så klart genom att lägga in success = true som en del av catch.

Tack för hjälpen!
Citerar mig själv:

Citat:
Du sätter ju aldrig om din variabel success när undantaget kastas, meningen var ju att du skulle använda denna för att avgöra om nåt gick galet, men den använder du ju aldrig? Varför?

Bra att du verkar ha upptäckt det själv dock.
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