Cプログラミング入門.

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プログラミング入門 第1回 三輪忍.
プログラミング演習II 2004年11月 30日(第6回) 理学部数学科・木村巌.
情報基礎演習B 後半第5回 担当 岩村 TA 谷本君.
数理情報工学演習第一C プログラミング演習 (第3回 ) 2014/04/21
システムプログラミング 第5回 情報工学科 篠埜 功 ヒアドキュメント レポート課題 main関数の引数 usageメッセージ
基礎プログラミングおよび演習 第9回
C言語 第2講 生物機能制御学講座 濱田 農学部7号館209室.
第2回ネットワークプログラミング 中村 修.
プログラムはなぜ動くのか.
プログラミング演習Ⅰ 課題2 10進数と2進数 2回目.
Cプログラミング入門 第1回 三輪忍.
第7回 条件による繰り返し.
岩村雅一 知能情報工学演習I 第8回(後半第2回) 岩村雅一
第2回 Microsoft Visual Studio C++ を使ってみよう
ちょっとした練習問題① 配列iroを['R', 'W', 'R', 'R', 'W' , 'W' , 'W']を宣言して、「W」のときの配列の番号をprintfで表示するようなプログラムを記述しなさい。
プログラミング言語入門 手続き型言語としてのJava
岩村雅一 知能情報工学演習I 第11回(後半第5回) 岩村雅一
Cプログラミング演習.
プログラミング応用 printfと変数.
プログラミング言語入門.
プログラミング演習I 2003年5月7日(第4回) 木村巌.
岩村雅一 知能情報工学演習I 第8回(C言語第2回) 岩村雅一
04: 式・条件分岐 (if) C プログラミング入門 基幹7 (水5) Linux にログインし、以下の講義ページ を開いておくこと
第7回 条件による繰り返し.
第7回 プログラミングⅡ 第7回
岩村雅一 知能情報工学演習I 第10回(後半第4回) 岩村雅一
復習 前回の関数のまとめ(1) 関数はmain()関数または他の関数から呼び出されて実行される.
岩村雅一 知能情報工学演習I 第11回(後半第5回) 岩村雅一
岩村雅一 知能情報工学演習I 第9回(後半第3回) 岩村雅一
情報処理Ⅱ 第2回:2003年10月14日(火).
岩村雅一 知能情報工学演習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日(木)
復習 Cにおけるループからの脱出と制御 break ループを強制終了する.if文と組み合わせて利用するのが一般的. continue
情報処理Ⅱ 第2回 2006年10月13日(金).
ネットワーク・プログラミング Cプログラミングの基礎.
第5回 プログラミングⅡ 第5回
vc-1. Visual Studio C++ の基本操作 (Visual Studio C++ の実用知識を学ぶシリーズ)
精密工学科プログラミング基礎 第7回資料 (11/27実施)
プログラミング入門2 第5回 配列 for文 変数宣言 初期化
標準入出力、変数、演算子、エスケープシーケンス
Visual Studio 2013 の起動と プロジェクトの新規作成 (C プログラミング演習,Visual Studio 2019 対応) 金子邦彦.
cp-15. 疑似乱数とシミュレーション (C プログラミング演習,Visual Studio 2019 対応)
オブジェクト指向言語論 第二回 知能情報学部 新田直也.
岩村雅一 知能情報工学演習I 第8回(C言語第2回) 岩村雅一
岩村雅一 知能情報工学演習I 第12回(後半第6回) 岩村雅一
Cp-1. Microsoft Visual Studio 2019 C++ の使い方 (C プログラミング演習,Visual Studio 2019 対応) 金子邦彦.
精密工学科プログラミング基礎Ⅱ 第2回資料 今回の授業で習得してほしいこと: 配列の使い方 (今回は1次元,次回は2次元をやります.)
岩村雅一 知能情報工学演習I 第10回(後半第4回) 岩村雅一
プログラミング演習I 2003年6月11日(第9回) 木村巌.
情報処理Ⅱ 第2回 2004年10月12日(火).
モバイルプログラミング第2回 C言語の基礎 (1).
第3回簡単なデータの入出力.
情報処理Ⅱ 2005年11月25日(金).
プログラミング言語Ⅰ(実習を含む。), 計算機言語Ⅰ・計算機言語演習Ⅰ, 情報処理言語Ⅰ(実習を含む。)
プログラミング入門2 第5回 配列 変数宣言、初期化について
情報処理Ⅱ 小テスト 2005年2月1日(火).
printf・scanf・変数・四則演算
復習 いろいろな変数型(2) char 1バイト → 英数字1文字を入れるのにぴったり アスキーコード → 付録 int
C言語講座 四則演算  if ,  switch 制御文.
岩村雅一 知能情報工学演習I 第7回(後半第1回) 岩村雅一
第1章 文字の表示と計算 printfと演算子をやります.
オブジェクト指向言語論 第六回 知能情報学部 新田直也.
Presentation transcript:

Cプログラミング入門

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

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

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

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

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

コンパイルの手順 Visual C++ の場合 Windows を起動 ログインして Visual Studio を起動 メニューから「ファイル」→「新規作成」→「プロジェクト」を選択 「Win32」→「Win32コンソールアプリケーション」を選択し,「プロジェクト名」と 「場所」を入力.「ソリューションのディレクトリを作成」のチェックはOFFにして 「OK」をクリック Win32アプリケーションウィザードにて「次へ」をクリック.「コンソールアプリ ケーション」を選択.「空のプロジェクト」にチェックを入れ,「完了」をクリック メニューから「プロジェクト」→「新しい項目の追加」を選択 「C++ファイル(.cpp)」を選択し,「ファイル名」と「場所」を入力して「追加」をク リック プログラムを記述 メニューから「ビルド」→「ソリューションのビルド」(コンパイル) メニューから「デバッグ」→「デバッグなしで開始」

コンパイルの手順 gcc の場合 Ubuntu を起動 (emacsなどの)テキストエディタを起動し,プログラムを記述 コマンドライン端末を起動し,コマンド「gcc filename」 (filename はプログラムのファイル名)を実行.(正しくコンパイル ができていれば)「a.out」という名前の実行ファイルができる 上記のファイルを実行(コマンド「./a.out」を実行)

C言語の文法の基礎

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

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

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

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

対応策 サンプル・プログラムを配ります サンプル・プログラム データ・ファイルの読み込み,結果の出力部分など,アルゴリズム とは直接関係ない部分を実装する手間を削減 アルゴリズムの考案・実装に注力できるようになる サンプル・プログラム tsp.c (資料4) ※ あくまでサンプルなので,ゼロから自分で書きたい人は自由に書 いてください

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