Miejsce deklaracji zmiennej w pętli sprawdzającej czy liczba jest pierwsza

2

Cześć,

mam o to taki programik:

int[] tab = new int[100];
Random rnd = new Random();
int ile = 0;
for (int i = 0; i < tab.Length; i++)
{
    tab[i] = rnd.Next(1, 1000);
}
for (int j = 0; j < tab.Length; j++)
{
    bool czypierwsza = true;

    for (int i = 2; i <= Math.Sqrt(tab[j]); i++)
    {
          if (tab[j] % i == 0)
          {
            czypierwsza = false;
            break;
          }
    }
    if (tab[j] < 2)
    {
        czypierwsza = false;
    }
    if (czypierwsza)
    {
        ile++;
    }
}
Console.WriteLine("Ilość liczb pierwszych: {0}", ile);

Program ma za zadanie sprawdzać czy element tablicy jest liczbą pierwszą a nastepnie zliczyc ich ilość.

Program jednak nie działa prawidłowo w momencie deklaracji zmiennej czypierwsza w miejscu deklaracji pozostałych zmiennych takich jak na przykład tablica. Trzeba ją zadeklarować w momencie zainicjalizowania pierwszej pętli która sprawdza czy element jest liczbą pierwszą.

Dlaczego to tak działa?

Pytam bo początkowo deklarowałem ją na początku programu i po długiej chwili sprawdzania każdej linijki okazało się że chodzi o to..

2

Dlatego że Twoja wewnętrzna pętla ustawia czypierwsza = false, a więc żeby poprawnie sprawdzić czy liczba jest pierwsza, to zmienna czypierwsza musi być ustalona początkowo na true przed obiegiem pętli. Jeśli zdefiniujesz zmienną przed zewnętrzną pętlą, to nie ustawisz jej na true w pętli wewnątrznej.

To co mógłbyś zrobić, to:

bool czypierwsza; // deklaracja
for (int j = 0; j < tab.Length; j++)
{
    czypierwsza = true; // ponowne ustawienie przed każdą wewnątrzną pętlą.

    for (int i = 2; i <= Math.Sqrt(tab[j]); i++)
    {

Refaktor kodu

Ale już pomijając ten problem, to on całkowicie by zniknął gdybyś wydzielił funkcję:

bool isPrime(int number) {
  if (number < 2) {
    return false;
  }
  for (int i = 2; i <= Math.Sqrt(number); i++) {
    if (number % i == 0) {
      return false;
    }
  }
  return true;
}

int[] tab = new int[100];
Random rnd = new Random();
int ile = 0;
for (int i = 0; i < tab.Length; i++)
{
    tab[i] = rnd.Next(1, 1000);
}
for (int j = 0; j < tab.Length; j++)
{
    if (isPrime(tab[j]))
    {
        ile++;
    }
}
Console.WriteLine("Ilość liczb pierwszych: {0}", ile);
1

@Galand:

Słowa są ważne.
Myślisz o tym jako "deklaracja" i masz zgryz. Gdybyś myślał "deklaracja z inicjacją" sam byś sobie odpowiedział.

W praktyce trzeba podstawić w tym samym miejscu gdzie deklarujesz - jak we fragmencie superusera @Riddle

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