- ベストアンサー
C言語での数字の花形表示
数字を読み込んで、それを花形を使った文字で表示するプログラムを書いたのですが、自分の書いたプログラムだと、読み込む数字の最初、または最後に0がくるとそれは表示してくれません・・・。 tmp-=top*s2としているから当たり前っちゃあ当たり前なんですが・・・。 そこでこのプログラムをどのように変更したら最初と最後に0を含んでいても表示できるようになるでしょうか?? やはり根本から作り直さなければいけないんでしょうか・・・。 /* 読み込んだ整数を*で表示 */ #include<stdio.h> int main(void) { int no; int dig = 0; int top, tmp, i; int s=1, s2; printf("整数を入力してください:"); scanf("%d", &no); tmp = no; while (tmp > 0) { /* noの桁数を求める */ tmp /= 10; dig++; } for (i = 0; i < (dig-1); i++) s *= 10; tmp = no; s2 = s; do { top = tmp / s2; /* tmpの一番上の桁の数字をtopへ */ switch (top) { case 0 : printf(" ****"); break; case 1 : printf(" *"); break; case 2 : printf(" ****"); break; case 3 : printf(" ****"); break; case 4 : printf(" ** "); break; case 5 : printf(" ****"); break; case 6 : printf(" ****"); break; case 7 : printf(" ****"); break; case 8 : printf(" ****"); break; case 9 : printf(" ****"); break; } tmp -= top * s2; s2 /= 10; } while (tmp > 0); putchar('\n'); tmp = no; s2 = s; do { top = tmp / s2; /* tmpの一番上の桁の数字をtopへ */ switch (top) { case 0 : printf(" * *"); break; case 1 : printf(" *"); break; case 2 : printf(" *"); break; case 3 : printf(" *"); break; case 4 : printf(" * * "); break; case 5 : printf(" * "); break; case 6 : printf(" * "); break; case 7 : printf(" * *"); break; case 8 : printf(" * *"); break; case 9 : printf(" * *"); break; } tmp -= top * s2; s2 /= 10; } while (tmp > 0); putchar('\n'); tmp = no; s2 = s; do { top = tmp / s2; /* tmpの一番上の桁の数字をtopへ */ switch (top) { case 0 : printf(" * *"); break; case 1 : printf(" *"); break; case 2 : printf(" ****"); break; case 3 : printf(" ****"); break; case 4 : printf(" ****"); break; case 5 : printf(" ****"); break; case 6 : printf(" ****"); break; case 7 : printf(" *"); break; case 8 : printf(" ****"); break; case 9 : printf(" ****"); break; } tmp -= top * s2; s2 /= 10; } while (tmp > 0); putchar('\n'); tmp = no; s2 = s; do { top = tmp / s2; /* tmpの一番上の桁の数字をtopへ */ switch (top) { case 0 : printf(" * *"); break; case 1 : printf(" *"); break; case 2 : printf(" * "); break; case 3 : printf(" *"); break; case 4 : printf(" * "); break; case 5 : printf(" *"); break; case 6 : printf(" * *"); break; case 7 : printf(" *"); break; case 8 : printf(" * *"); break; case 9 : printf(" *"); break; } tmp -= top * s2; s2 /= 10; } while (tmp > 0); putchar('\n'); tmp = no; s2 = s; do { top = tmp / s2; /* tmpの一番上の桁の数字をtopへ */ switch (top) { case 0 : printf(" ****"); break; case 1 : printf(" *"); break; case 2 : printf(" ****"); break; case 3 : printf(" ****"); break; case 4 : printf(" * "); break; case 5 : printf(" ****"); break; case 6 : printf(" ****"); break; case 7 : printf(" *"); break; case 8 : printf(" ****"); break; case 9 : printf(" ****"); break; } tmp -= top * s2; s2 /= 10; } while (tmp > 0); putchar('\n'); return(0); }
- rahal
- お礼率62% (5/8)
- C・C++・C#
- 回答数6
- ありがとう数5
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
ANo.5を更に1歩進めたのが下記のコードです。 ANo.4→ANo.5→下記 という順に、どこが変わったかを見ながらたどって下さい。 これなら理解できるでしょうか? #include<stdio.h> const_char_font1[10][6]_=_{ ____"_****", ____"____*", ____"_****", ____"_****", ____"__**_", ____"_****", ____"_****", ____"_****", ____"_****", ____"_****" }; const_char_font2[10][6]=_{ ____"_*__*", ____"____*", ____"____*", ____"____*", ____"_*_*_", ____"_*___", ____"_*___", ____"_*__*", ____"_*__*", ____"_*__*" }; const_char_font3[10][6]_=_{ ____"_*__*", ____"____*", ____"___*_", ____"_***_", ____"_****", ____"_****", ____"_****", ____"____*", ____"_****", ____"_****" }; const_char_font4[10][6]_=_{ ____"_*__*", ____"____*", ____"__*__", ____"____*", ____"___*_", ____"____*", ____"_*__*", ____"____*", ____"_*__*", ____"____*" }; const_char_font5[10][6]_=_{ ____"_****", ____"____*", ____"_****", ____"_****", ____"___*_", ____"_****", ____"_****", ____"____*", ____"_****", ____"_****" }; int_main(void) { ____int_no; ____int_dig=0; ____int_top[30]; ____int_tmp,i; ____printf("整数を入力してください:"); ____scanf("%d",_&no); ____tmp_=_no; ____while_(tmp>0)_{_/*_noの桁数を求める_*/ ________top[dig]_=_tmp_%_10; ________tmp/=10; ________dig++; ____} ____for(i=dig-1_;_i>=0_;_i--)_{ ________printf("%s",_font1[top[i]]); ____} ____printf("\n"); ____for(i=dig-1_;_i>=0_;_i--)_{ ________printf("%s",_font2[top[i]]); ____} ____printf("\n"); ____for(i=dig-1_;_i>=0_;_i--)_{ ________printf("%s",_font3[top[i]]); ____} ____printf("\n"); ____for(i=dig-1_;_i>=0_;_i--)_{ ________printf("%s",_font4[top[i]]); ____} ____printf("\n"); ____for(i=dig-1_;_i>=0_;_i--)_{ ________printf("%s",_font5[top[i]]); ____} ____printf("\n"); } なお、本来はフォントは上記のように1行目ばかりを集めるのではなく、もう1歩進めて、 const char font[10][5][6] = { { "____*", "____*", "____*", "____*", "____*" }, // 1のフォント { "_****", "____*", "___*_", "__*__", "_****", }, // 2のフォント ・ ・ ・ のように、1は1で、2は2で固めるのが普通です。 ここまでできれば、ANo.2に近い完成度になります。 ご自分で工夫してみて下さい。
その他の回答 (5)
- fatbowler
- ベストアンサー率48% (26/54)
ANo.4のコードを多少改良してみました。 質問で提示されたコードの延長上にあるゴールとしては、こんなものでしょう。 #include<stdio.h> int_main(void) { ____int_no; ____int_dig=0; ____int_top[30]; ____int_tmp,i; ____printf("整数を入力してください:"); ____scanf("%d",_&no); ____tmp_=_no; ____while_(tmp>0)_{_/*_noの桁数を求める_*/ ________top[dig]_=_tmp_%_10; ________tmp/=10; ________dig++; ____} ____for(i=dig-1_;_i>=0_;_i--)_{ ________switch_(top[i])_{ ________case_0_:_printf("_****");_break; ________case_1_:_printf("____*");_break; ________case_2_:_printf("_****");_break; ________case_3_:_printf("_****");_break; ________case_4_:_printf("__**_");_break; ________case_5_:_printf("_****");_break; ________case_6_:_printf("_****");_break; ________case_7_:_printf("_****");_break; ________case_8_:_printf("_****");_break; ________case_9_:_printf("_****");_break; ________} ____} ____printf("\n"); ____for(i=dig-1_;_i>=0_;_i--)_{ ________switch_(top[i])_{ ________case_0_:_printf("_*__*");_break; ________case_1_:_printf("____*");_break; ________case_2_:_printf("____*");_break; ________case_3_:_printf("____*");_break; ________case_4_:_printf("_*_*_");_break; ________case_5_:_printf("_*___");_break; ________case_6_:_printf("_*___");_break; ________case_7_:_printf("_*__*");_break; ________case_8_:_printf("_*__*");_break; ________case_9_:_printf("_*__*");_break; ________} ____} ____printf("\n"); ____for(i=dig-1_;_i>=0_;_i--)_{ ________switch_(top[i])_{ ________case_0_:_printf("_*__*");_break; ________case_1_:_printf("____*");_break; ________case_2_:_printf("___*_");_break; ________case_3_:_printf("_***_");_break; ________case_4_:_printf("_****");_break; ________case_5_:_printf("_****");_break; ________case_6_:_printf("_****");_break; ________case_7_:_printf("____*");_break; ________case_8_:_printf("_****");_break; ________case_9_:_printf("_****");_break; ________} ____} ____printf("\n"); ____for(i=dig-1_;_i>=0_;_i--)_{ ________switch_(top[i])_{ ________case_0_:_printf("_*__*");_break; ________case_1_:_printf("____*");_break; ________case_2_:_printf("__*__");_break; ________case_3_:_printf("____*");_break; ________case_4_:_printf("___*_");_break; ________case_5_:_printf("____*");_break; ________case_6_:_printf("_*__*");_break; ________case_7_:_printf("____*");_break; ________case_8_:_printf("_*__*");_break; ________case_9_:_printf("____*");_break; ________} ____} ____printf("\n"); ____for(i=dig-1_;_i>=0_;_i--)_{ ________switch_(top[i])_{ ________case_0_:_printf("_****");_break; ________case_1_:_printf("____*");_break; ________case_2_:_printf("_****");_break; ________case_3_:_printf("_****");_break; ________case_4_:_printf("___*_");_break; ________case_5_:_printf("_****");_break; ________case_6_:_printf("_****");_break; ________case_7_:_printf("____*");_break; ________case_8_:_printf("_****");_break; ________case_9_:_printf("_****");_break; ________} ____} ____printf("\n"); }
- fatbowler
- ベストアンサー率48% (26/54)
「最後の0が表示されない」はナゾですね。 何かコンパイルエラーが発生して、前のexeファイルが更新されてない、とかないですか? putchar('\n'); が1行間違っていますが、それ以外は問題なさそうですよ。 省略せずにコードを掲載します。(動作確認済み) _(アンダーバー)は半角スペースに一斉変換して使って下さい。 #include<stdio.h> int_main(void) { ____int_no; ____int_dig=0; ____int_top[30]; ____int_tmp,i,s; ____printf("整数を入力してください:"); ____scanf("%d",_&no); ____tmp_=_no; ____while_(tmp>0)_{_/*_noの桁数を求める_*/ ________tmp/=10; ________dig++; ____} ____tmp_=_no; ____for_(i=0;_i<dig;_i++)_{ ________top[i]_=_tmp_%_10; ________tmp/=10; ____} ____s_=_dig_-_1; ____while_(s>=0)_{ ________switch_(top[s--])_{ ________case_0_:_printf("_****");_break; ________case_1_:_printf("____*");_break; ________case_2_:_printf("_****");_break; ________case_3_:_printf("_****");_break; ________case_4_:_printf("__**_");_break; ________case_5_:_printf("_****");_break; ________case_6_:_printf("_****");_break; ________case_7_:_printf("_****");_break; ________case_8_:_printf("_****");_break; ________case_9_:_printf("_****");_break; ________} ____} ____putchar('\n'); ____s_=_dig_-_1; ____while_(s>=0)_{ ________switch_(top[s--])_{ ________case_0_:_printf("_*__*");_break; ________case_1_:_printf("____*");_break; ________case_2_:_printf("____*");_break; ________case_3_:_printf("____*");_break; ________case_4_:_printf("_*_*_");_break; ________case_5_:_printf("_*___");_break; ________case_6_:_printf("_*___");_break; ________case_7_:_printf("_*__*");_break; ________case_8_:_printf("_*__*");_break; ________case_9_:_printf("_*__*");_break; ________} ____} ____putchar('\n'); ____s_=_dig_-_1; ____while_(s>=0)_{ ________switch_(top[s--])_{ ________case_0_:_printf("_*__*");_break; ________case_1_:_printf("____*");_break; ________case_2_:_printf("___*_");_break; ________case_3_:_printf("_***_");_break; ________case_4_:_printf("_****");_break; ________case_5_:_printf("_****");_break; ________case_6_:_printf("_****");_break; ________case_7_:_printf("____*");_break; ________case_8_:_printf("_****");_break; ________case_9_:_printf("_****");_break; ________} ____} ____putchar('\n'); ____s_=_dig_-_1; ____while_(s>=0)_{ ________switch_(top[s--])_{ ________case_0_:_printf("_*__*");_break; ________case_1_:_printf("____*");_break; ________case_2_:_printf("__*__");_break; ________case_3_:_printf("____*");_break; ________case_4_:_printf("___*_");_break; ________case_5_:_printf("____*");_break; ________case_6_:_printf("_*__*");_break; ________case_7_:_printf("____*");_break; ________case_8_:_printf("_*__*");_break; ________case_9_:_printf("____*");_break; ________} ____} ____putchar('\n'); ____s_=_dig_-_1; ____while_(s>=0)_{ ________switch_(top[s--])_{ ________case_0_:_printf("_****");_break; ________case_1_:_printf("____*");_break; ________case_2_:_printf("_****");_break; ________case_3_:_printf("_****");_break; ________case_4_:_printf("___*_");_break; ________case_5_:_printf("_****");_break; ________case_6_:_printf("_****");_break; ________case_7_:_printf("____*");_break; ________case_8_:_printf("_****");_break; ________case_9_:_printf("_****");_break; ________} ____} ____putchar('\n'); }
- Oh-Orange
- ベストアンサー率63% (854/1345)
★回答者 No.1 です。 >printf("整数を入力してください:"); >scanf("%d", &no); ↑ この部分を文字列として入力するようにします。 つまり char input[ 256 ]; ←宣言に追加 printf( "整数を入力してください:" ); scanf( "%s", input ); ↑ このようにします。 ・そしたら input[0] ~ input[len - 1] までを順番に処理します。 このとき、input[n] は数値ではなく文字 '0'~'9' になるため switch 文の case には シングルクォーテーション(’)をつけて下さい。 switch ( input[i] ){ case '0': printf(" ****"); break; case '1': printf(" *"); break; ←修正 case '2': printf(" ****"); break; case '3': printf(" ****"); break; case '4': printf(" * *"); break; ←修正 case '5': printf(" ****"); break; case '6': printf(" ****"); break; case '7': printf(" ****"); break; case '8': printf(" ****"); break; case '9': printf(" ****"); break; } putchar( '\n' ); ↑ こんな感じになります。 ・とにかく scanf() の時に数値ではなくて文字列で入力しないと先頭の 0 や末尾の 0 が 正しく表示されません。あと文字列の入力しているので i カウンタなどで添え字の番号を 0 ~ 文字数-1 までを処理すれば左から右へ数字を順番に扱えます。 >tmp = no; >while ( tmp > 0 ){ /* noの桁数を求める */ > tmp /= 10; > dig++; >} > >tmp = no; >for ( i = 0 ; i < dig ; i++ ){ > top[i] = tmp % 10; > tmp /= 10; >} ↑ 文字列で入力してその配列を扱うため、上の部分は必要なくなります。 逆にこの部分を記述しているのでせっかく配列に桁毎にセットしても先頭/末尾の 0 が うまく表示できないのです。 ・ちなみに上記の方法では整数の下位の桁から順番に top[i] に入れることになりますよ。 つまり、12300 の場合は top[0]⇒0 top[1]⇒0 top[2]⇒3 top[3]⇒2 top[4]⇒1 となります。もし期待通りに top[0]⇒1 top[1]⇒2 top[2]⇒3 top[3]⇒0 top[4]⇒0 とするには次のようにします。 tmp = no; for ( i = (dig - 1) ; i >= 0 ; i-- ){ top[i] = tmp % 10; tmp /= 10; } となりますが…。 ・以上。
お礼
なるほどー・・・・文字列で入力を読み取るのですね。参考になります。 tmp = no; for ( i = (dig - 1) ; i >= 0 ; i-- ){ top[i] = tmp % 10; tmp /= 10; } ↑たしかに・・・ありがとうございます<(_ _)>
- fatbowler
- ベストアンサー率48% (26/54)
携帯(PCサイトビューア)からなので手短に。 最初に桁数を求め、1桁ずつ配列に入れておけば、毎回求める手間も省けるし、最後の0も表示できます。 桁数を入力させるようにすれば、先頭に0を表示することもできますよ。
お礼
ありがとうございます!!配列を使ってやってみました。 ですが、これでも最後に0がくると表示されないのですが、どこが悪いのでしょうか・・・。すいません・・・。 /* 読み込んだ整数を*で表示 */ #include<stdio.h> int main(void) { int no; int dig=0; int top[30]; int tmp,i,s; printf("整数を入力してください:"); scanf("%d", &no); tmp = no; while (tmp>0) { /* noの桁数を求める */ tmp/=10; dig++; } tmp = no; for (i=0; i<dig; i++) { top[i] = tmp % 10; tmp/=10; } s = dig - 1; while (s>=0) { switch (top[s--]) { case 0 : printf(" ****"); break; case 1 : printf(" *"); break; case 2 : printf(" ****"); break; case 3 : printf(" ****"); break; case 4 : printf(" ** "); break; case 5 : printf(" ****"); break; case 6 : printf(" ****"); break; case 7 : printf(" ****"); break; case 8 : printf(" ****"); break; case 9 : printf(" ****"); break; } putchar('\n'); } ※以下繰り返し
- Oh-Orange
- ベストアンサー率63% (854/1345)
★アドバイス ・花文字表示のアルゴリズムを変えた方がいいと思います。 花文字のビットイメージをデータで用意して数字(0-9)を読み込んだら順番に1桁ずつ 花文字のビットイメージより表示するようにした方がスッキリしますよ。 switch 文で 7 セグメントを表示するよりもソースが簡単になります。 ・下のそのサンプルを載せておきます。 サンプル: #include <stdio.h> #include <string.h> // 花文字表示 void dispSegment( int num, int line ) { static long table[ 10 ][ 5 ] = { 0x1111, 0x1001, 0x1001, 0x1001, 0x1111, // 0 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, // 1 0x1111, 0x0001, 0x1111, 0x1000, 0x1111, // 2 0x1111, 0x0001, 0x1111, 0x0001, 0x1111, // 3 0x1001, 0x1001, 0x1111, 0x0001, 0x0001, // 4 0x1111, 0x1000, 0x1111, 0x0001, 0x1111, // 5 0x1111, 0x1000, 0x1111, 0x1001, 0x1111, // 6 0x1111, 0x1001, 0x0001, 0x0001, 0x0001, // 7 0x1111, 0x1001, 0x1111, 0x1001, 0x1111, // 8 0x1111, 0x1001, 0x1111, 0x0001, 0x1111, // 9 }; long image = table[num][line]; int mask; for ( mask = 0xF000 ; mask != 0x0000 ; mask >>= 4 ){ if ( image & mask ){ putchar( '*' ); } else{ putchar( 0x20 ); } } } // メイン int main( void ) { char input[ 256 ]; int i, j, len; // 文字列で入力 printf( "整数を入力してください:" ); scanf( "%s", input ); len = (int)strlen( input ); // 上から順に表示(1-5段) for ( j = 0 ; j < 5 ; j++ ){ for ( i = 0 ; i < len ; i++ ){ dispSegment( (input[i] - '0'), j ); // 花文字表示 putchar( 0x20 ); // スペース } putchar( '\n' ); } return 0; } 以上。
お礼
すごい・・・・。とても参考になりました。 でもまだ関数や構造体(?)は習ってないので使えなくて・・・ すごく良いプログラムを提供してくださったのに申し訳ないです。 ところどころ勉強不足で理解できないところがあるのでもう少し勉強してからこのプログラムは使わせていただきます^^;
関連するQ&A
- C言語エラー
C言語をいじっているのですが、16行目と19行目の「型」の前に「;」がありませんと表示されます。 どこをどう改善すればいいか教えてもらえないでしょうか /*遊び半分*/ #include <stdio.h> #include <process.h> int main() { char dear; printf("ああああ\n"); printf("ああああ \n"); scanf_s("%c", &dear); switch (dear){ case 'A04': ; int main(void); { printf("ああああ\n"); int main(void); printf("あああ\n"); printf("あああ\n"); break; system("pause"); return 0; } case 'C34' : printf("\n"); break; case 'E24' : printf("\n"); break; case 'F38' : printf("\n"); break; default: printf("メッセージはありません\n"); break;} return 0;
- 締切済み
- C・C++・C#
- C言語!教えてください!
/* キーボードから4桁の数字を読み込み、3で割った余りが0ならばそのまま 表示する。1ならば数字と並びを逆に表示する。 2ならばその数字と逆に並べた数字の差の絶対値を表示。その際に差が0 であるなら入力した数字をそのまま表示するプログラム。 */ #include <stdio.h> int main(void) { int no; printf("4桁の数字を入力してください:"); scanf("%d",&no); if(no % 3 ==0) printf("%d \n" , no); else if(no % 3 ==1) do{ printf("%d",no%10); no = no / 10; }while (no > 0 ); else ここから絶対値を考えようとしたのですが 逆にした値が文字で置かれていないのでやりようがありません。 逆にした値は文字で置けるものなんですか? それともこの文ではできませんか? よろしくお願いします。
- ベストアンサー
- C・C++・C#
- C初心者です。どうかお助けを
独習Cという本で独学中なのですが #include<stdio.h> int main() { int a,b; char ch; printf("実行したい演算は\n"); printf("加算(A)、減算(S)、乗算(M)、除算(D)のどれですか\n"); do{ printf("アルファベットの1文字を入力してください:"); ch=getchar(); while(getchar()!='\n'); }while(ch!='A' && ch!='S' && ch!='M' && ch!='D'); printf("\n"); printf("最初の数字を入力してください:"); scanf("%d",&a); printf("二つめの数字を入力してください:"); scanf("%d",&b); switch(ch){ case 'A': printf("%d",a+b); break; case 'B': printf("%d",a-b); break; case 'C': printf("%d",a*b); break; case 'D': if(b!=0)printf("%d",a/b); } return 0; } このプログラムでの14行目の while(getchar()!='\n');の必要性がわかりません。 どなたか有識者の方の回答をお願いします。
- ベストアンサー
- C・C++・C#
- C言語のC++で質問です。
初めまして。 学籍番号から入力した数字がいくつあるか検索して検索結果を表示するプログラムを作っているのですが、このプログラムには制約がありまして、 ・while,do~while文を使用する ・for文、配列は使えない(習っていないため) ・if文は使用可能 ずっと試行錯誤してるのですがwhile文を使って表現することができません。 どなたか分かる方いたら教えてください、よろしくお願いします。 以下プログラムソース #include<stdio.h> int main() { int no,i; int gakuseki,mono; int no1,no2,no3,no4,no5,no6,no7; int kari1,kari2,kari3,kari4,kari5,kari6,kari7; mono=0; i=1; printf("任意の数字:"); scanf("%d",&no); printf("学籍番号:"); scanf("%d",&gakuseki); kari1=gakuseki/1000000; kari2=gakuseki/100000; kari3=gakuseki/10000; kari4=gakuseki/1000; kari5=gakuseki/100; kari6=gakuseki/10; kari7=gakuseki/1; no1=kari1; no2=(kari2)-(kari1*10); no3=(kari3)-(kari2*10); no4=(kari4)-(kari3*10); no5=(kari5)-(kari4*10); no6=(kari6)-(kari5*10); no7=(kari7)-(kari6*10); /*学籍番号を桁ごとに分解する*/ printf("%d\n",no1); printf("%d\n",no2); printf("%d\n",no3); printf("%d\n",no4); printf("%d\n",no5); printf("%d\n",no6); printf("%d\n",no7); /*検索*/ if(no==no1) { mono=mono+1; } if(no==no2) { mono=mono+1; } if(no==no3) { mono=mono+1; } if(no==no4) { mono=mono+1; } if(no==no5) { mono=mono+1; } if(no==no6) { mono=mono+1; } if(no==no7) { mono=mono+1; } if(mono>=1) { printf("数字%dは%d個あります\n",no,mono); } else printf("数字%dはありません\n",no); return(0); } 【実行結果】 任意の数字:3 学籍番号:0653123 0 6 5 3 1 2 3 数字1は1つあります。 【実行結果ここまで】 if文で一つ一つ書いてたらすごく長くなってしまいました。 ここをどうにかwhile文でかけたらうまくいくかもしれないのですが・・・。
- 締切済み
- C・C++・C#
- cのプログラミング
//ユーザーが入力した文字の個数をカウントする #include<stdio.h> int main() { char ch; int moji; int s_cunt=0, a_cunt=0, k_cunt=0; printf(\"文字を入力してください-->\"); do{ ch = getchar(); if(\'0\'<=ch && ch<=\'9\') moji = 1; else if(\'a\'<=ch && ch<=\'z\') moji = 2; switch(moji){ case 1: s_cunt++; break; case 2: a_cunt++; break; default: k_cunt++; break; } }while(ch != \'\\n\'); printf(\"数字の入力数:%d\\n\",s_cunt); printf(\"英字の入力数:%d\\n\",a_cunt); printf(\"区切りの入力数:%d\\n\",k_cunt); return 0; } 数字、英字、区切り文字をそれぞれリターンキーが押されるまでカウントして出力したいのですが上手く出力されません。このプログラミングは全然違いますか?
- ベストアンサー
- C・C++・C#
- C言語で分からないことがあります。
私は初心者で、ある参考書で下記の例が載っていたのですが、このプログラムで分からないことがあります。 #include<stdio.h> void nchar(int ch,int no) { while(no-->0) putchar(ch); } int main(void) { int i,ln; printf("何段ですか:");scanf("%d",&ln); for(i=1;i<=ln;i++){ nchar(' ',ln-i); nchar('*',i); putchar('\n'); } return 0; } まず、 ・nchar関数のnoは何を表しているのか? ・nchar関数のputchar(ch)は一体何を表しているのか? 参考書にはこのプログラムについてあまり説明が無くこの2点がよく分かりません。 よろしくお願いします。
- ベストアンサー
- C・C++・C#
- C言語 じゃんけんゲーム 非常に困っています
じゃんけんゲームを作成したのですが コンピュータの出す手を5つのパターンを作成して その5つのパターンを関数化して呼び出すようにする。 というのを作成したいのですが検索などしましたが コンピュータの調子が悪く、それらしい物が見つからず、 何方か無礼ですが自分ならこうするという模範解答お願いします… 一応下記のプログラムまでは進められましたが switch()case を関数化してゲーム前に入力して5つのパターンを それぞれ呼び出せるようにしたいです… (例:ゲーム前に「パターンを選択:5でランダム、6でコンピュータ絶対勝つ…(省略)」 を表示させて入力数字でパターンを呼び出し、開始する) 5つのパターン(コンピュータの手) 完全ランダム コンピュータが絶対勝つ コンピュータが絶対負け 絶対引き分け 絶対引き分け無い 作成したプログラム #include <stdio.h> #include <stdlib.h> #include <time.h> char *table[]={"グー","パー","チョキ"}; int main(void) { int i,j; int continue_f; int player,computer; int p_win,p_lose,p_draw; int t_win,t_lose,t_draw; t_win=t_lose=t_draw=0; srand(time(NULL)); do{ p_win=p_lose=p_draw=0; for(i=0;i<5;i++){ while(1){ printf("あなたが出した手は・・・\n"); printf("グー:0 パー:1 チョキ:2\n"); scanf("%d",&player); if(0<=player&&player<=2){ break; }else{ printf("もう一度入力してください。\n"); } } switch(i){ case 0: computer=rand()%3; break; case 1: computer=(player+1)%3; break; case 2: computer=(player+2)%3; break; case 3: computer=player; break; case 4: do{ computer=rand()%2; }while(computer==player); break; } if((player+1)%3==computer){ printf("あなたは%sでわたしは%sです・・・わたしの勝利です。\n", table[player],table[computer]); p_lose++; }else if(player==computer){ printf("あなたもわたしも%sです・・・引き分けです。\n",table[player]); p_draw++; }else{ printf("あなたは%sでわたしは%sです・・・あなたの勝利です。\n", table[player],table[computer]); p_win++; } } printf("%d勝 %d敗 %d引き分けでした。\n",p_win,p_lose,p_draw); printf("このまま続けますか?続ける場合は何か数字を入力し、" "続けない場合は-1を入力してください。\n"); scanf("%d",&continue_f); t_win+=p_win; t_lose+=p_lose; t_draw+=p_draw; }while(continue_f!=-1); printf("トータルで %d勝 %d敗 %d引き分けでした。\n",t_win,t_lose,t_draw); return 0; }
- ベストアンサー
- C・C++・C#
- C言語 じゃんけんswicth case 関数化
急いでいて大変困っています じゃんけんゲームを作成したのですが コンピュータの出す手、5つのパターン (完全ランダム コンピュータが絶対勝つ コンピュータが絶対負け 絶対引き分け 絶対引き分け無い) を作成して その5つのパターンを関数化して呼び出すようにする。 というのを作成したいのですが 一応下記のプログラムまでは進められましたが switch() case を関数化してint main(void)の外に書き込み それぞれ呼び出せるようにしたいです。 PCの調子が悪く調べてもあまり出ず本当に困っています 私ならこう、というプログラムをご教授お願いします 作成したプログラム #include <stdio.h> #include <stdlib.h> #include <time.h> char *table[]={"グー","パー","チョキ"}; int main(void) ★int mainここから { int i,j; int continue_f; int player,computer; int p_win,p_lose,p_draw; int t_win,t_lose,t_draw; t_win=t_lose=t_draw=0; srand(time(NULL)); do{ p_win=p_lose=p_draw=0; for(i=0;i<5;i++){ while(1){ printf("あなたが出した手は・・・\n"); printf("グー:0 パー:1 チョキ:2\n"); scanf("%d",&player); if(0<=player&&player<=2){ break; }else{ printf("もう一度入力してください。\n"); } } switch(0){//()の中を変更して下記のcaseを呼び出す★switch caseここから case 0: computer=rand()%3; break; case 1: computer=(player+1)%3; break; case 2: computer=(player+2)%3; break; case 3: computer=player; break; case 4: do{ computer=rand()%2; }while(computer==player); break; } ★swicth caseここまで if((player+1)%3==computer){ printf("あなたは%sでわたしは%sです・・・わたしの勝利です。\n", table[player],table[computer]); p_lose++; }else if(player==computer){ printf("あなたもわたしも%sです・・・引き分けです。\n",table[player]); p_draw++; }else{ printf("あなたは%sでわたしは%sです・・・あなたの勝利です。\n", table[player],table[computer]); p_win++; } } printf("%d勝 %d敗 %d引き分けでした。\n",p_win,p_lose,p_draw); printf("このまま続けますか?続ける場合は何か数字を入力し、" "続けない場合は-1を入力してください。\n"); scanf("%d",&continue_f); t_win+=p_win; t_lose+=p_lose; t_draw+=p_draw; }while(continue_f!=-1); printf("トータルで %d勝 %d敗 %d引き分けでした。\n",t_win,t_lose,t_draw); return 0; } ★int main ここまで
- ベストアンサー
- C・C++・C#
- C言語で電卓を作成する。
C言語を用いて三項まで計算できる電卓を作りたいのですが、どうも上手くいきません。 四則演算(+、-、×、÷)の優先順位を用いたプログラミング方法が分かりません。 以下に自分で作成したソースを添付します。 このソースに修正や追加して3項までの四則演算できるプログラミングを教えていただけますか? 宜しくお願いします。 #include <stdio.h> int main(void) { int answer; /*答え*/ int x,y,z; /*x=第一項,y=第二項,第三項*/ char op1,op2; /*演算子1、演算子2*/ while(1){ printf("式を入力してください\n"); printf("式:"); scanf("%d %c %d %c %d" ,&x,&op1,&y,&op2,&z); if((op1=='+'|'-'|'*'|'/') && (op2=='+'|'-'|'*'|'/')){ switch(op2){ case '+': answer=y+z; break; case '-': answer=y-z; break; case '*': answer=y*z; break; case '/': if(z==0){ printf("ERROR\n"); return 0; } answer=y/z; break; default: printf("ERROR\n"); return 0; } switch(op1){ case '+': answer=x+answer; break; case '-': answer=x-answer; break; case '*': answer=x*answer; break; case '/': if(y==0){ printf("ERROR\n"); return 0; } answer=x/answer; break; default: printf("ERROR\n"); return 0; } printf("答え:%d\n",answer); } else { switch(op1){ case '+': answer=x+y; break; case '-': answer=x-y; break; case '*': answer=x*y; break; case '/': if(y==0){ printf("ERROR\n"); return 0; } answer=x/y; break; default: printf("ERROR\n"); return 0; } printf("答え:%d\n",answer); } } } 左辺に×、÷が来ても優先的に計算されません。
- ベストアンサー
- C・C++・C#
- C言語、成績は4194432?
いつも大変お世話になり誠にありがとうございます。 標記の件。 おかしな実行結果になりました。 どうしてでしょうか? ご回答の程宜しくお願い申し上げます。 記 コード #include <stdio.h> int main(void) { int res; printf("成績を入力してください。\n"); scanf("%d", &res); printf("成績は%dです。\n", res); switch(res){ case 1: printf("もっとがんばりましょう。\n"); break; case 2: printf("もう少しがんばりましょう。\n"); break; case 3: printf("さらに上をめざしましょう。\n"); break; case 4: printf("たいへんよくできました。\n"); break; case 5: printf("たいへん優秀です。\n"); break; } return 0; } 実行結果 C:\MinGW>test20.exe 成績を入力してください。 A 成績は4194432です。 C:\MinGW>test20.exe 成績を入力してください。 b 成績は4194432です。 C:\MinGW>test20.exe 成績を入力してください。 v 成績は4194432です。 度々申し訳ございません。 ご回答の程宜しくお願い申し上げます。
- ベストアンサー
- C・C++・C#
お礼
おおー!!たくさんのお教え、ホントにありがとうございます!! これならなんとか理解できます!!ありがとうございます!! プログラムって、いろんな書き方ができるけど、うまく書くとすごくシンプルでわかりやすくなるもんなんですねー・・・すごいです。 ありがとうございました!!