C/C++, Java 및 Python에서 큰 파일을 별도의 모듈로 분할

| | | | | | | | | | |

이 접근 방식은 실패할 운명이며 일반적으로 처음부터 다시 작성해야 합니다.

따라서 이 시나리오를 해결하기 위해 문제를 여러 하위 문제로 나눈 다음 하나씩 해결하려고 시도할 수 있습니다. 하나.

이렇게 하면 작업이 더 쉬워질 뿐만 아니라 높은 수준에서

지금 가장 큰 문제는 이론적으로가 아니라 소프트웨어 를 "파괴"하는 방법입니다.

우리는 C/C++, Python 및 Java.

C / C++

설명을 위해

하나의 프로그램에 모든 기본 연결 목록 삽입 이 있다고 가정해 보겠습니다. 메서드(함수)가 많기 때문에 필요한 기본 기능 위에 모든 메서드 정의를 작성하여 프로그램을 복잡하게 만들 수 없습니다. 하지만 그렇게 했다고 해도 메서드를 정렬하는 문제, 한 메서드가 다른 메서드보다 먼저 있어야 하는 등의 문제가 있을 수 있습니다.

그래서 이 문제를 해결하기 위해 모든 프로토타입을 시작 부분에 선언할 수 있습니다. 프로그램, 그리고 그 아래에서 특정 순서로 정의할 수 있는 기본 메서드:

프로그램:

FullLinkedList.c


<테이블 테두리 = "0" cellpadding = "0" cellspacing = "0">

// 완전한 연결 목록 삽입


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


// ------------ -------------- ------
// 공지사항 - 시작:
// ------ --------------------------


구조체 노드;

struct 노드 * create_node( int <코드 클래스 = "일반"> 데이터);

무효 b_insert ( 구조체 노드 ** 헤드, int 데이터);

무효 n_insert ( 구조체 노드 ** 헤드, int 데이터, int pos);

무효 e_insert ( 구조체 노드 ** 헤드, int 데이터);

무효 디스플레이 ( 구조체 < /코드> <코드 클래스 = "일반"> 노드 * 임시);


// ------------ -------------- ------
// 공지사항 - END:
// ------ --------------------------


정수 <코드 클래스 = "일반"> 메인 ()

<코드 클래스 = "일반"> {

<코드 클래스 = "키워드 굵게" > struct 노드 * 헤드 = NULL;


int 채널, 데이터, 위치;


printf ( " 연결 목록: " );

동안 (1) {

printf ( "1. 처음에 삽입" );

printf ( "2.삽입 N번째 위치에서" );

printf ( "3.삽입 종료 시" );

printf ( "4.디스플레이 " <코드 클래스 = "일반">);

printf ( "0.Exit " <코드 클래스 = "일반">);

printf ( "선택 사항을 입력하십시오 :" <코드 클래스 = "일반">);

scanf ( "% d" <코드 클래스 = "일반">, & 채널);


스위치 (ch) {

케이스 1:

printf ( " 데이터:" <코드 클래스 = "일반">);

scanf ( "% d" , & 데이터);

b_insert (& 헤드, 데이터);

나누기 ;


케이스 2:

printf ( " 데이터:" <코드 클래스 = "일반">);

scanf ( "% d" , & 데이터);


printf ( " 위치 입력: " );

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

n_insert (& 헤드, 데이터, 위치);

나누기 ;


케이스 3:

printf ( " 데이터:" <코드 클래스 = "일반">);

scanf ( "% d" , & 데이터);

e_insert (& 헤드, 데이터);

나누기 ;


케이스 4:

< 코드 클래스 ="정의되지 않은 공백 "> <코드 클래스 ="일반 "> 디스플레이(머리);

나누기 ;


케이스 0:

반환 0;


기본값 :

printf ( "잘못된 선택" <코드 클래스 = "일반">);

<코드 클래스 = "일반">}

<코드 클래스 ="일반 ">}

<코드 클래스 ="일반 ">}


<코드 클래스 = "주석"> // ---------------- ---------- ------
// 정의 - 시작:
// ---- ----------------------------


구조체 노드 {

int < 코드 클래스 ="일반 "> 데이터;

struct 노드 * 다음;

<코드 클래스 = "일반">};


struct 노드 * create_node ( int 데이터)

{

< 코드 클래스 = "키워드 굵게"> 구조체 <코드 클래스 = "일반" > 노드 * 임시

<코드 클래스 = "일반"> = ( < 코드 클래스 = "키워드 볼드" > 구조체 <코드 클래스 = "일반"> 노드 *)

malloc < 코드 클래스 = "일반"> ( <코드 클래스 = "키워드 볼드"> sizeof <코드 클래스 = "일반"> ( <코드 클래스 = " 키워드 볼드 "> 구조체 < /코드> <코드 클래스 ="일반 "> 노드));

temp- > 데이터 = 데이터;

temp- > 다음 = NULL;


반환 임시;

}


무효 <코드 class = "plain"> b_insert ( struct 노드 ** 헤드, int <코드 클래스 = "일반"> 데이터)

<코드 클래스 = " 일반 "> {

<코드 class ="undefined spaces "> 구조체 노드 * new_node = create_node(데이터);


new_node- > 다음 = * 머리;

* 헤드 = new_node;

}


무효 <코드 class = "plain"> n_insert ( struct 노드 ** 헤드, int 데이터, int 위치)

{

if (* 헤드 == NULL) {

b_insert (헤드, 데이터);

반환 ;

}


<코드 클래스 ="키워드 굵게 "> 구조체 노드 * new_node = create_node(데이터);


struct 노드 * 임시 = * 머리;


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

임시 = 온도-> 다음;


new_node- > 다음 = 온도- > 다음;

temp- > 다음 = new_node;

}


무효 <코드 class = "plain"> e_insert ( struct 노드 ** 헤드, int <코드 클래스 = "일반"> 데이터)

<코드 클래스 = " 일반 "> {

<코드 class ="undefined space "> if (* head == NULL) {

b_insert (헤드, 데이터);

반환 ;

}


<코드 클래스 ="키워드 굵게 "> 구조체 <코드 클래스 ="일반 "> 노드 * 임시 = * 머리;


while (temp- > next! = NULL)

temp = temp- > 다음;


struct 노드 * new_node = create_node(데이터);

temp- > 다음 = new_node;

}


무효 <코드 class = "plain"> 디스플레이 ( 구조체 노드 * 임시)

< 코드 클래스 = "일반"> {

<코드 클래스 = "함수 볼드"> printf <코드 클래스 = "일반"> ( <코드 클래스 = "string"> "요소는 다음과 같습니다." );

while (temp! = NULL) {

printf ( "% d" , 온도-> 데이터);

temp = temp- > 다음;

}

printf <코드 클래스 =" 일반 "> ( <코드 클래스 ="문자열 ">" " <코드 클래스 = "일반">);

}


// ------ --------------------------
// 정의 - END
<코드 클래스 = "주석"> // --------------------- -----------

코드 컴파일: 우리는 위의 프로그램을 컴파일할 수 있습니다:

 gcc linkedlist.c -o linkedlist 

그리고 그것은 작동합니다!

위 코드의 주요 문제:
우리는 이미 프로그램의 주요 문제점을 알 수 있지만 개별적으로 또는 그룹으로 코드로 작업하는 것이 그리 쉽지만은 않습니다.

위의 작업을 원하는 사람이 있다면 프로그램, 그 다음 그 사람이 직면하고 있는 많은 문제 중 일부:

  1. 전체 소스 파일을 통과해야 합니다. 일부 기능을 개선하거나 개선합니다.
  2. 쉽게 재사용할 수 없음 프로그램을 다른 프로젝트의 기초로 사용합니다.
  3. 코드가 매우 복잡하고 전혀 매력적이지 않아 코드를 탐색하기가 매우 어렵습니다.

그룹 프로젝트나 대규모 프로그램의 경우 위의 접근 방식은 전체 비용, 에너지 및 실패율을 증가시키는 것을 보장합니다.

올바른 접근 방식:

이 행은 "#include"로 시작하는 모든 C/C++ 프로그램에서 시작됩니다.
이는 다음을 의미합니다. "library" 헤더 (.h 파일) 에 선언되고 library.c / cpp 파일에 정의된 모든 기능을 포함합니다.

이 라인은 컴파일 시 사전 처리됩니다.

우리는 우리 자신의 목적을 위해 수동으로 이러한 라이브러리를 만들려고 시도할 수 있습니다.

기억해야 할 중요 사항 :

  1. ".h" 파일에는 프로토타입 선언(예: 함수, 구조) 및 전역 변수만 포함됩니다.
  2. ".c / .cpp" 파일에는 실제 구현(헤더 파일의 선언 정의)이 포함되어 있습니다.
  3. 모든 소스 파일을 컴파일할 때 동일한 함수의 여러 정의가 변수 등이 동일한 프로젝트에 존재하지 않습니다. (매우 중요)
  4. 정적 함수 를 사용하여 해당 함수가 선언된 파일로 제한합니다.
  5. 외부 파일에서 참조하는 변수를 사용하려면 extern 키워드를 사용하십시오.
  6. C++를 사용할 때 네임스페이스에 주의하고 충돌을 피하기 위해 항상 namespace_name:: function(), 을 사용하십시오.
  7. 프로그램을 더 작은 코드로 분할:
    위의 프로그램을 조사한 후 이 큰 프로그램을 적절한 작은 부분으로 분할하고 그러면 쉽게 처리됩니다.

    위의 프로그램은 기본적으로 두 가지 주요 기능을 가지고 있습니다.
    1) 노드에 데이터를 생성, 삽입 및 저장합니다.
    2) 노드 표시


    이렇게 하면 프로그램을 적절하게 분할하여 다음과 같이 할 수 있습니다.
    1) 기본 파일은 > 프로그램 드라이버, 삽입 모듈의 Nice Wrapper 및 추가 파일 사용 위치.
    2) 붙여넣기 - > 실제 구현은 여기에 있습니다.

    중요한 사항을 언급하면서 프로그램은 다음과 같이 나뉩니다.

    linkedlist.c - > 드라이버 프로그램 포함
    insert.c - > 삽입용 코드 포함

    linkedlist.h - > 필요한 노드 선언을 포함합니다.
    insert.h - > 필요한 노드 삽입 선언을 포함합니다.

    각 헤더 파일에서 다음으로 시작합니다.

     #ifndef FILENAME_H #define FILENAME_H 선언 ... #endif 

    #ifndef, #define 및 #endif, 사이에 선언을 작성하는 이유는 하나의 동일한 헤더 파일이 호출될 때 데이터 유형, 변수 등과 같은 식별자의 다중 선언을 방지하기 위함입니다. 동일한 프로젝트에 속한 새 파일에서.

    이 샘플 프로그램의 경우:

    insert.h - > 삽입 노드의 선언과 노드 자체의 선언을 포함합니다.

    컴파일러가 헤더 파일에서 선언을 볼 수 있음을 기억하는 것이 매우 중요하지만, 포함 선언이 있으면 컴파일러가 링크 단계로 이동하기 전에 각 .c 파일을 개별적으로 컴파일하기 때문에 오류가 발생합니다. ,

    connectedlist.h - > 노드를 포함하는 도우미 파일 및 이를 사용하는 파일에 포함되어야 하는 해당 표시 선언.


    insert.c - > #include "connectedlist.h"를 통해 노드 선언을 포함합니다. 에는 선언과 insert.h에 선언된 기타 모든 메서드 정의가 포함됩니다.

    connectedlist.c - > 사용자가 필요한 위치에 정수 데이터를 삽입하도록 하는 무한 루프와 목록을 표시하는 메서드가 포함된 Simple Wrapper.

    마지막으로 염두에 두어야 할 것은 의미가 없다는 것입니다. 포함 파일이 서로 겹치면 여러 번 재정의할 수 있고 오류가 발생할 수 있습니다.

    위의 내용을 고려하여 적절한 루틴으로 신중하게 분할해야 합니다.

    linkedlist.h


    <표 테두리 = "0" cellpadding = "0 "cellspacing =" 0 ">

    // connectedlist.h


    # ifndef LINKED_LIST_H
    # 정의 LINKED_LIST_H


    구조체 노드 {

    int 데이터;

    struct 노드 * 다음;

    <코드 클래스 = "일반">};


    무효 display ( 구조체 <코드 클래스 ="일반 "> 노드 * 임시);


    # endif

    insert.h


    // insert.h


    # ifndef INSERT_H
    < 코드 클래스 = "전처리기"> #define INSERT_H


    구조체 노드;

    struct 노드 * create_node( int <코드 클래스 = "일반"> 데이터);

    무효 b_insert ( 구조체 노드 ** 헤드, int 데이터);

    무효 n_insert ( 구조체 노드 ** 헤드, int 데이터, int pos);

    무효 e_insert ( 구조체 노드 ** 헤드, int 데이터);


    # endif

    insert.c


    // insert.c


    # "linkedlist.h" 포함
    // & quot; & quot; 그래서 전처리기는
    // 현재 디렉토리와
    // 표준 라이브러리 파일을 나중에 찾습니다.


    # 포함 "stdlib.h >


    struct 노드 * create_node ( int 데이터)

    {

    < 코드 클래스 = "키워드 볼드"> 구조체 <코드 클래스 = "일반" > 노드 * 임시 = ( <코드 클래스 = "키워드 볼드"> 구조체 <코드 클래스 = "일반" "> 노드 *) malloc ( sizeof ( 구조체 노드));

    temp- > 데이터 = 데이터;

    temp- > 다음 = NULL;


    반환 임시;

    }


    무효 <코드 class = "plain"> b_insert ( struct 노드 ** 헤드, int <코드 클래스 = "일반"> 데이터)

    <코드 클래스 = " 일반 "> {

    <코드 class ="undefined spaces "> 구조체 노드 * new_node = create_node(데이터);


    new_node- > 다음 = * 머리;

    * 헤드 = new_node;

    }


    무효 <코드 class = "plain"> n_insert ( struct 노드 ** 헤드, int 데이터, int 위치)

    {

    if (* 헤드 == NULL) {

    b_insert (헤드, 데이터);

    반환 ;

    }


    <코드 클래스 ="키워드 굵게 "> 구조체 노드 * new_node = create_node(데이터);


    struct 노드 * 임시 = * 머리;


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

    임시 = 온도-> 다음;


    new_node- > 다음 = 온도- > 다음;

    temp- > 다음 = new_node;

    <

    C/C++, Java 및 Python에서 큰 파일을 별도의 모듈로 분할 _files: Questions

    C/C++, Java 및 Python에서 큰 파일을 별도의 모듈로 분할 cos: Questions

    Shop

    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

    $

    Best laptop for Zoom

    $499

    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