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

Lista list - indeks spoza zakresu.

42 Warsaw Coding Academy
0 głosów
1,364 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,260 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,300 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,260 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,300 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,300 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ź 461 wizyt
pytanie zadane 14 października 2022 w Python przez Ichbinda Nowicjusz (230 p.)
+1 głos
3 odpowiedzi 885 wizyt
pytanie zadane 14 lipca 2021 w HTML i CSS przez Szyszka Gaduła (3,510 p.)
0 głosów
0 odpowiedzi 2,346 wizyt
pytanie zadane 5 stycznia 2019 w C i C++ przez niezalogowany

93,395 zapytań

142,389 odpowiedzi

322,569 komentarzy

62,754 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

VMware Cloud PRO - przenieś swoją infrastrukturę IT do chmury
...