Nem tragédia, ha 1-1 rekord elvész, de inkább a fordítottja igaz jelenleg. 2 mp-enkénti új adatnál, még 0,777 mp-es késleltetéssel is visszaér a program a lekérdezéshez 1 mp-en belül, ilyenkor ugyanazt a rekordot 2x dolgozza fel és kétszer pittyeg a térképen ugyanazon a helyen. (Ez egy navigációs-mozgótérképes program, csak a soros portok kezelésére írni kellett egy külső programot, mert a régi csak a fizkai COM1 és COM2 portról tud olvasni, az meg az újabb notebookokon nincs.)
Olyankor szoktam itt felbukkanni, amikor valami nagy bajom van, mint most. Bele kellene nyúlnom egy 10 évvel ezelőtt más által írt programba, de az én primitív Pascal ismereteim kevesek, ezért az egy dologért meg nem akarok már egy ilyen nagy dolgot megtanulni.
A feladat: van egy fájl, amit egy másik program gyárt a soros vonal bemenetből (GPS NMEA file), amikor egy-egy rekordot hozzáír 1-2 másodpercenként, azonnal becsukja, tehát az idő 98%-ában zárva van. Mindíg csak az utolsó rekord van benne.
Van egy másik program, amelyik ki akarja olvasni a mindenkori utolsó rekordot és aztán elszalad vele feldolgozni. Eddig is volt a programban egy olyan funkció, ami hosszú ilyen fájlokat dolgozott fel soronként, míg a végére ért. Akkor előlről kezdte.
Most persze egy sor a fájl és ha kész a feldolgozás, visszamegy reset(nf) utasítással ennek az elejére. Az esetek 99%-ában ezt meg is tudja csinálni, mert a fájl az adott pillanatban olvasható. Nagy ritkán viszont a másik, a beleíró program fogja, mert még nem zárta vissza. Iyenkor azt kellene csinálnia, hogy némi késltetéssel próbálja újra, de ehellyett Runtime error 05 hibával elszáll. Én ezt csináltam
ujra:
delay(777); {Azért ennyi, hogy több kör után se jöjjön ki egész másodperc)
reset(nf);
if doserror>0 then goto ujra;
Ez persze nem működik, mert a doserror-os sorhoz már nem jut el a futás, hamarabb kiakad.
Hogy kellene ezt szabályosan csinálni. Gondolom valaghogy elkell venni a programtól a dos hibakezelést és előzőleg ellenőrízni a fájl állapotát, és ha nem nyitható meg, akkormenni vissza. De hogyan lehet ezt csinálni. Megnéztem a FindFirst parancsot, de a könyvből nem derül ki, hogy a meg nem nyitható fájlra mit mond, egyszerű lenne, ha nem találná meg és kész.
Megnézi, javítja, kinyomtatja – nem tudom, de nem is érdekel: ha ő azt írja, hogy 'megnyitni' szeretné, akkor én megmondom, hogyan tudja megnyitni... majd ha azt kérdezi, hogyan tudja futtatni, akkod válaszolok arra...
Egy eléggé kezdő Turbo Pascalos vagyok, valamint az informatikai ismereteim is hiányosak, ezért kérlek titeket legyetek megértőek.
Az a problémám, hogyha irok egy programot akkor az egy .pas kiterjesztésű fájl lesz. Ezt azonban nem tudom megnyitni másik számítógépen, valamint ezen is csak a Turbo Pascallal.
Kérlek titeket segítsetek, hogy mit kell csinálnom a programmal amit írtam, hogy futtatható legyen!
Erre való a repeat... until hátultesztelő ciklus. Először kiírod a képernyőre, hogy mit vársz a felhasználótól, aztán beolvasod az adatot, és utána ellenőrzöd. Ha nem bírt a szerencsétlen eltalálni az [1,5] intervallumot, akkor kap egy ismételt tájékoztatást, és újból írhatja be. illik tesztelni a saját programodat különféleképpen elrontott adatokkal.
nem hanem, tudod megcsináltam az iskolai átlagot, csak én ugy csináltam meg hogy akármilyen számot beirunk azoknak kiszámolja az átlagát. de nekem ugy kellene még ezt a progit megváltoztatnom hogy ne fogadjon el bármely számot, hanem csak 1-5-ig.mivel hogy 6-os jegy már nincs.ezt hogy kellene megcsinálni? a 663-mashozzászólásnál megtod nézni hogyan kezdtem el.abban mit kell átirni hogy csak 1-5 ig fogadja el a számokat.?
Hali! Még annyi kellene a progihoz hogy csak 1-5ig fogadja el a számokat,mert ugye 6-os jegy nincsen.tehát ne engedjen beirni más számot csak 1-5-ig.Ezt hogy kellene megcsinálni?előre is köszi a segitséget.
myFile : Text; x : Real; x := 2.5; Assign(myFile,'C:fajlnev.txt'); {hozzarendeled a fajlt a valtozodhoz} Rewrite(myFile); {megnyitod a fajlt irashoz} Writeln(myFile,'duma, duma es duma'); {irsz egy sort a fajlba} Writeln(myFile,'x erteke: ', x ); {adatot irsz a fajlba} Close(myFile); {a vegen lezarod a fajlt}
de egy kis fáratsággal utána tudnál nézni, csak keresni kellene.
oké már megcsináltam a progit,már tökéletesen működik,csak még egy gondom van hogy hogyan mentse el a fájlba amit kiszámol a progi?köszi az eddigi segitséget.
Viccelsz? Ha ész nélkül csak bemásoltad, persze, hogy hibát fog kiírni. A MAXTANULO meg a MAXOSZTALY is konstans, előtte nem árt deklarációban valami értéket adni nekik. De ahogy más is írta, ide teljes programkódot senki nem fog beírni. Amit írtam az csak egy ötlet volt, amin vagy elindulsz, vagy kitalálsz jobbat. Programozni nem lehet megtanulni 2 nap alatt. Ha ennyire el vagy maradva, miért nem szántál rá több időt?
általában nem elég mechanikusan csak bemásolni a kódrészletet, hanem a program többi részét is hozzá kell faragni ami kapcsolatos a megváltoztatott részlettel.
menut úgy alakitasz ki hogy kiírtatod pl.: - 1: adatbevitel - 2: osztály statisztika - 3: iskola statisztika - 4: adatok mentése - 0: kilépés aztán bekérsz egy számot a fehasználótól hogy melyiket válassza, és ezen változó értékétől függően (Case..Of) hívod meg az adott programrészt.
(de ha ezt se tudod akkor elég kilátástalan vállalkozás így, bizonyára ezért sem fáradnak a többiek további felvilágosítással).
És ezeket amit irtál hova kell beilleszteni vagy mit kell kicserélni ezekre?Mert akárhova beillesztem hibát ir ki. Meg próbálnám megcsinálni azt hogy az ne csak az osztály átlagát számolja ki hanem az egész iskoláét.ugy hogy bevezetek egy új változót pl: 'e' és hogy ez legyen az iskola átlaga., de ennél is mindig kiir egy hibát.Meg nem tudom azt se elérni hogy külön kérje a féléves átlagot be és az év végit.Mert igy csak egy átlagot kér, nem tudom hogy lehet több menüt kialakitani hogy külön félévest+év végit is számoljon.mert ahova ki van irva az osztály átlag és létszám, oda hiába próbálom tovább irni, hogy még az A és a B osztályok átlagát is számolja ki,nem engedi.Ezt hogy lehet hogy külön azt is számolja ki?És hogy kérje be külön a féléves és az éves átlagot is?
A bátrak egyből a közepébe vágnak, menet közben alkalmazkodnak a felmerülő problémákhoz. Nem félnek a munkától, ha kell százszor is újrakezdik. A trial-error módszer élő képviselői ők, kik munkásságukkal egyben a backtrack algoritmust is szemléltetik. Dokumentációt sem készítenek, ha később változtatás, vagy probléma lép fel, hősiesen megint nekiesnek a programozásnak. Nem restek a kereket újra felfedezni, és másnak is megadják ezt az örömet...
Egy lehetséges módszer az is, hogy először pontosan meghatározzuk, hogy mit is kell csinálni, utána megtervezzük a tárolandó adatokat és a programot, és csak amikor ez készen van, akkor esünk neki a billentyűzetnek...
nem tudom szükséges e (van e értelme) a tanulók átlagait eltárolni, de ha nem, akkor annyival egyszerűbb/átláthatóbb a dolgod hogy a tanulókhoz csak egytelen tömb kell a Beolvasás függvényedbe. e függvény végén aztán kiszámolod az osztályátlagot, megszámlálod a kitünök és bukottak számák és csak ezeket tárolod el recordként egy 2 dimenziós tömbe (kb. mint Kisspetyánál: 4év * 2félév).
aztán már csak ezekből a feltöltött az osztálytömbökből kell kiszámolnod/kiíratnod a szükséges jelentéseket. fájlkezelésnek meg utána tudsz nézni ha még nem tanultátok volna: http://pascalprogramming.byethost15.com/lesson9.php
Kipróbáltam: ha rákeresek az assign pascal szavakra (idézőjel nélkül), és magyarra állítod a nyelvet a Google-ban, akkor kapásból sok okosságot találsz a filekezelésről. Hajrá!
Elég zavaros a specifikációd, de ettől biztos bonyolultabb adatszerkezetre lesz szükséged. Csak egy ötlet:
type TTanulok = array [1..MAXTANULO] of Real;
TNaplo = record Letszam: Byte; Tanulok: TTanulok; {saját ízlés szerint iderakhatod azon változókat is, amiket ugye a *programod* számol ki:} Bukottak, Kitunoek: Byte; OsztAtlag: Real; end;
var Osztalyok: array [1..MAXOSZTALY, 1..4, 1..2] of TNaplo;
ahol 1..4 a négy év, 1..2 a két félév
hivatkozás a 13. gyerek átlagára a 3. osztályban a 4. év 2. félévében: x := Osztalyok[3, 4, 2].Tanulok[13];
Na elkezdtem csinálni de eddig jutottam el.Hogyan kellene tovább folytatnom hogy el is mentse egy fáljba ezeket.és hogy külön kérje hogy féléves vagy éves átlagot adjak meg.meg még az évek összehasonlitását nem tudom hogy hogyan kellene megcsinálni.valaki tudna nekem ebben segiteni?előre is köszönöm. Itt a program ami készen van eddig.:
program iskolaatlag;
uses Crt;
type TNaplo = array[1..50] of real;
var A_oszt, B_oszt: Tnaplo;
A_letsz, B_letsz: integer;
procedure Beolvas(var Oszt: Tnaplo; var Letsz: integer);
var i: integer;
begin
Write('Hány tanuló van: ');
readln(Letsz);
for i := 1 to Letsz do
begin
Write('Az ',i,'. átlaga: ');
ReadLn(Oszt)
end;
WriteLn;
end;
function Atlag(Oszt: Tnaplo; Letsz: integer): real;
var i: integer;
sum: real;
begin
sum := 0;
for i := 1 to Letsz do
sum := sum + Oszt;
Atlag:= sum / Letsz
end;
begin
ClrScr;
WriteLn('Irja be az A osztály tanulóinak átlagait: ');
Beolvas(A_oszt, A_letsz);
WriteLn('Irja be az B osztály tanulóinak átlagait: ');
Beolvas(B_oszt, B_letsz);
WriteLn('Az A osztály átlaga: ', Atlag(A_oszt, A_letsz):4:2 );
WriteLn( 'A B osztály átlaga: ', Atlag(B_oszt, B_letsz):4:2 );