幾つのベクトルの大きさを小さい順に並び替えるプログラムの作り方に関してです。

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
jangskichi9292

幾つのベクトルの大きさを小さい順に並び替えるプログラムの作り方に関してです。

#1

投稿記事 by jangskichi9292 » 7年前

問題
4個のベクトルを大きさが小さい順に並び替えて表示するプログラムを作ることです。

問題の結果
Before
1-th Vector : (0,3), 3.00
2-th Vector : (7,7), 9.90
3-th Vector : (1,5), 5.10
4-th Vector : (2,1), 2.24

After
1-th Vector : (2,1), 2.24
2-th Vector : (0,3), 3.00
3-th Vector : (1,5), 5.10
4-th Vector : (7,7), 9.90

コード:

#include<stdio.h>
#include<math.h>
#define N 4

struct vector{
    int x;
    int y;
    double r;
};

void InputData(struct vector *data){
    
    data[0].x = 0;  data[0].y =  3;
    data[1].x = 7;  data[1].y =  7;
    data[2].x = 1;  data[2].y =  5;
    data[3].x = 2;  data[3].y =  1;
    
}

/*swap関数で2つのベクトルを入れ替えようとしてもvoid swapとはどの違いがあるか気になります。*/
swap(int *x,int *y){
    double r;
    r = *x;
    *x = *y;
    *y = r;
   
}

/*ベクトルの大きさを求める関数で、sqrt(x^2+y^2)の書き方が正しいかよくわかりません。*/
CalculateR(struct vector &data){
    int i;
    double r;
    for(i=0;i<N;i++){
        r = sqrt((data[i].x)^2+(data[i].y)^2);
        
    }
        
   
   }

/*Beforeを示しましたが、最後のベクトルの大きさの値がよく出てきません。*/
PrintData(int *Data, int N){
    printf("Before¥n");
    printf("1-th Vector :(%d,%d) , %d¥n");   scanf(&Data[0].x,&Data[0].y,&r);
    printf("2-th Vector :(%d,%d) , %d¥n");    scanf(&Data[1].x,&Data[1].y,&r);
    printf("3-th Vector :(%d,%d) , %d¥n");    scanf(&Data[2].x,&Data[2].y,&r);
    printf("4-th Vector :(%d,%d) , %d¥n");   scanf(&Data[3].x,&Data[3].y,&r);
}

/*ベクトルの大きさを小さい順に並べ替えるコードのヒントをもらえたらありがたいです。*/
SortData(){
    
}

int main(void){
    struct vector data[N];
    
    InputData(data);
    CalculateR(data);
    
    printf("Before\n");
    PrintData(data);
    
    SortData(data);
    
    printf("After\n");
    PrintData(data);
    
    return 0;
    
} 
自力で1日中頑張りましたがベクトルで格納されたものが出たらなかなか解決しにくくなって困りました。何卒ご指導お願い致します。

アバター
みけCAT
記事: 6734
登録日時: 13年前
住所: 千葉県
連絡を取る:

Re: 幾つのベクトルの大きさを小さい順に並び替えるプログラムの作り方に関してです。

#2

投稿記事 by みけCAT » 7年前

このコードは、参照が使用されているのでC++のつもりであると仮定します。
jangskichi9292 さんが書きました:swap関数で2つのベクトルを入れ替えようとしてもvoid swapとはどの違いがあるか気になります。
C++の標準規格では、このコードのような戻り値の型を指定しない関数定義は認められていません。
void swapにすると、戻り値がない関数の正しい定義になります。
jangskichi9292 さんが書きました:ベクトルの大きさを求める関数で、sqrt(x^2+y^2)の書き方が正しいかよくわかりません。
C++では、intなどのプリミティブ型どうしの^演算子は排他的論理和を表します。
「ベクトルの大きさ」の定義にもよるかもしれないですが、ユークリッド長さの求め方としては正しくありません。

このコードには、他にも多くの問題があります。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

アバター
みけCAT
記事: 6734
登録日時: 13年前
住所: 千葉県
連絡を取る:

Re: 幾つのベクトルの大きさを小さい順に並び替えるプログラムの作り方に関してです。

#3

投稿記事 by みけCAT » 7年前

よく見たら、参照が使われているのはtypoっぽいし、構造体を使う時にわざわざstructと書いているので、C++よりC言語に近そうですね。
C言語では、関数の戻り値の型を書かないとintとみなされます。
  • 複数の関数の戻り値の型が書かれていない
  • CalculateR関数において
    • 引数にポインタのかわりにC++の参照っぽいものが使用されている (C言語ならコンパイルエラー)
    • 式がユークリッド長さを求めるのには正しくない
    • 計算結果が保存されず、捨てられている
    • インデントが乱れている
  • PrintData関数において
    • マクロで4と定義されたNが引数に入っている (コンパイルエラー)
    • エスケープシーケンスに使う\ (U+005C) のかわりに¥ (U+00A5)が書かれている
    • printfの書式に対して出力するデータが無い (実行すれば未定義動作)
    • scanfの第一引数が書式文字列ではない (実行すれば未定義動作)
という問題を修正してみました。

コード:

#include<stdio.h>
#include<math.h>
#define N 4

struct vector{
    int x;
    int y;
    double r;
};

void InputData(struct vector *data){
    
    data[0].x = 0;  data[0].y =  3;
    data[1].x = 7;  data[1].y =  7;
    data[2].x = 1;  data[2].y =  5;
    data[3].x = 2;  data[3].y =  1;
    
}

/*swap関数で2つのベクトルを入れ替えようとしてもvoid swapとはどの違いがあるか気になります。*/
void swap(int *x,int *y){
    double r;
    r = *x;
    *x = *y;
    *y = r;

}

/*ベクトルの大きさを求める関数で、sqrt(x^2+y^2)の書き方が正しいかよくわかりません。*/
void CalculateR(struct vector *data){
    int i;
    for(i=0;i<N;i++){
        data[i].r = sqrt((data[i].x*data[i].x)+(data[i].y*data[i].y));

    }

}

/*Beforeを示しましたが、最後のベクトルの大きさの値がよく出てきません。*/
void PrintData(struct vector *Data){
    printf("Before\n");
    printf("1-th Vector :(%d,%d) , %.2f\n",Data[0].x,Data[0].y,Data[0].r);
    printf("2-th Vector :(%d,%d) , %.2f\n",Data[1].x,Data[1].y,Data[1].r);
    printf("3-th Vector :(%d,%d) , %.2f\n",Data[2].x,Data[2].y,Data[2].r);
    printf("4-th Vector :(%d,%d) , %.2f\n",Data[3].x,Data[3].y,Data[3].r);
}

/*ベクトルの大きさを小さい順に並べ替えるコードのヒントをもらえたらありがたいです。*/
void SortData(){

}

int main(void){
    struct vector data[N];
    
    InputData(data);
    CalculateR(data);
    
    printf("Before\n");
    PrintData(data);
    
    SortData(data);
    
    printf("After\n");
    PrintData(data);
    
    return 0;
    
}
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

アバター
みけCAT
記事: 6734
登録日時: 13年前
住所: 千葉県
連絡を取る:

Re: 幾つのベクトルの大きさを小さい順に並び替えるプログラムの作り方に関してです。

#4

投稿記事 by みけCAT » 7年前

jangskichi9292 さんが書きました:ベクトルの大きさを小さい順に並べ替えるコードのヒントをもらえたらありがたいです。
qsort関数を利用するか、適当なソートアルゴリズムを実装するといいでしょう。

void SortData()は、C言語では引数が不定の関数、C++では引数を持たない関数です。
データを並べ替えるには、まずはデータ(へのポインタ)を渡さないといけないですよね。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

jangskichi9292

Re: 幾つのベクトルの大きさを小さい順に並び替えるプログラムの作り方に関してです。

#5

投稿記事 by jangskichi9292 » 7年前

みけCATさん。ありがとうございます。すごく参考になりました。しかしここでまたぶつかってしまいました。

コード:

void SortData(struct vector *Data){
    int i;
    for (i=0; i<N; i++){
        if (Data[i+1].r>Data[i].r)
        {
            int temp = Data[i].r;
            Data[i].r =  Data[i+1].r;
            Data[i+1].r = temp;
        }
    }

参考書も見ながら自分で作ってみましたが、下記のような結果がずっと出てしまいます。
Before
1-th Vector :(0,3) , 3.00
2-th Vector :(7,7) , 9.90
3-th Vector :(1,5) , 5.10
4-th Vector :(2,1) , 2.24

After
1-th Vector :(0,3) , 9.90
2-th Vector :(7,7) , 5.10
3-th Vector :(1,5) , 3.00
4-th Vector :(2,1) , 2.24

昇順ではなくて降順で並べるし、ベクトルの成分も移動しないことの原因が全然わかりません。その理由を教えてもらえますか。

box
記事: 2002
登録日時: 13年前

Re: 幾つのベクトルの大きさを小さい順に並び替えるプログラムの作り方に関してです。

#6

投稿記事 by box » 7年前

Cで作るならこんな感じ?

コード:

#include <stdio.h>
#include <math.h>
#define N 4

typedef struct vector {
    int x;
    int y;
    double r;
    double d;
} vector;

void InputData(vector *data)
{
    data[0].x = 0;  data[0].y = 3;
    data[1].x = 7;  data[1].y = 7;
    data[2].x = 1;  data[2].y = 5;
    data[3].x = 2;  data[3].y = 1;
}

/*ベクトルの大きさを求める関数で、sqrt(x^2+y^2)の書き方が正しいかよくわかりません。*/
void CalculateR(vector *data)
{
    int i;

    for (i = 0; i < N; i++) {
        data[i].d = sqrt(data[i].x * data[i].x + data[i].y * data[i].y);
    }
}

/*Beforeを示しましたが、最後のベクトルの大きさの値がよく出てきません。*/
void PrintData(vector *data)
{
    int i;

    for (i = 0; i < N; i++) {
        printf("%d-th Vector:(%d,%d),%.2f\n",
            i + 1, data[i].x, data[i].y, data[i].d);
    }
}

/*ベクトルの大きさを小さい順に並べ替えるコードのヒントをもらえたらありがたいです。*/
void SortData(vector *data)
{
    int i, j;

    for (i = 0; i < N - 1; i++) {
        for (j = i + 1; j < N; j++) {
            if (data[i].d > data[j].d) {
                vector t;
                t = data[i], data[i] = data[j], data[j] = t;
            }
        }
    }
}

int main(void)
{
    vector data[N];

    InputData(data);
    CalculateR(data);

    printf("Before\n");
    PrintData(data);

    SortData(data);

    printf("After\n");
    PrintData(data);

    return 0;
}
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

アバター
みけCAT
記事: 6734
登録日時: 13年前
住所: 千葉県
連絡を取る:

Re: 幾つのベクトルの大きさを小さい順に並び替えるプログラムの作り方に関してです。

#7

投稿記事 by みけCAT » 7年前

jangskichi9292 さんが書きました:昇順ではなくて降順で並べるし
条件文が「昇順に並んでいたら入れ替える」=「降順に並べる」ようになっているからです。
jangskichi9292 さんが書きました:ベクトルの成分も移動しない
ベクトルの成分を移動するコードが無いからです。
オフトピック
そうか…なんでtempがint型なのに小数点以下が保存されているのだろうと思ったら、
上に移動するのはtempを経由せずに直接代入しているし、下に移動しているのが整数の3.00だけだからそう見えるのですね。

また、このコードは比較して交換する方針なのにO(N)なので、一般のケースではうまくソートできないはずです。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

jangskichi9292

Re: 幾つのベクトルの大きさを小さい順に並び替えるプログラムの作り方に関してです。

#8

投稿記事 by jangskichi9292 » 7年前

作成できました!ありがとうございます!

閉鎖

“C言語何でも質問掲示板” へ戻る