goo blog サービス終了のお知らせ 

真・女神転生imagine-JZ13(バックアップ)

Broachで投稿していた記事のバックアップです。

自習→宿題へ

2010-07-18 16:58:34 | C言語教室での出来事
現在、教室内のほぼ全員が詰まっているのがこの課題。

課題名:C課題12:三項演算子

機能: キーボードから数字を入力して、その数値が
偶数か奇数かを表示するプログラムを作成。
数字以外は再入力する。
(三項演算子を使用すること)


で、基本的なプログラムはこれ。(中身だけ貼ります)

int main(void)
{
int a,x; /*aとxをint=整数として設定*/

scanf("%d",&a); /*10進法でキーボードからaのアドレスへ入力*/
x=a%2; /*aを割った余りをxに代入*/
(x=(x==1)? 75:71); /*xが1(真)ならばK(ascii75)を、1以外(偽)ならG(ascii71)をxに代入*/
printf("%c10",x); /*xの内容を文字として表示*/
printf("G=偶数、K=奇数10"); /*表示されるアルファベットの説明をしてるだけ*/
return(0);

}
----------------------------------------------
が三項演算子。
注1:文中の「10」は「改行」コードです。(ex.K=奇数10)
通常は¥n(半角で円マークエヌ)と書き、プログラムのオリジナルでもそう入力してますが、
ここに貼り付けるとCSSの関係からか、なぜかバックスラッシュエヌになってしまいます。
「読み替えてください」というのも見づらいかな、と思い、同じ意味の10に書き換えました。
(\nと入力して円マークエヌに見えてますか…?)

注2:/* */で囲まれた部分(緑文字)はコメントです。
環境はC++なので文頭に//とつけるだけでコメントになるのですが、授業内容がCなのでコメントの書式もCの書式で統一しています。
----------------------------------------------

これは、お題の「三項演算子」は使用していますが「数字以外は再入力」という動きはしないので×。
動きとしては「1」と入力したら画面に「K」改行して「G=偶数、K=奇数」とだけ出ます。
「0」と入力しても「G(偶数)」と表示されるという穴は目をつぶってやってください。そこ修正するのメンドいんでw
(2で割り切れるかどうかしか判定してないので、0を数字に含めないとなると数式からやり直すハメになる)

もともと「まあとりあえず、三項演算子を使って動くようにしてからifかなんかで分岐しよう」と考えていたのでここから改造を始めます。
改造したのがこちら。

int main(void)
{
int a; /*aをint=整数として設定*/

do   /*数字以外ならここに戻って繰り返し*/
{
printf("数字を入力して下さい10"); /*「数字を入力して下さい」を表示*/
a=getchar( ); /*文字を一文字ずつ(キャラクター属性で)入力*/

}while ((47 >= a) || (a >= 58)); /*数字/文字判定 数字以外を抽出*/

a=a%2; /*割って余りを求める*/
(a=(a==1)? 75:71); /*余りが1なら奇数K(ascii75):0なら偶数G(ascii71)を表示*/
printf("%c10",a); /*aの内容=入力された数字を表示*/
printf("G=偶数、K=奇数10"); /*表示内容の説明*/
return(0);
}

通常、これでお題はクリアです。通常は!
しかし、これを作っている途中でボソっと後ろのほうから講師の声が聞こえます。

「これだったら2ケタや3ケタ入力したらおかしくなるでしょ?よく考えなさいよ!」
他の人が叱られてる声でした。(言い方もかなりきつい)

確かに、上記のプログラムで複数ケタで入力してみると、最初に入力した数字しか残らないので誤作動します。
例えば、326と入力すると正解は「偶数」ですが、最初に入力した「3」しか認識できないので「奇数」と判定されます。
これが聞こえたので全員が一斉に「じゃあ複数桁で入力できるようにしようか」(☆これは簡単)と言っていた矢先。
(☆getcharをgetsに換えて「文字列入力」にし、キャスト演算子を使って文字列から数字に変換するだけ。あとは1ケタになるまで2で割ればオケ。)
他の人が「全部数字が入るとは限らないでしょ?途中でアルファベットとか入ったらどうするんです?」と言われ…。(今ココ
で、お題のハードルはどんどん高くなっていきます。^^;

<チラ裏>
みんな顔を突き合わせてボソボソと「なんか言ってることが変わってきてない?」と漏れる漏れるグチの嵐w
いや確かに、色々な可能性を考えなきゃいけないんでしょうけど、最初からそのレベル求められるの?って。^^
お題(=講師は『仕様書』と言います)は大雑把にしか書いてないのに、あとからあとから付け足されてイヤミっぽく感じるのですよ。
「現場では完璧な指示の仕様書なんてありませんよ!」なんて鼻高々に言われても、現場なんて出たことないしなぁ…てか、恐らくプロになんかならない(なれない)しなぁ…てw
</チラ裏>

scanf("%c",&文字列バッファ)で、複数桁を一文字ずつ認識する所までは成功していますが、その先が判らず、みんなで煮詰まってます。
恐らくバッファの番地番号で一文字ずつ「数字/文字判定」をやればいいんでしょうけど、まず何文字入るか未定ってところが…。
もっと根本的な所でも、キャラ属性で一文字ずつ認識したあと、数値(intとか)に変換する方法が判らない…。^^
scanfでc、d、f、なにで取っても最終的に整数にできないのでどうしたもんかなぁ…。
なのであとは自習でなんとか考えるのみです。死にそうです。

自習!

2010-07-18 14:56:20 | C言語教室での出来事
とゆーわけでVisual Studioも手に入れて、もっぱらネットで自習しております。
フレさんに教えてもらった「苦しんで覚えるC言語」というサイトを利用してますが、丁寧で判りやすいです。

もちろん、まったくの予備知識なしにここを見ても「判りやすい」かどうかの判断はできないと思いますが、一応私は学校で習ってますんで…。^^
とにかく、学校の講師は「自分が言い易い順番で説明しています」と公言するように、自分の思いつきで説明をしてくれるので、知識がピース状になってしまってうまくつながらないので、こういった「セオリー通りに説明」してくれるサイトを利用してバラバラのピースをそれぞれのブロックにつなげています。

もともと他言語などをやっていて予備知識がある人は、講師のやり方でも「○○を××に置き換え」たりして理解できると思うんですけどね…。(これが「経験者対象の講座なのか」と聞いた所以でもあります。)

自習のほうはまだ変数の辺りまでしかできてないのですが、判ると面白いです。
だいぶ理解できてきたようで、学校の課題(ループの辺りまで)も文法的な躓きなく進められるようになってきました。
(こないだ叫んでいた「○○でバッファ取ってるのに確保できてないのはなぜだぁぁぁ!←ラベル名だけで、型名が入ってなかった」という基本的なポカミスは勘弁)

長くなるから次の記事で具体的な課題&グチを炸裂♪