Cプログラミング入門 第1回 三輪忍.

Slides:



Advertisements
Similar presentations
2.5 プログラムの構成要素 (1)文字セット ① ASCII ( American Standard Code for Interchange ) JIS コードと同じ ② EBCDIC ( Extended Binary Coded Decimal for Information Code ) 1.
Advertisements

第1回 三輪忍.  ソフトウェア設計技術の基礎の習得  ソフトウェア設計の目的: ◦ 人間が意図した作業を代わりにコンピュータに行わせること  なぜ? ◦ 人間は面倒なことはやりたくない ◦ コンピュータは疲れない  そのための方法論を学ぶ ◦ C 言語を題材に.
オブジェクト指向言語・ オブジェクト指向言語演習 中間試験回答例. Jan. 12, 2005 情報処理技術基礎演習 II 2 オブジェクト指向言語 中間試験解説 1  (1) 円柱の体積(円柱の体積 = 底面の円の面積 x 高さ) を求めるプログラムを作成しなさい。ただし、出力結果は、入 力した底面の円の半径.
Cプログラミング入門.
情報・知能工学系 山本一公 プログラミング演習Ⅱ 第3回 配列(1) 情報・知能工学系 山本一公
プログラミング演習II 2004年11月 30日(第6回) 理学部数学科・木村巌.
7/10 if 文課題 力作が多くて感心! 演習1:キーボードから2つの整数を入力し、小さい方の数字を 表示せよ。
工学部 知能情報工学科 准教授 高 尚策 (コウ ショウサク)
情報・知能工学系 山本一公 プログラミング演習Ⅱ 第4回 配列(2) 情報・知能工学系 山本一公
情報基礎演習B 後半第5回 担当 岩村 TA 谷本君.
数理情報工学演習第一C プログラミング演習 (第3回 ) 2014/04/21
配列(2) 第10回[平成15年6月26日(木)]:PN03-10.ppt 今日の内容 1 素数を求める(教科書の例):復習
システムプログラミング 第5回 情報工学科 篠埜 功 ヒアドキュメント レポート課題 main関数の引数 usageメッセージ
基礎プログラミングおよび演習 第9回
プログラミング演習Ⅱ 第12回 文字列とポインタ(1)
第2回ネットワークプログラミング 中村 修.
情報科学1(G1) 2016年度.
プログラミング演習Ⅰ 課題2 10進数と2進数 2回目.
トキのカタチ2016 電子工作(Arduino)講習
精密工学科プログラミング基礎Ⅱ 第3回資料 今回の授業で習得してほしいこと: 2次元配列の使い方 (前回の1次元配列の復習もします.)
Cプログラミング入門 第1回 三輪忍.
プログラミング基礎a 第8回 プログラムの設計 アルゴリズムとデータ構造
第7回 条件による繰り返し.
岩村雅一 知能情報工学演習I 第8回(後半第2回) 岩村雅一
情報工学科 3年生対象 専門科目 システムプログラミング 第5回、第6回 ヒアドキュメント レポート課題 情報工学科 篠埜 功.
ちょっとした練習問題① 配列iroを['R', 'W', 'R', 'R', 'W' , 'W' , 'W']を宣言して、「W」のときの配列の番号をprintfで表示するようなプログラムを記述しなさい。
プログラミング言語入門 手続き型言語としてのJava
岩村雅一 知能情報工学演習I 第11回(後半第5回) 岩村雅一
プログラミング入門 電卓を作ろう・パートIV!!.
プログラミング言語入門.
プログラミング演習I 2003年5月7日(第4回) 木村巌.
第7回 条件による繰り返し.
第7回 プログラミングⅡ 第7回
復習 前回の関数のまとめ(1) 関数はmain()関数または他の関数から呼び出されて実行される.
アルゴリズムとデータ構造 補足資料5-1 「メモリとポインタ」
第11回 プログラミングⅡ 第11回
プログラミング基礎a 第8回 プログラムの設計 アルゴリズムとデータ構造
岩村雅一 知能情報工学演習I 第11回(後半第5回) 岩村雅一
情報処理Ⅱ 第2回:2003年10月14日(火).
第2回課題 配布した通り.氏名・学生番号を忘れないこと.
岩村雅一 知能情報工学演習I 第12回(C言語第6回) 岩村雅一
疑似乱数, モンテカルロ法によるシミュレーション
C言語 はじめに 2016年 吉田研究室.
C言語ファミリー C# 高級言語(抽象的) Java オブジェクト指向 C++ C 機械語(原始的)
プログラミング演習I 2003年4月30日(第3回) 木村巌.
地域情報学 C言語プログラミング 第2回 変数・配列、型変換、入力 2017年10月20日
オブジェクト指向言語論 第三回 知能情報学部 新田直也.
計算機プログラミングI 木曜日 1時限・5時限 担当: 増原英彦 第1回 2002年10月10日(木)
ガイダンス 電子計算機 電気工学科 山本昌志 1E
アルゴリズムとプログラミング (Algorithms and Programming)
第5回 プログラミングⅡ 第5回
精密工学科プログラミング基礎 第7回資料 (11/27実施)
プログラミング入門2 第5回 配列 for文 変数宣言 初期化
cp-15. 疑似乱数とシミュレーション (C プログラミング演習,Visual Studio 2019 対応)
オブジェクト指向言語論 第二回 知能情報学部 新田直也.
プログラミング入門2 第6回 関数 情報工学科 篠埜 功.
精密工学科プログラミング基礎Ⅱ 第2回資料 今回の授業で習得してほしいこと: 配列の使い方 (今回は1次元,次回は2次元をやります.)
プログラミング演習I 2003年6月11日(第9回) 木村巌.
情報処理Ⅱ 第2回 2004年10月12日(火).
第3回簡単なデータの入出力.
情報処理Ⅱ 2005年11月25日(金).
プログラミング演習II 2004年11月 2日(第3回) 理学部数学科・木村巌.
プログラミング入門2 第5回 配列 変数宣言、初期化について
情報処理Ⅱ 小テスト 2005年2月1日(火).
復習 いろいろな変数型(2) char 1バイト → 英数字1文字を入れるのにぴったり アスキーコード → 付録 int
C言語講座 四則演算  if ,  switch 制御文.
プログラミング演習I 補講用課題
岩村雅一 知能情報工学演習I 第7回(後半第1回) 岩村雅一
第1章 文字の表示と計算 printfと演算子をやります.
オブジェクト指向言語論 第六回 知能情報学部 新田直也.
Presentation transcript:

Cプログラミング入門 第1回 三輪忍

この授業のねらい ソフトウェア設計技術の基礎の習得 ソフトウェア設計の目的: なぜ? そのための方法論を学ぶ 人間が意図した作業を代わりにコンピュータに行わせること なぜ? 人間は面倒なことはやりたくない コンピュータは疲れない そのための方法論を学ぶ C 言語を題材に

授業の進め方(普通の情報科の場合) 目的:ソフトウェア設計スキルの習得 普通は, それぞれ半期ぐらい 講義でプログラミング理論を教える 演習で実装して理解を深める それぞれ半期ぐらい

授業の進め方(うちの場合) 『情報科学』(準必修,1年後期) 空白の1年 この授業 Ruby を用いたプログラミングの講義と演習 C を用いた3回の演習だけ... スタート時点での理解度がばらばら

この演習の進め方 基本は演習 課題の提示後に簡単な講義(1回だけ) これから課題を提示 出席とレポートで評価 プログラミングをまったく理解していない人向け 『情報』『情報科学』を履修していない人 ほとんど忘れてしまった人 進められる人は講義中に課題をやってもよい

スケジュール 第1回(4/7) 第2回(4/14) 第3回(4/21) レポート提出(4/28正午まで) 演習 or 講義(『コンピュータ概論と C 文法の基礎』) 第2回(4/14) 演習 第3回(4/21) レポート提出(4/28正午まで)

レポートに関して 内容 提出方法:E-Mail 実装したプログラムをレポート形式で報告 実装が十分理解できればソース・コードを提出する必要はない 提出方法:E-Mail 宛先:miwa@hal.ipc.i.u-tokyo-ac.jp Subject: 【プログラミング入門レポート】 学籍番号:氏名 PDF で

レポート課題 巡回セールスマン問題の近似解を求めるプログラムを作 成せよ.作成したプログラムを用いて、下記の都市データ の最短経路を求めよ. 都市データのファイル http://www.hal.ipc.i.u-tokyo.ac.jp/~miwa/ja.txt 100 75 125 125 100 75 50 125 50 100

注意事項 データ・ファイルの見方 レポートに書くべきこと 解の精度とアルゴリズムの面白さで評価 1行が1都市に相当 都市1 149 データ・ファイルの見方 1行が1都市に相当 各行の3つの数字の意味(例:”1 288 149”) 都市の番号(”1”) (都市の位置を 2 次元平面上にプロットした場合の) x 座標(”288”) y 座標(“149”) レポートに書くべきこと 実装したアルゴリズムの説明 求めた解(ルート,総移動距離) 解の精度とアルゴリズムの面白さで評価 288

最近近傍法 まだ訪問していない都市の中で最も近いものを選択 スタート 100 75 125 125 100 75 50 125 50 100

コンピュータ概論

コンピュータに対する理解 生活を豊かにする便利なもの どんなシステム??? インターネット端末 ワード・プロセッサ 電子書籍リーダ 携帯電話 etc どんなシステム???

システムとしてのコンピュータ 融通のきかない人 プログラム あらかじめ決められた手続きしかできない 決まった言葉(言語・文法)しか理解できない プログラム コンピュータに行わせる一連の手続き 命令の集合として記述 Ex.) C = A + B

コンピュータの構成 CPU C C C = A + B C = A + B Memory A A B B Memory 命令やデータを格納する領域 CPU(Central Processing Unit) メモリから命令やデータを取得 演算を行う装置 詳しくは『計算システム論第2』で CPU C C C = A + B C = A + B Memory A A B B

プログラミング プログラム 人間が直接書くのはほぼ不可能 コンピュータに行わせる手続き 最終的には機械語(アセンブリ) 昔は書いてた 命令の集合 最終的には機械語(アセンブリ) 「01001110 …」 人間が直接書くのはほぼ不可能 昔は書いてた 『マイコンプログラミング演習』でもやる ちょっと複雑になると無理

高級言語とコンパイラ 高級言語 コンパイラ 高級言語 機械語 コンパイル Ex.) Fortran, C, Java, Ruby, … 翻訳を行うプログラム 高級言語で記述されたものを機械語へと変換 高級言語 機械語 コンパイル

コンパイルの手順 web を参照 http://www.hal.ipc.i.u-tokyo.ac.jp/~miwa/exp-C.html

C言語の文法の基礎

内容 プログラムの基本構造 データと演算 制御の流れ

仕事の例 問題: どうやって? 数日仕事 1,500人目 数分仕事 進振り対象の学生の成績データ(平均点のデータ.3,000人分)が 手元にある.中央値を求めなさい.    Ex.) 75点,95点,63点,70点,82点,・・・ どうやって? 人間が集計 データを昇順に並び替え(ソート) 1,500人目を探す    Ex.) 60点,60点,62点,63点,65点,・・・,77点,・・・ コンピュータに集計させる 数日仕事 1,500人目 数分仕事

ソーティング・アルゴリズム バブル・ソート 1回目 2回目 63点 75点 75点 75点 63点 63点 95点 95点 63点 63点 左端から右端に向かって以下の操作を行う 隣り合うデータの大小を比較 昇順になっていなかったら入れ替え 右端に到達したら左端に戻ってやり直し 計算量:最悪 O (n^2) 1回目 2回目 63点 75点 75点 75点 63点 63点 95点 95点 63点 63点 75点 70点 70点 75点 63点 70点 95点 63点 82点 70点 95点 70点 82点 95点 swap swap swap

C プログラムの構造 ヘッダ 文 関数 ファイル median.c の内容 #include <stdio.h> main ( ) { int i, j, tmp; int data [3000]; for ( i = 0 ; i < 3000 – 1 ; i = i + 1) { for ( j = 0 ; j < 3000 – i + 1 ; j = j + 1) { if ( data [ j ] > data [ j + 1 ] ) { tmp = data [ j ]; data [ j ] = data [ j + 1]; data [ j + 1 ] = tmp; } printf ( “median = %d\n”, data [1500] ); 関数 文 ファイル median.c の内容

関数 処理のまとまり サブルーチンを実現(後述) 普通は繰り返し行われる処理を関数化 複数の文からなる 同じことを何度も書くのは面倒 バグのもと

特殊な関数 main 関数 プログラムの実行開始地点を表す 普通は最初に1回呼ばれるだけ #include <stdio.h> int i, j, tmp; int data [3000]; for ( i = 0 ; i < 3000 – 1 ; i = i + 1) { for ( j = 0 ; j < 3000 – i + 1 ; j = j + 1) { if ( data [ j ] > data [ j + 1 ] ) { tmp = data [ j ]; data [ j ] = data [ j + 1]; data [ j + 1 ] = tmp; } printf ( “median = %d\n”, data [1500] );

文 処理の最小単位 「 ; 」 の次の文字から 「 ; 」 まで 1文/行がマナー(例外アリ) 「A を B に代入する」 「文字を出力する」 「 ; 」 の次の文字から 「 ; 」 まで 1文/行がマナー(例外アリ) #include <stdio.h> main ( ) { int i, j, tmp; int data [3000]; for ( i = 0 ; i < 3000 – 1 ; i = i + 1) { for ( j = 0 ; j < 3000 – i + 1 ; j = j + 1) { if ( data [ j ] > data [ j + 1 ] ) { tmp = data [ j ]; data [ j ] = data [ j + 1]; data [ j + 1 ] = tmp; } printf ( “median = %d\n”, data [1500] );

ヘッダ ヘッダ・ファイルの展開(include) ヘッダ・ファイル 複数のファイルで使用される関数などを宣言 あらかじめ用意されていることもある #include <stdio.h> main ( ) { int i, j, tmp; int data [3000]; for ( i = 0 ; i < 3000 – 1 ; i = i + 1) { for ( j = 0 ; j < 3000 – i + 1 ; j = j + 1) { if ( data [ j ] > data [ j + 1 ] ) { tmp = data [ j ]; data [ j ] = data [ j + 1]; data [ j + 1 ] = tmp; } printf ( “median = %d\n”, data [1500] );

C プログラムの構造 ヘッダ 文 関数 文字列を出力する関数(printf)の宣言があるヘッダ・ファイル(stdio.h)を include プログラムの開始地点 ヘッダ #include <stdio.h> main ( ) { int i, j, tmp; int data [3000]; for ( i = 0 ; i < 3000 – 1 ; i = i + 1) { for ( j = 0 ; j < 3000 – i + 1 ; j = j + 1) { if ( data [ j ] > data [ j + 1 ] ) { tmp = data [ j ]; data [ j ] = data [ j + 1]; data [ j + 1 ] = tmp; } printf ( “median = %d\n”, data [1500] ); 関数 処理の方向 バブル・ソート 文 中央値を出力 プログラムの終了 ファイル median.c の内容

データと演算 プログラムの大部分はデータに対する演算 「隣り合う2つの点数を比較する」 「2つの点数を交換する」 など データ 演算

データの種類とデータ型 データ データ型 75 63 95 定数:変更不可 (e.g. “1500”, “3000”) 変数:値の入れ物.中身を変更可能     (e.g. “i”, “j”, “tmp”) データ型 データを扱う形式 コンパイラが機械語を生成する際のヒント “A + B”    整数の加算 or 浮動小数点の加算? 63 95 tmp

データ型の種類 基本型 修飾子 char:1B の数値.文字の型としても使用 int:整数(通常 4B) float:単精度浮動小数点(通常 4B) double:倍精度浮動小数点(通常 8B) 修飾子 長さ(short, long) 符号(singed, unsigned)

宣言/定義と使用 使い方(変数に限らない) 宣言/定義の位置 宣言(定義は別のファイル) 関数の冒頭で宣言/定義 使用 最初に型を宣言 どこかで定義(宣言を兼ねることも) 後は普通に使用 宣言/定義の位置 グローバル 関数の外で宣言/定義 そのファイル中のどこでも参照可能 ローカル 関数の冒頭で宣言/定義 その関数内でのみ参照可能 宣言(定義は別のファイル) 関数の冒頭で宣言/定義 #include <stdio.h> main ( ) { int i, j, tmp; int data [3000]; for ( i = 0 ; i < 3000 – 1 ; i = i + 1) { for ( j = 0 ; j < 3000 – i + 1 ; j = j + 1) { if ( data [ j ] > data [ j + 1 ] ) { tmp = data [ j ]; data [ j ] = data [ j + 1]; data [ j + 1 ] = tmp; } printf ( “median = %d\n”, data [1500] ); #include <stdio.h> main ( ) { int i, j, tmp; int data [3000]; for ( i = 0 ; i < 3000 – 1 ; i = i + 1) { for ( j = 0 ; j < 3000 – i + 1 ; j = j + 1) { if ( data [ j ] > data [ j + 1 ] ) { tmp = data [ j ]; data [ j ] = data [ j + 1]; data [ j + 1 ] = tmp; } printf ( “median = %d\n”, data [1500] ); 使用

派生型 配列 ポインタ ベクタ,行列 インデクス付けされたデータの集合 Ex.) 3,000人分の平均点データ int data0, data1, …, data2999;      int data [3000]; “data [ i ]” で i 番目の要素にアクセス ポインタ データのアドレスを格納する変数

演算 基本的には同じ型のデータ同士 種類 算術演算(+, -, *, /, %) 論理演算(&, |, ^, <<, >>, ~) 関係演算(<, >, >=, <=, ==) 結果は真(1) or 偽(0) 代入演算(=) “A = B” は「A に B を代入する」

C プログラムの構造 j 番目のデータが j+1 番目のデータよりも大きいか比較 j 番目のデータを tmp に退避 データ交換 #include <stdio.h> main ( ) { int i, j, tmp; int data [3000]; for ( i = 0 ; i < 3000 – 1 ; i = i + 1) { for ( j = 0 ; j < 3000 – i + 1 ; j = j + 1) { if ( data [ j ] > data [ j + 1 ] ) { tmp = data [ j ]; data [ j ] = data [ j + 1]; data [ j + 1 ] = tmp; } printf ( “median = %d\n”, data [1500] ); #include <stdio.h> main ( ) { int i, j, tmp; int data [3000]; for ( i = 0 ; i < 3000 – 1 ; i = i + 1) { for ( j = 0 ; j < 3000 – i + 1 ; j = j + 1) { if ( data [ j ] > data [ j + 1 ] ) { tmp = data [ j ]; data [ j ] = data [ j + 1]; data [ j + 1 ] = tmp; } printf ( “median = %d\n”, data [1500] ); j 番目のデータが j+1 番目のデータよりも大きいか比較 j 番目のデータを tmp に退避 データ交換 j+1 番目のデータを j 番目の位置に代入 tmp のデータを j+1 番目の位置に代入 ファイル median.c の内容

制御の流れ 基本 流れを変えたいこともある 左から右へ 上から下へ 条件付き実行 関数呼び出し ソース・コード 基本 左から右へ 上から下へ 流れを変えたいこともある 条件付き実行 「左のデータの値が右のデータの値よりも大きい場合は交換する」 「3000回繰り返す(カウンタが3000を超えたら繰り返すのをやめる)」 関数呼び出し “ printf () ”

流れを変えるもの 分岐 if 文 switch 文 ループ for 文 while 文 サブルーチン

分岐 条件によって実行する部分を変更 if 文: switch 文: 条件の真偽により変更 条件の値により変更 switch ( x ) {  条件の真偽により変更 switch 文:  条件の値により変更 if ( A ) { B; } else { C; } switch ( x ) { case 0: A; break; case 1: B; } A が真の場合 x が0の場合 A が偽の場合 x が1の場合

C プログラムの構造 j 番目のデータが j+1 番目のデータよりも大きいか比較 結果が真の場合のみ交換を行う #include <stdio.h> main ( ) { int i, j, tmp; int data [3000]; for ( i = 0 ; i < 3000 – 1 ; i = i + 1) { for ( j = 0 ; j < 3000 – i + 1 ; j = j + 1) { if ( data [ j ] > data [ j + 1 ] ) { tmp = data [ j ]; data [ j ] = data [ j + 1]; data [ j + 1 ] = tmp; } printf ( “median = %d\n”, data [1500] ); j 番目のデータが j+1 番目のデータよりも大きいか比較 結果が真の場合のみ交換を行う ファイル median.c の内容

ループ 条件が成立している限り繰り返す 書き方は2通り 条件式 条件式 制御変数の初期化 制御変数の更新 for 文 / while 文 どちらでも同じことが実現可能 慣例として, for 文:制御変数が単調に変化する時       (配列アクセスなど) while 文:それ以外 条件式 while ( B ) { D; } B B D D 条件式 制御変数の初期化 制御変数の更新 A for ( A ; B ; C ) {   D; } B B D D C C

C プログラムの構造 i が 2999 に達するまで繰り返す i を初期化 i をインクリメント ファイル median.c の内容 #include <stdio.h> main ( ) { int i, j, tmp; int data [3000]; for ( i = 0 ; i < 3000 – 1 ; i = i + 1) { for ( j = 0 ; j < 3000 – i + 1 ; j = j + 1) { if ( data [ j ] > data [ j + 1 ] ) { tmp = data [ j ]; data [ j ] = data [ j + 1]; data [ j + 1 ] = tmp; } printf ( “median = %d\n”, data [1500] ); i が 2999 に達するまで繰り返す i を初期化 i をインクリメント ファイル median.c の内容

サブルーチンと関数 サブルーチン 関数 別の処理を呼び出す 終わったら元の位置に戻る 関数呼び出し/復帰によって実現 引数:呼び出し時に関数に渡す      データ 返り値:復帰時に元のルーチン       に返すデータ void printf ( char* s, … ) { } 返り値の型 第1引数 printf ( “median = %d\n”, data [1500] );

C文法のまとめ プログラムの基本構造 データと演算 制御の流れ データには型が存在 基本は左から右へ.上から下へ 流れを変えるもの 分岐,ループ,関数呼び出し

参考書 カーニハン&リッチー: 「プログラミング言語C 第2版」,共立出版 講義スライド http://www.hal.ipc.i.u-tokyo.ac.jp/~miwa/C1_2013.pptx

おまけ

できない人をサポートしつつ,できる人も楽しめる演習にするにはどうすればよいか? この演習の例年の評判 正直に言って,あまりよくない 「どうしたらいいかわからない」 「教え方が不親切.できる人にはこれでいいんだろうけど...」 でも,こちらの立場としては, 理解度のばらつきが大きすぎて,演習や講義の最低ラインを決め るのが非常に難しい(あまりに易しくしすぎると,できる人には物足 りない演習になる) 誰が何をわかってないのかこちらはわからないので,わからないこ とがあるなら質問してほしい(演習の間は講義室にいるのだから) できない人をサポートしつつ,できる人も楽しめる演習にするにはどうすればよいか?

対応策 サンプル・プログラムを配ります サンプル・プログラムの URL データ・ファイルの読み込み,結果の出力部分など,アルゴリズム とは直接関係ない部分を実装する手間を削減 アルゴリズムの考案・実装に注力できるようになる サンプル・プログラムの URL http://www.hal.ipc.i.u-tokyo.ac.jp/~miwa/tsp.c ※ あくまでサンプルなので,ゼロから自分で書きたい人は自由に書 いてください

直前にいた都市 の座標(X, Y) 訪問中の都市 の座標(X, Y) この都市に訪問するまで のトータルの移動距離 1行が都市間の 移動1回を表す