2009年6月30日火曜日

C言語講座 第5回 ifと似てるよ条件演算子 [解答済]

お題:
①プログラム実行中に3つの”整数”(正負に対応)の入力を受け付け、一番大きい数字を表示させる。
②100と一番大きい数字との差を正の整数で表示させる。
注意:ifとelseは使ってはいけない。①、②とも条件演算子を用いたプログラムにせよ。

プログラム実行例

整数を3つ入力してください。
a:
b:
c:
一番大きい数字は:
一番大きい数字と100との差は:

必須文字列
・条件演算子 ___ ? ____ : ____

条件演算子の使い方をマスターしてください。うまく使うとプログラムを簡略化することが出来ます。

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

質問等はメールまたはコメントにて受け付けます。前回は解答者0だったので、今回は頑張って取り組んでください。

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

解答

解答例は以下の通りです

1

2
3
4
5
6
7
8

9
10
11

12
13
14
15

#include <stdio.h>

int main()
{
    int a,b,c,max,d;
    puts("3つの整数a,b,cを入力してください。");
    printf("a:");    scanf("%d",&a);
    printf("b:");    scanf("%d",&b);
    printf("c:");    scanf("%d",&c); 

    max = a;
    max = b > max ? b : max ;
    max = c > max ? c : max ;

    printf("一番大きい数字は:%d \n",max);
    d = max > 100 ? max - 100 : 100 - max ;
    printf("一番大きい数値と100との差は:%d \n",d);
}

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

3つの整数a,b,cを入力してください。
a:123
b:456
c:789
一番大きい数字は:789
一番大きい数値と100との差は:689

解説

_条件演算子の使い方についての問題です。条件演算子は次のように書きます。

式1  ?  式2  :  式3  ;

この意味は、「式1が非0なら式2を実行、式1が0なら式3を実行」となります。これをif文で表すとするなら、

if (式1) 式2; else 式3;

となります。

行番号9,10,11
一番大きな整数の選出ですが、まず、とりあえずaを一番大きいと仮定します。次にaとbを比べて、どちらか大きい方をmaxとします。cも同様に比べると、最終的に一番大きい数字がmaxに代入されます。

行番号13
ここでは、maxと100との差を求めています。差なので負にはなりません。なので条件演算子で「max>100ならmax-100、それ以外なら100-max」としています。それ以外の場合には、max=100も入ります。

_差を求める専用の関数もあります。それはabs関数といい、

A=abs(max-100);

と表すことも出来ます。しかし、abs関数を使うには、abs関数が乗ってる辞書、つまり「ライブラリ」がないと、コンピュータは分かってくれません。そのため、プログラムの頭(ヘッダという)に

#include <stdlib.h>

と書きくわえなければなりません。このように、#includeはコンピュータに使う辞書を指定する役割を持っています。stdlib.hが辞書にあたります。

_今回1番解答が早かったのはK林君です。

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

2009年6月28日日曜日

C言語講座 第4回 ifとelseと時々演算子

お題:
①プログラム実行中に1以上99以下の”2つの整数”a,bの入力を受けつけ、そのa,bの関係(a=b,a<b,a>b)を表示させる。
②a==a,a==0,a<100,a<0,a>0,a>100の関係演算子の結果をそれぞれ表示させる。

プログラム実行例

1以上99以下の整数を2つ入力してください。
a:
b:
a<bです。

関係演算子の結果は、
?
?
・・・

必須文字列
・if
・else
・==, < , >

ifとelseのスマートな書き方、関係演算子(==,<,>など)の仕組みを理解してください。

解答掲載は6月29日です。それまでに各自プログラムを作成し、
・プログラム文
・その実行ファイル
をメールに添付するか、8G以上のUSBメモリに入れてプレゼントするか、16GのmicroSDに入れてプレゼントするか、1TのHDに入れてプレゼントするか、いずれかの方法で提出してください。

質問等はメールまたはコメントにて。 どんな些細なことでも答えるので、頑張って取り組んでください。
cosmo-cleaner@za.pial.jp

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

解答

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

#include <stdio.h>

int main () {
    int a,b;
    printf("a:");    scanf("%d", &a);
    printf("b:");    scanf("%d", &b);
    if (a==b)
        puts("a=b");
    else if (a<b)
        puts("a<b");
    else if (a>b)    //elseのみでも可
        puts("a>b");
    printf("%d\n %d\n %d\n %d\n %d\n %d\n"
        ,a == a,a==0,a<100,a<0,a>0,a>100);
}

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

a:25
b:31
a<b
1
0
1
0
1
0

解説
演算子を使って条件を作りました。ifとelseの書き方は人それぞれですが、”else if ()”とした方がスマートでいいと思います。

②の課題は演算子の本質を知ることが目的です。演算子は2つの関数の関係性について、演算子が表現するものと一致するのかしないのかを、1か0で表します。この場合、例えばa==aは当然成り立つので、”1”が吐き出されます。a==0はaが0で無い限り一致しないので、”0”が吐き出されます。ifの条件で演算子が使えるのは、ifの「0か非0か」という条件分岐に合うからです。

演算子吐き出す1と0はint型なので、扱いには注意してください。

他の演算子として、
a!=b、a<=b、a>=bなどがありますが、自分で調べてみてください。

C言語講座 第3回 if と else [解答済]

お題:
①プログラム実行中に”整数”の入力を受け付け、その整数が偶数か奇数か判断する。偶数の時は「偶数です」、奇数の時は「奇数です」と表示させる。
②プログラム実行中に整数以外の値を入力された場合、「整数ちゃうよ」といったメッセージを表示させる。

プログラム実行表示例

整数を入力してください。
x:
入力された値は偶数(奇数)です。


or

なんで整数を入力しないんですか。ディスってるんですか。

必須文字列
・if
・else
・% (剰余を計算する演算子)

if文の本質をよく理解してください。条件がゼロならどうなるか、など。

解答掲載までの期間は3日間です。それまでに各自プログラムを作成し、
・プログラム文
・プログラムをコンパイルした実行ファイル
をメールに添付するなり、紙に書いてポストに投函するなり、言葉で伝えるなり、いかなる方法をつかっても構わないので提出してください。

質問等はメールまたはコメントにて。 どんな些細なことでも答えるので、頑張って取り組んでください。
cosmo-cleaner@za.pial.jp

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

解答

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

#include <stdio.h>

int main () {
    double x;    //入力値を格納
    int y;        //整数判定に使用
    printf("x:");    scanf("%lf",&x);
    y = 100000*x;

    if ( y % 100000)
        printf("なんで整数を入力しないんですか。\nディスってんディスか。\n");          
                 //x/10^5に余りがある時、ここを通る。
    else                                              
                //x/10^5の余りが"0"の時、ここを通る。
        if ((int)x % 2)
            puts("そいつは奇数です。");
        else
            puts("そいつは偶数です。");
    return(0);
}

解説
整数判定は、まず、入力された値を10^5倍し、小数点以下を整数に引きずり出し、int型のyに整数としてぶち込みます。次にifの条件でyを10^5で割った余りを判定します。

例えば、x=123.12345を代入すると、y=12312345となり、y/10^5の余りは12345となって、if条件が非0となるので、1つ目の命令を実行して終了します。
この場合、小数点以下5桁の値まで、整数か否かの判定ができます。それ以上の桁数だと判定出来ない場合があります。例えば123.0000023などの値です。結果と理由は考えてみてください。

ここで、注意しなければならないのは、int型は10ケタまでの整数しか扱えない、ということです。10ケタ以上の数を入れようとすると、エラーが起きて分け分からん値が代入されます。つまり、このプログラムでxに代入できる数は、整数5桁までの数字となります。それ以上だと1億万1回の1億万回くらいは”なんで整数入力しないんディスか”となります。例えば123456は10^5倍した時に10ケタを超えてしまうので、エラーになります。代入されるわけわからん値が見たい人は、プログラム作って試してみてください。簡単にできます。
つまり、このプログラムで扱えるxは
・小数点以下あわせて10ケタ
・小数点以下5ケタ
・整数5桁
の実数です。精度を変えたければ、10の乗数を変えます。

奇数、偶数判定はプログラムの通りです。2で割れるか、割れないかで判断します。この段階では、xは整数であると決まってるので、(int)xで、xをint型にします。みなさんから質問ありましたが、%は整数の計算しか扱えません。

あと、puts関数について。これは与えられた文字列を出力した後、改行してくれる便利な関数です。つまり、
puts(“ナイスデース”); = printf(“ナイスデース\n”);
という事になります。一行メッセージをちょろっと入れたい時に便利です。

C言語講座 第2回 演算と型 [解答済]

お題:
①プログラム実行中に2つの”小数点を持った実数値”の入力を受け付け、その実数値の足し算、引き算、掛け算、割り算の計算結果を表示する。
②”1/7”の計算結果を小数点以下3桁まで計算して表示させる。
以上の①、②を実行するプログラムを作成せよ。

プログラム実行表示例

2つの”小数点を持った実数値”を入力してください。
x:(ここに入力)
y:(ここに入力)

x + y =
x – y =
x * y =
x / y =

1 / 7 =

必須文字列
・double
・scanf
・%l(エル)f
・%.3f

解答掲載までの期間は3日間です。それまでに各自プログラムを作成し、
・プログラム文
・プログラムをコンパイルした実行ファイル
をメールに添付するなり、紙に書いてポストに投函するなり、言葉で伝えるなり、いかなる方法をつかっても構わないので提出してください。

質問等はメールまたはコメントにて。
cosmo-cleaner@za.pial.jp

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

解答

解答例は以下の通りです

#include <stdio.h>

int main () {

    double x,y;

    printf("2つの小数点を持った実数値を入力してください。\n");
    printf("x:");    scanf("%lf", &x);
    printf("y:");    scanf("%lf", &y);

    printf("x + y = %f \n",x+y);
    printf("x - y = %f \n",x-y);
    printf("x * y = %f \n",x*y);
    printf("x / y = %f \n",x/y);

    printf("1 / 7 = %.3f \n",1.0/7.0);    //ここは1と7ではなく1.0と7.0にしないとダメ
    return(0);

}

%lfは倍精度実数値といって、%fより精度が必要な時に使います。
たいていは使わないと思いますが、scanf()の場合は、%lfでないと、小数点以下の数を受け付けない(みたい)です。気になる人は実験してみてください。

1/7の計算をするときは、解答例のような書き方もありますが、この場合は小数点を含む実数を扱う%.3fに合わせて、1.0/7.0と計算式を入れなければなりません。しかし、島本君の解答にありましたが、このような書き方もあります。

printf("1 / 7 = %.3f\n" ,(double)1 / (double)7);

これは、1と7という整数を、double型に変換しています。書き方は、

(double) a //aは実数

このような変換はキャストと呼ばれ、()をキャスト演算子と言います。この方法を使えば、double型に変換されるので、小数点を含む実数を扱う%.3fにも対応できます。

解答早かった順位
1位 O氏
2位 島本

忙しいとは思いますが、こちらも時間さいて問題と解答作ってるので、頑張って講座に取り組んでください。質問があったらいつでも受け付けます。

質問、補足ありましたら、コメントまたはメールにて。

C言語講座 第1回 基本的な定型文とコンパイル [解答済]

お題:

私の名前は○○ △△です。
□□歳です。

と表示するプログラムを作成し、コンパイルせよ。□□には、整数の数字を代入する。

 

必須文字列 (これらを機能的に使用したプログラムにすること)
・include
・<stdio.h>
・printf
・%d
・int 

解答掲載までの期間は3日間です。それまでに各自プログラムを作成し、
・プログラム文
・プログラムをコンパイルした実行ファイル
をメールに添付するなり、紙に書いてポストに投函するなり、言葉で伝えるなり、いかなる方法をつかっても構わないので提出してください。

質問等はメールまたはコメントにて。
cosmo-cleaner@za.pial.jp

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

解答の一例

#include <stdio.h>

int main () {

    int age=220000;        //ageは年齢
    printf("私の名前は篠岡健です。\n%d歳です。\n" , age);

    return(0);

}

return(0)はあっても無くてもかまいません。プログラムを終わるときに添えます。

解答が早かった順に 島本、valda、こばやし。

C言語講座 開設のお知らせ

AVRマイコンのプログラムにはC言語の知識が不可欠なので、C言語を学ぶための講座を開きます。

形式としては、ここにお題投下して、各自お題の目的を達するプログラムを作成。質問はメール、メッセで応答。数日後、ここに回答や計算結果を投下、、、といった感じになると思います。

教材はありません。ネットにC言語に関する資料がいっぱいあるので、それをgoogleなりで調べてください。ちなみに、問題は「明解 C言語 入門編(柴田望伀洋 著)」 を参考に作ります。この本は2chの人が大絶賛してた本なので、超絶いいものです。

51N3ym-NBRL

講座を受ける前に、まず各自のPCにC言語の環境を整えてください。C言語のプログラムがコンパイル出来ればなんでもいいですが、便宜上「CPad for Borland C++Compiler」というソフトに統一します。このリンクにインストールの仕方が乗ってるので、他のサイトなども参考にして頑張って導入してください。ちなみにこんな感じのソフトです。

image

問題は後日投下します。

導入の報告、質問等は cosmo-cleaner@za.pial.jp までお願いします。