Pereiti prie turinio

VBE 2011m. 2uzd. problema su šalinimu.


Rekomenduojami pranešimai

Numetu visą kodą, problema turėtų būti funkcijoje Skaičiavimas arba Šalinimas.

Trumpai tariant, reikia pašalinti vieną didž. ir mažiausias reikšmes iš kiekvienos skaičių sekos.

U2.txt failas:

5 5
Petras Rasa
3 1 5 8 10
5 6 7 8 9
Rita Jurgis
6 5 8 5 8
9 8 7 6 5
Rasa Linas
10 10 10 10 10
8 8 8 8 8

 

 

 

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

const char FV[] = "U2.txt";
const char FR[] = "U2rez.txt";

const int Cn = 100;
const int Ck = 10;
const int Cilgis = 20;
struct Duomenys
{
   string pora;
   int art[Ck];
   int tech[Ck];
};

void skaityti(const char FV[], Duomenys A[], int & n, int & k);
void skaiciavimas(Duomenys A[], int n, int k);
void salinti(int Salinimui[], int n, int kuris);

int main()
{
   int n, k;
   Duomenys A[Ck];
   skaityti(FV, A, n, k);
   skaiciavimas(A, n, k);
   return 0;
}

void skaityti(const char FV[], Duomenys A[], int & n, int & k)
{
   char Pav[Cilgis + 1]; int i = 0;
   ifstream fd(FV);
   fd >> n >> k; fd.ignore();
   while(!fd.fail())
   {
       fd.get(Pav, Cilgis);
       A[i].pora = Pav;fd.ignore();
       for(int y = 0; y < k; y++)
       {
           fd >> A[i].art[y];
       }
       fd.ignore();
       for(int y = 0; y < k; y++)
       {
           fd >> A[i].tech[y];
       }
       fd.ignore();
       if(!fd.fail()){i++;}
   }
   n = i;
   fd.close();

}

void skaiciavimas(Duomenys A[], int n, int k)
{
   int kuris = 0, kuris1 = 0;
   for(int i = 0; i  < n; i++)
   {
       for(int y = 0; y < k; y++)
       {
           if(A[i].art[y] > A[i].art[kuris]) // Ieskoma didziausios reiksmes vieta
           {
               kuris = y;
           }
           if(A[i].art[y] < A[i].art[kuris1]) // Ieskoma maziausios reiksmes vieta
           {
               kuris1 = y;
           }
       }
       salinti(A[i].art, k, kuris); salinti(A[i].art, k, kuris1);
       cout << kuris << " " << kuris1 << endl;
       kuris = 0, kuris1 = 0;
       for(int y = 0; y < k; y++)
       {
           if(A[i].tech[y] > A[i].art[kuris]) // Ieskoma didziausios reiksmes vieta
           {
               kuris = y;
           }
           if(A[i].tech[y] < A[i].art[kuris1]) // Ieskoma maziausios reiksmes vieta
           {
               kuris1 = y;
           }
       }
       cout << kuris << " " << kuris1 << endl << "------------------ " << endl;;
       salinti(A[i].tech, k, kuris); salinti(A[i].tech, k, kuris1);
   }
       cout << endl << endl;

       for(int i = 0; i  < n; i++)
   {
       for(int y = 0; y < k; y++)
       {
           cout << A[i].art[y] << " ";
       }
       cout << endl;
   }
}
void salinti(int Salinimui[], int n, int kuris)
{
   for(int i = kuris; i < n - 1;i++)
   {
       Salinimui[i] = Salinimui[i+1];
       n--;
   }
}

 

 

 

Klaidos ieškau jau gan ilgai, esmė ta, kad mažiausia reikšme panaikinama, į jos vietą persistumia kita reikšmė, tačiau didžiausia reiškmė nepasinaikina, ko pasekoje, 3-ioji reikšmė dublikuojasi.

 

Pati užduotis čia:

http://nec.lt/failai/2062_IT-VBE-1_2011.pdf

Redagavo andriusvv8
Nuoroda į pranešimą
Dalintis kituose puslapiuose
#include<iostream>
#include<fstream>
using namespace std;

struct Duomenys {
   string  vardai;
   int     technika[10],
           artistiskumas[10],
           balai;
};

void skaityti ( int & n, int & k, Duomenys M[] ) {

   ifstream f ("U2.txt");
   ofstream r ("U2rez.txt");

   f>>n>>k;

   if ( n<1 || n>100 || k<3 || k>10 )  r<<"Klaidingas teiseju arba sokeju skaicius"<<endl;
   else {

       for (int i=0; i<n; i++) {
       f>>ws;
       char s[21];
       f.get(s,20);
       M[i].vardai=s;

       for (int x=0; x<k; x++) f>>M[i].technika[x];
       for (int x=0; x<k; x++) f>>M[i].artistiskumas[x];
       M[i].balai=0;
       }
   }

   f.close();
}

int skaiciuoti ( int k, int A[] ) {

   int max=A[0],min=A[0];
   int i_max=0,i_min=0;

   //randa min ir max
   for (int i=1; i<k; i++) {
       if ( A[i]>max ) {
           max=A[i];
           i_max=i;
       }
       if ( A[i]<min ) {
           min=A[i];
           i_min=i;
       }
   }

   int kiek1=0,kiek2=0;
   //tikrina kiek yra vienodu max ir min
   for (int i=0; i<k; i++) {
       if ( A[i]==max )    kiek1++;
       if ( A[i]==min )    kiek2++;
   }

   //skaiciuoja surinktu balu suma
   int viso=0;
   if ( kiek1==k )    viso=(k-2)*max;
   else {
       for (int i=0; i<k; i++) viso=viso+A[i];
       viso=viso-max-min;
   }

   return viso;
}

void rikiuoti_ir_spausdinti ( int n, Duomenys M[] ) {

   Duomenys A[n];
   int kiek=0;

   for (int i=0; i<n; i++)
       if ( M[i].balai >0 ) {
           A[kiek]=M[i];
           kiek++;
       }


   for (int i=0; i<kiek-1; i++) {
       for (int x=i+1; x<kiek; x++) {
           if ( A[x].balai>A[i].balai ) {
               Duomenys tarpinis = A[i];
               A[i] = A[x];
               A[x] = tarpinis;
           }
       }
   }


   ofstream r ("U2rez.txt",ios::app);
   for (int i=0; i<kiek; i++)  r<<A[i].vardai<<" "<<A[i].balai<<endl;

   r.close();
}

int main()
{
int n,k;
Duomenys M[100];

skaityti(n,k,M);
for (int i=0; i<n; i++) {
M[i].balai=skaiciuoti(k,M[i].technika);
M[i].balai=M[i].balai+skaiciuoti(k,M[i].artistiskumas);
}
rikiuoti_ir_spausdinti(n,M);

return 0;
}

Nuoroda į pranešimą
Dalintis kituose puslapiuose

Na taip, tu susiradai didž. ir mažiausias reikšmes ir vėliau tiesiog jų nepridėjai prie bendros sumos. Galima aišku ir taip daryt, tačiau noriu išmokti šalinimą, kituose užduotyse tikrai lengviau taikyti šalinimą, nei bandyt paskui išskaičiuoti ar perašinėti reikšmes.

Nuoroda į pranešimą
Dalintis kituose puslapiuose

Eidamas per masyvą saugai indeksą, kuris parodo, į kurią vietą perkelti reikšmę. Atitinkamai elementų, kuriuos pašalini, į tą vietą neperkelinėji.

 

int n;
int a[n];

int k = 0;
for (int i = 0; i < n; i++) {
   if (!salinti(a[i])) {
       a[k] = a[i];
       k++;
   }
}
n = k;

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