2012-03-22 3 views
1

저는 블랙 잭 프로그램을 작성 중이며 가장 높은 점수를 파일에 쓰고 싶습니다. 분명히 프로그램이 처음 몇 번 실행될 때 모든 점수가 높은 점수 목록에 채워질 것입니다. 그 후에 추가 될 숫자 10 점수보다 큰 점수와 초기 숫자 10 점수 (현재 숫자 11)을 삭제해야합니다. 연결리스트의상위 10 점을 파일에 작성하십시오.

struct highScore 
{ 
    char name; 
    int score; 
    highScore *next; 
}; 

내 지식은 아주 기본입니다 그래서 실제로 코딩하기 전에 나는 내 연구 일을하려는 :이 같은 링크 된 목록을 사용하여 생각했습니다. 만약 내가 이것을 과장한다면 간단하게 일을 끝내는 방법이 있을까? 아니면 내가 여기서 올바른 길을 가고 있는지 궁금하다.

+0

숙제입니까? – enobayram

+0

아니, 그건 단지 나를위한거야. 나는 2 개월 전에 프로그래밍을 시작 했으므로 그런 식이면 저를 용서하십시오. 코드 또는 기타, 오른쪽 트랙의 포인터를 찾지 못했습니다. – karoma

+0

링크드리스트에서 연습을 시작하려면 좋은 초보자 연습입니다. 주의 :'highScore'는 유효하지 않습니다.'struct highScore'가 필요합니다. –

답변

0

나는 링크 된 목록이 최선의 접근 방식이라고 생각하지 않습니다. 나를 잘못 받아들이지는 마라. 그러나 링크드리스트는 무작위로, 가장 일반적으로 시작이나 끝에서 추가하고 제거하는 데 사용된다. 문제는 부질간 링크리스트는 일반적인 배열처럼 요소를 찾는 것이 비효율적이라는 것입니다. 왜냐하면 그것이 발견 될 때까지 각 요소를 검사해야하기 때문입니다.

배열을 사용하면 프로그램의 효율성과 복잡성이 줄어들 것입니다. 두 데이터 구조 (링크드리스트 및 어레이) 비교

:

  1. 찾기 요소의 평균 길이에 비례하는 경우 모두있다.

  2. 끝에 삽입 요소는 두 구조에서 모두 일정합니다.

  3. 링크 된 목록은 요소를 어느 위치 에나 추가하는 것이 효율적이지만 위치를 찾아야하므로 배열의 오른쪽에 한 위치 씩 오른쪽 요소를 이동해야하는 배열 문제가 해결됩니다.

는 뭔가

typedef struct 
    { 
     int score; 
     char name[51]; //name should hold 50 chars and null 
    } highScore; 

    highScore scores[10]; // voilla 10 scores 


    //or if you need little bit of complications 
    //and more speed when moving array during insertion 
    highScore * scorespointer[10]; //array of 10 pointers on score 

처럼 연결된 목록으로 간단한 솔루션 오순절 같은 효율성을 만들 것이라고 생각합니다.

구조체를 연결 목록으로 구현하면 이름과 점수 만 저장할 수 있기 때문에 파일에서 직접 직렬화 할 수는 없지만 다음 highScore에 포인터는 저장할 수 없기 때문에 직렬화 할 수 없습니다. 포인터는 동적으로 할당되고 프로그램 수명 동안 만 유효하기 때문에 파일에 저장할 수 없습니다.

이 솔루션에 실망한 경우 heaptree을 확인하면 몇 가지 (경우와 같이) 점수 이상에 대한 궁극적 인 효율성을 확인할 수 있습니다.

+0

-1 높은 점수 목록 인 경우 어쨌든 삽입 할 위치를 찾으려면 배열을 탐색해야합니다. LinkedList> 배열을 확인하십시오. 둘 다 순회가 필요하고, Array 또한 교대가 필요하며 LinkedList는 필요하지 않습니다. –

+0

두 경우 모두 동일한 복잡성을 초래합니다. 포인터의 배열을 가지고 있다면, memmove()가 빠르게 괴롭 히고 배열을 순회하는 것이 연결된리스트를 순회하는 것보다 빠르므로, 요소를 삽입하는 것이 더 빠를 것이다. –

+0

@SamDeHaan 이제 이것을 실제로 테스트했습니다. 그래서 C++로 코드를 작성했고 두 개의 데이터 구조를 사용했습니다. 목록 및 벡터. 벡터는 목록보다 약 3 배 빠릅니다. http://pastebin.com/2WFX58rA –

0

나는 당신의 접근 방식이 좋다고 생각합니다. 이를 위해 링크 된 목록을 사용하거나 큐 (연결된 목록을 사용하여 구현할 수 있음)를 만들 수도 있습니다.

0

연결 목록은 확실히이 작업을 수행하는 좋은 방법입니다. 그것은 점수와 관련된 데이터를 유지하고 일부 기본 부기로 최신 정보를 유지할 수 있습니다. 정렬을 유지하면 올바른 위치에 새로운 점수를 쉽게 삽입하고 링크 된 목록에서 너무 낮은 점수를 제거 할 수 있습니다.

또 다른 10 개 요소 각각의 이름에 대한 하나 점수 하나에 두 개의 배열을 유지하는 것입니다 그러나 이것은 몇 가지 단점이 있습니다 자세한 내용은 나중에

  1. 추가려고하는 경우를, 당신 ' 다른 배열이 필요하며, 더 중요한 것은
  2. 하나의 배열에서 수행해야하는 작업은 다른 배열에서도 수행해야하므로 나중에 다른 문제가 발생할 수 있습니다 (버그).

요약하면 해결책이 좋습니다.

+2

두 개의 다른 배열 대신에 최고급 레코드 배열을 사용할 수 있습니다. –

+0

링크 된 목록보다 구현하기가 더 쉽습니다. –

0

그냥 귀하의 요구 사항을 이해하기 :

  • 프로그램 실행을하고 점수는 점수를 읽을

  • 를 얻을 수있다 목록에 파일 및 이전의 최고 점수에 대해 새로운 점수를 확인

  • 목록을 수정하여 파일로 다시 작성하십시오.

  • 프로그램이 종료됩니다.

이것이 맞으면 링크 된 목록이 과도한 것처럼 보입니다. 배열은 잘 할 것입니다. 파일에서 배열로 각 항목을 읽고 새 점수를 삽입하십시오. 배열 전체를 포기하고 파일에 각 점수를 써 넣고 다시 새로운 점수를 삽입 할 수 있습니다. 그런 다음 파일의 이름을 변경하십시오 (scores.txt는 scores.bak이되고 scores.new는 scores.txt가됩니다). 이렇게하면 점수 파일의 백업본을 얻을 수 있습니다. 파일은 텍스트로 작성하는 것이 가장 좋습니다 (바이너리가 아님).

앞에서 설명한 것처럼 구조는 순수한 C 코드로 컴파일되지 않습니다. C++과 반대로 C로 작성하려면 컴파일러에서 C++을 거부하도록해야합니다. 그렇게하는 방법은 플랫폼에 따라 다르지만 scores.cpp 대신 scores.c라는 파일 이름을 지정하는 것이 좋습니다.

관련 문제