Generator peselu na zajęcia do szkoły, problem na ostatniej cyfrze

0

Cześć, tworzę w Visualu generator peselu na zajęcia do szkoły i złamałem się na ostatniej, jedenastej cyfrze (kontrolnej).
Domyślam się że popełniam jakiś śmiesznie głupi, banalny błąd ale noo.. nie potrafię tego zrobić, a jest mi to bardzo potrzebne działające w pelni na lekcjeimage.
Suma na końcu kodu wychodzi jakaś zaczarowana, ponadto nie do końca chyba ogarniam konwersję str - int oraz int - str, i konwersji pojedynczych indeksów.
Czy mogę prosić o pomoc jak to rozwiązać? Muszę przemnożyć każdą z dziesięciu pierwszych cyfr peselu przez odpowiednią wagę i zsumować wyniki, tak jak w instrukcji na zdjęciu.
Z góry bardzo dziękuję !

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace Generator_peselu
{
    public partial class Form1 : Form
    {
        char plec;
        public Form1()
        {
            InitializeComponent();
        }


        private void button1_Click(object sender, EventArgs e)
        {
            Random pierwsza = new Random();
            int liczbaPorz1 = pierwsza.Next(0, 10);
            int liczbaPorz2 = pierwsza.Next(0, 10);
            int liczbaPorz3 = pierwsza.Next(0, 10);
            int liczbaPorz4 = pierwsza.Next(0, 10);
            
            bool blad = false;


            if (textBoxDataUr.Text == "")
            {
                
                MessageBox.Show("Nie podano daty urodzenia.");
                blad = true;
            }


            
            if (radioButtonM.Checked == true)
            {
                while (liczbaPorz4 % 2 == 0)
                {
                    liczbaPorz4 = pierwsza.Next(0, 10);
                }
                
            }

            else if (radioButtonK.Checked == true)
            {
                while (liczbaPorz4 % 2 != 0)
                {
                    liczbaPorz4 = pierwsza.Next(0, 10);
                }

            }

            else
            {
                MessageBox.Show("Nie zaznaczono płci.");
                blad = true;
            }


            if (blad == false)
            {

                
                string peselStr = textBoxDataUr.Text[2].ToString() + textBoxDataUr.Text[3].ToString() + textBoxDataUr.Text[5].ToString() + textBoxDataUr.Text[6].ToString() + textBoxDataUr.Text[8].ToString() + textBoxDataUr.Text[9].ToString() + liczbaPorz1.ToString() + liczbaPorz2.ToString() + liczbaPorz3.ToString() + liczbaPorz4.ToString();
                int[] peselInt = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };

                for (int i = 0; i <= 9; i++)
                {
                    peselInt[i] = peselStr[i];
                }
                
                
                int[] waga = { 1, 3, 7, 9, 1, 3, 7, 9, 1, 3 };
                int suma = 0;

                for (int i=0; i<=9; i++)
                {
                    suma += (waga[i] * peselInt[i]);
                }
                
            }
        }

     }
}
3

Nie trzymaj logiki aplikacji w tym samym miejscu co interfejs użytkownika.

0

No ok, a co to znaczy, że suma wychodzi zaczarowana?

0

@somekind: Przechwytywanie.PNG Suma przy każdym generowaniu wychodzi pomiędzy 2200 a 2400. W zasadzie tylko o to mi chodzi. Ten program nie musi być napisany rewelacyjnie zgodnie z wszelkimi konwencjami programistycznymi tylko ma działać (to tylko zadanie do szkoły), a nie mam bladego pojęcia dlaczego ta suma wychodzi w tysiącach. Z resztą jakoś bym sobie poradził.

0

@TomRiddle: Wiem że napisałem to w głupi sposób, ale dopiero się uczę i to jest mniejszy problem, bo prezentując aplikację na lekcji nie będę nawet pokazywał kodu tylko pokazywał że generuje poprawne cyferki. Problemem jest tylko ta cholerna suma, która wychodzi w tysiącach..

2
            string peselStr = textBoxDataUr.Text[2].ToString() + textBoxDataUr.Text[3].ToString() + textBoxDataUr.Text[5].ToString() + textBoxDataUr.Text[6].ToString() + textBoxDataUr.Text[8].ToString() + textBoxDataUr.Text[9].ToString() + liczbaPorz1.ToString() + liczbaPorz2.ToString() + liczbaPorz3.ToString() + liczbaPorz4.ToString();

Gdzie tu masz rozróżnianie lat 19xx od 20xx? Jeśli rok jest >= 2000 to do miesiąca trzeba dodać 20. Czyli dzisiaj (18.04.2022) to będzie 222418.

            int[] peselInt = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };

Jaki sens mają te liczby 1,2,3,4... skoro zaraz tablicę wypełniasz innymi wartościami? Zresztą ta tablica w ogóle nie jest potrzebna.

            int[] waga = { 1, 3, 7, 9, 1, 3, 7, 9, 1, 3 };
            int suma = 0;

            for (int i=0; i<=9; i++)
            {
                suma += (waga[i] * peselInt[i]);
            }

No to jest liczone po prostu źle i pozostaje mi podesłać link do źródła…

https://obywatel.gov.pl/pl/dokumenty-i-dane-osobowe/czym-jest-numer-pesel

2

@pawellosu2: z tego co widzę, to zamiast liczb jednocyfrowych używasz wartości kodów ASCII tych cyfr.

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