Kezdőoldal » Számítástechnika » Programozás » Hogy tudnám ezt a programot...

Hogy tudnám ezt a programot leegyszerűsíteni?

Figyelt kérdés

var n,f,a,max1,max2,s:integer;

v:array [1..100] of integer;

begin

assign(f,'b.txt');

reset(f);

readln(f,n);

while not eof(f) do

begin

read(f,a);

for i:=1 to n do

if a mod 10=5 then begin

v[i]:=a;

s:=s+1;

end;

end;

for i:=1 to s do

if v[i]>max1 then max1:=v[i];

for i:=1 to s do

if (v[i]>max2) and (v[i]<max1) then max2:=v[i];

writeln(max2);

writeln(max1);

end.


2017. márc. 5. 11:04
 1/10 tabaki ***** válasza:

Értelmes változónevekkel például sokkal egyszerűbb lenne átlátni.

Egyelőre ennyit, estig nem leszek pascalos gép közelében.

2017. márc. 5. 11:11
Hasznos számodra ez a válasz?
 2/10 coopper ***** válasza:

Szia.


Szerintem :


Max1-nek Max2-nek adj értéket valahol, ez csak úgy eszembe jutott.


Szerintem a Max1 meghatározásához nem kell külön ciklus (mivel ez sima maximum kiválasztás) azt simán meg lehet határozni azután ahol v[i]-nek értéket adsz. (v[i]:=a;)


Mivel Max2 értékének meghatározásához kell Max1 értéke is, annak sajnos kell a külön for ciklus, ott nem tudsz egyszerűsíteni.


Sok sikert.

üdv.

2017. márc. 5. 12:37
Hasznos számodra ez a válasz?
 3/10 tabaki ***** válasza:

További egyszerűsítést jelentene, ha létezne i változó és f fájl...

Ezenkívül ilyen esetben azért illenék valahová feltenni a b.txt fájlodat is, amelyet fel akarsz dolgozni. Gondolom, ez is a te kérdésed volt, már ott is nekem kellett egyet létrehoznom a teszteléshez:

https://www.gyakorikerdesek.hu/szamitastechnika__programozas..

2017. márc. 5. 18:29
Hasznos számodra ez a válasz?
 4/10 tabaki ***** válasza:

Még egyszerűbb lenne, ha valami magyarázatot is fűztél volna hozzá, mert az én számomra teljesen értelmezhetetlen a szándék.


ReadLn(f, n);

while not Eof(f) do

      begin

            Read(f, a);

            for i := 1 to n do

                  if a mod 10 = 5 then

                        begin

                              v[i] := a;

                              s := s + 1;

                        end;

      end;


Tehát, ha sikerül követnem, mi történik:


Beolvasol a fájl elejéről egy számot az N változóba, amelynek a jelentősége előttem homályos, mindenesetre valamiféle ciklushatár. Utána végigolvasod a fájl tartalmát, és a benne talált számokkal a következőket csinálod:

1. Ellenőrzöd, hogy a szám ötre végződik-e.

2. Ha igen, a titokzatos N-ig tartó ciklusban minden egyes tömbelembe beírod ugyanezt a számot, és növelsz egy definiálatlan (vagyis a pascalban 0 kezdőértékű) S változót.


A folyamat végén a 100 elemű tömböd 1..N része a legutóbbi 5-re végződő számot tartalmazza, a többi pedig nullát. Ezek után indítasz egy vizsgálatot, amely nemcsak az N indexig beírt egyforma számokkal és a tömböd eddig figyelmen kívül hagyott, nulla értékű elemeivel akar valamit, de jó eséllyel az indexhatárt túllépve fals értékeket, illetve futási hibát eredményez.


Én a magam részéről nem tudok rájönni, hogy mi a fene akar ez lenni.

2017. márc. 5. 19:55
Hasznos számodra ez a válasz?
 5/10 A kérdező kommentje:
Sajnos nem tudok magyarazatot fuzni hozza, nem en irtam a programot, az en feladatom hogy leegyszerusitsem.
2017. márc. 5. 20:50
 6/10 A kérdező kommentje:
De latszolag elobb a hibakat kell kijavitani es utana egyszerusiteni. Mindenesetre koszonom!
2017. márc. 5. 20:52
 7/10 tabaki ***** válasza:

Hát... nincs mit. Szerintem ez egy értelmetlen zagyvaság, a b.txt fájl nélkül különösen az. Általános „megoldásként” bármire -- még az ostoba „eredmény” kiíratására is -- alkalmatlan, ugyanis a fájlban nagyon egyszerű olyan adatokat elhelyezni, amelyekkel garantáltan hibára fut. De akkor is hülyeség, ha kínosan ügyelsz rá, hogy az adatfájl csak megfelelő értékeket tartalmazzon. Ekkor (már az elemi hibák, pl. a hiányzó vagy hibásan definiált változók rendbe tétele után) meglátásom szerint a következő három eshetőség marad:

1. Nem volt 5-re végződő szám a fájlban, az egész tömb nullákat tartalmaz: MAX1 = 0 (mint legnagyobb talált érték), MAX2 = 0 (mint változatlan kezdőérték).

2. Egyetlen 5-re végződő szám volt, N értéke pedig éppen a V[] tömb indexhatára, vagyis 100: A tömb minden eleme ugyanazt a számot tartalmazza. MAX1 = a talált szám (mint legnagyobb talált érték), MAX2 = 0 (mint változatlan kezdőérték).

3. Talált valahány 5-re végződő számot, de S szerencsésen az indexhatáron belül maradt: A tömb első (1..N) részének minden eleme a legutóbbi megfelelő számot tartalmazza, a továbbiak nullát. MAX1 = a legutóbbi 5-re végződő szám (mint legnagyobb talált érték), MAX2 = 0 (S-től függően mint a tömb következő legnagyobb, de az előzőnél kisebb értéke, vagy mint változatlan kezdőérték).

2017. márc. 5. 21:35
Hasznos számodra ez a válasz?
 8/10 tabaki ***** válasza:
+ Pontatlan voltam: Ha a legutóbbi talált szám mínusz értékű, akkor MAX1 = 0, MAX2 = a mínusz szám.
2017. márc. 5. 21:40
Hasznos számodra ez a válasz?
 9/10 tabaki ***** válasza:

Itt egy kísérlet valami hasonlóra, kommentezve. A program megpróbálja beolvasni a b.txt első sorában talált értéknek megfelelő N mennyiségű számot, kigyűjti az 5-re végződőket, közben megjegyzi a legnagyobbat. Ha végzett, a talált számok között megkeresi a legnagyobb, de a maximumnál kisebb értékűt:


program max_1_2;


var

i, n, a, max1, max2, s : smallint;

v :array [1..100] of integer;

f : text;

     

begin

Assign(f,'b.txt');

Reset(f);

ReadLn(f, n); // az első érték: ennyi számot olvasnánk be

if n > 100 then n := 100; // legfeljebb a tömb méretéig

s := 0; // a talált 5-végűek számlálója

max1 := -32768; // smallint alsó határa a Free Pascalban

i := 0;      // ciklusszámláló

while not Eof(f) and (i < n) do

      begin

            Read(f, a); // egy szám beolvasása

            if a mod 10 = 5 then // ha 5-re végződik

                  begin

                        if a > max1 then // nagyobb, mint az eddigi legnagyobb?

                              max1 := a; // igen, megjegyzi

                        Inc(s); // számláló lép

                        v[s] := a; // a számot beírja a tömbbe

                  end;

            Inc(i); // a ciklusszámláló lép, hogy összevethető legyen N-nel

      end;

// A legnagyobb szám benne van MAX1-ben.

// A következő keresése -- nem veszi figyelembe, ha több azonos van,

// csak az értéket nézi:     

max2 := -32768; // smallint alsó határa

for i := 1 to s do // végignézi az összes feljegyzett értéket

      if (v[i] > max2) and (v[i] < max1) then // ha nagyobb az előzőnél...

            max2 := v[i]; // beírja

WriteLn(max2); // második legnagyobb

WriteLn(max1); // legnagyobb

end.

2017. márc. 5. 22:16
Hasznos számodra ez a válasz?
 10/10 tabaki ***** válasza:

Megjegyzés:


Megkíséreltem az eredeti programot is kommentezni, hogy egyenként is rámutassak a hibákra, de nem jutottam a végére. Ebben a formában a követhetetlen céloknak, az óvodás szintű hibáknak és a trehányságnak olyan zavaros kutyuléka, hogy továbbra sem világos, mit kéne csinálnia pontosan, de legalább le sem fordul, és ronda. Bámulatos, hogy ilyen kis méretben micsoda bemutatót tart abból, hogyan nem szabad programot írni -- egy állatorvosi póni.

2017. márc. 6. 10:00
Hasznos számodra ez a válasz?

Kapcsolódó kérdések:




Minden jog fenntartva © 2025, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu

A weboldalon megjelenő anyagok nem minősülnek szerkesztői tartalomnak, előzetes ellenőrzésen nem esnek át, az üzemeltető véleményét nem tükrözik.
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!