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、なにで取っても最終的に整数にできないのでどうしたもんかなぁ…。
なのであとは自習でなんとか考えるのみです。死にそうです。

最新の画像もっと見る

2 コメント(10/1 コメント投稿終了予定)

コメント日が  古い順  |   新しい順
Unknown (JZ13)
2010-07-19 14:37:26
はじめまして?
私は基金訓練(失業保険かけてれば無料で受けられるやつ)でやってますので、一緒に授業受けてる人は前職も年齢もバラバラの人達です。
以前のMSオフィスの講座の時も含めてですが、向上心の高い人が多いですね。
やはり、自分でこの講座を選んで来てますから。
お互い、判らないながらも「こうしたらいいんじゃない?」と話し合いながら進めています。

お互い失業中ですし、シガラミのない関係ですから、仲良くなったら本当に本音でつきあえる仲間になります。

もしsameさんが現在失業中で、こういう講座にご興味があるということでしたら、一度ハローワークで「基金訓練」という係に相談してみてください。
地域によって開催されている講座や開催期間が変わります。
また、sameさんの現在の保険受給資格によって、受けられる講座も変わるかもしれません。
(講座の中には授業料無料だけではなく、プラス生活費などの手当がもらえる講座もあります)

ちょっと説明が大雑把になりましたが、もしご不明点がありましたら、私の判る範囲でしたらまたご紹介しますのでお気軽にどうぞ♪
返信する
Unknown (same)
2010-07-19 11:05:25
僕もそんなのやったみたいのですが一緒に授業受けてる人っててどんな人たちなんですか
返信する

コメントを投稿

サービス終了に伴い、10月1日にコメント投稿機能を終了させていただく予定です。
ブログ作成者から承認されるまでコメントは反映されません。