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

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

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

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

Q&A

解決済

4回答

2206閲覧

c言語 switch文の処理が分かりません

yusuke001

総合スコア14

C

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

0グッド

0クリップ

投稿2015/06/06 11:57

###前提・実現したいこと
c言語 学習について
今やってる所の解き方が分かりません誰か教えて下さい。
このソースコードをPCなしでのノートだけで解いてくださいと書かれているので誰か分かる方は
具体的に答えが出るまで解き方を教えてくれませんか?
よろしくお願いします、、、
また言語はc言語です
また関係ないですが、今回初投稿なので書き方があまり把握できてないですが見逃してください

問題は事項のプログラムを実行すると下記の=の横は何の文字が入るかです
CHAR1=
CHAR2=
CHAR3=
CHAR4=

答えは分かりますが解き方が分からないのでよろしくお願いします
答えは
CHAR=b
CHAR=C
CHAR=D
CHAR=E
です
###発生している問題・エラーメッセージ

###ソースコード
#include<stdio.h>
#include<ctype.h>
int main(void)

int i;
char ch ='A';
for(i=1;i<5;i++){
switch(ch){
case 'A':
ch++;
case 'B':
ch = tolower(ch);
break
case 'C':
ch +=3;
case 'a';
ch = 'C';
case 'b':
ch = toupper(ch + 1);
break
case 'c':
ch -=3;
break
default:
ch ='A'+i;

printf("CHAR%d = %c¥n",i,ch);

return 0;

###補足情報(言語/FW/ツール等のバージョンなど)
```lang-<ここに言語を入力>
コード

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

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

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

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

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

guest

回答4

0

ベストアンサー

char ch ='A'; // 最初は ch = A
for(i=1;i<5;i++){ // i = 1,2,3,4 forは4回転する
switch(ch){ // switch文は chの中身で評価されます 1回目は'A'なので
case 'A': // for1回目はここに該当 ch == 'A'
ch++; // ch++; なので これ乱暴な書き方ですが 'B'になりますね。
// break; が無いので スルーして次のケースに強制的に入ります
case 'B':
ch = tolower(ch); // ch='B'を tolower('B')となるので
// tolower 関数は,c を大文字から小文字に変換して返します.
// ch = tolower('B') => ch = 'b'ですね
break // break;なのでswithを抜けて2週目に入ります。
case 'C': // 3週目は ch='C' でここです
ch +=3; // ch+3 で 'F' となります
// break; ないので次のケースへ突入
case 'a';
ch = 'C'; // ch = 'C' となります、また breakないので次のケースへ
case 'b': // 2週目は ch='b' でここですね。
ch = toupper(ch + 1); // ch+1 => 'c' toupper('c') こちらは大文字にする関数
// ch = 'C' となりますね
break // そしてbreak; なので3週目に突入 ☆3週目最後は ch='D'です、4週目突入

case 'c': ch -=3; break default: // 4週目 'D'は該当するケースがないので、ここを通ります。 ch ='A'+i; // ch = 'A' + iは4なので 'E'となります


printf("CHAR%d = %c¥n",i,ch);

CHAR1 = b
CHAR2 = C
CHAR3 = D
CHAR4 = E

ちょっと醜いですが、こんな感じです。
case に break がないのが意地悪な問題ですね。

switch(i){
case 1:
break;
case 2:
break;
case 3:
i = 2;
case 4:
break;
}

switchは case 〜 break; までが実行されます
この場合case 3に当たる場合 case 4も実行されます

文字の足し算は次の文字になります(環境依存ですが) 'A'+1 = 'B'; 'B'+1 = 'C'; です

投稿2015/06/06 14:34

MasaakiIrie

総合スコア1021

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

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

0

「解き方」となると、
1.switch文の動作をググる
2.charに数値を足すと何が起こるのかググる(c言語が文字をどう扱っているのか調べる)
3.他、適宜不明な点を調べて脳内で処理を走らせる。

また、今回のように答えがわかっているのであれば、
ある程度どういう処理手順を通っているのか逆算できるので、更に理解が楽になります。

で、文字についてですが、内部的にはただの数値なので、文字に数字を足すと
対応する別の文字になります。

例えば'A'は0x41、'B'は0x42なので、'A'+1は'B'になります。

投稿2015/06/06 12:36

ozwk

総合スコア13521

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

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

0

switch文に付いては分かっているのでしょうか?
最初のさわりだけ・・・
chは'A'の状態、iは1でswitchに入ります。
case 'A'が実行されてchは'B'になります。
case 'A'にはbreakがないので、case 'B'の中も実行されるので、chにはch('B')の小文字'b'が入ります。case 'B'にはbreakが在るので2回目のループに入ります。すると、chは'b'なのでcase 'b'に入ります。・・・といった風に動作します。

#include<stdio.h>
#include<ctype.h>
int main(void)

int i;
char ch ='A';
for(i=1;i<5;i++){
switch(ch){
case 'A':
ch++; ←'B'(1)
case 'B':
ch = tolower(ch); ←'b'(1)
break
case 'C':
ch +=3; ←'F'(3)
case 'a';
ch = 'C'; ← 'C'(3)
case 'b':
ch = toupper(ch + 1); ←'C'(2) ←'D'(3)
break
case 'c':
ch -=3;
break
default:
ch ='A'+i;←'E'

printf("CHAR%d = %c\n",i,ch);
}return 0;
}
←は代入される文字、()の中の数字はループの回数(iの値)
・・・で、分かりますか?

投稿2015/06/06 12:31

cateye

総合スコア6851

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

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

0

お邪魔します。

まず、ループについて考えてみます。
変数chには"A"という文字が初期化時に設定されていますね。

char ch ='A';

"A"しか設定されていないのに回答にbやC,D,Eという文字が現れているのは何故か、ここが問題のミソです。
コンピュータは内部的に0か1しか扱えないことはご存知ですね?
そのため、文字をあらわすために、0と1の組み合わせを使って、例えば"A"という文字を1000001(=10進数だと65)とあらわすことにしましょう、と決まりを作ることで文字を保存したり表示したりしています。
その変換表が文字コードテーブルといわれるものです。(いろんな文字コードごとに"A"をどういう0と1のパターンで示すかという決まりが違います。utf-8とsjisとeuc-jpでは内部的な表現が変わります)

Asciiコード表

上記リンクを見てもらえば"A"が65で"B"が66であることがわかりますね。
つまり、変数chに整数の1を足すと"B"の文字コードに、2を足すと"C"の文字コードに、3を足すと"D"の文字コードになることになります。

これが基礎知識ですね。(ご存知だったかもしれませんが)

ご提示のswitch文では、chには最初に"A"が入っているのでcase 'A':に入り、

lang

1ch++;

が実行されて変数chの中身が"B"を表す66になります。break;が指定されていないのでそのまま次の
case 'B'に入り、

lang

1ch = tolower(ch); 2break ;

が実行されます。tolowerは大文字を小文字に変換するものです。変数chの中身は66→98になります。breakが記述されているためswitchを抜け、"b"をプリントして次のループに移ります。
中身は今98("b")なのでcase 'b':にはいりch+1=98+1=99(="c")がtoupper:大文字に変換する関数に渡され大文字の"C"=67になります。breakが指定されているのでswitch文を抜け"C"がプリントされます。・・・

という感じで続いていくのですが、理解するには御自分で一つ一つ最後まで(i=5になるまで)処理を一つ一つ追っていくのが一番の近道です。
一部しか示していませんが、上記のルールで最後までいけるはずなので、またわからなかったらコメントください。

以上です。参考になりましたら幸いです。

投稿2015/06/06 12:28

ShinpeiYamamoto

総合スコア540

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問