2016-04-28 16 views
0

配列の値に基づいて配列に関連する文字列をソートしようとしていますが、何らかの理由でソート部分が動作しています。相互に関連して、いくつかの理由のためにそれらを印刷し、印刷は非常にランダムにcの文字列配列に関連する配列をソートする

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
int sorting(char name[][10],double average[],int size); 

int main() 
{ 
    double sales1[10],sales2[10],sales3[10],average[10],test,totalm=0,totalfm=0,test2;   
int i=0,j; 
char name[10][10],gender[10]; 
printf("Please input the name, the gender, and the sales for the\nfirst three months followed by a spacebar after each element\n"); 
scanf("%s %c %lf %lf %lf",&name[0],&gender[0],&sales1[0],&sales2[0],&sales3[0]); 
average[i]=(sales1[i]+sales2[i]+sales3[i])/3; 
while(strcmp(name[i],"enough")!=0) 
{ 
    i++; 
    printf("Please input the name, the gender, and the sales for the\nfirst three months followed by a spacebar after each element\n"); 
    scanf("%s %c %lf %lf %lf",&name[i],&gender[i],&sales1[i],&sales2[i],&sales3[i]); 
    average[i]=(sales1[i]+sales2[i]+sales3[i])/3; 
} 
sorting(name,average,i); 
j=i; 
while(i>=0) 
{ 
    if(gender[i]=='m') 
     totalm=totalm+average[i]; 
    else 
     totalfm=totalfm+average[i]; 
    i--; 
} 
    while(j>=0) 
    { 
    test2=strcmp(name[j],"enough"); 
    if(test2!=0) 
     printf("%s\t%f\n",name[j],average[j]); 
     j--; 
     } 
     printf("total male sales are %f\n",totalm); 
     printf("total female sales are %f\n",totalfm); 


    } 
int sorting(char name[][10],double average[], int size) 
{ 
int i=0; 
double temp; 
char ntemp[20][20]; 
while(i<=size) 
{ 
    if(average[i+1]>average[i]) 
     { 
      temp=average[i]; 
      strcpy(ntemp[i],name[i]); 
      average[i]=average[i+1]; 
      strcpy(name[i],name[i+1]); 
      average[i+1]=temp; 
      strcpy(name[i+1],ntemp[i]); 
     } 
    i++; 
} 
} 

おかげで出てきます!

+2

このようなコードは書かないでください。あなたは仲間を尊敬しなければなりませんし、そのようなコードを書くことはまさにそうではありません。より多くの空白とよりきれいな宣言を使用してください。 –

+0

'j = i; 一方(I> = 0) { 場合(性別[I] == 'M') ':最後の有効なデータインデックスを注意'のI - 1 ' – BLUEPIXY

+0

'(iは<=サイズ)しながら { 場合(平均[i + 1]>平均[i]) ':範囲外です。 – BLUEPIXY

答えて

0

これは有効な並べ替えではありません。 1つの要素を適切な位置にバブルします。ルックアップバブルソート:2つのループがあります。内側のループは現在の要素を移動し、外側のループは残りのすべての要素にループします。

バグの詳細については、他のコメントも投稿してください。私はあるとき、私はあなたが適用している並べ替えがあなたのソート機能

while(i<=size) 
{ 
    if(average[i+1]>average[i]) 
     { 
      temp=average[i]; 

の非常に最初の状態に間違っているように見えると思います

+0

うまく働いた!ありがとう! – Whiteheart

+0

しかし、私は女性/男性の合計で別の問題に直面していますが...欠陥を見ることができますか? – Whiteheart

1

は、条件を前提とサイズに等しいし、[I + 1]平均がポイントになりますあなたが設定していない値をゼロと言うことができます。 ので、これはあなたが常に最後のパスより1少ない反復バブルソートでこのコード

for(i=0;i<n;i++) 
    { 
    for(k=0;k<n-i-1;k++) 
    { 
    if(a[k]>a[k+1]) 
     { 
     temp=a[k]; 
     a[k]=a[k+1]; 
     a[k+1]=temp; 
     } 
    } 
    } 

を修正してみてください。 for more see here

+0

修正済み!助けてくれてありがとう! – Whiteheart

関連する問題