2013-08-27 2 views
1

나는 이름의 우선 순위 인 숫자로 된 텍스트 파일을 가지고 있습니다. 우선 우선 순위에 따라 텍스트 파일을 정렬하고 새 파일을 작성하려고합니다.두 번째 문자열로 배열 정렬

old 
name1 1 
name2 2 
name3 3 
name4 1 
name5 1 
name6 2 
name7 1 
name8 3 

new 
name 1 1 
name4 1 
name5 1 
name2 2 
name6 2 
name3 3 
name8 3 

나는 배열 이전 TEXTFILE를 얻기 위해 달성,하지만 난 우선 순위에 따라 해당 배열을 정렬와 붙어있어. 나는 파일을 다시 반복해서는 안되며 배열을 정렬 한 다음 새 정렬 된 배열을 새 텍스트 파일에 쓰고 싶습니다. 어떻게 진행해야합니까 ??

코드

#include <stdio.h> 
    #include <stdlib.h> 


typedef struct{ 
    int p; 
    char *name; 
}names; 

int main(void){ 
    FILE *old= fopen("old.txt", "r"); 
    FILE *new = fopen("new.txt", "w"); 

    char n[10]; 
    int i =0; 

    names *name= malloc(sizeof(names)); 

    for(i; i<count; i++){ 
     int p; 

     char *n= malloc(sizeof(char) * 4); 
     fscanf(old, "%s %i", n, &p); 

     names[i].name= n; 
     names[i].p= p; 

    } 
    int j=0; 

    for(i=0; i < count;i++){ 

    } 

    return 0; 
} 
+1

왜 C에서이 작업을 수행합니까? –

+0

잘 했어. 조각으로 테스트 한 결과 퍼즐의 일부를 해결할 수 있습니다. 다음 단계는 데이터 정렬 방법을 단어로 설명하는 것입니다. 요소 1과 2가 정렬되어 있습니까? 요소 2와 3이 예순으로 정렬되어 있습니까? 요소 3이고 정렬됩니다 - 아니요. 그렇다면 무엇을 할 것인가 ... 그럼 당신이 다음에 프로그램하고 싶은 것을 말로 표현하십시오. 그런 다음 질문에 넣고 시도하십시오. – dcaswell

+1

'fscanf (eerste, "% s % f", 이름, &prio);'조심하십시오.'prio'는'int'이고'float'을 스캔하고 있습니다. –

답변

1

제약 조건 중 하나가 자신의 정렬 알고리즘을 작성하는 것이므로 qsort()을 사용할 수 없다고 가정하면 여기에 있습니다.

무엇을 정렬해야합니까? job의 배열입니다.

정렬해야하는 키는 무엇입니까? job.prio.

어떻게 정렬하나요? 공통 선택, 삽입 또는 (eek) 버블 정렬이 가능합니다. (버블 정렬 경로를 내려 가면 적어도 섹시하고 칵테일 셰이커 정렬을 수행합니다.) job.prio 두 개를 모두 비교하면 두 개 모두 int입니다. 따라서 각각의 job 구조체의 위치를 필요에 따라 배열하십시오.

다음은 작동 할 선택 정렬 알고리즘입니다. Google에서 다른 사람들을 많이 찾을 수 있습니다.

void selectionSort (job* jobs, int size) { 

    int smallest; 
    job temp; 

    for (int i = 0; i < size - 1; i++) { 
     smallest = i; 
     for (int walk = i + 1; walk <= size - 1; walk++) { 
      if (jobs[walk].prio < jobs[smallest].prio) 
       smallest = walk; 
     } // end inner loop 
     temp = jobs[i]; 
     jobs[i] = jobs[smallest]; 
     jobs[smallest] = temp; 
    } // end outer loop 
    return; 
} 

매우 간단합니다. 그것은 이전의 선택 정렬과 같습니다. 그러나 선택 정렬은 지루합니다. 선택 정렬을 사용하면 배열의 요소를 바꾸는 방법에 대한 일반적인 아이디어를 얻으므로 삽입 정렬을 시도하십시오.

여러분의 코드에는 다른 문제가 있습니다. 여러분의 배열에 하나의 작업만을위한 공간을 할당하고 있지만 8 개가 필요합니다. 정의되지 않은 변수는 eerste과 같습니다. name이 두 번 선언되었으므로 한 번은 char*으로, 한 번은 char의 배열로 선언되었습니다. 그래서 많은 정리가 있지만, 이제는 과제를 끝내기에 충분한 아이디어가 있습니다.

1

당신은 qsort() 표준 라이브러리 함수를 사용하여 분류한다.

정렬을 제공하기 위해 두 개의 job 구조를 비교하는 함수를 구현해야합니다.

static int compare_jobs(const void *a, const void *b) 
{ 
    const job *ja = a, *jb = b; 

    return ja->prio < jb->prio ? -1 : ja->prio > jb->prio; 
} 

당신은 제대로이 전화를해야합니다 (설명서를 읽어!), 다음 배열을 통해 루프 새 파일에 내용을 쓰기 :

여기에 하나 개의 시도이다.

+1

Qsort는 libc (stdlib.h)의 일부이고 이미 stdlib.h의 일부인 malloc을 사용하고 있으므로 추가 라이브러리가 필요하지 않습니다. – fhahn

관련 문제