こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

入力に出現する数字文字をカウントするプログラム

こんにちは、毎度お世話になります。
#include<iostream>
using namespace std;

int main(void){

char c;
int cnt[10] = {0};


while(cin.get(c)){
if(c >= '0' && c <= '9')
cnt[c - '0']++;
}
for (int = 0; i < 10; i++)
cout << i << "の出現回数:" << cnt[i] << '\n';

return(0);
}
[/code]
ここで質問なんですが、このプログラムの中で数字文字をカウントしているのはどこでしょうか?
そして
while(cin.get(c)){
if(c >= '0' && c <= '9')
cnt[c - '0']++;
}
ここの部分が何を表しているのか解りません。
よろしくお願いします。

投稿日時 - 2020-03-11 14:34:07

QNo.9722220

困ってます

質問者が選んだベストアンサー

#1です。
どんな文字にも文字コードが割り振られています。
0という文字には文字コード48
1という文字には文字コード49
(途中省略)
9という文字には文字コード57
となっていて連番になっています。これを前提として
0という文字の出現回数をcnt[0]
1という文字の出現回数をcnt[1]
(途中省略)
9という文字の出現回数をcnt[9]
に保存したいのであって,一般的に言えば文字コードがcの文字の出現回数はcnt[c-48]に保存することになります。つまりcnt[c - '0']ですね。

投稿日時 - 2020-03-11 16:06:00

補足

自分であれこれ試行錯誤した結果多分解りました。
つまり、['0']48を、入力した数値、['2']例えば50から引けばいいんですね、
2が三回だと150になるのでそこで48を三回引くと3回入力したことになる、違いますかね。
数学はあんまり得意ではないのでこのようなやり方なんですが、あってますかね。

投稿日時 - 2020-03-11 17:35:48

お礼

回答ありがとうございます、
所で気になったのですがなぜそのような事が解るのですか?
プログラムとは全く関係のない質問ですが・・・、
やっぱり数学的要素が関係しているからそこから理屈を学ぶって事ですかね・・・。

投稿日時 - 2020-03-11 16:13:17

ANo.2

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.1

while(cin.get(c)){//標準入力から1文字読みこみ
if(c >= '0' && c <= '9')//その文字が'0'から'9'の間であれば数字と解釈できるので
cnt[c - '0']++;//その数字の出現回数を1だけ増やす
}

投稿日時 - 2020-03-11 14:43:46

お礼

回答ありがとうございます。
ちょっと疑問が残るので質問ですが、
cnt[c - '0']++;は配列の中で計算をしているのですかね、
[c - '0']の部分が何をしているのか解りません。
実をいうと柴田望洋という方の新装版のプログラミング講義という書籍で勉強しているのですが
あいにく問題はのっているのですが、プログラム自体に関しては詳しく載っていません。
解答集が載っているわけでもないので、
申し訳ございません、

投稿日時 - 2020-03-11 15:21:00