問題で・・・

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

問題で・・・

#1

投稿記事 by rua » 18年前

フェーザ表記のインピーダンスをコマンドライン引数として入力し、アドミタンスYに変換して成分表示するプログラムを作るのですが・・・
main関数の二つ目のprintfのところの表示が整数ででてきてしまいます。
デバッガで見てもよくわかりませんでした。
ifの条件は少ないですがあとでたすつもりです。
大まかな構造は変えないで教えていただけると幸いです。
#include <stdio.h>
#include <stdlib.h>

struct complex_p {
    double a;
    double b;
};

struct complex_p cp_p( struct complex_p *a, struct complex_p *b);

int main( int argc, char *argv[/url] )
{
    struct complex_p c1={0.0,0.0}, c2={0.0,0.0}, c3;
    char n1,n2;

    if(argc<2) {
        printf("Error. The number of argument is too few..\n");
        return(-1);
    }

    n1=*argv[1];
    n2=*argv[2];
    c1.a=atof(argv[1]);  
    c2.b=atof(argv[2]);

    if((n1=='1'|| n1=='2'||n1=='3'||n1=='4'||n1=='5'||n1=='6'||n1=='7'||n1=='8'||n1=='9')&&(n2=='1'|| n2=='2'||n2=='3'||n2=='4'||n2=='5'||n2=='6'||n2=='7'||n2=='8'||n2=='9')){
    	c3 = cp_p(&c1,&c2);
    	printf("Z=%g-j%g.\n",c1.a, c2.b );
    	printf("Y=%g+j%g.\n",c2.a, c1.b );
    }   	   
    
    return (0);
}

struct complex_p cp_p(struct complex_p *a, struct complex_p *b)
{
    struct complex_p tmp;

    tmp.a = (*a).a / ((*a).a * (*a).a + (*b).b * (*b).b);
    tmp.b = (*b).b / ((*a).a * (*a).a + (*b).b * (*b).b);
    return tmp;
}

  

管理人

Re:問題で・・・

#2

投稿記事 by 管理人 » 18年前

ruaさん、こんにちは。

それはatofしていないものを表示しようとしているからじゃないですか?

よく処理の流れを見てみてください。

それから

if((n1=='1'|| n1=='2'||n1=='3'||n1=='4'||n1=='5'||n1=='6'||n1=='7'||n1=='8'||n1=='9')&& (n2=='1'|| n2=='2'||n2=='3'||n2=='4'||n2=='5'||n2=='6'||n2=='7'||n2=='8'||n2=='9')){

こんなに長くかかなくてもatofしてから範囲指定すればいいんじゃないですか?

仮にこの方法で行うとしても

n1>='1' && n1<='9'

でいけますよ。

box

Re:問題で・・・

#3

投稿記事 by box » 18年前

main関数で、cp_p関数にc1のアドレスとc2のアドレスを渡していますね。
受け取ったcp_p関数で、引数aと引数bを使って計算していますが、
aとbの値そのものは変わっていません。
よって、main関数の2個目のprintfでは、c2.aとc1.bの各々の初期値である
0.0を出力しています。

ところで、cp_p関数の戻り値を、main関数でのその後の処理に使っていませんが、
それはOKなのでしょうか?

管理人

Re:問題で・・・

#4

投稿記事 by 管理人 » 18年前

if((n1=='1'|| n1=='2'||n1=='3'||n1=='4'||n1=='5'||n1=='6'||n1=='7'||n1=='8'||n1=='9')&& (n2=='1'|| n2=='2'||n2=='3'||n2=='4'||n2=='5'||n2=='6'||n2=='7'||n2=='8'||n2=='9')){

この条件文の行いたいことが何かわからないんですけど、何がしたいんですか?

このままだと、第一引数の数字の一番左側の数字が1~9かつ第二引数の数字の一番左の数字が1~9ならってことになりますけど。

引数に最初0からはじまるものがあったらエラーにしたいのでしょうか?

管理人

Re:問題で・・・

#5

投稿記事 by 管理人 » 18年前

atofで判定できない判定不可能な文字が含まれているときの処理などをしたいときは

http://www9.plala.or.jp/sgwr-t/lib/strtod.html

この辺の関数を使用するとよいですよ。

box

Re:問題で・・・

#6

投稿記事 by box » 18年前

別の話ですが、(*a).a はアロー演算子 -> を使って
a->a と書く方が、より一般的でありましょう。

rua

Re:問題で・・・

#7

投稿記事 by rua » 18年前

どうもありがとうございました。

参考にさせていただきできることができました。
また聞くことがあると思いますが、そのときはよろしくお願いします。

管理人

Re:問題で・・・

#8

投稿記事 by 管理人 » 18年前

解決されたようでよかったです。
頑張ってくださいね☆

閉鎖

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