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

Mirosław Zelent quiz obiektowo

Object Storage Arubacloud
0 głosów
563 wizyt
pytanie zadane 13 lipca 2016 w C i C++ przez niezalogowany

Otóż nie rozumiem działania programu.

Dlaczego aktualny_nr=1. Przecież już w przypadku pytania 2 jak również późniejszych nr_linii nie będzie się równał jeden tylko np. 7, 13, 19, więc jak mogą działać wszystkie if-y w pętli while jeżeli warunek jest aktualny_nr==nr_linii. Tworząc obiekt pytanie tworzymy tylko pojedyncze pytanie a nie ich zestaw więc ? Czy za każdym razem while(getline(plik,linia)) przechodzi przez cały plik?

Czy to działa w ten sposób, że wszystkie pytania z pliku zostają wczytane, potem wszystkie zostają zadane, a potem wszystkie sprawdzone? Czy może tak, że każde pytanie jest wczytane, zadane, sprawdzone? Patrząc na maina wydaje mi się, że to drugie.

Czy atrybut aktualny_nr dla każdego pytania jest tworzony od nowa, nadawana jest wartość 1 i jest inkrementowany, aż osiągnie najbliższą wartość nr_linii czyli np. 7, 13,19 ... czy cały czas pędzi do przodu zwiększając się o 1?

Mógłby ktoś wytłumaczyć łopatologicznie jak działa ten program? Albo najlepiej zrobić listę kroków, które po kolei się wykonują? Nie taką listę kroków, jaką zapisuje się algorytmy, tylko krok po kroku co się dzieje , jakie wartości maja określone zmienne w danym momencie.

komentarz 13 lipca 2016 przez DragonCoder Nałogowiec (36,500 p.)
Co do 1 nr_linii=1 ale to jest wartosc poczatkowa.

3 odpowiedzi

+1 głos
odpowiedź 13 lipca 2016 przez mrcnsct Nałogowiec (36,390 p.)

O tym mówisz?

void Pytanie::wczytaj()
{
   fstream plik;
   plik.open("quiz.txt",ios::in);

   if(plik.good()==false)
   {
      cout<<"Nie udalo sie otworzyc pliku!";
      exit(0);
   }

   int nr_linii=(nr_pytania-1)*6+1;
   int aktualny_nr=1;
   string linia;

   while(getline(plik,linia))
   {
      if(aktualny_nr==nr_linii) tresc=linia;
      if(aktualny_nr==nr_linii+1) a=linia;
      if(aktualny_nr==nr_linii+2) b=linia;
      if(aktualny_nr==nr_linii+3) c=linia;
      if(aktualny_nr==nr_linii+4) d=linia;
      if(aktualny_nr==nr_linii+5) poprawna=linia;
      aktualny_nr++;
   }

   plik.close();

}

Jeśli tak, to nr_linii jest obliczony na podstawie nr_pytania (wartość do tej zmiennej jest wpisywana w main). aktualny_nr=1, ponieważ przy każdym wywołaniu tej metody, plik jest otwierany i znacznik jest na początku pliku, a więc linia wczytana jako pierwsza ma numer 1. W pętli zmienna ta jest inkrementowana, więc aktualny_nr to numer aktualnie wczytanej linii. Np. dla pytania numer 3 nr_linii to 13. aktualny_nr na początku to 1. Linie będą wczytywane w pętli while, ale aż do osiągnięcia linii 13, nic się nie będzie działo. Dla linii od 13 do 18 wykonają się odpowiednie instrukcje if. Potem wczytywanie będzie leciało dalej do końca pliku, ale nic z tymi wczytanymi danymi nie będzie się działo. Na koniec plik zostanie zamknięty. Analogicznie dla innych wywołań tej funkcji z innymi numerami pytania. Pytanie jest wczytane, zadane, sprawdzone, a potem to samo z następnym.

0 głosów
odpowiedź 13 lipca 2016 przez niezalogowany
mrcnsct

Czyli jeśli dobrze zrozumiałem w przytoczonym przez ciebie przykładzie od 1 do 12 linie są wczytywane, ale nic się z nimi nie dzieje, od 13 do 18 są wczytywane i wykonują się odpowiednie instrukcje, a od 19 do ostatniej znowu są wczytywane, ale nic się z nimi nie dzieje. Natomiast atrybut aktualny_nr cały czas jest inkrementowany, od 1 aż do ostatniej linijki.

Dla każdego obiektu klasy pytanie plik jest otwierany, aktualny_nr inkrementowany, i czytane są wszystkie linie, ale tylko z sześcioma jest coś robione, a na koniec plik jest zamykany.

Dobrze to wszystko zczaiłem?
komentarz 13 lipca 2016 przez mrcnsct Nałogowiec (36,390 p.)
edycja 13 lipca 2016 przez mrcnsct
Tak. Tylko, że aktualny_nr na koniec będzie miał numer o 1 większy niż liczba linii w pliku, bo jest on inkrementowany na końcu pętli. W ostatnim obiegu zostanie jeszcze zinkrementowany, ale linia o numerze jaki będzie on miał nie zostanie wczytana, bo jej nie będzie.
0 głosów
odpowiedź 14 lipca 2016 przez niezalogowany
A czy można zrobić tak żeby program przeczytał tylko określone linijki z pliku tekstowego np. żeby przeczytał od 13 do 18 tylko, a nie za każdym zczytywał wszystkie linie w pliku? Pytam bo nie wiem czy przypadkiem jak będzie bardzo duża liczba linii w pliku, to takie zczytywanie dla każdego pytania wszystkich linii będzie bardziej czasochłonne. Już wcześniej nurtowało mnie to pytanie. Nieraz jak miałem napisać program, który czyta od określonej linii to używałem pętli czytającej z pliku, a wewnątrz używałem

if(nr_linii < linia_od_ktorej_chce_zaczac_czytac)

          continue;

Ale tutaj też czytane są nawet te niepotrzebne linijki. Jest jakiś sposób, czy czytanie wszystkich linii to jedyna słuszna droga?

Podobne pytania

0 głosów
1 odpowiedź 538 wizyt
pytanie zadane 2 lutego 2018 w Rozwój zawodowy, nauka, praca przez xxx1990 Początkujący (490 p.)
0 głosów
0 odpowiedzi 147 wizyt
+1 głos
0 odpowiedzi 109 wizyt

92,555 zapytań

141,403 odpowiedzi

319,557 komentarzy

61,940 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

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy 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!

...