質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.60%

ソート 並び替え 文字列

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 330

ritsu.m

score 15

成績の平均点に応じて学籍番号、名前を降順に表示させたい

ここに質問の内容を詳しく書いてください。

テキストファイルを読み込みその読み込んだ値を元に平均点を計算、平均点の順位によって、学籍番号、名前、平均点を降順で表示させるプログラムを作りたいと思っています
コンパイル時にエラーメッセージが出ますが調べた結果これはエラーではなく警告だということがわかったので、そのまま実行しましたが、平均点は降順に表示されているものの学籍番号、名前がバラバラに表示されてしまいます。

発生している問題

1,Kongo 75.666664
2,Kirishima 75.000000
3,Myoukou 76.333336
4,Cyokai 80.000000
5,Atago 80.666664
6,Ashigara 76.000000
7,Maya 81.333336
8,Haguro 79.666664
平均点順にソートしました

順位 学籍番号 氏名 平均点
1:7,,81.333336
2:5,Kirishima,80.666664
3:4,Myoukou,80.000000
4:8,Cyokai,79.666664
5:3,Atago,76.333336
6:6,Ashigara,76.000000
7:1,Maya,75.666664
8:2,Haguro,75.000000


ファイルの読み込みはできているのですがソートすると1位の名前が表示されずさらに学籍番号と名前にズレが見られます

エラーメッセージ

aaa.c:70:21: warning: incompatible pointer types passing 'char [8][128]' to parameter of type 'char (*)[20]' [-Wincompatible-pointer-types]
    bubblesort(s,NO,name,ga);
                    ^~~~
aaa.c:27:53: note: passing argument to parameter 'str' here
void bubblesort(float numbers[],int array_size,char str[][20],int ku[])
                                                    ^

該当のソースコード

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define NO 8

void irekaeno(float *x,float *y){
    float temp=*x;
    *x=*y;
    *y=temp;
}

void irekaeno2(int *x,int *y){
    int temp=*x;
    *x=*y;
    *y=temp;
}

void irekaena(char *sx,char *sy){
    char temp[20];

    strcpy(temp,sx);
    strcpy(sx,sy);
    strcpy(sy,temp);
}


void bubblesort(float numbers[],int array_size,char str[][20],int ku[])
{
    int i,j,temp;

    for(i=0;i<(array_size-1);i++){
        for(j=(array_size-1);j>i;j--){
            if(numbers[j-1]<numbers[j]){
                irekaeno(&numbers[j-1],&numbers[j]);
                irekaena(str[j-1],str[j]);
                irekaeno2(&ku[j-1],&ku[j]);
            }
        }
    }
}

int main(void){
    FILE *fp;
    int i;
    char str[20];
    float f1;
    float f2;
    float f3;
    float f4;
    float s[NO];
    int bc;
    char name[NO][128];
    int ga[NO];
    fp = fopen("uuuo.txt","r");
    if(fp == NULL){
        printf("ファイルオープン失敗\n");
        return -1;
    }

    for(i=0;i<NO;i++){
        fscanf(fp, "%f,%127[^,],%f,%f,%f", &f1, str ,&f2, &f3, &f4);

        s[i]=(f2+f3+f4)/3;
        strcpy(name[i], str);
        ga[i]=(f1);
        printf("%d,%s %f\n",ga[i],name[i],s[i]);

    }

    bubblesort(s,NO,name,ga);
    puts("平均点順にソートしました\n");
    puts("順位 学籍番号 氏名 平均点");
    for(i=0;i<NO;i++){
        printf("%d:%d,%s,%f\n",i+1,ga[i],name[i],s[i]);
    }



    return 0;




}

テキストファイル

1,Kongo,72,94,61
2,Kirishima,90,65,70
3,Myoukou,93,68,68
4,Cyokai,68,88,84
5,Atago,77,100,65
6,Ashigara,60,86,82
7,Maya,82,92,70
8,Haguro,83,92,64

期待される出力値

1:7,maya,81.3
2:5,atago,80.6
3:cyokai,80
4:8,haguro,79.6
5:6,ashigara,78.6
6:3,myoukou,76.3
7:1,kongo,75.6
8:2,kirishima,75

補足情報(FW/ツールのバージョンなど)

mac
visual studio code
c言語

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • cateye

    2020/01/26 19:26

    構造体にしないのは何故でしょう?

    キャンセル

  • ritsu.m

    2020/01/26 19:27

    構造体を用いずに実現するという課題なので構造体は使っていません

    キャンセル

回答 1

checkベストアンサー

+1

void bubblesort(float numbers[],int array_size,char str[][20],int ku[])

void bubblesort(float numbers[],int array_size,char str[][128],int ku[])
にしてください。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/01/27 20:29

    できました!
    ありがとうございます!

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.60%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る