eMatematikas Prisijunk Forumas Egzaminų užduotys ONLINE testai

Ginčas dėl VBE bandomųjų užduočių su mokytoju


Sveiki - trumpai ir aiškiai, analizuodamas bandomųjų IT programavimo užduočių sprendimus užtikau įdomią vietą, dėl kurios, aišku, su savo IT mokytoja bergždžiai prasiginčyjau. Kalbėsiu apie VBE 2015 metų pakartotinės sesijos antrąją programavimo užduotį pavadinimu "Mokiniai". Mano dilema yra susijusi su duomenų skaitymu. Programuoju C++ kalba.

Užduotyje buvo pateikti tokie duomenys:


http://i.imgur.com/LJmjpk2.png
Pirmoje eilutėje nuskaitau du kintamuosius n ir m. Šoku į kitą eilutę, kurioje nuskaitau mokytojo testo sprendimo numerį (mano kode m_nr). Visi ginčai prasideda būtent nuo šitos vietos. Mano versija būtų tokia: dedu ciklą, kuris kiekvieną kartą nuskaito po du kintamuosius, kurie, kaip ir pateikta sąlygoje, yra atskirti tarpo simboliu vienas nuo kito. Pirmoms dešimt pozicijų naudoju get() funkciją, su kuria nuskaitau po vieną simbolį. Simbolius pridėdamas prie string kintamojo vardas, kuris yra struktūros dalis, gaunu pilną vardą. Vienuoliktoje pozicijoje, mano supratimu, yra tarpo simbolis, tad naudoju ignore(1) funkciją, jog tarpą praleisčiau. Toliau nuo 12 pozicijos iki eilutės galo nuskaitau testo atsakymus, kurie nėra atskirti tarpais. Tam taip pat naudoju get() funkciją. Vizualiai mano skaitymas atrodytų šitaip: http://i.imgur.com/E7tNRk6.png
Deja, mokytoja su tokiu duomenų skaitymu nesutinka. Jos supratimu duomenų failas yra kiek kitoks, tad daugumą taškų už šitą uždavinį aš praradau, nes nuskaičius kitokį duomenų failą kitos mano programos dalys nebefunkcionuoja normaliai. Ką teisingu duomenų failų skaitymu laiko mokytoja? Naudojamas tas pats ciklas, o iš pirmų dešimties pozicijų nuskaitomas vardas. Toliau, pagal ją, tarpelio nėra ir vienuoliktoje pozicijoje yra pirmoji atsakymų raidė. Vizualiai jos skaitymas atrodytų šitaip:
http://i.imgur.com/gGEiM6l.pngLogiška?

Tokius pat argumentus, kuriuos rodau jums, pateikiau ir mokytojai, tačiau gavau atsakymą, jog knygoje (tikriausiai programavimo vadovėlyje) duomenys skaitomi būtent jos būdu. Prašau jūsų pagalbos atsipaistant, kas čia yra teisinga, ir pridedu savo skaitymo algoritmą (IDE - Code::Blocks, programavimo kalba - C++).

http://i.imgur.com/2u7K7SC.png
Kad būtų aiškiau, šiek tiek papildau:
const int MAX = 10;

P.S. Jeigu nuotraukos sunkiai matomos, teks atsidaryti naujame lange, kitaip įkelt nemokėjau.
P.P.S. Programavimo vadovėlį perverčiau, nieko aiškesnio neradau.

Ačiū jums už pagalbą.

pakeista prieš 8 m

Sveikas, kadangi vardas uzima 10 poziciju (parasyta salygoje) ir su juo nera atliekama jokiu papildomu veiksmu (turiu omeny skaidyti raides ir pan.), paprasciau butu daryti taip:

1) Virs ciklo susideklaruoji kintamaji char vardas[11]; o cikle:

fd.get(vardas, 10, ' ');      // arba be ' ', nebandziau su CodeBlocks
B[i].vardas = vardas;

------------------------------------------------------------------------------------------------------------------------------------------------------
2) Jeigu atlieki nuskaityma savo budu, tai as tavo vietoje cikle, kur yra fd.get(sym) susikurciau if statement ir tikrinciau, ar buvo sutiktas tarpo simbolis, arba naudociau if(isalpha(sym)) {...}

Taigi, siulyciau likti prie pirmojo varianto, kadangi jis yra paprastesnis ir rezultatu faile graziau vardai susiraso, kadangi vardus nuskaito su tarpais, jeigu jie neuzima 10 poziciju. Sekmes ruosiantis IT VBE! :)

pakeista prieš 7 m

purexltSveikas, kadangi vardas uzima 10 poziciju (parasyta salygoje) ir su juo nera atliekama jokiu papildomu veiksmu (turiu omeny skaidyti raides ir pan.), paprasciau butu daryti taip:

1) Virs ciklo susideklaruoji kintamaji char vardas[11]; o cikle:

fd.get(vardas, 10, ' ');      // arba be ' ', nebandziau su CodeBlocks
B[i].vardas = vardas;

------------------------------------------------------------------------------------------------------------------------------------------------------
2) Jeigu atlieki nuskaityma savo budu, tai as tavo vietoje cikle, kur yra fd.get(sym) susikurciau if statement ir tikrinciau, ar buvo sutiktas tarpo simbolis, arba naudociau if(isalpha(sym)) {...}

Taigi, siulyciau likti prie pirmojo varianto, kadangi jis yra paprastesnis ir rezultatu faile graziau vardai susiraso, kadangi vardus nuskaito su tarpais, jeigu jie neuzima 10 poziciju. Sekmes ruosiantis IT VBE! :)

Ačiū už atsakymą! Tai iš dalies atsako į mano klausimą, bet ar pagal užduoties duomenų pateiktą formuluotę aš gerai skaitau duomenis? Ar 11 pozicija pagal viską yra tarpelis bet kuriuo atveju? Tas man lieka neaišku dar.
Papildymas. Įsivaizduokit, kad vardo ilgis yra 10 simbolių. Regimantas, Žygimantas tarkim. Tokie juk egzistuoja. Tokie atveju, pagal VBE sąlygą, po vardo duomens turi būti tarpas, tad mano supratimu 11 pozicija yra tarpas(REGIMANTAS AABCD). Mano mokytoja sako, kad tokiu atveju tarpo irgi nebūtų(REGIMANTASAABCD), kas neatitinka egzamino užduoties nurodymo. Tad, žodžiu, baisus mind-fuckas čia, galėtų pridėt duomenų failus kartu, kad nekiltų tokių kraštutinumų.

pakeista prieš 8 m

Tylusis
purexltSveikas, kadangi vardas uzima 10 poziciju (parasyta salygoje) ir su juo nera atliekama jokiu papildomu veiksmu (turiu omeny skaidyti raides ir pan.), paprasciau butu daryti taip:

1) Virs ciklo susideklaruoji kintamaji char vardas[11]; o cikle:

fd.get(vardas, 10, ' ');      // arba be ' ', nebandziau su CodeBlocks
B[i].vardas = vardas;

------------------------------------------------------------------------------------------------------------------------------------------------------
2) Jeigu atlieki nuskaityma savo budu, tai as tavo vietoje cikle, kur yra fd.get(sym) susikurciau if statement ir tikrinciau, ar buvo sutiktas tarpo simbolis, arba naudociau if(isalpha(sym)) {...}

Taigi, siulyciau likti prie pirmojo varianto, kadangi jis yra paprastesnis ir rezultatu faile graziau vardai susiraso, kadangi vardus nuskaito su tarpais, jeigu jie neuzima 10 poziciju. Sekmes ruosiantis IT VBE! :)

Ačiū už atsakymą! Tai iš dalies atsako į mano klausimą, bet ar pagal užduoties duomenų pateiktą formuluotę aš gerai skaitau duomenis? Ar 11 pozicija pagal viską yra tarpelis bet kuriuo atveju? Tas man lieka neaišku dar.


Nuskaityma deretu daryti kaip as nurodziau pirmuoju numeriu, o tuos 'BBBDDD' susivaryti i string eilute, pavyzdziui
char vardas[11];
string atsakymai;  // sita, kaip supratau, strukturoje deklaruosi
<...>

fd.get(vardas, 10);
asmenys[i].vardas = vardas;
fd >> asmenys[i].atsakymai;  // taip praleisi kamuojama tarpo simboli tarp vardo ir mokinio rezultatu
fd.ignore();


mokinio rezultatu duomenis pasieksi for ciklu
for(int i = 0; i<n; i++)
  for(int x = 0; x<m; x++){
        cout << asmenys[i].atsakymai[x] << " ";
  } cout << endl;


Tu savo kodo 10 eiluciu pakeisdamas i mano keturias eilutes sutaupysi laiko, nereiks daug galvoti kas kaip, kai savo duomenu skaityme naudoji net tris for ciklus. O del to, ar gerai skaitai duomenis,  manau, kad yra zymiai geriau pakeisti tas penkias eilutes vardo skaitymo for cikle for(int j = 0; j<MAX; j++) į fd.get(vardas, 10);
asmenys[i].vardas = vardas;

pakeista prieš 7 m

purexlt
Tylusis
purexltSveikas, kadangi vardas uzima 10 poziciju (parasyta salygoje) ir su juo nera atliekama jokiu papildomu veiksmu (turiu omeny skaidyti raides ir pan.), paprasciau butu daryti taip:

1) Virs ciklo susideklaruoji kintamaji char vardas[11]; o cikle:

fd.get(vardas, 10, ' ');      // arba be ' ', nebandziau su CodeBlocks
B[i].vardas = vardas;

------------------------------------------------------------------------------------------------------------------------------------------------------
2) Jeigu atlieki nuskaityma savo budu, tai as tavo vietoje cikle, kur yra fd.get(sym) susikurciau if statement ir tikrinciau, ar buvo sutiktas tarpo simbolis, arba naudociau if(isalpha(sym)) {...}

Taigi, siulyciau likti prie pirmojo varianto, kadangi jis yra paprastesnis ir rezultatu faile graziau vardai susiraso, kadangi vardus nuskaito su tarpais, jeigu jie neuzima 10 poziciju. Sekmes ruosiantis IT VBE! :)

Ačiū už atsakymą! Tai iš dalies atsako į mano klausimą, bet ar pagal užduoties duomenų pateiktą formuluotę aš gerai skaitau duomenis? Ar 11 pozicija pagal viską yra tarpelis bet kuriuo atveju? Tas man lieka neaišku dar.


Nuskaityma deretu daryti kaip as nurodziau pirmuoju numeriu, o tuos 'BBBDDD' susivaryti i string eilute, pavyzdziui
char vardas[11];
string atsakymai;  // sita, kaip supratau, strukturoje deklaruosi
<...>

fd.get(vardas, 10);
asmenys[i].vardas = vardas;
fd >> asmenys[i].atsakymai;  // taip praleisi kamuojama tarpo simboli tarp vardo ir mokinio rezultatu
fd.ignore();


mokinio rezultatu duomenis pasieksi for ciklu
for(int i = 0; i<n; i++)
  for(int x = 0; x<m; x++){
        cout << asmenys[i].atsakymai[x] << " ";
  } cout << endl;


Tu savo kodo 10 eiluciu pakeisdamas i mano keturias eilutes sutaupysi laiko, nereiks daug galvoti kas kaip, kai savo duomenu skaityme naudoji net tris for ciklus. O del to, ar gerai skaitai duomenis,  manau, kad yra zymiai geriau pakeisti tas penkias eilutes vardo skaitymo for cikle for(int j = 0; j<MAX; j++) į fd.get(vardas, 10);
asmenys[i].vardas = vardas;

Per šonus, kraštus, bet supratau. Ačiū Jums labai už pastangas skleidžiant programavimo išmintį. :D

Na ten kaip ir nėra jokių dviprasmiškumų, duomenys atskirti tarpų, pirmam duomeniui skirta 10 simbolių, tada eina tarpas, ir tada testo atsakymai.

valdas3Na ten kaip ir nėra jokių dviprasmiškumų, duomenys atskirti tarpų, pirmam duomeniui skirta 10 simbolių, tada eina tarpas, ir tada testo atsakymai.


Ačiū, to aš iš tiesų ir klausiau pradžioje. Deja, visgi neišėjo savo mokytojos įtikint. Konsultavaus ir su kitu IT pedagogu, bet ir pastarasis kažkaip analogiškai įsitikinęs, nors ir sako, kad "yra įvairių niuansų" ir toks būdas lyg ir netūrėtų būti klaidingas.

Reziumė tokia, kad programą padariau universalesnę, kuri tarpą praleidžia, jeigu jis yra, o jeigu jo nėra, tai skaito paprastai. Egzamine tikriausiai tą patį taikysiu, jeigu tik laiko liks tokiam būdui, nors ir atrodo bergždžiai. Bet kuriuo atveju, kol nepateikia gryno duomenų failo, tol visada atsiranda įvairiapusiškų interpretacijų.

Nemanau, kad geras sprendimas per egzaminą kažką universalesnio daryti, tai tik bus papildomas klaidų šaltinis ir laiko švaistymas, kuris gali kainuoti visai nemažai. Geriausia įsiskaityti į uždavinį, jį suprasti ir tiesiog daryti kas parašyta. Jei man per egzaminą būtų blogai įvertinę tokį sprendimą, tai būčiau jį apskundęs.

Nori sudalyvauti šioje temoje ir parašyti savo pranešimą? Prisijungti »