Formula povprečne variance. Pričakovanje in varianca slučajne spremenljivke

Primeri, ki smo jih obravnavali do sedaj, so prikazali formatiran vnos/izhod informacij v datoteke. Priporočljivo je, da uporabite formatirane datoteke za vnos/izhod številk le, če so majhne po velikosti in količini, pa tudi, ko je treba zagotoviti možnost ogleda datotek z neprogramskimi sredstvi. Sicer pa je seveda veliko bolj učinkovito uporabljati binarni I/O, ki shranjuje števila na enak način kot v OP računalnika, ne pa kot znakovne nize. Naj vas spomnim, da celo število (int) ali realna (float) vrednost zavzame 4 bajte v pomnilniku, dvojna vrednost zavzame 8 bajtov in simbolni pomen vrsta char- 1 bajt. Na primer, število 12345 v besedilni (formatirani) datoteki zavzema 5 bajtov, v binarni datoteki pa 4 bajte.

Binarne datoteke, tj. datoteke, v katerih so shranjene informacije notranja oblika predstavitve se uporabljajo za kasnejšo uporabo s programsko opremo in jih ni mogoče gledati brez programske opreme. Prednost binarnih datotek je, da se, prvič, pri branju/pisanju ne izgublja čas za pretvorbo podatkov iz simbolne oblike predstavitve v notranjo in obratno, in drugič, ni izgube natančnosti. realna števila. Tako pri formatiranem vhodu/izhodu kot tudi pri binarnem vhodu/izhodu morate za »pravilno« obdelavo informacij iz datoteke vedeti, katere vrste podatkov, kako in v kakšnem zaporedju se zapisujejo v binarno datoteko. še posebej, ker ogled binarne datoteke z urejevalnikom besedil ne bo naredil ničesar.

Oglejmo si primer, ki prikazuje zapisovanje celoštevilskih elementov dinamične matrike v binarno datoteko in njihovo branje iz te datoteke.

#vključi

#vključi

#vključi

uporaba imenskega prostora std;

cout<< "Vvedite kol-vo elementov celochisl. massiva: "; cin >> N;

int *mas = novo int [N];

za (i=0; i

cout<< " Vvedite " << i << "-i element: "; cin >> mas[i];

cout<< "\nIdet zapis dannyh v fail..." << endl;

ofstream fout("c:\\os\\bin.dat", ios::binary);//ustvarjeno izhod binarni tok

če(!fout) ( cout<< "\n Oshibka otkrytiya faila!"; getch(); return 1; }

fout.write(reinterpret_cast (mas), N*sizeof(int));//zapiši matriko v datoteko

fout.close();//zapiranje toka

cout<< "Dannye uspeshno zapisany!" << endl;

za (i=0; i

ifstream fin("c:\\os\\bin.dat", ios::binary); //ustvari nit za branje datoteke

if(!fin) ( cout<< "\n Oshibka otkrytiya faila!"; getch(); return 1; }

cout<< "Fail sodergit:" << endl;

fin.read(reinterpret_cast (mas), N*sizeof(int));//branje matrike iz datoteke

za (i=0; i

getch(); vrni 0;

V tem programu je treba posebno pozornost nameniti uporabi funkcij write() (metoda razreda ofstream) in read() (metoda razreda ifstream). Te funkcije si predstavljajo podatke v smislu bajtov in so zasnovane za prenos določenega števila bajtov iz medpomnilnika podatkov v datoteko in nazaj. Parametra teh funkcij sta naslov medpomnilnika in njegova dolžina v bajtih.

Funkcija write() je zasnovana tako, da v datoteko zapiše število bajtov, navedenih v drugem parametru, od tistih, ki so določeni v prvem parametru. naslovi podatkovni medpomnilnik, funkcija read() pa je zasnovana za branje podatkov iz datoteke. Opozoriti je treba, da te funkcije delujejo samo s podatkovnim medpomnilnikom tipa char. V zvezi s tem smo v tem programu uporabili operator reinterpret_cast<> ki naš medpomnilnik podatkov tipa int (mas) pretvori v medpomnilnik tipa char.

Pomembno si je zapomniti, da je ulivanje z uporabo operaterja reinterpret_cast potrebno le v primerih, ko je prvi parameter funkcij pisati() in preberi() ni niz znakov (navsezadnje znak tipa char zavzame samo 1 bajt). Poleg tega, če morate zapisati ali prebrati ne matriko, ampak posamezne spremenljivke, potem morate uporabiti referenčni mehanizem (povezava do naslova medpomnilnika podatkov), na primer:

ofstream fout(ime datoteke, ios::app | ios::binary);

fout.write(reinterpret_cast (& cb), sizeof(float));

Zdaj je treba razpravljati o drugem parametru obravnavanih funkcij. V tem programu smo kot drugi parameter uporabili izraz N*sizeof(int), s katerim smo izračunali število bajtov. Na primer, če imamo 5 elementov niza celih števil, bo število bajtov 20. Funkcija sizeof() vrne število bajtov, dodeljenih za podatkovni tip, določen kot parameter. Na primer sizeof( int) bo vrnil 4.

Torej vam program, podan v tem primeru, omogoča pisanje podatkov v binarni obliki v datoteko bin.dat in njihovo branje iz te binarne datoteke. Poleg tega se ti podatki po branju pretvorijo v vrsto int, pridobijo matrično strukturo in z njimi je mogoče izvajati poljubne operacije.

Zdaj pa si predstavljajte, da morate napisati program, ki vam omogoča branje podatkov iz datoteke bin.dat, in vemo le, da ta datoteka vsebuje elemente niza celih števil v binarni obliki. Število zapisanih elementov ( n ) ne vemo. Pri izdelavi programa nimamo pravice uporabljati konstantnega niza, t.j. mu dodelite pomnilnik v fazi ustvarjanja programa. To bo vodilo do napačnega rezultata. Ker premajhna vrednost N povzroči, da ne bodo prešteti vsi elementi matrike, prevelika vrednost N pa povzroči, da se dodatne celice zapolnijo z naključnimi vrednostmi.

Oglejmo si primer programa, ki omogoča branje elementov niza celih števil iz binarne datoteke z dinamičnim dodeljevanjem pomnilnika in za dokaz realističnosti prebranih podatkov izračuna njihovo vsoto.

#vključi

#vključi

#vključi

uporaba imenskega prostora std;

int N, i, vsota=0, dfb; //dfb - dolžina datoteke v bajtih

ifstream fin("c:\\os\\bin.dat", ios::binary);

if(!fin) ( cout<< "Oshibka otkrytiya faila!"; getch(); return 1; }

fin.seekg(0, ios::end);// nastavi položaj branja na konec datoteke (0 bajtov od konca)

dfb = fin.tellg();//pridobite vrednost položaja konca datoteke (v bajtih)

N=dfb/4;//vemo, da celo število zajema 4 bajte, izračunajte število števil

int *arr = novo int [N];//ustvari dinamično polje

fin.seekg(0, ios::beg);//pred branjem podatkov premakni trenutni položaj na začetek datoteke

fin.read(reinterpret_cast (arr), dfb);

cout<< "Iz faila schitano " << N << " elementov:" << endl;

za (i=0; i

za (i=0; i

cout<< "\n Ih summa = " << sum;

getch(); vrni 0;

Oglejmo si podrobneje ta program, v katerem smo aktivno uporabljali funkciji seekg() in tellg(), ki sta metodi razreda ifstream. Tukaj je treba opozoriti, da Vsaka datoteka, ko je odprta, je povezana s tako imenovanim trenutnim položajem za branje ali pisanje. Ko je datoteka odprta za branje, je ta privzeti položaj nastavljen na začetek datoteke. Toda precej pogosto je treba ročno nadzorovati položaj, da lahko beremo in pišemo, začenši s poljubnega mesta v datoteki. Funkciji seekg() in tellg() omogočata nastavitev in preverjanje trenutnega kazalca branja, medtem ko funkciji seekp() in tellp() storita enako za kazalec pisanja.

Metoda seekg(1_parameter, 2_parameter) premakne trenutni položaj branja iz datoteke za število bajtov, navedenih v parametru 1, glede na lokacijo, podano v parametru 2nd_parameter. 2_parameter ima lahko eno od treh vrednosti:

ios::beg – od začetka datoteke;

ios::cur – s trenutnega položaja;

ios::end – od konca datoteke.

Tukaj so beg, cur in end konstante, definirane v razredu ios, simboli:: pa predstavljajo operacijo dostopa do tega razreda. Na primer, operater fin.seekg(-10, ios::end); omogoča nastavitev trenutnega položaja branja iz datoteke na 10 bajtov pred koncem datoteke.

Zdaj pa se vrnimo k opisu delovanja programa. Glede na to, da ne poznamo števila števil, zapisanih v datoteko, moramo najprej ugotoviti število števil. Če želite to narediti, uporabite fin.seekg(0, ios::end); premaknemo se na konec datoteke in s funkcijo tellg() vrnemo dolžino datoteke v bajtih spremenljivki dfb. Funkcija tellg() vrne trenutni položaj kazalca v bajtih. Ker poznamo dolžino enega celega števila v bajtih (4 bajte), je enostavno izračunati število števil, zapisanih v datoteko, če poznamo dolžino datoteke v bajtih ( N=dfb/4;). Ko ugotovimo število številk, ustvarimo dinamično matriko in se premaknemo na začetek datoteke, da začnemo brati podatke s funkcijo read(). Po prenosu določenega števila podatkovnih bajtov (dfb) v podatkovni medpomnilnik (arr), tako prebrani podatki pridobijo matrično strukturo in postanejo popolnoma primerni za kakršnekoli kodne operacije in transformacije.

V zgornjem primeru je "najdaljša" možnost "b": zahteva 23 bajtov (21 bajtov za niz in 2 bajta za celo število). Možnosti "n" in "m" zahtevata 4 oziroma 5 bajtov (glejte tabelo).

ime, predmet založbe Variantni del

Binarne datoteke

Binarne datoteke shranjujejo informacije v obliki, v kateri so predstavljene v pomnilniku računalnika, zato so za človeka neprijetne. Če pogledamo takšno datoteko, je nemogoče razumeti, kaj je v njej napisano; ni ga mogoče ustvariti ali popraviti ročno - v kakšnem urejevalniku besedil - itd. Vse te nevšečnosti pa kompenzira hitrost dela s podatki.

Poleg tega so besedilne datoteke razvrščene kot strukture zaporednega dostopa, medtem ko so binarne datoteke razvrščene kot strukture neposrednega dostopa. To pomeni, da lahko kadar koli dostopate do kogar koli, ne le do trenutnega elementa binarne datoteke.

Tipkane datoteke

Spremenljivk strukturiranih podatkovnih vrst (razen nizov) ni mogoče brati iz besedilne datoteke. Na primer, če morate vnesti podatke iz besedilne datoteke, da izpolnite zapis igrač z informacijami o igračah, ki so na voljo za prodajo (ime izdelka, cena izdelka in starostna skupina, za katero je igrača namenjena):

starost: komplet 0..18; (določeno v datoteki z mejami)

potem boste morali napisati naslednjo kodo:

c:char; i,j,min,max: celo število;

a: vrsta igrač;

začetek dodelitve (f, vnos); ponastavi(f);

za i:=1 do 100 do if not eof(f)

nato z [i] do

začetek branja(f,ime,cena,min,max); starost:=;

za j:= min do max naredite age:=age+[j];

Kot lahko vidite, je takšno branje po elementih zelo neprijetno in delovno intenzivno.

Ponujen je izhod iz te situacije tipkane datoteke- njihovi elementi lahko pripadajo kateremu koli osnovnemu ali strukturiranemu podatkovnemu tipu. Edina omejitev je, da morajo biti vsi elementi iste vrste. Ta navidezna neprijetnost je

nepogrešljiv pogoj za organizacijo neposrednega dostopa do elementov binarne datoteke: tako kot v primeru nizov, če je dolžina vsake komponente strukture natančno znana, se lahko naslov katere koli komponente izračuna z zelo preprosto formulo:

<начало_структуры> + <номер_компонента>*<длина_компонента>

Opis tipkanih datotek

V razdelku var so spremenljivke datoteke, ki so zasnovane za delo tipkane datoteke, so opisani kot sledi:

var<файловая_перем>: datoteka od<тип_элементов_файла>;

Nobene spremenljivke datoteke ni mogoče podati kot konstanto.

Namen tipkane datoteke

Od zdaj naprej do konca razdelka bomo z besedo "datoteka" razumeli " binarno tipizirana datoteka« (seveda, če ni posebej navedeno drugače).

Ekipa dodeli(f,"<имя_файла>"); služi za vzpostavitev povezave med spremenljivko datotekef in imenom datoteke, za delovanje katere bo ta spremenljivka odgovorna.

vrstica "<имя_файла>" lahko vsebuje celotno pot do datoteke. Če pot ni določena, se šteje, da je datoteka v istem imeniku kot izvršljivi modul programa.

Odpiranje in zapiranje tipkane datoteke

Glede na dejanja, ki jih bo vaš program izvedel z datoteko, ki se odpre, jo lahko odprete na dva načina:

ponastavi(f); - odpiranje datoteke za branje informacij iz nje in hkrati pisanje vanjo (če taka datoteka ne obstaja, bo poskus odpiranja povzročil napako). Isti ukaz se uporablja za vrnitev kazalca na začetek datoteke;

prepiši(f); - odpiranje datoteke za zapisovanje informacij vanjo; če taka datoteka ne obstaja, bo ustvarjena; če datoteka z istim imenom že obstaja, bodo vse informacije, ki so bile prej v njej, izginile.

Zapirajo tipkane datoteke procedure close(f), ki je skupna vsem vrstam datotek.

Branje iz tipkane datoteke

Branje iz datoteke, ki je odprta za branje, poteka z ukazom read(). V oklepajih je najprej navedeno ime spremenljivke datoteke in nato seznam vnosov1) :

Vnesete lahko samo spremenljivke tipa, ki ustreza deklaraciji iz datoteke, vendar je ta podatkovni tip lahko tudi strukturiran. Recimo, če se vrnemo na primer na začetku odstavka. Tipkane datoteke«, bo postalo očitno, da uporaba tipkana datoteka namesto besedila bo bistveno zmanjšalo besedilo programa:

vrsta igrača = ime zapisa: niz; cena: realna;

starost: komplet 0..18; (določeno z mejami)

var f: datoteka igrače;

a: vrsta igrač; začeti

dodeli(f,vnos);

za i:=1 do 100 do

če ne eof(f), potem read(f,a[i]); zapri (f);

Iskanje v tipkani datoteki

Nam že poznana funkcija eof(f:file):boolean sporoči, kdaj je dosežen konec datoteke. Vseh drugih funkcij "končnega iskanja" (eoln(), seekeof() in seekeoln()), ki so del besedilnih datotek, ni mogoče uporabiti za tipkane datoteke.

Toda obstajajo posebni podprogrami, ki vam omogočajo delo tipkane datoteke kot pri strukturah neposrednega dostopa:

1. Funkcija filepos(f:file):longint bo sporočila trenutni položaj kazalca v filef. Če kaže na sam konec datoteke, ki vsebuje N elementov, bo ta funkcija vrnila rezultat N. To je preprosto razložiti: elementi datoteke so oštevilčeni od nič, tako da je zadnji element oštevilčen z N-1. In številoN tako pripada "neobstoječemu" elementu - znaku konca datoteke.

2. Funkcija filesize(f:file):longint bo izračunala dolžino datoteke f.

3. Postopek seek(f:file,n:longint) bo premaknil kazalec v datoteki f na začetek zapisa številka N . Če se izkaže, da je n večji od dejanske dolžine datoteke, se bo kazalec premaknil čez dejanski konec datoteke.

4. Postopek truncate(f:file) bo obrezal "rep" datotekef: iz nje bodo odstranjeni vsi elementi od trenutne do konca datoteke. Pravzaprav bo samo znak »konec datoteke« prepisan na mesto, kamor je kazal kazalec, fizično »odrezane« vrednosti pa bodo ostale na svojih prvotnih mestih - preprosto bodo postale »sirote«.

Pisanje v tipizirano datoteko

Spremenljivke lahko shranite v datoteko, ki je odprta za pisanje z ukazom write(). Tako kot pri branju je najprej navedena spremenljivka datoteke, ki ji sledi izhodni seznam:

zapiši(f,a,b,c); - zapis v datoteko f (prej odprto za pisanje z ukazoma rewrite (f) ali reset (f) ) spremenljivke a , b , c .

Izhod v tipkana datoteka Dovoljene so samo spremenljivke, ki se ujemajo z opisom podatkovnega tipa. Neimenovanih in netipiziranih konstant ni mogoče natisniti

tipkana datoteka.

Tipkane datoteke obravnavajo kot strukture neposrednega in zaporednega dostopa. To pomeni, da pisanje ni možno le na samem koncu datoteke, ampak tudi na kateremkoli drugem elementu. Zapisana vrednost bo nadomestila prejšnjo vrednost v tem elementu (stara vrednost bo "prepisana").

Na primer, če morate zamenjati peti element datoteke z vrednostjo, shranjeno v spremenljivki a, potem bi napisali naslednji izsek programa:

išči(f,5); (kazalec bo nastavljen na začetek 5. elementa)

napiši(f,a); (kazalec bo nastavljen na začetek 6. elementa)

Veliko ljudi ima pogosto vprašanje, kako odpreti binarno datoteko. Ta dokument je katera koli datoteka, ki se nahaja na osebnem računalniku. Vsi podatki, ki se nahajajo na računalnikih in medijih, povezanih z njimi, so običajno zapisani v bitih. Iz te besede izvira ime. Če za primerjavo uporabite preprosto besedilno datoteko, potem pri branju ne bo težav. Če želite to narediti, je dovolj, da imate v računalniku običajni urejevalnik; Če želite odpreti binarno datoteko, ne boste mogli uporabiti preproste beležnice. In če govorimo o dejstvu, da so informacije v besedilnih datotekah šifrirane z enakimi biti, potem običajno, ko govorijo o branju binarnih datotek, mislijo na izvršljive dokumente.

Navodila za ukrepanje

Najprej morate na trdi disk vašega osebnega računalnika namestiti programsko orodje HexEditor, ki je preprost urejevalnik binarnih datotek. Po namestitvi je treba program odpreti z dvojnim klikom na ikono. To orodje vam bo omogočilo branje binarne datoteke v realnem načinu. V tem primeru lahko spremenite podatke v datoteki, dodate svoje podatke itd. Če želite delati v tem urejevalniku in spreminjati binarno datoteko, morate imeti vsaj nekaj znanja na tem področju dejavnosti.

Drugič, seznaniti se morate z njegovim glavnim oknom, ki se ne razlikuje veliko od okna običajnega urejevalnika. Isti gumbi, isti meni, telo dokumenta, zaznamki in vrstice stanja. Datoteko, ki vas zanima, lahko odprete prek zavihka Datoteka ali prek posebnega gumba v programu. Po tem boste lahko videli izvršljivo datoteko, ki bo prikazana v obliki številk in črk. Ne zamenjujte simbolov, s katerimi je predstavljena binarna datoteka, in tistih, ki jih ima običajni urejevalnik. V primeru, da je sprejeta odločitev za izbris ali spremembo katerega koli dela dokumenta, je treba razumeti, da bo določen del izginil ali se spremenil.

Tretjič, s programom lahko poskusite spremeniti kateri koli del dokumenta. Kot smo že omenili, programsko orodje prikaže datoteko na način, ki izboljša način, kako lahko najdete del dokumenta, ki ga potrebujete. Poleg tega je program precej prilagodljiv v konfiguraciji. Z njegovo pomočjo lahko spremenite grafični prikaz binarne kode, ki ima binarno datoteko. Če so v neki del datoteke vneseni napačni podatki, lahko kasneje popolnoma preneha delovati ali začne delovati ne povsem pravilno. V vsakem primeru bo vnos takih podatkov povzročil spremembe tako v operacijskem sistemu kot neposredno v samem osebnem računalniku.

Četrtič, po spremembi, brisanju ali dodajanju določenih podatkov v datoteko morate shraniti rezultat svojega dela. Če nimate dovolj izkušenj z urejanjem datotek, se morate pripraviti na ne povsem prijetne posledice. Na primer, dokument lahko preneha delovati po spremembi podatkov. Dokler ne začnete dobro razumeti te težave, bo veliko kopij datotek poškodovanih. Če niste prepričani v svoje sposobnosti, ne smete sami spreminjati podatkov, zlasti v primerih, ko je treba popraviti su binarno datoteko.



Vam je bil članek všeč? Delite s prijatelji!