自分で考えてみようと思って考えたプログラムなのですが、ポインタを用いて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で質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# プログラミング c言語 4 2023/03/07 01:05
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
- Ruby 【JAVA】数字をひし形に出力するプログラムについて 2 2022/07/11 23:32
- C言語・C++・C# C言語 3 2022/11/09 13:27
- C言語・C++・C# C言語プログラム変更 2 2022/12/21 15:03
- C言語・C++・C# カードシャッフルのブログラムを使ってc言語でブラックジャックをしたい 2 2022/04/12 15:13
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
- C言語・C++・C# 10個の実数に対する降順ソート結果を出力するプログラムを作りたいのですが、以下のプログラムをどう直せ 1 2022/07/09 22:16
- Java javaでのプログラム(配列)について質問です. 2 2022/10/14 22:27
- Java java 入力 3 4 3 出力 ABC DEFG HIJ このようなプログラムの書き方を教えてくだ 2 2022/07/15 14:18
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
_tcscpy_s(wcscpy_s)の第二引数...
-
TCL言語で文字列検索方法を教え...
-
プログラムによく出てくるst...
-
ASPで別サイトの内容を Stream ...
-
括弧が含まれる文字列の括弧の...
-
fgetsで配列に数字を入れる。
-
VBA-DLLの引数受け渡しについて
-
ソースコードの間違い (C言語)
-
曜日を格納する配列の大きさ
-
C#でstringをポインタとして渡す
-
C++で入力した文字列から数字を...
-
VC++6.0 MFC ダイアログバーを...
-
ExcelVBAで質問です。離れた二...
-
c言語
-
C言語 配列の長さの上限
-
パイソンの
-
mallocについて
-
Excelですべての組合せ(重複組...
-
関数から配列を返すには?
-
文字列内の数字削除
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
C++で入力した文字列から数字を...
-
nullと""、\\0とEOFの違いにつ...
-
プログラムによく出てくるst...
-
%dなどの違い
-
WSH(VBS)でJSONの文字列を読み...
-
TCL言語で文字列検索方法を教え...
-
C#でstringをポインタとして渡す
-
16進数を2文字ずつ配列に格納し...
-
_tcscpy_s(wcscpy_s)の第二引数...
-
C++で文字列の右端から特定の文...
-
シリアル通信で0x00を送信した...
-
VBA-DLLの引数受け渡しについて
-
数字の入った配列をファイルへ...
-
c#で他のアプリの文字入力フォ...
-
構造体→文字列→構造体 をする方法
-
Shift_JIS(16進)を文字に変換す...
-
バイナリファイル中の日本語文...
-
C言語の課題で困っています;
-
[C++]WCHARの1文字目しか表示で...
-
VB6.0でのバイナリデータの扱い...
おすすめ情報