22 svar
222 visningar
Fifakungen är nöjd med hjälpen
Fifakungen 41
Postad: 2 feb 2022 20:40

Hjälp med try & catch

Hej ! Får det inte riktigt att funka med try and catch i min kod. Vill att programmet ska meddela användaren om den använder bokstäver istället för siffor. Är helt novis på detta ;)

Här är min kod än så länge :)

    public static double FahrToCels(int fahr)
        {
            double temp = (double)fahr; // Tilldelar Fahr till double
            temp = ((fahr - 32.0) * 5.0) / 9.0; // Beräknar Fahrenheit till Celsius
            return temp; // Returnerar värde
            
        }
        
        
        //Här startar programmet
        public static void Main(string[] args)
        {
            Console.WriteLine("Welcome please enter the tempeture in Fahrenheit : ");
            int fahrenheit = int.Parse(Console.ReadLine()); //konvertera grader som användaren angett till heltal
            double celsius = FahrToCels(fahrenheit);//konvertera fahrenheit till celsius
            
                do 
            {
                if (celsius < 73.0) //om temp lägre än 73
                {
                    Console.WriteLine("Its too cold, please increase the temperature. "); // Skriv ut
                    
            
                }
                
                else if (celsius > 77.0) // om temp högre än 77
                {
                    Console.WriteLine("Its too hot, please lower the temperature. "); // Skriv ut
                    
                        
                }
                else 
                {
                    Console.WriteLine("Its the perfect temperature now enjoy! "); // Skriv ut
                }
                try // Se till att användaren använder siffror
                {
                    
                    fahrenheit = int.Parse(Console.ReadLine());
                    celsius = FahrToCels(fahrenheit);
                }
                catch
                {
                    Console.WriteLine("Please use numbers! "); // Säga till användaren att hen måste använda siffror
                    Console.ReadLine();
                }
                } while (celsius < 73.0 || celsius > 77.0 ); // Villkor för att köras om
                
                Console.WriteLine("Its the perfect temperature now enjoy! "); // Skriv ut
            Console.ReadKey();
        }}}

Programmeraren 3387
Postad: 3 feb 2022 09:00

Uttrycket int.Parse(String) i

fahrenheit = int.Parse(Console.ReadLine());

är den som måste läggas inom en try/catch precis som du gjort inne i loopen.
Men du har den koden även i början av programmet och där finns ingen try/catch.

Se till att du bara har ett ställe där du skriver ut "Welcome please enter the temperature in Fahrenheit" och gör int.Parse(), och att det sker inom en try/catch.
Du vill dessutom att det ska ske inuti loopen eftersom användaren ska mata in värdet ända tills det är inom intervallet.
Och du måste ha ett värde för att kunna kontrollera det, alltså vill du ta in värdet före jämförelserna (dvs först i loopen).

Fifakungen 41
Postad: 3 feb 2022 14:11

Får det fortfarande inte att funka, men är riktigt ny på det här :)

Programmeraren 3387
Postad: 3 feb 2022 15:17

Posta koden som den ser ut nu. Använd "Infoga programmeringskod" så det blir lätt att läsa.

Fifakungen 41
Postad: 3 feb 2022 15:29
	class Program
	{
		public static double FahrToCels(int fahr)
		{
			double temp = (double)fahr; // Tilldelar Fahr till double
            temp = ((fahr - 32.0) * 5.0) / 9.0; // Beräknar Fahrenheit till Celsius
            return temp; // Returnerar värde
			
		}
		
		
		//Här startar programmet
		public static void Main(string[] args)
		{
			
			Console.WriteLine("Welcome please enter the tempeture in Fahrenheit : ");
			int fahrenheit = int.Parse(Console.ReadLine()); //konvertera grader som användaren angett till heltal
            double celsius = FahrToCels(fahrenheit);//konvertera fahrenheit till celsius
           
           	try // Se till att användaren använder siffror
				{
					
           		fahrenheit = int.Parse(Console.ReadLine());
			    celsius = FahrToCels(fahrenheit);
			   
				}
				catch
				{
					Console.WriteLine("Please use numbers! "); // Säga till användaren att hen måste använda siffror
					Console.ReadLine();
				}
           
            
				do 
			{
				if (celsius < 73.0) //om temp lägre än 73
				{
					Console.WriteLine("Its too cold, please increase the temperature. "); // Skriv ut
					
			
				}
				
				else if (celsius > 77.0) // om temp högre än 77
				{
					Console.WriteLine("Its too hot, please lower the temperature. "); // Skriv ut
					
						
				}
				else 
				{
					Console.WriteLine("Its the perfect temperature now enjoy! "); // Skriv ut
				}
				try // Se till att användaren använder siffror
				{
					
					fahrenheit = int.Parse(Console.ReadLine());
					celsius = FahrToCels(fahrenheit);
				}
				catch
				{
					Console.WriteLine("Please use numbers! "); // Säga till användaren att hen måste använda siffror
					Console.ReadLine();
				}
				} while (celsius < 73.0 || celsius > 77.0 ); // Villkor för att köras om
				
				Console.WriteLine("Its the perfect temperature now enjoy! "); // Skriv ut
			Console.ReadKey();
		}}}
Fifakungen 41
Postad: 3 feb 2022 15:31

Felet blir väl i int fahrenheit = int.Parse(Console.ReadLine()); //konvertera grader som användaren angett till heltal den raden? förstår inte riktigt hur jag löser det :)

Programmeraren 3387
Postad: 3 feb 2022 15:38 Redigerad: 3 feb 2022 15:38

Du vill ha strukturen

do {
  try {
     // print "enter number"
     // readline, parse int
  } catch {
     // print error message
     continue;
  }
  // check value is within range and print messages if not

} while( ...)

 

Flytta upp try/catch-koden från slutet av loopen och lägg den först

Ta bort onödiga dubbletter!

Ta bort första try/catch innan loopen.

I catch, bort med
Console.ReadLine();

Innan loopen (högst upp i Main), bort med:
int fahrenheit = int.Parse(Console.ReadLine()); //konvertera grader som användaren angett till heltal double celsius = FahrToCels(fahrenheit);//konvertera fahrenheit till celsius

Flytta in till direkt efter try (i den enda try som nu är kvar).
Console.WriteLine("Welcome please enter the tempeture in Fahrenheit : ");

Fifakungen 41
Postad: 3 feb 2022 15:44

Om jag förstod dig rätt nu så borde koden se ut såhär nu? 

class Program
	{
		public static double FahrToCels(int fahr)
		{
			double temp = (double)fahr; // Tilldelar Fahr till double
            temp = ((fahr - 32.0) * 5.0) / 9.0; // Beräknar Fahrenheit till Celsius
            return temp; // Returnerar värde
			
		}
		
		
		//Här startar programmet
		public static void Main(string[] args)
		{
			
			
        
				do 
			{
					try // Se till att användaren använder siffror
				{
					Console.WriteLine("Welcome please enter the tempeture in Fahrenheit : ");
					fahrenheit = int.Parse(Console.ReadLine());
					celsius = FahrToCels(fahrenheit);
				}
				catch
				{
					Console.WriteLine("Please use numbers! "); // Säga till användaren att hen måste använda siffror
					
				}
				if (celsius < 73.0) //om temp lägre än 73
				{
					Console.WriteLine("Its too cold, please increase the temperature. "); // Skriv ut
					
			
				}
				
				else if (celsius > 77.0) // om temp högre än 77
				{
					Console.WriteLine("Its too hot, please lower the temperature. "); // Skriv ut
					
						
				}
				else 
				{
					Console.WriteLine("Its the perfect temperature now enjoy! "); // Skriv ut
				}
				
				} while (celsius < 73.0 || celsius > 77.0 ); // Villkor för att köras om
				
				Console.WriteLine("Its the perfect temperature now enjoy! "); // Skriv ut
			Console.ReadKey();
		}}}
Programmeraren 3387
Postad: 3 feb 2022 15:45

Börjar likna nåt!

Lägg till en
continue;
sist i catch så att loopen börjar om utan att efterföljande kod körs.

Fifakungen 41
Postad: 3 feb 2022 15:47

La till en continue; . Nu får jag dock error på alla fahrenheit och celsius som inte finns i den aktuella kontexten. Innan funkade det men inte riktigt som jag ville :P 

Programmeraren 3387
Postad: 3 feb 2022 15:56

Deklarera variablerna i början av Main.

int fahrenheit;
double celsius;

Fifakungen 41
Postad: 3 feb 2022 15:59

Tack ! En lokal variabel som inte har tilldelats används: celsius (CS0165) . Den som står efter while()

Fifakungen 41
Postad: 3 feb 2022 16:00

Hahah förstår inte hur den kan bli "error" / rödstreckad men inte någon annan celsius? 

Programmeraren 3387
Postad: 3 feb 2022 16:01

Du använder den utanför den "krullparentes" där den deklarerats.

Fifakungen 41
Postad: 3 feb 2022 16:04

Är krullparantes måsvinge? ^^ . behöver jag deklarera den på nytt då ? 

Programmeraren 3387
Postad: 3 feb 2022 16:07

En deklarerad variabel "finns" bara inom ett context. Du ska inte upprepa något, däremot deklarera den tillräckligt långt ut. Först i Main borde räcka men vet inte exakt hur programmet ser ut just nu.

Fifakungen 41
Postad: 3 feb 2022 16:10

Såhär ser det ut just nu

	class Program
	{
		public static double FahrToCels(int fahr)
		{
			double temp = (double)fahr; // Tilldelar Fahr till double
            temp = ((fahr - 32.0) * 5.0) / 9.0; // Beräknar Fahrenheit till Celsius
            return temp; // Returnerar värde
			
		}
		
		
		//Här startar programmet
		public static void Main(string[] args)
		{
			int fahrenheit;
            double celsius;
			 
				do 
			{
					try // Se till att användaren använder siffror
				{
					Console.WriteLine("Welcome please enter the tempeture in Fahrenheit : ");
					fahrenheit = int.Parse(Console.ReadLine());
					celsius = FahrToCels(fahrenheit);
				}
				catch
				{
					Console.WriteLine("Please use numbers! "); // Säga till användaren att hen måste använda siffror
					continue;
				}
				if (celsius < 73.0) //om temp lägre än 73
				{
					Console.WriteLine("Its too cold, please increase the temperature. "); // Skriv ut
					
			
				}
				
				else if (celsius > 77.0) // om temp högre än 77
				{
					Console.WriteLine("Its too hot, please lower the temperature. "); // Skriv ut
					
						
				}
				else 
				{
					Console.WriteLine("Its the perfect temperature now enjoy! "); // Skriv ut
				}
				
				} 
				while (celsius < 73.0 || celsius > 77.0 ); // Villkor för att köras om
				
				Console.WriteLine("Its the perfect temperature now enjoy! "); // Skriv ut
			    Console.ReadKey();
			}
	}
}
Programmeraren 3387
Postad: 3 feb 2022 16:11

Spontant ser jag inget fel (men inte kompilerat/testat).

Fifakungen 41
Postad: 3 feb 2022 16:12

Tycker ju krullparanteserna ser rätt ut, går det att prova sig fram så att den räcker längre ? :) 

Programmeraren 3387
Postad: 3 feb 2022 16:15

Möjligtvis en för mycket i slutet. Vad säger kompilatorn?

Fifakungen 41
Postad: 3 feb 2022 16:16

Tar jag bort en i slutet så säger att att en } förväntas. lägger jag till den får jag En lokal variabel som inte har tilldelats används: celsius (CS0165) och markerad den celsius som står efter while bara. 

Programmeraren 3387
Postad: 3 feb 2022 16:24

Ser inte varför. Testa att skriv "double celsius = 0.0;" i deklarationen (men borde inte behövas). Kan vara nån { eller } som sitter fel.

Fifakungen 41
Postad: 3 feb 2022 16:26

Nu funka det ! Tusen tack för hjälpen bästa ! 

Svara Avbryt
Close