回答受付終了まであと4日

C言語のputchar関数について質問です 読み込んだ値の個数だけ+と-を交互に表示するプログラムの 作り方がわかりません #include <stdio.h>

回答(5件)

~例~ #include <stdio.h> int main(void) { int no; printf("正の整数 : "); scanf("%d", &no); const char mask = '+' ^ '-'; char ch = '+'; while (no-- > 0) putchar(ch), ch ^= mask; putchar('\n'); return 0; } 《解説》 const char mask = '+' ^ '-'; これで '+' と '-' の相違点を抜き出します。 putchar(ch), ch ^= mask; ch の初期値を '+' にしておいて ch ^= mask によって ch は '-' に変わります。 ch が '-' である場合、ch ^= mask によって ch は '+' に変わります。 mask を無くして、 putchar(ch), ch ^= '+' ^ '-'; とすることも出来ます。 XOR(排他的論理和)の良い練習になると思います。

この回答はいかがでしたか? リアクションしてみよう

プログラミングでは文字は文字コードの整数として扱います。 C言語ではある文字の文字コードを表すのに引用符'で括ります。 例: 文字+の文字コードは'+' => 43(10進), 2b(16進) 文字-の文字コードは'-' => 45(10進), 2d(16進) putchar()は引数に整数を渡すとその整数を文字コードとみなし、その文字コードで表現される文字を表示します。 つまり putchar('+'); で+が表示されます。 ちなみに以下も同じことです。引数は全て同じ値です。表現が違うだけです。 putchar(43); putchar(0x2b); --- ここからは数字パズルとして考えます。 ch = '+' + '-' - ch によりchは交互に+と-が代入されます。 ・ch = '+' のとき ch = '+' + '-' - ch => '+' + '-' - '+' => '-' ・ch = '-' のとき ch = '+' + '-' - ch => '+' + '-' - '-' => '+' --- putchar(ch = '+' + '-' - ch); の中の ch = '+' + '-' - ch は代入後のchの値を返します。 分かりやすく書き直すと     while (no-- > 0) {         ch = '+' + '-' - ch;         putchar(ch);     } となります。 サンプルです。 #define _CRT_SECURE_NO_WARNINGS // Visual Studio only #include <stdio.h> int main(void) {     int no;     printf("正の整数 : ");     scanf("%d", &no);     int ch = '-';     while (no-- > 0)         putchar(ch = '+' + '-' - ch);     putchar('\n'); }

(1152087723さん) 例:必ず'+'から始まります #include <stdio.h> int main(void) { int no, f=0; printf("正の整数 : "); scanf("%d", &no); while (no-- > 0) { putchar("+-"[f]); f = !f; } putchar('\n'); return 0; }

この手のは数字パズルだと考えると分かりやすいです。 まず、+と-を交互に、というのを、0と1を交互にと、数字にして読み替えます。 つまり、01010101… という数列を作れ、という問題だと読みます。 そして、ある数までの、というのは、0〜ある数-1までの数列だと、読み替えます。 例えば、7までのだったら 0123456 という数列がここにある。と読むのです。 そして、それを、1つの式を使って 0101010 という数列に変換せよ。 という問題だと読み取ります。 ここまで来ると、プログラマは、「繰り返す数」だったら「%」(剰余)だと、ピンときます。 ここらへんは、経験からの慣れです。 剰余は余りを表すので、一定の周期で繰り返されるものにはよく使われます。 例えば、カレンダーの曜日は、日付%7 したら、同じ曜日は同じ数になります。 そういう一定の繰り返しには、%が有効です。 今回は2文字の繰り返しなので、%2 です。 0123456 の各数を%2 すると、0101010 になります。 これでメインの変換は完成です。 あとは下準備として、最初の0123456を作る これはループの中で、+1してゆけばOKです。 仕上げとして、0と1を+と-に変換する これは、ifや?演算子で処理を分岐してもよいのですが、 もっと簡単に、 char c[] = "+-"; と文字列を作ってやれば、 c[x] とするだけで、xに入れた01が、+-の文字に変換されます。 まとめると、numを上限の数 として、 int i=0; int x; char c[] = "+-"; char m; while(i < num){ // num回繰り返す x = i % 2; // 数列を変換 m = c[x]; // 数列を文字に変換 putchar(m); // 出力 i++; // 012…という数列を作る } になります。 いちいち代入するのは面倒なのでまとめて書けば、 int i=0; char c[] = "+-"; while(i < num){ putchar(c[i++ % 2]); } となります。

#include <stdio.h> int main(void) {     int no;     printf("正の整数 : ");     scanf("%d", &no);     while (no-- > 0)         putchar(no % 2 ? '+' : '-');     putchar('\n');     return 0; }