Sortieren einer Liste von Strings in Alphabetischer Reihenfolge (C)

Ok, hier ist mein problem. Ein Lehrer hat, um nach dem Zufallsprinzip wählen Sie eine Schülerin (der Schüler hat Sie) verdienen einen besonderen bonus in der Endwertung und um das zu tun, Sie legt N Stück Papier nummeriert von 1 bis N in einer Tasche, und nach dem Zufallsprinzip wählen Sie eine Nummer K; der preisgekrönte student war der K-te student in die studentische Liste. Das problem ist, dass die Lehrer nicht wissen, welche Nummer entspricht, auf die Schüler, denn Sie verlor das Papier enthielt diese information. Was Sie weiß: die Namen aller Schüler, und, die, Ihre zahlen von 1 bis N zugeordnet sind, gemäß der alphabetischen Reihenfolge.

So, ich brauche, um den Satz von Namen, die gegeben wird, als Eingabe, Sortieren Sie alphabetisch und geben Sie dann den Namen der Schüler, die gewonnen haben, den speziellen bonus, aber ich habe Schwierigkeiten, dies zu tun. Das Programm, das ich schrieb Bestellungen alle Namen außer dem ersten.

Darüber hinaus sind die folgenden Warnungen werden angezeigt, wenn ich das Projekt mit Code::Blocks:

  • (Zeile 16) ISO-C90 verbietet array variabler Länge 's' [-Wvla]
  • (Zeile 13) ISO-C90 verbietet gemischte Deklarationen und code [-Wpedantic]

Bitte, sagen Sie mir, was mache ich hier falsch, und wenn es einen besseren Weg, um die Sortierung der Namen ohne die angegebene Menge von Namen.

Hinweis: das Programm sollte jetzt aufhören zu Lesen die Eingabe, wenn N und K sind gleich null.

#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;
}
  • scanf("%d%d", &n, &k); scheint mir falsch zu sein. Wie kann das Programm wissen, wo ist das Ende der n und der Anfang k? Und Sie sollte eine einheitlichere Einrückung/Klammern-Stil; sonst sind Sie so schwierig die Lektüre von Menschen, die helfen wollen, Sie.
  • Die zwei Warnungen, die Sie bekommen werden, weil Sie benötigen, kompilieren Sie Ihren code unter die C99 oder später (C11) standard.
  • Seite-Hinweis: Sie dürfen verwenden qsort? Da dieses problem sehr viel einfacher mit qsort Sortierung der Namen, so können Sie nur direkt index zu finden, den Kth-Studenten. Man könnte auch überspringen, diese ganze "struct mit zwei verschiedenen Namen in es für keinen guten Grund" schtick und speichern nur ein array (Länge variabel oder dynamisch zugeordnet) von char* Sortieren Sie sagte, array (strcmp existiert bereits als eine Art Funktion) und du bist da.
  • kein problem, standardmäßig sind die meisten format-Bezeichner werden skip whitespaces vor dem Lesen den Wert, so setzen Sie einfach einige Räume zwischen Ihnen
InformationsquelleAutor lleao | 2016-10-14
Schreibe einen Kommentar