
自分で考えてみようと思って考えたプログラムなのですが、ポインタを用いてabc・・・・・とアルファベットをどう進めて行けばいいか分かりません。
出来れば見本のプログラムを書いて頂ければうれしいです。
それと、””と’’と{}の使い分けは何ですか?
私が今考えているのは
「a[100]という数列にランダムに入っているアルファベットはそれぞれ何回出て きているかabcd・・・・・・zの順に出力する」
プログラムです。
下が考えてみたものです。
#include<stdio.h>
main(void)
{
static char a[100]=’adhfdfhhlljyerhcvcjhljeyruqqruqruietyiucvnasqasdjh’;
static int count[100];
int I;
char *alpha,*suu;
alpha=a;
I=0;
while(*alpha!=’\0’)
{
for(*suu=’a’;*suu<=’z’;*suu+=’b’-‘a’)
{
if(*alpha==*suu) ++count[I];
++I;
}
}
for(*suu=’a’,I=0;*suu<=’z’;++I,*suu+=’b’-‘a’;) printf(“%c の出で来た回数は %d\n”,*suu,count[I]);
}
No.1ベストアンサー
- 回答日時:
こんにちは。
itohhといいます。まずは、""と''の違いですが、文字列を指定したい場合""にします、''のときは、文字の値
そのものを扱う場合です。
配列(a)の中には、半角英小文字のみ設定されているという条件でサンプルを載せます。
void main(void)
{
static char a[100]="adhfdfhhlljyerhcvcjhljeyruqqruqruietyiucvnasqasdjh"; // (1)
static int count[26]; // (2)
int idx;
char *alpha;
int suu;
memset( count, 0x00, sizeof(int)*26 ); // (3)
// 文字列の最後まで出現頻度をカウントします。
for( alpha=a; *alpha!='\0'; alpha++ ) // (4)
{
// 'a'を配列の0番目に'z'を25番目としてカウントします。
idx = *alpha - 'a'; // (5)
count[idx]++;
}
// 'a'から'z'までの件数を出力します。
for(suu='a',idx=0; suu<='z' ; idx++,suu++) printf("%cの出で来た回数は%d\n",suu,count[idx]);
}
注意:各行の先頭に全角スペースを入れていますのでカット&コピーするときは気を付けてください。
説明:
(1)配列に初期設定する場合、""で囲みます。
(2)アルファベットは26文字なので...
(3)件数のカウンタをまとめてzeroクリアします。
(4)alphaの指すアドレスが0x00になるまでループします。
(5)上記でも書きましたが「''」で囲む場合は、文字の値となります、この場合、「'a'」
ですから、0x61という値と同じです。
配列「a」のはじめの文字は「'a'」ですから引き算すると「0」になり、idxに設定されます。
配列「a」の2番目の文字は「'd'」ですから引き算すると「3」になり、idxに設定されます。
これを最後まで繰り返すと「a」から「z」までの配列「count」に出現頻度がカウントされます。
如何でしょうか?
もし、判らないところがあれば、補足してください。
この回答への補足
アドバイスありがとうございます。
>memset( count, 0x00, sizeof(int)*26 );
これはmemsetという関数」なのでしょうか(無知ですいません。)?
>idx = *alpha - 'a'; // (5)
*alphaはchar型ではないのでしょうか?値をもつのですか?
すいませんが教えてください。
No.4
- 回答日時:
こんにちは。
itohhといいます。>>memset( count, 0x00, sizeof(int)*26 );
>これはmemsetという関数」なのでしょうか(無知ですいません。)?
そのとおりです。
文字列を操作するのに良く使用する関数は。
memset関数:指定の文字で埋める
memcpy関数:文字列をコピーする
memcmp関数:文字列を比較する
strcpy関数:文字列をコピーする(自動的に文字列の最後に「¥0」を代入する)
などです。一度、関数マニュアルを見てください。
>>idx = *alpha - 'a'; // (5)
>*alphaはchar型ではないのでしょうか?値をもつのですか?
alphaは、char型のポインタです。
しかし、*alphaは、char型です。ですから、1バイトを参照することになります。
char型とは、ASCIIコードが設定されていると言うことです。
'a'なら0x61が'b'なら0x62が'z'なら0x7Aが設定されています。ASCIIコード一覧を確認してみてください。
例えば。
*alphaに入っている1バイト目のASCIIコードは、'a'=0x61で、2バイト目は、'd'=0x64です。
(5)では、ASCIIコード同士で引き算をしているということです。
c言語の場合、足し算したからといって文字列が連結されるというわけでもないし、引き算した
からといって文字列が分割されるわけではないのです。
No.3
- 回答日時:
こんにちは。
itohhといいます。すみません、chikako-imagawaさんが考えたソースのアドバイスを忘れていました。
>#include<stdio.h>
>main(void)
>{
> static char a[100]=’adhfdfhhlljyerhcvcjhljeyruqqruqruietyiucvnasqasdjh’;
「""」と「''」の間違いですね。
> static int count[100];
> int I;
> char *alpha,*suu;
> alpha=a;
> I=0;
> while(*alpha!=’\0’)
> {
> for(*suu=’a’;*suu<=’z’;*suu+=’b’-‘a’)
suuは、charポインタです、実態がないところには、「'a'」は設定できません。
suuは、int型にするべきでしょう。
> {
> if(*alpha==*suu) ++count[I];
> ++I;
> }
このループは、「'a'」から「'z'」まで行いますが、「I」カウンタがalphaの2文字目以降も
どんどんカウントアップされ続けてしまいます。
「*suu+=’b’-‘a’」で1づつカウントアップするということが、お判りなのですから
forループを使わない方法(わたしが示したサンプルのように)を考えられるのではないですか?
もし、forループを使うのでしたら、「for(suu='a' ,I=0;」のように行うべきでしょう。
> }
このwhileループでは、「alpha」をカウントアップしていません。
> for(*suu=’a’,I=0;*suu<=’z’;++I,*suu+=’b’-‘a’;) printf(“%c の出で来た回数は %d\n”,*suu,count[I]);
これも、suuは、charポインタです、実態がないところには、「'a'」は設定できません。
>}
No.2
- 回答日時:
C&C++は門外漢なんですが、考え方の参考になりましたら。
配列aの要素を先頭から終端まで見ていく際、出現するのはa-zですよね。
最後に出現回数をa-zの順で表示することでもあるし、
判定対象の文字毎にa-zのループを回すのではなく、
「文字コードからカウント用の配列の添え字を求める」のが簡単では?
(カウント用の配列countは26あれば良い)
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
プロが教える店舗&オフィスのセキュリティ対策術
中・小規模の店舗やオフィスのセキュリティセキュリティ対策について、プロにどう対策すべきか 何を注意すべきかを教えていただきました!
-
任意の文字列のアルファベットのカウント
C言語・C++・C#
-
アルファベットをカウント、
C言語・C++・C#
-
アルファベットの出現頻度求めるプログラム
C言語・C++・C#
-
4
C言語で文字列の中の文字列のカウント
C言語・C++・C#
-
5
ファイルに含まれるアルファベットの小文字のみを数えるプログラム
C言語・C++・C#
-
6
単語の出現頻度を調べるプログラム
C言語・C++・C#
-
7
文字列中に含まれる文字の個数をカウントするプログラムについて…
C言語・C++・C#
-
8
数字文字の出現回数を表示するプログラム(C言語)
C言語・C++・C#
-
9
小文字のみを数える方法
C言語・C++・C#
-
10
C言語で、文字の出現頻度を求める問題がわかりません
C言語・C++・C#
-
11
分数の足し算をさせるプログラムが分かりません。どなたか分かりませんか?
C言語・C++・C#
-
12
単語の出現回数を数え、出現回数順に表示するには?
C言語・C++・C#
-
13
c言語で任意のファイルから読み込んだ単語の数をカウントする
C言語・C++・C#
-
14
数字文字をカウントするプログラムの動作について
C言語・C++・C#
-
15
c言語で文書を読み込み、単語の出現頻度を教える
その他(教育・科学・学問)
-
16
c言語 ファイルから数字を読み込む
C言語・C++・C#
-
17
【C言語】入力された文字種別ごとにカウント
C言語・C++・C#
-
18
C言語でポインタを用いた平均,分散の求め方
C言語・C++・C#
-
19
C言語の入力した文字を反転させるプログラミングの仕方が分かりません。
Ruby
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
人気Q&Aランキング
-
4
nullと""、\\0とEOFの違いにつ...
-
5
C言語の課題で困っています;
-
6
char型配列の最大要素数
-
7
WSH(VBS)でJSONの文字列を読み...
-
8
c言語によって文字列を逆順する...
-
9
C++で文字列の右端から特定の文...
-
10
%dなどの違い
-
11
シリアル通信で0x00を送信した...
-
12
数字の入った配列をファイルへ...
-
13
括弧が含まれる文字列の括弧の...
-
14
バイナリファイル中の日本語文...
-
15
C言語の勉強しています。すみま...
-
16
isdigit
-
17
C言語の問題です。
-
18
c#で他のアプリの文字入力フォ...
-
19
Shift_JIS(16進)を文字に変換す...
-
20
C#でstringをポインタとして渡す
おすすめ情報
公式facebook
公式twitter