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

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

ただいまの
回答率

90.51%

  • C

    3707questions

    C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

選択ソート うまくできません

受付中

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 87

taro2233

score 1

struct slist seiseki[7] = {{1, "Ito", {65, 55, 80}, 0},
{2, "Kato", {30, 40, 50}, 0},
{3, "Tanaka",{65, 85,100}, 0},
{4, "Suzuki",{85,90, 65}, 0},
{5, "Yamada",{20, 50, 80}, 0},
{6, "Takada",{90, 30, 40}, 0},
{7, "Sato",{50, 70, 55}, 0}};
この構造体の点数の合計点を上から高い順にソートするプログラムを作っています。

#include<string.h>

struct slist{
    int num; /* 番号 */
    char name[20]; /* 名前 */
    int ten[3]; /* 各科目の点数(3科目) */
    int total; /* 合計点 */
};

int main(void){
    /*変数宣言と配列の初期値設定*/
    int i,j,jmax,totalmax,nummax;
    int N=7,M=3,K=6; /* N:学生数, M:科目数 K:項目数*/
    char a[7];
    char b[20];
    struct slist seiseki[7] = {{1, "mike", {23, 55, 49,81}, 0},
                              {2, "tag", {56, 35, 50,92}, 0},
                              {3, "hiro",{79, 85,32,63}, 0},
                              {4, "kaito",{89,90, 19,92}, 0},
                              {5, "Ymeg",{19, 34,34,37}, 0},
                              {6, "kinto",{39, 11, 68,12}, 0},
                              {7, "eri",{29, 10, 29,27}, 0}};
    char hyodai[6][7]={"No.","Name","Eigo","Sugaku","Buturi","Total"};


    /*表題の表示*/
    printf("------------------------------------------------\n");
    printf(" Original Data\n");
    printf("------------------------------------------------\n");
    for(i=0;i<K;i++){
        printf("%8s",hyodai[i]);
    };
    printf("\n");

    for (i = 0; i < N; i++) {
        printf("%8d%8s", seiseki[i].num, seiseki[i].name);

        for (j = 0; j < M; j++) {
            printf("%8d", seiseki[i].ten[j]);
            seiseki[i].total += seiseki[i].ten[j];
        }
        printf("%8d\n", seiseki[i].total);
    }



    for (i = 0; i < N - 1; i++) {

            totalmax = seiseki[i].total;
            jmax= i;


            /* 最大値を求める*/
            for (j = i + 1; j < N; j++) {

                if (totalmax < seiseki[j].total) {
                    jmax = j;
                    totalmax = seiseki[j].total;
                }
                nummax = seiseki[jmax].num;
                strcpy(a,seiseki[jmax].name);
            strcpy(b,seiseki[jmax].ten);
            }

            /* 最大値(jmax番目)のデータとi番目のデータを交換*/
            seiseki[jmax].total = seiseki[i].total;
            seiseki[i].total = totalmax;
            seiseki[jmax].num = seiseki[i].num;
            seiseki[i].num = nummax;
            strcpy(seiseki[i].name,seiseki[jmax].name);
            strcpy(a,seiseki[i].name);
            strcpy(seiseki[i].ten,seiseki[jmax].ten);
            strcpy(b,seiseki[i].ten);
    }
        /*並ぎ替え後の合計点の表示 */
        printf("--------------------------\n");
        printf("並び替えデータ\n");
        printf("--------------------------\n");
        for(i=0;i<K;i++){
                printf("%8s",hyodai[i]);
            };
            printf("\n");

        for (j = 0; j < N; j++) {
            printf("%5d%5s%5d%5d\n", seiseki[j].num, seiseki[j].name,seiseki[j].ten, seiseki[j].total);
        }

        return (0);
    }


としましたが実行結果に同じ名前が複数出たり、素点がうまく表示されないなどとうまくいきません。
どのように直せばいいのか教えてください。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 1

0

tenをstrcpyでコピーしてるのが問題です。
memcpyを使いましょう。

というか、

    char a[7];
    char b[20];


の代わりに

    struct slist tmp;


を用意して

    tmp = seiseki[jmax];


でいいです。


追記
表示部分が間違ってますね

printf("%8d%8s%8d%8d%8d%8d\n", seiseki[j].num, seiseki[j].name,seiseki[j].ten[0],seiseki[j].ten[1],seiseki[j].ten[2], seiseki[j].total);

追記その2
aとbのサイズが逆です。

また、strcpyの引数は
strcpy(コピー先,コピー元);
です。
このため

            strcpy(seiseki[i].name,seiseki[jmax].name);
            strcpy(a,seiseki[i].name);



[i] ← [jmax]
a ←[i]
なってしまいます。

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/10/14 01:14

    ありがとうございます。
    どうしてscrcpyではだめなのでしょうか?

    キャンセル

  • 2018/10/14 01:16

    strcpyは受け取ったアドレスから'\0'までをコピーするからです

    キャンセル

  • 2018/10/14 01:31

    素点のコピーの時のみmemcpyなのですね。
    書き直していますが同じ名前が複数表示されてしまいます。。。

    キャンセル

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

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

関連した質問

  • 受付中

    C言語 線形リスト

    初歩的な質問で非情に申し訳ないのですがどなたかお力添えをして頂けないでしょうか。 下記のコードの機能を新規作成、追加、ソートに変更したいのですが一向にうまくいかず、詰まっている状

  • 解決済

    cp -r コマンドのC言語による実装

    前提・実現したいこと ls -r コマンドのC言語のソースコードを参考にして cp -r コマンドを実装しているのですが どこを変えていいのかわかりません… 該当のソー

  • 解決済

    linux 処理時間の表示

    C言語でLinuxを使っています。メモリを確保したりするプログラムなのですが、以下のプログラムを修正して 、5秒間で何回の入れ替えを行えるかを計測できるようにしてもらいたいです。初

  • 解決済

    オーバーフローします...

    前提・実現したいこと アルファベット順に表示したいです どうやったらアルファベット順に表示できますか? もし,このままでいいならオーバーフローを直して欲しいです... アル

  • 解決済

    C言語で都道府県を表示するプログラムで、選択ソートが機能していません

    名前、面積、人口、人口密度からなる構造体を配列で宣言し、テキストファイルから都道府県名、人口、面積を読み取って、そこから人口密度を計算し、配列に代入したら、人口密度でソート(選択ソ

  • 解決済

    センサーを繋いだarduinoとのシリアル通信をCかC++で行いたいです。

    題名に書いた通りですが、シリアル通信でC言語でセンサーからの出力値を得たいです。 まずarduino側のコードを載せます。 #define FPS 20 unsigned lo

  • 受付中

    リスト構造と待ち行列

    リスト構造と待ち行列をしたいのですが、よくわかりません。 おすすめのサイトや説明おねがいします。 #include <stdio.h> #include <stdlib.h>

  • 受付中

    構造体についての質問

     前提・実現したいこと main関数内にある構造体をmain関数の下に出しても正常に動作するようにしたいです  該当のソースコード #include "syain.h" #in

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

  • C

    3707questions

    C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。