2016-10-14 10 views
0

좋아, 여기 내 문제가있다. 교사는 최종 점수에서 특별 보너스를 받기 위해 학생이 가지고있는 학생을 무작위로 선택해야하며,이를 위해 1에서 N까지 번호가 매겨진 N 개의 종이를 가방에 넣고 숫자 K를 무작위로 선택합니다 ; 수상한 학생은 학생 목록의 K 번째 학생이었습니다. 문제는 교사가이 정보가 포함 된 논문을 분실했기 때문에 어느 번호가 어떤 학생인지 알 수 없다는 것입니다. 그녀가 알고있는 것 : 모든 학생의 이름, 그리고 1에서 N까지의 숫자가 알파벳 순서에 따라 지정됩니다.알파벳 순서로 문자열 목록 정렬 (C)

입력으로 주어진 일련의 이름을 가져 와서 사전 순으로 정렬 한 다음 특별 보너스를 얻은 학생의 이름을 제공해야하지만 그렇게하는 데는 문제가 있습니다. 내가 작성한 프로그램은 첫 번째 이름을 제외한 모든 이름을 주문합니다. 내가 코드 :: 블록과 프로젝트를 실행할 때

은 또한 다음과 같은 경고가 나타납니다

  • 는 (라인 16) ISO C90 배열 가변 길이의 '[-Wvla]
  • (선 금지 13) ISO C90 혼합 선언을 금지하고 코드 [-Wpedantic]

가, 내가 잘못 여기서 뭐하는 거지 알려주세요와 이름 지정된 금액을하지 않고 이름을 정렬하는 더 좋은 방법이 있다면.

참고 : N과 K가 0 일 때 프로그램에서 입력 내용을 읽지 않아야합니다.

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
int main() 
{ 
    int n, k, i, j=0, aux, numMenorNome; 
    char str[]="zzzzzzzzzzzzzzzzzzzz", str2[]="zwyxzzzzzzzzzzzzzzzz"; 

    do 
    { 
     scanf("%d%d", &n, &k); 
     struct student 
     { 
      char nome[21]; /*name*/ 
      char nomes_ordenados[21]; /*array to put the names already sorted*/ 
     } s[n]; 

     for (i=0; i<n; i++) 
     { 
      scanf(" %s", s[i].nome); 
     } 

     for (i=0; i<n; i++) 
     { 
      aux = strcmp(str, s[i].nome); /*compares the string that would be the last in the alphabetical order ("zzzzzzzzzzzzzzzzzzzz") with the given names*/ 
      if(aux>0) 
      { 
       strcpy(str, s[i].nome); /*it gives me the name that comes first in alphabetical order */ 
       numMenorNome = i; /* identification number of the name that was obtained */ 
      } 
      if (i==(n-1)) 
      { 
       strcpy(s[j].nomes_ordenados,str); 
       printf("%s\n", s[j].nomes_ordenados); 
       strcpy(str, "zzzzzzzzzzzzzzzzzzzz"); 
       strcpy(s[numMenorNome].nome, str2); 
       j++; 
       i=0; /* restarts the loop in order to obtain the second name in alphabetical order, the third name, the fourth name and so on */ 
       if(j==n) 
        break; 
      } 
     } 
     printf("%s\n\n", s[k-1].nomes_ordenados); 

    } while (n!=0&&k!=0); 
    return 0; 
} 
+0

이'는 scanf ("% d 개 % d을", N, &k);'나에게 잘못된 것 같다. 프로그램이 n''의 끝과 k' '의 시작입니다 알아? 그리고 어떻게 당신은해야한다 보다 일관성있는 들여 쓰기/괄호 스타일을 사용하면 도움이되는 사람들이 읽는 것을 어렵게 만듭니다. – sergiol

+1

C99 이상의 표준을 사용하여 코드를 컴파일해야하기 때문에 두 가지 경고가 나타납니다. – ShadowRanger

+1

Side-note :'qsort '를 사용할 수 있습니까?이 문제는 [qsort를 사용하여 이름을 정렬하는 것이] 훨씬 간단합니다 (https://linux.die.net/man/3/qsort). 그냥 직접 K 번째 학생을 찾기 위해 색인을 붙일 수 있습니다. 또한이 "전체적인 이유가 없으면 두 개의 다른 이름을 가진 구조체"를 생략하고 배열을 저장할 수 있습니다 (가변 길이 또는 동적 할당 d)는'char *'의 배열을 정렬하고 (''strcmp''는 이미 정렬 함수로 존재합니다.) (https://linux.die.net/man/3/strcmp)) 거기에 있습니다. – ShadowRanger

답변

2

문자열 배열을 정렬하는 것은 간단합니다. 그냥 qsort 기존 비교 기능을 사용하여 (즉, strcmp)

예 :

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

#define NAMES 5 
#define NAME_LEN 10 

void print_names(char names[][10]) 
{ 
    int i; 
    for(i=0; i<NAMES; ++i) 
    { 
     printf("%s\n", names[i]); 
    } 
} 

int main(void) { 
    char names[NAMES][NAME_LEN] = { "xxx", "uuu", "ccc", "aaa", "bbb" }; 

    print_names(names); 
    printf("---------------------------------\n"); 

    qsort(names, NAMES, NAME_LEN, strcmp); 

    print_names(names); 

    return 0; 
} 
0

당신은뿐만 아니라 bubble sort 알고리즘을 사용할 수 있습니다!

#include <stdio.h> 
#include <string.h> 
int main(void) { 
// your code goes here 
char names[5][10] = { "xxx", "uuu", "ccc", "aaa", "bbb" }; 
char temp[10]; 
int i = 0, j; 
for(i; i < 5; i++) { 
    for(j = 0; j < 5; j++) { 
     if(strcmp(names[i], names[j]) < 0) { 
      strcpy(temp, names[i]); 
      strcpy(names[i], names[j]); 
      strcpy(names[j], temp); 
     } 
    } 
} 
for(i = 0; i < 5; i++) printf("%s\n", names[i]); 
return 0; 
}