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.

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