【掲示板ご利用上の注意】

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

 詳しくはこちら


本当はこんなに大きく書きたくはないのですが、なかなか守っていただけなくて…。
 守ってくださいね。お願いします。(by管理人)

C言語ソース⇒HTML形式ツール掲示板2こちら


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

No.21392

傾きを出したいのですが
投稿者---111(2005/06/13 22:04:12)


ファイルに座標を書いて、それを反映させて傾きを出したいと思っています。その後にも色々作業があるのですが、まずそれをしようと思っています。まず配列にそれぞれx,y座標をいれるまではできたんですがその後どのように変化させたらいいかわかりません。
ファイルには
1 2
3 4
5 6
のように書いています。ご教示お願いします
#include <stdio.h>
#include <stdlib.h>

void main(void)
{
    int cnt = 0;
    int i;
    int za[100][2];
    char FileName[16];
    FILE *fp;

    printf("入力ファイル名>>>");
    scanf("%s",FileName);
    if((fp = fopen(FileName,"r"))==NULL)
    {
        printf("ファイルが見つかりません。--- %s\n",FileName);
    }
    for(i=0;!feof(fp);i++)
    {
        fscanf(fp,"%d",&za[i][0]);
        fscanf(fp,"%d",&za[i][1]);
        cnt++;
        printf("%d",za[i][0]);
        printf(" %d\n",za[i][1]);
        
    }

    
    fclose(fp);
}





この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:傾きを出したいのですが 21397 RAPT 2005/06/13 22:32:21


No.21397

Re:傾きを出したいのですが
投稿者---RAPT(2005/06/13 22:32:21)


>ファイルには
>1 2
>3 4
>5 6
これを元にどう傾きを計算したいのでしょうか。
それがわかったら後はコードに落とすだけだと思いますが。


この投稿にコメントする

削除パスワード

No.21399

Re:傾きを出したいのですが
投稿者---111(2005/06/13 22:48:22)


1 2 (x1座標、y1座標)
3 4 (x2座標、y2座標)
5 6 (x3座標、y3座標)のようにする予定です



この投稿にコメントする

削除パスワード

No.21403

Re:傾きを出したいのですが
投稿者---RiSK(2005/06/13 23:03:52)


数学には疎いですが…
傾きって角度のことですか?

>1 2 (x1座標、y1座標)
>3 4 (x2座標、y2座標)
>5 6 (x3座標、y3座標)のようにする予定です

三点からは三つの角を作ることができますよ。
三つ出すのですか?


この投稿にコメントする

削除パスワード

No.21405

Re:傾きを出したいのですが
投稿者---ぽこ(2005/06/13 23:09:47)


>三点からは三つの角を作ることができますよ。
>三つ出すのですか?

同様に三点から3つの線分も作成できますね。
各線分の傾きを求めたいのかも知れません。


この投稿にコメントする

削除パスワード

No.21406

Re:傾きを出したいのですが
投稿者---111(2005/06/13 23:14:17)


そうです。ちょっと説明できてませんでした。
x1とx2の傾き、x2とx3の傾きをそれぞれ求めたいとおもっています。
ちなみにさっきの
1 2
3 4
5 6
では全部傾き1になります。


この投稿にコメントする

削除パスワード

No.21411

Re:傾きを出したいのですが
投稿者---ぽこ(2005/06/13 23:28:00)


>ちなみにさっきの
>1 2
>3 4
>5 6
>では全部傾き1になります。

ご自分で傾きを求めることが出来るようですが、何が問題なのでしょうか?
傾きを求める式の一般形が分からないのでしょうか?



この投稿にコメントする

削除パスワード

No.21412

Re:傾きを出したいのですが
投稿者---rvr_driver(2005/06/13 23:29:15)


>x1とx2の傾き、x2とx3の傾きをそれぞれ求めたいとおもっています。

x座標だけで傾きが出るとは思えません。
もしかして傾きのことを (x2 - x1) や (x3 - x2)で求まると
思っているのならもう一度教科書などで調べてみては?

>ちなみにさっきの
>1 2
>3 4
>5 6
>では全部傾き1になります。

上記のことから全部傾き1になるとは思えません。
C言語以前の問題であるように感じますが・・・。


この投稿にコメントする

削除パスワード

No.21415

Re:傾きを出したいのですが
投稿者---rvr_driver(2005/06/13 23:32:14)


すみません。間違えました。
全部傾き1になりますね。
大変申し訳ございませんでした。


この投稿にコメントする

削除パスワード

No.21418

Re:傾きを出したいのですが
投稿者---111(2005/06/13 23:43:24)


そうです。このプログラムに関してどのように一般式を求めるのかがわからないんです。現在配列にza[0][0]はx1座標、za[0][1]はy1座標をいれるようにしてるんですが、その後がよくわからないんです。
たとえばx1とx2の座標での傾きをする場合
この条件だとなにが悪いのでしょうか?
a = (za[0][0]-za[0][1])/(za[1][1]-za[1][0]);


この投稿にコメントする

削除パスワード

No.21420

Re:傾きを出したいのですが
投稿者---ぽこ(2005/06/13 23:50:32)


>たとえばx1とx2の座標での傾きをする場合
>この条件だとなにが悪いのでしょうか?
>a = (za[0][0]-za[0][1])/(za[1][1]-za[1][0]);

微妙に違いますね。
2点A(x1,y1)とB(x2,y2)を通る直線の傾きaは以下の式になります。
a = (y2-y1)/(x2-x1) #ただしx2-x1≠0




この投稿にコメントする

削除パスワード

No.21425

Re:傾きを出したいのですが
投稿者---111(2005/06/14 00:08:45)


なんか勘違いしていました。
このプログラムにのせるのなら
a = (za[0][1]-za[1][1])/(za[1][0]-za[0][0]);
になりますよね?
それでprintfでaを表示しようと思うのですがなぜかかけないんです。
ファイルの文字って前に配列に読み込んでいるので
scanfとかはいらないですよね?


この投稿にコメントする

削除パスワード

No.21427

Re:傾きを出したいのですが
投稿者---RAPT(2005/06/14 00:17:03)


za[0][0] = x1; za[0][1] = y1;
za[1][0] = x2; za[1][1] = y2;
za[2][0] = x3; za[2][1] = y3;
だとすれば、
(y2 - y1) / (x2 - x1) は
(za[1][1] - za[0][1]) / (za[1][0] - za[0][0]) になると思います。

で、各変数の型は何ですか? int? double?

> printfでaを表示しようと思うのですがなぜかかけないんです。
どんな結果を想定して、
どんなコードを書いて
どんな結果が出たのですか?

具体的に書いてください。



この投稿にコメントする

削除パスワード

No.21430

Re:傾きを出したいのですが
投稿者---111(2005/06/14 00:28:48)


aは傾きとなり整数とは限らないのでfloat型で宣言しています。
if(cnt==0){
    a = (za[1][1] - za[0][1]) / (za[1][0] - za[0][0]);
    printf("%d\n",&a);
    }

for文終わった後にこれを追加したんですが変な値がでます。
ご指摘お願いします


この投稿にコメントする

削除パスワード

No.21432

Re:傾きを出したいのですが
投稿者---Blue(2005/06/14 00:33:44)


>printf("%d\n",&a);
使い方がまちがっています。scanfとはちがいますよ。
第5章 標準入出力関数(1)を参考にどうぞ。




この投稿にコメントする

削除パスワード

No.21434

Re:傾きを出したいのですが
投稿者---111(2005/06/14 00:36:01)


あっ、なんかごっちゃになってました。
&がいらないですね。
これを治してもただしい値にならないみたいです;;


この投稿にコメントする

削除パスワード

No.21435

Re:傾きを出したいのですが
投稿者---ぽこ(2005/06/14 00:37:59)


>aは傾きとなり整数とは限らないのでfloat型で宣言しています。

2点ほど。
(1)書式が違う。%d→%f
(2)整数同士の割り算の結果は整数になります。
  http://www9.plala.or.jp/sgwr-t/c/sec04.html#s4-2参照。



この投稿にコメントする

削除パスワード

No.21436

Re:傾きを出したいのですが
投稿者---111(2005/06/14 00:42:26)


ありがとうございます。かなり基本的なこと間違えすぎですね。
このように変更してみました。
if(cnt==0){
    a = ((float)za[1][1] - (float)za[0][1]) / ((float)za[1][0] - (float)za[0][0]);
    printf("%f\n",a);
    }




この投稿にコメントする

削除パスワード

No.21438

ちょっと改善しました。
投稿者---111(2005/06/14 01:14:09)


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

    
void main(void)
{
    int cnt = 0;
    int i;
    float a,a1;
    int n=4;
    int za[100][2];
    char FileName[16];
    FILE *fp;

    printf("入力ファイル名>>>");
    scanf("%s",FileName);
    if((fp = fopen(FileName,"r"))==NULL)
    {
        printf("ファイルが見つかりません。--- %s\n",FileName);
    }
    for(i=0;!feof(fp);i++)
    {
        fscanf(fp,"%d",&za[i][0]);
        fscanf(fp,"%d",&za[i][1]);
    }
    for(i=1;i<=n;i++){
        if(cnt==0){
    a = ((float)za[i][1] - (float)za[i-1][1]) / ((float)za[i][0] - (float)za[i-1][0]);
    printf("傾き=%f\n",a);
        }
    }

    fclose(fp);
}


最初投稿したプログラムからアドバイスをいただき改善しました。
現在5点与えて傾きが4個求める事ができました。
これを任意にn点与えた時を考えたいと思っています。
nをなにも宣言しないっていうんじゃ無理ですよね?
これをn回繰り返すにはどうすればいいのでしょうか?


この投稿にコメントする

削除パスワード

No.21440

Re:ちょっと改善しました。
投稿者---rvr_driver(2005/06/14 06:56:46)


求め方にもよると思いますが、今回のような求め方でよいのなら、

1.ファイルから座標を読み込む
2.前回読み込んだ座標が存在する場合は、傾きの計算を行う。
3.求めた傾きを表示する
4.今回読み込んだ座標を前回読み込んだ座標にする。
5.ファイルの終端になるまで1から4を繰り返す。

でいいと思います。
これであれば前回読み込んだ座標と今回読み込んだ座標の
変数のみでn点の傾きを求めることが出来ると思います。



この投稿にコメントする

削除パスワード

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