• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Lista list - indeks spoza zakresu.

VPS Starter Arubacloud
0 głosów
999 wizyt
pytanie zadane 6 października 2017 w C# przez Corazzo Obywatel (1,040 p.)

Witam! 

Chciałem zrobić bazę studentów, aczkolwiek mam problem z listą list.

Tutaj stworzyłem listę list:

List<List<string>> tablica = new List<List<string>>();

Pierwszy case ma za zadanie wyświetlania listy studentów, a drugi dodawanie ich:

 

                    case 1:
                        {
                            Console.Clear();

                            Console.WriteLine(tablica.Count);
                            Console.ReadLine();

                            if (tablica.Count > 0)
                            {
                                for (int i = 0; i < tablica.Count(); i++)
                                {
                                    Console.WriteLine("Student number: " + (i+1));
                                    for (int j = 0; j < 2; j++)
                                    {
                                        Console.WriteLine();
                                        Console.Write(dane[j]);
                                        System.Console.Write(tablica[i][j].ToString());
                                    }
                                    Console.Write("\n\n-----------------------------------------------\n\n");
                                }
                            }
                            else
                            {
                                Console.Clear();
                                Console.WriteLine("The list of students is empty! Please choose option number 2 to add students!");
                            }

                            break;
                        }

                    case 2:
                        {
                            dane[0] = "Name: ";
                            dane[1] = "Surname: ";

                            int how_many_students = 0;

                            Console.Clear();
                            Console.Write("How many students do you want to add? Please enter the number: ");
                            how_many_students = Convert.ToInt32(Console.ReadLine());


                            for (int i = 0; i < how_many_students; i++)
                            {
                                Console.Clear();
                                Console.Write("Student number: " + (i + 1) + "\n");
                                tablica.Add(new List<string>());     
                                Console.Write("Enter name:");
                                tablica[i].Add(Console.ReadLine());
                                Console.Write("\nEnter surname:");
                                tablica[i].Add(Console.ReadLine());
                            }

                            break;
                        }


Podczas dodawania pierwszy raz, czyli: wybieram w menu opcję drugą i dodaje sobie 5-ciu studentów a potem wracam do menu i wybieram opcję pierwszą żeby wyświetlić ich jest wszystko okej. Lecz gdy wracam do menu i chcę dodać do tych 5-ciu studentów następnego/ych studentów to "niby" dodaje ich i zwiększa się tablica.Count(); lecz gdy chcę ich pokazać to wyświetla się tylko pierszych 5-ciu studentów. A gdy pętla próbuje dodać tych co za drugim razem dodałem wyskakuje następujący wyjątek:




Czyli wychodzi na to że indeks w pętli wychodzi poza zakres - tylko nie rozumiem dlaczego? Skoro w pętli jest:

i < tablica.Count();


Z góry dziękuje za odpowiedz!

2
komentarz 6 października 2017 przez mbabane Szeryf (79,280 p.)
edycja 7 października 2017 przez mbabane

Odchodząc od głównego problemu, czemu nie zrobisz tak, że dla tych studentów stworzysz osobna klasę Student i wtedy będzie prosto i przejrzyściej (a tak jak Ty masz aktualnie to według mnie sobie gmatwasz bardzo):

List<Student> students = new List<Student>();

class Student
{
    string name;
    string surname;
}

Wówczas odwołanie do studenta będzie wyglądało pięknie i klarownie:

students.Add( new Student() );
students[0].name = "Jan";
students[0].surname = "Kowalski";

 

1
komentarz 6 października 2017 przez obl Maniak (51,280 p.)
Najpierw niech się zastanowi co zrobił źle i poprawi (nauczy się czegoś z podstaw) a później powinien spróbować to ogarnąć tak jak powiedziałeś. Nie od razu Kraków zaorano, nie od razu początkujący programista z klas korzysta.
komentarz 7 października 2017 przez Corazzo Obywatel (1,040 p.)

Mbabane - gdy zrobiłem tak jak napisałeś wyskakuje mi ten sam wyjątek o indeksie spoza zakresu tylko, że w tej linii:
 

students[0] = new Student();


Próbowałem to naprawić na różne sposoby ale dalej to samo. Macie pomysł co teraz jest źle?

 


 

komentarz 7 października 2017 przez mbabane Szeryf (79,280 p.)

A przepraszam pominąłem jeden szczegół, żeby dodać nowy element do listy (tak aby lista stała się większą), trzeba użyć metody Add:

students.Add( new Student() );

Poprawiłem też, wyżej żeby nikogo nie wprowadzało w błąd

2 odpowiedzi

+1 głos
odpowiedź 6 października 2017 przez obl Maniak (51,280 p.)
wybrane 6 października 2017 przez Corazzo
 
Najlepsza

Twój problem związany jest z linią 48 i 51 zauważ że i oznacza w tej pętli ile rekordów masz dodać, co przy pierwszym dodawaniu rekordów odpowiada również indeksowi, ale gdy dodajesz kolejne rekordy to zamiast odwoływać się do nich ty odwołujesz się od nowa do indeksów od i = 0 do i = wybranej liczbie dodanych rekordów. Z tego powodu też masz ten swój błąd typu out of range bo do dodanych rekordów nie przypisałeś żadnych wartości :).

+1 głos
odpowiedź 7 października 2017 przez obl Maniak (51,280 p.)

To spróbuj to zrobić mniej więcej tak:

        class Student
        {
            string name;
            string surname;

            public Student()
            {
                Console.Write("Podaj imię studenciaka: ");
                name = Console.ReadLine();
                Console.Write("Podaj nazwisko delikwenta: ");
                surname = Console.ReadLine();
            }

            public void Write()
            {
                Console.WriteLine("Imię delikwenta: " + name + "; nazwisko delikwenta: " + surname);
            }
        }

        static void Main(string[] args)
        {
            List<Student> lStudents = new List<Student>();

            Console.Write("Ilu delikwentów dodać: ");
            int nr = 0;
            if(int.TryParse(Console.ReadLine(),out nr)){
                for(int i = 0; i < nr; i++){
                    lStudents.Add(new Student());
                }

                foreach(Student s in lStudents){
                    s.Write();
                }
            }
            Console.ReadLine();
        }

 

Podobne pytania

0 głosów
1 odpowiedź 326 wizyt
pytanie zadane 14 października 2022 w Python przez Ichbinda Nowicjusz (230 p.)
+1 głos
3 odpowiedzi 532 wizyt
pytanie zadane 14 lipca 2021 w HTML i CSS przez Szyszka Gaduła (3,490 p.)
0 głosów
0 odpowiedzi 1,878 wizyt
pytanie zadane 5 stycznia 2019 w C i C++ przez niezalogowany

92,454 zapytań

141,262 odpowiedzi

319,089 komentarzy

61,854 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...