奇数の和

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

奇数の和

#1

投稿記事 by kyou » 16年前

みなさん おはようございます。

先日も教えていただいて大変助かったのですが、
ひょっとするとこの掲示板は 私の質問のような
初歩の初歩を投稿するような 場所ではないのかな?
(みなさんかなり高度で(^^ゞ )

と 思いつつ、自分の生活まわりには"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から入力された値まで)」
プログラムを作成したいのです。

奇数の和?はどのようにすると求めることができるのでしょうか?

どうか よろしくお願いいたします。

MNS

Re:奇数の和

#2

投稿記事 by MNS » 16年前

for(i=1;i<=n;i=i+2){ 
	wa=wa+n; 
}
これは・・
for(i=1;i<=n;i=i+2){ 
	wa=wa+i; 
}
こうではないでしょうか?

kyou

Re:奇数の和

#3

投稿記事 by kyou » 16年前

MNS様

早速ありがとうございます。

私も何度もこうかなぁ~と思いながら
残念ながら出来ません。

根本的にどこからか間違っているのでしょうか?

さが

Re:奇数の和

#4

投稿記事 by さが » 16年前

nが小さすぎです

追記 scanfを完全にスルーしていました。以後気をつけます。

たいちう

Re:奇数の和

#5

投稿記事 by たいちう » 16年前

難しいならば、段階的に作ってみましょう。
scanfで入力した値をnとして、

1)1からnまでを表示
2)1からnまでの和を表示
3)1からnまでの奇数を表示
4)1からnまでの奇数の和を表示

順番に完成させてください。
分からなければ、その部分について再度質問を。

conio

Re:奇数の和

#6

投稿記事 by conio » 16年前

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

kyou

Re:奇数の和

#7

投稿記事 by kyou » 16年前

konio様

ありがとうございます。



for(i = 1; i <= n; i += 2){
   wa += i;
   printf("%3d +",i);
 }
 printf("\b= %d \n",wa);
 printf("\n合計値:%d \n",wa);

 return(0);
}

上記の%3d+  と
\b の意味がわかりません。

ごめんなさい。もう泣きそうです。
弱音はダメですね。

もう少し頑張ります。

Mist

Re:奇数の和

#8

投稿記事 by Mist » 16年前

> 上記のプログラムはとりあえず、"代入"ではなく"初期化"しておいた方が良いでしょう。

代入と初期化どう違うのか説明してほしいです。
変数が使用される前にあらかじめ値をセットしておくことが変数の初期化であって、それば宣言と同時であっても宣言後であってもなんら変わりはないと思いますが?


※後半の書き方がまずかったので修正します

> そして、途中でnに1を代入する操作はいらないでしょう。(scanf関数で値が設定される)

> scanf("%d",&n);

の場合数字以外の文字を入力された場合、nが不定値のままなのでnに初期値を設定することは意味があると思います。

conio

Re:奇数の和

#9

投稿記事 by conio » 16年前

>>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);は式が分かりやすいようにするだけなので、
削除しても問題は無いです。

kyou

Re:奇数の和

#10

投稿記事 by kyou » 16年前

conio様 皆様

本当にご親切にありがとうございます。

皆さんに教えてもらったのをもとにいろいろ
検証し、理解していきたい思います。

Mist

Re:奇数の和

#11

投稿記事 by Mist » 16年前

私が言いたかったのは、代入であれ初期化であれ変数を使用するまでに初期値がセットされているならば実行結果は同じであるのに初期化のほうをわざわざ勧められるのが不思議に思えただけです。
代入ではなく初期化を使うことで何かメリットがあるのでしょうか?
私が初期化を使うのが好きじゃない(ソースコードの可読性が下がる場合がある)からそう思うだけかもしれませんが。

conio

Re:奇数の和

#12

投稿記事 by conio » 16年前

>>Mistさん


---------------------------------------------------------------
>>初期化を忘れると、合計が212753みたいな値になったりします。
>>なるべく初期化をしておいた方が良いと思います。
---------------------------------------------------------------

すでに上記で述べた通りです。

代入だと、「途中で代入し忘れて値が不定のままになってしまう」可能性がありますので、
「変数を生成する時には必ず何らかの値で初期化しておくようにする」という様にしておけば
そのような問題はほぼ無くなるかと思います。

ですので、「なるべく初期化をしておいた方が良い」と勧めました。
(もちろん、あくまで個人的な考えなので 実際にどうするかは自由です)

あと、上記の "初期化を忘れると"は、 "値の設定を忘れると"の方が適切なので、
読み替えて欲しいと思います。

たかぎ

Re:奇数の和

#13

投稿記事 by たかぎ » 16年前

> 私が言いたかったのは、代入であれ初期化であれ変数を使用するまでに初期値がセットされているならば実行結果は同じであるのに初期化のほうをわざわざ勧められるのが不思議に思えただけです。

実行結果が同じだからといって、どちらでもよいということにはなりませんね。
マジックナンバーを濫発しようが、スパゲッティコードだろうが、実行結果は同じなのになぜだめなのかというようなものです。

> 代入ではなく初期化を使うことで何かメリットがあるのでしょうか?

いくつかメリットがあります。

1. 初期化の意味で値を設定するのであれば、初期化のシンタックスを用いる方が自然である。
2. 宣言から初期値の代入までの間に、問題のあるコードを誤挿入するリスクがなくなる。
3. const修飾されたオブジェクトの場合、代入することができない。
4. 静的記憶域期間を持つ場合、スタートアップでゼロクリアするための実行時間が節約できる。
5. 集成体の場合、複数の代入を繰り返さなければならず、効率が低下する場合がある(C99では、構造体に複合リテラルを代入することが可能)。

逆に初期化では実現できない場合もあります。

1. 集成体の要素に定数式以外を設定する(ただし、C99では、自動記憶域期間の場合には可能)。
2. 要素を指定して値を設定する(C99では可能)。
3. 共用体の場合、最初のメンバ以外を初期化することができない(C99では可能)。

閉鎖

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