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

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

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

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

C++

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

Q&A

解決済

4回答

2669閲覧

c言語のアルファベットをインクリメントする方法はありますか?

daisuki64

総合スコア7

C

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

C++

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

1グッド

0クリップ

投稿2020/09/14 08:39

c

1#include <stdio.h> 2 3int main(void) 4{ 5 int month; 6 char a[100] = "元日、成人の日"; 7 char b[100] = "建国記念の日"; 8 char c[100] = "春分の日"; 9 char d[100] = "昭和の日"; 10 char e[100] = "憲法記念日、みどりの日、こどもの日"; 11 char f[100] = "海の日"; 12 char g[100] = "敬老の日、秋分の日"; 13 char h[100] = "体育の日"; 14 char i[100] = "文化の日、勤労感謝の日"; 15 char j[100] = "天皇誕生日"; 16 17 printf("what is Number of month : "); scanf("%d", &month); 18 19 switch (month) { 20 case 1 : 21 printf("%s\n %s\n %s\n %s\n %s\n %s\n %s\n %s\n %s\n %s\n", a,b,c,d,e,f,g,h,i,j); break; 22 case 2 : 23 printf("%s\n %s\n %s\n %s\n %s\n %s\n %s\n %s\n %s\n", b,c,d,e,f,g,h,i,j); break; 24 case 3 : 25 printf("%s\n %s\n %s\n %s\n %s\n %s\n %s\n %s\n", c,d,e,f,g,h,i,j); break; 26 case 4 : 27 printf("%s\n %s\n %s\n %s\n %s\n %s\n %s\n", d,e,f,g,h,i,j); break; 28 case 5 : 29 printf("%s\n %s\n %s\n %s\n %s\n %s\n", e,f,g,h,i,j); break; 30 case 6 : 31 printf("%s\n %s\n %s\n %s\n %s\n", f,g,h,i,j); break; 32 case 7 : 33 printf("%s\n %s\n %s\n %s\n %s\n", f,g,h,i,j); break; 34 case 8 : 35 printf("%s\n %s\n %s\n %s\n", g,h,i,j); break; 36 case 9 : 37 printf("%s\n %s\n %s\n %s\n", g,h,i,j); break; 38 case 10 : 39 printf("%s\n %s\n %s\n", h,i,j); break; 40 case 11 : 41 printf("%s\n %s\n", i,j); break; 42 case 12 : 43 printf("%s\n", j); break; 44 } 45 return 0; 46} 47

プログラミング初心者です。
このコードは入力された月から年末までの祝日を出力する練習なのですが、かなり無駄が多いとお思います。可読性もよくないです。
アルファベットをインクリメントできればfor文でもう少しすっきりすると思うのですが。。。

質問1、
アルファベットをインクリメントする方法はありますか?

質問2、
このコードをリファクタリングするとしたらどのようにすれば良いでしょうか?書くと大変だと思うのでヒントだけでも結構です。

よろしくお願いいたします。

kairaipell👍を押しています

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

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

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

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

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

hana_yama_san

2020/09/14 11:40

タイトルだけ見て想像したのと実際の質問内容が 全然違うので、面食らいました。 下記の様なのを想像した。 #include<stdio.h> int main(void) { int hoge; int fuga; for(int i = 0; i <= 9; i++){ hoge = ( 'a' - '0' ); fuga = ( '0' + i ); printf( "%c\n",(hoge + fuga) ); } }
guest

回答4

0

ベストアンサー

switchを使いたいのであれば、フォールスルーを積極的に使って、こんな書き方も可能です。

C

1// 変数を参照するのが面倒なので、リテラルを直接書いています 2switch(month){ 3case 1: 4 printf("元日、成人の日\n"); 5 // breakは書かない 6case 2: 7 printf("建国記念の日\n"); 8case 3: 9 printf("春分の日\n"); 10 // 以下略 11}

breakを書かなければそのまま次のcaseへ進むので、このような書き方が可能です。

投稿2020/09/14 09:00

maisumakun

総合スコア146018

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

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

daisuki64

2020/09/14 10:36

おお、すごい。 出題分にはswitch文を使用するように指定がありました。ブレイクを書かなければそれ以降も実行されるのですね!簡単に終わる問題だったとは!
fana

2020/09/14 10:40

> switch文を使用するように指定がありました "for文でもう少しすっきりすると思うのですが" とは何だったのか(笑)
daisuki64

2020/09/14 10:44

for文で書いたらどうなるのかなっておもいましてw
guest

0

アルファベットをインクリメントって、変数をa→b→c…としたいってことですよね?
通常、アルファベットをインクリメントというと、出力したい文字(文字列)をインクリメントしたいという意味で使うので、間違った印象を与えてしまいます。

それはさておき、通常であれば2次元配列を使うことになると思います。
書き方はひとぞれなので一例としてください。
解説はしませんので、不明点があれば質問してください。

c

1#include <stdio.h> 2 3int main(void) 4{ 5 int month; 6 char all[][100] = { 7 "元日、成人の日", 8 "建国記念の日", 9 "春分の日", 10 "昭和の日", 11 "憲法記念日、みどりの日、こどもの日", 12 "海の日", 13 "敬老の日、秋分の日", 14 "体育の日", 15 "文化の日、勤労感謝の日", 16 "天皇誕生日" 17 }; 18 19 printf("what is Number of month : "); scanf("%d", &month); 20 if(month < 1 || month > 12) return 0; // とりあえずのエラー処理 21 for(int i = month - 1; i < sizeof(all) / sizeof(all[0]); i++){ 22 printf(" %s\n", all[i]); 23 } 24 25 return 0; 26}

投稿2020/09/14 08:58

ttyp03

総合スコア17000

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

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

fana

2020/09/14 09:03

これだと元のコードと動作違くないですか? (e.g. 12を入力しても "天皇誕生日" が表示されない)
ttyp03

2020/09/14 10:10

あんまり元の動作は見てなかったので… まあこんな感じで書けますよという参考程度にしてもらえればと思います。
daisuki64

2020/09/14 10:38

sizeofはこのように使うのですね!ありがとうございます。
guest

0

{祝日の名称,それが何月にあるのか}というデータを,配列で持つ.

そうすれば,

for( 全データ分だけ繰り返す ) { if( データの「何月にあるのか」値 >= 入力された月 ) { printf( このデータの祝日の名称 ); } }

といった感じで書ける.

投稿2020/09/14 08:51

fana

総合スコア11996

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

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

0

C

1char* syukujitu[]={ 2 "1月", 3 "2月", 4 "3月", 5 "4月", 6 "5月", 7 "6月", 8 ... 9}; 10 11... 12 for(int i=tuki-1;i<(sizeof(syukujitu)/sizeof(*syukujitu));i++){ 13 printf("%s\n",syukujitu[i]); 14 } 15... 16

投稿2020/09/14 09:00

y_waiwai

総合スコア88042

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

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

daisuki64

2020/09/14 10:37

sizeofってこういう時使うんですね!すごいです!
y_waiwai

2020/09/14 10:42

こういう使い方は配列だけなので注意ね
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問