C# - Potrzebna pomoc w dodaniu obsługi błędu

0

Witam, potrzebuję pomocy w dodaniu do mojego kodu obsługi błędu. Od razu zwracam się z prośbą o konkrety, same rzucenie hasła funkcji niewiele mi pomoże. Szczegóły poniżej.
Oto kod mojego programu:

using System;
using System.Collections.Generic;
using System.Text;

namespace Sortowanie
{
class Program
{
static void Main(string[] args)
{
byte q, w, moc, min;
double temp;
double[] tab = new double[100];

        //Etap I: Okreslenie mocy zbioru.

        System.Console.WriteLine("Ten program wykona sortowanie elementow metoda wyboru.");
        System.Console.Write("Nacisnij Enter, aby kontynuowac.");
        System.Console.ReadLine();
        System.Console.Write("Podaj moc zbioru (0<N<100): ");
        moc = byte.Parse(Console.ReadLine());

        // Etap II: Wypełnianie tablicy i wyswietlanie jej zawartosci.

        for (q = 1; q <= moc; q++)
        {
            System.Console.Write("Liczba " + q + ": ");
            tab[q] = double.Parse(Console.ReadLine());
        }
        System.Console.WriteLine("Podane liczby: ");
        for (q = 1; q <= moc; q++) System.Console.Write("  "+tab[q]+"  ");
        System.Console.WriteLine();

        // Etap III: Sortowanie.

        for (w = 1; w < moc; w++)
        {
            min = w;
            for (q = w; q <= moc; q++) if (tab[q] < tab[min]) min = q;
            temp = tab[min];
            tab[min] = tab[w];
            tab[w] = temp;
        }

        // Etap IV: Wyswietlanie.

        System.Console.WriteLine("Wynik sortowania: ");
        for (q = 1; q <= moc; q++) System.Console.Write("  " + tab[q] + "  ");
        System.Console.ReadLine();
    }
}

}


Podczas określania mocy zbioru (tj. zmiennej "moc"), program powinien sprawdzić, __czy wprowadzona wartość jest w liczbą naturalną większą od zera__ oraz __czy jest w ogóle liczbą__. Następnie podczas wprowadzania liczb, należałoby __wykluczyć możliwość wprowadzanie niepoprawnych wartości__ (np. liter, kombinacji liter i cyfr, znaków specjalnych z wyjątkiem "." i "-"). W obydwu przypadkach jeśli podamy niezgodne wartości powinien wyświetlić się komunikat (może być to zwykły "błąd") oraz próba ponownego wprowadzenia danej, która nie powodowałby dalszego niepoprawnego działania programu.
1

Ja bym to zrobił w ten sposób:

using System;
using System.Collections.Generic;
using System.Text;

namespace Sortowanie
{
    class Program
    {
        static int Main(string[] args)
        {
            byte q, w, moc, min;
            double temp;
            double[] tab = new double[100];

            //Etap I: Okreslenie mocy zbioru.

            Console.WriteLine("Ten program wykona sortowanie elementow metoda wyboru.");
            Console.Write("Nacisnij Enter, aby kontynuowac.");
            Console.ReadLine();
            Console.Write("Podaj moc zbioru (0<N<100): ");

            try
            {
                moc = byte.Parse(Console.ReadLine());
            }
            catch (FormatException)
            {
                Console.WriteLine("Nieprawidlowy format ciagu wejsciowego.");
                return 1;
            }
            catch (OverflowException)
            {
                Console.WriteLine("Wartosc jest za duza lub za mala dla bajtu bez znaku.");
                return 1;
            }

            if (moc < 0 || moc > 100)
            {
                Console.WriteLine("Moc musi byc liczba z przedziału od 0 do 100.");
                return 1;
            }
            

            // Etap II: Wypełnianie tablicy i wyswietlanie jej zawartosci.

            for (q = 1; q <= moc; q++)
            {
                Console.Write("Liczba " + q + ": ");
                try
                {
                    tab[q] = double.Parse(Console.ReadLine());
                }
                catch (FormatException)
                {
                    Console.WriteLine("Nieprawidlowy format ciagu wejsciowego.");
                    return 1;
                }
            }
            Console.WriteLine("Podane liczby: ");
            for (q = 1; q <= moc; q++) System.Console.Write("  " + tab[q] + "  ");
            Console.WriteLine();

            // Etap III: Sortowanie.

            for (w = 1; w < moc; w++)
            {
                min = w;
                for (q = w; q <= moc; q++) if (tab[q] < tab[min]) min = q;
                temp = tab[min];
                tab[min] = tab[w];
                tab[w] = temp;
            }

            // Etap IV: Wyswietlanie.

            Console.WriteLine("Wynik sortowania: ");
            for (q = 1; q <= moc; q++) System.Console.Write("  " + tab[q] + "  ");
            Console.ReadLine();
            return 0;
        }
    }
}

Jak ktoś umie napisać lepiej, to proszę niech mnie poprawi.

3

Zamiast

           try
            {
                moc = byte.Parse(Console.ReadLine());
            }
            catch (FormatException)
            {
                Console.WriteLine("Nieprawidlowy format ciagu wejsciowego.");
                return 1;
            }
            .....

lepiej użyć TryParse. No i pętelka, która nie puści dalej dopóki użytkownik nie wpisze poprawnej wartości

bool error;
do
{
   error = false;
   //komunikat: podaj poprawną wartość
   if(!byte.TryParse(Console.ReadLine(),out moc))
   {
       //komunikat błędu
       error = true;
   }
}
while(error);
0

Dziękuję wszystkim za pomoc. Postanowiłem skorzystać z metody podaną przez Sarrusa w momencie określania mocy zbioru, jak i podawania liczb. Program działa jak należy.

0

jeśli specyfikacja dopuszcza wprowadzenie kropki, to chyba powinieneś użyć czegoś zmiennoprzecinkowego zamiast byte.
co się stanie, jeśli użytkownik poda 256 jako moc? czy wartości spoza zakresu byte mają być nieprawidłowe?

1 użytkowników online, w tym zalogowanych: 0, gości: 1