Pereiti prie turinio

Rekomenduojami pranešimai

Sveikuciai :) Taigi iskart eisiu prie reikalo, esme tokia, kad yra grupe katinu, kurie nubego distancija per tam tikra laika kiekvienas ir man juos reikia isrikiuoti didejimo tvarka, o veliau isspausdinti i rezultatu faila.

Taigi tas n, tai grupeje esanciu katinu skaicius, as ji dalinu per puse ir imu sveikaja dali, nes salygoje pasakyta, kad reikia isrinkti puse greiciausiu katinu is grupes.Rezultatu faile yra, kaip ir turi buti 2 atsakymai, nes visa grupe-4 katinai, taigi puse bus 2, bet tie atsakymai yra 0 ir 0, todel ir nesamone, nes turetu buti 3min 59sek ir 4min 15sek...Prasau padekite :)

Procedure skirta isrikiavimui nuo didziausio iki maziausio:

procedure atrinkimas;
begin
   suma:=0;
   skaic:=n div 2;
   C:=0;
   W:=0;
   temp:=0;
   for b:=1 to skaic do
   begin
       for j:=1 to n do
       begin
           for g:=1 to n do
           begin
               if (A[j].min < A[g].min) or (A[j].min = A[g].min) and (A[j].sek < A[g].sek ) then
               begin
                   C:=A[g].min;
                   A[g].min:=A[j].min;
                   A[j].min:=C;
                   W:=A[g].sek;
                   A[g].sek:=A[j].sek;
                   A[j].sek:=W;
                   temp:=g;
                   g:=j;
                   j:=temp;
               end
               else if (A[j].min > A[g].min) or (A[j].min = min1[b]) and (A[j].sek > A[g].sek ) then
               begin
                   C:=A[j].min;
                   A[j].min:=A[g].min;
                   A[g].min:=C;
                   W:=A[j].sek;
                   A[j].sek:=A[g].sek;
                   A[g].sek:=W;
                   temp:=j;
                   j:=g;
                   g:=temp;
               end;
           end;
           suma:=suma+1;
       end;
   end;
end;

 

Procedura skirta spausdinimui:

procedure Spausdinimas;
begin
     skaic:=n div 2;
   for i:=1 to skaic do
   Writeln(Rf,min1[i],' min ',sek1[i], '  sek ');
end;

Redagavo RealEfect
Nuoroda į pranešimą
Dalintis kituose puslapiuose

Pirmiausia turi pasidaryti duomenų rikiavimą, pagal tas minutes ir sekundes ir tada dalinti duomenis per pusę. (Perrašinėju dabar tau tą procedūrą, kai perrašysiu šitą postą redaguosiu ir įdėsiu savo varijantą).

 


procedure Apkeitimas(a,b: integer);
   var tarpinis : integer;
begin
   tarpinis := A[a].min;
   A[a].min := A[b].min;
   A[b].min := tarpinis;

   tarpinis := A[a].sek;
   A[a].sek := A[b].sek;
   A[b].sek := tarpinis;
end;

procedure Spausdinimas(sk : integer);
begin
   for i:=1 to sk do
       Writeln(Rf,i,'. ',A[i].min,'min. ',A[i].sek, 'sek.');
end;


procedure atrinkimas;
   var puse : integer;
begin

   for g:=1 to n do // kiek duomenų reikia sukeisti iš viso
   begin
       for j:=1 to n-g do //kurį sukeičiame (iš esmės didžiausią reikšmę nustumiame į patį galą kiekvienu ciklo pasikartojimu)
       begin
           if (A[j].min > A[j+1].min) or (A[j].min = A[j+1].min) and (A[j].sek > A[j+1].sek )
           then Apkeitimas(j,j+1); // sukeičiame duomenis jei pirmiau esantys duomenys didesni už sekuntį
       end;
   end;

   puse:= n div 2;

   Spausdinimas(puse);
end;

 

Paprasčiausias variantas jei gerai supratau ko reikia.

Redagavo gidasss2
Nuoroda į pranešimą
Dalintis kituose puslapiuose

Pirmiausia turi pasidaryti duomenų rikiavimą, pagal tas minutes ir sekundes ir tada dalinti duomenis per pusę. (Perrašinėju dabar tau tą procedūrą, kai perrašysiu šitą postą redaguosiu ir įdėsiu savo varijantą).

 


procedure Apkeitimas(a,b: integer);
   var tarpinis : integer;
begin
   tarpinis := A[a].min;
   A[a].min := A[b].min;
   A[b].min := tarpinis;

   tarpinis := A[a].sek;
   A[a].sek := A[b].sek;
   A[b].sek := tarpinis;
end;

procedure Spausdinimas(sk : integer);
begin
   for i:=1 to sk do
       Writeln(Rf,i,'. ',A[i].min,'min. ',A[i].sek, 'sek.');
end;


procedure atrinkimas;
   var puse : integer;
begin

   for g:=1 to n do // kiek duomenų reikia sukeisti iš viso
   begin
       for j:=1 to n-g do //kurį sukeičiame (iš esmės didžiausią reikšmę nustumiame į patį galą kiekvienu ciklo pasikartojimu)
       begin
           if (A[j].min > A[j+1].min) or (A[j].min = A[j+1].min) and (A[j].sek > A[j+1].sek )
           then Apkeitimas(j,j+1); // sukeičiame duomenis jei pirmiau esantys duomenys didesni už sekuntį
       end;
   end;

   puse:= n div 2;

   Spausdinimas(puse);
end;

 

Paprasčiausias variantas jei gerai supratau ko reikia.

 

Koks tu greitas, wow! :) Aciu, gal kartais uzsiimi programavimu? ;) Ziurek, o kuo mano variantas blogas, as viska kaip ir atlieku vienoje proceduroje, beto del ko, kai tu apkeitineji, tu a ir b neapkeiti?:)

Redagavo RealEfect
Nuoroda į pranešimą
Dalintis kituose puslapiuose

Užsiiminėju šiek tiek programavimu, pascalį mokykloj išmokau.

 

a ir b procedūroje "Apkeitimas(a,b: integer)" tėra indeksai, lyg namo adresai duomenims. Jei šeimos tarkim apsikeičia savo būstais, juk nepersineša savo adreso į naująjį būstą, o gauna adresą tokį kokį tas namas ir turėjo iki šiol.

 

Geriausia atskirus kodo fragmentus skaidyti į atskiras procedūras. Taip kodas tampa labiau suprantamesnis ir lengviau redaguojamas (kodas pagerėja iš programavimo kultūros pusės).

Redagavo gidasss2
Nuoroda į pranešimą
Dalintis kituose puslapiuose

Užsiiminėju šiek tiek programavimu, pascalį mokykloj išmokau.

 

a ir b procedūroje "Apkeitimas(a,b: integer)" tėra indeksai, lyg namo adresai duomenims. Jei šeimos tarkim apsikeičia savo būstais, juk nepersineša savo adreso į naująjį būstą, o gauna adresą tokį kokį tas namas ir turėjo iki šiol.

 

Geriausia atskirus kodo fragmentus skaidyti į atskiras procedūras. Taip kodas tampa labiau suprantamesnis ir lengviau redaguojamas (kodas pagerėja iš programavimo kultūros pusės).

 

Kaip ir viska supratau, tik yra keletas neaiskumu.Toje vietoje, kur tu parasei n-g, tai kaip ja suprasti, paaiskinimas yra, bet man nedaeina :)

Nuoroda į pranešimą
Dalintis kituose puslapiuose

procedure atrinkimas;
   var puse : integer;
begin

   for g:=1 to n do //------------ 111
   begin
       for j:=1 to n-g do //------------ 2222
       begin
           if (A[j].min > A[j+1].min) or (A[j].min = A[j+1].min) and (A[j].sek > A[j+1].sek )
           then apkeitimas(j,j+1);
       end;
   end;

   puse:= n div 2;
   Spausdinimas(puse);
end;

 

Šitas rikiavimo būdas yra tokio principo:

 

Tarkime turime 5 duomenis

 

10 3 8 2 3

 

Ir mums reikia surikiuoti didėjimo tvarka. Taigi panaudosime ciklą cikle. Išorinis ciklas (pavyzdyje '//------------ 111') tarsi pasako kiek skaičių reikia tikrinti, o vidinis (//------------ 2222) perrikiuoja skaičius. Vidinio ciklo esmė perkelti didžiausią skaičių į galą paeiliui lyginant 2 skaičius. Vygdome vidinį ciklą:

 

10 3 8 2 3

 

tikrinam pirmą ir antrą narį ir jei pirmas didesnis už antrą tada sukeičiame (šiuo atveju taip ir yra):

 

3 10 8 2 3 (1 su 2)

 

dabar tikriname antrą ir trečia ir vėl apkeičiame jei antras didesnis už trečią:

 

3 8 10 2 3 (2 su 3)

3 8 2 10 3 (3 su 4)

3 8 2 3 10 (4 su 5)

(4 kartai)

 

įvykdėme vidinį ciklą, kaip matai didžiausias narys atsidūrė gale, reiškia mums nebereikia tikrinti paskutinio nario, nes mes jau žinome, kad gale yra didžiausias ir stovi ten kur jam vieta pagal sąlygą. Taigi kiek kartų įvygdėme vidinį ciklą (ta prasme pilnai įvygdėmė), tiek galime nebetikrinti paskutinių skaičių.

 

vygdome antrą ratą vidinio ciklo (galime nebetikrinti paskutinio skaičiaus):

 

3 8 2 3 10

 

3 8 2 3 10 (1 su 2)

3 2 8 3 10 (2 su 3)

3 2 3 8 10 (3 su 4)

(3 kartai)

 

2 3 3 8 10 (1 su 2)

2 3 3 8 10 (2 su 3)

(2 kartai)

 

2 3 3 8 10 (1 su 2)

(1 kartas)

 

ir viskas, kaip matai ciklų skaičius mažėja. Aišku galima kiekvieną kartą vis po 4 ciklus daryti, bet apkrausime procesorių nereikalingais veiksmais, geriau darome kodą labiau ekonomišką.

Redagavo gidasss2
Nuoroda į pranešimą
Dalintis kituose puslapiuose

Galetum buti mokytoju :D Viskas aisku dabar, padariau, kaip tu parodei, pats parasiau, kad butu siokia tokia nauda, bet dabar bandau dar padaryti kitaip, nes cia egzaminine uzduotis, tai yra dar 2 katinu grupes ir reikia padaryt taip, kad is kiekvienos butu atrinkta, taip kaip cia buvo greiciausi katinai, tai kaip isivaizduoju, cia prireiks dar vieno ciklo :)

Redagavo RealEfect
Nuoroda į pranešimą
Dalintis kituose puslapiuose

iš kur tu gauni šituos masyvus: min1 ir sek1. Juos tu spausdini, o rikiuodamas niekur kaip ir nepanaudoji, tai savaime aišku kad jų reikšmės lieka lygios nuliams. Pažiūrėk kaip aš buvau spausdinimą parašęs, ar ne taip turėtų būti?

Supratau ta klaida jau-ziopla klaida :) Ziurek, dabar tik man isaiskink, kodel pas mane taip yra, kad mazejimo tvarka, o ne didejimo skaiciai isspausdinami? :) Kodas tai toks:

procedure atrinkimas;
begin
   for g:=1 to n do
   begin
       for j:=1 to n-g do
       begin
           if (A[j].min < A[j+1].min) or (A[j].min = A[j+1].min) and (A[j].sek < A[j+1].sek ) then
           begin
               C:=A[j+1].min;
               A[j+1].min:=A[j].min;
               A[j].min:=C;
               W:=A[j+1].sek;
               A[j+1].sek:=A[j].sek;
               A[j].sek:=W;
           end;
       end;
   end;
end;

procedure Spausdinimas;
begin
   skaic:=n div 2;
   for i:=1 to skaic do
   Writeln(Rf,A[i].min,' min ',A[i].sek, '  sek ');
end;

Redagavo RealEfect
Nuoroda į pranešimą
Dalintis kituose puslapiuose

Supratau ta klaida jau-ziopla klaida :) Ziurek, dabar tik man isaiskink, kodel pas mane taip yra, kad mazejimo tvarka, o ne didejimo skaiciai isspausdinami? :) Kodas tai toks:

procedure atrinkimas;
begin
   for g:=1 to n do
   begin
       for j:=1 to n-g do
       begin
           if (A[j].min < A[j+1].min) or (A[j].min = A[j+1].min) and (A[j].sek < A[j+1].sek ) then
           begin
               C:=A[j+1].min;
               A[j+1].min:=A[j].min;
               A[j].min:=C;
               W:=A[j+1].sek;
               A[j+1].sek:=A[j].sek;
               A[j].sek:=W;
           end;
       end;
   end;
end;

procedure Spausdinimas;
begin
   skaic:=n div 2;
   for i:=1 to skaic do
   Writeln(Rf,A[i].min,' min ',A[i].sek, '  sek ');
end;

 

 

Nes tu duomenis apkeiti tada, kai sekantis didesnis už buvusį. Turiu omeny šią vietą:

 

if (A[j].min < A[j+1].min) or (A[j].min = A[j+1].min) and (A[j].sek < A[j+1].sek ) then

 

A[j].min < A[j+1].min va pvz apkeis čia jei A[1].min bus mažesnis už A[2].min. Tiesiog varneles apsuk į kitą pusę ir problema išspręsta.

Nuoroda į pranešimą
Dalintis kituose puslapiuose

Viskas dabar man veikia, tik dabar jau kiek kita uzduoti darau :) Viskas tas pats kas cia buvo,tik kaip jau minejau anksciau atsiranda dar kelios grupes tu katinu ir velgi reikia is ju paimti puse greiciausiu :) virsuje atsiranda kintamasis k,kuris reiskia grupiu skaiciu.Ziurek, as dabar toje proceduroje, kur duomenis paskirsto didejimo tvarkoje, pridejau "for i:=1 to k do" ir tuomet ten kur yra n-katinu skaicius grupeje, ji jau sukuriau kaip masyva, nes kadangi kelios grupes, tai ir keli n, o ne vienas, todel dabar n bus n :) Kodai tokie:

procedure atrinkimas;
begin
   for i:=1 to k do
   begin
       for g:=1 to n[i] do
       begin
           for j:=1 to n[i]-g do
           begin
               if (A[j].min > A[j+1].min) or (A[j].min = A[j+1].min) and (A[j].sek > A[j+1].sek ) then
               begin
                   C:=A[j].min;
                   A[j].min:=A[j+1].min;
                   A[j+1].min:=C;
                   Temp:=A[j].vard;
                   A[j].vard:=A[j+1].vard;
                   A[j+1].vard:=Temp;
                   W:=A[j].sek;
                   A[j].sek:=A[j+1].sek;
                   A[j+1].sek:=W;
               end;
           end;
       end;
   end;
end;

procedure Spausdinimas;
begin
   for j:=1 to k do
   begin
       skaic[j]:=n[j] div 2;
       for i:=1 to skaic[j] do
       Writeln(Rf,A[i].vard,' ',A[i].min,' min ',A[i].sek, '  sek ');
   end;
end;

Problema yra tame, kad duomenys visiskai nesamoningi rezultatu faile, nes isspausdinami ne taip kaip reikia, dabar parodysiu duomenu failo foto:

http://i45.tinypic.com/98857m.jpg

O cia rezultatu failo fotke:

http://i48.tinypic.com/2heg8zn.jpg

Nuoroda į pranešimą
Dalintis kituose puslapiuose

Viskas dabar man veikia, tik dabar jau kiek kita uzduoti darau :) Viskas tas pats kas cia buvo,tik kaip jau minejau anksciau atsiranda dar kelios grupes tu katinu ir velgi reikia is ju paimti puse greiciausiu :) virsuje atsiranda kintamasis k,kuris reiskia grupiu skaiciu.Ziurek, as dabar toje proceduroje, kur duomenis paskirsto didejimo tvarkoje, pridejau "for i:=1 to k do" ir tuomet ten kur yra n-katinu skaicius grupeje, ji jau sukuriau kaip masyva, nes kadangi kelios grupes, tai ir keli n, o ne vienas, todel dabar n bus n :) Kodai tokie:

procedure atrinkimas;
begin
   for i:=1 to k do
   begin
       for g:=1 to n[i] do
       begin
           for j:=1 to n[i]-g do
           begin
               if (A[j].min > A[j+1].min) or (A[j].min = A[j+1].min) and (A[j].sek > A[j+1].sek ) then
               begin
                   C:=A[j].min;
                   A[j].min:=A[j+1].min;
                   A[j+1].min:=C;
                   Temp:=A[j].vard;
                   A[j].vard:=A[j+1].vard;
                   A[j+1].vard:=Temp;
                   W:=A[j].sek;
                   A[j].sek:=A[j+1].sek;
                   A[j+1].sek:=W;
               end;
           end;
       end;
   end;
end;

procedure Spausdinimas;
begin
   for j:=1 to k do
   begin
       skaic[j]:=n[j] div 2;
       for i:=1 to skaic[j] do
       Writeln(Rf,A[i].vard,' ',A[i].min,' min ',A[i].sek, '  sek ');
   end;
end;

Problema yra tame, kad duomenys visiskai nesamoningi rezultatu faile, nes isspausdinami ne taip kaip reikia, dabar parodysiu duomenu failo foto:

http://i45.tinypic.com/98857m.jpg

O cia rezultatu failo fotke:

http://i48.tinypic.com/2heg8zn.jpg

 

Klaida failo nuskaityme. Kiekvieną grupę nuskaitai vėl ant tų pačių indeksų, taip kad galiausiai lieka tik paskutinė grupė. Turi sugalvoti, kaip visus duomenis išsaugoti į skirtingas vietas. Tai galima daryti įvairiai. Galima kiekvienai grupei atskirą masyvą naudoti, arba, pavyzdžiui, dėti viską į vieną masyvą, tik ne vis nuo pirmo indekso saugoti, o vis toliau ir žymėtis, nuo kelinto indekso yra kita grupė. Esminė klaida tik nuskaityme, kad vieną ant kito duomenis nuskaitai ir nebeturi pirmųjų.

Nuoroda į pranešimą
Dalintis kituose puslapiuose

Kažkada dariau ir aš šitą programą, naudojant įrašome elementus. Gali pasižiūrėti kaip daryta tyk lygiuotė išsikraipė.

 

 

program varzybos;
type sarasas=record
       	vardas:string[20];
       	laikas:integer;
end;
mas=array[1..50] of sarasas;

//Surandame geriausią bėgiką.
function Geriausias(k:integer; GG:mas):integer;
var i,nr,m:integer;
begin
nr:=0; m:=0;
for i:=1 to k do
if GG[i].laikas > m
then m:=GG[i].laikas;

for i:=1 to k do
if GG[i].laikas <= m then
begin
   	m:=GG[i].laikas;
   	nr:=i;
end;
Geriausias:=nr;
end;

//Perrikiojame masyvą ir pašaliname geriausią bėgiką
procedure Perrikiojame(id,k:integer; var GG:mas);
var i:integer;
begin
for i:=id to k-1 do
begin
   	GG[i].vardas:=GG[i+1].vardas;
   	GG[i].laikas:=GG[i+1].laikas;
end;
end;

//Surikiuojame masyvą laiko didėjimo tvarka
procedure Rikiavimas(k:integer; var G:mas);
var i,j,laikas:integer;
vardas:string[20];
begin
for i:=1 to k-1 do
   	for j:=i+1 to k do
   	if G[i].laikas > G[j].laikas then
   	begin
       	vardas:=G[j].vardas;
       	G[j].vardas:=G[i].vardas;
       	G[i].vardas:=vardas;
       	laikas:=G[j].laikas;
       	G[j].laikas:=G[i].laikas;
       	G[i].laikas:=laikas;
   	end;
end;
//Nuskaituome failą.
procedure Duomenys(var kk:integer; var G:mas);
var i,j,n,k,id,kiek,ii,min,sek:integer;
F1:text;
GG:mas;
begin
assign(F1,'U2.txt');
reset(F1);
readln(F1,n);
ii:=0;
for i:=1 to n do
begin
   	readln(F1,k);
   	for j:=1 to k do
   	begin
       	readln(F1,GG[j].vardas,min,sek);
       	GG[j].laikas:=(min*60)+sek;
   	end;
   	//Apskaičiuojame kiek reikės geriausių rezultatų iš grupės.
   	kiek:=k mod 2;
   	if kiek = 0 then kiek:=k div 2
   	else kiek:=round(k/2);
   	//Skaičiuos kiek bus išviso geriausių bėgikų.
   	kk:=kk+kiek;
   	//Ciklas vyks tiek kiek reikės atrinkti iš grupės geriausių bėgikų.
   	while kiek > 0 do
   	begin
       	ii:=ii+1;
       	id:=Geriausias(k,GG); //Surandame geriausio bėgiko indeksą masyve.
       	G[ii].vardas:=GG[id].vardas; //Priskiriame kitam masyvui geriausią rezultatą.
       	G[ii].laikas:=GG[id].laikas;
       	Perrikiojame(id,k,GG); //Pašaliname iš masyvo geriausią rezultatą.
       	kiek:=kiek-1;
   	end;
end;
close(F1);
end;
//Įrašome failą.
procedure Rezultatas(k:integer; G:mas);
var i:integer;
F2:text;
begin
assign(F2,'U2rez.txt');
rewrite(F2);
for i:=1 to k do
writeln(F2,G[i].vardas,' ',G[i].laikas div 60,' ',G[i].laikas mod 60);
close(F2);
end;
//Programa
var G:mas;
k:integer;
begin
Duomenys(k,G);
Rikiavimas(k,G);
Rezultatas(k,G);
end.

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