Pereiti prie turinio

C++ skaitymas masyvu


Rekomenduojami pranešimai

Sveiki, reiktų pagalbos su C++ skaitymu.

 

Užduotis:

Duomenų faile duota atsitiktinės skaičių sekų eilutės (eilučių ilgis ir skaičius skirtingas). Eilutės
pabaigos simbolis yra „*“.

 

 

Kaip isivaizduoju čia reiktų taikyt tokio tipo masyvą: "masyvas[x][y]" :lol: Bet mane glumina tas dalykas, kad kiekvienoj eilutėj pateikta nevienodai skaičių ir eilutės užbaigimas simboliu.

 

Būtų šaunu jei kas bent jau užvestumėt ant kelio. Būsiu dėkingas :)

Nuoroda į pranešimą
Dalintis kituose puslapiuose

Nelabai išeis parašyti patį kodą, nes šiandien turėjau dar tik pirmą C++ programavimo paskaitą, tačiau įsivaizduoju kaip tai galėtų atrodyti. Gali bandyti daryti taip: suki ciklą while ir tikrini koks ten simbolis (kad ir pagal ascii kodų lentelę) kol randi '*' kodą. Kažką paprasčiau pasiūlyti nesugalvoju, nes neaišku ko ten toliau nori.

 

EDIT: Ai neįsiskaičiau, eilutės pabaigos simbolis... o aš maniau pačio galo. Tuomet gali tikrinti taip pat kiekvieną ženklą iš eilės, kol randi žvaigždutės kodą ir tuomet kažką atlieki ko reikalaujama užduotyje.

Redagavo Dominus
Nuoroda į pranešimą
Dalintis kituose puslapiuose

Užtenka paprasto masyvo,sukti ciklą while iki failo pabaigos,viduj šito ciklo sukti ciklą while iki eilutės pabaigos.(Ant paskalio taip eina,dabar c++ senai benaudojęs tai neatsimenu,bet turėtų būt:) ).Skaitai po simbolį ir tikrini ar jis nėra '*', jei ne šitas simbolis tuomet incrysini kokį kintamajį 'i' ir priskiri reikšmę masyvui.

Nuoroda į pranešimą
Dalintis kituose puslapiuose

o kokiu duomenu tipu reiktu nuskaitinet? kaip suprantu INT nenuskaitytu simbolio, o CHAR nuskaitytu tik viena skaitmeni. :unsure:

 

Nežinau kiek toli tu pažengęs, bet siūlyčiau viską nuskaitinėt ne į masyvą o į sarašą (List). Nuskaitinėt gali po eilutę į string tipą o po to dėti į sąrašą.

apie list nelabai ir esu girdejes. eiluciu skaicius kintamas. beto man toliau tuos skaicius reiks prievartaut visokiais rikiavimais ir pan, todel reik kiekvieno skaiciaus INT pavidalu, o ne STRING

Redagavo Fantasya
Nuoroda į pranešimą
Dalintis kituose puslapiuose

Programos idėja:

//array musu_mylimasis_masyvas
symbol=""
while !symbol=='*'{
//nuskaitai skaičių eilutę (string)
//array eilutes_masyvas = [] 
//suskaidai ją po vieną skaičių, ir kiekvieną jų paverti į integerį, bei pridedi prie masyvo eilutes_masyvas.
//paskutinį eilutės ženklą priskiri symbol kintamajam
//masyvą eilutes_masyvas appendini į musu_mylimasis_masyvas
}
//su gauta matrica darai ką nori.

Nuoroda į pranešimą
Dalintis kituose puslapiuose

idomi mintis, bet kaip reiktu skaidyti eilute? imti su CHAR po viena simboli iki tarpo ir tada klijuoti skaiciu is skaitmenu?

 

Manau paprasčiau galima. Skaičių sekoje esantys skaičiai kažkaip vistiek turėtų būti atskirti, tarkim jie atskirti tarpais. Nuskaityta eilute analizuok taip, prisiskirk spr (skaičiaus pradžia) kintamąjį 0, poto suk ciklą while kol kintamasis tpr (Tarpo pradžia) nelygus -1. Cikle su find_first_of fja susirask pirmo tarpo vietą, taigi pirmas skaičius bus nuo 0 simbolio iki rasto simbolio. Tada su substr fja pasiimk tą skaičių į stringą, o poto jau su stringą konvertuok į integerį...

Nuoroda į pranešimą
Dalintis kituose puslapiuose

butent taip ir pradejau gaminti, bet kilo bedele. kai nusiskaitau eilutes STRING formatu, man reik uzsukti cikla tik tiek kartu kiek tu eiluciu yra. Kaip apskaiciuoti kiek masyve yra elementu? Manau reik sukt cikla ir lygint eilute su kazkuo, bet nezinau su kuo.

Nuoroda į pranešimą
Dalintis kituose puslapiuose

Va pasirasiau toki cikla:

 

	int n=0;
string p;
   while (p != "\n")
   {
               p = eiluciu_masyvas[n];
               n++;
   }  

 

Kai paleidziu si algoritma programa luzta,

 

o jei padarau

while (p == "\n")

programa normaliai pasileidzia ir grazina nuli, t.y. teisinga reiksme

Redagavo Fantasya
Nuoroda į pranešimą
Dalintis kituose puslapiuose

Va pasirasiau toki cikla:

 

	int n=0;
string p;
   while (p != "\n")
   {
               p = eiluciu_masyvas[n];
               n++;
   }  

 

Kai paleidziu si algoritma programa luzta,

 

o jei padarau

while (p == "\n")

programa normaliai pasileidzia ir grazina nuli, t.y. teisinga reiksme

 

 

 

tai nesigauna eilučių suskaičiuoti faile? Va pvz.

 

 


int EilSkaicius(string Duom) // string Duom - Failo pavadinimas
{
string Eil;
int k=0;

ifstream fd(Duom.c_str());

while(!fd.eof())
{
	getline(fd,Eil);
	k++;
}

fd.close();

return k;
}


 

 

Nuoroda į pranešimą
Dalintis kituose puslapiuose

tai nesigauna eilučių suskaičiuoti faile? Va pvz.

 

 


int EilSkaicius(string Duom) // string Duom - Failo pavadinimas
{
string Eil;
int k=0;

ifstream fd(Duom.c_str());

while(!fd.eof())
{
	getline(fd,Eil);
	k++;
}

fd.close();

return k;
}


Su šituo kodu net nelieka esmės jų skaičiuoti, nes:

1. Ciklas vykdomas iki bylos pabaigos.

2. Vieno karto metu yra perskaitoma eilutė, kurią gali laisvai naudoti.

Taigi:

while(!fd.eof())
{
	getline(fd,Eil);
	#darome ką norime su eilute(kintamasis Eil).
}

Nuoroda į pranešimą
Dalintis kituose puslapiuose

Su šituo kodu net nelieka esmės jų skaičiuoti, nes:

1. Ciklas vykdomas iki bylos pabaigos.

2. Vieno karto metu yra perskaitoma eilutė, kurią gali laisvai naudoti.

Taigi:

while(!fd.eof())
{
	getline(fd,Eil);
	#darome ką norime su eilute(kintamasis Eil).
}

 

 

 

 

jap, paskubėjau rašyt iki galo nesupratęs ko prašo žmogus :)

 

 

 

Nuoroda į pranešimą
Dalintis kituose puslapiuose

nice ideja :lol: ir kaip man i galva nesove tokia mintis :D Beveik jau pavyko pasidaryti ta nuskaityma, tik dar klausimas gal kas zinot kaip isvalyt visus masyvo elementus, kad butu tuscias masyvas ir i ji galima butu kelti naujus elementus? Rasymas ant virsaus netinka, nes elementu kintamas kiekis

Nuoroda į pranešimą
Dalintis kituose puslapiuose

Jei teisingai supratau tai failas atrodo maždaug taip:

1 20 103 4144 50 * 45 99 88 15 * 11

 

Ir turiu va tokį pasiulymą:


// Funkcija konvertuoti string i skaiciu
int text_i_num(string str)
{
   stringstream ss(str);
   int skaicius;
   ss >>skaicius;
   return skaicius;
}

// ...

// Skaitymas is failo
while(failas.good())
 {
     string str;
     failas >>str; // gauti zodi (be tarpu) is failo
     if(str=="*") // arba if(str=="\n")
       {
           // ...
       }
     else 
       {
           int skaicius=text_i_num(str);
           // ... 
       }
 }

 

ir viską talpinti i 2D vektorių, pvz:

vector<vector<int> >masyvas; // 2D masyvas
vector<int> eilute; // skaiciu eilute

eilute.push_back(10); // prideti skaiciu i eilute

masyvas.push_back(eilute); // Prideti eilute i 2D masyva

masyvas.clear(); // isvalyti masyva

Nuoroda į pranešimą
Dalintis kituose puslapiuose

Prisijunkite prie diskusijos

Jūs galite rašyti dabar, o registruotis vėliau. Jeigu turite paskyrą, prisijunkite dabar, kad rašytumėte iš savo paskyros.

Svečias
Parašykite atsakymą...

×   Įdėta kaip raiškusis tekstas.   Atkurti formatavimą

  Only 75 emoji are allowed.

×   Nuorodos turinys įdėtas automatiškai.   Rodyti kaip įprastą nuorodą

×   Jūsų anksčiau įrašytas turinys buvo atkurtas.   Išvalyti redaktorių

×   You cannot paste images directly. Upload or insert images from URL.

Įkraunama...
  • Dabar naršo   0 narių

    Nei vienas registruotas narys šiuo metu nežiūri šio puslapio.

  • Prisijunk prie bendruomenės dabar!

    Uždarbis.lt nariai domisi verslo, IT ir asmeninio tobulėjimo temomis, kartu sprendžia problemas, dalinasi žiniomis ir idėjomis, sutinka būsimus verslo partnerius ir dalyvauja gyvuose susitikimuose.

    Užsiregistruok dabar ir galėsi:

    ✔️ Dalyvauti diskusijose;

    ✔️ Kurti naujas temas;

    ✔️ Rašyti atsakymus;

    ✔️ Vertinti kitų žmonių pranešimus;

    ✔️ Susisiekti su bet kuriuo nariu asmeniškai;

    ✔️ Naudotis tamsia dizaino versija;

    ir dar daugiau.

    Registracija trunka ~30 sek. ir yra visiškai nemokama.

  • Naujausios temos

  • Karštos temos

×
×
  • Pasirinkite naujai kuriamo turinio tipą...