ページ 1 / 1
ポインタを使用した2つの実数を加算するプログラムについて
Posted: 2017年5月13日(土) 21:37
by Makoto
何が原因であるのか分からないので、お願いします。
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;
}
Re: ポインタを使用した2つの実数を加算するプログラムについて
Posted: 2017年5月13日(土) 22:20
by みけCAT
Makoto さんが書きました:何が原因であるのか分からないので、お願いします。
何の原因の話かおよび何をお願いされているのかがわからないですが、このプログラムには
- 未初期化の自動変数x(不定)が指す場所にデータを読み込もうとしている
- padd関数に渡している第一引数の型が違う
- printfに渡しているデータの型が違う
- padd関数でansの値が投げ捨てられており、不自然
- main関数で未初期化の自動変数ansの値(不定)がreturnされている
- 関数がネストされている (GCC拡張、使う必要は無いはず)
という問題がありますね。
Re: ポインタを使用した2つの実数を加算するプログラムについて
Posted: 2017年5月13日(土) 23:33
by 超初級者
こんな感じなんでしょうか。
コード:
#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;
}
Re: ポインタを使用した2つの実数を加算するプログラムについて
Posted: 2017年5月14日(日) 19:31
by Makoto
超初心者さんが書かれた通りにすると解決したのですが何故16行目の&sumという引数だけで足されていることになっているのか分かりません。アドレス参照演算子は変数のアドレスに値を代入するという意味は知っているのですが・・・
Re: ポインタを使用した2つの実数を加算するプログラムについて
Posted: 2017年5月14日(日) 20:20
by みけCAT
Makoto さんが書きました:何故16行目の&sumという引数だけで足されていることになっているのか分かりません。
足し算をする処理はpadd関数に書かれているので、
「&sumという引数だけで足されている」というのが意味がよくわかりません。
もう少し詳しく説明していただけますか?
Makoto さんが書きました:アドレス参照演算子は変数のアドレスに値を代入するという意味は知っているのですが・・・
ググッた結果、「アドレス参照演算子」はアドレス演算子&のことであるとするサイト(例:
Debugging with GDB - 異なる言語の使い方)と、
間接演算子*のことであるとするサイト(例:
C言語のポインタ基本 - Qiita)があり、意味がよくわかりません。
しかし、
アドレス演算子&は、変数(左辺値)のアドレスを取得する演算子であり、「アドレスに値を代入」はしません。
間接演算子*は、ポインタをデリファレンスして左辺値を取得する演算子であり、それだけで「値を代入」はしません。(代入演算子で代入することもできますし、読むだけで使うこともできます)
Re: ポインタを使用した2つの実数を加算するプログラムについて
Posted: 2017年5月15日(月) 20:34
by Makoto
みけCATさん、何度も返信ありがとうございます。足し算の件は始めのpadd関数を忘れていました(-_-;)
また、アドレス演算子&と間接演算子*の違いについての違いを教えてくださってありがとうございます。
Re: ポインタを使用した2つの実数を加算するプログラムについて
Posted: 2017年5月15日(月) 20:36
by Makoto
超初心者さん、みけCATさん、回答ありがとうございました!
Re: ポインタを使用した2つの実数を加算するプログラムについて
Posted: 2017年5月15日(月) 21:16
by かずま
別解です。
コード:
#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文を使うことは想定していないと思うんですが。