ページ 11

アドレスとポインタについての質問

Posted: 2008年10月10日(金) 21:27
by しょしょしょしんしゃ
2つの実数を外部から入力して
それらを相加平均と相乗平均を計算する関数void souka_soujou()を作成し、引数は各自で考え
負の数が入力される場合は正の数が入力されるまで入力を要求するプログラムがどうしても
できません。
相加平均=a+b/2
相乗平均=√ab であらわせますが どのようにポインタをつかえばいいのでしょうか?

Re:アドレスとポインタについての質問

Posted: 2008年10月10日(金) 21:44
by box
「どうしてもできない」というのは、

1)途中まで考えてみたが、あるところから先へ進めない。
2)自分では全く考える気がなく、とにかく答えがほしい。
3)その他

のうち、どれでしょうか。

Re:アドレスとポインタについての質問

Posted: 2008年10月10日(金) 22:11
by たかぎ
> どのようにポインタをつかえばいいのでしょうか?

確実にポインタが必要なのは、関数呼出し演算子のオペランドだけです。
あとは、入出力にも何らかのポインタが必要になる可能性は高いでしょう。

Re:アドレスとポインタについての質問

Posted: 2008年10月10日(金) 22:11
by しょしょしょしんしゃ
<2>ですね。
全く分かりません。
答えだけでは、勉強になりませんね
すみません

Re:アドレスとポインタについての質問

Posted: 2008年10月10日(金) 22:24
by たかぎ
> <2>ですね。
> 全く分かりません。

メールアドレスを公開して素性を明らかにする姿勢は評価しますが、それでは大学の恥をさらすようなものです。

Re:アドレスとポインタについての質問

Posted: 2008年10月10日(金) 22:35
by しょしょしょしんしゃ
えっ
何処にメールアドレスが
かいてありますか?

Re:アドレスとポインタについての質問

Posted: 2008年10月10日(金) 23:07
by box
22:35の投稿では、「MAIL」欄に何も入力せずに投稿したので、
お名前のところにメールアドレスへのリンクがありません。

しかし、それ以外のこれまでの投稿では同欄にメールアドレスが
入っていました。
よって、お名前「しょしょしょしんしゃ」のところへ
マウスカーソルを持っていくと、ブラウザーの左下にメールアドレスを
表示します。
また、お名前のところをダブルクリックすると、
mailto: プロトコルに関連付いているメーラーが起動して、
あなたあてのメールを作成できる状態になります。

Re:アドレスとポインタについての質問

Posted: 2008年10月11日(土) 14:15
by しょしょしょしんしゃ
そうなんですか。
はじめて知りました。
ところで話は変わりますが、このプログラムで最大値と最小値の差を
ポインタの要領で void mmd を使い 1つの関数として独立させることができるのでしょうか?
たかぎさんの注意を受け、一応 考えてみましたが、何か違いがありますでしょうか。

#include <stdio.h>

float saidai (float data[/url],float no);
float saishou (float data[/url],float no);

int main(void){

float a,b,c,d;
printf("4つの実数を入力せよ\n");
scanf("%f %f %f %f",&a,&b,&c,&d);
float x[4] ={ a, b, c, d };
float max ;
float min ;
float sa ;
printf("4つの実数を%f,%f,%f,%fとしました。\n",a,b,c,d);

max = saidai( x ,4 );
min = saishou( x,4 );
sa=max-min;
printf("このうち最大値は%fで,最小値は%fであり,その差は%fとなる。",max,min,sa);

return 0;
}
float saidai(float data[/url],float no)
{
float max;
int i;

max=data[0];
for(i=1;i<no;i++){
if( data>max){
max = data;
}
}
return max;
}
float saishou(float data[/url],float no )
{
float min;
int i ;

min=data[0];
for(i=1;i<no;i++){
if(data<min){
min = data;
}
}
return min;
}
}

Re:アドレスとポインタについての質問

Posted: 2008年10月11日(土) 14:32
by たかぎ
> 何か違いがありますでしょうか。

とにかくhttp://l.huu.cc/board/board.htmlを熟読してください。

つぎに、void mmdとは何でしょう?
初出だと思うのですが...

> 何か違いがありますでしょうか。

souka_soujouを作る課題だったのでは?

Re:アドレスとポインタについての質問

Posted: 2008年10月11日(土) 14:48
by しょしょしょしんしゃ
ハイ
すみません souka_soujouはおかげで完成しました。

以下の問題に迷っているのです。
4つの実数a,b,c,dを外部から入力できるようにして
そららのうちの最大値、最小値および最大値と最小値の差を計算する部分を
1つの関数 void mmd() として独立させるプログラムを作成するという内容です。

分かり難くて、申し訳ありませんでした。
「最大値、最小値および最大値と最小値の差を計算する部分を1つの関数 void mmd() として独立させる」
という部分が 特に上手くできないのです。

Re:アドレスとポインタについての質問

Posted: 2008年10月11日(土) 14:54
by lbfuvab
取り敢えず処理の方向としては

①double型で実数を二つ入力させる(scanf)
②正の数かを判別し、正でないなら①に戻る
③相加相乗を計算するvoid souka_soujou(double a,double b,double *souka,double *soujou)を呼び出す。
④表示する。(printf)

ですかね?

#平方根はmath.hのsqrtで計算できます。

Re:アドレスとポインタについての質問

Posted: 2008年10月11日(土) 14:58
by たかぎ
なるほど。

一点確認したいのですが、今回使用するのはC++ですか? それともC99ですか?
それと、規約は読みましたか?

Re:アドレスとポインタについての質問

Posted: 2008年10月11日(土) 15:09
by しょしょしょしんしゃ
C++です。

規約は読みました
熟読はしていませんが、私の質問に不備があるのでしょうか?
すみませんでした。欠点があるなら、言ってください。

lbfuvabさん、ありがとうございました。
関数void souka_soujou()は、完成していましたが、
手直しの必要があったので、助かりました。

今の問題の処理の方向を教えていただけると、もっと助かります。

Re:アドレスとポインタについての質問

Posted: 2008年10月11日(土) 15:32
by box
規約の、ソースコードの貼り付け方に関する記述を今一度ご確認ください。

Re:アドレスとポインタについての質問

Posted: 2008年10月11日(土) 15:42
by Mist
後はこの辺ですかね。

・自分は何を使ってコンパイルしているのか、OSは何かを必要に応じて書きましょう。

Re:アドレスとポインタについての質問

Posted: 2008年10月11日(土) 15:49
by しょしょしょしんしゃ
#include <stdio.h>
	
float saidai (float data[/url],float no);
float saishou (float data[/url],float no);

int main(void){


	float  a,b,c,d;
	printf("4つの実数を入力せよ\n");
	scanf("%f %f %f %f",&a,&b,&c,&d);
	float x[4] ={ a, b, c, d };
    float max ;
	float min ;
	float sa ;
	printf("4つの実数を%f,%f,%f,%fとしました。\n",a,b,c,d);

    max = saidai( x ,4 );
    min = saishou( x,4 );
       printf("この部分を1つの関数として独立させるのでしょうか?")
	sa=max-min;
	printf("このうち最大値は%fで,最小値は%fであり,その差は%fとなる。",max,min,sa);

	return 0;
}
float saidai(float data[/url],float no)
{
	float max;
	int i;

	max=data[0];
	for(i=1;i<no;i++){
		if( data>max){
			max = data;
		}
	}
	return max;
}
float saishou(float data[/url],float no )
{
	float  min;
	int i ;

	min=data[0];
	for(i=1;i<no;i++){
		if(data<min){
			min = data;
		}
	}
	return min;
}
}

ソースコードの貼り付けはこれでいいのでしょうか?
 
 あと 私の本来の質問にもヒントがあれば、お願いします。
 このソースコードをみて、何か気づいた人がいればお願いします。
 質問の内容は No:22286  に記載してあります。
 

Re:アドレスとポインタについての質問

Posted: 2008年10月11日(土) 16:00
by たかぎ
C++であれば、
template <class Iterator, typename T>
void mmd(Iterator first, Iterator last, T* 最大値, T* 最小値, T* 差)
{
  *最大値 = *std::max_element(first, last);
  *最小値 = *std::min_element(first, last);
  *差 = *最大値 - *最小値;
}
でよいのでは?

Re:アドレスとポインタについての質問

Posted: 2008年10月11日(土) 16:28
by しょしょしょしんしゃ
何度もすみません
void mmd(Iterator first, Iterator last, T* 最大値, T* 最小値, T* 差)
{
  *最大値 = *std::max_element(first, last);
  *最小値 = *std::min_element(first, last);
  *差 = *最大値 - *最小値;
}
は何処にいれるのでしょうか?
1番下ですか?

template <class Iterator, typename T>

とはなんですか 必要あるのですか?

Re:アドレスとポインタについての質問

Posted: 2008年10月11日(土) 17:21
by Mist
本当にC++ですか?
ソース見る限りCだけどなぁ。

わからないことがあればまずググりましょう。
大抵のことはここで質問するより早く解決しますし、あなたにとっても勉強になります。

Re:アドレスとポインタについての質問

Posted: 2008年10月11日(土) 17:48
by しょしょしょしんしゃ
そうですね