Büyük bir dosyayı C/C++, Java ve Python`da ayrı modüllere bölme

| | | | | | | | | | |

Bu yaklaşım başarısızlığa mahkûmdur ve genellikle sıfırdan yeniden yazmayı gerektirir.

Dolayısıyla, bu senaryoyu çözmek için sorunu birkaç alt soruna bölmeyi deneyebilir ve ardından tek tek çözmeye çalışabiliriz. 1.

Bu yalnızca görevimizi kolaylaştırmakla kalmaz, aynı zamanda yüksek bir değerden YAZILIM `ın nasıl "kırılacağı"dır.

C / C++ gibi popüler dillerde bu tür birimlerin birkaç farklı türünü göreceğiz, Python ve Java.

C / C++

Açıklama amacıyla,

Tüm temel bağlı liste eklerine tek bir programda sahip olduğumuzu varsayalım. Bir çok metot (fonksiyon) olduğu için gerekli olan ana fonksiyonun üzerine tüm metot tanımlarını yazarak programı karmaşık hale getiremeyiz. Ancak yapsak bile, yöntemleri sıralama sorunu olabilir, bir yöntemin diğerinden önce olması gerektiği gibi.

Dolayısıyla, bu sorunu çözmek için tüm prototipleri başlangıcında bildirebiliriz. program, ardından ana yöntem ve bunları herhangi bir sırayla tanımlayabileceğimiz aşağıda:

Program:

FullLinkedList.c


// tam bir bağlantılı liste ekleyin


# include "stdio.h >
# include "stdlib.h >


// ------------ -------------- ------
// Duyurular - BAŞLANGIÇ:
// ------ --------------------------


struct Düğüm;

struct Node * create_node ( int veri);

void b_insert ( struct Düğüm ** kafa, int veri);

void n_insert ( struct Düğüm ** başlığı, int veri, int konum);

void e_insert ( struct Düğüm ** kafa, int veri);

void display ( struct < /kod> Düğüm * geçici);


// ------------ -------------- ------
// Duyurular - SON:
// ------ --------------------------


int ana ()

{

struct Düğüm * head = NULL;


int ch, data, pos;


printf ( " Bağlantılı Liste: " );

while (1) {

printf ( "1.Insert at Beginning" );

printf ( "2.Insert N. Konumda" );

printf ( "3.Insert" Biterken" );

printf ( "4.Display " );

printf ( "0.Exit" " );

printf ( "Seçiminizi giriniz :" );

scanf ( "% d" , & amp; ch);


geçiş (ch) {

büyük/küçük harf 1:

printf ( " veri:" );

scanf ( "% d" , & amp; veri);

b_insert (& amp; head, data);

break ;


büyük/küçük harf 2:

printf ( " veri:" );

scanf ( "% d" , & amp; veri);


printf ( " Pozisyonu Girin: " );

scanf ( "% d" , & amp; konum);

n_insert (& amp; kafa, veri, konum);

break ;


büyük/küçük harf 3:

printf ( " veri:" );

scanf ( "% d" , & amp; veri);

e_insert (& amp; head, data);

break ;


büyük/küçük harf 4:

< kod sınıfı ="tanımsız boşluklar "> ekran (kafa);

break ;


büyük/küçük harf 0:

< kod sınıfı ="tanımsız boşluklar "> dönüş 0;


varsayılan :

printf ( "Yanlış Seçim" );

}

}

}


// ---------------- ---------- ------
// Tanımlar - BAŞLANGIÇ:
// ---- ----------------------------


struct Node {

int < kod sınıfı ="düz "> veri;

struct Düğüm * sonraki;

};


yapı Düğüm * create_node ( int data)

{

< kod sınıfı = "kalın anahtar kelime"> yapı Düğüm * temp

= ( < kod sınıfı = "kalın anahtar kelime" > yapı Düğüm *)

malloc ( sizeof ( struct Düğüm));

temp- > veri = veri;

temp- > sonraki = BOŞ;


return temp;

}


void b_insert ( struct Node ** head, int veri)

{

struct Düğüm * new_node = create_node (veri);


new_node- > sonraki = * kafa;

* head = new_node;

}


void n_insert ( struct Node ** head, int veri, int konum)

{

if (* head == NULL) {

b_insert (head, data);

dönüş ;

}


struct Düğüm * new_node = create_node (veri);


struct Node * temp = * head;


for ( int i = 0; i "pos - 2; ++ i)

temp = sıcaklık- > sonraki;


new_node- > sonraki = sıcaklık- > sonraki;

temp- > sonraki = yeni_düğüm;

}


void e_insert ( struct Node ** head, int veri)

{

if (* head == NULL) {

b_insert (kafa, veri);

dönüş ;

}


struct Düğüm * temp = * head;


while (temp- > next! = NULL)

temp = temp- > sonraki;


struct Düğüm * new_node = create_node (veri);

temp- > sonraki = yeni_düğüm;

}


void ekran ( struct Node * temp)

< kod sınıfı = "düz"> {

printf ( "Öğeler şunlardır:" );

while (temp! = NULL) {

printf ( "% d" , temp- > veri);

temp = temp- > sonraki;

}

printf ( " " );

}


// ------ --------------------------
// Tanımlar - END
// --------------------- -----------

Kodun derlenmesi: yukarıdaki programı derleyebiliriz:

 gcc linklist.c -o linklilist 

Ve işe yarıyor!

Yukarıdaki koddaki ana problemler:
Programla ilgili temel sorunları zaten görebiliyoruz, tek tek veya grup halinde kodla çalışmak o kadar kolay değil.

Birisi yukarıdakilerle çalışmak isterse program, sonra kişinin karşılaştığı birçok sorundan bazıları:

  1. Kişinin Tam Kaynak Dosyasını gözden geçirmesi gerekir. bazı işlevleri iyileştirmek veya iyileştirmek için.
  2. Program diğer projeler için temel olarak kolayca yeniden kullanılamaz .
  3. Kod çok karmaşık ve hiç çekici değil, bu da kodda gezinmeyi çok zorlaştırıyor.

Bir grup projesi veya büyük programlar söz konusu olduğunda, yukarıdaki yaklaşımın toplam maliyetleri, enerjiyi ve başarısızlık oranlarını artırması garanti edilir.

Doğru yaklaşım:

Bu satırların "#include" ile başlayan her C/C++ programında başladığını görüyoruz.
Bu şu anlama geliyor: "library" başlığında (.h dosyaları) bildirilen ve muhtemelen library.c / cpp dosyalarında tanımlanan tüm işlevleri içerir.

Bu satırlar derleme zamanında önceden işlenir.

Bu tür bir kitaplığı kendi amaçlarımız için manuel olarak oluşturmaya çalışabiliriz.

Hatırlamamız gereken önemli şeyler :

  1. ".h" dosyaları yalnızca prototip bildirimlerini (fonksiyonlar, yapılar gibi) ve global değişkenleri içerir.
  2. ".c / .cpp" dosyaları gerçek uygulamayı içerir (başlık dosyalarındaki bildirim tanımları)
  3. Tüm kaynak dosyaları derlerken, aynı işlevin birden fazla tanımının olduğundan emin olun, değişken vb. aynı proje için mevcut değil. (ÇOK ÖNEMLİ)
  4. Bildirildikleri dosyayla kendinizi sınırlamak için statik işlevleri kullanın.
  5. Harici dosyalar tarafından başvurulan değişkenleri kullanmak için extern anahtar sözcüğünü kullanın.
  6. C++ kullanırken ad alanlarına dikkat edin, çakışmaları önlemek için her zaman namespace_name:: function (), kullanın.
  7. Programı daha küçük kodlara bölerek:
    Yukarıdaki programı inceledikten sonra, bu büyük programın nasıl uygun küçük parçalara ayrılabileceğini görebiliriz ve sonra kolayca işlenir.

    Yukarıdaki programın temelde 2 ana işlevi vardır:
    1) Düğümlerde veri oluşturma, ekleme ve kaydetme.
    2) Düğümleri görüntüleme


    Bu şekilde programı şu şekilde bölebilirim:
    1) Ana dosya > Program sürücüsü, Ekleme Modüllerinden Nice Wrapper ve ek dosyaları kullandığımız yer.
    2) Yapıştır - > Gerçek uygulama buradadır.

    Belirtilen önemli noktalarla birlikte program şu bölümlere ayrılmıştır:

    linkedlist.c - > Sürücü Programını içerir
    insert.c - > Ekleme Kodu içerir

    linkedlist.h - > Gerekli Düğüm bildirimlerini içerir
    insert.h - > Gerekli Düğüm Ekleme Bildirimlerini içerir

    Başladığımız her başlık dosyasında:

     #ifndef FILENAME_H #define FILENAME_H Bildirimleri ... #endif 

    #ifndef, #define ve #endif, arasında bildirimlerimizi yazmamızın nedeni, aynı başlık dosyası çağrıldığında veri türleri, değişkenler vb. gibi birden çok tanımlayıcı bildirimini engellemektir. aynı projeye ait yeni bir dosyada.

    Bu örnek program için:

    insert.h - > Ekleme düğümünün bildirimini ve düğümün kendisinin bildirimini içerir.

    Derleyicinin başlık dosyasındaki bildirimleri görebileceğini unutmamak çok önemlidir, ancak aşağıdaki kodu yazmaya çalışırsanız < güçlü>başka bir yerde bildirimi içerir , derleyici bağlantı adımına geçmeden önce her .c dosyasını ayrı ayrı derlediği için bu bir hataya neden olur. ,

    connectedlist.h - > Düğüm ve bunları kullanan dosyalar için dahil edilmesi gereken Görüntü bildirimlerini içeren bir yardımcı dosya.


    insert.c - > #include "connectedlist.h" aracılığıyla, bildirimin yanı sıra insert.h`de bildirilen tüm diğer yöntem tanımlarını içeren bir Düğüm bildirimi ekleyin.

    connectedlist.c - > Kullanıcıdan gerekli konumlara tamsayı verisi eklemesini isteyen sonsuz bir döngü içeren ve ayrıca listeyi görüntüleyen bir yöntem içeren Simple Wrapper.

    Ve akılda tutulması gereken son şey, bunun anlamsız olduğudur. dosyaların birbirine eklenmesi, birden fazla geçersiz kılmaya (geçersiz kılmaya) neden olabilir ve bir hataya neden olur.

    Yukarıdakileri göz önünde bulundurarak, dikkatli bir şekilde uygun rutinlere bölmelisiniz.

    linkedlist.h


    // connectlist.h


    # ifndef LINKED_LIST_H
    # tanımla LINKED_LIST_H


    struct Düğüm {

    int data;

    struct Düğüm * sonraki;

    };


    void display ( struct Düğüm * temp);


    # endif

    insert.h


    // insert.h


    # ifndef INSERT_H
    #define INSERT_H


    struct Düğüm;

    struct Node * create_node ( int veri);

    void b_insert ( struct Düğüm ** kafa, int veri);

    void n_insert ( struct Düğüm ** başlığı, int veri, int konum);

    void e_insert ( struct Düğüm ** kafa, int veri);


    # endif

    insert.c


    // insert.c


    # "linkedlist.h" içerir
    // & quot; " bu nedenle önişlemci
    // geçerli dizine ve daha sonra
    // standart kitaplık dosyalarına bakar.


    # include "stdlib.h >


    yapı Düğüm * create_node ( int data)

    {

    < kod sınıfı = "kalın anahtar kelime"> yapı Düğüm * temp = ( yapı Düğüm *) malloc ( sizeof ( struct Node));

    temp- > veri = veri;

    temp- > sonraki = BOŞ;


    return temp;

    }


    void b_insert ( struct Node ** head, int veri)

    {

    struct Düğüm * new_node = create_node (veri);


    new_node- > sonraki = * kafa;

    * head = new_node;

    }


    void n_insert ( struct Node ** head, int veri, int konum)

    {

    if (* head == NULL) {

    b_insert (head, data);

    dönüş ;

    }


    struct Düğüm * new_node = create_node (veri);


    struct Node * temp = * head;


    for ( int i = 0; i "pos - 2; ++ i)

    temp = sıcaklık- > sonraki;


    new_node- > sonraki = sıcaklık- > sonraki;

    temp- > sonraki = yeni_düğüm;

    <

    Shop

    Learn programming in R: courses

    $

    Best Python online courses for 2022

    $

    Best laptop for Fortnite

    $

    Best laptop for Excel

    $

    Best laptop for Solidworks

    $

    Best laptop for Roblox

    $

    Best computer for crypto mining

    $

    Best laptop for Sims 4

    $

    Latest questions

    NUMPYNUMPY

    psycopg2: insert multiple rows with one query

    12 answers

    NUMPYNUMPY

    How to convert Nonetype to int or string?

    12 answers

    NUMPYNUMPY

    How to specify multiple return types using type-hints

    12 answers

    NUMPYNUMPY

    Javascript Error: IPython is not defined in JupyterLab

    12 answers


    Wiki

    Python OpenCV | cv2.putText () method

    numpy.arctan2 () in Python

    Python | os.path.realpath () method

    Python OpenCV | cv2.circle () method

    Python OpenCV cv2.cvtColor () method

    Python - Move item to the end of the list

    time.perf_counter () function in Python

    Check if one list is a subset of another in Python

    Python os.path.join () method