🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
C

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

Q&A

解決済

3回答

2339閲覧

構造体同士の比較の仕方

hikaru_love_n

総合スコア16

C

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

0グッド

0クリップ

投稿2019/11/20 23:57

編集2019/11/21 04:21

下記のようなエラーがでて、構造体同士の比較はどのようにしたらいいのかわかりません。

エラー: 二項演算子 < への無効な被演算子です (‘record_t {aka struct <無名>}’ と ‘record_t {aka struct <無名>}’)
if(min < a[i]){

yamada 22 160.5
yamamoto 22 177.4
suzuki 21 165.3
tanaka 20 170.0
nakamura 22 179.7
nakamura 21 175.3
と入力したら、
tanaka 20 170.00
suzuki 21 165.30
nakamura 21 175.30
yamada 22 160.50
yamamoto 22 177.40
nakamura 22 179.70

と表示するようにしたい。

c

1#include<stdio.h> 2#include<string.h> 3#include "str_sort.h" 4 5void srt_sort(int n, record_t *a){ 6 7 int i, j, k; 8 record_t min; 9 10 for(k = 0; k <= n - 2; k++){ 11 12 for(i = k, j = k, min = a[k]; i < n; i++){ 13 14 if(min < a[i]){ 15 16 min = a[i]; 17 18 j = i; 19 } 20 } 21 22 min = a[k]; 23 a[k] = a[j]; 24 a[j] = min; 25 } 26} 27

str_sort.hファイル↓

c

1#define STRLEN 63 2#define STRFMT "%63s" 3void string_sort(int n, char (*a)[STRLEN+1]); 4 5 6main.cファイル↓ 7```c 8#include <stdio.h> 9#include <string.h> 10#include <assert.h> 11#include "str_sort.h" 12#define MAX_N 64 13 14 15int str_array_scan(record_t a[]) 16{ 17 int i; 18 int n; 19 fprintf(stderr, "n = "); 20 scanf("%d",&n); 21 assert(n<=MAX_N); 22 for (i=0; i<n; i++) { 23 fprintf(stderr, "[%d].name : ", i); 24 scanf(STRFMT, a[i].name); 25 fprintf(stderr, "[%d].age : ", i); 26 scanf("%d", &a[i].age); 27 fprintf(stderr, "[%d].height : ", i); 28 scanf("%lf", &a[i].height); 29 } 30 return n; 31} 32 33 34void str_array_print(int n, record_t a[]) 35{ 36 int i; 37 for (i=0; i<n; i++) { 38 printf("%-10s", a[i].name); 39 printf("%3d", a[i].age); 40 printf("%7.2f", a[i].height); 41 printf("\n"); 42 } 43} 44 45 46int main(void) 47{ 48 int n; 49 record_t a[MAX_N]; 50 51 n = str_array_scan(a); 52 str_sort(n, a); 53 str_array_print(n, a); 54 55 return 0; 56}

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

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

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

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

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

y_waiwai

2019/11/20 23:58

そのコードを提示しましょう
cateye

2019/11/21 00:00

環境(OS,コンパイラ等)とソースを提示して下さい。 〉構造体同士の比較はどのようにしたらいいのかわかりません。・・・これだけでは何を比較するのか分かりません。
dodox86

2019/11/21 00:02

どう比較したいのか? "<" を使っているので大小(とか昇順・降順)関係でしょうか? いずれにせよ意図が分からないので、コードをご提示ください。
hikaru_love_n

2019/11/21 00:06

すいません、コードの追加をさせていただきました。
cateye

2019/11/21 00:43 編集

str_sort.hの中身が分かりませんが? ・・・最低限(エラーが出てもいいけど)コンパイルできるソースを上げて下さい。 if(min < a[i])は出来ません。構造体の中のなにを比較するか?  比較関数が必要だと思いますよ。 構造体は、パディング(詰物)↓が変数の間に入るので、memcmp()などは使えません。 https://ja.wikipedia.org/wiki/%E3%83%87%E3%83%BC%E3%82%BF%E6%A7%8B%E9%80%A0%E3%82%A2%E3%83%A9%E3%82%A4%E3%83%A1%E3%83%B3%E3%83%88
y_waiwai

2019/11/21 03:08

このままではコードが読みづらいので、質問を編集し、<code>ボタンを押し、出てくる’’’の枠の中にコードを貼り付けてください
guest

回答3

0

構造体の何を比較したいのでしょう?

if(min < a[i])

if(min.? < a[i].?)

投稿2019/11/21 00:36

編集2019/11/21 01:02
cateye

総合スコア6851

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

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

cateye

2019/11/21 01:01

構造体の代入は出来ますが、比較は出来ません。 min = a[k]; ○ min < a[i] ×
hikaru_love_n

2019/11/21 03:03

問題文には、 double 型データの大小比較 x<y を, 書き換える (書き方はいろいろ考えられる) のように書かれており、期待される出力のようにしたいため、 age順にまず並べ、その中でheight順に並べるというプログラムを書きたいです。
cateye

2019/11/21 03:40 編集

str_sort.hファイル↓・・・record_tの宣言は何処に有りますか? ”age順にまず並べ、その中でheight順”・・・は構造体のメンバーですか?・・・どこ? 最低限コンパイルできるソースが必要です・・・意味わかりますか? ・・・問題文・・・問題(課題)なら自分で解きましょう。 #ソートについては→https://ja.wikipedia.org/wiki/%E3%82%BD%E3%83%BC%E3%83%88 ・・・2つのキーでソートするんだから、ちょっと大変かも・・・
guest

0

構造体を直接比較ってのはできません。
ので、比較用の関数でも書いて、構造体のメンバーを比較していく処理を書く必要があります

投稿2019/11/21 00:13

y_waiwai

総合スコア88040

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

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

0

自己解決

すいません、解決いたしました。ありがとうございました。

投稿2019/11/21 04:22

hikaru_love_n

総合スコア16

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

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

Zuishin

2019/11/21 04:31

解決した方法を第三者にわかりやすく解説してください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問