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

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

ただいまの
回答率

90.47%

  • C

    4661questions

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

  • C++

    4526questions

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

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

解決済

回答 4

投稿

  • 評価
  • クリップ 0
  • VIEW 3,441

tomo3

score 48

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

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;

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 4

checkベストアンサー

+2

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

#include <stdio.h>

int main(void)
{    
    int i;
    char *mark[] = { "★", "●" };

    for(i = 1 ; i <= 20 ; i++)
    {
        printf("%2d%s\n", i, mark[i % 2]);
    }

    return 0;
}

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/02/25 16:41

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

    キャンセル

  • 2016/02/25 16:55

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

    } else {

    }
    でも良いと思いますよ。

    キャンセル

  • 2016/02/25 16:58

    たしかにこれは綺麗ですね!

    mark[0] = "★"(型: char*)
    mark[1] = "●" (型: char*)

    を用意して mark[i%2]... 0:偶数、1:奇数 で分けて表示しているということですね

    キャンセル

  • 2016/02/25 17:05

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

    キャンセル

+1

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

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/02/25 09:43

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

    ご指摘ありがとうございました!

    キャンセル

0

return 0

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

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

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

という操作のはずです。

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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/02/25 09: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);になったのですが、いかがでしょうか。

    キャンセル

  • 2016/02/25 10:29 編集

    むしろ
    int i;
    **** result;

    for(i = 1 ; i <= 20 ; i++)
    {
    if(i % 2 == 0)
    {
    result = ****;
    } else {
    result =****;
    }
    printf(****);
    }

    return 0;

    の形だとおもいますよ

    キャンセル

  • 2016/02/25 10:38

    ありがとうございます。
    for文の最後にprintf関数を入れるってことだったんですね!
    たしかにそのほうがしっくり来るのは理解できました。

    ちなみにresultの数値はどのような数値が入りますか?
    考えてはいるのですが、思いつかなくて・・

    キャンセル

0

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

#include <stdio.h>
#include <string.h>

int main(void)
{    
    int i;

#if 1
    char mark[3];
    for(i = 1 ; i <= 20 ; i++)
    {
        if(i % 2 == 0)
        {
            strcpy(mark, "★");
        } else {
            strcpy(mark, "●");
        }
        printf("%3d %s\n", i, mark);
    }
#else 
    char mark;
    for(i = 1 ; i <= 20 ; i++)
    {
        mark = (i % 2)? 'O': 'E';    /* 解らなかったら三項演算子でググってください */
        printf("%3d %c\n", i, mark);
    }
#endif
    return 0;
}


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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/02/25 16:38

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

    キャンセル

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

  • ただいまの回答率 90.47%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る

  • C

    4661questions

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

  • C++

    4526questions

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

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