Pereiti prie turinio

c++ uzduotis


Rekomenduojami pranešimai

Ne taip, kai vidinis ciklas prasisuka visus kartus, t.y. pakeicia vienos dienos visas lempas, tada visa Y masyva perrasyk vietoj T masyvo. Parasiau kaip atrodo pavyzdyje

susitvarkiau , dekui uz pagalba. :)

bet dar pagal uzduoti ten paskutinio veiksmo reikia: rasti kuria nakti sviete daugiausiai lempu? tai cia kaip mastau reiks daugiamacio masyvo?

pagal ka ieskot, bandyt sudet visus masyvus ar ieskoti kiek yra vienetu?

Redagavo arvyda5
Nuoroda į pranešimą
Dalintis kituose puslapiuose

ar reiktu kaska pakeisti sioje programoje ar patobulint?

 

Uzduotis

 

#include <iostream>
#include <fstream>

const char CDfv[] = "duomenys.txt";
const char CRfv[] = "rezultatai.txt";
const int Cmax = 50;

void skaityti(const char fv[], int K[][Cmax], int & i, int & u, int  O[]);
void spausdinti(const char fv[], int k, int lt);
void KiekPrekiuKiekpiniguliko(int K[][Cmax], int & i, int u, int O[],int & k);

using namespace std;

int main()
{
   int p;
   int l;
   int k;
   int Y[Cmax];
   int K[Cmax][Cmax];
   ofstream rez;
   skaityti(CDfv, K, p, l, Y);
   rez.open(CRfv); rez.close();
   KiekPrekiuKiekpiniguliko(K, p, l , Y, k);
   rez.open(CRfv, ios::app);
   spausdinti(CRfv, k, p);
   rez.close();


   return 0;
}

void skaityti(const char fv[], int K[][Cmax], int & i, int & u, int  O[]){
   ifstream duom(fv);
   duom >> i >> u;
   for(int x = 0; x < u; x++){
       duom >> O[x];
       for(int y =0; y < O[x]; y++){
           duom >> K[x][y];
       }
   }
   duom.close();
}

void spausdinti(const char fv[], int k, int lt){
   ofstream rez(fv);
   rez << k << " " << lt;
   rez.close();
}

void KiekPrekiuKiekpiniguliko(int K[][Cmax], int & i, int u, int O[], int & k){
   k = 0;
   for(int x= 0; x < u; x++){
   O[x];
   int u = 0;
       for(int y =0; y < O[x]; y++){
           if(K[x][y] > K[x][u] && K[x][u] < i){
                   u = y;
                   }
               }
       for(int y =0; y < O[x]; y++){
           if(K[x][y] < K[x][u] && K[x][u] > i){
                   u = y;
                   }
               }

       if(i >= K[x][u]){
           i = i - K[x][u];
           k++;
       }

   }
}

Nuoroda į pranešimą
Dalintis kituose puslapiuose

ar reiktu kaska pakeisti sioje programoje ar patobulint?

 

Uzduotis

 

 

 

 

Jeigu veikia kaip reikia, tai kam keisti? Mažos apimties programą, tai nelabai reikia jos optimizuoti dėl kompiuterio resursų apkrovos ar panašiai.

 

Edit

 

Pasitaisau, galima kai ką pakeisti, bet tai įtakos pačiam kodui nelabai turės:

 

void KiekPrekiuKiekpiniguliko

 

Pagal susitarimą visų funkcijų pavadinimai yra pradedami mažaja raide, o klasių didžiaja.

 

Po to šitą:

int p;
int l;
int k;

 

gali pakeist į

int p, l, k;

sutaupysi 2 kodo eilutes.

 

Dar funkcijos "KiekPrekiuKiekpiniguliko" pradžioj nunulini k kintamąjį, kai gali default jam priskirt nulį, nes kiek žiūriu tu tos funkcijos daugiau nenaudoji, o kintamojo k irgi daugiau nekeiti. Tas pats ir su u kintamuoju.

 

Dar nepagaunu vienos vietos funkcijoj:

void KiekPrekiuKiekpiniguliko(int K[][Cmax], int & i, int u, int O[], int & k){
   k = 0;
   for(int x= 0; x < u; x++){
   [b]O[x];[/b]    <--------
   int u = 0;
   ......
}

 

Dar toj pačioj funkcijoj:

 

 if(i >= K[x][u]){
          [b] i = i - K[x][u];[/b] gali pakeist į i -= K[x][u];
           k++;
       }

 

Pagrinde estetinės klaidos.

Redagavo Gruzlys
Nuoroda į pranešimą
Dalintis kituose puslapiuose

Jeigu veikia kaip reikia, tai kam keisti? Mažos apimties programą, tai nelabai reikia jos optimizuoti dėl kompiuterio resursų apkrovos ar panašiai.

 

Edit

 

Pasitaisau, galima kai ką pakeisti, bet tai įtakos pačiam kodui nelabai turės:

 

void KiekPrekiuKiekpiniguliko

 

Pagal susitarimą visų funkcijų pavadinimai yra pradedami mažaja raide, o klasių didžiaja.

 

Po to šitą:

int p;
int l;
int k;

 

gali pakeist į

int p, l, k;

sutaupysi 2 kodo eilutes.

 

Dar funkcijos "KiekPrekiuKiekpiniguliko" pradžioj nunulini k kintamąjį, kai gali default jam priskirt nulį, nes kiek žiūriu tu tos funkcijos daugiau nenaudoji, o kintamojo k irgi daugiau nekeiti. Tas pats ir su u kintamuoju.

 

Dar nepagaunu vienos vietos funkcijoj:

void KiekPrekiuKiekpiniguliko(int K[][Cmax], int & i, int u, int O[], int & k){
   k = 0;
   for(int x= 0; x < u; x++){
   [b]O[x];[/b]    <--------
   int u = 0;
   ......
}

cia nuskaito ta skaiciu pvz 3, kad zinotu kiek kartu kartot sekanti cikla, nes kiekvienoj eilutej yra ne po lygiai skaiciu.

 

Dar toj pačioj funkcijoj:

 

 if(i >= K[x][u]){
          [b] i = i - K[x][u];[/b] gali pakeist į i -= K[x][u];
           k++;
       }

 

Pagrinde estetinės klaidos.

Nuoroda į pranešimą
Dalintis kituose puslapiuose

cia nuskaito ta skaiciu pvz 3, kad zinotu kiek kartu kartot sekanti cikla, nes kiekvienoj eilutej yra ne po lygiai skaiciu.

 

... Čia tau nieko neturėtų nuskaityt su tokia kodo eilute:

O[x];

 

suprasčiau jeigu būtų prieštai pradėtas ifstream'as, pvz

ifstream fd("failas.in");

ar kažkas tokio ir tada

fd >> O[x];

ar pnš, bet dabar tu nieko nedarai su tuo masyvu.

Nuoroda į pranešimą
Dalintis kituose puslapiuose

... Čia tau nieko neturėtų nuskaityt su tokia kodo eilute:

O[x];

jis jau yra nuskaitytas jei nepastebejai ir idetas i masyva

 

suprasčiau jeigu būtų prieštai pradėtas ifstream'as, pvz

ifstream fd("failas.in");

ar kažkas tokio ir tada

fd >> O[x];

ar pnš, bet dabar tu nieko nedarai su tuo masyvu.

Nuoroda į pranešimą
Dalintis kituose puslapiuose

kas blogai siame algoritme? cia turetu didejimo tvarka surykiuoti skaicius masyve, taciau tvarka gaunasi tokia. 1,1,3,4,2,4,9,10,11

 

 

void rikiavimas(int B[] , int a){
   int mini;
   int b;
   for(int p = 0; p < a -1; p++){
       mini = p;
       for(int u = p; u < a; u++){
           if(B[u] < B[mini])
           mini = u;
           b = B[p];
           B[p] = B[mini];
           B[mini] =b;
       }
   }
for(int y = 0; y < a; y++){
       cout << B[y] << " " << y<< endl;
   }
}

Nuoroda į pranešimą
Dalintis kituose puslapiuose

noriu panaikinti tokius pacius skaicius esancius mano masyve, taciau nepavyksta. ka pakeisti siame algoritme kad veiktu tinkamai?

void tokiuPaciuSkaiciuNaikinimas(int B[], int a){
   for(int y = 0; y < a; y++){
       if(B[y] == B[y+1]){
           B[y]= B[y+1];
           a--;
               }
         }
   }

Redagavo arvyda5
Nuoroda į pranešimą
Dalintis kituose puslapiuose

noriu panaikinti tokius pacius skaicius esancius mano masyve, taciau nepavyksta. ka pakeisti siame algoritme kad veiktu tinkamai?

void tokiuPaciuSkaiciuNaikinimas(int B[], int a){
   for(int y = 0; y < a; y++){
       if(B[y] == B[y+1]){
           B[y]= B[y+1];
           a--;
               }
         }
   }

Turbūt reikėtų perstumti visus skaičius per vieną poziciją į kairę?

Nuoroda į pranešimą
Dalintis kituose puslapiuose

kodel neišsisaugo reiksme masyve P[x], masyve turetu buti trys skaiciai 0< P[x] visi kiti 0, taciau pabaigoje funkcijos visi lieka 0, kas ne taip?

 

#include <iostream>
#include <fstream>

const char CDfvr[]= "Rduomenys.txt";
const char CDfva[]= "Aduomenys.txt";
const char CRfv[] = "rezultatai.txt";
const int Cmax = 1000;

void skaityti(const char fvr[], const char fva[], int A[], int R[], int & a, int & r);
void mainai(int A[], int R[], int a, int r, int P[]);
void spausdinti(const char fv[],int A[], int P[], int a);
using namespace std;

int main()
{
   int A[Cmax], R[Cmax]; int P[Cmax];
   int a, r;
   skaityti(CDfvr, CDfva, A, R, a,r);
   mainai(A, R, a,r, P);
   spausdinti(CRfv,A, P, a);

}

void skaityti(const char fvr[], const char fva[], int A[], int R[], int & a, int & r){
   ifstream duomr(fvr);
   duomr >> r;
   for(int x = 0; x < r; x++){
       duomr >> R[x];
   }
duomr.close();
   ifstream duoma(fva);
   duoma >> a;
   for(int x = 0; x < a; x++){
       duoma >> A[x];
   }
duoma.close();
}

void mainai(int A[], int R[], int a, int r,int P[]){

   for(int x= 0; x < a; x++){
      for(int y = 0; y < a; y++){
           if(y == x) continue;
           if(A[x] == A[y]){
           P[x]++;
           }
       }
   }
   for(int x = 0; x< a; x++){
       for(int y= 0; y < a; y++){
           if(x== y) continue;
           if(A[x] == A[y]){
              P[y] =0;
           }
       }
       for(int y= 0; y < r; y++)
       if(P[x] > 0 && R[y] == A[x]){
           P[x] = 0;
       }
      cout << P[x] << endl;   //stai cia reiksme dar teisinga
   }
cout << P[0] << endl;         // stai cia reiksme pasidaro 0
}


void spausdinti(const char fv[],int A[], int P[], int a){
   ofstream rez(fv);
   for(int x =0; x < a; x++){
       if(P[x] > 0){
           rez << A[x] << " ";
       }
   }
   rez.close();
}

Redagavo arvyda5
Nuoroda į pranešimą
Dalintis kituose puslapiuose

ar galima butu kaip nors supaprastinti si algoritma? jis rasytas mano, gal galima butu kaip nors paprasciau uzrasyt?

 

 

void valgymas(int Y[], int & r, int  h){
   for(int x= 0; x < r; x++){
       if(Y[x] > Y[x+1] && Y[x] < h&& Y[x+1] < h){
           Y[x+1] += Y[x];
           r--;
           for(int y= x; y < r; y++){
               Y[y] = Y[y+1];
           }
       }
       if(Y[x]< Y[x+1] && Y[x] < h && Y[x+1] < h){
           Y[x+1] += Y[x];
           r--;
           for(int y= x; y < r; y++){
               Y[y] = Y[y+1];
           }
       }
       if(Y[x] > Y[x+1] && Y[x] < h&& Y[x+1] < h){
           Y[x+1] += Y[x];
           r--;
           for(int y= x; y < r; y++){
               Y[y] = Y[y+1];
           }
       }
   }
}

Nuoroda į pranešimą
Dalintis kituose puslapiuose

kaip tinkamai nuskaitytį "Šviesiai žalias" nes aš nuskaitau tik žodį(Šviesiai) iki tarpo, su šiuo kodu. post-44934-0-00452400-1363716919_thumb.jpg

 

void skaityti(string A[],int B[], char C[][Cmax], int & a){
   ifstream fd(CDfv);
   fd >>a;
   for(int x = 0; x < a; x++){
       fd >> A[x] >> B[x];
       for(int y = 0; y < B[x]; y++){
           fd >> C[x][y];
       }
   }
   fd.close();
}

Redagavo arvyda5
Nuoroda į pranešimą
Dalintis kituose puslapiuose

kaip tinkamai nuskaitytį "Šviesiai žalias" nes aš nuskaitau tik žodį(Šviesiai) iki tarpo, su šiuo kodu. post-44934-0-00452400-1363716919_thumb.jpg

 

void skaityti(string A[],int B[], char C[][Cmax], int & a){
   ifstream fd(CDfv);
   fd >>a;
   for(int x = 0; x < a; x++){
       fd >> A[x] >> B[x];
       for(int y = 0; y < B[x]; y++){
           fd >> C[x][y];
       }
   }
   fd.close();
}

 

read() ir nurodai kiek simbolių skaityt.

Nuoroda į pranešimą
Dalintis kituose puslapiuose

char eil[kiek skirta pavadinimui vietos + 1]
fd.get(eil, kiek skirta pavadinimui vietos)
string eil2 = eil;

 

Siaip pastebejimas, atrodo, kad mokaisi is "Siuolaikinis zvilgsnis i programavimas C++", tai toj knygoj visis sitie dalykai tikrai yra, pavyzdinese programose. Jei nesuklydau su knyga.

Redagavo hafnis1324
Nuoroda į pranešimą
Dalintis kituose puslapiuose

getline(fd, pav, kiek simboliu skirta pavadinimui)
fd >> ws // praleidzia visus tarpus

 

Siaip pastebejimas, atrodo, kad mokaisi is "Siuolaikinis zvilgsnis i programavimas C++", tai toj knygoj visis sitie dalykai tikrai yra, pavyzdinese programose. Jei nesuklydau su knyga.

yra beveik viskas, tačiau jei viskas pavyktų tai ir neklausčiau čia.

 

klaida meta ties getline eilute

 

void skaityti(string A[],int B[], char C[][Cmax], int & a){
   ifstream fd(CDfv);
   fd >>a;
   for(int x = 0; x < a; x++){
       getline(fd, A[x], 14);

       fd >> B[x];
       for(int y = 0; y < B[x]; y++){
           fd >> C[x][y];
       }
   }
   fd.close();
}

Redagavo arvyda5
Nuoroda į pranešimą
Dalintis kituose puslapiuose
  • po 2 savaičių...

taigi, visiškai užstrigau su šia užduotim, nesuprantu kaip reikia pakeisti valiuta, atskirai centus ir litus. ar ta valiuta reikia pasiversti i centus ir tada atskirai padauginti is centu ir litu, ar kaip kitaip? suprasite pažiūrėją užduotį.

"užstrigau ieškodamas Gidas gavo:"

post-44934-0-10272400-1364756850_thumb.jpg

 

štai jau parašytas kodas:

#include <iostream>
#include <fstream>
#include <iomanip>
using namespace std;

const char CDfv[] = "duomenys.txt";
const char CRfv[] = "rezultatai.txt";
const int CMax = 15;

struct Keliautojas{
           string vardas;
           double litai;
           double centai;
};

void skaityti(Keliautojas J[], int & r, double & g, double & h);
void isvisoPinigu(Keliautojas J[], Keliautojas & H, int  r);
void pakeistiPinigai(Keliautojas J[], Keliautojas & U, int  r, double  g, double  h);
int main()
{
   Keliautojas Z[CMax];
   Keliautojas Y, L;
   int q;double w,e;
   skaityti(Z,q,w,e);
   isvisoPinigu(Z,Y,q);
   pakeistiPinigai(Z,L,q,w,e);
   ofstream fr(CRfv);
   fr << "Gidas surinko: " << Y.litai << setw(2) << Y.centai <<endl;
   return 0;
}

void skaityti(Keliautojas J[], int & r, double & g, double & h){
   ifstream fd(CDfv);
   fd >> r;
   for(int x = 0; x < r; x++){
       fd >> J[x].vardas >> J[x].litai >> J[x].centai;
   }
   fd >> g >> h;
   fd.close();
}

void isvisoPinigu(Keliautojas J[], Keliautojas & H, int  r){
   H.centai = 0;
   H.litai = 0;
   for(int x = 0; x < r; x++){
       H.centai += J[x].centai;
       if(H.centai >= 100){
           H.centai -= 100;
           H.litai++;
       }
       H.litai += J[x].litai;
   }
}

void pakeistiPinigai(Keliautojas J[], Keliautojas & U, int  r, double  g, double  h){
   U.litai = 0;
   U.centai = 0;
   for(int x = 0; x < r; x++){
   }
}

Redagavo arvyda5
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ą...