掲示板利用宣言

 次のフォームをすべてチェックしてからご利用ください。

 私は

 題名と投稿者名は具体的に書きます。
 課題の丸投げはしません。
 ソースの添付は「HTML変換ツール」で字下げします。
 返信の引用は最小限にします。
 環境(OSとコンパイラ)や症状は具体的に詳しく書きます。
 返信の付いた投稿は削除しません。
 マルチポスト(多重投稿)はしません。

掲示板2

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧

No.25492

昇順降順
投稿者---カカム(2006/01/19 20:40:46)


種類が三つ(整数、実数、文字列)で、a個入っている構造体を、三つのどれかを選択して、それらを昇順、又は降順に直すプログラムを考えているのですが考え方が分かりません。
どなたか教えていただけないでしょうか?



この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:昇順降順 25493 REE 2006/01/19 21:06:27
<子記事> Re:昇順降順 25494 とろり 2006/01/19 21:22:27
<子記事> Re:昇順降順 25495 επιστημη 2006/01/19 21:48:21
<子記事> Re:昇順降順 25497 カカム 2006/01/19 23:40:10


No.25493

Re:昇順降順
投稿者---REE(2006/01/19 21:06:27)


>種類が三つ(整数、実数、文字列)で、a個入っている構造体を、三つのどれかを選択して、それらを昇順、又は降順に直すプログラムを考えているのですが考え方が分かりません。
>どなたか教えていただけないでしょうか?

整数の昇順に限定した場合は分かるのですか?

もし、それが分かれば、比較部分を条件によって入れ替えるだけです。



この投稿にコメントする

削除パスワード

No.25494

Re:昇順降順
投稿者---とろり(2006/01/19 21:22:27)


こんにちは。

>種類が三つ(整数、実数、文字列)で、a個入っている構造体を、三つのどれかを選択して、
>それらを昇順、又は降順に直すプログラムを考えているのですが考え方が分かりません。

私なら、
1)構造体を整理する。
2)ソート方法を決定する。
3)プログラムを作成する。
3−1)「整数・実数・文字列」のいずれかに限定して昇順(または降順)に直すプログラムを作成する。
3−2)3−1で作成したものについて、「整数・実数・文字列」を選択できるように機能を追加する。
3−3)3−2で作成したものについて降順(または昇順)に直す機能を追加する。
の手順で作成しますかね。(まあ、実際は3−1〜3−1までいっぺんに作っちゃいますけどね)


この投稿にコメントする

削除パスワード

No.25495

Re:昇順降順
投稿者---επιστημη(2006/01/19 21:48:21)


>種類が三つ(整数、実数、文字列)で、a個入っている構造体を、三つのどれかを選択して、それらを昇順、又は降順に直すプログラムを考えているのですが考え方が分かりません。

標準のソート関数 qsort を使ってかまわないなら、
比較関数を3つ用意するだけ。




この投稿にコメントする

削除パスワード

No.25501

Re:昇順降順
投稿者---επιστημη(2006/01/20 00:49:24)


>標準のソート関数 qsort を使ってかまわないなら、
>比較関数を3つ用意するだけ。

できちゃったよ…

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct fruit {
  int quantity;
  double weight;
  char name[32];
};

void print(struct fruit* f, int n) {
  int i;
  for ( i = 0; i < n; ++i ) {
    printf("%d of %s (%lfg)\n", f[i].quantity, f[i].name, f[i].weight);
  }
  puts("--------------");
}

int compare_weight(const void* x, const void* y) {
  const struct fruit* fx = (const struct fruit*)x;
  const struct fruit* fy = (const struct fruit*)y;
  return ないしょ;
}

int compare_quantity(const void* x, const void* y) {
  const struct fruit* fx = (const struct fruit*)x;
  const struct fruit* fy = (const struct fruit*)y;
  return ないしょ;
}

int compare_name(const void* x, const void* y) {
  const struct fruit* fx = (const struct fruit*)x;
  const struct fruit* fy = (const struct fruit*)y;
  return ないしょ;
}

int main() {
  struct fruit table[] = {
   { 3, 45.6, "apple"  },
   { 2, 12.3, "cherry" },
   { 1, 23.4, "banana" }
  };

  puts("original");
  print(table, 3);

  qsort(table, 3, sizeof(struct fruit), &compare_weight);
  puts("weight-order");
  print(table, 3);

  qsort(table, 3, sizeof(struct fruit), &compare_quantity);
  puts("quantity-order");
  print(table, 3);

  qsort(table, 3, sizeof(struct fruit), &compare_name);
  puts("name-order");
  print(table, 3);

  return 0;
}



実行結果:
original
3 of apple (45.600000g)
2 of cherry (12.300000g)
1 of banana (23.400000g)
--------------
weight-order
2 of cherry (12.300000g)
1 of banana (23.400000g)
3 of apple (45.600000g)
--------------
quantity-order
1 of banana (23.400000g)
2 of cherry (12.300000g)
3 of apple (45.600000g)
--------------
name-order
3 of apple (45.600000g)
1 of banana (23.400000g)
2 of cherry (12.300000g)
--------------





この投稿にコメントする

削除パスワード

No.25497

Re:昇順降順
投稿者---カカム(2006/01/19 23:40:10)


返信ありがとうございます!
比較する方法は…微妙です…。例えば整数で昇順したら残りの実数と文字列はどうやったら一緒に整数順になりますか?
質問ばかりですみません。



この投稿にコメントする

削除パスワード

No.25498

Re:昇順降順
投稿者---RiSK(2006/01/19 23:54:28)


>比較する方法は…微妙です…。例えば整数で昇順したら残りの実数と文字列はどうやったら一緒に整数順になりますか?

構造体でまとめておけばいい。


この投稿にコメントする

削除パスワード

No.25499

Re:昇順降順
投稿者---カカム(2006/01/19 23:57:15)


>構造体でまとめておけばいい。

構造体同士どうやって比較するんですか?


この投稿にコメントする

削除パスワード

No.25500

Re:昇順降順
投稿者---RiSK(2006/01/20 00:28:16)


>>構造体でまとめておけばいい。
>
>構造体同士どうやって比較するんですか?

構造体のメンバで比較すればいい。


この投稿にコメントする

削除パスワード

No.25506

Re:昇順降順
投稿者---カカム(2006/01/20 14:11:05)


ソース自体の構造は出来上がったのですが、いざ、構造体の中身を入れ替えるときに、整数や、実数は
fruit[a].money=fruit[a+1].money;
と行ってできたのですが、文字列を入れ替えるときに
fruit[a].name=fruit[a+1].name;
と入力すると
: 左のオペランドが、左辺値になっていません。
とエラーが起きます。
どのようにすれば回避できるでしょうか?


この投稿にコメントする

削除パスワード

No.25509

Re:昇順降順
投稿者---YuO(2006/01/20 15:05:05)


>と行ってできたのですが、文字列を入れ替えるときに
>fruit[a].name=fruit[a+1].name;
>と入力すると
>: 左のオペランドが、左辺値になっていません。
>とエラーが起きます。
>どのようにすれば回避できるでしょうか?

fruit[a].nameの型は何ですか?
charの配列型であれば,strcpyを使う必要があります。
# というか,qsort使えば入れ替え処理など不要なのですが……。



この投稿にコメントする

削除パスワード

No.25512

Re:昇順降順
投稿者---wiz(2006/01/20 16:44:19)


そもそも構造体ならば中身ごとの入れ替えなど不要で
構造体同士で代入できる気が。。。



この投稿にコメントする

削除パスワード

No.25542

Re:昇順降順
投稿者---RAPT(2006/01/21 04:34:37)


>そもそも構造体ならば中身ごとの入れ替えなど不要で
>構造体同士で代入できる気が。。。
配列とか使っていると代入はムリなので、memcpy()あたりになりますね。
でもこういった場合、添え字を入換えるって手法がロスが少ないですね。




この投稿にコメントする

削除パスワード

No.25569

Re:昇順降順
投稿者---wis(2006/01/21 18:55:41)


>配列とか使っていると代入はムリなので、memcpy()あたりになりますね。
>でもこういった場合、添え字を入換えるって手法がロスが少ないですね。
構造体の中に配列つかっててもオフセットは変わらないので
同じ構造体同士の代入ならば可能なのでは。。。??

#何か私の考えてることと仰ってることが違うかも知れないので
#私が思ってることをプログラムにしてみました。

/*
 *  test
 *  Build VC++60  Windows XP
 */

#include <stdio.h>
#include <string.h>

struct TEST{
  int  n;
  double  d;
  char  s[5];
};


void printA( struct TEST* p )
{
  printf("AAA:%d\n",p->n);
  printf("AAA:%f\n",p->d);
  printf("AAA:%s\n",p->s);
}

void printB( struct TEST* p )
{
  printf("BBB:%d\n",p->n);
  printf("BBB:%f\n",p->d);
  printf("BBB:%s\n",p->s);
}

int main ()
{
  struct TEST AAA, BBB, tmp;

  AAA.n = 123;
  AAA.d = 123.456;
  strcpy( AAA.s, "AAA" );

  BBB.n = 456;
  BBB.d = 456.789;
  strcpy( BBB.s, "BBB" );

  printA( &AAA );
  printB( &BBB );

  tmp = AAA;
  AAA = BBB;
  BBB = tmp;

  printA( &AAA );
  printB( &BBB );

  return 0;
}

実行結果:
AAA:123
AAA:123.456000
AAA:AAA
BBB:456
BBB:456.789000
BBB:BBB
AAA:456
AAA:456.789000
AAA:BBB
BBB:123
BBB:123.456000
BBB:AAA
Press any key to continue


この投稿にコメントする

削除パスワード

No.25621

Re:昇順降順
投稿者---RAPT(2006/01/22 10:03:23)


# ごめんなさい、ごめんなさい、ごめんなさい。
普通の配列は大丈夫でした。
ポインタの場合に、問題になることがあるのでした。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct A{
    char *p;
} A;

int main(void)
{
    A a, b;
    a.p = malloc(10);
    strcpy(a.p, "TEST");
    b = a;

    puts(a.p);
    free(a.p);
    a.p = NULL;
    puts(b.p);  // コレが問題

    return 0;
}



この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧