質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

4回答

8762閲覧

【C言語の質問です】偶数には★を奇数には●を表示するプログラムを作成するには・・

退会済みユーザー

退会済みユーザー

総合スコア0

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2016/02/25 00:22

*たくさんの方よりご指摘をいただけてとてもありたいです。
引き続き、よろしくお願い致します。

C言語を勉強している初心者のものです。

今課題をいただき、その作成をしております。
先日提出(全18問)したのですが、大部分が間違っているので、
再度問題を見なおした上で提出してくれと言われてしまいました。

今回は課題なので、間違っている点を教えていただけませんでした。
個人的には、どの辺りが間違っているのかわからないため、
客観的な視点が欲しく、今回ご相談させていただきました。

18問の中の1つですが、
ソースが問題文との趣旨と外れているようでしたら
ご指摘いただけますと幸いです。

【問題】
1-20までのうち、「偶数」には★を、「奇数」には●をつけて表示するプログラムを作成せよ。

【回答】

#include <stdio.h> int main(void) { int i; for(i = 1 ; i <= 20 ; i++) { if(i % 2 == 0) { printf("%2d★\n",i); } if(i % 2 == 1) { printf("%2d●\n",i); } } return 0; }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答4

0

ベストアンサー

処理の共通化、分岐の省略を考え、自分ならこうします。

C

1#include <stdio.h> 2 3int main(void) 4{ 5 int i; 6 char *mark[] = { "★", "●" }; 7 8 for(i = 1 ; i <= 20 ; i++) 9 { 10 printf("%2d%s\n", i, mark[i % 2]); 11 } 12 13 return 0; 14}

投稿2016/02/25 07:31

ttyp03

総合スコア16998

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2016/02/25 07:41

ご回答ありがとうございます。 こちらはポイントに★と●を読み込ませて、 i % 2の計算結果次第で、分けて表示するというものでしょうか。 すいません、理解が追いついておりませんでしたので、 質問させていただきました。
ttyp03

2016/02/25 07:55

i % 2 の結果は 0 か 1 しかありませんから、それをマーク文字列の配列の添え字に利用しています。 例としてソースを書きましたが、初歩の課題レベルでは、 if( i % 2 == 0 ){ … } else { … } でも良いと思いますよ。
WoodenHamlet

2016/02/25 07:58

たしかにこれは綺麗ですね! mark[0] = "★"(型: char*) mark[1] = "●" (型: char*) を用意して mark[i%2]... 0:偶数、1:奇数 で分けて表示しているということですね
退会済みユーザー

退会済みユーザー

2016/02/25 08:05

ttyp03さんご回答ありがとうございます。 WoodenHamletさんも追記ありがとうございました。 理解できました。 配列の認識が甘かったので、 再度勉強しなおしてみます!
guest

0

間違いというほどではないと思いますが、無駄があるとはいえます。私なら以下の通り修正します。

(1) 整数iを2で割った余りは0か1しかないので、ifを2回書く必要はない(elseを使う)
(2) 数値を表示するprintfはifで分ける必要はない(「★」と「●」の出力のみ分ける)

「(2)」はいま修正しても大した違いではないでしょうが、“共通化できるところはする”という考え方としてとらえていただければと思います。

投稿2016/02/25 00:35

k1000

総合スコア67

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2016/02/25 00:43

ご回答ありがとうございます。 おっしゃるとおり、無駄があると処理が遅くなることもありますので、 共通化できるところはしていくように意識していきます。 ご指摘ありがとうございました!
guest

0

マルチバイト文字というのが煩わしい…
足す文字がO,Eとかならもっと簡単なんですが…

C

1#include <stdio.h> 2#include <string.h> 3 4int main(void) 5{ 6 int i; 7 8#if 1 9 char mark[3]; 10 for(i = 1 ; i <= 20 ; i++) 11 { 12 if(i % 2 == 0) 13 { 14 strcpy(mark, "★"); 15 } else { 16 strcpy(mark, "●"); 17 } 18 printf("%3d %s\n", i, mark); 19 } 20#else 21 char mark; 22 for(i = 1 ; i <= 20 ; i++) 23 { 24 mark = (i % 2)? 'O': 'E'; /* 解らなかったら三項演算子でググってください */ 25 printf("%3d %c\n", i, mark); 26 } 27#endif 28 return 0; 29}

#else 以降は mark へ E, O を代入して出力という形ですね。'●'、'★'がマルチバイト文字なのでこの方法そのままでは実装できません(1文字で char 数個を使う)。
そこでstrcpyを使ったのですが…あんまり美しくないですね。

投稿2016/02/25 02:36

WoodenHamlet

総合スコア306

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2016/02/25 07:38

ご回答ありがとうございます。 すいません、理解が追いついていないので、 早速三項演算子ググって理解できるようにします! ありがとうございました。
guest

0

return 0

↑結果を返すならここでは?

printf文を使うこと自体は分岐の外に出せますね。
分岐内でやるべきは、

  • 偶数なら数字に★をつける
  • 奇数なら数字に⚫︎をつける

という操作のはずです。

最終的な結果を返す処理の部分は、共通で書けるはずです。
まず、resultという変数を作り、そこにあるべき結果を代入する形にしてみてはどうでしょうか。

投稿2016/02/25 00:33

編集2016/02/25 00:35
yamato_hikawa

総合スコア2092

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2016/02/25 00:55

ご回答ありがとうございます。 代入する形を考えてみたのですが、イメージとしてはこのような形でしょうか。 int i,result; for(i = 1 ; i <= 20 ; i++) { if(i % 2 == 0) { result = ; } else { result =; } } printf("%d\n",result); return 0; すいません、形はなんとなく理解できたのですが、 このresultになにを入れればいいのか思いつきませんでした・・・ パッとイメージした感じresult = ("%d★",i);になったのですが、いかがでしょうか。
WoodenHamlet

2016/02/25 01:30 編集

むしろ int i; **** result; for(i = 1 ; i <= 20 ; i++) { if(i % 2 == 0) { result = ****; } else { result =****; } printf(****); } return 0; の形だとおもいますよ
退会済みユーザー

退会済みユーザー

2016/02/25 01:38

ありがとうございます。 for文の最後にprintf関数を入れるってことだったんですね! たしかにそのほうがしっくり来るのは理解できました。 ちなみにresultの数値はどのような数値が入りますか? 考えてはいるのですが、思いつかなくて・・
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問