全くわかりません

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
airblaster

全くわかりません

#1

投稿記事 by airblaster » 12年前

初めまして、airblasterと申します。
大学の課題なのですが
「文字列にstr[ ]に整数表記(負の場合もある)が入っているとする
。それを整数に変換して返す関数 int atoi(char str[ ])を表記せよ。」なんですがまったくわかりません。
だれか教えていただけないでしょうか、よろしくお願いしますm(__)m

管理人

Re:全くわかりません

#2

投稿記事 by 管理人 » 12年前

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関数のアルゴリズム、お分かりになったでしょうか?

わからなかったらまた聞いてください。

airblaster

Re:全くわかりません

#3

投稿記事 by airblaster » 12年前

管理人様、丁寧な回答ありがとうございますm(__)m
管理人様が指摘したことに返す言葉もありません。
確かに自分の質問の仕方では、そのように捉えられるし、回答してくださる人の立場に立った場合、回答したいとは思わないと思います。
自分的にも、あまりにも軽い気持ちで書き込んでしまったと思い、反省しています。
そんな質問にも関わらず、丁寧に回答してくれた管理人様には感謝しています。
また質問させてもらうと思いますが、そのときは今回のようにはならないようにしたいと思います。
回答ですが、非常に良くわかりました!本当にありがとうございます。最初、整数表記を整数に変換するという意味がよくわかりませんでした。これは言い換えれば整数で書かれた文字コードを整数型になおして表示するということだったのですね。
馬鹿で面倒かけましたm(__)m本当にありがとうございます!

管理人

Re:全くわかりません

#4

投稿記事 by 管理人 » 12年前

airblasterさん、お解かりいただけたようでよかったです。

プログラムの説明っていうのは聞いただけじゃよくわかりません。
私が先ほどaやbの文字コードの説明をしましたが、それをうけて、自分でdやCの文字コードを表示させてみることでもっとよくわかります。
自分で類題を作ってみて、ちょっと違ったプログラムを自分の判る範囲で、作ってみるのも大事です。
例えば「5~8のみint型に変換するにはどうしたらいいか?」など、疑問がわけば、自分でそれが実現できるプログラムを作ってみましょう。
疑問があれば、残したままでは駄目です。
宿題だけやっていたのでは最低限の知識どころか、復習しなければしばらくすれば0に近い状態に戻ってしまうでしょう。

出てきた疑問はとどめておかず、調べたり質問したりして解決してくださいね☆

閉鎖

“C言語何でも質問掲示板” へ戻る