Pereiti prie turinio

C++ Skaitymas iš failo


Rekomenduojami pranešimai

Laba diena,

Darau uždavinį ir susiduriau su problema. Reikia nuskaityti kiek piratai rado aukso luitų, bet sunkiausia man tai, kad faile yra tik 5 skaičiai, kurie ir reiškia kiek kiekvienas piratas rado luitų. Nėra pradinio skaičiaus, kuri poto panaudočiau for cikle.. Turbut žinote kaip padaryti. Dėkingas už pagalba.

1 užduotis. Lobis

Dešimt piratų, aptikę olą, kurioje paslėpta 15 aukso luitų, pasidalija į dvi grupes: penki piratai lieka

saugoti laivo, o likusieji eina ieškoti lobio. Radę visus 15 aukso luitų, jie grįžta, laikydami rankose surastą

auksą.

A pvz. 15 0 0 0 0

B pvz. 3 3 3 3 3

C pvz. 5 4 3 2 1

D pvz. 4 4 3 3 1

E pvz. 5 5 5 0 0

#include <iostream>
#include <fstream>

using namespace std;

const char Duomenys[]="Duomenys.txt";
const char Rezultatai[]="Rezultatai.txt";
const int Masyvas=100;

void Skaityti(int A[], int & n);
void Rasymas(int A[], int n);

int main()
{
   int A[Masyvas];
   int n;
   Skaityti(A, n);
   cout << A[Masyvas] << endl;
   return 0;
}
void Skaityti(int A[], int & n){
   ifstream duom(Duomenys);
   while(!duom.eof())
   {
       duom >> A[];
   }
   duom.close();

Kolkas tik tiek padariau. Dar bandžiau ir per for cikla, bet irgi nelabai kas gavosi :(

Nuoroda į pranešimą
Dalintis kituose puslapiuose

Kad manau gerai tu čia darai, faile atsiskirti skaičius reikia arba tarpais arba ženklu ir dėt į masyvą, ir turėsi gi visus luitus :) Ir nuskaityme tarkim ta n nustatyt i nuli ir tada didint vis po viena, ir nurodyt kaip masyvo elemento numeri :)

Redagavo Dolan
Nuoroda į pranešimą
Dalintis kituose puslapiuose

Jei nebūna nurodyta, gali naudoti <sstream> biblioteką.

Nuskaičius eilutę kaip string(simbolių masyvą), galima naudoti sstream istringstream'ą gauti skaičiams.

 

string line; getline(duom, line)
istringstream linestream(line);
int n, sum;

while (linestream >> n)
   sum += n; 

 

Kintamasis sum gražins sumą, kur skaičiai buvo surašyti vienoje eilutėje.

Jei kas neaišku klausk.

Nuoroda į pranešimą
Dalintis kituose puslapiuose

Labai ačiū už pagalbą. Viskas pavyko su įvedimu ir poto dar rikiavimą padariau, bet nežinau kaip reikia padaryti kitą užduoties dalį.

 

Dešimt piratų, aptikę olą, kurioje paslėpta 15 aukso luitų, pasidalija į dvi grupes: penki piratai lieka saugoti laivo, o likusieji eina ieškoti lobio. Radę visus 15 aukso luitų, jie grįžta, laikydami rankose surastą auksą. Po to visi piratai išsirikiuoja į eilę pagal rankose laikomų luitų skaičių mažėjimo tvarka. Jie dalijasi lobį taip: kiekvienas piratas iš eilės duoda po vieną oloje rastą aukso luitą iš eilės kiekvienam už jo stovinčiam piratui, o likutį, jei toks yra, pasiima sau. Dalijimo metu piratų gauti luitai tolesnėse dalybose nedalyvauja.

 

#include <iostream>
#include <fstream>

using namespace std;

const char Duomenys[]="Duomenys.txt";
const char Rezultatai[]="Rezultatai.txt";
const int Masyvas=100;

void Skaityti(int A[], int & n);
void Rasymas(int A[], int  n);
void Rikiavimas(int A[], int n);

int main()
{
   int A[Masyvas];
   int p;
   Skaityti(A, p);
   Rikiavimas(A, p);
   Rasymas(A, p);
   return 0;
}
void Skaityti(int A[], int & n){
   ifstream duom(Duomenys);
   for (int i = 0; i < 5; i++)
       duom >> A[i];
   duom.close();
}
void Rasymas(int A[], int  n){
   ofstream rez(Rezultatai);
   for (int i = 0; i < 5; i++)
       rez << A[i] << endl;
   rez.close();
}
void Rikiavimas(int A[], int n){
   int g=0,laikinas;
   for (int i = 0; i < 5;i++)
       for (int j = g++; j < 5;j++)
           if (A[i] < A[j]){
               laikinas=A[i];
               A[i]=A[j];
               A[j]=laikinas;
           }
}

 

Nors ir nieko nepadariau su dalinimusi luitų dalimi, visvien kodą įklijuoju. Gal mane bent ant kelio užvesti galite? :)

Redagavo ZaliasisNaujas
Nuoroda į pranešimą
Dalintis kituose puslapiuose

Hm. O kam tas rikiavimas? Laikiau aš šiemet šitą bandomą info ir netaip dariau :)

Įmesiu kodą. Nežinau kaip veikia su kitokiais duomenim, bet kur tie ABCDE prie užduoties buvo, tai veikia ;)

#include <iostream>
#include <fstream>
#include <iomanip>
#include <string>
#include <math.h>
using namespace std;
//------------------------------------
const char CDfv [] = "Duomenys.txt";
const char CRfv [] = "Rezultatai.txt";
//------------------------------------
void Nuskaitymas(int n,int Rado[], int Bend[]){
   ifstream fd(CDfv);
   for(int i = 0; i <n;i++){
       Rado[i]=0; Bend[i]=0;   //"Nunilina" abu masyvus
   }
   for(int j =0; j<5;j++)
       fd >> Rado[j];          //Rastus luitus sudeda į "Rado" masyvą
   fd.close();                 //Uždaro duomenų failą
}
void Veiksmas(int Bend[], int Rado[]){
   int p_nr;       //Pirato numeris
   for(int i=0; i <5;i++){
       p_nr = i+1;
       while(Rado[i] > 0 && p_nr <10){
           Bend[p_nr]++;
           Rado[i]--;
           p_nr++;
       }
       if(Rado[i]>0) Bend[i]=Rado[i];  //Po dalijimo jei lieka luitų, tai pasilieka sau
   }
}
void Isvedimas(int Bend[]){
   ofstream fr(CRfv);
   for(int i =0; i <10; i++)
       fr << Bend[i] << " ";
   fr.close();
}
//------------------------------------
int main(){
   int n = 10;     //10 piratø dalijasi auksà
   int Rado[10];   //Penki piratai ir jø rastas aukso luitø kiekis
   int Bend[10];   //Kiek kiekvienas piratas turës aukso po visø dalybø
   Nuskaitymas(n,Rado,Bend);   //Nuskaito duomenis
   Veiksmas(Bend,Rado);        //Apskaičiuoja luitus
   Isvedimas(Bend);            //Išveda duomenis
   return 0;
}

Gavau 20 iš 20 taškų. Darau du masyvus, pirmas tai kiek piratų rado aukso, antras tai bendras, kiek kiekvienas piratas po dalybų turėjo. Turėtų veikt ir su kitais duomenim. Gal kažkas geresnį kodą sugalvojo :)

Nuoroda į pranešimą
Dalintis kituose puslapiuose

Jei dalinsi pradedant paskutiniu piratu ir baigiant pirmuoju, nereikės antro masyvo.

 

int k[] = { 5, 4, 3, 2, 1 };
const int n = 5;
for (int i = n - 1; i >= 0; i--) {
int d = min(n - i - 1, k[i]);
for (int j = 1; j <= d; j++) {
	k[i + j]++;
}
k[i] -= d;
}

Redagavo wi_lius
Nuoroda į pranešimą
Dalintis kituose puslapiuose

Jei dalinsi pradedant paskutiniu piratu ir baigiant pirmuoju, nereikės antro masyvo.

 

int k[] = { 5, 4, 3, 2, 1 };
const int n = 5;
for (int i = n - 1; i >= 0; i--) {
int d = min(n - i - 1, k[i]);
for (int j = 1; j <= d; j++) {
	k[i + j]++;
}
k[i] -= d;
}

Tai sakau, sprendimai gali visokie būt :)

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.

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