合計 昨日 今日

ポインタを使用した2つの実数を加算するプログラムについて

[このトピックは解決済みです]

フォーラムルール
フォーラムルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
Name: Makoto
[URL]
Date: 2017年5月13日(土) 21:37
No: 1
(OFFLINE)

 ポインタを使用した2つの実数を加算するプログラムについて

何が原因であるのか分からないので、お願いします。
doubleへのポインタ引数xとdouble型の引数dをもつpadd関数を定義し,2つの実数を
加算するプログラムを作成しなさい.
void padd(double *x, double d);
/* ポインタ引数xが指す変数に引数dを加算する */
main関数では,scanf関数を使って2つの実数を入力し,padd関数を呼んでから加算結果を出力する.
padd関数にはprintf, scanfを書いてはいけない.大域変数を使ってはいけない.

コード[C]: 全て選択
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <stdio.h>
 
void padd(double *x, double d);
 
int main(void)
{
    double *x;
    double d, ans;
 
    printf("実数を2つ入力");
    scanf("%lf %lf", &*x, &d);
    padd(*x,d);
    printf("%f\n", &ans);
 
    void padd(double *x, double d)
    {
        double ans;
        ans = *x + d;
       
    }
        return ans;
}

Name: みけCAT
[URL]
伝説なるハッカー(664,603 ポイント)
Date: 2017年5月13日(土) 22:20
No: 2
(OFFLINE)

 Re: ポインタを使用した2つの実数を加算するプログラムについて

Makoto さんが書きました:何が原因であるのか分からないので、お願いします。

何の原因の話かおよび何をお願いされているのかがわからないですが、このプログラムには

  • 未初期化の自動変数x(不定)が指す場所にデータを読み込もうとしている
  • padd関数に渡している第一引数の型が違う
  • printfに渡しているデータの型が違う
  • padd関数でansの値が投げ捨てられており、不自然
  • main関数で未初期化の自動変数ansの値(不定)がreturnされている
  • 関数がネストされている (GCC拡張、使う必要は無いはず)
という問題がありますね。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

Name: 超初級者
[URL]
かけだし(1,660 ポイント)
Date: 2017年5月13日(土) 23:33
No: 3
(OFFLINE)

 Re: ポインタを使用した2つの実数を加算するプログラムについて

こんな感じなんでしょうか。

コード[C]: 全て選択
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <stdio.h>
 
void padd(double *x, double d)
{
    *x += d;
}
 
int main(void)
{
    double sum, n;
    int i;
 
    for (sum = i = 0; i < 2; i++) {
        printf("%d個目の実数を入力:", i + 1) ;
        scanf("%lf", &n);
        padd(&sum, n);
    }
    printf("合計は%f\n", sum);
    return 0;
}

Name: Makoto
[URL]
Date: 2017年5月14日(日) 19:31
No: 4
(OFFLINE)

 Re: ポインタを使用した2つの実数を加算するプログラムについて

超初心者さんが書かれた通りにすると解決したのですが何故16行目の&sumという引数だけで足されていることになっているのか分かりません。アドレス参照演算子は変数のアドレスに値を代入するという意味は知っているのですが・・・

Name: みけCAT
[URL]
伝説なるハッカー(664,603 ポイント)
Date: 2017年5月14日(日) 20:20
No: 5
(OFFLINE)

 Re: ポインタを使用した2つの実数を加算するプログラムについて

Makoto さんが書きました:何故16行目の&sumという引数だけで足されていることになっているのか分かりません。

足し算をする処理はpadd関数に書かれているので、
「&sumという引数だけで足されている」というのが意味がよくわかりません。
もう少し詳しく説明していただけますか?

Makoto さんが書きました:アドレス参照演算子は変数のアドレスに値を代入するという意味は知っているのですが・・・

ググッた結果、「アドレス参照演算子」はアドレス演算子&のことであるとするサイト(例:Debugging with GDB - 異なる言語の使い方)と、
間接演算子*のことであるとするサイト(例:C言語のポインタ基本 - Qiita)があり、意味がよくわかりません。

しかし、
アドレス演算子&は、変数(左辺値)のアドレスを取得する演算子であり、「アドレスに値を代入」はしません。
間接演算子*は、ポインタをデリファレンスして左辺値を取得する演算子であり、それだけで「値を代入」はしません。(代入演算子で代入することもできますし、読むだけで使うこともできます)
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

Name: Makoto
[URL]
Date: 2017年5月15日(月) 20:34
No: 6
(OFFLINE)

 Re: ポインタを使用した2つの実数を加算するプログラムについて

みけCATさん、何度も返信ありがとうございます。足し算の件は始めのpadd関数を忘れていました(-_-;)
また、アドレス演算子&と間接演算子*の違いについての違いを教えてくださってありがとうございます。

Name: Makoto
[URL]
Date: 2017年5月15日(月) 20:36
No: 7
(OFFLINE)

 Re: ポインタを使用した2つの実数を加算するプログラムについて

[解決!]

超初心者さん、みけCATさん、回答ありがとうございました!

Name: かずま
[URL]
Date: 2017年5月15日(月) 21:16
No: 8
(OFFLINE)

 Re: ポインタを使用した2つの実数を加算するプログラムについて

別解です。
コード[C]: 全て選択
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <stdio.h>
 
void padd(double *x, double d);
 
int main(void)
{
    double a, b;
 
    printf("2つの実数を入力\n");
    scanf("%lf%lf", &a, &b);
    padd(&a, b);
    printf("加算結果は %g\n", a);
    return 0;
}
 
void padd(double *x, double d)
{
    *x += d;  // *x = *x + d; でもよい
}

実行結果
コード[Text]: 全て選択
1
2
3
2つの実数を入力1
3.14 2.718
加算結果は 5.858

出題者は、「ポインタを使うと、呼出し元の変数を読み書きできる」と
いうことを理解させようとしているのではないでしょうか?
for文を使うことは想定していないと思うんですが。


Return to C言語何でも質問掲示板

オンラインデータ

このフォーラムを閲覧中のユーザー: なし & ゲスト[24人]