ページ 11

複数の引数について

Posted: 2011年8月31日(水) 16:08
by OP
勉強中にわからなくなって質問することにしました。このコード↓がなぜ3825になるのかわかりません。
もしわかる人がいましたら返信お願いします。

コード:

#include <stdio.h>

int sum(int,int);

int main(void)
{
	sum(50,100);
	return 0;
}

int sum(int min,int max)
{
	printf("%d\n",(min + max) * (max - min + 1) / 2);
	return 0;
}

Re: 複数の引数について

Posted: 2011年8月31日(水) 16:15
by 沖 滉均
返答する前に、まず質問させてください。
OPさんは何をされたいんでしょう?
どういう結果を望んでいるのでしょうか?

Re: 複数の引数について

Posted: 2011年8月31日(水) 16:25
by OP
このコードは3825を出すのですがですが、なぜそうなるのかわかりません。
こうなるまでの

コード:

int sum(int min,int max)
{
	printf("%d\n",(min + max) * (max - min + 1) / 2);
	return 0;
}
ここの部分がわからないので、教えていただけるとありがたいです。

Re: 複数の引数について

Posted: 2011年8月31日(水) 16:37
by Tatu
(50+100)*(100-50+1)/2が計算できないという意味でしょうか?

Re: 複数の引数について

Posted: 2011年8月31日(水) 16:40
by 沖 滉均
引数がどのように入っているのかがわからないのでしょうか…
計算そのものがわからないのでしょうか…
なぜ数値が出力(表示)されるかがわからないのでしょうか…
上記のどれがわかりませんか?

コード:

#include <stdio.h>
 
int sum(int,int);
 
int main(void)
{
    sum(50,100);	// ←ここで第1引数に50、第2引数に100を入力
    return 0;
}

// mainで呼び出す際にsum(50, 100)としているので
// min = 50, max = 100が入る
int sum(int min,int max)
{
    printf("%d\n",(min + max) * (max - min + 1) / 2);
    // (50+100)×(100-50+1)÷2=150×51÷2=3825
    // "%d\n"←符号付10進数+改行
    return 0;
}
[追記]
sum関数が何を行っている関数かわからないという意味ならば
min~maxまでの和を求める関数ですね

Re: 複数の引数について

Posted: 2011年8月31日(水) 16:41
by 白い時空
多分、
min + (min+1) + (min+2) + ・・・・・ + (max-1) + max
を求めてます。

50 + 51 + 52 + ・・・・・ + 99 + 100 = 3825
になります。

Re: 複数の引数について

Posted: 2011年8月31日(水) 16:46
by OP
3825になりました!!minとmaxの代入を間違ってたみたいです!!返信をしてくれた皆様ありがとうございました!!

Re: 複数の引数について

Posted: 2011年8月31日(水) 16:46
by Tatu
書き込んでいくらなんでもこれはないだろうと思って調べてみたら
http://homepage3.nifty.com/mmgames/c_guide/11-02.html
に同じコードがのっていました。

Re: 複数の引数について

Posted: 2011年8月31日(水) 16:52
by 沖 滉均
解決にチェックされていますが、ちょっと待ってください。

そもそも、疑問点がよくわかりません。
OP さんが書きました:3825になりました!!minとmaxの代入を間違ってたみたいです!!
最初の質問に書かれたコードの時点で3825になっています。

今回に限らず、本当に理解できたのだろうか?
と心配になります

元の疑問点(わからないこと)について、どのように解決したのかを書くようにしていただけないでしょうか?

Re: 複数の引数について

Posted: 2011年8月31日(水) 17:00
by softya(ソフト屋)
私もOPさんは中途半端な理解のまま進んでいる気がしていたので、ちゃんと説明するクセを付けたほうが良いと思います。
出来るだけ最初の状況と解決に至った状況を細かく説明してみてください。

Re: 複数の引数について

Posted: 2011年8月31日(水) 17:12
by OP
すいません・・・できるだけがんばってみます。

Re: 複数の引数について

Posted: 2011年8月31日(水) 17:14
by OP
こういった3825になるのがわからない場合はどういう風に問題を書けばいいのでしょうか?

Re: 複数の引数について

Posted: 2011年8月31日(水) 17:35
by softya(ソフト屋)
ここで分からないポイントは、OPさんにとって何なのかを説明してください。
あと何が分かったんでしょうか? 分かったというのは他の人に説明できる状態のことを言います。今その状態ですか?
それと前に提案した日本語に書き換える法は実践していないのですか?その形で書いてもらってもかまいませんよ。

Re: 複数の引数について

Posted: 2011年8月31日(水) 17:55
by OP
やってみます!!

コード:

#include <stdio.h> //含む<stdio.h>

int sum(int,int);

int main(void)
{
	sum(50,100); //代入 50をmin100をmax
	return 0;
}

int sum(int min,int max) //minとmaxを使う
{
	printf("%d\n",(min + max) * (max - min + 1) / 2); //文字列を表示 計算して3825
	return 0;
}

Re: 複数の引数について

Posted: 2011年8月31日(水) 17:57
by 沖 滉均
沖 滉均 さんが書きました:引数がどのように入っているのかがわからないのでしょうか…
計算そのものがわからないのでしょうか…
なぜ数値が出力(表示)されるかがわからないのでしょうか…
上記のどれがわかりませんか?
先ほどあげた内容ですが、この質問には答えられますか?

四則演算の順序がわからないですとか、+-*/などの記号の意味が分からないですとか色々ありますよね

Re: 複数の引数について

Posted: 2011年8月31日(水) 18:01
by OP
なるほど!
私がわからなかったのは多分、sumがminとmaxに代入しているのかどうかわからなかったんだと、思います。

Re: 複数の引数について

Posted: 2011年8月31日(水) 18:07
by 沖 滉均
OP さんが書きました:sumがminとmaxに代入しているのかどうかわからなかったんだと、思います。
代入しているわけではありません。
「また、わからなかったんだと思います」ということは「何がわからなかったのかわかりません」ということでしょうか?
softya(ソフト屋) さんが書きました:最初の状況と解決に至った状況を細かく説明してみてください
また、こちらについても説明してみてください。
現状は解決に至った状況は何も書かれていません。

Re: 複数の引数について

Posted: 2011年8月31日(水) 18:19
by OP
う~ん・・・まずいまだにわからないことを説明したいと思います。

コード:

#include <stdio.h> //ここは<stdio.h>を含むということでしょうか。

int sum(int,int); //わかりません…

int main(void) //わかりません…
{
	sum(50,100); min,maxに50と100を渡している二でしょうか?
	return 0;
}

int sum(int min,int max) //minとmaxを使いますよーという宣言でしょうか?
{
	printf("%d\n",(min + max) * (max - min + 1) / 2); //文字列を表示 ここはちゃんと計算できました。
	return 0;
}
こんなところでしょうか。ちょっとわからないところはありますが・・・・。

Re: 複数の引数について

Posted: 2011年8月31日(水) 18:41
by softya(ソフト屋)
つまり、分かったという話は計算が分かったと言うことでしょうか?

あと分からないと書かれていることは1章と11章に全て書かれています。
もう一度読みなおして日本語化を丁寧にやってみてください。
説明済みの部分も説明がすごく不足しています。

例えば
//minとmaxを使いますよーという宣言でしょうか?
型はなんでしょうか?
普通の変数宣言となにが違うのでしょうか?

あるいは、
sum(50,100); min,maxに50と100を渡している二でしょうか?
sumについての説明は?
もし、int sum(int min,int max)がint sum(int max,int min)ならどうなりますか?

Re: 複数の引数について

Posted: 2011年8月31日(水) 18:50
by OP
ちょっと調べてきます!!

Re: 複数の引数について

Posted: 2011年8月31日(水) 19:03
by OP
調べてきました!!

コード:

#include <stdio.h>

int sum(int,int); //sum関数のint型の変数intに数値を格納

int main(void)
{
	sum(50,100); //後のminとmaxに50と100を代入
	return 0;
}

int sum(int min,int max) //後の計算にminとmaxを使うということを宣言
{
	printf("%d\n",(min + max) * (max - min + 1) / 2); //ここは普通に計算、3825に
	return 0;
}

Re: 複数の引数について

Posted: 2011年8月31日(水) 19:10
by softya(ソフト屋)
いえ、全然違います。
その上説明が消えている所があります。

コード:

#include <stdio.h> ←説明がありません。
 
int sum(int,int); //sum関数のint型の変数intに数値を格納 ←プロトタイプ宣言に関する説明を確認。
 
int main(void) ←1章を確認。
{
    sum(50,100); //後のminとmaxに50と100を代入 ← かなり説明不足です。
    return 0;
}
 
int sum(int min,int max) //後の計算にminとmaxを使うということを宣言 ← 説明に成っていません。あと私の書いた「たとえば」、「あるいは」の答えがありません。
{
    printf("%d\n",(min + max) * (max - min + 1) / 2); //ここは普通に計算、3825に ← 計算順番についてもっと説明してください。printfについても書いてください。
    return 0;
}

Re: 複数の引数について

Posted: 2011年8月31日(水) 19:15
by OP
私はまだ質問するにまでも知識が達していなかったみたいです…。
みなさんの返信をもとにもう少しsum関数やmain関数を調べてこようと思います。

Re: 複数の引数について

Posted: 2011年8月31日(水) 23:05
by 沖 滉均
次の質問を書かれていますが、ここはこのままで良いのでしょうか?
softyaさんの最後の質問にも答えておりませんね。
OP さんが書きました:私はまだ質問するにまでも知識が達していなかったみたいです…。
みなさんの返信をもとにもう少しsum関数やmain関数を調べてこようと思います。
この答えは出たのでしょうか?
それとも諦めてしまったのですか?

早く先に進みたいのはわからなくもありません
そして、しつこく説明してくださいと言われるのも気持ちの良いものではないでしょう

ですが、質問する→なんか解決したと思う→次やってみよう
これではいつまで経ってもOPさんがCを覚えることはできません

Re: 複数の引数について

Posted: 2011年8月31日(水) 23:25
by Dixq (管理人)
int sum(int,int);
で書いている説明が逆です。
これはプロトタイプ宣言と言って、こういう関数がプログラム内にありますよーという宣言です。
実際に定義しているのは
int sum(int min,int max)
からの部分ですね。
これはmain関数よりsum関数が下にあるから必要になる物です。
sum関数とmain関数を逆に書いてみて下さい。プロトタイプ宣言は必要ありません。

また、必要無くてもあって差支えないものなので、このファイルにはこんな関数がありますよ、ということを示すためにプロトタイプ宣言をまとめて最初に書いたりします。
そして「sum関数のint型の変数intに数値を格納」となっていますが、intは予約語なので、変数名に使えません。
int, intなのですから、カンマがついており、意味が区切られています。変数名が省略してあるだけで、int型の変数が存在するということを示しています。

#include <stdio.h>

の説明は今の時点では難しいようなので、「C言語の書き初めに書くおまじない」位の解釈でも良いと思いますが、
他の基本的なことは、沖さん達も言っているようにきちんと一つ一つ確実に抑えて行かないと、この先ずっと困る事になってしまいます。
頑張って分からないことをつぶしていきましょう。