2012-08-09 3 views
1

"name surname midterm1"을 정렬하는 등급의 정렬 함수를 사용하려고하지만 이름 배열과 성 문자열을 임시 배열에 할당하는 방법을 생각할 수 없습니다. 어떤 아이디어? int 값을 정렬문자열을 무언가에 할당

void student_swap(struct student *x){ 
    int z,y,temp; 
    char temp2[15]; 
    for(z=0; z<10; z++){ 
     for(y=0; y<9; y++){ 
      if(x[y].mid1>x[y+1].mid1){ 
       temp = x[y+1].mid1; 
       x[y+1].mid1 = x[y].mid1; 
       x[y].mid1 = temp; 

       strcpy (temp2,x[y+1].name); 
       strcpy (x[y+1].name,x[y].name); 
       strcpy (x[y+1].name,temp2); 
       strcpy (temp2,x[y+1].surname); 
       strcpy (x[y+1].surname,x[y].surname); 
       strcpy (x[y+1].surname,temp2); 

      } // if 
     } // for 
    } // for 
} //student_swap 

잘 작동하지만 strcpy는 아무것도 실시하지 않습니다. 이 내 아웃

for (i=9;i>=0;i--){ 
    ; 
    printf ("%s %s %d\n",x[i].name,x[i].surname,x[i].mid1); 
} 
printf ("\n"); 

     student_swap(x); 

    for (i=9;i>=0;i--){ 
    ; 
    printf ("%s %s %d\n",x[i].name,x[i].surname,x[i].mid1); 
} 

코드

를 넣어이며,이 내 출력

murat hot 73 
mehmet umur 72 
idil saracoglu 55 
ecem bektas 75 
sevde pir 70 
asli devecioglu 65 
can akkurt 45 
levent dogan 60 
anil erdiz 30 
ali durmus 40 

murat hot 75 
mehmet umur 73 
idil saracoglu 72 
ecem bektas 70 
sevde pir 65 
asli devecioglu 60 
can akkurt 55 
levent dogan 45 
anil erdiz 40 
ali durmus 30 
+0

strcpy는 아무 작업도 수행하지 않습니까? strcpy에 대한 테스트를 작성 했습니까? 디버거를 사용하고 있습니까? –

+0

예, 저는 프로그래밍에 익숙하지 않고 디버거를 사용하는 방법을 모르겠습니다. 나머지 코드, 입력 및 출력을 게시하고 있습니다. – Cagurtay

+0

aside : 'x, y, z'와 같은 변수 이름은 읽기가 어렵습니다. 특히'x'가'y'와'z'와는 다른 타입이고,'x'가 인수이고'y, z'가 자동화 인 경우 더욱 그렇습니다. 'temp'와'temp2'도 마찬가지입니다. 'temp' 자체는 괜찮지 만,'temp2' 등 (그리고 또 다른 종류)을 가지고 시작할 때, 나중에 읽는 것이 어렵고 무슨 일이 일어나고 있는지 알게됩니다. – ArjunShankar

답변

3

그것이 있어야하지 않나요입니다 :

strcpy (temp2,x[y+1].name); 
    strcpy (x[y+1].name,x[y].name); 
    strcpy (x[y].name,temp2); // <-- note the index used 

?

마찬가지로성에 대해서도 마찬가지입니다.

+0

오 ..... 고맙습니다. 마이클이 고쳐주었습니다. – Cagurtay

+0

@ChağatayCanKarmahmetoğlu - StackOverflow에 오신 것을 환영합니다. 대답이 당신을 위해 작동하는 경우에, 당신은 그것을 "정확한"표시하는 것을 고려해야한다. [방법은 다음과 같습니다] (http://meta.stackexchange.com/a/65088/179533). – ArjunShankar

+0

감사합니다. – Cagurtay

0

프로그래밍을 배우고있을 때 스스로 정렬을 구현하는 것이 좋습니다. 그러나 생산적인 코드를 작성할 때 휠 재발 명을 피하는 것이 항상 좋습니다. 예를 들어, stdlib.h과 함께 제공되는 qsort을 사용할 수 있습니다.

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

struct student { char name[100]; char surname[100]; int mid1;}; 

int compare_students (const void *a, const void *b) 
{ 
    struct student *sa, *sb; 
    sa = (struct student *) a; 
    sb = (struct student *) b; 

    if (sa->mid1 > sb->mid1) 
    return -1; 
    if (sa->mid1 == sb->mid1) 
    return 0; 

    return 1; 
} 

int main (void) 
{ 
    int i; 
    struct student s[4] = { 
          {.name = "a", .surname = "e", .mid1 = 10}, 
          {.name = "b", .surname = "f", .mid1 = 20}, 
          {.name = "c", .surname = "g", .mid1 = 99}, 
          {.name = "d", .surname = "h", .mid1 = 70} 
         }; 
    qsort (s, 4, sizeof (struct student), compare_students); 
    for (i = 0; i < 4; i++) 
    printf ("%s %s: %d\n", s[i].name, s[i].surname, s[i].mid1); 
    return 0; 
} 
+0

이것은 나의 숙제 였고 우리는 우리의 기능을 만들고 그것을 사용하라는 요청을 받았습니다. – Cagurtay

+0

@Cagurtay - 완전히 이해합니다. 그래서 내가 '* 생산적 코드를 작성할 때 *'라고 말한 것입니다. 나는이 답변을 써서 다른 사람들이 그들 자신의 일종의 글을 쓰려고 노력하기 때문에 이것을 보았다. – ArjunShankar

관련 문제