文字列を入力し、入力した文字列を逆にしmojiretuに格納するvoid gyakumoji(mojiretu[])
関数を作成し、プログラムを完成しなさい。という問題なんですが、入力した文字を逆にするや
り方がわかりません。よろしくおねがいします。
CString::MakeReverse()はアリなのかな?
こういう質問をするときは(それが宿題ならなおのこと)、自分がどこまで努力してどこで
躓いているのかをキッチリ書きましょうね。この質問文では丸投げしているように見えます。
どうも失礼いたしました。初めてなものでどこまで書いていいのかわからず、すいませんでし
た。どりあえず一応完成させ何度もコンパイルしてはエラーと戦っていました。でもその前にも
っと基本的なところが抜けてるような気がしていて、では作ってみたソースを載せてみたいと思
います。 #include <stdio.h>
void gyakumoji(mojiretu)
{
int i = 0;
int moji[100];
while(mojiretu[i] != '\0'){
mojiretu[i] = moji[i];
i++;
}
return (mojiretu);
}
int main(void)
{
int m, j;
int moji[100];
printf(文字列を入力してください。\n);
scanf(%s, &moji);
printf(逆から読むと%sです。, gyakumoji(moji));
return (0);
}
main()の、m, jは何のためにあるのですか?
gyakumoji()のforループで何をしているか把握していますか? 変数のスコープについて、
また文字列が配列の一種であるということについておさらいが必要なようです。
タイトルに「関数の単元」と書いていることから「関数とはなんぞや」ということが理解
できていない(これから勉強するところ)と解釈します。予習のつもりで練習問題をどんど
ん先に進めているつもりなのかもしれませんが、「関数とはなんぞや」「関数とはどうい
う体裁を成していなくてはならないのか」「voidとはなんぞや」「変数のスコープとはな
んぞや」「strなんとか() という標準関数の中でこの場合利用できるものはないか」など
をしっかり把握してから取りかかった方がいいと思います。確かに本を読むだけよりも実
際にプログラムを動かしてみる方が結果が目に見えて楽しいでしょうが、恐らく教科書
の、読み飛ばしているであろう部分に重要なことが書いてあるはずです。
そうそう、「100文字以上の長い文字列が入力された場合」の対処はいらないのでしょうか。
確かに関数の単元をやりはじめたばかりなのですが、今の段階で解ける問題らしいです。
-文字列を逆にして格納-ここの部分だけでいいのでヒント等をいただけないでしょうか?
>今の段階で解ける問題らしいです。
ならば復習が必要なのでしょう。
>-文字列を逆にして格納-ここの部分だけでいいのでヒント等を
すでに書いている、
>>gyakumoji()のforループで何をしているか把握していますか?
が正にそうなんですけど。
例えば、
char str[] = abc;
という文字列があったとしたら、
str[0] == 'a'
str[1] == 'b'
str[2] == 'c'
str[3] == '\0'
ということですよね? これを逆順にする、ということは
str[0] == 'c'
str[1] == 'b'
str[2] == 'a'
str[3] == '\0'
という結果がほしいんですよね? あなたが作ったgyakumoji()のforループこういうことを
する処理になっていますか?
確かに僕が作ったプログラムではただmojireruとmojiがひとしくなっているだけで、逆にはな
っていません。ただわからないところなのでこれ以上自分ひとりでは全然。それと上のソースを
すこしいじってみました。ただ逆にするところは適当です。
#include <stdio.h>
void gyakumoji(mojiretu)
{
int n = 0;
int moji[100];
while(scanf(%s, &moji[n]) != '/')
n++;
return (mojiretu);
}
int main(void)
{
printf(文字列を入力してください。\n);
gyakumoji(moji);
return (0);
}
>tib 2003/01/07(火) 03:40:57
さんの
>「voidとはなんぞや」
は
>void gyakumoji(mojiretu)
>{
> int n = 0;
> int moji[100];
>
> while(scanf(%s, &moji[n]) != '/')
> n++;
>
> return (mojiretu);
>}
のことで、コンパイルエラーになっていませんか
ということです
今回載せているソースもエラー出てませんか
>scanf(%s, &moji[n])
コンパイラについている、オンラインヘルプなど参照してみてはどうですか
使い方間違っていませんか
>scanf(%s
ここだけ簡単に言うと
入力:”1234567890/”
も
入力:”/”
も同じ動作します
つまり
%sの
sはstring(文字列)を意味します
今回載せている
> gyakumoji(moji);
の引数「moji」は
mainまたはグローバルのどこに定義しているのでしょうか
例
AAA(XXX)
{
CHAR AAA_ccc
}
BBB(DDD)
{
AAA_ccc=’d’ ←これは関数 BBBのローカル変数または
グローバル変数として
定義されておらず
関数 AAAのローカル変数のため
ここでは使用できません
}
こんなこと教科書などに載ってませんかね
関数を作るための基本くらいは、この単元に至るまでに学習しているはずなので
復習してみてください
アルゴリズムを考える以前の問題のようですけど
ガンバ! ガンバ! ファイト!
追伸
皆様の回答を見ると「char型」使っているでしょ
これは、「文字」を扱うと言うことを前提としているためです
扱うデータによってデータの宣言型をキチンと選択することも
重要な学習ではないでしょうか
> 文字列を逆にして格納-ここの部分だけでいいのでヒント等をいただけないでしょう
か?
char* gyakumoji(char* mojiretu) {
int begin;
int end;
begin = 0;
end = /* [mojiretuの長さを求めよ。先頭から'\0'までの距離だ。] */
while ( begin < end ) {
/* [mojiretu[begin] と mojiretu[end] とを入れ替えよ。] */
++begin; /* ひとつ進む */
--end; /* ひとつ戻る */
}
return mojiretu;
}
/* [....] */ の部分は
あなたが書いてください。
ここの方々って親切ですよね。
なるなるさんにはそう映ってないかもしれませんけど、
最終的には自分で解かないと身になりませんし。
(解く=理解して答えを導くってことで。辞書で調べたわけじゃないです)
掲示板によっては無視されかねないですから。
ふらりと立ち寄って見かけたんですが、なんとなくそんなことを感じてしまいました・・・
さて、何も書かないのもなんですから voidについて。
voidというのは
intや charと同じような型です。
すごく大雑把に書けば、中身いらない型です。
中身いらないということで、returnで値を返そうとしても、
なるなるさんの書き方ですと
void gyakumojiは拒否します。「いらないってば」って。
return (mojiretu);
で結果を mainに持っていこうとしている時点で、
gyakumojiでなにをやっても無駄になっちゃうわけです。
「gyakumoji君、これmainにもってってよ。」# return (mojiretu);
「いやだよ。っていうか無理。俺 voidだし」# gyakumojiの宣言。
文字をいれるなら、char。
整数をいれるなら、int。
それは関数でも同じです。
もうなるなるさんは見てないかもしれませんが
(επιστημηさんのレスのおかげで解けたのかもしれませんね)
同じような悩みの人がみるかもしれないので、ご参考に。
ではでは。