C言語で・・・

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
campus

C言語で・・・

#1

投稿記事 by campus » 14年前

このようなプログラムを作成したのですが・・・。
ちなみに、入力されたアルファベットの中から母音を
カウントするというものです

#include <stdio.h>

int main(void)

{


char word[101],boin[5]={'a','i','u','e','o'};
int i,count[5];

printf("アルファベットで文字列を入力してください>>>");
scanf("%s",word);

count[5]={A,B,C,D,E;}

for(i=0; word!='\0'; i++)

{
if(word==boin['a']) {count[A]++;}

if(word==boin['i']) {count++;}

if(word==boin['u']) {count[C]++;}

if(word==boin['e']) {count[D]++;}

if(word==boin['o']) {count[E]++;}

}

printf(" a>>>%d\n i>>>%d\n u>>%d\n e>>>%d\n o>>>%d\n",count[A],count,count[C],count[D],count[E]);

return 0;


}

コンパイルすると、
ex7.c: In function ‘main’:
ex7.c:14: error: expected expression before ‘{’ token
このようなエラーが出ます。
count[5]={A,B,C,D,E;}
↑の行に問題があるみたいなんですが、それが何なのか分かりません;
前後の行も見てみたのですが、特に問題がないように見えます。
どうすれば、無事にコンパイルできるか教えていただければと思います

たかぎ

Re:C言語で・・・

#2

投稿記事 by たかぎ » 14年前

> count[5]={A,B,C,D,E;}
> ↑の行に問題があるみたいなんですが、それが何なのか分かりません;

何なのか...というより、まったくダメです。
こんな文法は存在しません。

> 前後の行も見てみたのですが、特に問題がないように見えます。

問題だらけです。
まず、複合文は式ではありませんので、それを代入式の右オペランドにすることはできません。
次に、その行には末尾にセミコロンがありません。
そして、A, B, C, D, Eという名前はどこでも定義されていませんので素性不明です。

box

Re:C言語で・・・

#3

投稿記事 by box » 14年前

> int i,count[5];
> count[5]={A,B,C,D,E;}

count[/url]の各要素(count[0]~count[4])を「ゼロで」初期化してください。

> if(word==boin['a']) {count[A]++;}

boin[0]に'a'が、...、boin[4]に'e'が、それぞれ入っています。
では、boin['a']と比べるのでなく、何と比べればよいでしょうか。
また、母音が見つかったときにインクリメントするのは
count[A]などではなく、count[いくつ]でしょうか。

Dixq (管理人)

Re:C言語で・・・

#4

投稿記事 by Dixq (管理人) » 14年前

いきなり大きなプログラムを作ろうとすると難しので

1. aだけカウントする
2. aとiをカウントする
3. 2を配列を使って表現
4. 問題そのもの

という順番で作ってみてはどうでしょう?
まず1は

#include <stdio.h>

int main(void){
int i, a_num = 0;
char str[128];

scanf("%s", str);

for( i=0; i<128; i++ ){
if( str == '\0' ){ //文字列の最後だったらループから抜ける
break;
}
if( str == 'a' ){ //その文字がaなら数をカウント
a_num++;
}
}

printf("aは%d個\n", a_num );

return 0;
}

こんな感じになりますよね。

で、たかぎさんも仰っていますが、

>count[5]={A,B,C,D,E;}

宣言した後でこれは出来ないんです。
しかし、今回0で初期化したいだけでしょうから、値の代入は必要ありませんよね。

int count[5]={0,};

のようにかけば、配列の中は全部0で初期化されます。
(int count[5]={1,};とかけば1で初期化されるわけではないことに注意)

宣言の後で初期化したいなら、memsetを使うか、for文で代入すると良いでしょう。

if(word==boin['a']) {count[A]++;}

これは色々とおかしいですね。
まずAという変数はどこにも定義されていません。
そして、'a'はいくつであることを期待していますか?
試しに

printf("%d",'a');

とかいて実行して見て、'a'が自分の思う値かどうか確認して見て下さい。

恐らくboin[0]=='a'であることを期待しているのだと思います。

countの0番目の要素に'a'の数を入れたのであれば

if( word == 'a' ) { count[0]++; }

で良いですよね。
問題を少しずつ解いていくと解るのではないかと思います。
まずは、上で分解した通りの順番で解いてみてはどうでしょう?

campus

Re:C言語で・・・

#5

投稿記事 by campus » 14年前

みなさん解説、ありがとうございます。エラー文が一行だけだったのでほとんど問題ないと思っていました;
お恥ずかしい・・・。みなさんのアドバイスを参考にして書き換えた所、無事にコンパイルできました。
ただ、まだお聞きしたいことがあります。
#include <stdio.h>

int main(void)

{


char word[101],boin[5]={'a','i','u','e','o'};
int i,count[5];

printf("アルファベットで文字列を入力してください>>>");
scanf("%s",word);;

count[0]=0,count[1]=0,count[2]=0,count[3]=0,count[4]=0;

for(i=0; word!='\0'; i++)

{
if(word==boin[0]) {count[0]++;}

if(word==boin[1]) {count[1]++;}

if(word==boin[2]) {count[2]++;}

if(word==boin[3]) {count[3]++;}

if(word==boin[4]) {count[4]++;}

}

printf(" a>>>%d\n i>>>%d\n u>>%d\n e>>>%d\n o>>>%d\n",count[0],count[1],count[2],count[3],count[4]);

return 0;


}
このようなプログラムを作成したのですが、これは配列boinや配列countに対して定数で
配列要素の値を参照していますよね。
これを例えば、boin, count[j]のように変数で値を参照したいのですがどうすれば良いでしょうか?
現在、boin[0]には'a'が入っている(?)と思いますがword==boin[a]としてはだめなので他になんらかの
定義をしなくてはならないということでしょうか。
重ねての質問になりますが、解説していただけたらと思います。
(C言語の文法を無視した妙な質問になっていたら申し訳ないです)

Dixq (管理人)

Re:C言語で・・・

#6

投稿記事 by Dixq (管理人) » 14年前

> これを例えば、boin, count[j]のように変数で値を参照したいのですがどうすれば良いでしょうか?

ほぼ答えに近づいていますね。
例えば

count[0]=0;
count[1]=0;
count[2]=0;
count[3]=0;
count[4]=0;



for( j=0; j<5; j++ ){
count[j]=0;
}

と置き換えられます。
ということは

if(word==boin[0]) {count[0]++;}
if(word==boin[1]) {count[1]++;}
if(word==boin[2]) {count[2]++;}
if(word==boin[3]) {count[3]++;}
if(word==boin[4]) {count[4]++;}

これってどう置き換えられるでしょうか?

campus

Re:C言語で・・・

#7

投稿記事 by campus » 14年前

回答ありがとうございます。アドバイスを頂いた部分を自分なりに置き換えてみました。
コンパイルしたところ、エラーは出ないものの警告が出てしましました。
too few arguments for format ←のようなものです。
警告はエラーとは違い無視しても良いものがある、と聞いたことがありますが実行結果がおかしいので
やはりどこかおかしいようです。
コメント文で自分の解釈を記述してみたので、重ね重ね申し訳ないですが回答いただければと思いますm(_ _)m

int main(void)

{
 
 char word[101],boin[5]={'a','i','u','e','o'};
int i,j,k,count[5];

printf("アルファベットで文字列を入力してください>>>");
scanf("%s",word);;

for(j=0; j<5; j++) /* ここでcount[0]~[4]を用意 */
{
count[j]=0; /* 初期値は0 */

}

for(i=0; word!='\0'; i++) /* NULL文字まで文字をカウント */

for(k=0; k<5; k++) /* boin[0]~boin[4]を用意。それぞれにa~oが入っている(?) */
{
boin[k]=0; /* 初期値は0 */
}

if(word==boin[k]) {count[j]++;} /* ここでa~oの数をカウントする */

  printf(" a>>>%d\n i>>>%d\n u>>%d\n e>>>%d\n o>>>%d\n",count[j]);

return 0;


}

Dixq (管理人)

Re:C言語で・・・

#8

投稿記事 by Dixq (管理人) » 14年前

遠ざかっちゃいましたね;
さっきのプログラムをちょこっと変更すればすぐ完成していましたよ。
今、処理の順番がどうなっているか落ち着いて考えてみましょう。
また、括弧の有効範囲が亜どこまでで、どこまでをループさせたいのか明確にして下さい。
そして字下げをきちんとかかないと間違いの元になります。

先ほどと同じ事を言いますが、
#include <stdio.h>

int main(void){
    int  i, count[5]={0,};
    char word[128];
    char boin[5]={'a','i','u','e','o'};

    printf("アルファベットで文字列を入力してください>>>");
    scanf("%s",word);

    for( i=0; i<128; i++ ){
        if(word==boin[0]){count[0]++;}
        if(word==boin[1]){count[1]++;}
        if(word==boin[2]){count[2]++;} 
        if(word==boin[3]){count[3]++;}
        if(word==boin[4]){count[4]++;}
    }

    printf("a=%d  i=%d  u=%d  e=%d  o=%d\n",count[0],count[1],count[2],count[3],count[4]);
    return 0;
}

こちらの配列要素をループで表現する時、

count[0]=0;
count[1]=0;
count[2]=0;
count[3]=0;
count[4]=0;

は

for( j=0; j<5; j++ ){
    count[j]=0;
}

と置き換えられます。
ということは

if(word==boin[0]) {count[0]++;}
if(word==boin[1]) {count[1]++;}
if(word==boin[2]) {count[2]++;} 
if(word==boin[3]) {count[3]++;}
if(word==boin[4]) {count[4]++;} 

これってどう置き換えられるでしょうか?

また、128回ループするループ文の中に、10回ループするループ文を書くと

    int a = 0;
    for( i=0; i<128; i++ ){
        for( j=0; j<10; j++ ){
            a++;
        }
    }

例えばこの時aはいくらになるでしょうか?

campus

Re:C言語で・・・

#9

投稿記事 by campus » 14年前

最後まで付き合っていただきありがとうございました。
なんとか変数で値を参照できるようなプログラムが出来ました。
回答してくださった他の方々もありがとうございました!

閉鎖

“C言語何でも質問掲示板” へ戻る