airblasterさん、
初めてのお話でこのような事を聞くのは、少々抵抗があるとは思いますが聞いてください。
このことはどこに言ってもいえる事ですが
質問する時に「全く判りません」とだけ書くのは良くないです。
「
この辺りまで勉強しています。
授業でこの辺までやりました。
自分ではこの辺まで理解しています。
自分ではこの辺まで調べました。
」
など、という表記が大事です。
これではとりあえず宿題を誰かに解かせたいだけに聞こえてしまいます。
こういう投稿はどこのサイトで質問しても、親身になってくれる回答には出会えないことが多いです。
質問の仕方一つで、どういう回答に出会えるか、密接に関係しています。
一生懸命さが伝わる質問なら回答する側も一生懸命になってくれます。
これは私が実際に体験したことでもあり、あらゆるサイトで見かけることなので、今後airblasterさんが損をしないように、言いました。
気を悪くされたらごめんなさいね。
では、質問の回答ですが、
atoi関数というのは、文字型で取り込んだデータを整数型で返す関数です。
atoiを表記せよということですが、それは、atoiのアルゴリズムを示せということでしょうか?
実際の関数の処理の中身を書けばいいんでしょうか?
まず、それには文字コードの理解が必要です。
全ての文字は文字コードで管理されています。
データは0と1で管理されますから、「文字」というデータがあってはこまります。
ですから数字で管理されているのです。
つまり、「a」という文字は文字コード79で管理されています。
つまり79というデータを「文字型で表示」すると「a」が表示されます。(環境によって変化しますが)
これを実際に実行してみてください。
#include <strio.h>
void main(){
printf("%c",79);
}
79という文字コードデータを文字型表示である%cで表示するとaになります。
実際に実行して確かめてください。
これを80にするとbに、81にするとcになります。
文字コードはこのように順番に並んでるんですね。
では「0」という文字データは数字の何で管理されているでしょうか?
#include <stdio.h>
void main(){
char str[/url]="0";
printf("%cの文字コードは%d",str[0],str[0]);
}
こちらを実行してみてください。文字コードは48であることがわかります。
#include <stdio.h>
void main(){
printf("%cの文字コードは%d",'0','0');
}
こちらでも同じ意味になります。
数字をシングルコーテーションでかこむと、文字コードをあらわせます。
1の文字コードは49、2の文字コードは50で管理されています。
このように0~9まで順番の文字コードになっています。
つまり、文字型データの文字コードが「48~57」だったら文字「0~9」だということが判ります。
それをふまえてこちらを見てください。
#include <stdio.h>
int a2i(char str[/url]){
return str[0]-'0';
}
void main(){
int n;
char str[/url]="1";
n=a2i(str);
printf("%d",n);
}
str[0]から'0'をひくというのはどういう意味なんでしょか?
str[0]は文字「1」であり、文字コード49でしたね。'0'は文字コード48でしたね。
つまり数字の文字コードから'0'を引けば、int型の数字に変換することが出来ます。
例えば、str[0]が文字「3」であるとき、文字コード51です。'0'は文字コード48ですからひけば「3」ですね。
つまり、'0'を引くことで、文字型データを整数型データに変換することが出来るんです。
それが先ほどのプログラムです。
では、2桁の文字データを整数に変換するには?
#include <stdio.h>
int a2i(char str[/url]){
int n;
n=str[0]-'0';
n=10*n + (str[1]-'0');
return n;
}
void main(){
int n;
char str[/url]="12";
n=a2i(str);
printf("%d",n);
}
str[0]に1が、
str[1]に2が入っていますね。
まず、10の位である1を整数型に変換してnに代入します。
この時点では一桁ですから、これを10の位にするために10倍します。さらに1の位であるstr[1]を整数型にしてたしてやることで、2桁の数字が表示できます。
#include <stdio.h>
int a2i(char str[/url]){
int i,n=0;
for (i = 0; (str >= '0') && (str <= '9') ; i++)
n = 10 * n + (str-'0');
return n;
}
void main(){
char str[/url]="14256";
printf("%d", a2i(str));
}
これが全ての桁数で対応できるようにしたプログラムです。
for文の条件が複雑に見えますが、簡単ですから落ち着いてみてください。
for (i = 0; (str >= '0') && (str <= '9') ; i++)
これは、「iが0から始まって文字データが0から9までの間繰り返す。」というものです。
つまり文字データが数字ではなかったり、数字のデータが終わったりすると終了するループ文です。
このループが終わるまで、先ほど言った容量で、位上げをしながら計算をしています。
このa2i関数がatoi関数の中身です。
toというのはtwoと発音が似ていることからa2iと書いて表現することが多いです。
atoi関数のアルゴリズム、お分かりになったでしょうか?
わからなかったらまた聞いてください。