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

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

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

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

Q&A

解決済

1回答

5327閲覧

データを2次元配列変数に読み込み,小さい順 に並べ替え

Sade_ni

総合スコア7

C

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

0グッド

0クリップ

投稿2020/07/19 16:36

前提・実現したいこと

約 1000 人分の身長と体重のデータを2次元配列変数に読み込み、身長が小さい順 に並べ替える。ただし、身長と体重のデータはセットで並べ替えること

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

owata.c: 関数 ‘main’ 内:
owata.c:19:22: 警告: assignment to ‘int’ from ‘int *’ makes integer from pointer without a cast [-Wint-conversion]
19 | temp = h[i];
| ^
owata.c:20:22: エラー: assignment to expression with array type
20 | h[i] = h[i+1];
| ^
owata.c:21:24: エラー: assignment to expression with array type
21 | h[i+1] = temp;
| ^

該当のソースコード

C言語

1#include<stdio.h> 2int main(void) 3{ 4 int i, j, N; 5 int h[1000][2], temp; 6 for(i=0; scanf("%d",&h[i])!=EOF && i<1000; i++) 7 { 8 //printf("%d\n",h[i]); 9 } 10 N = i; 11 12 for(j=N-1; j>0; j--) 13 { 14 for(i=0; i<j; i++) 15 { 16 printf("%d %d\n", i, i+1); 17 if(h[i]>h[i+1]) 18 { 19 temp = h[i]; 20 h[i] = h[i+1]; 21 h[i+1] = temp; 22 } 23 } 24 } 25 for(i=0; i<N; i++) 26 { 27 printf("%6.1d", h[i]); 28 } 29 30 for(i=0;i<1000;i++) 31 { 32 for(j=0;j<2;j++) 33 { 34 h[i][j]= (i+1)*(j+1); 35 } 36 } 37 for(i=0;i<1000;i++) 38 { 39 40 for(j=0;j<2;j++) 41 { 42 43 printf("%3d",h[i][j]); 44 } 45 46 printf("\n"); 47 48 } 49return 0; 50}

試したこと

配列変数はできるのですが、データを2次元配列変数に読み込むことと小さい順に並び替え方が分かりません

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

while ( scanf( “%d”, &a ) != EOF )
回りくどいやり方になってしまうかもしれませんがこれを使って教えてください。

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

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

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

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

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

guest

回答1

0

ベストアンサー

データを2次元配列変数に読み込むことと小さい順に並び替え方が分かりません

2次元配列に読み込むのであれば、要素をひとつひとつ入れていくのが確実です。
小さい順に並べ替え、は、「身長」をソート対象として「身長,体重」の組をこれまた実直に並べ替えます。

while ( scanf( “%d”, &a ) != EOF ) を使って」縛りがありましたので、あえてそんなかたちで作ってみました。データとしては整数値の身長と体重を半角スペースで区切る、身長 体重\n1行を1人分としたものを想定しています。ソート方法としてはシンプルなバブルソートを自力で実装しています。

C

1#include <stdio.h> 2#define MAXNUM 1000 3 4int main() { 5 6 int h[MAXNUM][2]; 7 int i, j, N; 8 int v1, v2; 9 10 i = 0; 11 while (scanf("%d %d", &v1, &v2) != EOF) { 12 h[i][0] = v1; 13 h[i][1] = v2; 14 15 ++i; 16 if (MAXNUM <= i) { 17 break; 18 } 19 } 20 21 N = i; 22 printf("N=%d\n", N); 23 24 /* バブルソートで並び替え */ 25 for (i = 0; i < N - 1; i++) { 26 for (j = i + 1; j < N; j++) { 27 if (h[i][0] > h[j][0]) { 28 int t[2]; 29 t[0] = h[i][0]; 30 t[1] = h[i][1]; 31 h[i][0] = h[j][0]; 32 h[i][1] = h[j][1]; 33 h[j][0] = t[0]; 34 h[j][1] = t[1]; 35 } 36 } 37 } 38 39 for (i = 0; i < N; i++) { 40 printf("%4d: 身長=%d, 体重=%d\n", i + 1, h[i][0], h[i][1]); 41 } 42 43 return 0; 44}

確認用として簡単に10人分のデータを用意し、実行してみます。

sh

1$ cat data.txt 2170 80 3169 75 4150 70 5168 74 6175 79 7150 60 8151 62 9154 63 10154 62 11153 63 12 13$ gcc -Wall t18b.c 14$ ./a.out < data.txt 15N=10 16 1: 身長=150, 体重=70 17 2: 身長=150, 体重=60 18 3: 身長=151, 体重=62 19 4: 身長=153, 体重=63 20 5: 身長=154, 体重=62 21 6: 身長=154, 体重=63 22 7: 身長=168, 体重=74 23 8: 身長=169, 体重=75 24 9: 身長=170, 体重=80 25 10: 身長=175, 体重=79 26$

あえて残しておいたテーマ、残件としては

  • 身長ではソートしているが体重は意識していないので、同じ身長でも体重は昇順になるとは限らない。
  • 身長、体重は整数値。小数を扱うのであればscanfなどの書式設定文字列を変更する必要がある。

でしょうか。これらにも対応させたいのであれば、ぜひご自分で改修してみてください。

投稿2020/07/19 18:25

編集2020/07/19 18:36
dodox86

総合スコア9183

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

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

dodox86

2020/07/19 18:33

当初は質問者さんのコードをもとに修正しようと試みましたが、 for(i=0;i<1000;i++) { for(j=0;j<2;j++) { h[i][j]= (i+1)*(j+1); } } などの謎コードがありましたので、あえて新規で作ってみた次第です。
Sade_ni

2020/07/20 03:27

こんなに綺麗に書けることに感動してます。わかりやすく教えていただきありがとうございます。
dodox86

2020/07/20 03:32

お役に立てたようでよかったです。ぜひ、改善にも挑戦してみてください。ソートは、標準関数のqsortでもできます。1000件では目立った差が無いかもしれませんが、qsortの方が速いはずです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問