2016-10-14 11 views
0

これは私の問題です。先生は最終的な得点で特別なボーナスを得るために(彼女が持っている学生から)生徒をランダムに選択しなければならず、そのために1からNまでのN枚の紙を袋に入れ、 ;受賞した学生は学生リストのK番目の学生でした。問題は、先生がこの情報を含む論文を失ったために、どの番号がどの生徒に対応しているのかわからないことです。彼女が知っているもの:すべての生徒の名前と、その番号(1からNまで)は、アルファベット順に割り当てられます。アルファベット順の文字列リストの並べ替え(C)

入力として与えられた名前のセットを取得し、アルファベット順にソートして、特別ボーナスを獲得した学生の名前を指定する必要がありますが、問題があります。私が書いたプログラムは最初のものを除くすべての名前を注文します。

  • (ライン16)ISO C90は
  • [-Wvla]配列変数の長さ 's' を禁じ(ライン:私はコード::ブロックでプロジェクトを実行すると

    また、次の警告が表示されます13)ISO C90は混在宣言とコードを禁止しています。

私はここで間違っていますか、指定された量の名前を持たずに名前を並べ替えるより良い方法があれば教えてください。

注:NとKがゼロに等しいとき、プログラムは入力の読み込みを停止する必要があります。

#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以降の(C11)標準でコードをコンパイルする必要があるため、2つの警告が表示されます。 – ShadowRanger

+1

サイドノート: 'qsort'を使用することは許可されていますか?この問題は[qsortで名前をソートする](https://linux.die.net/man/3/qsort)より簡単です。あなたはまた、Kthの学生を見つけるために直接インデックスを作成することもできます。スキップして配列を格納するだけです(可変長または動的に割り当てる( '' 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; 
} 
関連する問題