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

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

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

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

Q&A

解決済

2回答

2589閲覧

英文入力し最頻出文字を表示するプログラム

KeiD

総合スコア26

C++

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

0グッド

0クリップ

投稿2020/07/04 05:01

編集2020/07/04 08:00

最頻出文字(複数個の場合はすべて表示)するプログラムを作っています。
以下のプログラムをベースに作成しています。

英数字の個数を数えることはできましたが、
最頻出文字の表示を与えるソースがわかりません。
どのようなソースを追加すれば以下例のような出力がでるのかご存じの方
よろしくお願い致します。

=作成したいプログラムの入力出力例=========
(入力例)
I went to the house.
It was hot.

(出力例)
最頻出文字 o t ←複数ある場合は全部表示
=========================

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

int main()
{ int ch='\0';
printf("英文を入力してください\n");
int alnum_count = 0;

while((ch=getchar())!=EOF){
if(isalnum(ch)!=0){alnum_count = alnum_count + 1;}
}
printf("英数字数 %d\n", alnum_count);

return 0;
}

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

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

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

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

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

KeiD

2020/07/04 05:23

コメントありがとうございます 今回はisalnum()を使って英数字を見極めるプログラムを作成しています。 よろしくお願い致します。
dodox86

2020/07/04 05:32

「ご存じの方」と書かれていますが、こういうものは課題(問題、要求)に合わせてその時々で解答として合うように自らコードを書くものです。自分ではまったく先に進めない、と言うことでしょうか。「英文字数」だけ数えるのもできませんか。
KeiD

2020/07/04 05:45

ご指摘ありがとうございます。まずは英数字のみ表示しようと以下のプログラムを試してみましたが 表示されませんでした。ですので、英数字のみの数も表示できてません。よろしくお願い致します。 #include <stdio.h> #include <ctype.h> #include <string.h> int main() { int ch='\0'; printf("Input some words\n"); int alnum_count = 0; while((ch=getchar())!=EOF){ if(isalnum(ch)!=0){ alnum_count = alnum_count + 1; }} printf("英数字数 %d\n", alnum_count); return 0; }
dodox86

2020/07/04 06:00 編集

> まずは英数字のみ表示しようと以下のプログラムを試してみましたが表示されませんでした。 そんな訳ないです。コメント欄のコードをただ単にコピペしてコンパイルした例ですが、動いています。 $ gcc -Wall t16.c -o t16 $ ./t16 Input some words It was many and many a year ago, 英数字数 24 入力の仕方やEOFの入力の仕方(UN*XならCTRL+D、WindowsならCTRL+Z)は合っていますか。操作方法と問題、解答の認識が間違っているのではありませんか。
KeiD

2020/07/04 06:03

初心者ですいません。CTRL+Dを押したら表示されました。ありがとうございます。
dodox86

2020/07/04 06:05 編集

質問文中で「CTL+Dで入力終了し、」とありますが、CTL+D は、コントロール(CTRL)キーとDのキーの同時押しです。(<UN*Xの場合) コントロールキーは一般的に"CTRL"で表記します。ここで誤解があるのではありませんか。
dodox86

2020/07/04 06:09

(CTRL+Dの入力で終了できたのであればそれで結構です)
KeiD

2020/07/04 06:12

ありがとうございます。あとは最頻出文字( o t ←複数ある場合は全部表示) さえ表示されれば問題解決します。よろしくお願い致します。
dodox86

2020/07/04 06:16

既に回答をいただいていますし、私は回答の予定はありませんので、(少なくとも私に関して)回答をお待ちいただく必要はありません。ヒントだけ書くと、私だったら英数文字それぞれを割り当てた配列をつくって、それぞれをカウントアップしますね。(y_waiwaiさんの回答と実質同じです)
KeiD

2020/07/04 06:25

ありがとうございます。
KeiD

2020/07/04 08:01

全くの初心者なのですみません。ありがとうございます。
guest

回答2

0

ベストアンサー

課題かなにかみたいだから"そのものヅバリ"を見せるわけにはいかんだろう。
なのでかなり近いC++コード:

C++

1// charcount.cpp 2#include <iostream> 3#include <iomanip> 4#include <iterator> 5#include <algorithm> 6 7int main() { 8 int hist[256]; // 度数分布表 9 std::fill_n(hist, 256, 0); // まず0クリア 10 11 // 出現頻度を勘定する(ただし多バイト文字も1byte文字として) 12 std::for_each( std::istream_iterator<char>(std::cin), 13 std::istream_iterator<char>(), 14 [&hist](unsigned char ch) { hist[ch]++; }); 15 16 // いちばんたくさん出てきたやつ 17 int max_count = *std::max_element(hist, hist+256); 18 19 // 出現頻度を出力(最頻には'*'を付加) 20 for ( int i = 32; i < 127; ++i ) { 21 if ( hist[i] != 0 ) { 22 std::cout << (char)i << " : " << std::setw(3) << hist[i] << ' '; 23 if ( hist[i] == max_count ) { std::cout << '*'; } 24 std::cout << '\t'; 25 } 26 } 27 std::cout << std::endl; 28 return 0; 29}

自分自身(charcount.cpp)を食わせてみた:

D:\work>charcount < charcount.cpp ! : 1 " : 2 # : 4 & : 1 ' : 8 ( : 13 ) : 13 * : 3 + : 5 , : 5 . : 1 / : 12 0 : 4 1 : 1 2 : 5 3 : 2 5 : 3 6 : 3 7 : 1 : : 25 ; : 12 < : 23 = : 5 > : 6 A : 1 N : 1 [ : 6 \ : 2 ] : 6 _ : 7 a : 18 c : 21 d : 18 e : 18 f : 5 g : 2 h : 18 i : 39 l : 9 m : 10 n : 20 o : 19 p : 6 r : 19 s : 26 t : 47 * u : 13 w : 1 x : 6 z : 1 { : 5 } : 5

投稿2020/07/04 11:24

episteme

総合スコア16614

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

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

KeiD

2020/07/04 11:31

epistemeさん、どうもありがとうございます。先ほどのコードもありがとうございます。 参考にさせていただきます。助かります。
guest

0

判定する文字種類数の分だけカンタを用意し、1文字づつ該当するカウンタを+1していき、文字入力が終了したら一番大きいカウント値を持つ文字を算出します

投稿2020/07/04 05:31

y_waiwai

総合スコア87749

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

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

KeiD

2020/07/04 05:50

コメントありがとうございます。まずは英数字のみの数を表示しようと以下のプログラムを試しましたが プログラムが作動しません。全くの初心者で申し訳ございません。よろしくお願い致します。 #include <stdio.h> #include <ctype.h> #include <string.h> int main() { int ch='\0'; printf("Input some words\n"); int alnum_count = 0; while((ch=getchar())!=EOF){ if(isalnum(ch)!=0){ alnum_count = alnum_count + 1; }} printf("英数字数 %d\n", alnum_count); return 0; }
y_waiwai

2020/07/04 05:56

どういうふうに作動しないのかわかりませんが、カウンタは一つだけなので、一つだけのカウントしかしませんね。 って、なにをカウントしたいんでしょう
KeiD

2020/07/04 05:59

まずは入力から英数字のみの文字数を数えたいのですがこのプログラムで 試しにI have a pen.と入力してみましたが、何も表示されませんでした。よろしくお願い致します。
y_waiwai

2020/07/04 06:02

EOFという文字は、Enterでは入力されません。 Ctrl+Cか、Ctrl+Dを入力しましょう
KeiD

2020/07/04 06:04

CTRL+Dを押したら表示されました。ありがとうございます。
dodox86

2020/07/04 06:06

CTRL+Cだと、一般に強制終了です。(出力されてラッキー。多分、出ない)
y_waiwai

2020/07/04 06:11

ああ、Ctrl+Zでしたね ちなみに、Enterを判定するなら、13 と比較しよう
KeiD

2020/07/04 06:12

ありがとうございます。あとは最頻出文字( o t ←複数ある場合は全部表示) さえ表示されれば問題解決します。よろしくお願い致します。
y_waiwai

2020/07/04 06:15

数字とアルファベットだけでいいなら、10+26個、合計36個のカウンタを用意すればいけますね がんばってください #大文字小文字を別にするならさらに+26個
KeiD

2020/07/04 06:24

ありがとうございます。数字とアルファベットのカウンターは問題なく表示されました。 後は最頻出文字を、複数個ある場合は複数個表示で、どうやって出力させるかだけです。
episteme

2020/07/04 07:15

出現回数の最大値を探し、それと同じ出現回数の文字をすべて出力する。
KeiD

2020/07/04 08:02

ありがとうございます。全くの初心者で恥ずかしながら出現回数の最大値を探すコードがわかりません。
episteme

2020/07/04 08:10

int count[N]; /* この中に各文字の出現回数があるとしよう */ int max_count = 0; /* 出現回数の最大値をここに求める */ int i; for ( i = 0; i < N; ++i ) { if ( max_count < count[i] ) max_count = count[i]; }
dodox86

2020/07/04 08:22

コードへの表現力も重要ですが、人間が頭で考えて、手と紙とペンを使って表現するときにどうするかを考えます。それができないとするとコードに書く以前の(考え方、設計の)問題です。
KeiD

2020/07/04 09:18

epistemeさんありがとうございます。 dodox86おっしゃる通りだと思います。例題コードをたくさん扱い、入出力から理解して行くなど方法はいろいろあるかと思いますが、なにぶん初心者で、時間の制約などあり、困っています。
fana

2020/07/04 10:25

誰かがあなたに英文見せて「この中で一番使われている文字はどれでしょう?」って問題出されたらどうやってその答えを導くのか? って話. 例えばその文章が英語の本の1ページ分くらいの量だとしたら実際にどうやって解決する? プログラミング言語を用いることに関しての初心者ならば実装作業に問題を生じるのは仕方ないが,上記はそれとは無関係でしょう.実装よりも手前の段階の話なのだし.
KeiD

2020/07/04 10:54

fanaさん、コメントありがとうございます。まったくおっしゃる通りなのですが締め切りが迫っており、初歩からやり直す時間がなく、困っています。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問