Ortalama varyans formülü. Rastgele bir değişkenin beklentisi ve varyansı

Şu ana kadar ele aldığımız örnekler, dosyalara formatlanmış bilgi girişi/çıkışını gösterdi. Sayıların biçimlendirilmiş dosya giriş/çıkışının yalnızca boyut ve miktar olarak küçük olduklarında ve ayrıca programatik olmayan araçlar kullanarak dosyaları görüntüleme yeteneğinin sağlanması gerektiğinde kullanılması tavsiye edilir. Aksi takdirde elbette sayıları karakter dizileri yerine bilgisayarın OP'sindekiyle aynı şekilde saklayan ikili G/Ç'yi kullanmak çok daha verimlidir. Bellekte bir tamsayı (int) veya gerçek (float) değerin 4 byte, double değerin 8 byte, bir double değerin ise 8 byte aldığını hatırlatayım. sembolik anlam karakter yazın- 1 bayt. Örneğin, bir metin (biçimlendirilmiş) dosyasındaki 12345 sayısı 5 bayt, ikili bir dosyada ise 4 bayt alır.

İkili dosyalar yani bilgilerin saklandığı dosyalar iç form temsiller yazılım tarafından daha sonra kullanılmak üzere kullanılır ve yazılım dışında görüntülenemez. İkili dosyaların avantajı, ilk olarak, okuma/yazma sırasında, verileri sembolik temsil biçiminden dahili biçime veya tam tersine dönüştürmek için zaman israf edilmemesi ve ikinci olarak, doğruluk kaybının olmamasıdır. gerçek sayılar. Hem formatlanmış giriş/çıkış hem de ikili giriş/çıkış durumunda, bir dosyadaki bilgiyi "doğru" şekilde işlemek için, ikiliye hangi tür verilerin, nasıl ve hangi sırayla yazıldığını bilmeniz gerekir. özellikle bir ikili dosyayı bir metin düzenleyici kullanarak görüntülemek hiçbir şey yapmayacağı için.

Dinamik bir dizinin tamsayı elemanlarının bir ikili dosyaya yazılmasını ve bu dosyadan okunmasını gösteren bir örneği ele alalım.

#katmak

#katmak

#katmak

ad alanı std'sini kullanma;

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

int *mas = new int [N];

for(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);//oluşturuldu çıkış ikili akış

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

fout.write(reinterpret_cast (mas), N*sizeof(int));//diziyi dosyaya yaz

fout.close();// akışı kapatıyoruz

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

for(i=0; i

ifstream fin("c:\\os\\bin.dat", ios::binary); //dosyayı okumak için bir thread oluşturuyoruz

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

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

fin.read(reinterpret_cast (mas), N*sizeof(int));//diziyi dosyadan oku

for(i=0; i

getch(); 0 değerini döndür;

Bu programda write() (ofstream sınıfı yöntemi) ve read() (ifstream sınıfı yöntemi) fonksiyonlarının kullanımına özellikle dikkat edilmelidir. Bu işlevler, verileri bayt cinsinden düşünür ve belirli sayıda baytı veri arabelleğinden bir dosyaya ve tekrar geri aktarmak üzere tasarlanmıştır. Bu işlevlerin parametreleri arabellek adresi ve bayt cinsinden uzunluğudur.

Write() işlevi, birinci parametrede belirtilenlerden ikinci parametrede belirtilen bayt sayısını bir dosyaya yazmak üzere tasarlanmıştır. adresler veri arabelleği ve read() işlevi bir dosyadan veri okumak için tasarlanmıştır. Burada bu işlevlerin yalnızca char tipindeki bir veri arabelleğiyle çalıştığına dikkat edilmelidir. Bu bağlamda bu programda operatörü kullandık. yeniden yorumlama_cast<> int (mas) tipindeki veri arabelleğimizi char tipinde bir arabelleğe dönüştürür.

Operatörü kullanarak döküm yapmanın unutulmaması önemlidir. yeniden yorumlama_cast yalnızca işlevlerin ilk parametresinin olduğu durumlarda gereklidir yazmak() Ve Okumak() bir karakter dizisi değildir (sonuçta, bir karakter türü karakter yalnızca 1 bayt alır). Ek olarak, bir dizi değil, bireysel değişkenler yazmanız veya okumanız gerekiyorsa, o zaman bir referans mekanizması (veri arabelleğinin adresine bir bağlantı) kullanmanız gerekir, örneğin:

ofstream fout(dosya adı, ios::app | ios::binary);

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

Şimdi söz konusu fonksiyonların ikinci parametresini tartışmak gerekiyor. Bu programda ikinci parametre olarak bayt sayısını hesapladığımız N*sizeof(int) ifadesini kullandık. Örneğin, 5 tamsayı dizi elemanımız varsa bayt sayısı 20 olacaktır. sizeof() işlevi, parametre olarak belirtilen veri türü için ayrılan bayt sayısını döndürür. Örneğin, sizeof( int) 4 değerini döndürecektir.

Yani bu örnekte verilen program bin.dat dosyasına ikili formdaki verileri yazıp bu ikili dosyadan okumanızı sağlar. Üstelik bu veriler okunduktan sonra int tipine dönüştürülerek dizi yapısı elde edilir ve onunla her türlü işlem yapılabilir.

Şimdi bin.dat dosyasından veri okumanızı sağlayan bir program yazmanız gerektiğini ve bu dosyanın yalnızca ikili biçimde bir tamsayı dizisinin elemanlarını içerdiğini bildiğimizi hayal edin. Yazılan eleman sayısı ( N ) bilmiyoruz. Bir program oluştururken sabit bir dizi kullanma hakkımız yoktur, yani. program oluşturma aşamasında bunun için bellek ayırın. Bu hatalı sonuca yol açacaktır. Çünkü N için çok küçük bir değer, dizideki tüm öğelerin sayılmamasına yol açacaktır ve N için çok büyük bir değer, fazladan hücrelerin rastgele değerlerle doldurulmasına neden olacaktır.

Bir tamsayı dizisinin öğelerini bir ikili dosyadan dinamik olarak bellek ayırarak okumanıza ve okunan verilerin gerçekçiliğini kanıtlamanıza, toplamlarını hesaplamanıza olanak tanıyan bir program örneğini ele alalım.

#katmak

#katmak

#katmak

ad alanı std'sini kullanma;

int N, i, toplam=0, dfb; //dfb - bayt cinsinden dosya uzunluğu

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

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

fin.seekg(0, ios::end);//okuma konumunu dosyanın sonuna ayarlayın (sondan 0 bayt)

dfb = fin.tellg();//dosya konumunun sonu değerini al (bayt cinsinden)

N=dfb/4;//bir tamsayının 4 bayt aldığını bilerek sayıların sayısını hesaplayalım

int *dizi = yeni int [N];//dinamik bir dizi oluştur

fin.seekg(0, ios::beg);//veriyi okumadan önce mevcut konumu dosyanın başına taşı

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

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

for(i=0; i

for(i=0; i

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

getch(); 0 değerini döndür;

ifstream sınıfının metodları olan seekg() ve tellg() fonksiyonlarını aktif olarak kullandığımız bu programa gelin daha yakından bakalım. Burada şunu belirtmek gerekir ki Açılan herhangi bir dosya, geçerli okuma veya yazma konumu olarak adlandırılan bir konumla ilişkilendirilir.. Bir dosya okumak için açıldığında, bu varsayılan konum dosyanın başlangıcına ayarlanır. Ancak çoğu zaman dosyadaki rastgele bir konumdan başlayarak okuma ve yazma yapabilmek için konumu manuel olarak kontrol etmek gerekir. seekg() ve tellg() işlevleri geçerli okuma işaretçisini ayarlamanıza ve kontrol etmenize izin verirken, seekp() ve tellp() işlevleri yazma işaretçisi için aynısını yapar.

seekg(1_parameter, 2_parameter) yöntemi, dosyadaki geçerli okuma konumunu, 2._parametrede belirtilen konuma göre 1_parametrede belirtilen bayt sayısı kadar taşır. 2_parameter üç değerden birini alabilir:

ios::beg – dosyanın başından itibaren;

ios::cur – geçerli konumdan;

ios::end – dosyanın sonundan itibaren.

Burada beg, cur ve end ios sınıfında tanımlanan sabitlerdir ve:: sembolleri bu sınıfa erişim işlemini temsil eder. Örneğin, operatör fin.seekg(-10, ios::end); bir dosyanın geçerli okuma konumunu, dosyanın bitiminden 10 bayta kadar ayarlamanıza olanak tanır.

Şimdi programın işleyişinin açıklamasına dönelim. Dosyaya yazılan sayıların sayısını bilmediğimizden yola çıkarak öncelikle sayıların sayısını bulmamız gerekiyor. Bunu yapmak için, kullanarak fin.seekg(0, ios::end); dosyanın sonuna gideriz ve tellg() fonksiyonunu kullanarak dosya uzunluğunu bayt cinsinden dfb değişkenine döndürürüz. tellg() işlevi geçerli işaretçi konumunu bayt cinsinden döndürür. Bir tam sayının uzunluğunu bayt cinsinden (4 bayt) bildiğimiz için, dosyanın bayt cinsinden uzunluğunu bilerek dosyaya yazılan sayıların sayısını hesaplamak kolaydır ( N=dfb/4;). Sayı sayısını bulduktan sonra dinamik bir dizi oluşturup read() işlevini kullanarak veri okumaya başlamak için dosyanın başına geçiyoruz. Belirtilen sayıda veri baytı (dfb) veri arabelleğine (arr) aktarıldıktan sonra bu şekilde okunan veriler dizi yapısı kazanır ve her türlü kod işlemine ve dönüşümüne tamamen uygun hale gelir.

Yukarıdaki örnekte "en uzun" seçenek "b"dir: 23 bayt gerektirir (dize için 21 bayt ve tamsayı için 2 bayt). "n" ve "m" seçenekleri sırasıyla 4 ve 5 bayt gerektirir (tabloya bakın).

ad, yayıncı öğesi Varyant kısmı

İkili dosyalar

İkili dosyalar, bilgileri bilgisayarın belleğinde sunulduğu biçimde saklar ve bu nedenle insanlar için sakıncalıdır. Böyle bir dosyaya bakıldığında içinde ne yazıldığını anlamak imkansızdır; manuel olarak (bazı metin düzenleyicilerde) oluşturulamaz veya düzeltilemez. Ancak tüm bu rahatsızlıklar verilerle çalışmanın hızıyla telafi ediliyor.

Ayrıca metin dosyaları sıralı erişim yapıları olarak sınıflandırılırken, ikili dosyalar doğrudan erişim yapıları olarak sınıflandırılır. Bu, yalnızca ikili dosyanın geçerli öğesine değil, istediğiniz zaman herkese erişebileceğiniz anlamına gelir.

Yazılan dosyalar

Yapılandırılmış veri türlerinin değişkenleri (dize hariç) bir metin dosyasından okunamaz. Örneğin, oyuncak kaydını satışa sunulan oyuncaklarla ilgili bilgilerle (ürün adı, ürün fiyatı ve oyuncağın tasarlandığı yaş aralığı) doldurmak için bir metin dosyasından veri girmeniz gerekiyorsa:

yaş: 0..18 kümesi; (dosyada sınırlarla belirtilmiştir)

o zaman aşağıdaki kodu yazmanız gerekecek:

c:karakter; i,j,min,max: tamsayı;

a: bir dizi oyuncak;

atamaya başla(f,input); sıfırlama(f);

i:=1'den 100'e kadar do değilse eof(f)

sonra bir[i] ile yap

start readln(f,isim,fiyat,min,maks); yaş:=;

j için:= minimumdan maksimuma do age:=yaş+[j];

Gördüğünüz gibi, bu tür öğe öğe okuma çok zahmetli ve emek yoğundur.

Bu durumdan bir çıkış yolu sunuluyor yazılan dosyalar- öğeleri herhangi bir temel veya yapılandırılmış veri türüne ait olabilir. Tek kısıtlama tüm öğelerin aynı türde olması gerektiğidir. Bu bariz rahatsızlık

ikili dosyanın öğelerine doğrudan erişimi düzenlemek için vazgeçilmez bir koşul: dizilerde olduğu gibi, yapının her bir bileşeninin uzunluğu tam olarak biliniyorsa, o zaman herhangi bir bileşenin adresi çok basit bir formül kullanılarak hesaplanabilir:

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

Yazılan dosyaların açıklaması

Var bölümünde çalışmak üzere tasarlanmış dosya değişkenleri vardır. yazılan dosyalar, şu şekilde açıklanmaktadır:

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

Hiçbir dosya değişkeni sabit olarak belirtilemez.

Yazılan bir dosyanın amacı

Şu andan itibaren bölümün sonuna kadar "dosya" kelimesiyle "anlatacağız" ikili yazılan dosya" (elbette, aksi özellikle belirtilmedikçe).

Takım atama(f,"<имя_файла>"); f dosya değişkeni ile bu değişkenin çalışmaktan sorumlu olacağı dosyanın adı arasında bağlantı kurmaya yarar.

Astar "<имя_файла>", dosyanın tam yolunu içerebilir. Yol belirtilmezse, dosyanın programın çalıştırılabilir modülüyle aynı dizinde olduğu kabul edilir.

Yazılan bir dosyayı açma ve kapatma

Açılan dosyada programınızın hangi eylemleri gerçekleştireceğine bağlı olarak iki şekilde açılabilir:

sıfırlama(f); - içindeki bilgileri okumak ve aynı zamanda ona yazmak için bir dosyayı açmak (böyle bir dosya yoksa, onu açmaya çalışmak bir hataya neden olur). Aynı komut, bir işaretçiyi dosyanın başlangıcına döndürmek için kullanılır;

yeniden yaz(f); - ona bilgi yazmak için bir dosyanın açılması; eğer böyle bir dosya yoksa oluşturulacaktır; aynı ada sahip bir dosya zaten mevcutsa, daha önce içerdiği tüm bilgiler kaybolacaktır.

Kapanıyor yazılan dosyalar prosedür close(f) , tüm dosya türlerinde ortaktır.

Yazılan bir dosyadan okuma

Okumaya açık bir dosyadan okuma, read() komutu kullanılarak yapılır. Parantez içinde önce dosya değişkeninin adı, ardından giriş listesi1) gösterilir:

Yalnızca bir dosyadaki bildirime karşılık gelen türdeki değişkenleri girebilirsiniz, ancak bu veri türü de yapılandırılabilir. Diyelim ki paragrafın başında verilen örneğe dönecek olursak." Yazılan dosyalar", kullanımı açıkça ortaya çıkacak yazılan dosya metin yerine programın metnini önemli ölçüde azaltacaktır:

oyuncak yazın = kayıt adı: string; fiyat: gerçek;

yaş: 0..18 kümesi; (sınırlarla tanımlanır)

var f: oyuncağın dosyası;

a: bir dizi oyuncak; başlamak

atama(f,giriş);

i için:=1 ila 100 do

eof(f) değilse read(f,a[i]); kapat(f);

Yazılan bir dosyada arama yapın

Bize zaten tanıdık gelen eof(f:file):boolean işlevi, dosyanın sonuna gelindiğini bildirir. Metin dosyalarının doğasında bulunan diğer tüm "aramayı sonlandırma" işlevleri (eoln(), seekeof() ve seekeoln()), yazılan dosyalara uygulanamaz.

Ancak çalışmanıza izin veren özel alt rutinler var yazılan dosyalar doğrudan erişim yapılarında olduğu gibi:

1. filepos(f:file):longint işlevi, işaretçinin filef dosyasındaki mevcut konumunu bildirecektir. N öğe içeren bir dosyanın en sonuna işaret ediyorsa, bu işlev N sonucunu döndürür. Bunu açıklamak kolaydır: Dosyanın öğeleri sıfırdan başlayarak numaralandırılır, dolayısıyla son öğe N-1 olarak numaralandırılır. Ve sayıN bu nedenle "var olmayan" bir öğeye aittir - dosyanın sonunun bir işareti.

2. dosya boyutu(f:dosya):longint işlevi, f dosyasının uzunluğunu hesaplar.

3. seek(f:file,n:longint) prosedürü f dosyasındaki işaretçiyi N kayıt numarasının başına taşıyacaktır. N'nin dosyanın gerçek uzunluğundan büyük olduğu ortaya çıkarsa, işaretçi dosyanın gerçek uzunluğunun ötesine taşınacaktır.

4. truncate(f:file) prosedürü dosyanın "kuyruğunu" kırpacaktır: dosyanın geçerli olanından sonuna kadar olan tüm öğeler dosyadan kaldırılacaktır. Aslında, işaretçinin işaret ettiği yere yalnızca "dosya sonu" işareti yeniden yazılacak ve fiziksel olarak "kesilen" değerler orijinal yerlerinde kalacak - basitçe "yetim" hale gelecekler.

Yazılan Bir Dosyaya Yazma

Write() komutunu kullanarak değişkenleri yazmaya açık bir dosyaya kaydedebilirsiniz. Okumada olduğu gibi, önce dosya değişkeni listelenir, ardından çıktı listesi gelir:

yaz(f,a,b,c); - f dosyasına yazın (daha önce rewrite (f) veya reset (f)) komutlarıyla yazmak için açılmış olan a , b , c değişkenlerine yazın.

Çıktı yazılan dosya Yalnızca veri türü açıklamasıyla eşleşen değişkenlere izin verilir. Adsız ve türlenmemiş sabitler yazdırılamaz

yazılan dosya.

Yazılan dosyalar hem doğrudan hem de sıralı erişim yapıları olarak kabul edilir. Bu, yalnızca dosyanın en sonuna değil, diğer herhangi bir öğeye de yazmanın mümkün olduğu anlamına gelir. Yazılan değer, bu öğedeki önceki değerin yerine geçecektir (eski değerin üzerine yazılacaktır).

Örneğin, bir dosyanın beşinci öğesini a değişkeninde saklanan değerle değiştirmeniz gerekiyorsa, aşağıdaki program alıntısını yazarsınız:

ara(f,5); (işaretçi 5. öğenin başlangıcına ayarlanacaktır)

yaz(f,a); (işaretçi 6. öğenin başlangıcına ayarlanacaktır)

Birçok kişinin genellikle bir ikili dosyanın nasıl açılacağıyla ilgili sorusu vardır. Bu belge, kişisel bilgisayarda bulunan herhangi bir dosyadır. Bilgisayarlarda ve onunla ilişkili ortamlarda bulunan tüm veriler genellikle bitler halinde kaydedilir. İsmi de bu kelimeden geliyor. Karşılaştırma olarak basit bir metin dosyası kullanırsanız, onu okurken herhangi bir sorun yaşanmayacaktır. Bunu yapmak için bilgisayarınızda normal bir düzenleyicinin olması yeterlidir; bir not defteri bile iş görecektir. İkili bir dosyayı açmak için basit bir not defteri kullanamazsınız. Ve eğer metin dosyalarındaki bilgilerin aynı bitlerle şifrelendiğinden bahsedersek, o zaman genellikle ikili dosyaları okumaktan bahsettiklerinde çalıştırılabilir belgeleri kastederler.

Eylem talimatları

Öncelikle kişisel bilgisayarınızın sabit diskine, ikili dosyalar için basit bir düzenleyici olan HexEditor adlı bir yazılım aracını yüklemeniz gerekir. Kurulumdan sonra simgeye çift tıklayarak program açılmalıdır. Bu araç, bir ikili dosyayı gerçek modda okumanıza olanak tanır. Bu durumda dosyadaki verileri değiştirebilir, kendi bilgilerinizi ekleyebilirsiniz vb. Bu düzenleyicide çalışmak ve ikili dosyayı değiştirmek için bu faaliyet alanında en azından biraz bilgiye sahip olmanız gerekir.

İkinci olarak, normal bir düzenleyicinin penceresinden pek farklı olmayan ana penceresine kendinizi alıştırmanız gerekir. Aynı düğmeler, aynı menü, belge gövdesi, yer imleri ve durum çubukları. İlgilendiğiniz dosyayı Dosya sekmesinden veya programda bulunan özel bir düğme aracılığıyla açabilirsiniz. Bundan sonra sayı ve harf şeklinde görünecek olan yürütülebilir dosyayı görebileceksiniz. İkili dosyanın temsil edildiği sembolleri ve normal bir düzenleyicinin sahip olduğu sembolleri karıştırmamalısınız. Belgenin herhangi bir bölümünün silinmesine ya da değiştirilmesine karar verilmesi halinde, bir bölümünün kaybolacağı ya da değişeceği anlaşılmalıdır.

Üçüncüsü, programı kullanarak belgenin herhangi bir bölümünü değiştirmeyi deneyebilirsiniz. Daha önce de belirtildiği gibi, yazılım aracı dosyayı, belgenin ihtiyacınız olan bölümünü bulma yönteminizi geliştirecek şekilde gösterir. Ayrıca programın konfigürasyonu oldukça esnektir. Onun yardımıyla ikili dosyaya sahip ikili kodun grafik görüntüsünü değiştirebilirsiniz. Dosyanın bir kısmına yanlış veriler girilirse, daha sonra ya tamamen çalışmayı durdurabilir ya da tamamen doğru şekilde çalışmaya başlamayabilir. Her durumda, bu tür verilerin girilmesi hem işletim sisteminde hem de doğrudan kişisel bilgisayarın kendisinde değişikliklere neden olacaktır.

Dördüncüsü, bir dosyadaki belirli verileri değiştirdikten, sildikten veya ekledikten sonra çalışmanızın sonucunu kaydetmelisiniz. Dosyaları düzenleme konusunda yeterli deneyiminiz yoksa, tamamen hoş olmayan sonuçlara hazırlıklı olmalısınız. Örneğin, bir belge veri değişikliklerinden sonra çalışmayı durdurabilir. Bu konuyu iyice anlamaya başlayana kadar birçok dosya kopyası zarar görecektir. Yeteneklerinize güvenmiyorsanız, özellikle su ikili dosyasının düzeltilmesi gereken durumlarda verileri kendiniz değiştirmemelisiniz.



Makaleyi beğendin mi? Arkadaşlarınızla paylaşın!