Podziel duży plik na osobne moduły w C/C++, Javie i Pythonie

| | | | | | | | | | |

To podejście jest skazane na niepowodzenie i zwykle wymaga przepisania od zera.

Aby rozwiązać ten scenariusz, możemy spróbować podzielić problem na kilka podproblemów, a następnie spróbować rozwiązać go jeden po drugim jeden.

To nie tylko ułatwia nasze zadanie, ale także pozwala nam osiągnąć

// wstaw kompletną połączoną listę


# include "stdio.h >
# include "biblioteka standardowa.h >


// ------------ -------------- ------
// Ogłoszenia - START:
// ------ --------------------------


struct Węzeł;

struct Węzeł * create_node ( int dane);

void b_insert ( struct Node ** head, int dane);

void n_insert ( struct Node ** head, int dane, int pos);

void e_insert ( struct Node ** head, int dane);

void display ( struct Węzeł * temp);


// ------------ -------------- ------
// Ogłoszenia - END:
// ------ --------------------------


int main ()

{

struct Węzeł * head = NULL;


int ch, data, pos;


printf ( " Lista połączona: " );

while (1) {

printf ( "1.Wstaw na początku" );

printf ( "2.Wstaw na N-tej pozycji" );

printf ( "3.Wstaw Na końcu" );

printf ( "4.Wyświetl " );

printf ( "0.Exit " );

printf ( "Wprowadź swój wybór :" );

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


przełącznik (ch) {

wielkość liter 1:

printf ( "Wprowadź data:" );

scanf ( "% d" i dane);

b_insert (& amp; head, data);

break ;


wielkość liter 2:

printf ( "Wprowadź data:" );

scanf ( "% d" i dane);


printf ( " Wprowadź pozycję: " );

scanf ( "% d" i pos);

n_insert (& amp; głowa, dane, pozycja);

break ;


wielkość liter 3:

printf ( "Wprowadź data:" );

scanf ( "% d" i dane);

e_insert (& amp; head, data);

break ;


wielkość liter 4:

display (head);

break ;


wielkość liter 0:

return 0;


domyślne :

printf ( "Zły wybór" );

}

}

}


// ---------------- ---------- ------
// Definicje - START:
// ---- ----------------------------


struct Node {

int < klasa kodu ="zwykły "> dane;

struct Node * next;

};


struct Węzeł * create_node ( int dane)

{

struct Node * temp

= ( struct Node *)

malloc ( sizeof ( struct < /kod> Węzeł));

temp- > dane = dane;

temp- > następny = NULL;


return temp;

}


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

{

struct Węzeł * new_node = create_node (dane);


new_node- > następny = * głowa;

* head = new_node;

}


void n_insert ( struct Node ** head, int dane, int pos)

{

if (* head == NULL) {

b_insert (nagłówek, dane);

return ;

}


struct Węzeł * new_node = create_node (dane);


struct Węzeł * temp = * head;


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

temp = temp- > Następny;


new_node- > następny = temp- > Następny;

temp- > następny = nowy_węzeł;

}


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

{

if (* head == NULL) {

b_insert (nagłówek, dane);

return ;

}


struct Node * temp = * head;


while (temp- > next! = NULL)

temp = temp- > Następny;


struct Węzeł * new_node = create_node (dane);

temp- > następny = nowy_węzeł;

}


void display ( struct Node * temp)

{

printf ( "Elementy to:" );

while (temp! = NULL) {

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

temp = temp- > Następny;

}

printf ( " " );

}


// ------ --------------------------
// Definicje - END
// ---------- -----------

Kompilacja kodu: możemy skompilować powyższy program:

 gcc linkedlist.c -o linkedlist 

I to działa!

Główne problemy w powyższym kodzie:
Widać już główne problemy z programem, nie jest łatwo pracować z kodem indywidualnie lub w grupie.

Jeśli ktoś chce pracować z powyższymi program, to niektóre z wielu problemów, z którymi boryka się dana osoba:

  1. Trzeba przejrzeć pełny plik źródłowy. w celu ulepszenia lub ulepszenia niektórych funkcji.
  2. Nie może być łatwo ponownie użyty program jako podstawa dla innych projektów.
  3. Kod jest bardzo zagracony i wcale nie jest atrakcyjny, co bardzo utrudnia poruszanie się po kodzie.

W przypadku projektu grupowego lub dużych programów, powyższe podejście gwarantuje zwiększenie ogólnych kosztów, energii i wskaźników awarii.

Właściwe podejście:

Widzimy, że te wiersze zaczynają się w każdym programie C/C++, który zaczyna się od „#include”.
Oznacza to uwzględnij wszystkie funkcje zadeklarowane w nagłówku „library” (pliki .h) i ewentualnie zdefiniowane w plikach library.c / cpp .

Te wiersze są wstępnie przetwarzane w czasie kompilacji.

Możemy ręcznie spróbować stworzyć taką bibliotekę do naszych własnych celów.

Ważne rzeczy do zapamiętania :

  1. Pliki ".h" zawierają tylko deklaracje prototypów (takie jak funkcje, struktury) i zmienne globalne.
  2. Pliki ".c/.cpp" zawierają rzeczywistą implementację (definicje deklaracji w plikach nagłówkowych)
  3. Podczas kompilacji wszystkich plików źródłowych upewnij się, że wiele definicji tej samej funkcji, zmienna itp. nie istnieją dla tego samego projektu. (BARDZO WAŻNE)
  4. Użyj funkcji statycznych, aby ograniczyć się do pliku, w którym są zadeklarowane.
  5. Użyj słowa kluczowego extern , aby użyć zmiennych, do których odwołują się pliki zewnętrzne.
  6. Używając C++, uważaj na przestrzenie nazw, zawsze używaj namespace_name:: function(), , aby uniknąć kolizji.
  7. Dzieląc program na mniejsze kody:
    Po zbadaniu powyższego programu możemy zobaczyć, jak ten duży program można podzielić na odpowiednie małe części i następnie łatwo przetwarzany.

    Powyższy program ma zasadniczo 2 główne funkcje:
    1) Tworzenie, wstawianie i zapisywanie danych w węzłach.
    2) Wyświetlanie węzłów


    W ten sposób mogę odpowiednio podzielić program, tak aby:
    1) Główny plik to > Sterownik programu, Nice Wrapper z modułów wstawiania i gdzie używamy dodatkowych plików.
    2) Wklej - > Prawdziwa implementacja leży tutaj.

    Z wymienionymi ważnymi punktami, program jest podzielony na:

    linkedlist.c - > Zawiera program sterownika
    insert.c — > Zawiera kod do wstawienia

    linkedlist.h — > Zawiera niezbędne deklaracje węzłów
    insert.h — > Zawiera niezbędne deklaracje wstawiania węzłów

    W każdym pliku nagłówkowym zaczynamy od:

     #ifndef FILENAME_H #define FILENAME_H Deklaracje ... #endif 

    Powodem, dla którego piszemy nasze deklaracje między #ifndef, #define i #endif, jest zapobieganie wielokrotnym deklaracjom identyfikatorów, takich jak typy danych, zmienne itp., gdy wywoływany jest jeden i ten sam plik nagłówkowy w nowym pliku należącym do tego samego projektu.

    Dla tego przykładowego programu:

    insert.h - > Zawiera deklarację węzła wstawiania, a także deklarację samego węzła.

    Bardzo ważne jest, aby pamiętać, że kompilator widzi deklaracje w pliku nagłówkowym, ale jeśli spróbujesz napisać kod, który zawiera deklarację w innym miejscu, spowoduje to błąd, ponieważ kompilator kompiluje każdy plik .c indywidualnie przed przejściem do kroku łączenia. ,

    connectedlist.h — > Plik pomocniczy zawierający deklaracje węzła i jego wyświetlania, które należy uwzględnić w przypadku plików, które z niego korzystają.


    insert.c — > Dołącz deklarację węzła za pomocą #include „connectedlist.h”, która zawiera deklarację, a także wszystkie inne definicje metod zadeklarowane w insert.h.

    connectedlist.c — > Simple Wrapper, zawierający nieskończoną pętlę, która zachęca użytkownika do wstawienia danych całkowitych w wymaganych pozycjach, a także zawiera metodę wyświetlającą listę.

    A ostatnią rzeczą, o której należy pamiętać, jest to, że jest to bezsensowne pliki dołączania do siebie nawzajem mogą prowadzić do wielu nadpisań i spowodują błąd.

    Biorąc powyższe pod uwagę, należy ostrożnie podzielić na odpowiednie procedury.

    linkedlist.h


    // connectedlist.h


    # ifndef LINKED_LIST_H
    # define LINKED_LIST_H


    struct Węzeł {

    int dane;

    struct Node * next;

    };


    void display ( struct Węzeł * temp);


    # endif

    insert.h


    // insert.h


    # ifndef INSERT_H
    #define INSERT_H


    struct Węzeł;

    struct Węzeł * create_node ( int dane);

    void b_insert ( struct Node ** head, int dane);

    void n_insert ( struct Node ** head, int dane, int pos);

    void e_insert ( struct Node ** head, int dane);


    # endif

    insert.c


    // insert.c


    # include "linkedlist.h"
    // & quot; & quot; więc preprocesor przeszukuje
    // do bieżącego katalogu i
    // pliki biblioteki standardowej później.


    # include "biblioteka standardowa.h >


    struct Węzeł * create_node ( int dane)

    {

    struct Node * temp = ( struct Węzeł *) malloc ( sizeof ( struct Node));

    temp- > dane = dane;

    temp- > następny = NULL;


    return temp;

    }


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

    {

    struct Węzeł * new_node = create_node (dane);


    new_node- > następny = * głowa;

    * head = new_node;

    }


    void n_insert ( struct Node ** head, int dane, int pos)

    {

    if (* head == NULL) {

    b_insert (nagłówek, dane);

    return ;

    }


    struct Węzeł * new_node = create_node (dane);


    struct Węzeł * temp = * head;


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

    temp = temp- > Następny;


    new_node- > następny = temp- > Następny;

    temp- > następny = nowy_węzeł;

    <

    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