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

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

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

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

Q&A

解決済

2回答

2031閲覧

ASCIIコードを英文字へ変換と最頻度文字表示問題

KeiD

総合スコア26

C++

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

0グッド

0クリップ

投稿2020/07/04 12:27

以下のプログラムで英文入力後
各英文字に対応するASCIIコードとその頻度と最大頻度は表示できました。

しかし、最大頻度に対応するASCIIコードとそのASCIIコードを英文字に変換し
表示する方法がわかりません。

例えばWho are you? という英文入力後
Max count=2 とでますが
頻度2の時のASCIIコードのみを英文字に変換して表示する方法がわかりません。
ご存じの方教えて頂けると大変助かります。
よろしくお願い致します。

#include <stdio.h>

int main()
{
int i,ch;
int cnt[150] ={0};

while(1){
ch =getchar();
if (ch==EOF) break;
if (ch>=65 && ch<=90||ch>=97&&ch<=122)
cnt[ch]++;
}

int max_count = 0;

for ( i = 0; i < 150; ++i ) {
if ( max_count < cnt[i] ) max_count = cnt[i];
}

puts("文字の出現回数");

for(i=65; i<123; i++)
printf("'ASCII=%d';%d\n",i,cnt[i]);
printf("Max count",max_count);

return 0;
}

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

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

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

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

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

guest

回答2

0

max_countcnt[65]cnt[122]を比較して一致するものをprintfで1文字表示するだけでは?
1文字表示に使用する書式はリンク先を読んでみてください。

投稿2020/07/04 12:36

SHOMI

総合スコア4079

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

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

0

ベストアンサー

ひんと:

printf("'ASCII=%d';%d\n",i,cnt[i]);

コレ↑をこう↓してみ?

printf("'ASCII=%d**(%c)**';%d\n",i, (char)i, cnt[i]);

しかるのち、さらに こう↓してみ?

if ( cnt[i] == max_count ) { printf("'ASCII=%d**(%c)**';%d\n",i, (char)i, cnt[i]); }

投稿2020/07/04 12:33

編集2020/07/04 12:36
episteme

総合スコア16612

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

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

KeiD

2020/07/04 12:45

epistemeさん、ありがとうございます。大変助かります。 早速試してみましたが main.cpp:26:1: error: stray ‘\343’ in program   ^ main.cpp:26:2: error: stray ‘\200’ in program main.cpp:26:3: error: stray ‘\200’ in program main.cpp:26:4: error: stray ‘\343’ in program   main.cpp:26:5: error: stray ‘\200’ in program    main.cpp:26:6: error: stray ‘\200’ in program    とエラーが出ましたがこちらのコンパイラーの不具合でしょうかね
SHOMI

2020/07/04 12:50 編集

コンパイラ云々ではなく、全角スペースがあったり、引用符(")等がUNICODEの別の文字になったりしているだけでしょう。
KeiD

2020/07/04 13:10

ありがとうございます。 最後のforから先を for(i=65; i<123; i++){ printf("'ASCII=%d';%d\n",i,cnt[i]); if ( cnt[i] == max_count ) { printf("'ASCII=%d(%c)';%d\n",i, (char)i, cnt[i]); }} return 0; } で置き換えて実行してみましたが、最終表示が 'ASCII=122';0 となりmaxcountも表示されなくなってしまいました。
episteme

2020/07/04 13:24 編集

ぃゃぃゃぃゃ for(i=65; i<123; i++){   if ( cnt[i] == max_count ) { printf("'ASCII=%d(%c)';%d\n",i, (char)i, cnt[i]); } } これで頻度最大のだけ出力されない?
KeiD

2020/07/04 13:28

ありがとうございます。 変更してみましたが Compilation failed due to following error(s).main.cpp:18:1: error: stray ‘\343’ in program   if( cnt[i] == max_count ) { printf("'ASCII=%d(%c)';%d\n",i, (char)i, cnt[i]); } ^ main.cpp:18:2: error: stray ‘\200’ in program   if( cnt[i] == max_count ) { printf("'ASCII=%d(%c)';%d\n",i, (char)i, cnt[i]); } ^ main.cpp:18:3: error: stray ‘\200’ in program   if( cnt[i] == max_count ) { printf("'ASCII=%d(%c)';%d\n",i, (char)i, cnt[i]); } ^ main.cpp:18:4: error: stray ‘\343’ in program   if( cnt[i] == max_count ) { printf("'ASCII=%d(%c)';%d\n",i, (char)i, cnt[i]); } ^ main.cpp:18:5: error: stray ‘\200’ in program   if( cnt[i] == max_count ) { printf("'ASCII=%d(%c)';%d\n",i, (char)i, cnt[i]); } ^ main.cpp:18:6: error: stray ‘\200’ in program   if( cnt[i] == max_count ) { printf("'ASCII=%d(%c)';%d\n",i, (char)i, cnt[i]); } というエラーがでました。
episteme

2020/07/04 13:30

さっきとおんなじ。全角空白のたぐいが混入してるっしょ。
Daregada

2020/07/04 13:31

指摘されたところに全角空白が2つ入っているので、削除してください。
KeiD

2020/07/04 13:43

ありがとうございます。 出力はされましたが 最後は  'ASCII=122';0 Max count と表示されました。
SHOMI

2020/07/04 13:49 編集

>'ASCII=122';0 printf("'ASCII=%d';%d\n",i,cnt[i]); を実行した結果にしか見えないので、ソース修正前の古いプログラムを実行しているのでは? >Max count 後ろに%dがありませんよ。
episteme

2020/07/04 13:48 編集

んなはずないんだけどなー...まさかとは思うが、再度コンパイルしてるよね? 僕とこではちゃんと動いてます。 #include <stdio.h> int main() { int i,ch; int cnt[150] ={0}; while(1){ ch =getchar(); if (ch==EOF) break; if (ch>=65 && ch<=90||ch>=97&&ch<=122) cnt[ch]++; } int max_count = 0; for ( i = 0; i < 150; ++i ) { if ( max_count < cnt[i] ) max_count = cnt[i]; } puts("文字の出現回数"); for(i=65; i<123; i++) { if ( cnt[i] == max_count ) printf("'ASCII=%d(%c)';%d\n",i,(char)i,cnt[i]); } printf("Max count %d\n",max_count); return 0; }
KeiD

2020/07/04 13:49

epistemeさん ありがとうございます。全部コピペして実行したら動きました。感謝です。
KeiD

2020/07/04 13:50

SHOMIさん、 ご指摘ありがとうございます。助かります。
episteme

2020/07/04 13:55

なんだったんでしょね。 ま、解決したんならなにより。
KeiD

2020/07/04 13:56

epistemeさん、本当にありがとうございました。
SHOMI

2020/07/04 13:58

コンパイルし忘れでないなら、毎回コマンドを手打ちでコンパイルしていて-oの後のファイル名を打ち間違えたとかですかね?
KeiD

2020/07/04 14:01

SHOMIさんもありがとうございました。
episteme

2020/07/04 14:01

わからんねー... Linuxなら gcc なんちゃら.c ./a.out こんだけのことなんだが。
SHOMI

2020/07/04 14:09 編集

history|grep gcc でgccの実行履歴を確認して-oオプションに違いがないか確認したり、作業ディレクトリ内に更新日が今日の見慣れない実行権限付きファイルができていないか確認すれば解決するかも? UNIX互換環境なのかWindowsなのかわかりませんが
episteme

2020/07/04 14:07

原因は突き止めといたほうがいい、毎回こんなトラブルでつまらんスッタモンダせんために。
SHOMI

2020/07/04 14:13 編集

vi等をターミナルから起動してソース編集していたなら、historyでエディタとgccを交互に起動していたかを確認。 エディタを起動しっぱなしだったり、VSCode等ならどうだかわからなくなりますが…
Daregada

2020/07/04 14:15

「なぜか2箇所のディレクトリに微妙に違うソースコードが保存されていて、修正しているほうとは違うソースコード由来の実行ファイルを実行している」とか、いろいろ思いも寄らぬことをやるんですよね。
SHOMI

2020/07/04 14:29 編集

emacsなら間違えて"ソース.c~"を編集していたとか…
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問