• Tidak ada hasil yang ditemukan

文字・文字列の扱い 続き - Sophia

N/A
N/A
Protected

Academic year: 2024

Membagikan "文字・文字列の扱い 続き - Sophia"

Copied!
4
0
0

Teks penuh

(1)

16 文字・文字列の扱い ( 続き )

課題 12. 数字列を数値(int型)に変換する関数 myatoi() を作成し、動作例のプログラムを書いて動作を 確認せよ。(符号対応・十六進版など拡張版も出来れば作ってみよ。)

解答例 12.1. 正しくない入力についてのチェックはしていない。 loop の終了判定については、前回のプリ

ントの注を参照のこと。

どうせ int 型が桁溢れするので、最大文 字数は 10 に押さえた。十進法の底と区 別する為に define 文を用いた。十六進 版などへの拡張の際に便利?

「(一 桁 の) 数 字 → 数 値 」の 部 分 は 関 数

ctoi() などとして独立させた方が、後の

拡張に便利?

loop 内 で コ メ ン ト ア ウ ト さ れ て い る

printf() を活かすと、途中経過を確認

できる。

/* myatoi.c 2010-07-05 */

#include <stdio.h>

#define MAXLEN 10

#define BASE 10 int myatoi(char *);

int main(int argc, char** argv) {

char str[MAXLEN];

printf("decimal number? ");

fgets(str, MAXLEN, stdin);

printf("string: %s.\n",str);

printf("value : %d.\n",myatoi(str));

}

int myatoi(char *s) {

int i=0, d=0;

while( s[i] != ’\0’ && s[i] != ’\n’ ) {

d *= BASE;

d += s[i] - ’0’;

/*

printf("%d: %d\n",i,d);

*/

i++;

}

return d;

}

考察 16.0.2. 予め桁数が判っていなくても、この計算法で正しく計算できることを確かめよ。 この計算法は多項式の値の効率的な計算

にも用いられるので、しっかり理解して 頭に留めておこう。

—2010年度春期 情報処理III (担当: 角皆) 74—

(2)

17 main 関数の引数と返値

システムで用意されている関数や自分で作成した関数と同様、main() も一つの関数であり、やはり引数を 取ったり、値を返したりする。実際、main() のプロトタイプは、int main(int, char**) と定められてお

り、今迄もそう書いてきた。では、その引数はどこから取るのか? そして値をどこに返すのか? 変数名は慣習で argc, argv を用いる。

C言語では main() という名前の関数は特別で、C言語で記述されたプログラムは関数 main() の先頭から

実行を開始するという決まりになっているので、「関数main() を呼出す」ということは、すなわち「プログラ ムの実行を開始する」ということに他ならない。従って、関数 main() を呼出しているのは、実行を指示する

シェル(shell)ということになる。つまり、ここから引数を取り、ここに値を返すのである。 より正確には、シェルを介してOS(オペ

レーションシステム) に指示を出し、そ れに従ってOSが関数main() を呼出す、

というべきか。

17–1 main 関数の引数

シェルから実行が指示されると、関数 main() は、「コマンドラインに入力された引数の数」int argc と、

「その文字列の配列へのポインタ」char **argv との2つを引数として取る。 argc もargvも変数なので、実行中に値 を変更しても構わない。

コマンドライン引数の数が変数 argc の初期値となる。この時、コマンドそのものも数えるので、初期 値は必ず 1 以上の値を取る。

それぞれの引数は全て文字列として char 型の配列に格納され、その各配列へのポインタ(配列の先頭

アドレス)を並べて格納する配列(要素数 argc 個)が用意され、その配列へのポインタが変数 argv の argv[i] は配列名ではなく、歴としたポ インタ型変数 (char * 型) なので、実行 中に値を変更出来る/しても構わない。

初期値となる。

各引数の各文字は argv[i][j] の形でア クセスできる。これも単なる char 型の 変数なので、実行中に値を変更しても構 わない。

これにより、コマンド名は argv[0]、 その次の引数は argv[1]、…‥…、最後の引数は argv[argc-1] とい うように、文字列として扱うことが出来る。

—2010年度春期 情報処理III (担当: 角皆) 75—

(3)

17–2 main 関数の返値

実行が終わると、関数main() を呼出したシェルに値(int 型)を返す。今迄の例では省略してきたが、返値 これも正確には、OSに値を返し、それを 受け取ったシェルが解釈する、と言うべ きか。

があるのであるから、main() の終了時には return 文で値を返すのが正式である。返す値は、正常終了であ れば 0、異常終了の際にはそれ以外(異常の種類によって異なる値を返すことも出来る) とするのが一般的で、

それによって実行が正しく終了したかどうかを判断して、後に引き続くプログラムの実行を制御することが出

来る。 普通にプログラムの最後まで実行して終

了する場合は正常終了だろうから、

return 0;

が普通だろう。この 0 も意味が解り難い ので、stdlib.h には次のマクロが用意 されている。

#define EXIT FAILURE 1

#define EXIT SUCCESS 0

実習 17.1. コマンドラインから引数を取り、引数の内容をそのまま文字列として表示。

/* arg.c 2010-07-12 */

#include <stdio.h>

int main( int argc, char **argv ) {

int i;

printf("argc: %p (%d)\n", &argc, argc);

printf("argv: %p (%p)\n", &argv, argv);

for( i=0; i<argc; i++ ) {

printf("argv[%d]: %p (%s)\n", i, argv[i], argv[i]);

}

return 0;

}

実習 17.2. 返値の部分にマクロ EXIT SUCCESS を用いて書き換えよ。

実習 17.3. 引数がない場合には、その旨を表示した上で異常終了EXIT FAILURE を返すように書き換えよ。

プログラムの途中でいきなり return 文 を書いて返ってしまって構わない。

—2010年度春期 情報処理III (担当: 角皆) 76—

(4)

プログラムの途中で強制的に終了(異常終了)させて、その状態(ステータス) を値として返すには、関数

exit() を用いる。例えば、プログラムを強制終了させ、そのステータスとして 1 を返したい場合は、

exit(1);

とする。他の関数から呼び出された関数内で関数 exit() を実行した場合にも、一挙にプログラムを終了させ 関数の呼出側に値を返して実行を移す

return 文とは、この点で動作が異なる。

てシェルに値を返す。

シェルへの返値を利用する例を挙げる。これらはシェルの機能である。シェルスクリプト内で良く用いら れる。

. 実行プログラム ./prog1 が正常終了(返値が 0)な時に限り、./prog2 を実行する。

¨ ¥

§=> ./prog1 && ./prog2 ¦

. 実行プログラム ./prog1 が異常終了(返値が 0 以外)な時に限り、./prog2 を実行する。

¨ ¥

§=> ./prog1 || ./prog2 ¦

課題 13 (〆切 7/18()). 前回の課題の myatoi() を用いて、コマンドラインから入力した2つ以上の整 数の和を求めて表示するプログラム calc を作成せよ。

¨ ¥

§ ¦

=> ./calc 123 45 67 8 243

=>

(符号対応・十六進版・不正な入力への対応など拡張版も出来れば作ってみよ。)

—2010年度春期 情報処理III (担当: 角皆) 77—

Referensi

Dokumen terkait

1 社会学部学生のための 卒業論文執筆の手引き この「手引き」は、社会学部の皆さんが学生として最もその本領を 発揮すべき「卒業論文」の作成を援助するためのものです。したがっ て、卒業論文を執筆しようとする 人は、この「手引き」をはじめによ く読んでください。 ただし、ここに示してあるのは、あくまでも論文の標準的な書き方

1 社会学部学生のための 卒業論文執筆の手引き この「手引き」は、社会学部の皆さんが学生として最もその本領を 発揮すべき「卒業論文」の作成を援助するためのものです。したがっ て、卒業論文を執筆しようとする人は、この「手引き」をはじめによ く読んでください。 ただし、ここに示してあるのは、あくまでも論文の標準的な書き方

パスワードによる本人認証 • 暗号化関数でパスワードを変換して保管 • 入力したパスワードを暗号化関数で変換して、 保管してある文字列と照合 暗号化関数に要請される性質は? • 間違った文字列では変換結果が一致しない −→ 異なる入力には異なる値を返す(単射) • 保管してある文字列が露見しても 元のパスワードが判明しない −→ 一方向性関数

6 以上の表、グラフをみると、2011 年の内容重量の数値は 28116 トンであるが、2012 年は 35987 トンとなっており、約 28%増加している。これは東日本大震災によって、流通網が混 乱し、コンビニやスーパーマーケットが品薄になり、食糧確保が困難になったことから、保 存食として使いやすい、缶詰に注目が集まった結果だと考えられる。それ以降は 2000

第三饉郵便物認可KSKQ(サロン・あべの)増刊通巻486号1g93年 7月17日 絵の形に合わせて切り取り︑そ こに絵の名前などを点字で打っ て︑ベースとなる絵本に︑はり 合わせたのである︒もちろん文 章も透明シートに点字を打って はりつけたのである︒この方法 なら︑見た目に違和感がなく︑ 指でさわっても︑絵の形がわか るのである︒ ふれあい文庫

}Z008ll;61121 あぺの>迩巻59J I<サロン :靴郵便物認 《Q第 K& 両立できると考えていました。 なので子育ての経験も生かせて 言われましたが、恵まれた職場 目を育てるのは難しいのではと からはそれぞれが働く中で3人 してもほしいと思いました。夫 出産時は家族の全員が立会い、 赤ちゃんを出迎えてくれました。 産休の間はどっぷり育児につか

社会の 防御 • ステレオタイプのパターンは公平無私のもので はない。[中略]われわれの自尊心を保障する ものであり、自分自身の価値、地位、権利につ いてわれわれがどう感じているかを現実の世界 に投射したものである。 • したがってステレオタイプには、ステレオタイ プに付属する様々の感情がいっぱいにこめられ ている。それはわれわれの伝統を守る砦であり

定義 開区間I⊂R上で定義された関数f: I→Rがa∈Iにおいて連続であるとは, x→alimfx =fa であることをいう.f がIの各点で連続であるとき,単にf は(I上で)連続であるという. 多変数ベクトル値関数f についても,lim x→afx =bであることの定義,および連続性の定義は同様.