» »

[C++] Naloga seznam

[C++] Naloga seznam

Matic1911 ::

Pozdravljeni!

Imam probleme pri sledeči nalogi.


/*
 *  PROSTOR ZA GLAVO
 * (ime in priimek avtorja, vpisna stevilka, besedilo naloge)
 --- --- --- --- --- --- ---
 * <ime_datoteke>.<koncnica>
 *
 *       Ustvarjeno: <datum>
 *            Avtor: <ime> <priimek>
 *  Vpisna stevilka: <vpisna_st>
 *  Besedilo naloge:
 *  1 Seznam

Implementirajte metode, ki ste jih spoznali v definiciji podatkovne strukture &#8222;seznam&#8221; na predavanjih,
in sicer s pomočjo implementacije seznama iz standardnih knjižnic programskega jezika
(tj. &#8222;list<T>&#8221; v C++ oz. &#8222;LinkedList<T>&#8221; v C#).
Povedano drugače; Razširite funkcionalnost podatkovne strukture &#8222;list<T> (C++)/&#8222;LinkedList<T>&#8221; (C#),
ki je implementirana v standardnih knjižnicah programskega jezika,
tako da boste lahko to implementacijo dvojno povezanega seznama,
uporabljali kot predvideva definicija podatkovne strukture &#8222;seznam&#8221; iz predavanj.

Posamezni elementi seznama so &#8222;Student&#8221;-je (podatkovni tip: Student).
Podatkovni tip &#8222;Student&#8221; je programska struktura (včasih imenovana tudi &#8222;zbirka&#8221;, ang. &#8222;record&#8221;),
ki je definirana in implementirana v imenskem prostoru &#8222;vaja3&#8221; v podani predlogi in vsebuje tri (3) podatke:

ime
priimek in
vpisno številko

Vsi našteti podatki v programski strukturi &#8222;Student&#8221; so nizi (tj. podatkovnega tipa &#8222;string&#8221;).

V imenskem prostoru vaja3 zagotovite in implementirajte naslednje metode:
vstavi()
vrni()
pripravi()
vrini()
odstrani()
dolzina()

Delovanje metod naj ustreza definiciji &#8222;seznama&#8221;, kot ste jo spoznali na predavanjih.
Metoda &#8222;dolzina()&#8221; naj vrne dolžino/velikost podanega seznama.
 */
//privzete vkljucitve
#include <iostream>
#include <list>
#include <string>

//definicija imenskega prostora(/podrocja)
namespace vaja3 {
//uporabljeni imenski prostori
using namespace std;

struct Student {
	string ime;	//ime studenta
	string priimek;	//priimek studenta
	string vpisna;	//vpisna stevilka studenta
};

//proste metode v imenskem prostoru

list<Student> pripravi() {//funkcija ki pripravi seznam

	list<Student> seznam;
	return seznam;
}

void vstavi(list<Student> &seznam, int indeks, const Student &podatek) {//funkcija ki vstavi podatek

    list<Student>::iterator it = seznam.begin();

    for(int i = 0; i < indeks; i++) {

            it++;
    }
    seznam.insert(it, podatek);
}

Student vrni(const list<Student> &seznam, int indeks) {//funkcija ki vrne podatek

    list<Student>::iterator it;

    for(int i = 0; i < indeks; i++) {

            it++;
    }
    return* it;
}

void vrini(list<Student> &seznam, int indeks, const Student &podatek) {//funkcija ki vrine podatek

    list<Student>::iterator it = seznam.begin();

    for(int i=0; i < indeks ; i++) {

            it++;
    }
    seznam.insert(it, podatek);
}

Student odstrani(list<Student> &seznam, int indeks) {//funkcija ki odstrani podatek

    list<Student>::iterator it = seznam.begin();

    for(int i=0; i < indeks ; i++) {

            it++;
    }
    seznam.erase(it);
}

int dolzina(const list<Student> &seznam) {//funkcija ki vrne dolzino seznama

	return seznam.size();
}

}

using namespace vaja3;

//glavna metoda - globalna

Student naredi_studenta(const string &ime,
		const string &priimek,
		const string &vpisna) {
	Student nov_student;
	nov_student.ime=ime;
	nov_student.priimek=priimek;
	nov_student.vpisna=vpisna;
	return nov_student;
}

list<Student> naredi_testni_seznam() {
	list<Student> seznam;
	Student prvi=naredi_studenta("Ime1", "Priimek1", "E1234567");
	seznam.push_back(prvi);
	Student drugi=naredi_studenta("Ime2", "Priimek2", "E2345678");
	seznam.push_back(drugi);
	Student tretji=naredi_studenta("Ime3", "Priimek3", "E3456789");
	seznam.push_back(tretji);
	Student cetrti=naredi_studenta("Ime4", "Priimek4", "E4567890");
	seznam.push_back(cetrti);

	return seznam;
}

/*
 * Povzetek(/Summary):
 * (*description*)
 * Opombe(/Remarks):
 * (*description*)
 * Parametri(/Parameters):
 *     ime(/name): argn (int)
 *     Stevilo argumentov programa - tj. dolzina polja args (2. parametra metode).
 *     ime(/name): args (char**)
 *     Argumenti programa (oz. argumenti podani v program ob zagonu) v obliki nizov,
 *     ki se prenesejo v main kot polje (C-jevskih) nizov (tj. polja polj znakov,
 *     zaradi cesar je tip parametra kazalec na polje (C-jevskih) nizov (tj.
 *     kazalec na polje polj znakov).
 * Vracilo(/Return): (int)
 * (*description*)
 */
int main(int argn, char** args) {

	//testni scenarij "Vrini na zadnje mesto v neprazen seznam."
	char* opis_scenarija="Vrini na konec nepraznega seznama.";
	char* ime_metode="void vrini(list<Student>&, int, const Student&)";

//	list<Student> testni_seznam=naredi_testni_seznam();
	list<Student> testni_seznam;
	Student prvi;
	prvi.ime="Ime1";
	prvi.priimek="Priimek1";
	prvi.vpisna="E1234567";
	testni_seznam.push_back(prvi);
	Student drugi;
	drugi.ime="Ime2";
	drugi.priimek="Priimek2";
	drugi.vpisna="E2345678";
	testni_seznam.push_back(drugi);
	Student tretji;
	tretji.ime="Ime3";
	tretji.priimek="Priimek3";
	tretji.vpisna="E3456789";
	testni_seznam.push_back(tretji);



	//Student cetrti=naredi_studenta("Ime4", "Priimek4, "E3456789");
	Student cetrti;
	cetrti.ime="Ime4";
	cetrti.priimek="Priimek4";
	cetrti.vpisna="E3456789";

	int dolz_seznama=(int)testni_seznam.size();

	int indeks=3;
	vrini(testni_seznam, indeks, cetrti);

	if (++dolz_seznama!=(int)testni_seznam.size()) {
		cout << "V testnem scenariju \""
				<< opis_scenarija
				<< "\"; Metoda \""
				<< ime_metode
				<< "\" ni vrnila seznama pricakovane dolzine ("
				<< dolz_seznama
				<< "), pac pa dolzine "
				<< (int)testni_seznam.size()
				<< endl;
	}

	Student zadnji=testni_seznam.back();
	if (cetrti.ime!=zadnji.ime
			|| cetrti.priimek!=zadnji.priimek
			|| cetrti.vpisna!=zadnji.vpisna) {
		cout << "V testnem scenariju \""
				<< opis_scenarija
				<< "\"; Metoda \""
				<< ime_metode
				<< "\" ni vrinila podanega studenta na zadnje mesto v seznamu."
				<< endl;
	}

	/*
	 * V metodi [mM]ain tokrat vidite test natanko enega testnega scenarija.
	 * In sicer "Vrini na konec nepraznega seznama."
	 * Ta scenarij preveri, ali metoda vrini() pravilno doda element na konec
	 * nepraznega seznama.
	 * Prvo se ustvari seznam in se napolni z nekaj elementi, da ni prazen.
	 * Nato se ustvari nov element, tj. element, ki bo poslan metodi vrini(),
	 * da ga vrine v seznam.
	 * Za potrebe kasnejsega testa, se shrani dolzina seznama pred izvedbo metode,
	 * ki se testira.
	 * Izvede se klic metode vrini. Metoda prejme:
	 * - neprazen seznam
	 * - indeks na katerega naj vrine element, ki nosi vrednost dolzine seznama,
	 *       torej "indeksa, ki je za ena vecji od dolzine seznama pred klicem
	 *       metode vrini()"
	 * - element, ki ga naj metoda vrine v seznam
	 *
	 * Po izvedenem klicu, preverimo:
	 * Ali se je dolzina seznama resnicno povecala za ena? in
	 * Ali je zadnji element v seznamu resnicno tisti, ki smo ga podali kot
	 *     parameter metode?
	 * V primeru, da je odgovor na katero od vprasanj "Ne.", se izpise ustrezna
	 * obrazlozitev, drugace nic.
	 *
	 * Preden se ustvari neprazen seznam, je v komentarju skrit klic metode
	 * "naredi_testni_seznam()", ki naredi enako kot serija ukazov za njim.
	 * Prav tako je v komentarju preden se ustvari element, ki je nato poslan metodi
	 * "vrini()" skrit klic metode "naredi_studenta()", ki to opravi namesto serija
	 * naslednjih ukazov.
	 *
	 * Podobno, kot omenjeni metodi lahko ustvarimo druge pomozne metode, ki nam
	 * olajsajo testiranje. Npr. lahko bi ustvarili metodo, npr. z imenom
	 * "test_vrini_na_konec_nepraznega_seznama()", kamor bi prestavili serijo vseh
	 * ukazov, ki spadajo k testu prikazanega scenarija.
	 *
	 * Prav tako lahko po tem zgledu, ustvarimo druge metode, ki implementirajo druge
	 * testne scenarije.
	 *
	 * Vse scenarije ali izbor le-teh, nato samo klicemo iz metode main(), da v enem
	 * izvajanju preverimo vse scenarije, ki zelimo, da se preverijo.
	 *
	 * Nekateri drugi scenariji testov te naloge vkljucujejo naslednje, vendar niso
	 * omejeni le nanje:
	 * - Vrini na zacetek nepraznega seznama
	 * - Vrini na sredino nepraznega seznama
	 * - Vrini v prazen seznam (prazen pomeni: dolzina seznama je enaka 0, torej ne
	 *     vsebuje nobenega elementa)
	 * - Vstavi na zacetek seznama
	 * - Vstavi na konec seznama
	 * - Vstavi na sredino seznama
	 * - Vrni element na zacetku/sredini/koncu seznama (misljeni so trije razlicni
	 *     scenariji)
	 * - Odstrani element na zacetku/sredini/koncu seznama
	 * - Preveri ali "dolzina()" resnicno vraca pravilno dolzino podanega seznama.
	 * - Preveri ali "pripravi()" pravilno ustvari seznam.
	 */


	return 0;
}

//na koncu prazna vrstica


Torej moja vprašanja so sledeča:

- kako lahko izpišem seznam na zaslon
- kako bi lahko naredil tiste teste, ki so opisani v komentarjih
- ali imam vse metode pravilno napisane
- če niso vse pravilno napisane katere so napačne in kako naj odpravim napake

To je zaenkrat :)

Za vso pomoč in odgovore se zahvaljujem

LP

techfreak :) ::

- kako lahko izpišem seznam na zaslon

Z zanko greš od seznam.begin() do seznam.end() in izpisuješ ime, priimek in vpisno vsakega elementa (študenta).

- kako bi lahko naredil tiste teste, ki so opisani v komentarjih

Pri Vrini na zacetek nepraznega seznama vrineš študenta na začetek seznama s tvojo metodo in pogledaš če je res na začetku. To lahko preveš s funkcijo, lahko pa izpišeš vse in sam pregledaš če je pravilno vrinil.

- ali imam vse metode pravilno napisane

To najlažje ugotoviš s testiranjem. Sicer pa zgleda da metoda vrini pri tebi dela isto kot metoda vstavi, čeprav domnevam da vrini zamenja element na indeksu i, vstavi pa ga doda.

failcoder ::

Neki na brzino skup zmetan.


#include <iostream>
#include <list>
#include <string>


using namespace std;


namespace vaja3 {

    class Student {
    public:
        Student() {}
        Student(const string& ime, const string& priimek, const string& id) : m_ime( ime ), m_priimek( priimek ), m_id( id ) {}

        string& ime()     { return m_ime; }
        string& priimek() { return m_priimek; }
        string& id()      { return m_id; }

    private:
        string m_ime;
        string m_priimek;
        string m_id;
    };


    list<Student> pripravi()
    {
        return list<Student>();
    }

    void vstavi(list<Student>& seznam, const Student& student)
    {
        seznam.push_back( student );
    }

    bool vrni(list<Student>& seznam, int indeks, Student& student)
    {
        int idx = 0;

        for( list<Student>::iterator i = seznam.begin(); i != seznam.end(); i++ )
        {
            if( idx == indeks )
            {
                student = *i;
                return true;
            }
            idx++;
        }
        return false;
    }
 
    bool vrini(list<Student>& seznam, int indeks, const Student& student)
    {
        int idx = 0;
 
        for( list<Student>::iterator i = seznam.begin(); i != seznam.end(); i++ )
        {
            if( idx == indeks )
            {
                seznam.insert( i, student );
                return true;
            }
            idx++;
        }
        return false;
    }
 
    bool odstrani(list<Student> &seznam, int indeks)
    {
        int idx = 0;
 
        for( list<Student>::iterator i = seznam.begin(); i != seznam.end(); i++ )
        {
            if( idx == indeks )
            {
                seznam.erase( i );
                return true;
            }
            idx++;
        }
        return false;
    }

    int dolzina(list<Student> &seznam)
    {
        return static_cast< int >( seznam.size() );
    }
}


int _tmain(int argc, _TCHAR* argv[])
{
    using namespace vaja3;

    string opis_scenarija = "Vrini na konec nepraznega seznama.";
    string ime_metode     = "void vrini(list<Student>&, int, const Student&)";


    list<Student> testni_seznam;

    vstavi( testni_seznam, Student( "Ime1", "Priimek1", "E1234567" ) );
    vstavi( testni_seznam, Student( "Ime2", "Priimek2", "E2345678" ) );
    vstavi( testni_seznam, Student( "Ime3", "Priimek3", "E3456789" ) );

    int dolz_seznama_pred = dolzina( testni_seznam );

    int dolz_seznama_po = dolz_seznama_pred;


    Student cetrti( "Ime4", "Priimek4", "E3456790" );

    int vstavi_na_mesto_3 = 2;

    if( vrini( testni_seznam, vstavi_na_mesto_3, cetrti ) == true )
    {
        dolz_seznama_po = dolzina( testni_seznam );
    }


    if( dolz_seznama_po != dolz_seznama_pred + 1 )
    {
        cout << "V testnem scenariju \""
             << opis_scenarija
             << "\"; Metoda \""
             << ime_metode
             << "\" ni vrnila seznama pricakovane dolzine ("
             << dolz_seznama_pred + 1
             << "), pac pa dolzine "
             << dolz_seznama_po
             << endl;
    }


    Student zadnji;
    int     zadnji_idx = dolz_seznama_po - 1;

    if( vrni( testni_seznam, zadnji_idx, zadnji ) == true )
    {
        if( zadnji.id() != cetrti.id() )
        {
            cout << "V testnem scenariju \""
                 << opis_scenarija
                 << "\"; Metoda \""
                 << ime_metode
                 << "\" ni vrinila podanega studenta na zadnje mesto v seznamu."
                 << endl;
        }
    }


    for( list<Student>::iterator i = testni_seznam.begin(); i != testni_seznam.end(); i++ )
    {
        Student& student = *i;

        cout << "ime: " << student.ime()
             << "  priimek: " << student.priimek()
             << "  id: " << student.id()
             << endl;
    }

    cin.get();

	return 0;
}

Zgodovina sprememb…

  • spremenilo: failcoder ()

Matic1911 ::

To tudi sam mislim, da bi morala metoda vrini zamenjati element na določenem indeksu.

Bi mi lahko kdo napisal kodo ali pa vsaj del kode za tale vrini, ker vem, da je podobna vstavi samo nevem kako naj zamenjam element.

techfreak :) ::

Mislim da nekaj v smislu:
Student student("Miha", "Novak", "E1064312");
list<Student>::iterator it = seznam.begin();
 
    for(int i = 0; i < indeks; i++) {
 
            it++;
    }

(*it) = student;

Elementu na indeksu i spremeniš vrednost na novega študenta.

failcoder ::

Zelo NE varen način programiranja. Kaj se zgodi v primeru, da je index parameter večji od velikosti list-a?

Matic1911 je izjavil:

To tudi sam mislim, da bi morala metoda vrini zamenjati element na določenem indeksu.

Bi mi lahko kdo napisal kodo ali pa vsaj del kode za tale vrini, ker vem, da je podobna vstavi samo nevem kako naj zamenjam element.



A si sploh pogledal mojo kodo, al sem zastonj zgublu cajt?

Zgodovina sprememb…

  • spremenilo: failcoder ()

Matic1911 ::

failcoder nisi zastonj zgubljal časa in sem ti hvaležen za tisto kodo.

Torej če prav razumem funkcija vrini zamenja element na indeksu, ki ga podamo z klicem funkcije?

techfreak :) ::

Zelo NE varen način programiranja. Kaj se zgodi v primeru, da je index parameter večji od velikosti list-a?

Sicer sem dal samo primer kako je možno spremeniti določen element, lahko bi pa uporabili tudi malo hitrejšo varianto:
if(indeks < seznam.size()) {
list<Student>::iterator it = seznam.begin();
advance(it, indeks);
(*it) = student;
}


Načeloma pa je v primeru da želimo večkrat dostopat do i-tega elementa bolje uporabiti std::vector.

Matic1911 je izjavil:

Torej če prav razumem funkcija vrini zamenja element na indeksu, ki ga podamo z klicem funkcije?

Da.

Zgodovina sprememb…

failcoder ::

Matic1911 je izjavil:

Torej če prav razumem funkcija vrini zamenja element na indeksu, ki ga podamo z klicem funkcije?


vrini funkcija vrine v tem primeru četrti študent na tretje mesto, tretji študent se pomakne na četrto mesto. Če hočeš zamenjati dva študenta pa sestavi funkcijo s pomočjo moje funkcije in zadnje postane funkcije od techfreaka. Pazi tudi na to, da je index prvega elementa v stl kontejnerju 0.

J4zzm4n ::

1.) če je v funkciji vrini podani večji indeks kot je število elementov v seznamu se doda študent-podatek na zadnje mesto seznama - je napisano na forumu
2.) priporočam ti, da se držiš njihovih predlog, ker če boš spreminjat metode ti bodo nalogo zavrnili magari bo delalo čist enako. Tako, da "failcoder" lepo da si mu pomagal ampak nevem zakaj si mu metode spremenil(primer: metoda odstrani mora vrnit odstranjenega študenta, ne pa true/false)

Zgodovina sprememb…

  • spremenil: J4zzm4n ()

failcoder ::

Ok, to jest ne vem kok se mora on kej držat njihovih predlog. Iz njegovega prvega posta tudi ni razvidno, kaj je del naloge in kaj je njegovo delo? Vse skup pa brez zamere ( Matic in prfoks ) je meni izgledal en zmazek c-ja in cpp-ja. Da se v šoli ali na faksu mešajo jabuke in hruške jaz ne bi vedu, ker se jih nisem učil in ne vem kake metode dela imajo.
Kar se tiče pa funkcije odstrani, jaz ne vem al sem slep al kaj, sam jest nikjer v komentarjih ne vidim napisano, da mora funkcija vrniti kopijo odstranjenega objekta. Kar sem lahko sklepal glede na ime funkcije je to, da mora objekt biti odstranjen in nič več. Glede na to, da je v primeru njegove funkcije return type Student in da poba ni niti poizkusil vrniti karkoli, se mi je zdelo, da se je poba pač malo zatipkal.

J4zzm4n ::

Seveda ni to tvoja napaka :) Vem kakšna so pravila ker trenutno sam tudi pomagam enemu pri tem :) Drugač je pa vse razloženo v pdfjih, ki jih ima na razpolago na sistemu - tudi pseudokod ima tam,..

Matic1911 ::

J4zzm4n: brez zamere samo mislim, da ne misliš istega predmeta kot jaz. Kajti jaz imam podano v PDF-ju samo navodila za nalogo, nimam nobene pseudokode podane. No sej ni nobena skrivnost gre se za predmet Podatkovne strukture na programu RIT-VS.

Glede tega, kar sem sam napisal pa je takole. Sam sem moral napisati metode :

vstavi()
vrni()
pripravi()
vrini()
odstrani()
dolzina()

Ostalo sem dobil kot predlogo.

Se pa vsem zahvaljujem za vašo pomoč in bom sedaj probal s pomočjo vaših odgovorov sestavit delujoč program in upam, da bo zadeva delovala.

roba87 ::

Verjetno je mislil pdf od predavanj....Vsaj kolikor se spomnim za nazaj.

ERGY ::

Oni imajo po vsej verjetnosti svoja interna pravila, ki pač niso nam poznana. Ne glede na vso kodo, ki je lahko ne vem kako superiorna, še pred tem testirajo neke postulate, katere mora naloga prestati, preden jo asistent dejansko oceni. Drugače je pač zavrnjeno.

Matic1911 ::

Takole sedaj sem s pomočjo prejšnjih odgovorov sestavil skupaj program. Težave imam pri dveh metodah in sicer vrni() in odstrani(). Nevem kako naj naredim, da mi bosta metodi vračali objekt. Metoda vrni tistega na katerega kaže podani indeks pri klicu metode. Metoda odstrani() pa tistega katerega odstranim s klicem metode odstrani()

Koda:


/*
 *  PROSTOR ZA GLAVO
 * (ime in priimek avtorja, vpisna stevilka, besedilo naloge)
 --- --- --- --- --- --- ---
 * <ime_datoteke>.<koncnica>
 *
 *       Ustvarjeno: <datum>
 *            Avtor: <ime> <priimek>
 *  Vpisna stevilka: <vpisna_st>
 *  Besedilo naloge:
*  1 Seznam

Implementirajte metode, ki ste jih spoznali v definiciji podatkovne strukture ,,seznam" na predavanjih,
in sicer s pomo?jo implementacije seznama iz standardnih knjižnic programskega jezika
(tj. ,,list<T>" v C++ oz. ,,LinkedList<T>" v C#).
Povedano druga?e; Razširite funkcionalnost podatkovne strukture ,,list<T> (C++)/,,LinkedList<T>" (C#),
ki je implementirana v standardnih knjižnicah programskega jezika,
tako da boste lahko to implementacijo dvojno povezanega seznama,
uporabljali kot predvideva definicija podatkovne strukture ,,seznam" iz predavanj.

Posamezni elementi seznama so ,,Student"-je (podatkovni tip: Student).
Podatkovni tip ,,Student" je programska struktura (v?asih imenovana tudi ,,zbirka", ang. ,,record"),
ki je definirana in implementirana v imenskem prostoru ,,vaja3" v podani predlogi in vsebuje tri (3) podatke:

ime
priimek in
vpisno številko

Vsi našteti podatki v programski strukturi ,,Student" so nizi (tj. podatkovnega tipa ,,string").

V imenskem prostoru vaja3 zagotovite in implementirajte naslednje metode:

vstavi()
vrni()
pripravi()
vrini()
odstrani()
dolzina()

Delovanje metod naj ustreza definiciji ,,seznama", kot ste jo spoznali na predavanjih.
Metoda ,,dolzina()" naj vrne dolžino/velikost podanega seznama.
 */
//privzete vkljucitve
#include <iostream>
#include <list>
#include <string>

//definicija imenskega prostora(/podrocja)
namespace vaja3 {
//uporabljeni imenski prostori
using namespace std;

struct Student {
	string ime;	//ime studenta
	string priimek;	//priimek studenta
	string vpisna;	//vpisna stevilka studenta
};

//proste metode v imenskem prostoru

list<Student> pripravi() {//dela
	//TODO ustrezno implementiraj
	list<Student> seznam;
	return seznam;
}

void vstavi(list<Student> &seznam, int indeks, const Student &podatek) {//dela
	//TODO ustrezno implementiraj
	if(indeks >= 0 && indeks < seznam.size())
    {
    list<Student>::iterator it = seznam.begin();

    for(int i = 0; i < indeks; i++) {

            it++;
    }
    seznam.insert(it, podatek);
    seznam.erase(it);
    }
    else
    {
        cout << "OPOZORILO" << endl;
    }
}

Student vrni(const list<Student> &seznam, int indeks) {// ne dela
	//TODO ustrezno implementiraj
    list<Student>::iterator it;

    for(int i = 0; i < indeks; i++) {

            it++;
    }
    return* it;
}

void vrini(list<Student> &seznam, int indeks, const Student &podatek) {//dela
	//TODO ustrezno implementiraj
	if(indeks >= 0 && indeks < seznam.size())
    {
        list<Student>::iterator it = seznam.begin();

        for(int i = 0; i < indeks; i++) {

                it++;
        }
        seznam.insert(it, podatek);
    }
    else
    {
        seznam.push_back(podatek);
    }
}

Student odstrani(list<Student> &seznam, int indeks) {// ne dela
	//TODO ustrezno implementiraj
	if(indeks >= 0 && indeks < seznam.size())
    {
    list<Student>::iterator it = seznam.begin();

    for(int i=0; i < indeks ; i++) {

            it++;
    }
    seznam.erase(it);

    return *it;
    }
}

int dolzina(const list<Student> &seznam) {//dela
	//TODO ustrezno implementiraj
	return seznam.size();
}

}

using namespace vaja3;

//glavna metoda - globalna

Student naredi_studenta(const string &ime,
		const string &priimek,
		const string &vpisna) {
	Student nov_student;
	nov_student.ime=ime;
	nov_student.priimek=priimek;
	nov_student.vpisna=vpisna;
	return nov_student;
}

list<Student> naredi_testni_seznam() {
	list<Student> seznam;
	Student prvi=naredi_studenta("Ime1", "Priimek1", "E1234567");
	seznam.push_back(prvi);
	Student drugi=naredi_studenta("Ime2", "Priimek2", "E2345678");
	seznam.push_back(drugi);
	Student tretji=naredi_studenta("Ime3", "Priimek3", "E3456789");
	seznam.push_back(tretji);
//	Student cetrti=naredi_studenta("Ime4", "Priimek4", "E4567890");
//	seznam.push_back(cetrti);

	return seznam;
}

/*
 * Povzetek(/Summary):
 * (*description*)
 * Opombe(/Remarks):
 * (*description*)
 * Parametri(/Parameters):
 *     ime(/name): argn (int)
 *     Stevilo argumentov programa - tj. dolzina polja args (2. parametra metode).
 *     ime(/name): args (char**)
 *     Argumenti programa (oz. argumenti podani v program ob zagonu) v obliki nizov,
 *     ki se prenesejo v main kot polje (C-jevskih) nizov (tj. polja polj znakov,
 *     zaradi cesar je tip parametra kazalec na polje (C-jevskih) nizov (tj.
 *     kazalec na polje polj znakov).
 * Vracilo(/Return): (int)
 * (*description*)
 */
int main(int argn, char** args) {

	//testni scenarij "Vrini na zadnje mesto v neprazen seznam."
	char* opis_scenarija="Vrini na konec nepraznega seznama.";
	char* ime_metode="void vrini(list<Student>&, int, const Student&)";

//	list<Student> testni_seznam=naredi_testni_seznam();
	list<Student> testni_seznam;
	Student prvi;
	prvi.ime="Ime1";
	prvi.priimek="Priimek1";
	prvi.vpisna="E1234567";
	testni_seznam.push_back(prvi);
	Student drugi;
	drugi.ime="Ime2";
	drugi.priimek="Priimek2";
	drugi.vpisna="E2345678";
	testni_seznam.push_back(drugi);
	Student tretji;
	tretji.ime="Ime3";
	tretji.priimek="Priimek3";
	tretji.vpisna="E3456789";
	testni_seznam.push_back(tretji);

	//Student cetrti=naredi_studenta("Ime4", "Priimek4, "E3456789");
	Student cetrti;
	cetrti.ime="Ime4";
	cetrti.priimek="Priimek4";
	cetrti.vpisna="E3456789";

	Student nov;
	nov.ime = "Janez";
	nov.priimek = "Novak";
	nov.vpisna = "E1061234";

	int dolz_seznama=(int)testni_seznam.size();

	vrini(testni_seznam, 3, cetrti);

	if (++dolz_seznama!=(int)testni_seznam.size()) {
		cout << "V testnem scenariju \""
				<< opis_scenarija
				<< "\"; Metoda \""
				<< ime_metode
				<< "\" ni vrnila seznama pricakovane dolzine ("
				<< dolz_seznama
				<< "), pac pa dolzine "
				<< (int)testni_seznam.size()
				<< endl;
	}

	Student zadnji=testni_seznam.back();
	if (cetrti.ime!=zadnji.ime
			|| cetrti.priimek!=zadnji.priimek
			|| cetrti.vpisna!=zadnji.vpisna) {
		cout << "V testnem scenariju \""
				<< opis_scenarija
				<< "\"; Metoda \""
				<< ime_metode
				<< "\" ni vrinila podanega studenta na zadnje mesto v seznamu."
				<< endl;
	}

	list<Student> seznam_prazni;

    /*
	 * V metodi [mM]ain tokrat vidite test natanko enega testnega scenarija.
	 * In sicer "Vrini na konec nepraznega seznama."
	 * Ta scenarij preveri, ali metoda vrini() pravilno doda element na konec
	 * nepraznega seznama.
	 * Prvo se ustvari seznam in se napolni z nekaj elementi, da ni prazen.
	 * Nato se ustvari nov element, tj. element, ki bo poslan metodi vrini(),
	 * da ga vrine v seznam.
	 * Za potrebe kasnejsega testa, se shrani dolzina seznama pred izvedbo metode,
	 * ki se testira.
	 * Izvede se klic metode vrini. Metoda prejme:
	 * - neprazen seznam
	 * - indeks na katerega naj vrine element, ki nosi vrednost dolzine seznama,
	 *       torej "indeksa, ki je za ena vecji od dolzine seznama pred klicem
	 *       metode vrini()"
	 * - element, ki ga naj metoda vrine v seznam
	 *
	 * Po izvedenem klicu, preverimo:
	 * Ali se je dolzina seznama resnicno povecala za ena? in
	 * Ali je zadnji element v seznamu resnicno tisti, ki smo ga podali kot
	 *     parameter metode?
	 * V primeru, da je odgovor na katero od vprasanj "Ne.", se izpise ustrezna
	 * obrazlozitev, drugace nic.
	 *
	 * Preden se ustvari neprazen seznam, je v komentarju skrit klic metode
	 * "naredi_testni_seznam()", ki naredi enako kot serija ukazov za njim.
	 * Prav tako je v komentarju preden se ustvari element, ki je nato poslan metodi
	 * "vrini()" skrit klic metode "naredi_studenta()", ki to opravi namesto serija
	 * naslednjih ukazov.
	 *
	 * Podobno, kot omenjeni metodi lahko ustvarimo druge pomozne metode, ki nam
	 * olajsajo testiranje. Npr. lahko bi ustvarili metodo, npr. z imenom
	 * "test_vrini_na_konec_nepraznega_seznama()", kamor bi prestavili serijo vseh
	 * ukazov, ki spadajo k testu prikazanega scenarija.
	 *
	 * Prav tako lahko po tem zgledu, ustvarimo druge metode, ki implementirajo druge
	 * testne scenarije.
	 *
	 * Vse scenarije ali izbor le-teh, nato samo klicemo iz metode main(), da v enem
	 * izvajanju preverimo vse scenarije, ki zelimo, da se preverijo.
	 *
	 * Nekateri drugi scenariji testov te naloge vkljucujejo naslednje, vendar niso
	 * omejeni le nanje:*/
	 //* - Vrini na zacetek nepraznega seznama
	 vrini(testni_seznam, 0, nov);
	 //* - Vrini na sredino nepraznega seznama
	 vrini(testni_seznam, 1, nov);
	 /* - Vrini v prazen seznam (prazen pomeni: dolzina seznama je enaka 0, torej ne
	      vsebuje nobenega elementa)*/
	 vrini(seznam_prazni, 0, nov);
	 //* - Vstavi na zacetek seznama
	 vstavi(testni_seznam, 0, nov);
	 //* - Vstavi na konec seznama
	 vstavi(testni_seznam, 3, nov);
	 //* - Vstavi na sredino seznama
	 vstavi(testni_seznam, 1, nov);
	 // - Vrni element na zacetku/sredini/koncu seznama (misljeni so trije razlicni
	    //  scenariji)
	 vrni(testni_seznam, 0);
	 vrni(testni_seznam, 2);
	 vrni(testni_seznam, 5);
	 //* - Odstrani element na zacetku/sredini/koncu seznama
	 odstrani(testni_seznam, 0);
	 odstrani(testni_seznam, 2);
	 odstrani(testni_seznam, 4);
	 //* - Preveri ali "dolzina()" resnicno vraca pravilno dolzino podanega seznama.
	 cout << "Dolzina je: " << dolzina(testni_seznam) << endl;
	 //* - Preveri ali "pripravi()" pravilno ustvari seznam.
	 //*/

    //testni seznam
    for( list<Student>::iterator it = testni_seznam.begin(); it != testni_seznam.end(); it++ )
    {
        Student& student = *it;

        cout << "ime: " << student.ime;
        cout << "  priimek: " << student.priimek;
        cout << "  id: " << student.vpisna;
        cout << endl;
    }

    cin.get();

    //prazen seznam
    for( list<Student>::iterator it = seznam_prazni.begin(); it != seznam_prazni.end(); it++ )
    {
        Student& student = *it;

        cout << "ime: " << student.ime;
        cout << "  priimek: " << student.priimek;
        cout << "  id: " << student.vpisna;
        cout << endl;
    }

    cin.get();

	return 0;
}

//na koncu prazna vrstica


Ne smem pa spreminjati ničesar drugega kot telesa metod, ki jih morem napisati. Lahko pa v glavnem programu poljubno testiram metode.

Zgodovina sprememb…

failcoder ::

ustvariš kopijo objekta predno ga odstraniš.

Nekaj podobno temu:

Student odstrani(list<Student> &seznam, int indeks) {
    
    if(indeks >= 0 && indeks < seznam.size())
    {
    list<Student>::iterator it = seznam.begin();
 
    for(int i=0; i < indeks ; i++) {
 
            it++;
    }

    Student student = *it;

    seznam.erase(it);
 
    return student;
    }
}

failcoder ::

Se ti pa pojavi en mali problemček. Kaj boš vrnil iz funkcije v primeru, da ti index parameter ne štima? :O

smoke ::

Najbolj pravilno bi blo nič :) torej exception.

Matic1911 ::

failcoder: to tudi sam nevem kaj naj vračam :| Se moram pozanimat pri asistentu kaj želijo, da vrnemo če indeks ne štima.

Imam pa še dve vprašanji.

In sicer prvo me zanima kako naj z klicem funkcije odstrani() na zaslon izpišem kateri element sem odstranil ( tega ne rabim vendar bi rad zgolj za teste videl če odstranjuje pravilne elemente). Probal sem z
 cout << odstrani(testni_seznam, 0) 
vendar mi javi napako.

Kot drugo me zanima kako naj usposobim funkcijo vrni(). Kot vidimo je podan konstantni seznam zato sem probal takole:
Student vrni(const list<Student> &seznam, int indeks) {
	//TODO ustrezno implementiraj
    if(indeks >= 0 && indeks < seznam.size())
    {
        list<Student>::iterator it = seznam.cbegin();

        for(int i = 0; i < indeks; i++) {

            it++;
    }
    Student student = *it;

    return student;
    }
}


Tudi tole mi javi napako.

Upam, da ne zamerite, da imam toliko vprašanj vendar predno vsa vprašam res probam vse možne načine, ki mi pridejo na pamet, da bi stvar delovala, komaj nato ko se mi čisto ustavi vas začnem spraševat.

Zgodovina sprememb…

Matic1911 ::

Mi je uspelo popraviti funkcijo vrni() in sicer z const_iterator :D

Sedaj me muči samo še to kako naj vrni() izpiše na zaslon kateri element vrača.

failcoder ::

jaz bi na tvojem mestu funkcijo odstrani napisal nekako takole:


Student odstrani(list<Student> &seznam, int indeks)
{
    Student student = naredi_studenta( "Neznan", "Neznan", "Neznan" );

    if( indeks >= 0 && indeks < seznam.size() )
    {
        list<Student>::iterator it = seznam.begin();
  
        for( int i=0; i < indeks ; i++ )
        {
            it++;
        }
 
        student = *it;
 
        seznam.erase(it);
    }

    return student;
}


in potem ko izpisujes studenta takoj ves če je vse cool.


kar se tiče izpisa na zaslon mi padeta na pamet dve variante:

1. Overloading the I/O operators

2. Student student = vrni();
cout << "ime: " << student.ime;
cout << "  priimek: " << student.priimek;
cout << "  id: " << student.vpisna;

Matic1911 ::

Evo nalogo sem oddal in je bila uspešno sprejeta :D

Vsem se zahvaljujem za vašo pomoč ter vaše odgovore.

LP


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

c++ ned help

Oddelek: Programiranje
91590 (1318) barcaFan
»

Povezani seznam

Oddelek: Programiranje
131961 (1558) pohano
»

[c#] Vstavljanje vrednosti v tabelo

Oddelek: Programiranje
111507 (1329) Cvenemir
»

[c#] Napačen izpis -- prazni stringi

Oddelek: Programiranje
51403 (1345) Spura
»

[Java][Naloga] Seznam študentov, majčken problem

Oddelek: Programiranje
362224 (1911) VASkO

Več podobnih tem