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

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

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

#1

投稿記事 by Makoto » 11ヶ月前

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

コード: 全て選択

#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;
}

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

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

#2

投稿記事 by みけCAT » 11ヶ月前

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

超初級者
記事: 52
登録日時: 3年前

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

#3

投稿記事 by 超初級者 » 11ヶ月前

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

コード: 全て選択

#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;
}

Makoto

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

#4

投稿記事 by Makoto » 11ヶ月前

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

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

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

#5

投稿記事 by みけCAT » 11ヶ月前

Makoto さんが書きました:何故16行目の&sumという引数だけで足されていることになっているのか分かりません。
足し算をする処理はpadd関数に書かれているので、
「&sumという引数だけで足されている」というのが意味がよくわかりません。
もう少し詳しく説明していただけますか?
Makoto さんが書きました:アドレス参照演算子は変数のアドレスに値を代入するという意味は知っているのですが・・・
ググッた結果、「アドレス参照演算子」はアドレス演算子&のことであるとするサイト(例:Debugging with GDB - 異なる言語の使い方)と、
間接演算子*のことであるとするサイト(例:C言語のポインタ基本 - Qiita)があり、意味がよくわかりません。

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

Makoto

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

#6

投稿記事 by Makoto » 11ヶ月前

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

Makoto

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

#7

投稿記事 by Makoto » 11ヶ月前

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

かずま

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

#8

投稿記事 by かずま » 11ヶ月前

別解です。

コード: 全て選択

#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; でもよい
}
実行結果

コード: 全て選択

2つの実数を入力1
3.14 2.718
加算結果は 5.858
出題者は、「ポインタを使うと、呼出し元の変数を読み書きできる」と
いうことを理解させようとしているのではないでしょうか?
for文を使うことは想定していないと思うんですが。

返信

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