ページ 11

再び課題の質問

Posted: 2007年11月14日(水) 20:57
by YYY
課題で文字列というものに大変苦戦しております。それで早速質問なんですがこちらがアルファベットで名前を入力した時に逆さまに表示させる方法がわからないのです。自分の書いたプログラムは
#include <stdio.h>

int main(void)
{
int moji;
int i;
char name[100];

printf("Your name: ");
gets(name);

moji = 0;
while (name[moji] != '\0') {
printf("%2d moji me : '%c'\n", moji, name[moji]);
moji++;
}
printf("%s wa zenbu de %d moji\n", name, moji);
printf("Your name : %s\n",name);

i = name[moji];
for (i = moji - 1; i >=0; i--){
printf("Reversed: %c ",i);
}
return 0;
}
で、実行結果は
Your name: araya
0 moji me : 'a'
1 moji me : 'r'
2 moji me : 'a'
3 moji me : 'y'
4 moji me : 'a'
araya wa zenbu de 5 moji
Your name : araya
Reversed: Reversed: Reversed: Reversed: Reversed:

意図する結果は
Your name: araya
0 moji me : 'a'
1 moji me : 'r'
2 moji me : 'a'
3 moji me : 'y'
4 moji me : 'a'
araya wa zenbu de 5 moji
Your name : araya
Reversed: ayara
です。最後のReversedの部分でfor文の構成はあっていると思われますが%c,%sの使い方さらに
printfで表示させたい変数が何か分からなくなってしまいました。
助けをください。

Re:再び課題の質問

Posted: 2007年11月14日(水) 21:26
by box
> printf("%2d moji me : '%c'\n", moji, name[moji]);

この文で、1文字ずつ表示するために正しくname[moji]を使っているのに、

> printf("Reversed: %c ",i);

なぜここでname[/url]を使わないのでしょうか?
なお、逆順に表示する直前の

> i = name[moji];

これは不要です。

Re:再び課題の質問

Posted: 2007年11月14日(水) 21:39
by YYY
name[moji]ですか?それで実行してもReversed:が繰り返されるだけなんですがどうすればいいでしょうか?

Re:再び課題の質問

Posted: 2007年11月14日(水) 21:43
by box
> for (i = moji - 1; i >=0; i--){

このfor文で、i を 文字列の最後の(moji-1)番目から1つずつ減らして、
文字列の先頭の0番目まで順番に出力しようとしていますね?
ということは、

> printf("Reversed: %c ",i);

ここで出力しなければならないのは、i でも name[moji] でもなく、
何でしょうか?

Re:再び課題の質問

Posted: 2007年11月14日(水) 21:55
by YYY
多分できたかな?nameですか?
一応意図する形にはなったんですがこのままだとReversed:まで繰り返されますよね?
そうならない方法ってあるんでしょうか?forの外に出すと処理されないし中に入れっぱなしだとどうしても繰り返されますよね?

Re:再び課題の質問

Posted: 2007年11月14日(水) 22:04
by box
> forの外に出すと処理されないし

おっしゃっている意味がよくわからないです。
文字列を逆順に出力する前に一度だけ「Reversed: 」と
出力したいのであれば、for文の外に書くしかありません。

for文の外に出すと処理しなかったのでしたら、
そのときのコードを見せていただけますか?

Re:再び課題の質問

Posted: 2007年11月14日(水) 22:10
by YYY
#include <stdio.h>

int main(void)
{
int moji;
int i;
char name[100];

printf("Your name: ");
gets(name);

moji = 0;
while (name[moji] != '\0') {
printf("%2d moji me : '%c'\n", moji, name[moji]);
moji++;
}
printf("%s wa zenbu de %d moji\n", name, moji);
printf("Your name : %s\n",name);

for (i = moji - 1; i >=0; i--){
}
printf("Reversed: %c ",name);

return 0;

}

の結果が
Your name: araya
0 moji me : 'a'
1 moji me : 'r'
2 moji me : 'a'
3 moji me : 'y'
4 moji me : 'a'
araya wa zenbu de 5 moji
Your name : araya
Reversed:
となります。

Re:再び課題の質問

Posted: 2007年11月14日(水) 22:14
by box
> for (i = moji - 1; i >=0; i--){
> }
> printf("Reversed: %c ",name);

う~ん、どうしてこういうコードになりますか…。
せっかくfor文のループを書いているのに、中で何もしていないですよ。

for文の「前」に "Reversed: " を一度だけ出力して、
for文によるループの「中」で name を出力してください。

Re:再び課題の質問

Posted: 2007年11月14日(水) 22:33
by YYY
できました。ありがとうございます。頭が固すぎましたね・・・。そんな単純でしたとは・・・。
どうも分けると改行されちゃうというイメージが出ちゃうんですよね。
文字列をもう少し深く勉強します。