Bir diziden bile öğeleri kaldırın

beşinci sıra - altıncı.

X [3]: = X [4];

X [4]: ​​​​= X [5];

X [5]: = X [6];

Bu nedenle, üçüncüden beşinciye kadar olan tüm öğeler birer birer sola taşınmalıdır - i -inci öğenin yerine (i + 1) -th yazmanız gerekir. Algoritmanın blok diyagramı Şekil 1 de gösterilmektedir. 5.25.


Pirinç. 5.25.


Pirinç. 5.26.


Pirinç. 5.27.

Şimdi daha fazla düşünün ortak görev: n öğeden oluşan X dizisinden m -th öğesini çıkarmak gerekir. Bunu yapmak için, m numaralı öğenin yerine (m + 1) -th öğesinin, (m + 2) -th öğesinin - (m + 1) -th, vb., n - öğesinin yerine yazmanız yeterlidir. inci eleman - yerinde (n – 1) th. Bir diziden bir elemanın çıkarılması işlemi Şekil 1'de gösterilmektedir. 5.26.

n boyutlu bir X dizisinden m numaralı bir elemanı çıkarmak için kullanılan algoritma Şekil 2'de gösterilmiştir. 5.27.

4. maddeyi çıkardıktan sonra Ve aslında, dizinin bir kısmını bir eleman sola kaydırmak diziden itibaren dizideki elemanların sayısı değişecek (bir azalacak) ve bazı elemanların indeksi değişecektir. Bir eleman silinirse, bir sonraki onun yerine gelir, ona taşınmaya gerek yoktur (dizini birer birer artırarak). Bir sonraki öğe, kaldırıldıktan sonra sola taşındı.

Bazı öğelerinin silindiği bir dizi işleniyorsa, bir öğeyi sildikten sonra bir sonrakine geçmek gerekli değildir (bu, öğe sayısını azaltır). Aşağıdaki problemi örnek olarak düşünün.

SORUN 5.1. Negatif öğeleri diziden kaldırın.

Sorunu çözme algoritması oldukça basittir: dizinin tüm öğelerini yineleriz, öğe negatifse, sonraki tüm öğeleri birer birer sola kaydırarak sileriz. Unutulmaması gereken tek şey, bir öğeyi sildikten sonra, sonraki işlemler için bir sonrakine geçmenize gerek olmadığı, kendisinin mevcut yere taşındığıdır. Problem 5.1'i çözmek için akış şeması Şekil 2'de gösterilmiştir. 5.28.

Aşağıda yorumların yer aldığı programın metnidir.

upor_massiv programı; var i, n, j: bayt; X: gerçek dizi [1 .. 100]; writeln ('dizinin boyutunu girin'); readln(n); (Dizi girişi.) i için: = 1'den n'ye yazmaya başlayın ('X [', i, '] ='); readln (X [i]); son; writeln ('dizi X'); i için: = 1'den n'ye yaz (x [i]: 5: 2, ''); writeln; ben: = 1; süre (ben<=n) do {Если очередной элемент массива X[i] отрицателен, то} if x [ i ]<0 then begin {удаляем элемент массива с номером i.} for j:= i to n_1 do x [ j ] : = x [ j + 1 ]; {Уменьшаем размер массива.} {Не надо переходить к следующему элементу массива.} n:=n -1; end else {Если элемент не удалялся, то переходим к следующему элементу массива.} i:= i +1; writeln (’Изменённый массив ’); for i:=1 to n do {Вывод преобразованного массива.} write (X[ i ] : 5: 2, ’ ’); writeln; end.


Pirinç. 5.28.

Programın sonuçları Şekil 1 de gösterilmiştir. 5.29.


Pirinç. 5.29.

5.9 Bir diziye eleman eklemek

Basit bir görev düşünelim: b sayısını X (10) dizisine üçüncü ve dördüncü elemanlar arasına yerleştirin.

Bu sorunu çözmek için dizinin tüm elemanlarını dördüncüden başlayarak bir eleman sağa kaydırmak gerekir. Daha sonra dizinin dördüncü elemanına b (X: = b;) yazılması gerekecektir. Ancak bitişik değeri kaybetmemek için önce onuncu öğeyi birer birer, ardından dokuzuncu, sekizinci vb. dördüncüye kaydırmanız gerekir. Yerleştirme algoritmasının blok diyagramı Şekil 2'de gösterilmektedir. 5.30.


Pirinç. 5.30.

Genel durumda, m ve m + 1 numaralı elemanlar arasındaki X (N) dizisine b sayısının yerleştirilmesinin blok şeması Şekil 2'de gösterilmiştir. 5.31.


Pirinç. 5.31.

Aşağıda bu algoritma 5'i uygulayan bir program parçası bulunmaktadır. Bir diziyi tanımlarken, bir eleman eklemek için yeterli bir boyut sağlamak gerekir. .

var i, n, m: bayt; X: gerçek dizi [1 .. 100]; b: gerçek; writeln'ye başlayın ('N ='); readln(n); i için: = 1'den n'ye yazmaya başlayın ('X [', i, '] ='); readln (X [i]); son; writeln('Dizi X'); i için: = 1'den n'ye yaz (x [i]: 5: 2, ''); writeln; writeln('m ='); readln (m); writeln('b ='); readln(b); i için: = n'den m + 1'e kadar do x [i +1]: = x [i]; x: = b; n: = n + 1; writeln ('Değiştirilmiş dizi'); i için: = 1'den n'ye yaz (X [i]: 5: 2, ''); writeln; son.

5.10 Dizilerle çalışmak için rutinleri kullanma

Dizileri bir alt programa nasıl geçirebileceğinizi görelim. Bildiğiniz gibi (bkz. Bölüm 4), bir altyordamın biçimsel parametreleri listesinde değişkenleri bildirmek için adlarını ve türlerini belirtmeniz gerekir. Ancak, listedeki herhangi bir parametrenin türü yalnızca standart veya önceden bildirilmiş bir tür olabilir. Bu nedenle, bir diziyi bir alt programa geçirmek için önce onun tip 6'yı tanımlamanız gerekir. Dizi veri türü, dizi bildirimi bkz. bölüm 2.4.9. Dizilerle çalışmak bu bölümde ayrıntılı olarak açıklanmaktadır. ve ardından prosedürü ilan edin:

dizi_tipi = sıralamak[indeks_listesi] nın-nin bir tür;

prosedür

prosedür_adı (dizi_adı: dizi_türü);

Örneğin:

type vector = bayt dizisi [1 .. 10]; matris = real'in [1 .. 3, 1 .. 3] dizisi; prosedür proc (A: matris; b: vektör; var x: vektör);

Formun bir dizesini geçirmenin

değişken ismi: sicim[satır_uzunluğu];

hangi aslında dizi 7 Veri türü "dize", dize bildirimi için bkz. bölüm 2.4.9, aynı şekilde yapılmalıdır:

satır_tipi = sicim[satır_uzunluğu];

prosedür

prosedür_adı (dize_adı: dize_türü);

Örneğin:

type stroka_5 = string [5]; stroka_10 = dizi [1 0]; fonksiyon eğlencesi (S t r: stroka_5): stroka_10;

Diziler, açık dizi kavramı kullanılarak bir alt programa geçirilebilir. Açık bir dizi dizi 8'dir "Dizi" veri tipi, dizi bildirimi, bir diziye erişim, bkz. bölüm 2.4.9., açıklamasında, içerdiği öğelerin türü belirtilir, ancak endeks değişiminin sınırları belirlenmez:

open_array_name: dizi dizi... bir tür;

Örneğin:

var massiv_1: gerçek dizisi; massiv_2: karakter dizisi dizisi; massiv_3: bayt dizisi dizisi dizisi;

Bellek ayırma ve indekslerin sınırlarının belirlenmesi

Dizilerle çalışma işlevleri ve dizilerdeki işlemler (Bölüm 2)

Dizileri birleştirme

Dizileri birleştirme (birleştirme) diğer birkaç dizinin öğelerinden oluşan bir dizi oluşturma işlemidir. Dizileri birleştirmek çok tehlikeli bir işlemdir, çünkü birleştirmenin sonucu kendi mantığına uyar ve hangi verileri kaybedebileceğinizi unutur. Dizileri birleştirme, " + "veya işlevi kullanarak Birleştirme yalnızca işlev kullanılarak gerçekleştirilebilir dizi_birleştirme ().

Diyelim ki iki dizimiz var:

$ A = dizi ("1" => "Birinci", "2" => "İkinci");
$ B = dizi ("3" => "Üçüncü", "4" => "Dördüncü");

Şimdi bu iki diziyi tek bir dizide birleştirelim $ C:

Şebeke " + "diziler için değişmeli değildir. Bunun anlamı şudur: $A + $B eşit değildir $B + $A.

Ele alınan örneğin bir sonucu olarak, bir dizi alacağız $ C aşağıdaki formda:

"1" => "Birinci", "2" => "İkinci", "3" => "Üçüncü", "4" => "Dördüncü"

Ve sonuç olarak $B + $Aşöyle bir dizi elde ederiz:

"3" => "Üçüncü", "4" => "Dördüncü", "1" => "Birinci", "2" => "İkinci"

Listeleri birleştirirken bu yöntem çalışmaz. Bu gerçeği bir örnekle açıklayalım:

Diyelim ki iki dizimiz var:

$ A = dizi (10,11,12);
$ B = dizi (13,14,15);

Listelerin birleştirilmesi sonucunda $ Bir ve $B ($A + $B) elde ederiz: 10,11,12. Ve bu hiç de elde etmek istediğimiz sonuç değil ... Bunun nedeni, aynı endekslere sahip listeleri birleştirirken, ilk dizinin bir öğesinin sonuçtaki dizide ve aynı yerde kalmasıdır. Bu durumda, işlevi kullanmamız gerekir.

Fonksiyonun kullanımına bir örnek saymak ():

$ dizi = 5;
$ dizi = 4;
$ dizi = 8;
$ dizi = 3;
$ dizi = 8;
Eko "

Dizi öğelerinin sayısı: "... say ($ dizi). "

" ;
// Çıktılar: Dizi elemanlarının sayısı: 5
?>

Bir diziyi ve öğelerini kaldırma

Tüm bir diziyi silmek istiyorsanız, işlevi kullanın. ayarla ().

Bir anahtar/değer çiftini kaldırmak isterseniz, işlevi de kullanabilirsiniz. ayarla ()... verelim özel örnekler:

$ dizi = dizi (5 => 1, 12 => 2);

$ dizi = 56; // Komut dosyasının bu noktasında, bu
// $ diziye eşdeğer = 56;

$ dizi ["x"] = 42; // Bu, diziye yeni bir tane ekler
// "x" anahtarlı eleman
PHP portalı forumu. SU

Bu sorun birkaç yolla çözülebilir.

Yöntem 1. Yalnızca tek öğeleri başka bir diziye kopyalayın.

sabit N = 20; var a, b: tamsayı dizisi [1 .. N]; i, m: bayt; rastgele başlayın; i için: = 1'den N'ye a [i]: = rastgele (40) + 10; yaz (a [i]: 3); son; writeln; m: = 0; i için: = 1'den N'ye eğer bir [i] mod 2<>0 sonra m'yi başlatın: = m + 1; b [m]: = bir [i]; son; i için: = 1'den m'ye yazmaya başlayın (b [i]: 3); son; writeln; son.

Orijinal diziyi sıkıştırmanız gerekmediğinden, bir diziden öğeleri (bu durumda çift sayılar) kaldırmanın en kolay yolu budur. Yukarıda sunulan problemin çözümünde, m değişkeni bulunan tek elemanların sayısını saklar ve aynı zamanda ikinci diziyi doldururken elemanların değişen indeksidir.

Yöntem 2. Geçerli dizideki çift öğeleri, sağdaki tek öğelerin üzerine yazarak silin.

sabit N = 10; var a: tamsayı dizisi [1 .. N]; i, k, m: bayt; rastgele başlayın; i için: = 1'den N'ye a [i]: = rastgele (40) + 10; (a [i]: 3) sonu yaz; writeln; ben: = 1; m: = N; ben iken<= m do if a[ i] mod 2 = 0 then begin m : = m- 1 ; for k: = i to m do a[ k] : = a[ k+ 1 ] ; end else i : = i+ 1 ; for i: = 1 to m do write (a[ i] : 3 ) ; writeln ; end .

Sorunu çözmenin bu yolu daha karmaşıktır. Burada, eğer bir çift elemanla karşılaşılırsa, dizinin geri kalanının tamamı bir hücre ileriye kaydırılır. Bu durumda, bulunan çift öğenin üzerine yazılır. Dizideki eleman sayısı azaldıkça m değişkeni azalır.

Bu yöntem en rasyonel olarak kabul edilmelidir (ancak okul kursunda açık diziler çalışılmayabilir). Daha önceki sürümlerde aslında diziler küçültülmüyordu, ekranda dizinin sadece bir kısmı gösteriliyordu. Orijinal diziyi basitçe yinelemek, onunla hiçbir şey yapmamak ve ekranda yalnızca tek öğeleri görüntülemek mümkün olacaktır.

Açık bir dizi, uzunluğunu değiştirmenize izin verir. Aşağıdaki problemin çözümünde, tek elemanlar kaydırıldıktan ve tek olanlar "üzerine yazıldıktan" sonra, dizinin uzunluğu değiştirilir (setlength prosedürü kullanılarak). Dizinin yeni uzunluğunu ayarlar. Pascal'daki açık dizilerin özelliği, indekslemelerinin sıfırdan başlamasıdır.

sabit N = 10; var a: tamsayı dizisi; i, j, m: bayt; rastgele başlayın; SetLength (a, N); i için: = 0 ila N- 1 başlar a [i]: = rastgele (40) + 10; yaz (a [i]: 3); son; writeln; ben: = 0; // ilk elemanın indeksi m: = n- 1; // son dizinin indeksi ben iken<= m do if a[ i] mod 2 = 0 then begin for j : = i to m- 1 do a[ j] : = a[ j+ 1 ] ; m : = m - 1 end else i : = i + 1 ; SetLength(a, m+ 1 ) ; // son elemanın m indeksi var ama m + 1 eleman var i için: = 0'dan m'ye yaz (a [i]: 3); writeln; son.

Program kodunu yürütmeye bir örnek.

Konunun devamı:
Akıllı televizyon

Bir WordPress siteniz var ancak şu anda sahip olduğunuzdan daha güçlü bir barındırma mı istiyorsunuz? O zaman WordPress VPS barındırma size yardımcı olacaktır. Benim ona göre...