internet pencereler Android

Blok yapısı. Program yapısı: blok

Kural olarak, prosedürler ve işlevler, prosedürler ve işlevler bölümlerinde bulunur, yani bunlar programların veya diğer alt programların içinde iç içedir. Bu yuvalama ile alt rutinin tanımı bloğun bir bileşenidir ve alt rutinin kendisi bir blok içerir, o zaman harici ve dahili blok kavramlarını tanıtabilirsiniz.

Bir dış blok, bir alt rutinin iç içe geçtiği bir bloktur. İç blok, alt rutinin kendisidir. Bu alt rutinin dışındaki bloklarda bulunan tüm açıklamalar, bu alt rutinin oluşturduğu bloğa göre global olarak adlandırılır. Dahili blokta bulunan tüm açıklamalar yerel olarak adlandırılır. Yuvalama düzeyi kavramını tanıtabilirsiniz. Prosedürleri ve işlevleri açıklayan bölümde iki veya daha fazla alt rutin açıklanırsa, bu alt rutinlerin aynı yuvalama seviyesinde olduğu söylenir. Dış ünite ile ilgili olarak, bunlar dahilidir. Alt programların kendileri ile ilgili olarak, aynı yuvalama seviyesinde oldukları için harici veya dahili terimlerini kullanamayız. Bir harici bloğun prosedürlerini ve işlevlerini açıklayan bölümde, aynı bölümde başka bir alt rutinin bulunduğu bir alt program yuvalanmışsa, o zaman bu alt rutinlerin farklı bir yuvalama seviyesinden bahsediyoruz. En içteki alt yordam olan üçüncü blok için, iç içe geçtiği her iki blok da harici olacaktır. Bu alt rutinin yuvalama seviyesi 2'dir. İkinci blok için üçüncü blok dahili ve ilk - harici olacaktır. İkinci bloğun yuvalama seviyesi 1'dir. İlk blok (en dıştaki) için ikinci ve üçüncü bloklar dahili olacaktır. İlk bloğun yuvalama düzeyi 0'dır, yani. bu blok ana programdır.

Örneğin, dilin yazarı tarafından önerilen blok yapısını düşünün (Şekil 16.16). Burada, A programının yedinci bölümünde iç içe iki alt rutin B ve C vardır. Alt rutin B iç içe alt rutin D. Sırayla, alt rutin D iç içe alt rutin G. Alt rutin C'de iç içe iki alt rutin E ve F vardır.

Pirinç. 16.16. - Blok yapısı örneği

Açıklamaların kapsamını anlayalım. Etiket açıklamaları, yalnızca tanımlandıkları bloğun açıklama bölümünde geçerlidir. Diğer tüm açıklamalar, yalnızca tanımlandıkları blok içinde değil, aynı zamanda bu blokta yuvalanmış tüm dahili bloklarda da geçerlidir (yuvalama derinliğinden bağımsız olarak). Aynı zamanda, olabilir gibi görünüyordu küresel ve yerel açıklamalar arasındaki çatışmalar, çünkü farklı kavramlar farklı bloklarda aynı isimlerle adlandırılabilir. Bu tür çakışmaları önlemek için aşağıdaki kural benimsenmiştir - yerel açıklamalarda tanımlanan tüm adlar, global açıklamalarda açıklanan eşleşen adların eylemlerini geçersiz kılar. İncirde. 16.17, örnekteki blokların seviyelere göre düzenlenmesini gösterir. Burada oklu çizgiler global açıklamaların etkisini göstermektedir. Dolayısıyla G bloğunda D, B, A harici bloklarının tanımları geçerlidir.

Pirinç. 16.17.- Seviyelere göre blok düzeni ve küresel açıklamaların etkisi

Altyordam erişimine özel bir göz atalım. Herhangi bir alt program şu şekilde çağrılabilir:

    açıklandığı bloğun açıklama bölümünden;

    operatör bölümünün kendisinden (doğrudan özyineleme);

    verilene göre herhangi bir dahili alt programın açıklama bölümünden (dolaylı özyineleme);

    alt rutin ile aynı blokta daha önce açıklanan herhangi bir alt rutinin ifadeler bölümünden.

Bu kuralları aşağıdaki gibi yeniden formüle edebiliriz - herhangi bir alt program yürütme için çağrıda bulunabilir:

    bunun alt program bölümünde açıklanan herhangi bir alt program;

    kendisi (doğrudan özyineleme);

    verilenle ilgili tüm harici alt programlar (dolaylı özyineleme);

    Aynı yuvalama düzeyinde daha önce açıklanan rutinler.

Örnekteki blokların (alt rutinlerin) etkileşimi Şekil 2'de gösterilmektedir. 16.18.

Pirinç. 16.18 - Bloklar arası etkileşime bir örnek

Burada oklu çizgiler yürütme için alt programların çağrılma olanaklarını gösterir (oklar çağrının yönünü gösterir). Bu nedenle, örneğin, A programından yalnızca yedinci bölümde iç içe geçmiş olan B ve C alt rutinleri çağrılabilir. F alt yordamından, F alt yordamının kendisi (doğrudan özyineleme), iç içe olduğu C alt yordamı (dolaylı yineleme) ve E alt yordamı (aynı seviyede bulunur ve daha önce tarif edilmiştir) çağrılabilir. A programlarından, B ve C alt rutinleri çağrılabilir.Bloklar arasındaki tüm olası etkileşimleri listelemek için Tablo 16.9. Burada ana algoritma, alt rutinin çağrıldığı bloktur, yardımcı algoritma, çağrılan alt rutindir.

Tablo 16.9. Bloklar arası etkileşime bir örnek

Prosedürler ve fonksiyonlar. Blok yapısı programlar. Parametreler.

Örnek

Örnek

Örnek

A (10) reel sayıları dizisi verilmiştir. Düzenlemek verilen diziöğelerinin artan düzeninde, ᴛ.ᴇ. dizinin sonraki her bir öğesinin bir öncekinden daha büyük olmasını sağlayacak şekilde yapın.

En çok birini düşünün basit algoritmalar bu tür görevler için geliştirilmiştir (Şekil 5).

Bu algoritmanın fikri, esasen, orijinal dizinin elemanlarının çiftler halinde karşılaştırılmasıdır - önce 1 c a 2, sonra 2 c a 3, sonra 3 ile 4, vb. Çiftteki ilk eleman ikinciden büyükse, sayısal değerleri değiştirilir, çünkü ilk eleman ikincinin değerini alır ve ikincisi - birincisi. Aksi takdirde, çiftte herhangi bir ikame yapılmaz, ancak ikinci çiftin elemanlarının karşılaştırmasına geçilir.

Τᴀᴋᴎᴍ ᴏϬᴩᴀᴈᴏᴍ, olduğu gibi, en büyük öğenin dizinin sonuna kadar kademeli olarak "itilmesi" vardır ve algoritmadaki "itici" işlevi iç döngü tarafından gerçekleştirilir. Dizinin en büyük elemanı, kendisi için amaçlanan son 10. yeri işgal eder etmez, açıklanan prosedür, kalan sırasız 9 elemanla tekrarlanır, çünkü kalan elemanların en büyüğü dizide sondan bir önceki yeri alır, vb.

İstenilen sonucu elde etmek için, böyle bir prosedür dokuz kez yapılmalı ve her seferinde iç döngünün tekrar sayısı 1 azaltılmalıdır.

Dış döngü bu sorunu çözer. Tekrardan 9,8,7, ..., 1 değerinin tekrarına kadar uzanan parametresi, yalnızca gerçekleştirilen tekrar sayısının bir sayacı olarak değil, aynı zamanda ve en büyük değer iç döngü parametresi.

program çeşit;

var

ben, k: tam sayı r;

B: gerçek ;

a: dizi gerçek ;

başlamak

write('bir dizi girin -');

için ben: = 1 ile 10 yapmak readln (a [i]);

writeln ("kaynak dizi");

için ben: = 1 ile 10 yapmak writeln (a [i]: 5: 2);

için ben: = 9 aşağı 1 yapmak

için k: = 1 ile ben yapabiliyorsan bir [k]> bir Daha sonra

başlamak

b: = bir [k]; bir [k]: = bir; bir: = b

son

writeln ("sıralı dizi");

için ben: = 1 ile 10 yapmak yaz (a [i]: 5: 2)

son .

Bir matris B (20 * 20) verilmiştir. Ana köşegen üzerinde yer alan eleman haricinde, her elemanı matris sütununun elemanlarının ürünü olan C vektörünü (20) oluşturun. Orijinal matrisin satırlarını ve sütunlarını sıfırdan indekslemeye, vektörün elemanlarını 10'dan indekslemeye başlayın.

Yeni bir dizinin (vektör) oluşumu, öğelerinin değerlerinin kendileri için ayrılmış bellek hücrelerine kaydedilmesidir. C vektörünün her bir elemanının sayısal değeri, algoritmanın iç döngüsünde ve hücreye girişte - iç döngünün gövdesinin bir sonraki tekrarının tamamlanmasından sonra dışta oluşturulur.

program büyük;

B: dizi gerçek ;

C: dizi gerçek ;

P: gerçek ;

m, n: tam sayı ;

başlamak

için m: = 0 ile 19 yapmak

için sayı: = 0 ile 19 yapmak readln(b);

için sayı: = 0 ile 19 yapmak

başlamak

p: = 1; için m: = 0 ile 19 yapmak

Eğer m<>n Daha sonra (işin oluşumu)

p: = p * b; (matris sütun öğeleri)

(diyagonal hariç)

c: = p; (kayıt oluşturuldu)

(vektör öğesinden bellek hücresine)

son ;

için sayı: = 10 ile 19 yapmak writeln (c [n]: 10: 3)

son .

Gerçek elemanlardan oluşan bir matris MAT (5 * 5) verildi. Maksimum ve minimum öğeleri içeren matrisin satırlarını değiştirin.

program En az en çok;

tip

m = dizi gerçek ;

var

mat: dizi nın-nin m;

maxi, mini, ben, j, i1, j1: tam sayı ;

başlamak

yaz ('matris girin');

için ben: = 1 ile 5 bir şey için yapmak j: = 1 ile 5 yapmak oku (mat);

i1: = 1; j1: = 1; (minimum elemanın endeksleri)

i2: = 1; j2: = 1; (maksimum elemanın endeksleri)

için ben: = 1 ile 5 yapmak

için j: = 1 ile 5 yapmak

Eğer hasır> hasır

Daha sonra

başlamak

i2: = ben; j2: = j (yeni maksimumun endekslerini hatırlayın)

son

Başka

Eğer mat

Daha sonra

başlamak

i1: = ben; j1: = j; (yeni minimumun endekslerini hatırlayın)

son ;

str: = mat; (bir matris matının bir satırını değiştirerek,)

hasır: = hasır; (maksimum içerir)

mat: = str; (eleman, minimum çizgi)

(yeni eleman ve tersi)

için ben: = 1 ile 5 yapmak

başlamak

için j: = 1 ile 5 yapmak yaz (mat);

son

Program iki ana görevi çözer: matrisin en büyük ve en küçük elemanlarının bulunduğu satır numaralarını bulmak ve bu satırlarda bulunan verileri değiş tokuş etmek.

İlk problem, bir tür tipik bir maksimum veya minimum bulma problemidir.

Tipik olandan farkı, aslında, matrisin maksimum ve minimum elemanlarının değil, endekslerinin belirlenmesidir. Değişkenler, sayım işlemi sırasında indeksleri depolamak için kullanılır. i1, j1- minimum eleman için ve i2, j2 - maksimum için.

İkinci problemi çözmek için, matris satırlarının maksimum ve minimum elemanları ve eşdeğer bir yardımcı tek boyutlu diziyi içeren üç atama operatörü kullanılır. cadde.

< Что такое подпрограмма и для чего она нужна >

Pascal'da iki tür alt program vardır: prosedürler ve işlevler. İkisi arasındaki temel fark, işlevin bir değer döndürmesi ve ifadelerde kullanılabilmesidir, örneğin:

bir veya daha fazla görevi gerçekleştirmek için bir prosedür çağrılırken:

Writeln ("Bu bir çektir");

Prosedürler ve fonksiyonlar, ana program bloğuna ek blokların dahil edilmesini sağlar. Her prosedür veya fonksiyon tanımı, bir program bloğunun takip ettiği bir başlık içerir.

Prosedürler ve fonksiyonlar, programın ana gövdesinden önce herhangi bir yerde görünebilir. Prosedürler aşağıdaki formatı kullanır:

prosedür prosedür-adı (parametreler);

Fonksiyonlar, bir başlık ile başlamaları dışında prosedürlerle aynı formata sahiptir. işlev ve işlevin dönüş değeri için veri türüyle bitirin:

işlev işlev_adı (parametreler): veri türü;

Prosedürler ve fonksiyonların kendi sabitleri, veri tipleri, değişkenleri ve hatta kendi prosedürleri ve fonksiyonları olabilir. Ancak tüm bu öğeler, yalnızca tanımlandıkları prosedürlerde ve işlevlerde kullanılabilir.

Bir prosedür ifadesi kullanılarak bir prosedür çağrılır. İşlev çağrısını içeren ifade değerlendirildiğinde işlev çağrılır ve işlevin dönüş değeri bu ifadeye değiştirilir.

Prosedürler ve fonksiyonlar. Programın blok yapısı. Parametreler. - kavram ve türleri. "Prosedürler ve fonksiyonlar. Programın blok yapısı. Parametreler" kategorisinin sınıflandırılması ve özellikleri. 2017, 2018.

4.8. Blok yapısı.

“C” dili, şu anlamda blok yapılı bir dil değildir.

le PL / 1 veya Algol; içinde bir fonksiyon tarif edilemez

başkalarının içinde.

Değişkenler ise şu şekilde tanımlanabilir:

blok yapılandırma yöntemi. Değişken bildirimleri (dahil

çay başlatma) sol kaşlı ayracı izleyebilir-

sadece hangi operatörle değil, herhangi bir operatörü açan coy

sürü, işlevin gövdesini başlatır. Bu şekilde tanımlanan değişkenler

bir kerede, herhangi bir değişkeni harici bloklardan çıkarın.

aynı isimler ve uygun olana kadar tanımlı kalır

sağ kıvırcık parantez. Örneğin,

IN I; / * YENİ BİR I BİLDİRİM * /

İÇİN (I = 0; ben< N; I++)

I değişkeninin kapsamı “doğru” daldır

EĞER; bunun programdaki diğer herhangi bir I ile ilgisi yok.

Blok yapısı ayrıca harici kapsamı da etkiler.

değişkenler. Açıklamalar verilirse

F fonksiyonunun içindeki X'in görünümü, dahili yeniden ifade eder.

benim ÇİFT tip, ve F dışında - harici bir tamsayı değişkenine.

aynısı resmi parametre adları için de geçerlidir:

F fonksiyonu içinde, X ismi resmi parametreyi ifade eder ve

harici bir değişkene değil.

4.9. Başlatma.

Başlatma işleminden şimdiye kadar birçok kez bahsettik, ancak

diğer soruların yanı sıra her zaman geçiyor. Şimdi bundan sonra

farklı bellek sınıflarını tartıştığımız için bu bölümdeyiz

Başlatma ile ilgili bazı kuralları özetleyelim.

Açık bir başlatma yoksa, harici ve

tikel değişkenlere sıfır değeri atanır; otomatik

bu durumda, kayıt ve kayıt değişkenleri

bölünmüş değerler (çöp).

Basit değişkenler (diziler veya yapılar değil) başlatılabilir

onları tarif ederken sosyalleşin, adından sonra bir işaret ekleyin

eşitlik ve sabit ifade:

CHAR SQUOTE = "\”;

UZUN GÜN = 60 * 24; / * GÜNDE DAKİKA * /

Harici ve statik değişkenler için başlatma gerçekleştirilir

Bu, derleme zamanında yalnızca bir kez yapılır. Otomatik ve

kayıt değişkenleri her girdiklerinde başlatılır

bir işleve veya bloğa dönüştürün.

Otomatik ve kayıt değişkenleri durumunda, başlatma

bir simit sabit olmak zorunda değildir: aslında olabilir

belirli bir ifadeyi içerebilecek herhangi bir anlamlı ifade

daha önce kullanılan değerler ve hatta işlevlere çağrılar. Örneğin,

Bölüm 3'ten ikili arama programında başlatma

olarak yazılacak

INT YÜKSEK = N - 1;

DÜŞÜK, YÜKSEK, ORTA;

Sonucuna göre, otomatik değişikliklerin başlatılması

atama operatörlerinin kısaltmasıdır.

Hangi formun tercih edileceği çoğunlukla bir zevk meselesidir. Biz genellikle

açık atamalar kullanıyoruz, çünkü başlatma

açıklamalar daha az dikkat çekicidir.

Otomatik diziler başlatılamaz. Harici

ness ve statik diziler koyarak başlatılabilir

açıklamanın ardından, küme parantezleri içine alınmış bir liste

virgülle ayrılmış başlangıç ​​değerleri. Örneğin, program

ile başlayan Bölüm 1'deki karakterleri saymak

INT C, I, NWHITE, NOTHER;

NWHITE = NOTHER = 0;

İÇİN (I = 0; ben< 10; I++)

olarak yeniden yazılabilir

INT NDIGIT = (0, 0, 0, 0, 0, 0, 0, 0, 0, 0);

ANA () / * SAYILAR, BEYAZ BOŞLUK, DİĞER * /

Her şey atandığı için bu başlatmalar aslında gerekli değildir.

verilen değerler sıfırdır, ancak iyi stil onları yapmaktır

açık. Başlangıç ​​değerlerinin sayısı belirtilenden az ise

dizinin verilen boyutu, ardından kalan elemanlar ile doldurulur

lami. numaralandırma da Büyük bir sayı başlangıç ​​değerleri

bir hatadır. Maalesef imkan yok

bazı başlangıç ​​değerlerinin tekrarlandığını gösteren ve

bir dizinin ortasındaki bir öğeyi yeniden başlatmadan başlatamazsınız.

öncekilerin hepsinin sayıları.

Karakter dizileri için özel bir yol var

başlatma; kaşlı ayraç ve virgül yerine kullanabilirsiniz

satırı kullanın:

KARA DESENİ = “THE”;

Bu, daha uzun ancak eşdeğer gösterimin kısaltmasıdır:

CHAR DESEN = ("T", "H", "E", "\ 0");

Herhangi bir türden bir dizinin boyutu atlanırsa, derleyici şunları belirler:

tohum değerlerinin sayısını sayarak uzunluğunu böler. İÇİNDE

bu özel durumda, boyut dörttür (üç karakter

artı sondaki \ 0).


Gerekçesiyle. Aynı zamanda, dilin felsefi soyutlamasının, bir bütün olarak felsefenin ana temaları ve hareketleriyle ayrılmaz bir şekilde bağlantılı olduğu ortaya çıkıyor. Daha spesifik olarak, J.E. Moore'un felsefesi, özellikle sağduyu doktrini, "insan", "dünya", "Ben", "dış dünya", "...

Ve diğer BDT ülkeleri, ayrıca Rus ve dünya kültür ve bilimine erişimi kolaylaştırıyor. Bu nedenle, araştırmamızın verilerine göre, cumhuriyette Rus diline olan talep oldukça yüksek kalmıştır. Modern Moldova gençliğinin birçok temsilcisi, babaları ve büyükbabaları gibi Rus kültürüne, Rusya'nın bilimsel ve teknik başarılarına ulaşmaya devam ediyor. Rus dili dil olmaya devam ediyor ...

Pitoresk sözlü ve heceli yazı). Orta Elam dönemine ait anıtlar (MÖ 14.-12. yüzyıllar) Akad çivi yazısıyla yapılmıştır. Yeni Elam dönemi anıtları 8.-6. yüzyıllara kadar uzanmaktadır. M.Ö. 6-4 yüzyıllarda Ahamenişlerin Pers devletinin resmi diliydi. Eski Pers'ten etkilenerek Orta Çağ'ın başlarına kadar varlığını sürdürdüğü varsayılmaktadır. 7. Burushaski dili Burushaski dili (...

... / lehçe), İskit, Soğd, Orta Farsça, Tacik, Tajrishi (dil / lehçe), Talış, Tat, Khorezm, Khotanosak, Shugnan-Rushan dil grubu, Yagnob, Yazgulam vb. Hint-Avrupa'nın İran şubesi. Dağıtım bölgeleri: İran, Afganistan, Tacikistan, Irak'ın bazı bölgeleri, Türkiye, Pakistan, Hindistan, Gürcistan, Rusya Federasyonu... Genel ...

Modül, herhangi birini uygulamak için tasarlanmış bir dizi birbirine bağlı değişken, sabit, işlev ve prosedür içeren bir programın işlevsel olarak bağımsız bir parçasıdır. işlevsellik... Bir modül, diğer program modüllerinden bağımsız olarak hata ayıklanabilir ve böylece organize edilebilir. ortak çalışma modüllere bölünmüş bir program üzerinde birkaç programcı.

Modülleri kullanarak, hem kaynak kod hem de nesne kodu (birlikte derlenmeye ve diğer modüllerle birleştirilmeye hazır kod) olarak saklanabilen rutin kitaplıkları oluşturabilirsiniz. Delphi'de, bir modülün derlenmiş nesne kodu ".dpu" uzantılı dosyalarda saklanır.

Modülün yapısı Pascal programının yapısına benzer. Modül başlığı gereklidir ve UNIT kelimesiyle başlar (normal bir programda olduğu gibi PROGRAM yerine):

Birim<имя модуля>;

Modül adı, Pascal dosya adıyla aynı olmalıdır. Delphi otomatik olarak çeşitli modüller oluşturduğunda, modül adının dosya adıyla eşleşmesini sağlar.

Bir programın aksine, bir modül gövdesi (ifade bölümü) eksik olabilir. Modülün değişkenlerini başlatmak için kullanılır ve ana programın ifadelerinin yürütülmesinden önce gerçekleştirilir. Modül iki zorunlu bölüm içerir: arayüz ve yönetici.

Modülün arayüz kısmı da açık, yönetici kısmı ise kapalı olarak adlandırılır. Ön uç bölümündeki bildirimlere genellikle genel arayüz denir ve uygulama bölümündeki bildirimlere genellikle özel arayüz denir. Arayüz bölümünde bildirilen tüm değişkenler ve fonksiyonlar, bu modülü bağlayan tüm modüller ve programlarda mevcuttur. Gerçekleştirme bölümünde açıklanan tüm değişkenler ve işlevler yalnızca bu modülde mevcuttur. Böyle bölünme dürbün Kullanıcının bilmesi gerekmeyen ve istemeden veya kasten bozabileceği hesaplamaların ara aşamalarını kullanıcıdan gizlemek için özel olarak yapılmıştır. Bu sağlar güvenilir koruma yalnızca amaçlanan tüm işlevler ve değişkenler İç kullanım, bu her zaman uygun olmasa da ve yazmanız gerekiyor ilave fonksiyonlar iç değişkenlere erişmek için.

Arayüz kısmı Arayüz kelimesi ile başlar. Arayüz, ana programı modüle veya modülü diğer modüllere bağlar. Arayüz kısmı, bu modülün herhangi bir kullanıcısı için mevcut olan nesneleri (prosedürler, fonksiyonlar, değişkenler, sabitler, türler) belirtir.

Modülün prosedürleri ve işlevleri arasında, modülün geliştiricisinin arayüz açıklamasına dahil etmeyebileceği yardımcı olanlar olabilir, daha sonra kullanıcılardan gizlenecek ve modül dışında kullanılamaz.

Bir modül kendi çalışmasında diğer modüllerin yeteneklerini (prosedürler, işlevler, değişkenler) kullanıyorsa, bu, USES yapısını kullanan modülün başında belirtilir ve ardından buna bağlı tüm modüllerin adları belirtilir. örnek:

M1, M2 ... kullanır;

Ayrıca, arayüz kısmı, bu modülü çağırırken kullanılabilecek sabitleri, türleri, değişkenleri, prosedürleri ve işlevleri açıklar ve prosedürler ve işlevler, gövde olmadan başlıklar olarak belirtilir. Prosedür organlarının kendileri daha sonra modülün kapalı - yürütme - bölümünde açıklanmaktadır. Front-end kısmında, front-end parçasının her bir elemanı için tüm atamaları, tüm parametreleri, sabitleri ve türleri yorumlar yardımıyla belgelemek, modülün kullanıcılarının kolayca kullanabilmesi için çok önemlidir.

Arayüz bölümü, yürütme bölümünün başlangıcı ile sona erer. Yürütme bölümü, Implementation anahtar sözcüğüyle başlar. Arayüz bölümünde açıklanan tüm prosedürlerin ve işlevlerin gövdelerini içerir. Yerel fonksiyon etiketlerini ve deyim bölümlerini içerebilir. Uygulama kelimesini, yürütme bölümünde kullanılan modüllerin bir listesiyle birlikte Kullanımlar kelimesi de takip edebilir. Sırada etiketler, türler, sabitler, değişkenler, prosedürler ve (modül işlevleri.

Yürütme bölümünü, Başlatma anahtar sözcüğüyle başlayan isteğe bağlı bir veri başlatma bölümü takip edebilir. Modüle ilk erişildiğinde çalıştırılan operatörleri içerir,

Bir modül, herhangi bir modül sonlandırıldığında yürütülen ifadeleri içeren Finalization anahtar sözcüğüyle başlayan isteğe bağlı bir tamamlama bölümü ile bitebilir. Modül biter anahtar kelime"Son." sonunda zorunlu bir nokta ile.

Kısaca, modülü tanımlayan sözdizimi şöyle görünür:

Farklı modüllerde aynı isimli değişkenler kullanılıyorsa, modülün değişkenine erişmek için önek kullanılmalıdır:

<имя модуля>. <имя переменной>.

Örnek 10.1. Modüllerin ara bağlantı olanaklarını ele alalım. Modüllerin birbirinin içindekileri kullanmasına izin vererek program daha kısa olabilir.

"> modüller arasındaki sıkı bağlantı (veya modüllerin yüksek derecede uyumu) ​​işareti ve bu durumda bunları ayrı ayrı kullanmak imkansız hale gelir, bu da modüler programlama ilkelerini ihlal eder.

Arayüz bölümlerinde çapraz bağlantı yaparsanız derleyici bir hatayı düzeltecektir. Modülleri yalnızca uygulama bölümlerinde çapraz bağlayabilirsiniz, ancak modüllerin karşılıklı bağımlılığı nedeniyle bundan kaçınmak en iyisidir.

Genellikle, programlar tasarlanırken, projenin modüllere bölünmesi, geliştirmenin en başında gerçekleşir. yazılım sistemi... Bu işleme modülerleştirme denir. Kural olarak, bu, projenin sistem analisti ve ekibi tarafından yapılır. Bir modülün boyutunun 30-300 satırlık kaynak metin arasında olması gerektiğine inanılmaktadır. Modülün başlığında (başlangıcında) yorumların kullanılması nedeniyle modülün görünürlüğü önemli ölçüde iyileştirilmiştir ve Detaylı Açıklama işlevleri. Üstün bir bakışta, pratik olarak metnin geri kalanına dikkat etmeden yorum başlıklarını okumak yeterlidir.

Genellikle, modülerleştirmenin sonucu, modüller ve (veya) alt sistemler arasındaki ilişkinin bir grafiği olarak gösterilir. Bu grafiğin tabanı ("kök") ana program... Grafiğin her köşesi modülleri temsil eder ve köşeleri birleştiren yaylar modüllerin birbirleriyle olan bağlantılarını gösterir.

Arayüz elemanları grafiğin köşelerinin yanına yazılır: modülün açık bölümünde bildirilen prosedürlerin, fonksiyonların, sabitlerin, değişkenlerin adları, formdaki modülün yorumlarında daha ayrıntılı olarak açıklanmıştır. tam tanım arayüz kısmı. Yayların üzerinde, ilişkili (genellikle ana) modülde kullanılan adlar bulunur. Bu durumda, bağlantı çapraz olabilir, yani. A modülü, B modülünün arayüz elemanlarını kullanır ve. aksine modül B, modül A'nın arayüz elemanlarını kullanır. Daha önce de belirtildiği gibi, böyle bir tasarım arzu edilmez, ancak mümkündür. Bu durumda kullanılan arayüz elemanları, modülleri bağlayan arkın üstüne ve altına yazılır. Böyle bir grafiğe bir örnek verelim (Şekil 10.1
).

Burada ana program P, M1, M2, MZ olmak üzere üç ana modüle bölünmüştür. Bu modüllerden program, A, B, C (birinci modülden), D (ikinci modülden), F, G, K, L (üçüncü modülden) arayüz elemanlarını kullanır. Bu modüllerin her biri daha küçük olanlara bölünür, örneğin M2, M2.1, M2.2, M2.3, vb.'ye bölünür. Örneğin bu şemadan M2 ve M3 modülleri ile M2.2 ve M2.3 arasındaki çapraz referansları görebilirsiniz.

Modülerleştirmenin tamamlanmasından sonra, her modül bağımsız kodlama ve hata ayıklama amacıyla programcılar arasında kodlama için dağıtılacaktır. Bununla birlikte, bu gibi durumlarda, genellikle ana modülün alt modüllerin prosedürlerini ve işlevlerini kullanması gerektiği, ancak alt modüllerin henüz diğer programcılar tarafından kodlanmadığı bir durum ortaya çıkar. Örneğin, MZ modülü, alt modüllerden K, L öğelerini kullanır, ancak bu modüller henüz hazır değildir. MZ modülünün kodunu uygulayan bir programcıya ne dersiniz? Bu durumdan çıkmanın yolu, ana modül prosedürlerine (veya işlevlerine) "saplamalar" yazmaktır; bu, ad ve parametrelere göre K, L öğeleriyle tamamen örtüşür. Saplamalar, programı hata ayıklama modunda derlemenize ve çalıştırmanıza izin verir.

"Saplama" - prosedür, başlığın (ad ve parametreler) tam olarak belirtilmesi ve boş bir gövde ile temsil edilir. "Saplama" - işlev, başlığın (ad ve parametreler) tam belirtimi ile temsil edilir ve gövdede işlevin değerini döndüren yalnızca bir operatöre sahiptir. Örneğin, bir L saplama fonksiyonunun gövdesi şöyle görünebilir:

"src =" http://hi-edu.ru/e-books/xbook691/files/ris-page173.gif "border =" 0 "align =" absmiddle "alt =" (! LANG:

İyi bir modülerleştirme ile, modüllerin ara bağlantı grafiği, kural olarak bir ağaçtır ve grafik boyunca ağacın yapraklarından daha yüksek bir seviyedeki düğümlere kadar arayüz elemanları kullanılır. Ancak bu her zaman mümkün değildir ve grafiği analiz edip optimize etmeniz gerekir. Modülerleştirme sonuçlarının kalitesini analiz etmek için iki özellik kullanılır: aşağıda tartışılan modül bağlantısı ve modül birleştirme.

Modül bağlantısı olarak tanımlandı modülü oluşturan parçaların bağımsızlığının bir ölçüsü. Modül bağlantısı ne kadar yüksek olursa, tasarım sonucu o kadar iyi olur. Bağlantı türleri (bağlanabilirlik katsayısı parantez içinde belirtilmiştir):

  • işlevsel (güçlü bağlantı) - 10;
  • sıralı - 9;
  • iletişimsel - 7;
  • prosedürel - 5;
  • geçici - 3;
  • mantıksal - 1;
  • tesadüfen (zayıf bağlanmış) - 0.

Modül ile işlevsel bağlantı aynı türden bir bağlantıyla ikiye bölünemez. Modül, giriş-çıkış akışlarını kontrol etmek için alt rutinler içeriyorsa ve bu verileri işlemek için ana parçayı içeriyorsa, modül tek bir işlevsel görevi yerine getirir. Kural olarak, böyle bir modül, tek bir döngü şeklinde bir dizi işlem olarak uygulanır ve işlevsel bağlantıya sahiptir.

sahip modül tutarlı bağlantı, bağımsız işlevleri yerine getiren, ancak ortaklaşa tek bir işlevi gerçekleştiren ardışık parçalara bölünebilir. Aynı modül değerlendirme ve ardından veri işleme için kullanılıyorsa, tutarlı bir bağlantıya sahiptir. Sıralı bir modül, bir işlem dizisi veya bir döngü dizisi olarak uygulanır.

Bir modül, bir veri yapısını paylaşan bağımsız modüllerden oluşuyorsa, iletişimsel uyum. Genel veri yapısı, onu tek bir modül olarak organize etmenin temelidir. Bir modül karmaşık bir veri yapısıyla çalışmayı basitleştirmek, bu yapıyı izole etmek için tasarlanmışsa, iletişimsel bağlantıya sahiptir. Böyle bir modül, birkaç farklı ve bağımsız olarak kullanılan işlevi (verilerin depolanması ve alınması) gerçekleştirmek üzere tasarlanmıştır. Bir modül, algoritma seçimini yalıtmak için tasarlanmışsa, işlevsel bağlantıya sahiptir. Böyle bir modül, izole bir yapı ile verileri işleyebilir, ancak çağrıldığında tek bir işlevi yerine getirdiği kabul edilir. Programın hiyerarşik yapısının en üst seviyesindeki modüller, işlevsel veya sıralı tutarlılığa sahip olmalıdır. Servis modülleri (yardımcı) için iletişimsel bağlantı tercih edilir. Modüllerin prosedürel, zamansal, mantıksal veya rastgele uyumu varsa, bu onların iyi planlanmadıklarını gösterir. Mevcut bir programı değiştirmek genellikle bu tür bağlantılarla sonuçlanır.

prosedürel bağlantı kontrol yapıları program blok şemasında gösterildiği gibi organize edilmiş bir modülde bulunur. Böyle bir modül yapısı, uzun bir program, kontrol transferlerine uygun olarak bölümlere ayrıldığında, ancak bölme noktaları seçilirken herhangi bir işlevsel temel tanımlamadan ortaya çıkabilir. Boyutu küçültmek için bir modül iki bağımsız modüle bölünürse (biri prosedür ve veri beyanlarını işlemek için ve diğeri kontrol yapılarını yürütmek için), o zaman her birinin prosedürel bağlantısı vardır. En iyi çözüm, kaynak modülün her biri farklı işlevler gerçekleştiren birkaç başka modüle (genellikle üç veya dört) atıfta bulunduğu bir çözüm olarak düşünülmelidir.

İşlevsel olarak bağlantısı kesilmiş ancak aynı zamanda işleme sırasında gerekli olan parçaları içeren bir modül, geçici bağlantı (sınıfa göre bağlantı). Programa girerken gerekli olan tüm fonksiyon setinin bağımsız bir aktivasyon modülü tarafından gerçekleştirildiği durumlar vardır. Programın başında aktif hale getirmek için bağımsız bir modül ve programın sonunda pasif olarak başka bir modül kullanmak yerine, fonksiyonlar farklı modüller arasında dağıtılmalıdır.

Operatörler modülde yalnızca işlevsel benzerlik temelinde tanımlanırsa (tüm operatörler veri okuma veya yazma amaçlıysa) ve ayrıca modül parametrelerinin ayarlanması için anahtarlama algoritması kullanılır. Böyle bir modül var mantıksal tutarlılık, parçaları hiçbir şeyle ilgili olmadığından, ancak birbirine çok az benzerlik gösterdiğinden, örneğin hataları işlemek için çeşitli rutinlerden oluşan bir modül. Öte yandan, bir dosyaya çeşitli hata mesajları yazmak için tasarlanmış bir modül, tüm çıktı bilgileri, hata mesajı dosyalarından onun yardımıyla elde edilebiliyorsa, iletişimsel tutarlılığa sahiptir.

Bir modülün operatörleri, örneğin bir bellek alanında konumlarını belirtmeniz gerektiğinde, keyfi bir şekilde birleştirilirse, böyle bir modülün tesadüfi bağlantı

En zayıf üç bağlantı türü, zayıf program tasarımından kaynaklanma eğilimindedir, bu nedenle işlevsel, sıralı, iletişimsel veya prosedürel bağlantı aranmalıdır.

Kaplin modülleri olarak tanımlandı modüllerin göreli bağımsızlığının bir ölçüsü. Bağımsız modüller, diğer modüller üzerinde yeniden çalışma yapılmadan değiştirilebilir. Zayıf yapışma daha çok arzu edilirçünkü bu, yüksek düzeyde modül bağımsızlığı anlamına gelir. Modüller, her biri diğeri hakkında bilgi içermiyorsa, tamamen bağımsız olarak kabul edilir. İçlerinde diğer modüller hakkında ne kadar çok bilgi kullanılırsa, o kadar az bağımsız olurlar ve daha yakından bağlantılı olurlar. Bu bilgi, modül adlarının çapraz kullanımından, çağrılan dizilerin atanmasından, giriş ve çıkış kodlarının örtülü kullanımından ve paylaşılan bellek alanlarının yapıları tarafından tanımlanan verilerden gelir. Birbirine bağlı iki modülün birbiriyle etkileşimi ne kadar belirgin olursa, diğerlerinde yapılan değişikliklere bağlı olarak bir modülün gerekli ayarını belirlemek o kadar kolay olur. Modüllerin büyük izolasyonu ve doğrudan etkileşimi, bir modüldeki değişikliklerin sınırlarını tanımlamada zorluklara yol açar, bu da diğerlerindeki hataları ortadan kaldıracaktır. Aşağıda, modüllerin yaklaşık yapışma ölçüleri verilmiştir (farklı kaynaklarda, yapışma derecesinin tahminleri farklıdır) (Tablo 10.1).

Büyük programlar genellikle yardımcı algoritmaları uygulamak için alt programlar kullanır. YA'da alt rutinler prosedürler şeklinde resmileştirilir.

Prosedürlerin açıklaması

(işlem adı) PROC (parametre) (işlem gövdesi) (işlem adı) ENDP burada (işlem adı) - iki kez tekrarlanmalıdır ve prosedüre atıfta bulunmak için kullanılır; (parametre) iki değerden birini alabilir - (varsayılan) veya ... Kapatma (dahili) prosedüre yalnızca tarif edildiği komut bölümünden erişilebilir. Uzak (harici) prosedüre, tanımlandığı yer de dahil olmak üzere herhangi bir program komut bölümünden erişilebilir. Prosedürde açıklanan adlar ve etiketler bunun içinde yerelleştirilmemiştir, bu nedenle programda benzersiz olmaları gerekir. . LA'de bir prosedürü diğerinin içinde tanımlamak mümkün olsa da, bu herhangi bir fayda sağlamaz ve genellikle kullanılmaz.

arama prosedürleri

YaA'da ana program ile prosedür arasındaki tüm geçişler tarafımızca organize edilmelidir. Prosedür DOS'a dönebiliyorsa, JMP prosedürünün adına (işlem adı) atlamak için bir komutla çağrılabilir.Çağrıyan programa geri dönmeniz gerekiyorsa, en kolay yol CALL call komutunu kullanmaktır. (işlem adı) RET Başka bir olasılık daha var: yığını kullanarak dönüş adresini hatırlayın ve dönüşü atlama komutlarıyla düzenleyin. Bir prosedürü çağırırken, prosedüre iletilen parametreleri ve çağrı noktasına göre konumunu, yani. CALL komutundaki geçiş türü otomatik olarak belirlenir, Örneğin(prosedür p için). P CALL P Bu bir NEAR çağrısıysa, aşağıdaki eylemler gerçekleştirilir: Yığın: = AB, IP: = offset P burada AB dönüş adresidir, yani. çağrıyı izleyen komutun etkin adresi; Far call (FAR) eylemleri sağlar: Stack: = CS, Stack: = AB, CS: = seg P, IP: = offset P Eğer prosedür açıklaması call komutunun altındaki segmentte ise, geçiş özelliği ile belirtilmelidir. PTR beyanı. Örneğin, UZAK ÇAĞRI PTR P; uzak çağrı P

Segmentteki prosedürlerin düzenlenmesi

    Dahili prosedürlerçağıran programla aynı segmenttedir.
Bu durumda, 3 konum seçeneği mümkündür: a) Tüm prosedürler, aynı zamanda bir prosedür olarak biçimlendirilebilen ana (çağıran) programın önüne yerleştirilir. Örneğin: Metin SEGMENT 'kodu' Varsayım CS: metin, DS: veri, SS: yığın A1 PROC… RET A1 ENDP Ana PROC HAREKET AX, veri MOV DS, AX… CALL A1… HAREKET AX, C400h INT 21h Ana ENDP Metin ENDS Veri SEGMENT… Veri BİTTİ Yığın BÖLÜM 'yığın'… Yığın BİTİYOR Ana b) tüm prosedürler çağrı noktasının altındadır. c) prosedürler - ana prosedürün içinde, prosedürün başka bir prosedürün içinde olması bile mümkündür (bu herhangi bir fayda sağlamasa da) Örneğin,… Ana PROC… CALL A1… MOV AX, C400h INT 21h A1 PROC… RET A1 ENDP Ana ENDP Metin ENDS 2) Dış prosedürler diğer segmentlerde veya diğer dosyalarda bulunur. Örneğin p, ana programın metni P.asm Text SEGMENT public 'code' dosyasındadır; modülleri sırayla birleştirmek; genel segmente ASSUME CS: text, DS: data, SS: stack EXTRN stop: proc; harici ad bildirimi Ana PROC… ÇAĞRI Durdur… Ana ENDP Metin ENDS Veri SEGMENT… Veri ENDS Yığın SEGMENT 'yığın'… Yığın ENDS END Main Prosedürün kaynak metni P1.asm dosyasındadır Metin SEGMENT public 'code' CS varsay: metin KAMU durağı; adın Dur proc dışından erişilebilir olduğunu bildiriyor ...

ENDP metnini durdur ENDS END; giriş noktası olmayan dosyanın sonu Bu dosyalar bağlantı adımında birleştirilir, yani. ayrı akış gerekli. Örneğin, MASM MASM / ZI PR MASM / ZI P1 için, burada ZI, kaynak modülün (IM) satır numaraları ve sembolleri hakkında eksiksiz bilgileri nesne dosyasına koymanıza izin veren bir seçenektir. PR.obj ve P1.obj oluşturulduktan sonra, LINK / C0 PR P1, COMPOZ tek bir önyükleme dosyasında birleştirilmeleri gerekir; burada C0, CV hata ayıklayıcısının görüntülenmesini sağlayan önyükleme dosyasına sembolik bilgileri aktaran bir seçenektir. etiketler ve yorumlar dahil, anlık iletinin tam metni. COMPOZ.exe modülü yürütmeye hazırdır. Yapabilmek kütüphaneden bir prosedür bağlamak... Bunu yapmak için IM segmentlerinden önce INCLUDE yönergesi (kütüphane dosyasının adı) yerleştirilir. Örneğin p, IO.asm dosyasını bağlamak için INCLUDE IO.asm S SEGMENT 'stack'… S ENDS D SEGMENT 'data'… D ENDS C SEGMENT 'code' CS: C, SS: S, DS: D varsayın: … … C BİTİR BİTİR Başla

Prosedürler arasında parametre geçişi (programcının isteği üzerine düzenlenir)

    Parametreleri MP kayıtlarından geçirme
Programcının isteği üzerine gerçek parametrelerin değerlerini MP kayıtları aracılığıyla aktarabilirsiniz. Örneğin,; AX hesaplama prosedürü: = max (AX, BX) max proc far CMP AX, BX JGE Max1 MOV AX, BX Max1: RET max endp…; ana rutinde ... MOV AX, A; MOV BX, B parametrelerinin hazırlanması; prosedür çağrısına CALL max MOV C, AX; sonucu kaydediyorum...
    Parametreleri referansa göre iletme gerçek parametreye karşılık gelen bellek hücresinin adresinin (adının) aktarımı anlamına gelir (adlandırılmış değerin birleştiriciden Pascal'a aktarımı). Bunu yapmak için, bir hafıza hücresinin adını kullanabilir veya prosedürü bir kayıt defterine çağırmadan önce adresi yükleyebilirsiniz (BX, BP, SI veya DI, çünkü prosedür bu kayıtları adresleme için kullanabilir).
Örneğin, LEA BX, B CALL …… komutu ile
    Parametreleri yığından geçirme.
Parametrelerin kayıtlardan geçirilmesi, küçük sayıları ile sınırlıdır. Çok sayıda parametre (5'ten fazla) varsa, bunlar aşağıdaki gibi yığından geçirilir: - Ana program, gerçek parametreleri (değerler veya adresler) yığının üzerine iter; - Prosedür, yığına aktarılan parametreleri kullanır. Örneğin:; p (a1,…, ak) PUSH a1… PUSH ak CALL p… Prosedürde ek bir BP yığın işaretçisi kullanılabilir, ancak prosedürün başında, çağıran programda kullanılan BP değerini saklayın, örn. ; PP proc PUSH BP prosedürünün başlangıcı; BP MOV BP, SP'yi kaydedin; BP'yi yığının en üstüne ayarlamak ... Ardından, temel adreslemeyi kullanabilirsiniz. Örneğin, bir kapatma çağrısı için - yığına otomatik olarak gönderilen dönüş adresi - son parametrenin adresi ak. Prosedürden dönmeden önce, BP'yi POP BP komutuyla geri yüklemeli, ardından prosedürler birden çok kez çağrıldığında aşırı yüklenmemesi için yığını geçen parametrelerden temizlemelisiniz, yani. SP'yi prosedür çağrısından sonra olduğundan 2 * k daha fazla bir değere ayarlayın. Bir prosedürden doğru bir dönüş için 2 olasılık vardır. a) çağıran programda SP'yi ayarlayın
; prosedürün sonu; arama programında
POP BPÇAĞRI p
RETSP EKLE, 2 * k; SP düzeltmesi
P ENDP
b) RET (cnt) kapatma çağrısına benzeyen yığını geri yüklemek için return komutunu kullanın; burada (cnt), bir Word boyutunda bir sayaçtır (sabit ifade). Komut aşağıdaki eylemleri gerçekleştirir: IP: = Stack SP: = SP + (cnt) Ardından prosedürün sonu: POP BP RET 2 * kp ENDP Uzun mesafeli bir prosedür çağrısı için geri dönüş komutu RET (cnt) olur. ve aşağıdaki eylemleri gerçekleştirir: IP: = Stack CS: = Stack SP: = SP + (cnt) Bir prosedürden bu dönüşle, çağıran programda ek bir eyleme gerek yoktur.
    Bir prosedüre erişirken kayıtları koruma sorunu
Prosedürün çağıran programda kullanılan registerların değerlerini bozmaması için herhangi bir register kullanmadan önce ve sonunda prosedür metninde stack üzerindeki “eski” değerinin kaydedilmesi gerekmektedir. kaydedilen tüm değerleri geri yükleme prosedürü. Örneğin prosedürde CH kaydı kullanılıyorsa, yığına kaydedilmelidir, ancak yığın yalnızca bir kelimeyi hatırlar, bu nedenle prosedür bir parça içerecektir: PUSH CX; "eski" CX MOV CX, 0'ın korunması; bir prosedürde CX kullanmak ...; POP CX prosedüründen çıkmadan önce; "eski" CX'i geri yükleme Böylece, kayıtlardan ve yığından geçen parametrelerle genelleştirilmiş bir kapatma (NEAR) prosedürü şeması elde ederiz.

(yüzde adı) proc

Servis için PUSH BP

Mov BP, SP yığını

PUSH kaydetme kayıtları,

prosedürde kullanılan

vücut yüzdesi.

POP ... kayıtları geri yükle

ROP BP BP kurtarma