ページ 1 / 1
文字反転処理
Posted: 2011年10月30日(日) 05:23
by 困り果てた大地
#i[tab=30]nclude <stdio.h>
#include <string.h>
#define MAX_WARD 256
void main(void)
{
//===変数宣言===
char aDataIn[MAX_WARD]; //反転前文字列入力先
char aDataOut[MAX_WARD]; //反転後文字列格納先
char *pDataIn, *pDataOut; //反転前・後配列操作用ポインタ
int nStrlength; //入力文字数
int nLoopCntWord; //反転処理ループ用
printf("何か文字を入力してください(255文字以内)>");
scanf("%s", &aDataIn);
nStrlength = (int)strlen(aDataIn);
printf("\マークn文字数は「%d」文字です。\n", nStrlength);
//===文字列の反転処理===
pDataIn = ■■■■■■; //aDataIn の最終文字位置
pDataOut = ■■■■■■; //aDataOutの先頭
for( nLoopCntWord = 0; nLoopCntWord < ■■■■; nLoopCntWord ++)
{
■■■■■■ = *pDataIn;
pDataIn --;
pDataOut ++;
}
■■■■■■ = '\0';
printf("*** 反転処理完了 ***\n");
printf("入力した文字列:%s\n", aDataIn);
printf("反転した文字列:%s\n", aDataOut);
rewind(stdin);
getchar();
}
黒い部分の答えを教えてください
教えてくれる人だけレスください
Re: 文字反転処理
Posted: 2011年10月30日(日) 08:35
by みけCAT
丸投げは禁止です。
ということを教えました。
コードはcodeタグで囲みましょう。
► スポイラーを表示
aDataOut
*pDataOut
nStrlength
*pDataOut
&aDataIn[nStrlength-1]
順番は考えてみましょう。
Re: 文字反転処理
Posted: 2011年10月30日(日) 12:40
by 困り果てた大地
コード:
#include <stdio.h>
#include <string.h>
#define MAX_WARD 256
void main(void)
{
//===変数宣言===
char aDataIn[MAX_WARD]; //反転前文字列入力先
char aDataOut[MAX_WARD]; //反転後文字列格納先
char *pDataIn, *pDataOut; //反転前・後配列操作用ポインタ
int nStrlength; //入力文字数
int nLoopCntWord; //反転処理ループ用
printf("何か文字を入力してください(255文字以内)>");
scanf("%s", &aDataIn);
nStrlength = (int)strlen(aDataIn);
printf("\マークn文字数は「%d」文字です。\n", nStrlength);
//===文字列の反転処理===
pDataIn = ■■■■■■; //aDataIn の最終文字位置
pDataOut = ■■■■■■; //aDataOutの先頭
for( nLoopCntWord = 0; nLoopCntWord < ■■■■; nLoopCntWord ++)
{
■■■■■■ = *pDataIn;
pDataIn --;
pDataOut ++;
}
■■■■■■ = '\0';
printf("*** 反転処理完了 ***\n");
printf("入力した文字列:%s\n", aDataIn);
printf("反転した文字列:%s\n", aDataOut);
rewind(stdin);
getchar();
}
pDataIn = ■■■■■■; //aDataIn の最終文字位置
pDataOut = ■■■■■■; //aDataOutの先頭
上はなにをする文なんですか?
Re: 文字反転処理
Posted: 2011年10月30日(日) 12:48
by みけCAT
コード:
pDataIn = ■■■■■■; //aDataIn の最終文字位置
pDataInに■■■■■■を代入する文です。
コード:
pDataOut = ■■■■■■; //aDataOutの先頭
pDataOutに■■■■■■を代入する文です。
Re: 文字反転処理
Posted: 2011年10月30日(日) 13:47
by 困り果てた大地
コード:
pDataIn = aDataIn;
pDataOut = aDataIn;
違いますよね・・・
Re: 文字反転処理
Posted: 2011年10月30日(日) 17:08
by みけCAT
コメント通りのことを書けばいいです。
コード:
pDataIn = aDataIn の最終文字位置のポインタ; //aDataIn の最終文字位置
pDataOut = aDataOutの先頭のポインタ; //aDataOutの先頭
もちろんこのままではコンパイルは通りませんよ。念のため。
Re: 文字反転処理
Posted: 2011年10月30日(日) 18:42
by 困り果てた大地
コード:
pDataIn = (char*)aDataIn[nStrlength];
pDataOut = (char*)aDataOut[nStrlength-nStrlength];
こうですか?わかりません
Re: 文字反転処理
Posted: 2011年10月30日(日) 22:06
by box
具体例で考えてみるとよいのではないでしょうか。例えば、
abcde
という5文字を入力したとき、
edcba
という結果を得るための手順を、コンピューターになったつもりで考えてみてはどうでしょうか。
Re: 文字反転処理
Posted: 2011年10月31日(月) 19:51
by 困り果てた大地
<code = c>
pDataIn = ■■■■■■; //aDataIn の最終文字位置
</code>
ここだけ教えてもらえませんか・・・
Re: 文字反転処理
Posted: 2011年10月31日(月) 19:52
by 困り果てた大地
<code = C>
pDataIn = ■■■■■■; //aDataIn の最終文字位置
</code>
ここだけ教えてもらえませんか・・・
Re: 文字反転処理
Posted: 2011年10月31日(月) 19:54
by 困り果てた大地
2回も間違えましたすみません
コード:
pDataIn = ■■■■■■; //aDataIn の最終文字位置
ここだけ教えてもらえませんか・・・
Re: 文字反転処理
Posted: 2011年10月31日(月) 21:42
by box
先の回答で書きました具体例、
abcde
と入力したとき、配列 aDataIn[] の各要素に何が入るか、ちょっと考えてみてください。
Re: 文字反転処理
Posted: 2011年10月31日(月) 22:45
by 困り果てた大地
コード:
pDataIn = (char*)aDataIn[MAX_WARD]; //aDataIn の最終文字位置
pDataOut = (char*)aDataOut[nStrlength]; //aDataOutの先頭
・・・
Re: 文字反転処理
Posted: 2011年10月31日(月) 23:07
by bitter_fox
困り果てた大地 さんが書きました:コード:
pDataIn = (char*)aDataIn[MAX_WARD]; //aDataIn の最終文字位置
pDataOut = (char*)aDataOut[nStrlength]; //aDataOutの先頭
このコードを日本語化すると
コード:
pDataInにaDataInのMAX_WARD番目の要素をchar*型として無理やり代入
pDataOutにaDataOutのnStrlength番目の要素をchar*型として無理やり代入
となってしまいます。
まず、aDataInの最終文字の位置とaDataOutの先頭の位置を数値もしくは変数で表すと何になりますか?
box さんが書きました:具体例で考えてみるとよいのではないでしょうか。例えば、
abcde
という5文字を入力したとき、
edcba
という結果を得るための手順を、コンピューターになったつもりで考えてみてはどうでしょうか。
box さんが書きました:先の回答で書きました具体例、
abcde
と入力したとき、配列 aDataIn[] の各要素に何が入るか、ちょっと考えてみてください。
それから、これについても考えてみましたか?
考えてわからないのであれば、どういったところが分からないのかを教えてください。
アルゴリズムというのはすべて人の考えに基づいています。
ですので、まずはその考えを理解する必要があります。
その理解なしにアルゴリズム、プログラムは出てこないと考えてください。
もし考えを理解できてアルゴリズムも出てきたとして、そこからプログラムが出てこない場合はプログラミング力不足・基礎力不足です。
この場合はしっかりと基礎について改めましょう。
我々はそれらのお手伝いをいたします。
Re: 文字反転処理
Posted: 2011年11月01日(火) 00:23
by 困り果てた大地
コード:
aDataIn[0] = a;
aDataIn[1] = b;
aDataIn[2] = c;
aDataIn[3] = d;
aDataIn[4] = e;
aDataIn[5] = \0;
abcdeと入力されたら配列の各要素に入る値はこうでしょうか
[code = c]
pDataIn = aDataIn[nStrlenght + 1]; nStrlenghtが文字数なのでそれにヌル文字を足したnStrlenght+\0が最終文字位置だと思いました。
pDataOut = aDataOut[0];
[/code]
aDataOutは初期化していないのにどうやってアドレスを入れるのかがわかりません。
Re: 文字反転処理
Posted: 2011年11月01日(火) 00:39
by bitter_fox
困り果てた大地 さんが書きました:コード:
aDataIn[0] = a;
aDataIn[1] = b;
aDataIn[2] = c;
aDataIn[3] = d;
aDataIn[4] = e;
aDataIn[5] = \0;
abcdeと入力されたら配列の各要素に入る値はこうでしょうか
コード:
pDataIn = aDataIn[nStrlenght + 1]; nStrlenghtが文字数なのでそれにヌル文字を足したnStrlenght+\0が最終文字位置だと思いました。
そうですね。そのようになります。
この時のnStrlengthの値はどうなるでしょう?
また、逆順にaDataOutに入れていくとき、aDataOutの先頭にどの値からどの向きに入れていく必要がありますか?(*1)
元のプログラムに準じた形で考えてみて下さい。
それから、aDataIn[nStrlength + 1]の時にどの要素を指すか、上の具体例("abcde"とその時のnStrlength)で考えてみてください。
ちなみに、ここで言う最終文字位置は\0の一つ前の要素となります。(これは*1の考えに基づきます。)
困り果てた大地 さんが書きました:
コード:
pDataOut = aDataOut[0];
aDataOutは初期化していないのにどうやってアドレスを入れるのかがわかりません。
aDataOutは確かに初期化されていませんが、確保はされていますので問題ありません。
ある変数aとして、その変数が確保されたアドレスを求めるにはどのようにしたらよいでしょう?
また、それを利用するとaDataOut[0]のアドレスも求まります。(糖衣構文的な物もありますが・・・)
Re: 文字反転処理
Posted: 2011年11月01日(火) 00:59
by 困り果てた大地
コード:
aDataIn[0] = a;
aDataIn[1] = b;
aDataIn[2] = c;
aDataIn[3] = d;
aDataIn[4] = e;
aDataIn[5] = \0;
nStrlenghtの値は「5」
aDataIn[nStrlength + 1]だとaDataIn[5]のアドレス
[code = C]
aDataOutに入れるときはaDataInの最終文字から入れていくので
pDataIn = (char*)aDataIn[nStrlength]; //aDataIn の最終文字位置
pDataOut = (char*)aDataOut[nStrlength]; //aDataOutの先頭
[/code]
Re: 文字反転処理
Posted: 2011年11月01日(火) 01:27
by bitter_fox
困り果てた大地 さんが書きました:コード:
aDataIn[0] = a;
aDataIn[1] = b;
aDataIn[2] = c;
aDataIn[3] = d;
aDataIn[4] = e;
aDataIn[5] = \0;
nStrlenghtの値は「5」
aDataIn[nStrlength + 1]だとaDataIn[5]のアドレス
配列とポインタに対しての理解が完全でないように思います。
http://www.geocities.jp/ky_webid/c/023.html
http://www9.plala.or.jp/sgwr-t/c/sec10-2.html
上の場合、aDataIn[0]としたときは'a'となります。
アドレスを求めるには&演算子を用います。
http://masudahp.web.fc2.com/cl/kiso/ck03.html
また、nStrlengthの値が5なのでaDataIn[nStrlength + 1]はaDataIn[5 + 1]となりaDataIn[6]となります。
ですので、aDataIn[nStrlength + 1]は\0の次の要素となります。
困り果てた大地 さんが書きました:
コード:
aDataOutに入れるときはaDataInの最終文字から入れていくので
pDataIn = (char*)aDataIn[nStrlength]; //aDataIn の最終文字位置
pDataOut = (char*)aDataOut[nStrlength]; //aDataOutの先頭
aDataOutの先頭の要素はaDataOut[0]ではなかったですか?
また、aDataInの最終文字を具体的に言うとどのようになりますか?
上の例の時の実際の文字とその時の添え字でお答えください。
Re: 文字反転処理
Posted: 2011年11月01日(火) 01:49
by 困り果てた大地
>>また、aDataInの最終文字を具体的に言うとどのようになりますか?
>>上の例の時の実際の文字とその時の添え字でお答えください。
コード:
aDataInの最終文字はaDataIn[5] = \0
pDataOut = aDataOut[0]//先頭文字 でやるとエラーがでてしまいます。
ちなみにこんな書き方
pDataIn = (char*)aDataIn [nStrlength];//aDataIn の最終文字位置
pDataOut = (char*)aDataOut[0];//aDataOutの先頭
for(nLoopCntWord = 0; nLoopCntWord < nStrlength; nLoopCntWord ++)
{
//■■■■ = *pDataIn;
pDataIn --;
pDataOut ++;
}
*(aDataOut + nStrlength) = '\0';
Re: 文字反転処理
Posted: 2011年11月01日(火) 01:55
by 困り果てた大地
コード:
pDataIn = (char*)aDataIn [nStrlength];//aDataIn の最終文字位置
pDataOut = (char*)&aDataOut[0]; //aDataOutの先頭文字位置
for(nLoopCntWord = 0; nLoopCntWord < nStrlength; nLoopCntWord ++)
{
//■■■■ = *pDataIn;
pDataIn --;
pDataOut ++;
}
*(aDataOut + nStrlength) = '\0';
上記でやったらエラーなくできました
Re: 文字反転処理
Posted: 2011年11月01日(火) 02:13
by bitter_fox
困り果てた大地 さんが書きました:>>また、aDataInの最終文字を具体的に言うとどのようになりますか?
>>上の例の時の実際の文字とその時の添え字でお答えください。
コード:
aDataInの最終文字はaDataIn[5] = \0
for(nLoopCntWord = 0; nLoopCntWord < nStrlength; nLoopCntWord ++)
{
//■■■■ = *pDataIn;
pDataIn --;
pDataOut ++;
}
*(aDataOut + nStrlength) = '\0';
ループ終了時のaDataOutは次のようになっている必要があります。
コード:
aDataOut[0] = 'e'
aDataOut[1] = 'd'
aDataOut[2] = 'c'
aDataOut[3] = 'b'
aDataOut[4] = 'a'
もし、最終文字を\0として上記のプログラムに当てはめると次のようになります。
コード:
aDataOut[0] = '\0'
aDataOut[1] = 'e'
aDataOut[2] = 'd'
aDataOut[3] = 'c'
aDataOut[4] = 'b'
aDataOut[5] = 'a'
困り果てた大地 さんが書きました:
コード:
pDataOut = aDataOut[0]//先頭文字 でやるとエラーがでてしまいます。
ちなみにこんな書き方
pDataIn = (char*)aDataIn [nStrlength];//aDataIn の最終文字位置
pDataOut = (char*)aDataOut[0];//aDataOutの先頭
以下を参考にしてください
[hr][追記]
box さんが書きました:
具体例で考えてみるとよいのではないでしょうか。例えば、
abcde
という5文字を入力したとき、
edcba
という結果を得るための手順を、コンピューターになったつもりで考えてみてはどうでしょうか。
やはりアルゴリズムの部分についてはこれに尽きます。
手順を考えてみてください。
abcdeを紙に書いて、それを各文字で切り、それを先頭からedcbaの順番になるように並び替えてみてください。
最初に選択する文字はどれでしょう?
Re: 文字反転処理
Posted: 2011年11月01日(火) 02:25
by 困り果てた大地
コード:
for(nLoopCntWord = 0; nLoopCntWord < nStrlength; nLoopCntWord ++)
{
//■■■■ = *pDataIn;
pDataIn --;
pDataOut ++;
}
//■■■■ = *pDataIn;
上の行はなにをする分ですか?
Re: 文字反転処理
Posted: 2011年11月01日(火) 02:46
by 困り果てた大地
コード:
pDataIn = (char*)aDataIn [nStrlength];
pDataOut = (char*)&aDataOut[0];
for(nLoopCntWord = 0; nLoopCntWord < nStrlength; nLoopCntWord ++)
{
■■■■■= *pDataIn;
pDataIn --;
pDataOut ++;
}
aDataOut[nStrlength] = '\0';
宿題の提出日が今日までなんです・・・
答えを教えてくださいお願いします
Re: 文字反転処理
Posted: 2011年11月01日(火) 04:31
by hss12
pDataInのアドレスをin、pDataOutのアドレスをoutで表示しています。 *のほうはそのアドレスに入っている文字です。
コード:
+-----------------------+
| | | | |in | | // pDataIn
+-----------------------+
| a | b | c | d | e | \0| // *pDataIn
+-----------------------+
+-----------------------+
|out| | | | | | // pDataOut
+-----------------------+
| | | | | | | // *pDataOut
+-----------------------+
この状態で ■■■■■= *pDataIn; を行うと
コード:
+-----------------------+
| | | | |in | | // pDataIn
+-----------------------+
| a | b | c | d | e | \0| // *pDataIn
+-----------------------+
+-----------------------+
|out| | | | | | // pDataOut
+-----------------------+
| e | | | | | | // *pDataOut
+-----------------------+
こうなります。
pDataIn --; pDataOut ++; により
コード:
+-----------------------+
| | | |in | | | // pDataIn
+-----------------------+
| a | b | c | d | e | \0| // *pDataIn
+-----------------------+
+-----------------------+
| |out| | | | | // pDataOut
+-----------------------+
| e | | | | | | // *pDataOut
+-----------------------+
こうなり、また ■■■■■= *pDataIn; を行うと
コード:
+-----------------------+
| | | |in | | | // pDataIn
+-----------------------+
| a | b | c | d | e | \0| // *pDataIn
+-----------------------+
+-----------------------+
| |out| | | | | // pDataOut
+-----------------------+
| e | d | | | | | // *pDataOut
+-----------------------+
こうなります。
答えはみけCATさんが最初に書かれていると思われますが。
ちなみに pDataIn は nStrlength-1 としないといけません。
pDataIn = &aDataIn[nStrlength]; としてしまうと
コード:
+-----------------------+
| | | | | |in | // pDataIn
+-----------------------+
| a | b | c | d | e | \0| // *pDataIn
+-----------------------+
+-----------------------+
|out| | | | | | // pDataOut
+-----------------------+
| | | | | | | // *pDataOut
+-----------------------+
こうなってしまい *pDataOut の最初の文字が '\0' になってしまい何も表示されません。
Re: 文字反転処理
Posted: 2011年11月01日(火) 17:56
by 困り果てた大地
コード:
#include <stdio.h>
#include <string.h>
#define MAX_WARD 256
void main(void)
{
//===変数宣言===
char aDataIn[MAX_WARD];[tab=30]//反転前文字列入力先
char aDataOut[MAX_WARD]; [tab=30]//反転後文字列格納先
char *pDataIn;[tab=30]//反転前配列操作用ポインタ
char *pDataOut;[tab=30]//反転後配列操作用ポインタ
int nStrlength;[tab=30]//入力文字数
int nLoopCntWord;[tab=30]//反転処理ループ用
printf("何か文字を入力してください(255文字以内)");
scanf("%s", &aDataIn);
nStrlength = (int)strlen(aDataIn);
printf("\n文字数は「%d」文字です。\n", nStrlength);
//===文字列の反転処理===
pDataIn = (char*)&aDataIn [nStrlength - 1];[tab=30]//aDataIn の最終文字位置
pDataOut = (char*)&aDataOut[0];[tab=30][tab=30]//aDataOutの先頭文字位置
for(nLoopCntWord = 0; nLoopCntWord < nStrlength; nLoopCntWord ++)
{
pDataOut[0] = *pDataIn;
pDataIn --;
pDataOut ++;
}
aDataOut[nStrlength] = '\0';
printf("*** 反転処理完了 ***\n");
printf("入力した文字列:%s\n", aDataIn);
printf("反転した文字列:%s\n", aDataOut);
}
これでできるようになりました。ありがとうございます。
pDataIn = (char*)&aDataIn [nStrlength - 1];
pDataOut = (char*)&aDataOut[0];
ここが山場でした・・・
Re: 文字反転処理
Posted: 2011年11月01日(火) 17:59
by 困り果てた大地
コード:
#include <stdio.h>
#include <string.h>
#define MAX_WARD 256
void main(void)
{
//===変数宣言===
char aDataIn[MAX_WARD];//反転前文字列入力先
char aDataOut[MAX_WARD];//反転後文字列格納先
char *pDataIn;//反転前配列操作用ポインタ
char *pDataOut;//反転後配列操作用ポインタ
int nStrlength;//入力文字数
int nLoopCntWord;//反転処理ループ用
printf("何か文字を入力してください(255文字以内)>:");
scanf("%s", &aDataIn);
nStrlength = (int)strlen(aDataIn);
printf("\n文字数は「%d」文字です。\n", nStrlength);
//===文字列の反転処理===
pDataIn = (char*)&aDataIn [nStrlength - 1];//aDataIn の最終文字位置
pDataOut = (char*)&aDataOut[0];//aDataOutの先頭文字位置
for(nLoopCntWord = 0; nLoopCntWord < nStrlength; nLoopCntWord ++)
{
pDataOut[0] = *pDataIn;
pDataIn --;
pDataOut ++;
}
aDataOut[nStrlength] = '\0';
printf("*** 反転処理完了 ***\n");
printf("入力した文字列:%s\n", aDataIn);
printf("反転した文字列:%s\n", aDataOut);
}
へんな文字がはいってしまったのでもう一度
Re: 文字反転処理
Posted: 2011年11月02日(水) 02:25
by hss12
配列でもやってることは同じですが、ポインタの課題だと思われるのでポインタで回答したほうが良いかも。
コード:
#include <stdio.h>
#include <string.h>
#define MAX_WARD 256
void main(void)
{
//===変数宣言===
char aDataIn[MAX_WARD]; //反転前文字列入力先
char aDataOut[MAX_WARD]; //反転後文字列格納先
char *pDataIn, *pDataOut; //反転前・後配列操作用ポインタ
int nStrlength; //入力文字数
int nLoopCntWord; //反転処理ループ用
printf("何か文字を入力してください(255文字以内)>");
scanf("%s", &aDataIn);
nStrlength = (int)strlen(aDataIn);
printf("\n文字数は「%d」文字です。\n", nStrlength);
//===文字列の反転処理===
pDataIn = aDataIn + (nStrlength-1); //aDataIn の最終文字位置
pDataOut = aDataOut; //aDataOutの先頭
for( nLoopCntWord = 0; nLoopCntWord < nStrlength; nLoopCntWord ++)
{
*pDataOut = *pDataIn;
pDataIn --;
pDataOut ++;
}
*pDataOut = '\0';
printf("*** 反転処理完了 ***\n");
printf("入力した文字列:%s\n", aDataIn);
printf("反転した文字列:%s\n", aDataOut);
rewind(stdin);
getchar();
}