Vinnaren i pepparkakshustävlingen!
2016-04-01, 19:31
  #1
Medlem
PGriffins avatar
Hej

Jag håller på med en uppgift om att skriva ett program där man ska skriva in fem namn i en array med index 5. Efter det skrivs den ut. Efter det blir man erbjuden att ändra värdet på en indexposition.

Jag utmanar mig med att validera inmatningen, så att programmet blir bombsäkert. Jag kanske är helt ute och cyklar med min ansats, säg till mig i så fall och berätta hur jag kan göra i stället.

Jag har problem med sista biten, där man kan trycka på q eller Q för att avsluta programmet, samtidigt som man ska uppge ett tal som ligger inom arrayomfattningen. Utöver det tror jag att programmet kommer fungera som jag önskar...

Tack för er feedback!

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

namespace Uppgifter_kap_12_13_14_15
{
    class Program
    {
        static void Main(string[] args)
        {
            // Definition av arrayen där namnen ska sparas och variabeln för att spara namnen. 
            string[] names = new string[5];
            string name = "";

            // Variabeln för att testa om man kommer igenom loopen. 
            bool success = true;

            // For-loopen där användaren får uppge fem namn.  
            for (int i = 0; i < names.Length; i++)
            {
                do
                {
                    Console.Write("Uppge namn " + (i + 1) + ": ");
                    name = Console.ReadLine();
                    
                    // Här testas att man slår in ett namn som innehåller endast bokstäver. 
                    if (Regex.IsMatch(name, @"^[a-zA-Z]+$"))
                    {
                        names[i] = name;
                        success = false;
                    }
                    else
                    {
                        Console.WriteLine("Du har inte angett ett korrekt namn, testa igen!\n");
                        success = true;
                    }
                } while (success);
                success = true;
            }

            Console.WriteLine("\nTryck på valfri knapp för att se de namn som du har angett.\n");
            Console.ReadKey();

            // Kallar metoden där namnen skrivs ut. 

            PrintArray(names);

            // Variabler för att identifiera position i index samt det namn som ska införas i stället uppges. 

            int placeInNames = 0;
            string changedName = "";

            // Användaren får slå in namn. 

            do
            {
                Console.Write("\nAnge index till det namn som du vill byta ut (om du vill avsluta programmet i stället, tryck på q eller Q):");
                var selection = Console.ReadLine();
                selection = int.Parse(Console.ReadLine());

                // Vid klick på q eller Q stängs programmet. 
                if (selection == "q" || selection == "Q")
                {
                    Environment.Exit(0);
                }

                // Om selection ligger inom arrayens längd sätts success till false och man kommer vidare. 
                else if (selection < names.Length)
                {
                    success = false;
                }

                // Om selection ligger ovanför arrayens längd loopas det och man får försöka igen. 
                else if (selection => names.Length)
                {
                    Console.WriteLine("Du har angett ett tal som inte finns i arrayen. Ange ett tal mellan 0 och " + (names.Length - 1) + "\n");
                    success = true;
                }

                // Om man slår in en bokstav exempelvis loopas det och man får försöka igen. 
                else
                {
                    Console.WriteLine("Du har inte angett ett en siffra. Ange ett tal mellan 0 och " + (names.Length - 1) + "\n");
                    success = true;
                }
            } while (success);
            success = true;

            do
            {
                Console.Write("\nAnge index till det namn som du vill byta ut:");
                changedName = Console.ReadLine();

                // Här testas att man slår in ett namn som innehåller endast bokstäver. 
                if (Regex.IsMatch(name, @"^[a-zA-Z]+$"))
                {
                    names[i] = name;
                    success = false;
                }
                else
                {
                    Console.WriteLine("Du har inte angett ett korrekt namn, testa igen!");
                    success = true;
                }
            } while (success);
            success = true;

            names[placeInNames] = changedName;

            Console.WriteLine("\nDet nya namnet på arrayplats " + placeInNames + " är " + changedName + ".\n");
            Console.WriteLine("Arryen ser nu ut som följer:");

            // Kallar metoden där namnen skrivs ut. Arrayen är nu uppdaterad. 

            PrintArray(names);

            Console.WriteLine("\nTryck på valfri knapp för att avsluta.");
            Console.ReadKey();

        }

        static void PrintArray(string[] array)
        {
            // Denna metod skriver ut en namnarray.  
            for (int i = 0; i<array.Length; i++)
            {
                Console.WriteLine("Namn " + (i + 1) + ": " + array[i]);
            }
        }

        static void tryCatchLoop(string[] array)
        {
            // Denna metod skriver ut en namnarray.  
            for (int i = 0; i < array.Length; i++)
            {
                Console.WriteLine("Namn " + (i + 1) + ": " + array[i]);
            }
        }
    }
}
Citera
2016-04-01, 20:21
  #2
Medlem
Koden kompilerar väl inte?
Kod:
                var selection = Console.ReadLine();
                selection = int.Parse(Console.ReadLine());
1. Du läser in en sträng till selection, vilket gör selection till string
2. Du läser in en sträng IGEN och försöker parsa den till int. Du försöker spara int-värdet i en string-variabel. Går inte.

Läs först in en rad till en sträng-variabel. Använd den variabeln när du kollar efter q/Q. Parsa sen den strängvariabeln till en int och spara värdet i en int-variabel. Använd den för dina nummerjämförelser.

Sen bör du kanske köra med int.TryParse() i en if-sats och hantera fall då användaren skriver in något som inte går att parsa till int.
Citera
2016-04-01, 23:11
  #3
Medlem
PGriffins avatar
Hej och tack för hjälpen

Jag kom lite längre tack vare det tipset, men nu har jag problem med valideringen av att jag slår in en siffra på mellan 0 och 4. När jag slår in ett a så kommer jag ändå vidare. Jag stegar igenom processen och försöker se var det blir fel, men lyckas inte. Kanske är jag för trött...

Tacksam om någon vill ta en titt igen.

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

namespace Uppgifter_kap_12_13_14_15
{
    class Program
    {
        static void Main(string[] args)
        {
            #region Uppgift 12.2

            // Definition av arrayen där namnen ska sparas och variabeln för att spara namnen. 
            string[] names = new string[5];
            string name = "";

            // Variabeln för att testa om man kommer igenom loopen. Denna återanvänds för mer validering i detta program. 
            bool success = true;

            // For-loopen där användaren får uppge fem namn.  
            for (int i = 0; i < names.Length; i++)
            {
                do
                {
                    Console.Write("Uppge namn " + (i + 1) + ": ");
                    name = Console.ReadLine();
                    
                    // Här testas att man slår in ett namn som innehåller endast bokstäver. 
                    if (Regex.IsMatch(name, @"^[a-zA-Z]+$"))
                    {
                        names[i] = name;
                        success = false;
                    }
                    else
                    {
                        Console.WriteLine("Du har inte angett ett korrekt namn, testa igen!\n");
                        success = true;
                    }
                } while (success);
                success = true;
            }

            Console.WriteLine("\nTryck på valfri knapp för att se de namn som du har angett.\n");
            Console.ReadKey();

            // Kallar metoden där namnen skrivs ut. 

            PrintArray(names);

            // Variabler för att identifiera position i index samt det namn som ska införas i stället uppges. 

            string selectionString;
            int selectionInt;
            Console.WriteLine("");

            // Användaren får slå in namn. 
            do
            {
                Console.WriteLine("Ange index till det namn som du vill byta ut.");
                Console.WriteLine("Om du vill avsluta programmet i stället, tryck på q eller Q.");
                selectionString = Console.ReadLine();
                bool result = int.TryParse(selectionString, out selectionInt);

                // Vid klick på q eller Q stängs programmet. 
                if (result = false && selectionString == "q" || selectionString == "Q")
                {
                    Environment.Exit(0);
                }

                // Om selection ligger inom arrayens längd och en int har angetts sätts success till false och man kommer vidare. 
                else if (result = true && selectionInt < names.Length && selectionInt >= 0)
                {
                    success = false;
                }

                // Om selection ligger utanför arrayens och en int har angetts loopas det och man får försöka igen. 
                else if (result = true && selectionInt >= names.Length || selectionInt <= 0)
                {
                    Console.WriteLine("Du har angett ett tal som inte finns i arrayen. Ange ett tal mellan 0 och " + (names.Length - 1) + "\n");
                    success = true;
                }

                // Om man slår in en bokstav exempelvis loopas det och man får försöka igen. 
                else
                {
                    Console.WriteLine("Du har inte angett ett en siffra. Ange ett tal mellan 0 och " + (names.Length - 1) + "\n");
                    success = true;
                }
            } while (success);
            success = true;

            string changedName;

            do
            {
                Console.Write("\nSkriv det namn som du vill ha på indexplats " + selectionInt + ": ");
                changedName = Console.ReadLine();

                // Här testas att man slår in ett namn som innehåller endast bokstäver. 
                if (Regex.IsMatch(name, @"^[a-zA-Z]+$"))
                {
                    changedName = name;
                    success = false;
                }
                else
                {
                    Console.WriteLine("Du har inte angett ett korrekt namn, testa igen!");
                    success = true;
                }
            } while (success);
            success = true;

            names[selectionInt] = changedName;

            Console.WriteLine("Det nya namnet på arrayplats " + selectionInt + " är " + changedName + ".\n");
            Console.WriteLine("Arryen ser nu ut som följer:");

            // Kallar metoden där namnen skrivs ut. Arrayen är nu uppdaterad. 

            PrintArray(names);

            Console.WriteLine("\nTryck på valfri knapp för att avsluta.");
            Console.ReadKey();

            #endregion

        }

        static void PrintArray(string[] array)
        {
            // Denna metod skriver ut en namnarray.  
            for (int i = 0; i<array.Length; i++)
            {
                Console.WriteLine("Namn " + (i + 1) + ": " + array[i]);
            }
        }
    }
}
Citera
2016-04-02, 09:05
  #4
Medlem
tj.s avatar
Ekvivalens är ==, tilldelning är =. I dina if-satser tilldelar du result till diverse värden men jämför den aldrig...
Citera
2016-04-02, 22:56
  #5
Medlem
PGriffins avatar
Hej och tack för tipset.

Jag har grejat med programmet under dagen och fått ihop ett program som jag är nöjd med. Jag klistrar in det med hopp om att det kan hjälpa någon i framtiden. Detta program är helt buggsäkert (så vitt jag lyckas).

Kod:
            string menuSelection;
            double tempInput;
            double tempInputDelValue;
            int delSelection;

            List<double> tempList = new List<double>();

            // This one is used for the do while loop for deleting elements. 
            bool success = true;

            // The menu loop makes the menu loop forever. 
            bool menuLoop = true;

            // The result bool is for checking that the values are OK. 
            bool result = false;

            do
            {
                // Print out menu. 
                Console.WriteLine("[A]dd temperature sample");
                Console.WriteLine("[P]rint all temperature samples and average temperature");
                Console.WriteLine("[D]elete temperature sample");
                Console.WriteLine("[Q]uit");

                // Take menu input from user. 
                Console.Write("\nWrite your command: ");
                menuSelection = Console.ReadLine();
                Console.WriteLine();

                // Add temperature code. 
                if (menuSelection == "a" || menuSelection == "A")
                {
                    do
                    {
                        Console.Write("Input the temperature that you want to add: ");
                        result = double.TryParse(Console.ReadLine(), out tempInput);

                        // Validation that the user input is a double number. 
                        if (result == true)
                        {
                            tempList.Add(tempInput);
                            Console.WriteLine("\nYou've entered the temperature " + tempInput);
                            Console.ReadKey(true);
                            Console.Clear();
                        }
                        else if (result == false)
                        {
                            Console.WriteLine("\nYou didn't input a correct number, try again!\n");
                            Console.ReadKey(true);
                        }
                    } while (result == false);
                }
                else if (menuSelection == "p" || menuSelection == "P")
                {
                    // Validation that there is at least 1 element in the tempList. 
                    if (tempList.Count == 0)
                    {
                        Console.WriteLine("No temperatures are entered. Enter at least one temperature before you try to print.");
                        Console.ReadKey(true);
                        Console.Clear();
                    }

                    else
                    {
                        Console.WriteLine("The following values are stored:");
                        Console.WriteLine("Index\t\tValue");
                        for (int i = 0; i < tempList.Count; i++)
                        {
                            Console.WriteLine(i + "\t\t" + tempList[i]);
                        }

                        Console.Write("\nThe sum of the stored values is: " + tempList.Sum());
                        Console.Write("\nThe average of the stored values is: " + tempList.Average());
                        Console.ReadKey(true);
                        Console.Clear();
                    }
                }

                else if (menuSelection == "d" || menuSelection == "D")
                {
                    // Validation that there is at least 1 element in the tempList. 
                    if (tempList.Count == 0)
                    {
                        Console.WriteLine("No temperatures are entered. Enter at least one temperature before you try to delete.");
                        Console.ReadKey(true);
                        Console.Clear();
                    }

                    else
                    {
                        do
                        {
                            Console.Write("Input the element that you want to exclude from the list: ");
                            Console.WriteLine("");
                            result = int.TryParse(Console.ReadLine(), out delSelection);

                            if (result == true && delSelection >= 0 && delSelection < tempList.Count)
                            {
                                tempInputDelValue = tempList[delSelection];
                                tempList.RemoveAt(delSelection);
                                Console.WriteLine("You've deleted the temperature " + tempInputDelValue + " from index " + delSelection);
                                success = false;
                                Console.ReadKey(true);
                                Console.Clear();
                            }

                            else if (result == true && delSelection >= tempList.Count || delSelection < 0)
                            {
                                Console.WriteLine("You've input a number that's outside the list. Input a digit between 0 and " + (tempList.Count - 1) + ".\n");
                                success = true;
                                Console.ReadKey(true);
                            }

                            else if (result == false)
                            {
                                Console.WriteLine("You didn't input a digit, try again!\n");
                                success = true;
                                Console.ReadKey(true);
                            }
                        } while (success);
                        success = false;
                    }
                }

                else if (menuSelection == "q" || menuSelection == "Q")
                {
                    Environment.Exit(0);
                }
                else
                {
                    Console.WriteLine("You haven't used a valid option. Try again!\n");
                    Console.ReadKey(true);
                    Console.Clear();
                }
            } while (menuLoop);
Citera
2016-04-02, 23:20
  #6
Medlem
tj.s avatar
Du kan förenkla dina if-satser och skriva if (success) respektive if (!success) (om det inte ska stämma) istället för att skriva if (success == true) eller if (success == false).
Citera

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