第35講 10進数をn進数に翻訳する△
第9話 文字列から1文字ずつ取り出す
コード再掲
private: System::Void button1_Click(System::Object^ sender, System::EventArgs^
e) {
int a,n;
a=int::Parse(textBox1->Text);
n=int::Parse(textBox2->Text);
a=520;
n=2;
textBox3->Text=f(a,n);
String^ b;
int m;
b=textBox4->Text;
m=int::Parse(textBox5->Text);
textBox6->Text=g(b,m);
}
String^ f(int a,int n){
・
・
}
String^ g(String^ b,int m){
int i,k,w=0;
char s[25];
for(i=0;i<25;i++){
if(b[i]=='e'){
k=i;
break;
}
s[i]=b[i]-48;
}
for(i=0;i<k;i++){
w+=s[i]*((int)pow((double)m,(double)(k-i-1)));
}
return(w.ToString());
}
ポイントは、入力された文字列をからどのようにして1文字ずつ取り出すかです。
例えば、3254とtextBox5->Textに入力されている文字から、1文字ずつ3→2→5→4のよう取り出せればよいのです。
取り出しに成功したら、これが7進数であれば、
3×7の3乗+2×7の2乗+5×7+4とすればよいのです。
String^ b;のbのi文字目はb[i-1]で与えられます。
ですから
1文字目:b[0]
2文字目:b[1]
3文字目:b[2]
4文字目:b[3]
・
・
・
となっているわけです。ですから、for文で1文字ずつ取り出すことができます。
そして、本当は
3254?
の?のところに文字列の終了の印(例えば'\0')が決められているはずなのです。
しかし、前話で書いたとおりそれがわかりませんでした。
そこで、bのサイズを取得すればよいと考え、
k=sizeof(b)/sizeof(String^);
も考えましたが、
sizeof(b)はtextBox5->Textに何文字入れても4なのです。
sizeof(String^)も4ですから、k=sizeof(b)/sizeof(String^);は常に1になってしまって意味がありません。
私にもよくわかりませんが、String^型は固定文字列型で、サイズは4に固定さていて、
見かけだけ変更することによって123456789のようなものも表示できるようになっているようです。
ですから、
b=L"123456789";
と入力してもbのサイズは9にならず、4のままなのです。
サイズの取得方法か、文字列の最後がなんと定められているのかがわかれば、
妥協の産物eはいらなくなるのですが。
VC++講義第1部へ
vb講義へ
VB講義基礎へ
初心者のための世界で一番わかりやすいVisual C++入門基礎講座
初心者のための世界で一番わかりやすいVisual
Basic入門基礎講座
初心者のための世界で一番わかりやすいVBA入門講義(基礎から応用まで)