2017-10-19 20 views
0

コード内の関数sorteraFを見ると、型structの配列をソートしようとしています。私はnameタイプのcharとvarunummerタイプintの両方でこれをしたいと思います。しかし、それは動作していません。名前の後にソートするには、私もsortAfterNamesを使っていましたが、どちらもうまくいきません。 (ここで車輪の再発明しない理由)qsort()を使用しないための方法をstruct - int型とchar型の配列をソートするには?

   //lager program lab 
      #include <stdio.h> 
      #include <stdlib.h> 
      #include <string.h> 
      #define WORDLENGTH 30 
      #define MAX 10 

      struct varor{ //VAROR STANDS FOR GOODS---------- 
       int varunummer; 
       char namn[WORDLENGTH]; 
       int lagersaldo; 
      }; 
      typedef struct varor Vara; 

      Vara createVara(int varunummer, char namn[], int lagersaldo){ //CREATE THE GOODS 
       Vara v; 
       v.varunummer=varunummer; 
       strcpy(v.namn, namn); 
       v.lagersaldo=lagersaldo; 
       return v; 
      } 
      //register 
      void regVaror(Vara reg[], int *pNrOfGoods){ //REGISTER THE GOODS 

       char confirm; 
       char namn[WORDLENGTH], 
         tmp[WORDLENGTH]; 
       int varunummer, lagersaldo; 
       printf("\nAre you sure you want to register new goods?\n1: YES - (continue)\n2: NO - (go back to menu)\n"); 
       scanf(" %c%*c", &confirm);// choose 
       switch(confirm){ 
       case '1': 
       do{ 
        printf("Enter varunummer:");//varunummer stands for identify number of the good 
        gets(tmp); 
        varunummer=atoi(tmp); 

        printf("Enter name:"); 
        gets(namn); 

        printf("Enter Availability:"); 
        gets(tmp); 
        lagersaldo=atoi(tmp); 

        reg[*pNrOfGoods]=createVara(varunummer,namn,lagersaldo); 
        (*pNrOfGoods)++; 
        printf("\nRegister more goods?\n1: YES - (continue)\n2: NO - (go back to menu)\n"); 
        scanf(" %c%*c", &confirm); 
       }while(confirm=='1'); 

       case '2': break; 

       } 
      } 
      //PRINTING THE GOODS --------- 
      void printVara(Vara reg[], int nrOfGoods){ 
       int x; 
       printf("\nVarunummer \t Namn \t\t\t Lagersaldo\n"); 
       for(x=0;x<nrOfGoods;x++){ 
        printf(" %d \t\t %s \t\t\t %d\n",reg[x].varunummer,reg[x].namn,reg[x].lagersaldo); 
       } 
      } 
    //SORTING THE GOODS--------- 
      void sorteraF(Vara reg[], int length){ 
       int i, j; 
        struct varor tmp; 
        for (i = 0; i < (length-1); i++){ 
         for (j = 0; j < (length -1- i); j++){ 
          if (reg[i].varunummer < reg[i + 1].varunummer){ 
           tmp = reg[j]; 
           reg[j] = reg[j + 1]; 
           reg[j + 1] = tmp; 
          } 
         } 
        } 
      } 
void sortAfterName(reg[]){ 
int i,j; 
     char tmp[MAX]; 
     for(i=0;i<MAX;i++){ 
      for(j=i+1; j<MAX;j++){ 
       if(strcmp(reg[i].namn, reg[i+1].namn) >0){ 
        tmp=reg[i]; 
        reg[i]=reg[i+1]; 
        reg[i+1]=tmp[i]; 
        } 
       } 

      int main(){ 
       int run=1; 
       Vara vRegister[MAX]; 
       int nrOfGoods=0; 
       while(run){ 
        char choice; 
        printf("\n\t\tMeny - Lager Program\n\n\ 
        (1) Regrister new varor\n\b\b\b\b\ 
        (2) Print all varor\n\ 
        (3) Sort varor\n\ 
        (4) Avsluta programmet\n"); 
        scanf(" %c%*c", &choice); 

        if(choice=='1') regVaror(vRegister, &nrOfGoods); 
        if(choice=='2') printVara(vRegister, nrOfGoods); 
        if(choice=='3') sorteraF(vRegister, MAX); 
        else if(choice=='4') run=0; 

        printf("\n\nNumber of varor: %d\n", nrOfGoods); 


       } 
       return 0; 
      } 
+2

['qsort()'](https://linux.die.net/man/3/qsort)を使用しない特定の理由はありますか? –

+0

@FelixPalmen私はそれを使う方法を知らないが、私はこの時点で何かのためにダウンしている。 –

+1

@KevinPunkt _私はそれを使用する方法を知らない - > google "qsort sample" –

答えて

3

概要:

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

#define WORDLENGTH 30 

struct varor 
{ 
    int varunummer; 
    char namn[WORDLENGTH]; 
    int lagersaldo; 
}; 
typedef struct varor Vara; 

// comparison function for qsort, just compare the names with strcmp: 
static int compareByName(const void *v1, const void *v2) 
{ 
    return strcmp(((const Vara *)v1)->namn, ((const Vara *)v2)->namn); 
} 

// the same for the numbers 
static int compareByNumber(const void *v1, const void *v2) 
{ 
    int n1 = ((const Vara *)v1)->varunummer; 
    int n2 = ((const Vara *)v2)->varunummer; 
    if (n1 < n2) return -1; 
    if (n1 > n2) return 1; 
    return 0; 
} 

int main(void) 
{ 
    Vara v[100]; 

    // populate v with data 

    // to sort by name: 
    qsort(v, sizeof v/sizeof *v, sizeof *v, compareByName); 

    // to sort by number: 
    qsort(v, sizeof v/sizeof *v, sizeof *v, compareByNumber); 
} 

sizeof v/sizeof *vここで(おそらくあなたのコード例では、ここ10 100)の要素の全体数になり - - の配列全体をに配置しない場合は、の数字を要素に渡します。

+0

これは私がこのプロジェクトのために思っているレベル以上です。そして、私がこれを使ったりバブルソートをしたりするとコンパイルされますが、ソートして表示するとすべてが0に置き換えられます。 –

+0

@KevinPunktコピー&ペーストすれば、それにもかかわらず、 'qsort()'を使うのは**最も簡単な**メソッドです。独自のソートアルゴリズムを実装することは、常により多くの作業になります(したがって**バグを**より多く導入する可能性が高くなります) –

関連する問題