計数工学プログラミング演習 ( 第 1 回 ) 2016/04/05 DEPARTMENT OF MATHEMATICAL INFORMATICS 1
担当メンバー : 担当 : 担当教員 : 定兼 ( 数理 2 研 ) 補佐 : 松島 ( 数理 6 研 ) 学生アシスタント : 鈴木, 石山, 中村 担当へのコンタクト e メールアドレス ( 演習についての一般的な相談 ): miprogramming2016+general@gmail.com 資料 https://researchmap.jp/sada/ の資料公開 2
PC の扱いについての注意 : PCはリース品です 扱いには十分に注意 原状復帰可能な形で返却 ステッカー等を貼らない ( 情報理工マークを隠さない ) キレイに 使う 最悪 実費負担の可能性もあります 原則 構内での使用 セキュリティ / コンプライアンスに十分な注意を P2P( 危険度にかかわらず ) 全面禁止 情報理工ネットワーク 貸与 PCの両方において ソフトウェアライセンスのないものは絶対に使わない 無線 LANのキーは部外者に教えない 3
評価 : 評価基準 提出課題 出席 ( 指示のないかぎり 14:55-17:35 の間は在室する ) 出席態度 4
演習の形式 : 前半にその回の基礎的な内容を説明 後半は実際に貸与 PCを用いてプログラミング 使用言語はC 個人のPCを用いても構わない 課題の提出 5
さわってみよう : 電源を入れる Ubuntuを選択 ( 一番上の選択肢 ) ログイン ネットワークへの接続 ソフトウェアの更新 6
ソフトウェア : テキストエディタ Dashホームにあるものを使う ( 他のものでも可 ) コンパイラ gcc ( インストール済 ) デバッガ gdb( インストール済 ) valgrind (Ubuntuソフトウェアセンターからインストール) valkyrie (valgrind の詳細情報から ) 7
端末の起動 : デスクトップの 端末 を起動 ホームディレクトリ : /home/mistpc/ 画面左上の ホームフォルダ でもアクセス可能 8
ファイルの作成 : ディレクトリ ( フォルダ ) を作る mkdir 1 ( 今回の作業フォルダをつくる ) cd 1 ( 1 ディレクトリに移動) テキストエディタで新規作成して test.c という名前で保存 保存場所はホームの 1 というディレクトリ 9
プログラムの入力 : test.c を入力 コメント /* test.c */ #include<stdio.h> int main() { printf("hello. n I am 名前. n ) ; return 0; 正常終了時には 0 を返す 画面に文字列を表示 入力後 保存 (Ctrl+S) 本体 入出力関連ヘッダの読み込み 行の終わり 改行 はバックスラッシュ ( キーボードの右下 ). では駄目 10
コンパイルと実行 : プログラムをコンピュータの実行形式に変換 ( コンパイル ) gcc test.c ls ( 現在のフォルダの中身を見る ) すると 実行ファイル a.out ができているはず./a.out で実行. は現在のフォルダを表す./a.out > out.txt も試してみる 標準出力の出力先をファイルにする 11
printf の書式 : test2.c を入力 /* test2.c */ #include<stdio.h> int main() { printf( I was born in %d. n, 年 ) ; return 0; 整数の書式 整数 生成される実行ファイルの名前は変えられる gcc o test2.out test2.c 12
変数を使用する : test3.c を入力 /* test3.c */ #include<stdio.h> 整数型変数の宣言 int main() { int year = 年 ; 変数名 printf( I was born in %d. n,year ) ; return 0; 13
ループ /* test4.c */ #include<stdio.h> n x = i i=1 の計算 int main() { int i, n, x; 初期設定 繰り返す条件 n = 10; x = 0; // 総和を保存する変数 for (i=1; i<=n; i++) { x = x + i; printf( x = %d n,x); return 0; i を 1 増やす 14
データの入力 scanf( データの書式, 変数のポインタ, ); 書式は文字列で指定 整数は %d, 実数は %lf int x; double y; scanf( %d %lf, &x, &y); 関数の帰り値は値が代入された変数の個数 ファイルの最後に到達した場合 EOF を返す if ( scanf( ) == EOF ){. scanf の書式は非常に難しいがこの演習では深入りしない 15
n をキーボードから与える /* test4.c */ #include<stdio.h> int main() { int i, n, x; n x = i i=1 の計算 scanf( %d, &n); x = 0; // 総和を保存する変数 for (i=1; i<=n; i++) { x = x + i; printf( x = %d n,x); return 0; 16
標準入力, 出力 Linux, Windows 等のオペレーティングシステムでは, 入力はキーボード, 出力は画面に出すのが標準で, それらを標準入力, 標準出力と呼ぶ 標準入力 / 出力の入出力先を変えることをリダイレクトと呼ぶ./a.out < file1 > file2 キーボードの入力の代わりに file1 の中身が使われる 画面に出力せずにファイル file2 に書かれる ( 上書き ) ファイルの最後に追加する場合は >> file2 とする あるプログラムの標準出力を別のプログラムの標準入力にできる ( パイプ )./a1.out./a2.out a1.out の出力が a2.out の入力になる 17
関数 関数の値域の定義 #include<stdio.h> int sum(int n) { int i, x; x = 0; for (i=1; i<=n; i++) { x = x + i; return x; int main() { int n, x; scanf( %d, &n); x = sum(n); printf( x = %d n,x); return 0; 関数の名前の定義 関数の引数の名前と型の定義 これも関数 関数の呼び出し n x = i i=1 の計算 18
プログラムの書き方の作法 プログラムは基本的に入れ子 (nested) 構造をしている 入れ子のレベルに従って字下げ ( インデント ) をする #include<stdio.h> インデント int main() { int i, j, x; x = 0; for (i=0; i<100000; i++) { for (j=0; j<100000; j++) { x += j; j のループの中 i のループの中 j のループの終わり 19 main 関数の終わり i のループの終わり
コンパイルの最適化 -O オプションをつける gcc O3 test.c 数字は最適化レベル. 大きいほど実行速度が速くなる. -O0 ( ゼロ ) は最適化無し プログラムの実行時間を測定するときは必ず最適化したものを使う O3 をつける 20
プログラミングの練習のできるサイト Aizu Online Judge(AOJ) http://judge.u-aizu.ac.jp/onlinejudge/index.jsp まずアカウントを作成する 問題セットのところに各種演習問題がある プログラムを入力すると正常に動作するかテストしてくれる 参考 競技プログラミング入門 http://ilfa.info/compro/intro/ 21
課題提出用サイト http://133.11.136.29/domjudge/ Login: 学生証番号 ( 数字 8 ケタ ) Password: ログイン後に,problems の p1 (Hello World) を見てみる 注 : 大学内からのみアクセス可能 22
第一回課題 : 1 2 + 2 2 + + n 2 を計算して表示するプログラム n は標準入力から与えられる結果は標準出力に. 答えの数字だけ表示する計算をする部分は関数にする for ループを使って計算する ( 公式は使わない ) n が 1 より小さい場合は答えが 0 になるようにする (n は整数と仮定してよい ) main 関数の最後は return 0; をつけておく 締切 : 2016 年 4 月 6 日 ( 火 ) 17:35 ( 演習終了時 ) 23