Pereiti prie turinio

Vėl mažos problemos su masyvu.


Rekomenduojami pranešimai

Vis dar sunkokai sekasi su masyvo reikšmių ištrynimu.. Gal galite paaiškint kaip ištrinti nelyginius indeksus šioje užduotyje? Su dviem masyvais lengvai padarau šią užduotį, bet įdomu, kaip padaryti su reikšmių ištrynimu iš masyvo.

Gaunamas rezultatas: http://prntscr.com/5na5tm

 

Uždavinys:

2n ilgio sveikųjų skaičių masyve surašytos n šeimų (žmonos ir vyro) pajamos per metus (tūkst. Lt). Tolesniems skaičiavimams reikia tik moterų pajamų. Parašykite programą visiems elementams, kurių indeksai nelyginiai, pašalinti.

Kontroliniai duomenys:

8

50 80 40 80 90 40 50 60

rezultatas turėtų būti:

50 40 90 50

 

#include <iostream>
#include <fstream>
using namespace std;
const char CDfv[] = "duom.txt";
const char CRfv[] = "ats.txt";
void Skaitymas(const char fv[], int &n, int A[]);
void Pertvarkymas(int &n, int A[]);
void Spausdinimas(const char fv[], int n, int A[]);

int main(){
   int n, mas[100];
   Skaitymas(CDfv, n, mas);
   Pertvarkymas(n, mas);
   Spausdinimas(CRfv, n, mas);
}
void Skaitymas(const char fv[], int &n, int A[]){
   ifstream fd(fv);
   fd >> n;
   for(int i = 0; i < n; i++){
       fd >> A[i];
   }
   fd.close();
}
void Pertvarkymas(int &n, int A[]){
   for(int i = 0; i < n; i++){
       if(i%2 == 1){
           A[i] = A[i-1];
       }
       n--;
   }
}
void Spausdinimas(const char fv[], int n, int A[]){
   ofstream fr (fv);
   for(int i = 0; i < n; i++){
       cout << A[i] << endl;
   }
   fr.close();
}

Nuoroda į pranešimą
Dalintis kituose puslapiuose

Reikėtų panagrinėti, kaip keičiasi indeksai.

0 1 2 3 4 5 6 7 8 // senas indeksas
0 _ 1 _ 2 _ 3 _ 4 // naujas indeksas

 

Galima naudoti du masyvus: iš seno paimti 0-linį narį ir įrašyti į naujo 0-linę vietą, vėliau 2 -> 1, 4 -> 2, ... , n -> n/2. Galiausiai perkopijuoti duomenis atgal. Bet iš tiesų antras masyvas yra nereikalingas, nes visada perkopijuoji iš didesnio indekso į mažesnį pradedant nuo masyvo pradžios.

 

Galiausiai atitinkamai pakeiti elementų skaičių n (reikia atsižvelgti, kad masyvas gali turėti nelyginį elementų skaičių).

 

 

 

for (int i = 2; i < n; i += 2) {
   A[i/2] = A[i];
}
n -= n / 2;

 

Nuoroda į pranešimą
Dalintis kituose puslapiuose

Reikėtų panagrinėti, kaip keičiasi indeksai.

0 1 2 3 4 5 6 7 8 // senas indeksas
0 _ 1 _ 2 _ 3 _ 4 // naujas indeksas

 

Galima naudoti du masyvus: iš seno paimti 0-linį narį ir įrašyti į naujo 0-linę vietą, vėliau 2 -> 1, 4 -> 2, ... , n -> n/2. Galiausiai perkopijuoti duomenis atgal. Bet iš tiesų antras masyvas yra nereikalingas, nes visada perkopijuoji iš didesnio indekso į mažesnį pradedant nuo masyvo pradžios.

 

Galiausiai atitinkamai pakeiti elementų skaičių n (reikia atsižvelgti, kad masyvas gali turėti nelyginį elementų skaičių).

 

 

 

for (int i = 2; i < n; i += 2) {
   A[i/2] = A[i];
}
n -= n / 2;

 

Dėkui už atsakymą, bet vistiek kažkas nesigauna: http://prntscr.com/5nj0pu . Dar nei vienas dalykas taip sunkiai nesiėjo man, kaip masyvų pertvarkymai..

Nuoroda į pranešimą
Dalintis kituose puslapiuose

Uzduociai isspresti yra keletas variantu.

  • Lengviausia butu tiesiog sukurti nauja masyva, kuriame talpinsi visas nelygines reiksmes;
  • Kiek daugiau vargo, bet galima isspresti ir naudojant tik turima masyva, taciau is jo neis panaikinti 'vyru' pajamu, jas nebent yra galima pakeisti i skaiciu (sakykim 0), kuri bus galima ignoruoti.
  • Arba galima naudoti kitas data structures, kurios turi budu kaip panaikinti duomenis (pvz. vector<>)

Pirmas variantas:

#include <fstream>
#include <iostream>

using namespace std;

int main() {
   // Nuskaitom
   ifstream In("../duom.txt");

   int n;
   In >> n;

   int A[n];
   for (int i=0; i<n; i++)
       In >> A[i];

   // kuriam nauja masyva
   int liekana = n % 2;
   int naujasDydis = n/2 + liekana;
   int B[naujasDydis];

   // nuskaitom lyginius indexus
   for (int i=0; i<naujasDydis; i++) {
       B[i] = A[2*i];
   }

   for (int i=0; i<naujasDydis; i++)
       cout << B[i] << ' ';
}

Antras variantas:

#include <fstream>
#include <iostream>

using namespace std;

int main() {
   // Nuskaitom
   ifstream In("../duom.txt");

   int n;
   In >> n;

   int A[n];
   for (int i=0; i<n; i++)
       In >> A[i];

   // ieskom moteru skaiciaus
   int liekana = n % 2;
   int moterys = n/2 + liekana;

   // perkeliam moteru reiksmes i pradzia
   for (int i=0; i<moterys; i++)
       A[i] = A[i*2];

   // nustatom vyru reiksmes i 0
   for (int i=moterys; i<n; i++)
       A[i] = 0;

   for (int i=0; i<n; i++)
       cout << A[i] << ' ';
}

 

Budas su vector<>:

#include <fstream>
#include <iostream>
#include <vector>
#include <iterator>

using namespace std;

int main() {
   ifstream In("../duom.txt");
   istream_iterator<int> start(In), end;
   vector<int> pajamos(start, end);

   int moterys = pajamos.size() / 2 + pajamos.size() % 2;
   for (int i=0; i<moterys; i++) // perstumdom moteris
       pajamos.at(i) = pajamos.at(i*2);

   pajamos.erase(pajamos.begin()+moterys, pajamos.end()); // istrinam vyrus

   copy(pajamos.begin(), pajamos.end(), ostream_iterator<int>(cout, " "));
}

Kad veiktu su mano kodu, duomenis reikia pakoreguoti ir palikti tik pajamu eilute (istrinti eilute su 8)

Redagavo Imago
Nuoroda į pranešimą
Dalintis kituose puslapiuose

Uzduociai isspresti yra keletas variantu.

  • Lengviausia butu tiesiog sukurti nauja masyva, kuriame talpinsi visas nelygines reiksmes;
  • Kiek daugiau vargo, bet galima isspresti ir naudojant tik turima masyva, taciau is jo neis panaikinti 'vyru' pajamu, jas nebent yra galima pakeisti i skaiciu (sakykim 0), kuri bus galima ignoruoti.
  • Arba galima naudoti kitas data structures, kurios turi budu kaip panaikinti duomenis (pvz. vector<>)

Pirmas variantas:

#include <fstream>
#include <iostream>

using namespace std;

int main() {
   // Nuskaitom
   ifstream In("../duom.txt");

   int n;
   In >> n;

   int A[n];
   for (int i=0; i<n; i++)
       In >> A[i];

   // kuriam nauja masyva
   int liekana = n % 2;
   int naujasDydis = n/2 + liekana;
   int B[naujasDydis];

   // nuskaitom lyginius indexus
   for (int i=0; i<naujasDydis; i++) {
       B[i] = A[2*i];
   }

   for (int i=0; i<naujasDydis; i++)
       cout << B[i] << ' ';
}

Antras variantas:

#include <fstream>
#include <iostream>

using namespace std;

int main() {
   // Nuskaitom
   ifstream In("../duom.txt");

   int n;
   In >> n;

   int A[n];
   for (int i=0; i<n; i++)
       In >> A[i];

   // ieskom moteru skaiciaus
   int liekana = n % 2;
   int moterys = n/2 + liekana;

   // perkeliam moteru reiksmes i pradzia
   for (int i=0; i<moterys; i++)
       A[i] = A[i*2];

   // nustatom vyru reiksmes i 0
   for (int i=moterys; i<n; i++)
       A[i] = 0;

   for (int i=0; i<n; i++)
       cout << A[i] << ' ';
}

 

Budas su vector<>:

#include <fstream>
#include <iostream>
#include <vector>
#include <iterator>

using namespace std;

int main() {
   ifstream In("../duom.txt");
   istream_iterator<int> start(In), end;
   vector<int> pajamos(start, end);

   int moterys = pajamos.size() / 2 + pajamos.size() % 2;
   for (int i=0; i<moterys; i++) // perstumdom moteris
       pajamos.at(i) = pajamos.at(i*2);

   pajamos.erase(pajamos.begin()+moterys, pajamos.end()); // istrinam vyrus

   copy(pajamos.begin(), pajamos.end(), ostream_iterator<int>(cout, " "));
}

Kad veiktu su mano kodu, duomenis reikia pakoreguoti ir palikti tik pajamu eilute (istrinti eilute su 8)

 

 

    for(int i = 0; i < k/2; i++){
       mas[i]=mas[i*2];
   }

Dėkui už atsakymus.

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