Pereiti prie turinio

2013 IT VBE II programavimo uzduotis


Rekomenduojami pranešimai

Sveiki, nesuprantu kodel man skaityme raso "Ranges overrun"?

 

II progrmavimo uzduotis "Miestai ir apskritys"

 

program mia;
type duom = record
   miest : string[20];
   aps   : string[13];
   gyv   : integer;
   end;

type rez = record
   apz : string[13];
   mm  : integer;
   gy : integer;
   end;
   Mas1 = array [1..50] of rez;
   Mas = array [1..103] of duom;

var A:Mas;
   B:Mas1;
   n:integer;

////////////////////////////////////////////////////////////////////////////////
procedure Skaitymas;
var i:integer;
   F:text;

   begin

   Assign(F, 'U2.txt');
   Reset(F);
   ReadLn(F, n);

       for i:= 1 to n do
       ReadLn(F, A[i].miest, A[i].aps, A[i].gyv);

   Close(F);
end;

////////////////////////////////////////////////////////////////////////////////
var i, j, k, l, nuo:integer;
   laik:duom;
   R:text;

   begin

   Assign(R, 'U2rez.txt');
   Rewrite(R);
   Skaitymas;

   ////// Rikiavimas pagal abecele ir gyv. sk. ////////////////////////////////

   for i:=1 to n-1 do begin
   nuo:= i;
       for j:=i+1 to n do
       if((A[j].aps <= A[nuo].aps) and (A[j].gyv < A[nuo].gyv)) then nuo:= j;
   laik:=A[nuo];
   A[nuo]:=A[i];
   A[i]:=laik;
   end;

   ////////////// Tikrinu kaip surikiavo ir atspausdinu ///////////////////////

   for i:= 1 to n do
   WriteLn(R, A[i].miest, ' ', A[i].aps, ' ', A[i].gyv);

   Close(R);

end.

Nuoroda į pranešimą
Dalintis kituose puslapiuose

Man viskas veikia be klaidų. Patikrink U2 failą, ar tarpelių kiekis tarp žodžių teisingas... ir gal vis dėl to laikas išsiaiškinti kaip debageris veikia? :unsure:

 

Kadangi gyventoju skaicius didelis tai reikejo naudot longint ir viskas issisprende, bet dabar problema, kaip surikiuoti pagal abecele (apskritis) ir kartu pagal gyventoju skaiciu.

Nuoroda į pranešimą
Dalintis kituose puslapiuose

C++ kodas gal prireiks :D

#include <iostream>
#include <fstream>

using namespace std;
struct miestas{
string miest;
string valst;
int kiek;
};
//Konstantos
//----------------------------------
const char CDfv[] = "duomenys.txt";
const char CRfv[] = "rezultatai.txt";
const int Cmax = 104;
//----------------------------------
void skaityti(miestas A[], int & n);
void ieskoti(miestas A[], int & n);
int kiek(miestas A[], int & n, int m, string pav);
void salinti(miestas A[], int & n, int index);
void rikiuoti(miestas A[], int n);
void rodyti(miestas A[], int n);
//----------------------------------
int main()
{
   miestas A[Cmax];
   int n;          //Kiek dalyvauja apskričių
   skaityti(A, n);
   ieskoti(A, n);
   rikiuoti(A, n);
   rodyti(A, n);
   return 0;
}
//Nuskaito duomenys iš duomenys.txt
void skaityti(miestas A[], int & n)
{
   ifstream fd(CDfv);
   fd>>n;
   fd.ignore(80, '\n');
   for(int i = 0; i<n; i++)
   {
       char eil[15];
       fd.get(eil, 15);
       A[i].miest = eil;
       fd.get(eil, 13);
       A[i].valst = eil;
       fd>>A[i].kiek;
       fd.ignore(80, '\n');
   }
   fd.close();
}
//Apskaičiuoja kiek kiekvienoje apskrityje gyventojų.
void ieskoti(miestas A[], int & n)
{
   for(int i = 0; i<n; i++)
   {
       A[i].kiek += kiek(A, n, i, A[i].valst);
   }
}
//Suranda kiek tokiu pat apskričių jas pašalina ir gražina ta reikšme
int kiek(miestas A[], int & n, int m, string pav)
{
   int k;
   for(int i = m+1; i<n; i++)
   {
       if(A[i].valst==pav)
       {
           k += A[i].kiek;
           salinti(A, n, i);
       }
   }
   return k;
}
//Pašalina pasikartojančia apskritį 
void salinti(miestas A[], int & n, int index)
{
   for(int i = index; i<n; i++)
   {
       A[i] = A[i+1];
   }
   n--;
}
//Surikiuoja Burbuliuko metodo didėjančiai
void rikiuoti(miestas A[], int n)
{
   for(int i = 0; i<n-1; i++)
       for(int j = i+1; j<n; j++)
       if(A[i].kiek>A[j].kiek)
       swap(A[i], A[j]);
}
//Spausdina rezultatus i rezultatai.txt
void rodyti(miestas A[], int n)
{
   ofstream fr(CRfv);
   fr<<n<<endl;
   for(int i = 0; i<n; i++)
   {
       fr<<A[i].valst<<"  "<<A[i].kiek<<endl;
   }
   fr.close();
}

Nuoroda į pranešimą
Dalintis kituose puslapiuose

Mantonijo laikysi informatikos egza?

Taip

 

As esu padares algoritma, kuris surikiuoja pagal apskritys ir i kita masyva pridedineja gyventojus, taciau Ranges Overrun ties sita eilute:

then B[l].gyv:= B[l].gyv + A[nuo].gyv      // I kita masyva prideda gyventojus

 

for i:=1 to n-1 do begin              ///// Rikiavimas
   nuo:=i;
   for j:= i+1 to n do
   if (A[j].aps <= A[nuo].aps) then nuo:=j;
   laik:=A[nuo];
   A[nuo]:=A[i];
   A[i]:=laik;
   end;

   for i:= 1 to n do begin                // Nuo 1 iki viso masyvo
   nuo:= i;
       for j:= i+1 to n do                
   if (A[nuo].aps = A[j].aps)             // Jeigu apskritys lygios
   then B[l].gyv:= B[l].gyv + A[nuo].gyv      // I kita masyva prideda gyventojus
   else begin B[l].gyv:= B[l].gyv + A[j].gyv; // Jeigu nelygios, prideda paskutine reiksme ir kito masyvo skaitikliui prideda 1
              l:= l + 1;
        end;
   end;

Redagavo Mantonijo
Nuoroda į pranešimą
Dalintis kituose puslapiuose

Pabandyk taip:

 

  for i:= 1 to n do begin                // Nuo 1 iki viso masyvo
       for j:= i+1 to n do
       if (A[i].aps = A[j].aps)             // Jeigu apskritys lygios
       then 
         B[l].gyv:= B[l].gyv + A[j].gyv;      // I kita masyva prideda gyventojus
   end;

 

Taip veikia, bet cia sudeda visus gyventojus ir neprideda 1 gyventoju skaiciaus, o ne pagal apskritis.

Redagavo Mantonijo
Nuoroda į pranešimą
Dalintis kituose puslapiuose

Aciu uz pagalba, programa padaryta. Tik nemokejau padaryti, jog

Esant  vienodam gyventojų  skaičiui – rikiuoti abėcėlės tvarka pagal apskrities pavadinimą.

 

Jeigu kam reikes programa "Miestai ir apskritys":

 

program mia;
type duom = record
   miest : string[20];
   aps   : string[13];
   gyv   : longint;
   end;

   rez = record
   apz : string[13];
   mm  : longint;
   gyv : longint;
   end;
   Mas1 = array [1..50] of rez;
   Mas = array [1..103] of duom;

var A:Mas;
   B:Mas1;
   n:integer;

////////////////////////////////////////////////////////////////////////////////
procedure Skaitymas;
var i:integer;
   F:text;

   begin

   Assign(F, 'U2.txt');
   Reset(F);
   ReadLn(F, n);

       for i:= 1 to n do begin
       ReadLn(F, A[i].miest, A[i].aps, A[i].gyv);
       end;

   Close(F);
end;

////////////////////////////////////////////////////////////////////////////////
var i, j, k, l, nuo, s:integer;
   max:longint;
   laik:duom;
   laikin:rez;
   R:text;

   begin
   l:=1;
   s:=0;
   max:= 999999;

   Assign(R, 'U2rez.txt');
   Rewrite(R);
   Skaitymas;

//////// Masyvo rikiavimas pagal abecele ///////////////////////////////////////

for i:=1 to n-1 do begin
   nuo:=i;
   for j:= i+1 to n do
   if (A[j].aps <= A[nuo].aps) then nuo:=j;
   laik:=A[nuo];
   A[nuo]:=A[i];
   A[i]:=laik;
   end;
///////// Gyventoju sudetis i B[l] masyva ir maziausio miesto radimas //////////

   for i:= 1 to n do begin
   B[l].apz:= A[i].aps;
   j:= i + 1;
       if (B[l].apz = A[j].aps) then begin
       B[l].gyv:=B[l].gyv + A[i].gyv;
       if (max > A[i].gyv) then begin max:= A[i].gyv;
                                      B[l].mm:=max;
                                end;
       end
       else begin  B[l].gyv:=B[l].gyv + A[i].gyv;
                   l:= l + 1;
                   s:= s + 1;
                   max:= 999999;
            end;
   end;
  ////// Surusiavimas mazejimo tvarka /////////////////////////////////////////

  for i := 1 to s-1 do begin
  nuo := i;
   for j := i+1 to s do
   if B[j].mm < B[nuo].mm then nuo := j;
  laikin := B[i];
  B[i] := B[nuo];
  B[nuo] := laikin;
end;
   //////// Spausdinimas //////////////////////////////////////////////////////

   WriteLn(R, s);
   for i:= 1 to s do
   WriteLn(R, B[i].apz, ' ', B[i].mm, ' ', B[i].gyv);

   Close(R);

end.

Nuoroda į pranešimą
Dalintis kituose puslapiuose

C++ kodas gal prireiks :D

#include <iostream>
#include <fstream>

using namespace std;
struct miestas{
string miest;
string valst;
int kiek;
};
//Konstantos
//----------------------------------
const char CDfv[] = "duomenys.txt";
const char CRfv[] = "rezultatai.txt";
const int Cmax = 104;
//----------------------------------
void skaityti(miestas A[], int & n);
void ieskoti(miestas A[], int & n);
int kiek(miestas A[], int & n, int m, string pav);
void salinti(miestas A[], int & n, int index);
void rikiuoti(miestas A[], int n);
void rodyti(miestas A[], int n);
//----------------------------------
int main()
{
   miestas A[Cmax];
   int n;          //Kiek dalyvauja apskričių
   skaityti(A, n);
   ieskoti(A, n);
   rikiuoti(A, n);
   rodyti(A, n);
   return 0;
}
//Nuskaito duomenys iš duomenys.txt
void skaityti(miestas A[], int & n)
{
   ifstream fd(CDfv);
   fd>>n;
   fd.ignore(80, '\n');
   for(int i = 0; i<n; i++)
   {
       char eil[15];
       fd.get(eil, 15);
       A[i].miest = eil;
       fd.get(eil, 13);
       A[i].valst = eil;
       fd>>A[i].kiek;
       fd.ignore(80, '\n');
   }
   fd.close();
}
//Apskaičiuoja kiek kiekvienoje apskrityje gyventojų.
void ieskoti(miestas A[], int & n)
{
   for(int i = 0; i<n; i++)
   {
       A[i].kiek += kiek(A, n, i, A[i].valst);
   }
}
//Suranda kiek tokiu pat apskričių jas pašalina ir gražina ta reikšme
int kiek(miestas A[], int & n, int m, string pav)
{
   int k;
   for(int i = m+1; i<n; i++)
   {
       if(A[i].valst==pav)
       {
           k += A[i].kiek;
           salinti(A, n, i);
       }
   }
   return k;
}
//Pašalina pasikartojančia apskritį 
void salinti(miestas A[], int & n, int index)
{
   for(int i = index; i<n; i++)
   {
       A[i] = A[i+1];
   }
   n--;
}
//Surikiuoja Burbuliuko metodo didėjančiai
void rikiuoti(miestas A[], int n)
{
   for(int i = 0; i<n-1; i++)
       for(int j = i+1; j<n; j++)
       if(A[i].kiek>A[j].kiek)
       swap(A[i], A[j]);
}
//Spausdina rezultatus i rezultatai.txt
void rodyti(miestas A[], int n)
{
   ofstream fr(CRfv);
   fr<<n<<endl;
   for(int i = 0; i<n; i++)
   {
       fr<<A[i].valst<<"  "<<A[i].kiek<<endl;
   }
   fr.close();
}

Kodėl netikrini jei gyventojų skaičius sutampa, tuomet rikiuoti abėcėlės tvarka? Aš irgi panašiai viską esu padaręs ir turiu bėdų su tuo rikiavimu.

Nuoroda į pranešimą
Dalintis kituose puslapiuose

Tik nemokejau padaryti, jog Esant vienodam gyventojų skaičiui – rikiuoti abėcėlės tvarka pagal apskrities pavadinimą.

 

paskalio nemoku, tai mėginsiu paaiškint tiesiog.

kai rikiuoji, ir tikrini ar vienas miestas didesnis už kitą, dar dėk

else if(PirmasMiestas.gyvSk == AntrasMiestas.gyvSk) then if(PirmoMiestoPavadinimoPirmaRaidė<AntroMiestoPavadinimoPirmojiRaidė) then *keiti miestus vietomis*

kai parašiau, supratau, kad nieko pats čia nesuprantu, tai įdėsiu c++ kodą - pasinagrinėk, ir manau suprasi, tokius pradmenis suprasti labai lengva bet kokia kalba, ir perrašyt savo žinoma kalba

    // pastaba : B[apskriciu+1] yra lyg laikinas elementas strukturos, i kuri galime padeti laikinai elementus kai norime juos apkeisti vietomis.
   // apskriciu+1, nes jis jau yra nenaudojamas, t.y. jis yra sekantis po visu apskriciu.
   for(int x=0; x<apskriciu; x++){
   for(int i=0; i<apskriciu; i++){
       if(B[i].maziausiai_gyv==B[i+1].maziausiai_gyv){ // jeigu apskriciu maziausiu miestu gyventoju skaiciai yra lygus
           for(int x=0; x<apskriciu; x++){ // tai rikiuojame pagal pavadinimo pirmaja raide.
               for(int i=0; i<apskriciu; i++){
                   if(B[i].pavadinimas[0]>B[i+1].pavadinimas[0]){
                       B[apskriciu+1].pavadinimas=B[i].pavadinimas;
                       B[i].pavadinimas=B[i+1].pavadinimas;
                       B[i+1].pavadinimas=B[apskriciu+1].pavadinimas;

                       B[apskriciu+1].maziausiai_gyv=B[i].maziausiai_gyv;
                       B[i].maziausiai_gyv=B[i+1].maziausiai_gyv;
                       B[i+1].maziausiai_gyv=B[apskriciu+1].maziausiai_gyv;

                       B[apskriciu+1].gyv_viso=B[i].gyv_viso;
                       B[i].gyv_viso=B[i+1].gyv_viso;
                       B[i+1].gyv_viso=B[apskriciu+1].gyv_viso;
                   }
               }
           }// o jeigu maziausiu miestu gyv. sk. yra nelygus, tada rikiuojame pagal juos.
       } else if(B[i].maziausiai_gyv>B[i+1].maziausiai_gyv){
           B[apskriciu+1].pavadinimas=B[i].pavadinimas;
           B[i].pavadinimas=B[i+1].pavadinimas;
           B[i+1].pavadinimas=B[apskriciu+1].pavadinimas;

           B[apskriciu+1].maziausiai_gyv=B[i].maziausiai_gyv;
           B[i].maziausiai_gyv=B[i+1].maziausiai_gyv;
           B[i+1].maziausiai_gyv=B[apskriciu+1].maziausiai_gyv;

           B[apskriciu+1].gyv_viso=B[i].gyv_viso;
           B[i].gyv_viso=B[i+1].gyv_viso;
           B[i+1].gyv_viso=B[apskriciu+1].gyv_viso;
       }
   }
   }

 

 

B[] tai mano apskričių struktūrų masyvas

aš nežinau kodėl, bet rašiaus atskiras struktūras apskritims bei miestams:D, bet nevermind, gal iš šito kodo gabalą rikiavimo metodą suprasi :)

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