Pereiti prie turinio

Menka problema su paskaliu.


Rekomenduojami pranešimai

Dyomenys:

5

a 5 1 2 5 4 6

b 3 12 5 4

c 6 12 1 6 8 7 3

d 1 12

e 3 8 14 4

Kodas:

begin
 Readln(d, n);
 if (n => 1) and (n <= 100) then begin
   for i:=1 to n do
   begin
    Read(d, m[i].pav, m[i].kiekm);
    for j:=1 to m[i].kiekm do
    Read(d, m[i].mar[j]);
    Readln;
   end;
   isviso:=0;
   for i:=1 to n do
    isviso:=isviso + m[i].kiekm;
   z:=1;
   for i:=1 to n do
   begin
    for j:=1 to m[i].kiekm do
    begin
     mar[z]:=m[i].mar[j]
     z:=z+1;
    end;
   end;
   for i:=1 to k:=isviso-1 do
   begin
    for j:=1+i to l:=isviso do
    if mar[i] = mar[j] then ilg[i]:=ilg +1

 

Tai vat reikia surasti ilgiausia marsruta. Susidejau marsrutus i viena masyva, galvoju, kuris bus ilgiausias(kuris sustoja daugiausia stoteliu, tas ilgiausias) turetu pasikartoti daugiausia kartu. Tai vat mazdaug zinau kaip padaryt, kad suskaiciuotu kiek kartu kartojasi, bet nezinau kaip man isimint, kuris marsurtas kartojasi daugiausiai. Isvis rasykit visus pastebejimus, gal butu galima kaip nors greiciau ir lengviau ?

Nuoroda į pranešimą
Dalintis kituose puslapiuose

Ar galėtum patikslinti ką vadini maršrutu?

 

Dyomenys:

5

a 5 1 2 5 4 6

b 3 12 5 4

c 6 12 1 6 8 7 3

d 1 12

e 3 8 14 4

Kodas:

begin
 Readln(d, n);
 if (n => 1) and (n <= 100) then begin
   for i:=1 to n do
   begin
    Read(d, m[i].pav, m[i].kiekm);
    for j:=1 to m[i].kiekm do
    Read(d, m[i].mar[j]);
    Readln;
   end;
   isviso:=0;
   for i:=1 to n do
    isviso:=isviso + m[i].kiekm;
   z:=1;
   for i:=1 to n do
   begin
    for j:=1 to m[i].kiekm do
    begin
     mar[z]:=m[i].mar[j]
     z:=z+1;
    end;
   end;
   for i:=1 to k:=isviso-1 do
   begin
    for j:=1+i to l:=isviso do
    if mar[i] = mar[j] then ilg[i]:=ilg +1

 

Tai vat reikia surasti ilgiausia marsruta. Susidejau marsrutus i viena masyva, galvoju, kuris bus ilgiausias(kuris sustoja daugiausia stoteliu, tas ilgiausias) turetu pasikartoti daugiausia kartu. Tai vat mazdaug zinau kaip padaryt, kad suskaiciuotu kiek kartu kartojasi, bet nezinau kaip man isimint, kuris marsurtas kartojasi daugiausiai. Isvis rasykit visus pastebejimus, gal butu galima kaip nors greiciau ir lengviau ?

Nuoroda į pranešimą
Dalintis kituose puslapiuose

Tai vat mazdaug zinau kaip padaryt, kad suskaiciuotu kiek kartu kartojasi, bet nezinau kaip man isimint, kuris marsurtas kartojasi daugiausiai.

 

Suprantu, jog turi masyvą, kuriame nurodyta kiek kartų pasikartoja kuris maršrutas.

 

Pavyzdžiui, jei pirmas maršrutas stoja vienoje stotelėje, antras keturiuose, trečias dvejuose, o ketvirtas trijuose:

 

masyvas -> [1, 4, 2, 3]

 

Kiek suprantu, neaišku kaip nurodyti, jog antras maršrutas ilgiausias. Vienas (paprastas) būdas, laikyti pirmąjį maršrutą ilgiausiu ir žingsniuojant masyve toliau žiūrėti ar sekantis elementas didesnis, ar ne. Jei didesnis, tada jis taps ilgiausiu maršrutu (gal laikinai). Jei ne didesnis, tada einama prie kito elemento.

 

Pseudo kodas

max = masyvas[1]

for i = 2 to n

if masyvas > max

max = masyvas

Nuoroda į pranešimą
Dalintis kituose puslapiuose

Ne, ne. Ta as suprantu kaip padaryt.

Tarkim masyve: 1 4 1 4 2 4. Ilgiausias marsrutas - 4, t.y. kuris pasikartoja daugiausiai kartu. Kaip man tai padaryt?

 

Pradinis masyvas:

[1 4 1 4 2 4]

 

Viena galimybė - sukurti masyvą, kuriame tiek elementų, kiek yra skirtingų elementų pradiniame masyve.

 

Pasikartojimų masyvas:

[0 0 0 0]

 

Tada keliaujant per pradinį masyvą, vienetų padidinti pasikartojančio masyvo elementą. Pavyzdžiui, pradinio masyvo pirmas elementas yra 1, todėl pasikartojantis masyvas tampa:

[1 0 0 0]

 

Antras pradinio masyvo elementas lygus 4, todėl pasikartojantis:

[1 0 0 1]

 

ir t.t., kol pasikartojantis masyvas tampa:

[2 1 0 3]

 

Tada reikia rasti maksimalią vertę ir nustatyti kokio indekso elementas ją turi (šiuo atveju indeksas yra 4). Kaip tą padaryti rašiau anksčiau.

Nuoroda į pranešimą
Dalintis kituose puslapiuose

Algoritma kaip ir aprase kolega, o as vat radau tarp savo namu darbu senu padaryta sita uzduoti, gaila tik kad c++, bet vistiek pridedu, gal duos kokiu minciu :)

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

const char duom[] = "duom2.txt";
const char rez[] = "rez2.txt";
const int Cmax = 100;
const int Cpav = 20;

struct Stotele {

      string pav;
      int n, nr[Cmax];

};

void Skaitymas (int & n, Stotele A[]);
void Atrinkimas (int n, int & k, Stotele A[], int nr[], int nrk[]);
int Yra (int nr[], int k, int x);
void Kiekis (int n, int k, Stotele A[], int nr[], int nrk[]);
int Ilgiausias (int k, int nr[], int nrk[]);
void Rikiavimas (int n, int nr[], int nrk[]);
void Isvedimas (int n, Stotele A[], int max);

int main ()
{
   int n;
   Stotele A[Cmax];
   int nr[Cmax], nrk[Cmax] , k = 0;
   int max;

   Skaitymas (n, A);
   Atrinkimas (n, k, A, nr, nrk);

   for (int i = 0; i < k; i++)
        nrk[i] = 0;

   Kiekis (n, k, A, nr, nrk);
   Rikiavimas (k, nr, nrk);
   max = Ilgiausias (k, nr, nrk);
   Isvedimas (n, A, max);

 return(0);
}

void Skaitymas (int & n, Stotele A[]) {
    char x[Cpav + 1];
    ifstream D(duom);
    D >> n;
    D.ignore(80, '\n');
    for (int i = 0; i < n; i++) {

         D.get(x, Cpav);
         A[i].pav = x;
         D >> A[i].n;
         for (int j = 0; j < A[i].n; j++)
              D >> A[i].nr[j];
         D.ignore(80, '\n');

    }


}

void Atrinkimas (int n, int & k, Stotele A[], int nr[], int nrk[]) { // Skirtingu stoteliu surasymas i masyva


    for (int i = 0; i < n; i++) {

         for (int j = 0; j < A[i].n; j++) {
              if (Yra(nr, k, A[i].nr[j]) > 0) {
              nr[k] = A[i].nr[j];
              k++;
              }
         }
    }

}

int Yra (int nr[], int k, int x) { // Ziuri ar nera jau tokios stoteles

   int z = 1;
   for (int i = 0; i < k; i++)
        if (nr[i] == x) z = -1;
   return z;
}

void Kiekis (int n, int k, Stotele A[], int nr[], int nrk[]) { // Kiek kartu kiekviena stotele pasikartoja

    for (int i = 0; i < k; i++) {

        for (int j = 0; j < n; j++) {

             for (int z = 0; z < A[j].n; z++) {

                  if (A[j].nr[z] == nr[i])
                      nrk[i]++;

             }

        }

    }

}

int Ilgiausias (int k, int nr[], int nrk[]) {

   int max, maxnr;
   max = nrk[0];
   maxnr = nr[0];
   for (int i = 0; i < k; i++)
        if (nrk[i] > max) {
            max = nrk[i];
            maxnr = nr[i];
        }
   return maxnr;
}

void Rikiavimas (int n, int nr[], int nrk[]) { // Rikiavimas reikalingas, kad jeigu butu vienodo ilgio surastume maziausia

    for (int i = 0; i < n - 1; i++) {

         for (int j = i + 1; j < n; j++) {

              if (nr[j] < nr[i]) {
                  int x = nr[i];
                  nr[i] = nr[j];
                  nr[j] = x;
                  x = nrk[i];
                  nrk[i] = nrk[j];
                  nrk[j] = x;

              }

         }

    }

}

void Isvedimas (int n, Stotele A[], int max) {

    ofstream R(rez);
    R << max << endl;
    for (int i = 0; i < n; i++) {

         for (int j = 0; j < A[i].n; j++) {

              if (A[i].nr[j] == max)
                  R << A[i].pav << endl;
         }
    }

}

Nuoroda į pranešimą
Dalintis kituose puslapiuose

Ne, ne. Ta as suprantu kaip padaryt.

Tarkim masyve: 1 4 1 4 2 4. Ilgiausias marsrutas - 4, t.y. kuris pasikartoja daugiausiai kartu. Kaip man tai padaryt?

 

Tavo vietoj, daryciau su papildomu masyvu, t.y sukti cikla per visas stoteles, tada ikisti vidini cikla skaityti marsruto numeri kaip masyvo eiles numeri, o masyvo reiksme prideti +1 kas kart, kai numeris sutampa. Tai atrodytu mazdaug taip:

 

For i:=1 to k(stotys) do

begin

x(bet koks kintamasis):=0;

Read(F, x);

for j:= 1 to x do

begin

Read(F-failas, m(marsruto numeris));

B[m]:=B[m]+1;

end;

Readln(F-failas);

end;

 

O didziausia reiksme patarciau rikiavimo budu surasti. Tikiuosi kazkiek padejau.

Nuoroda į pranešimą
Dalintis kituose puslapiuose

su read'ais ar readln'ais ziurek, nenurodei tikriausiai failo salia

 

Viskas svaru. Mastau, ar negaletu but kazkas su windowsais ar paciu paskaliu. Tokia problema turejau, kai naudodavausi chrome narsykle ir kai budavo ji ijungta, kompiliatorius visad strigdavo su ijungtu cmd. Isjundavau chrome ir sukompiliuodavo.

Nuoroda į pranešimą
Dalintis kituose puslapiuose

Begalinis ciklas gal uzsisuka kur nors, patikrink :)

 

Nu nėra lyg, nebent as tikrai žioplas

program Bevardė0;
type marsrutai = record
               pav   : string[20];
               kiekm : integer;
               mar   : array [1..50] of integer;
               end;
    masyvas = array [1..50] of marsrutai;

var  d, f : text;
    m : masyvas;
    mars : array [1..50] of integer;
    isviso, n, z, i, j : integer;
begin
 assign(d, 'Duomenys.txt');
 assign(f, 'Rezultatai.txt');
 reset(d);
 rewrite(f);
 Readln(d, n);
 if (n >= 1) and (n <= 100) then begin
   for i:=1 to n do
   begin
    Read(d, m[i].pav, m[i].kiekm);
    for j:=1 to m[i].kiekm do
    begin
     Read(d, m[i].mar[j]);
    end;
    Readln;
   end;
   isviso:=0;
   for i:=1 to n do
    isviso:=isviso + m[i].kiekm;
   z:=1;
   for i:=1 to n do
   begin
    for j:=1 to m[i].kiekm do
    begin
     mars[z]:=m[i].mar[j];
     z:=z+1;
    end;
   end;
   for i:=1 to isviso do
   WriteLn(f, mars[i]);
 end;
end.

Nuoroda į pranešimą
Dalintis kituose puslapiuose

Nu nėra lyg, nebent as tikrai žioplas

program Bevardė0;
type marsrutai = record
               pav   : string[20];
               kiekm : integer;
               mar   : array [1..50] of integer;
               end;
    masyvas = array [1..50] of marsrutai;

var  d, f : text;
    m : masyvas;
    mars : array [1..50] of integer;
    isviso, n, z, i, j : integer;
begin
 assign(d, 'Duomenys.txt');
 assign(f, 'Rezultatai.txt');
 reset(d);
 rewrite(f);
 Readln(d, n);
 if (n >= 1) and (n <= 100) then begin
   for i:=1 to n do
   begin
    Read(d, m[i].pav, m[i].kiekm);
    for j:=1 to m[i].kiekm do
    begin
     Read(d, m[i].mar[j]);
    end;
    Readln;
   end;
   isviso:=0;
   for i:=1 to n do
    isviso:=isviso + m[i].kiekm;
   z:=1;
   for i:=1 to n do
   begin
    for j:=1 to m[i].kiekm do
    begin
     mars[z]:=m[i].mar[j];
     z:=z+1;
    end;
   end;
   for i:=1 to isviso do
   WriteLn(f, mars[i]);
 end;
end.

 

Reiktu uzdaryti failus

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