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

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

新規登録して質問してみよう
ただいま回答率
85.37%
C

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

ソート

複数のデータを、順序性に従って並べ替えること。 データ処理を行う際に頻繁に用いられ、多くのアルゴリズムが存在します。速度、容量、複雑さなどに違いがあり、高速性に特化したものにクイックソートがあります。

データ構造

データ構造とは、データの集まりをコンピュータの中で効果的に扱うために、一定の形式に系統立てて格納する形式を指します。(配列/連想配列/木構造など)

Q&A

解決済

1回答

15089閲覧

c言語 構造体 身長、名前を昇順にソート

kelt22

総合スコア46

C

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

ソート

複数のデータを、順序性に従って並べ替えること。 データ処理を行う際に頻繁に用いられ、多くのアルゴリズムが存在します。速度、容量、複雑さなどに違いがあり、高速性に特化したものにクイックソートがあります。

データ構造

データ構造とは、データの集まりをコンピュータの中で効果的に扱うために、一定の形式に系統立てて格納する形式を指します。(配列/連想配列/木構造など)

0グッド

0クリップ

投稿2020/01/15 13:35

前提・実現したいこと

身長、名前をキーボードから入力して身長の昇順にソートするか、名前の昇順(文字数)にソートするか選べるようにするプログラムをつくりたいです。

発生している問題・エラーメッセージ

関数sort_by_nameが間違っているため、名前の昇順がうまくいかないのですがどこが間違っているかわかりません。

該当のソースコード

#include<stdio.h> #include<string.h> #define NAME_LEN 64 #define NUMBER 5 typedef struct { char name[NAME_LEN]; int height; float weight; long schols; }student; void swap_student(student *x,student *y){ student temp=*x; *x=*y; *y=temp; } void sort_by_height(student a[],int n){ int i,j; for(i=0;i<n;i++){ for(j=n-1;j>i;j--){ if(a[j-1].height>a[j].height){ swap_student(&a[j-1],&a[j]); } } } } void sort_by_name(student a[],int n){ int i,j; for(i=0;i<n;i++){ for(j=n-1;j>i;j--){ if(strcmp(a[j-1].name,a[j].name)>0){ swap_student(&a[j-1],&a[j]); } } } } int main(void) { int i; int j; student a[NUMBER]; for(i=0;i<NUMBER;i++){ printf("name:");scanf("%s",a[i].name); printf("height:");scanf("%d",&a[i].height); printf("weight:");scanf("%f",&a[i].weight); printf("schols:");scanf("%ld",&a[i].schols); } do{ printf("height or name:0 or 1");scanf("%d",&j); }while(!(j==0||j==1)); if(j==0){ sort_by_height(a,NUMBER); }else{ sort_by_name(a,NUMBER); } for(i=0;i<NUMBER;i++){ printf("%-8s,%6d%6.1f%7ld\n",a[i].name,a[i].height,a[i].weight,a[i].schols); } return 0; } ``` ### 試したこと ### 補足情報(FW/ツールのバージョンなど) ここにより詳細な情報を記載してください。

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

shiracamus

2020/01/15 14:01

できてるように思えるのですが、どんな名前を入力したときにどんな順番で表示されますか?
kelt22

2020/01/15 14:10

sato sanaka takao mika masakiの順で入力した結果、sato sanaka takao mika masakiの順で出力されました。
shiracamus

2020/01/15 14:22

私の環境では masaki mika sanaka sato tanaka の順で表示されましたよ。
guest

回答1

0

ベストアンサー

c

1int main(void) { 2 int i; 3 student a[NUMBER]; 4 strcpy(a[0].name, "sato"); 5 strcpy(a[1].name, "sanaka"); 6 strcpy(a[2].name, "takao"); 7 strcpy(a[3].name, "mika"); 8 strcpy(a[4].name, "masaki"); 9 10 sort_by_name(a,NUMBER); 11 12 for(i=0;i<NUMBER;i++){ 13 printf("%s\n",a[i].name); 14 } 15 return 0; 16}

text

1masaki 2mika 3sanaka 4sato 5takao

となりました.

ご提示のコードをちゃんとコンパイルされていますか.
もしくは間違えて身長でソートしていませんか.

投稿2020/01/15 14:27

jimbe

総合スコア13168

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kelt22

2020/01/16 04:18

strcmp関数の理解が間違っていました。丁寧に検証いただきありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.37%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問