2010-05-03 2 views
0

내 작업은 pseudodatabase를 C++로 만드는 것이 었습니다. 세 가지 테이블이 있습니다. 저장소 이름 (char *), 나이 (int) 및 섹스 (bool)입니다.
- 테이블에 새로운 데이터를 추가
- 기준 정렬 테이블 - 모든 기록을
을 보여줍니다 : 할 수 있도록하는 프로그램을 작성 -
/감소 명 증가 -
섹스C++에서 간단한 'database'

- 나이는
증가/감소

함수 템플릿 사용은 필수입니다. 또한 배열의 크기는 레코드의 양에 따라 가변적이어야합니다.

코드가 있지만 문제가 여전히 있습니다. 다음은 내가 가지고있는 것입니다 : 배열의 크기를 반환하기위한 함수 tabSize(). 하지만 현재 그것은 포인터의 크기를 반환합니다.

포인터가 아닌 배열의 크기를 반환하는 방법은 무엇입니까?

다음으로 가장 중요한 요소는 새로운 요소를 추가하기위한 add()입니다. 먼저 배열의 크기를 얻습니다. (따라서 포인터의 값을 반환하고 크기가 아니라 지금은 사용하지 않습니다 : /). 그렇다면 데이터의 유형이 char인지 확인해야한다고 생각합니다. 아니면 내가 틀렸어?

// add(newElement, table) 
template<typename TYPE> TYPE add(TYPE L, TYPE *T) 
{ 
    int s = tabSize(T); 
//here check if TYPE = char. If yes, get the length of the new name 
     int len = 0; 
     while (L[len] != '\0') { 
      len++; 
     } 
//current length of table 
    int tabLen = 0; 
    while (T[tabLen] != '\0') { 
     tabLen++; 
    }  
//if TYPE is char 
//if current length of table + length of new element exceeds table size create new table  
    if(len + tabLen > s) 
    { 
     int newLen = len + tabLen; 
     TYPE newTab = new [newLen]; 
     for(int j=0; j < newLen; j++){ 
      if(j == tabLen -1){ 
       for(int k = 0; k < len; k++){ 
        newTab[k] = 
       } 
      } 
      else { 
       newTab[j] = T[j]; 
      } 
     } 
    } 
//else check if tabLen + 1 is greater than s. If yes enlarge table by 1.    
} 

나는 여기에 맞습니까? 다음과 같은 종류의()와

template<typename TYPE> TYPE show(TYPE *L) 
{ 
    int len = 0; 
    while (L[len] == '\0') { 
     len++; 
    } 

    for(int i=0; i<len; i++) 
    { 
     cout << L[i] << endl; 
    }  
} 

와 문제는 다음과 같습니다 :

마지막 기능 같아요 (가) 올바른 표시 감소 또는 증가하고 정렬하는 경우 호는 내가 영향을 미칠 수있다? 여기 거품 정렬을 사용하고 있습니다.

template<typename TYPE> TYPE sort(TYPE *L, int sort) 
{ 
    int s = tabSize(L);    

    int len = 0; 
    while (L[len] == '\0') { 
     len++; 
    } 
//add control increasing/decreasing sort 
    int i,j; 
    for(i=0;i<len;i++) 
    { 
     for(j=0;j<i;j++) 
     { 
      if(L[i]>L[j]) 
      { 
       int temp=L[i]; 
       L[i]=L[j]; 
       L[j]=temp; 
      } 
     } 
    } 
} 

그리고 주요 기능

그것을 실행 : 당신이 배열에 터미네이터의 어떤 종류가 없다면

int main() 
{ 
    int sort=0; 
    //0 increasing, 1 decreasing 
    char * name[100]; 
    int age[10]; 
    bool sex[10]; 

    char c[] = "Tom"; 
    name[0] = "John"; 
    name[1] = "Mike"; 

    cout << add(c, name) << endl; 

    system("pause"); 
    return 0; 
} 

답변

0

는, 배열의 크기가 T가 가리키는 얻을 수있는 쉬운 방법이 없습니다.

T이 가리키는 배열을 통해 루프를 수행하고 종결자를 찾을 때까지 요소를 카운트해야합니다. (E.G. '\0'의 경우 char *)

2

디자인에서 배열의 크기를 유지하는 변수가 있어야합니다. 이 값은 항목이 추가되거나 제거 될 때 조정됩니다. C++ 언어에는 배열 변수의 크기를 가져올 수있는 기능이 없습니다.

또한 char * 대신 std::string을 사용하는 것이 좋습니다. 강사가 char *을 사용하라고 말한 경우 함수의 매개 변수로 제공하지만 함수 및 클래스에서는 std::string으로 변환하십시오. 이것은 당신의 인생을 훨씬 쉽게 만들어 줄 것입니다.

고유 한 정렬 알고리즘을 구현하지 마십시오. 선호하는 std::sort 및 다른 비교을 비교하십시오. std::sort 알고리즘은 테스트되었으며 시간과 노력을 절약 해줍니다.

Visitor 디자인 패턴을 구현하십시오. 이렇게하면 테이블 클래스에 새로운 메소드를 작성하지 않고도 다양한 방식으로 테이블에 액세스 할 수 있습니다. 예를 들어 Visitor 기본 클래스를 사용하면 파일에서 읽고, 파일에 쓰고, 테이블 클래스를 변경하지 않고 내용을 표시하기위한 클래스를 파생시킬 수 있습니다.

마지막으로 system("pause")은 휴대하지 못할 수 있습니다. 대신 std::istream::ignore에서 찾을 수있는 cin.ignore을 선호하십시오.

+1

강사 (또는 TA)에게 먼저 물어 보지 않으면 할당이'char *'을 사용한다고하면 내부적으로'std :: string'으로 저장하지 않을 것입니다. 실제로 어떤 시나리오에서든'std :: string'을 사용하고 싶다면, 할당 시점의 일부는 수동 메모리 관리를 배우는 것이고, 코드를 읽고'std :: string'을 찾으면, 당신은 그것을 잃을 수도 있습니다. –