奇数の和
奇数の和
みなさん おはようございます。
先日も教えていただいて大変助かったのですが、
ひょっとするとこの掲示板は 私の質問のような
初歩の初歩を投稿するような 場所ではないのかな?
(みなさんかなり高度で(^^ゞ )
と 思いつつ、自分の生活まわりには"c言語"に
まったく無縁の方々ばかりで・・・ みなさんに
教えていただくしか 今の私にすべはないのです。
前おきが長くて申し訳ございません。
本題です。
for文を利用して
#include<stdio.h>
intmain(void)
{
inti,n,wa;
wa=0;
n=1;
scanf("%d",&n);
printf("\n入力値:%d",n);
for(i=1;i<=n;i=i+2){
wa=wa+n;
}
printf("\n合計値:%d",wa);
}
こんな感じまで考えてみたのですが、
実はこれを「奇数の和を求めて出力する(1から入力された値まで)」
プログラムを作成したいのです。
奇数の和?はどのようにすると求めることができるのでしょうか?
どうか よろしくお願いいたします。
先日も教えていただいて大変助かったのですが、
ひょっとするとこの掲示板は 私の質問のような
初歩の初歩を投稿するような 場所ではないのかな?
(みなさんかなり高度で(^^ゞ )
と 思いつつ、自分の生活まわりには"c言語"に
まったく無縁の方々ばかりで・・・ みなさんに
教えていただくしか 今の私にすべはないのです。
前おきが長くて申し訳ございません。
本題です。
for文を利用して
#include<stdio.h>
intmain(void)
{
inti,n,wa;
wa=0;
n=1;
scanf("%d",&n);
printf("\n入力値:%d",n);
for(i=1;i<=n;i=i+2){
wa=wa+n;
}
printf("\n合計値:%d",wa);
}
こんな感じまで考えてみたのですが、
実はこれを「奇数の和を求めて出力する(1から入力された値まで)」
プログラムを作成したいのです。
奇数の和?はどのようにすると求めることができるのでしょうか?
どうか よろしくお願いいたします。
Re:奇数の和
---------------------------------------------------
#include<stdio.h>
int main(void)
{
inti,n,wa;
wa=0;
n=1;
scanf("%d",&n);
printf("\n入力値:%d",n);
for(i=1;i<=n;i=i+2){
wa=wa+n;
}
printf("\n合計値:%d",wa);
}
---------------------------------------------------
上記のプログラムはとりあえず、"代入"ではなく"初期化"しておいた方が良いでしょう。
int wa = 0, n = 0;みたいに。
初期化を忘れると、合計が212753みたいな値になったりします。
なるべく初期化をしておいた方が良いと思います。
そして、途中でnに1を代入する操作はいらないでしょう。(scanf関数で値が設定される)
既に解答は出ていますが、一応 修正&追加したプログラムを書いてみました↓
---------------------------------------------------
#include<stdio.h>
int main (void){
int i, n = 0, wa = 0;
scanf("%d",&n);
printf("\n入力値:%d \n",n);
for(i = 1; i <= n; i += 2){
wa += i;
printf("%3d +",i);
}
printf("\b= %d \n",wa);
printf("\n合計値:%d \n",wa);
return(0);
}
---------------------------------------------------
#include<stdio.h>
int main(void)
{
inti,n,wa;
wa=0;
n=1;
scanf("%d",&n);
printf("\n入力値:%d",n);
for(i=1;i<=n;i=i+2){
wa=wa+n;
}
printf("\n合計値:%d",wa);
}
---------------------------------------------------
上記のプログラムはとりあえず、"代入"ではなく"初期化"しておいた方が良いでしょう。
int wa = 0, n = 0;みたいに。
初期化を忘れると、合計が212753みたいな値になったりします。
なるべく初期化をしておいた方が良いと思います。
そして、途中でnに1を代入する操作はいらないでしょう。(scanf関数で値が設定される)
既に解答は出ていますが、一応 修正&追加したプログラムを書いてみました↓
---------------------------------------------------
#include<stdio.h>
int main (void){
int i, n = 0, wa = 0;
scanf("%d",&n);
printf("\n入力値:%d \n",n);
for(i = 1; i <= n; i += 2){
wa += i;
printf("%3d +",i);
}
printf("\b= %d \n",wa);
printf("\n合計値:%d \n",wa);
return(0);
}
---------------------------------------------------
Re:奇数の和
> 上記のプログラムはとりあえず、"代入"ではなく"初期化"しておいた方が良いでしょう。
代入と初期化どう違うのか説明してほしいです。
変数が使用される前にあらかじめ値をセットしておくことが変数の初期化であって、それば宣言と同時であっても宣言後であってもなんら変わりはないと思いますが?
※後半の書き方がまずかったので修正します
> そして、途中でnに1を代入する操作はいらないでしょう。(scanf関数で値が設定される)
> scanf("%d",&n);
の場合数字以外の文字を入力された場合、nが不定値のままなのでnに初期値を設定することは意味があると思います。
代入と初期化どう違うのか説明してほしいです。
変数が使用される前にあらかじめ値をセットしておくことが変数の初期化であって、それば宣言と同時であっても宣言後であってもなんら変わりはないと思いますが?
※後半の書き方がまずかったので修正します
> そして、途中でnに1を代入する操作はいらないでしょう。(scanf関数で値が設定される)
> scanf("%d",&n);
の場合数字以外の文字を入力された場合、nが不定値のままなのでnに初期値を設定することは意味があると思います。
Re:奇数の和
>>Mistさん
「変数の生成時にある初期値を入れておく」のが "初期化"で、
「変数を生成した後に、値を入れる」のが "代入"だと記憶しております。
--------------------------------
int x = 0;//初期化
int x;
x = 0; //代入
--------------------------------
あとscanf関数についてですが、「例外は無いもの」として考えました。「必ず数値が入れられる」という前提です。
(文字を入力してしまった場合などは考えない)
あと、代入の変わりにn = 0で初期化してあるので、不定値にはならないようにしています。
(初期化するようにプログラムを変更した場合は、途中のn = 1はいらなくなる という意味)
n = 0;//初期化
n = 1;//←いらない
n = 5;//scanf関数で値が設定される
言葉足らずですいませんでした。
>>kyouさん
printf("%3d +",i);
まず %3d は「少なくとも3桁で表示」という意味です。
3桁の値ではない場合は、空白が埋められ 間隔が出来て見やすくなります。
(+ の方は単純に、"+"と表示させる為のものです。)
-----------------------------------------------------
for(int i = 1; i <= 3; i++)
printf("%d", i);
【実行結果】
123
for(int i = 1; i <= 3; i++)
printf("%3d", i);
【実行結果】
1 2 3
-----------------------------------------------------
\bの方は「拡張表記」と呼ばれるものです。
(改行をする \n も拡張表記の一種です。)
\bは「表示位置を直前の位置へ移動させる」機能です。
キーボードのバックスペースを押して、文字を消す動作だと思ってください。
-----------------------------------------------------
printf("123");
printf("\b");
【実行結果】
12
-----------------------------------------------------
printf("%3d +",i);とprintf("\b= %d \n",wa);は式が分かりやすいようにするだけなので、
削除しても問題は無いです。
「変数の生成時にある初期値を入れておく」のが "初期化"で、
「変数を生成した後に、値を入れる」のが "代入"だと記憶しております。
--------------------------------
int x = 0;//初期化
int x;
x = 0; //代入
--------------------------------
あとscanf関数についてですが、「例外は無いもの」として考えました。「必ず数値が入れられる」という前提です。
(文字を入力してしまった場合などは考えない)
あと、代入の変わりにn = 0で初期化してあるので、不定値にはならないようにしています。
(初期化するようにプログラムを変更した場合は、途中のn = 1はいらなくなる という意味)
n = 0;//初期化
n = 1;//←いらない
n = 5;//scanf関数で値が設定される
言葉足らずですいませんでした。
>>kyouさん
printf("%3d +",i);
まず %3d は「少なくとも3桁で表示」という意味です。
3桁の値ではない場合は、空白が埋められ 間隔が出来て見やすくなります。
(+ の方は単純に、"+"と表示させる為のものです。)
-----------------------------------------------------
for(int i = 1; i <= 3; i++)
printf("%d", i);
【実行結果】
123
for(int i = 1; i <= 3; i++)
printf("%3d", i);
【実行結果】
1 2 3
-----------------------------------------------------
\bの方は「拡張表記」と呼ばれるものです。
(改行をする \n も拡張表記の一種です。)
\bは「表示位置を直前の位置へ移動させる」機能です。
キーボードのバックスペースを押して、文字を消す動作だと思ってください。
-----------------------------------------------------
printf("123");
printf("\b");
【実行結果】
12
-----------------------------------------------------
printf("%3d +",i);とprintf("\b= %d \n",wa);は式が分かりやすいようにするだけなので、
削除しても問題は無いです。
Re:奇数の和
>>Mistさん
---------------------------------------------------------------
>>初期化を忘れると、合計が212753みたいな値になったりします。
>>なるべく初期化をしておいた方が良いと思います。
---------------------------------------------------------------
すでに上記で述べた通りです。
代入だと、「途中で代入し忘れて値が不定のままになってしまう」可能性がありますので、
「変数を生成する時には必ず何らかの値で初期化しておくようにする」という様にしておけば
そのような問題はほぼ無くなるかと思います。
ですので、「なるべく初期化をしておいた方が良い」と勧めました。
(もちろん、あくまで個人的な考えなので 実際にどうするかは自由です)
あと、上記の "初期化を忘れると"は、 "値の設定を忘れると"の方が適切なので、
読み替えて欲しいと思います。
---------------------------------------------------------------
>>初期化を忘れると、合計が212753みたいな値になったりします。
>>なるべく初期化をしておいた方が良いと思います。
---------------------------------------------------------------
すでに上記で述べた通りです。
代入だと、「途中で代入し忘れて値が不定のままになってしまう」可能性がありますので、
「変数を生成する時には必ず何らかの値で初期化しておくようにする」という様にしておけば
そのような問題はほぼ無くなるかと思います。
ですので、「なるべく初期化をしておいた方が良い」と勧めました。
(もちろん、あくまで個人的な考えなので 実際にどうするかは自由です)
あと、上記の "初期化を忘れると"は、 "値の設定を忘れると"の方が適切なので、
読み替えて欲しいと思います。
Re:奇数の和
> 私が言いたかったのは、代入であれ初期化であれ変数を使用するまでに初期値がセットされているならば実行結果は同じであるのに初期化のほうをわざわざ勧められるのが不思議に思えただけです。
実行結果が同じだからといって、どちらでもよいということにはなりませんね。
マジックナンバーを濫発しようが、スパゲッティコードだろうが、実行結果は同じなのになぜだめなのかというようなものです。
> 代入ではなく初期化を使うことで何かメリットがあるのでしょうか?
いくつかメリットがあります。
1. 初期化の意味で値を設定するのであれば、初期化のシンタックスを用いる方が自然である。
2. 宣言から初期値の代入までの間に、問題のあるコードを誤挿入するリスクがなくなる。
3. const修飾されたオブジェクトの場合、代入することができない。
4. 静的記憶域期間を持つ場合、スタートアップでゼロクリアするための実行時間が節約できる。
5. 集成体の場合、複数の代入を繰り返さなければならず、効率が低下する場合がある(C99では、構造体に複合リテラルを代入することが可能)。
逆に初期化では実現できない場合もあります。
1. 集成体の要素に定数式以外を設定する(ただし、C99では、自動記憶域期間の場合には可能)。
2. 要素を指定して値を設定する(C99では可能)。
3. 共用体の場合、最初のメンバ以外を初期化することができない(C99では可能)。
実行結果が同じだからといって、どちらでもよいということにはなりませんね。
マジックナンバーを濫発しようが、スパゲッティコードだろうが、実行結果は同じなのになぜだめなのかというようなものです。
> 代入ではなく初期化を使うことで何かメリットがあるのでしょうか?
いくつかメリットがあります。
1. 初期化の意味で値を設定するのであれば、初期化のシンタックスを用いる方が自然である。
2. 宣言から初期値の代入までの間に、問題のあるコードを誤挿入するリスクがなくなる。
3. const修飾されたオブジェクトの場合、代入することができない。
4. 静的記憶域期間を持つ場合、スタートアップでゼロクリアするための実行時間が節約できる。
5. 集成体の場合、複数の代入を繰り返さなければならず、効率が低下する場合がある(C99では、構造体に複合リテラルを代入することが可能)。
逆に初期化では実現できない場合もあります。
1. 集成体の要素に定数式以外を設定する(ただし、C99では、自動記憶域期間の場合には可能)。
2. 要素を指定して値を設定する(C99では可能)。
3. 共用体の場合、最初のメンバ以外を初期化することができない(C99では可能)。