Tüm Platformlar için Hızlı Uygulama Geliştirme --->    Kitabımız...      Delphi

Konuyu Paylaş : facebook gplus twitter

Konuyu Oyla:
  • Derecelendirme: 5/5 - 3 oy
  • 1
  • 2
  • 3
  • 4
  • 5
(Sadeleştirildi) Girilen sayı adedinde iç içe for döngüsü oluşturma
#1
Tekrar merhaba,

Öncelikle herkese gösterdiği ilgi ve alakadan ötürü, ve vakit ayırıp okuyup, anlatım bozukluklarına rağmen cevaplandırmaya çalıştıkları için teşekkürü borç bilirim.

Bu ve bir önceki soruyu oluşturmamın ana gayesi, DelphiCan'da "sinerji oluşturma" çabasıdır. Ancak soracağım sorularda yine gerçek dünyada işimize yarayacak, bir şekilde bir projede karşımıza çıkacak şeylerden ibarettir.

Nitekim bu soru, henüz ar-ge aşamasında olan özel ve gizli bir projenin içinde kullanılan özel bir konu. Bu yüzden betimlemek adına "depo" ve "ürün" kavramları ile anlatmaya çalıştım. İşin kötü yanı, bu konuyu anlatabilmek için bir video çekmem gerekiyor. Kağıt üzerinde peşpeşe cümle kurarak 5-10 cümle ile çizim ve görsel destekli izah etmesi bile sorunlu oluyor. Bu anlatanın yada dinleyenin algısal durumundan değil, olayın biraz sıradışı olmasından kaynaklanıyor.

Proje, bir kuruluşun gizlilik anlaşması doğrultusunda gerçekleştiği için sizlere detay veremiyor olmaktan olayı özür dilerim.

Şimdi daha sade, mümkün mertebe teknik kavramlar geçirmeden izah etmeye çalışacağım.

Projede x kavramı var. Bir de bu x'lerin y değerleri var. Yani şöyle bir şey dersek yanlış olmaz;


type
TXModel = class(TObject)
id:integer;
value:variant;
ylist: array of variant;
end;


X modelinin YList alanındaki değerler bir aradayken bir anlam ifade ediyor. Bir X için 12 tane Y var. Yani YList'in uzunluğu her zaman 12'dir. Her Y'nin değeri 0~30 arasında olacaktır. Ancak eksi değere düşmediği için Gaussian elimination method geçerli değil çünkü değerler negatif olmamak zorunda.

X modelinden en az 2 tane olmak zorunda. En fazla da 8 tane olabilir. Buradaki kıstas şu; Girilecek modellerin YList'leri doğrultusunda oluşacak bir değer var. Bu değeri sağlamak için modellerin YListlerini deneme-yanılma yaparak her türlü ihtimali denememiz gerekiyor. Tekrar ediyorum Smile Girilen modellerin girilmesinde bir sebep var. Bağımsız örneklem yaparsam; Kimyasal bir karışım oluşturacaklar gibi düşünebiliriz. Bu karışımda hangisinden ne kadar koyulması gerektiğini yine diğerlerinin miktarlarıyla ölçeceğiz. Bu bahsi geçen for döngüleri, girilen modellerin ylist değerlerinin miktarlarını tespit etmek.

---
Varsayımsal çıktı; X modelinden 2 tane, ve ylist (12 dediğim) ilk 5 değeri bu şekilde;

x1.y1 = 5
x1.y2 = 4
x1.y3 = 3
x1.y4 = 2
x1.y5 = 1

x2.y1 = 2
x2.y2 = 6
x2.y3 = 5
x2.y4 = 1
x2.y5 = 3

---

Buradaki mantık; y1'lerin her x değerinde girdiği formül sayesinde x1'den şu kadar koyarsak y1 değeri ihtiyacımızı karşılar, x2'den şu kadar koyarsak y1 değeri ihtiyacımızı karşılar, dememiz gerekiyor.


Soru
2 ila 8 tane satır girilecek. 12 tane de kolon var. Oluşan matristeki değerlerin hepsinin bir anlamı var. Bu değerleri çarp-böl-kes-biç yapıp uygun miktarları hesaplayacağız. Bunun için yatay olarak kolonlar asıl mesele gibi gözükse de, her satır, bu miktar meselesini karıştırıyor. Burada da permütasyon olasılık işimizi çözdü. Demostrasyon ve test birimlerinde başarılı sonuçlar aldık. Ancak bunu statik çözmek için 2li, 3lü, 4lü...8li çözüm fonksiyonları yazmam gerekiyor.

Orada da yazılımın revize görmesi yada kriterlerin değişmesi durumunda gidip onlarca satır kodu revize etmek ve gözden kaçmaması için daha çok efor sarf etmek gerekecek. Bu yüzden tek fonksiyon ile, hepsinde aynı işi yapacak formülün kullanımını ortak hale getirmek istiyorum. 2 satırsa iç içe 2 satır olacak ki, satırların yatay değerleri birbirleriyle hesaplamaya girip doğru miktarı bize sunsun. Aynı şekilde 4 satır olduğunda, iç içe 4 döngü olacak ve bu kez yatay olarak 12, dikey olarak 4 satırdan oluşan matris kontrole girecek. Burada da oluşan değer yukarıda söylediğim gibi (0~30) arasında olacak.

Tekrar vakit ayırıp buraya kadar okuyanlara teşekkür ederim.

İyi günler.

Merhaba,

Çeşitli parametreler doğrultusunda yapılacak bir kombinasyon kodlaması var. Bu kodlamayı gerçekleştirmek için girilen input adedi önemli. Şöyle ki; en az 2 adet karşılaştırma değeri girilmeli fakat değer sayısı 2~8 arasında olabilir. Bu noktada her değerin yatay matris karşılaştırmalarının kodları hazır. Tek yapılması gereken 8 tane girildiyse 8, 5 tane girildiyse 5, 3 tane girildiyse 3 tane for döngüsünü çalışma anında oluşturmak.

Toplarsak; İstenilen olay delphi'de dynamic nested for loop. Bu yüzden dolayı iç-içe çağırma gibi bir olay olmayacak. Her biri bağımsız ve derine indikçe farklı değerler çıkartacak.

+10 Beyin Fırtınası Puanı sizi bekliyor Smile


Örneklem:
3 için;

0, 0, 0
1, 0, 0
...
9, 0, 0
0, 1, 0
...
1, 5, 0
...
2, 3, 4
...
9, 9, 9


ilk for 0-9
  ikinci for 0-9
      ucuncu for 0-9


---

Detaylı Anlatım (23.08.2017):

Bir depo düşünün. Bu depodaki rafa yerleştireceğimiz ürünler var. Her ürünün kendisine göre genişliği-yüksekliği-derinliği var. Bir rafta tek seferde en az 2, en fazla 8 tane ürün yerleştirilebiliyor. Ürün çeşiti n tane olabilir (tüm ölçeklerde olma ihtimali var).

Toplamda 8 ürün olacağı için 8 ürünün birbirlerinin ölçülerine, materyallerine bakarak en ideal yerleştirmeyi yapmak için permütasyon olasılık konusuna değinmemiz gerekiyor. Bu yüzden ürün miktarınca, her ürünü diğer ürünlerle kontrole almamız gerekiyor.

Yani,
2 ürün için 2 for iç içe olacak
3 ürün için 3 for iç içe olacak
4 ürün için 4 for iç içe olacak
.. ürün için .. for iç içe olacak
8 ürün için 8 for iç içe olacak


ilk for;
 ikinci for;
   { bu blok tamamlandı }  // burayı ilk ürün ve ikinci ürün için gezdiriyoruz.
   if (urunlist[i].materyal = materyal.metal) then
   // kod...
   // tüm kontrol ve denetlemeler...
   { bu blok tamamlandı }
 ikinci for son;
ilk for son;

Bu olaya yabancılar dynamic nested diyorlar. Ancak orada aynı bloğu indeks uzunluğu kadar iç içe döndürüyorlar. Benim yapmak istediğimde for içinde yapılacaklar hazır ancak ne kadar for olacağı eklenen ürün miktarına göre belirlenecek.

Ön koşullar;
  1. Asla bir ürün tek başına raf yerleştirmeye girmez (tamam)
  2. En az 2 ürün, en fazla 8 ürün yerleştirmeye girer (tamam)
  3. Her rafta X tipinden bir ürün olma zorunluluğu vardır (tamam)
Kontrol;
  1. Yerleştirmeye hazır ürün adedinin tespiti (tamam)
  2. Her ürünün aynı lota yerleştirilecek ürünlerle yerlerinin kontrolü (iç içe for burası)
  3. En ideal yerleştirme tamamlanınca barkodlama, lokasyon, len,lon bilgisi (tamam)
Save
Save
{ talk is cheap show me the code. }
Cevapla
#2
Konuyu tekrar yukarıya çekmek istiyorum. Bu soruya cevap veren geliştiriciye +10 Beyin Fırtınası Puanı verilecektir. Konu ile ilgili görüş, bilgi, düşünce, tavsiye yada herhangi bir fikir paylaşımında bulunarak katkı yapabilirsiniz. Yine bu katkılarınız size puan olarak yansıtılacaktır.
{ talk is cheap show me the code. }
Cevapla
#3
Ben soruyu ilk okuduğumda anlamamıştım. Sonra belki birileri cevap verince anlarım demiştim.
Şimdi tekrar okudum yine anlamadım Sad

Bunca zamandır kimse cevap yazmadığına göre; acaba sorun bende değil de soruluş şeklinde mi diye düşünmeye başladım  Angel
There's no place like 127.0.0.1
WWW
Cevapla
#4
Kombinasyon gibi bir olay anladığım kadarı ile ?
Şimdi baktım, şöyle bişimiş deger1=(a,b,c,d,) deger2=(1,2,3,4) sonuç (a1,a2,a3,a4,b1,b2,b3,b4,c1,c2,c3,c4,d1,d2,d3,d4)
Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol
WWW
Cevapla
#5
Bende soruyu tam anlamadığım için bir şeyler yazmadım. Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol metodlarımı kastediyor acaba şeklinde bir düşünce oluştu sadece fakat oradan ilerisine gidemedim.
WWW
Cevapla
#6
(23-08-2017, Saat: 09:40)SimaWB Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Giriş yap veya Üye OlBen soruyu ilk okuduğumda anlamamıştım. Sonra belki birileri cevap verince anlarım demiştim.
Şimdi tekrar okudum yine anlamadım Sad

Bunca zamandır kimse cevap yazmadığına göre; acaba sorun bende değil de soruluş şeklinde mi diye düşünmeye başladım  Angel

Detaylı açıklama ekledim (SimaWB) abi Smile
Save

(23-08-2017, Saat: 09:53)esistem Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Giriş yap veya Üye OlKombinasyon gibi bir olay anladığım kadarı ile ?
Şimdi baktım, şöyle bişimiş  deger1=(a,b,c,d,) deger2=(1,2,3,4) sonuç (a1,a2,a3,a4,b1,b2,b3,b4,c1,c2,c3,c4,d1,d2,d3,d4)

Permütasyon sistemine sadık kalacak şekilde olacak. Detaylı açıklama ekledim.

(23-08-2017, Saat: 10:04)witalihakko Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Giriş yap veya Üye OlBende soruyu tam anlamadığım için bir şeyler yazmadım. Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol metodlarımı kastediyor acaba şeklinde bir düşünce oluştu sadece fakat oradan ilerisine gidemedim.

Recursive işimi çözmüyor çünkü buradaki olay for miktarına göre for döngülerinin iç içe yazılması. Yani bir metodu iç içe tetiklemek işimi çözmüyor. Detaylı açıklama ekledim.
{ talk is cheap show me the code. }
Cevapla
#7
Merhaba hocam, ben yine anlamadım Smile şimdi elinizde raflar var, rafların yüksekliği derinliği belli (?), her bir raf max 8 ürün alıyor. Mesela yüksekliği belli seviye olan ürünler aynı rafa girebiliyor mu yoksa her rafta aynı türden ürünler olmak zorundamı? Sizin yapmak istediğiniz elimize örneğin 3 adet ürün geldi, bunların ebatları alınıp hangi raf uygunsa (boşsa) sıradan ürünleri o raflara yerleştirmekmi?
Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol
WWW
Cevapla
#8
memtable kullanmak serbest mi Smile
Cevapla
#9
Bende okuyunca anlar gibi oldum ama sonra baktım yine anlamamışım Smile
WWW
Cevapla
#10
#pragma hdrstop
#pragma argsused

#ifdef _WIN32
#include <tchar.h>
#else
 typedef char _TCHAR;
 #define _tmain main
#endif

#include <stdio.h>
#include <stdlib.h>
#define ALT 0 //raflara yerleşecek ürünün alt değeri yani içiçe oluşacak döngünün başı
#define UST 9  //raflara yerleşecek ürünün üst değeri yani içiçe oluşacak döngünün son değeri
void donguolustur(int n)
{
int *ndizi=new int[n];
memset(ndizi,0,n);
_lab:
for (int i= ALT; i <= UST; i++)
{

for (int k = 0; k < n-1; k++)
{
printf(",%d",ndizi[k]); // ben buradaki oluşacak matrisin index değerlerini yazdırıyorum ama UST-ALT+1 üzeri n olan bir dizi oluşturulursa ki bu döngünün toplam eleman sayısıdır.
}
printf(",%d \n",i);   //buradaki k değeriyle ndizi içindeki değerlerin çarpımının toplamıyla oluşacak index ile yukarda bahsettiğim  diziye istediğiniz herhangi bir değer de yerleştirilebilir.

                            //yani matrisin açılmış ardışıl halidir dizi ki zaten bellekte de yapılan aynı işlem yapılır ama biz çok boyutlu gibi işlem yaparız.
}
ndizi[n-2]++;
 for (int j= n-2; j >=0; j--)
 {
 if(j!=0&&ndizi[j]==UST+1)
 {
ndizi[j-1]++;
ndizi[j]=ALT;
 }


 }


 if(ndizi[0]<UST+1)goto _lab;

}





int _tmain(int argc, _TCHAR* argv[])
{
donguolustur(5);
system("pause");
return 0;
}



Hocam ben delphiyi çok bilmediğimden c++'da yazdım.

Kodu bir çalıştırın hocam donguolustur(int n) fonksiyonuna hangi değeri verirseniz o kadar döngü oluşur.
Umarım soruyu doğru anlamış ve cevaplandırmışımdır.Doğruıysa delphiye uyarlarız.
Bizi Toprağa Gömdüler Fakat Tohum Olduğumuzu Bilmiyorlardı.
Cevapla

Konuyu Paylaş : facebook gplus twitter



Konu ile Alakalı Benzer Konular
Konular Yazar Yorumlar Okunma Son Yorum
  Delphi ORM Yapısı ile işlevsel kod çıktısı oluşturma Abdullah ILGAZ 7 332 19-09-2017, Saat: 23:04
Son Yorum: uparlayan



Konuyu Okuyanlar: 1 Ziyaretçi