2009年7月20日月曜日

第9回 while文

予備知識:
自然対数eは

e=1/0! + 1/1! + 1/2! + 1/3! + ・・・ 1/(n+1)!

で求まります。nの値が大きいほどeの精度が増します。
また、n!=1×2×3×・・・×n です。0!=1です。

お題:
自然対数eを求めるプログラム
①はじめに、求める精度=項数nを整数で入力させる
②eの計算結果を表示する

プログラム実行例

精度nを入力してください。
n:30
e=2.718282

必須事項
・while文を使うこと
・n=1にも対応する。 (この時e=1.0)

while文とは
while文は

while (式) {}

と記述され、{}ブロック内の命令を(式)の条件を満たす限り繰り返し実行します。特徴的なのは、(式)の判断を{}ブロックを実行する前に行うことです。do文では{}ブロックを実行した後に判断していました。例えば、

scanf("%d", &a);
while ( a != 7777777) {
    puts("気合いを入れろ!");
    scanf("%d", &a);
}
puts("正解");

とすると、最初にa=7777777と当てられればwhile文に入らず「正解」となります。はずれたら、while文に入って当たるまで永遠と無限ループします。

これを利用して自然対数を求めましょう。

解答は7月26日の夜に掲載します。それまでに各自プログラムを作成し、
・プログラム文
・その実行ファイル
をメールに張り付けて以下のアドレスに送ってください。

解答、質問はこちらまで。
cosmo-cleaner@za.pial.jp

---------------------------------------------------------------

解答例

1

2
3
4
5
6
7

8
9
10
11
12
13
14
15
16
17
18
19

20
21

#include <stdio.h>

int main () {
    double e,b;
    int a,c,n,i;
    puts("精度nを入力してください。");   
    printf("n=");    scanf("%d",&n);
    printf("e=");

    c=1;
    b=1.0;
    while ( c < n ) {
        i=1;
        a=1;
        while ( i <= c ) {
            a=a*i;
            i = i+1;
        }
        b = b+(double)1/a;
        c = c+1;
    }
 

    printf("%f",b);
}

実行例は次の通りです。

精度nを入力してください。
n=30
e=2.718282

解説

このプログラムの流れは、
1.各項の分母を計算
2.各項を確立
3.項を合計していく
といったイメージになっています。定義した変数a,b,c,i,nについて
aは分母
bは各項の和
cは項数のカウント
iはn!の掛け算のカウント
nは求める項の数=精度
に使用しています。

青い部分では各項の分母を作っています。n項目の分母は(n-1)!なので、例えば4項目の分母を計算しているなら、while文でiがになるまで1*2*3と計算します。具体的には、
1巡目:i=1, a=1 → a=1*1, i=1+1=2
2巡目:i=2, a=2 → a=1*2, i=2+1=3
3巡目:i=3, a=2 → a=2*3, i=3+1=4
といった具合です。ちなみに指定した精度がn=1の時、青い部分のwhile文には入らず、答えとしてbの初期値”1”が吐き出されます。

赤い部分では、青い部分で出来上がった分母から項を作り、n項まで合計していきます。

最終的にbには全項の合計が入っているので、それをprintfで表示させます。

答えられる範囲で質問いつでも受け付けます。
cosmo-cleaner@za.pial.jp

2009年7月13日月曜日

第8回 do文 [解答済]

お題:
その数が素数がどうか判別するプログラム
①はじめに10桁以下の整数を入力させる
②それが素数かどうか判別する。

プログラム実行例

10桁以下の整数を入力してください。
a:3257

これ素数

必須事項
・do文を使うこと

do文とは
do文は、

do {} while ();

と記述され、{}ブロック内の命令をwhile()内の式が成り立つまで繰り返し実行します。例えば、

do {
    puts("気合いを入れろ!");
    scanf("%d", &a);
} while ( a == 777777777);

のようにプログラムします。このプログラムでは、気合いでa=777777777を当てない限り、プログラムは終わりません。

これを利用して素数判別プログラムを作ってください。

解答は7月19日の夜に掲載します。それまでに各自プログラムを作成し、
・プログラム文
・その実行ファイル
をメールにがっちり張り付けて以下のアドレスに送ってください。

解答、質問はこちらまで。
cosmo-cleaner@za.pial.jp

---------------------------------------------------------------

解答

解答例は以下の通りです。

1

2
3
4
5
6

7
8
9

10
11
12
13
14
15

#include <stdio.h>

int main () {
    int a,b;
    b=1;    //bの初期値
    puts("10桁以下の整数を入力してください。");
    printf("a:");    scanf("%d", &a);

    do {
        b=b+1;
    } while ( a%b);


    if ( b < a ) {
        puts("これ素数じゃない");
    }
    else
        puts("これ素数");

}

実行例は以下の通りです。

10桁以下の整数を入力してください。
a:131
これ素数

解説

素数は1か、その数でないと割れない数なので、do文でひたすら割り続けるプログラムを作りました。

赤い部分はそのdo文です。bの初期値は1なので、b=2からスタートします。while()の条件を満たすとdo文を抜ける事ができます。つまり、2から順々にaを割って行って、aがbで割り切れた時点でdoを抜けます。

ここで、bには、とにもかくにもaを割ることの出来る数字が入っています。
青い部分では、bがaそのものなのか、aより小さい数なのかを判別します。もし、bがaと一致、つまりaが1とaでしか割れないとすれば、aは素数ということになります。
一方bがaより小さければ、aはbの倍数ということなので、素数ではありません。

ある数を解析する際、単純な作業を人海戦術できるのがコンピュータの利点と言えます。

今回解答が一番早かったのはKばやし君です。

答えられる範囲で質問いつでも受け付けます。
cosmo-cleaner@za.pial.jp

 

2009年7月9日木曜日

第7回 ifとSwitch文 [解答済]

お題:
10進数を16進数に変換する。
①はじめに、1から255までの整数を入力させる。
②その10進数を16進数に変換すると、どんな数になるか答える。

プログラム実行例

1から255までの整数を入力してください。
a:18

16進数に変換すると:12

必須事項
・if文、switch文を使う。

switch文は単なる場合分けをしてくれます。作る側にとって、直感的に作れるので便利です。

例えば以下のように記述します

Switch (a % 3) {
    case 0 : puts("aは3で割り切れる"); break;
    case 1 : puts("aを3で割ると1余る"); break;
    case 2 : puts("aを3で割ると2余る"); break;
}
 

()の中の答えをcaseで場合分けして、それぞれの命令を実行します。ここで重要なのは、各命令の最後にあるbreak;で、これがないと、switchのブロック{}を抜ける事ができません。

16進数はネットで調べれば光速で見つかるので、調べてください。

解答掲載は7月12日の夜です。それまでに各自プログラムを作成し、
・プログラム文
・その実行ファイル
をメールに添付ingしてください。

解答、質問はこちらまで。
cosmo-cleaner@za.pial.jp

---------------------------------------------------------------

解答

解答例は以下の通りです。

1

2

3

4
5
6

7
8
9
10
11
12
13
14
15
16
17

18
19
20
21
22
23
24
25
26
27
28
29

#include <stdio.h>

int main () {

    int a;

    puts("1から255までの整数を入力してください");
    printf("a:");    scanf("%d", &a);
    printf("16進数に変換すると:");

    if ( a/16 < 10) printf("%d",a/16);
    else {
        switch (a/16) {
            case 10 : printf("A");    break;
            case 11 : printf("B");    break;
            case 12 : printf("C");    break;
            case 13 : printf("D");    break;
            case 14 : printf("E");    break;
            case 15 : printf("F");    break;
        }
    }


   if ( a%16 < 10) printf("%d", a%16);
    else {
        switch (a%16) {
            case 10 : puts("A");    break;
            case 11 : puts("B");    break;
            case 12 : puts("C");    break;
            case 13 : puts("D");    break;
            case 14 : puts("E");    break;
            case 15 : puts("F");    break;
        }
    }

}

実行例は以下の通りです。

1から255までの整数を入力してください
a:234
16進数に変換すると:EA

解説

16進数は桁が16までいくと、桁が繰り上がります。10進数の世界では数字が0から9までしかないので、10以上を1桁で表すためにA,B,C,D,E,Fの英語を使います。このプログラムは、その過程を忠実に実行しているだけです。

まず、青い部分では16進数の2桁のうちの16の位?つまり2桁目の変換を行います。1から255までの整数が来るはずなので、16進数が3ケタになる事はありません。ptintf(””)を改行なしで使うことで、16進数の二桁目を表示した後、改行せず1桁目を並べることができます。

赤い部分は16進数の1桁目を変換していますが、やってることは青い部分と同じです。aが10以下ならそのまま表示して、10以上なら英語に変換します。

今回解答が1番早かったのは僕です。かなしいです。

答えられる範囲で質問いつでも受け付けます。
cosmo-cleaner@za.pial.jp

 

2009年7月4日土曜日

第6回 ifとブロック複合文と論理演算子 [解答済]

お題:
日本の単位とSI単位を調べるプログラムを作る
①はじめに、「日本の単位」か「SI単位」かを選ばせる。
②10の何乗が知りたいかを尋ね、その単位が何なのかを表示する
③1から10の12
乗まで対応する
注意!例えば10の5乗を万、10の7条をM(メガ)としてください!!

プログラム実行例

どちらが知りたいか選んでよね。
1.日本の単位
2.SI単位
知りたい単位は:1(例)

10の何乗が知りたいのか書いてよね。
10の何乗?:9
それは億ね。

10の何乗が知りたいのか書いてよね。
10の何乗?:5
それは万ね。

10の何乗?:100000
それは知らない。

10の何乗?:-0120444444
それは知らない。

必須事項
・if () { } else { } を使う。
・論理演算子 && || を使う。

if () { } else { }の{}はブロック(複合文)といって、2行以上の命令を含む時に使います。論理演算子はifの条件で使います。使い方は以前つかった演算子と同じです。意味を調べて、よく覚えておいてください。

単位についてはこちらを参考にしてください。USEDしてる人にはお馴染み単位だと思います

解答掲載は7月8日です。それまでに各自プログラムを作成し、
・プログラム文
・その実行ファイル
をメールに添付するか、メールに添付してください。

解答、質問はこちらまで。
cosmo-cleaner@za.pial.jp

---------------------------------------------------------------

解答

解答例は以下の通りです。

1

2
3
4

5
6
7

8
9
10
11

12
13

14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29

30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45

46

#include <stdio.h>

int main () {
    int a;    //どちらの単位が知りたいか
    int b;    //10のb乗

    puts("どちらが知りたいか選んでよね");
    puts("1.日本の単位 2.SI単位\n");
    printf("知りたい単位は:");    scanf("%d",&a);
   
    if ( a < 1 || 2 < a) {
        puts("指示通りに答えてね");
        return (0);
    }


    puts("10の何乗が知りたいのか書いてよね。");
    printf("10の何乗?:");    scanf("%d",&b);

    if (a==1) {
        if ( b==1 )
            { puts("それは十ね。"); }
        else if (b==2)
            { puts("それは百ね。"); }
        else if (b==3)
            { puts("それは千ね。"); }
        else if (3 < b && b < 8)
            { puts("それは万ね。"); }
        else if (7 < b && b < 12)
            { puts("それは億ね。"); }
        else if (b==12)
            { puts("それは兆ね。"); }
        else
            { puts("それは知らない。"); }
    }

  
else if (a==2) {
        if ( b==1 )
            { puts("それはdaね。"); }
        else if ( b==2 )
            { puts("それはhね。"); }
        else if ( 2 < b && b < 6 )
            { puts("それはkね。"); }
        else if ( 5 < b && b < 9 )
            { puts("それはMね。"); }
        else if ( 8 < b && b < 12 )
            { puts("それはGね。"); }
        else if ( b == 12 )
            { puts("それはTね。"); }
        else
            { puts("それは知らないっす。");}
    }

}   

実行例は以下の通りです。

どちらが知りたいか選んでよね
1.日本の単位 2.SI単位

知りたい単位は:2
10の何乗が知りたいのか書いてよね。
10の何乗?:5
それはkね。

解説

まず、どの単位が知りたいのか聞きます。プログラムの茶色い部分では、答える人間が1と2以外を入力したときに、「指示通りに答えてね」と表示し、プログラムを終了するようになっています。ここで、論理OR演算子を利用しています。

論理OR演算子 a || b 
aとbどちらかが成り立たてば非0、成り立たなければ0

また、10行目のreturn(0);を入れることによって、プログラムを終了させることができまう。便利なので覚えておいてください。

赤い部分では、a=1、つまり日本の単位についてのプログラムです。ここで論理AND演算子を利用しています。

論理AND演算子 a && b
aとbどちらも成り立てば非0、成り立たなければ0

ちなみに、ifの条件で、例えば( 3 < b < 8 )とすると、プログラムが成り立ちません。気を付けてください。試してみると面白いです。

青い部分では同様にSI単位についてのプログラムです。

今回1番解答が早かったのはKBやし君です。

答えられる範囲で質問いつでも受け付けます。
cosmo-cleaner@za.pial.jp

目次

目次です
随時更新していきます。

基本
第1回 基本的な定型文とコンパイル [解答済]
第2回 演算と型 [解答済]

if文
第3回 if と else [解答済]
第4回 ifとelseと時々演算子[解答済]
第5回 ifと似てるよ条件演算子 [解答済]
第6回 ifとブロック複合文と論理演算子 [解答済]

Switch文
第7回 ifとSwitch文 [解答済]

do文
第8回 do文 [解答済]

while文
第9回 while文
第10回 while文②
第11回 while文③ 配列を使ったプログラム

for文
第12回 for文①
第13回 for文② 多重ループ
第14回 for文③ 多重ループ

配列
第15回 配列① FizzBuzz