数理情報工学演習第一C プログラミング演習 (第3回 ) 2014/04/21

Slides:



Advertisements
Similar presentations
10: ファイル入出力 Linux にログインし、以下の講義ページ を開いておくこと teachers/w483692/CPR1/ C プログラミング入門 総機 1 ( 月 1) 1.
Advertisements

オブジェクト指向言語・ オブジェクト指向言語演習 中間試験回答例. Jan. 12, 2005 情報処理技術基礎演習 II 2 オブジェクト指向言語 中間試験解説 1  (1) 円柱の体積(円柱の体積 = 底面の円の面積 x 高さ) を求めるプログラムを作成しなさい。ただし、出力結果は、入 力した底面の円の半径.
システムプログラミング 第7回、8回 ファイルシステム関連の システムコール
情報処理演習C2 ファイル操作について (2).
情報基礎演習B 後半第5回 担当 岩村 TA 谷本君.
第13回構造体.
構造体(struct) 配列では、複数のデータをひとまとまりにして操作する ことが出来る。しかし、それぞれのデータは同じ型(例えば
データ構造とアルゴリズム 第10回 mallocとfree
第12回構造体.
プログラミング入門2 第10回 構造体 情報工学科 篠埜 功.
プログラミング入門2 第10回 構造体 情報工学科 篠埜 功.
システムプログラミング 第5回 情報工学科 篠埜 功 ヒアドキュメント レポート課題 main関数の引数 usageメッセージ
第13回 プログラミングⅡ 第13回
記憶クラス 変数をどのような記憶領域に割り当てるかを指定するのが記憶クラス 記憶クラスには、自動変数、静的変数、外部変数などがある。
第8回 プログラミングⅡ 第8回
構造体.
情報処理Ⅱ 第13回 2006年1月20日(金).
アルゴリズムとデータ構造 補足資料6-3 「サンプルプログラムcat3.c」
精密工学科プログラミング基礎 第9回資料 (12/11 実施)
ファイル操作と文字列の利用.
演習問題の答え #include #include #define NUM 5 typedef struct { // 構造体の定義 float shincho; // 身長 float taiju; // 体重 } shintai; void hyouji(shintai.
前回の復習 ファイル入出力①.
第3回 配列,構造体,ポインタ ~ データ構造について学ぶための基礎~
精密工学科プログラミング基礎Ⅱ 第3回資料 今回の授業で習得してほしいこと: 2次元配列の使い方 (前回の1次元配列の復習もします.)
構造体 構造体, 構造体とポインタの組み合わせ,.
第10回 プログラミングⅡ 第10回
10: ファイル入出力 C プログラミング入門 基幹2 (月4) Linux にログインし、以下の講義ページ を開いておくこと
Cプログラミング演習 第6回 ファイル処理と配列.
プログラミング 2 ファイル処理.
プログラミング論 ファイル入出力
プログラミング入門2 ファイルの入出力 ポインタ 芝浦工業大学情報工学科 青木 義満
関数と配列とポインタ 1次元配列 2次元配列 配列を使って結果を返す 演習問題
Cプログラミング演習.
第11回 宿題 出題日:12月21日 締切日:1月7日(木).
情報・知能工学系 山本一公 プログラミング演習Ⅱ 第2回 ファイル処理 情報・知能工学系 山本一公
精密工学科プログラミング基礎 第10回資料 (12/18実施)
プログラミング演習I 2003年6月25日(第10回) 木村巌.
画像処理プログラムの説明.
2005年度 データ構造とアルゴリズム 第3回 「C言語の復習:再帰的データ構造」
プログラミング入門2 第11回 情報工学科 篠埜 功.
第7回 プログラミングⅡ 第7回
地域情報学 C言語プログラミング 第5回 ポインタ、関数、ファイル入出力 2017年11月17日
プログラミング論 ファイル入出力
第11回 プログラミングⅡ 第11回
システムプログラミング 第7回、8回 ファイルシステム関連の システムコール
2005年度 データ構造とアルゴリズム 第6回 「ハッシュ法を用いた探索」
精密工学科プログラミング基礎Ⅱ 第4回資料 今回の授業で習得してほしいこと: 文字列の扱い ファイル入出力の方法 コマンドライン引数の使い方
第14章 ファイル操作 14.1 ファイルへの書き込み 14.2 ファイルからの読み込み 14.3 ファイルへの追加書き込み
第4回 ファイル入出力方法.
配列変数とポインタ 静的確保と動的確保 ポインタ配列 2次元配列 時間計測 第1回レポートの課題
システムプログラミング 第7回、8回 ファイルシステム関連の システムコール
精密工学科プログラミング基礎Ⅱ 第5回資料 今回の授業で習得してほしいこと: 構造体 (教科書 91 ページ)
第14章 ファイル操作 14.1 ファイルへの書き込み 14.2 ファイルからの読み込み 14.3 ファイルへの追加書き込み
プログラミング基礎a 第6回 C言語によるプログラミング入門 配列と文字列(その2)
プログラミング演習I 2003年7月2日(第11回) 木村巌.
ファイルの読み込み, ファイルからのデータの取り出し, ファイルの書き出し
ネットワーク・プログラミング Cプログラミングの基礎.
高度プログラミング演習 (11).
情報処理Ⅱ 第7回 2004年11月16日(火).
cp-3. 計算 (C プログラミング演習,Visual Studio 2019 対応)
モジュール分割.
プログラミング 4 文字列.
四則演算,変数 入力文,出力文,代入文, ライブラリ関数
情報処理Ⅱ 2005年11月25日(金).
プログラミング演習II 2003年12月10日(第7回) 木村巌.
プログラミング入門2 第5回 配列 変数宣言、初期化について
情報処理Ⅱ 小テスト 2005年2月1日(火).
第14章 ファイル操作 14.1 ファイルへの書き込み 14.2 ファイルからの読み込み 14.3 ファイルへの追加書き込み
C言語講座第5回 2017 構造体.
高度プログラミング演習 (10).
Presentation transcript:

数理情報工学演習第一C プログラミング演習 (第3回 ) 2014/04/21

今日の内容: #define typedef struct ファイルの読み書き 課題:行列を表す構造体とファイル読み書き

#define 定数(数値,文字列)に名前をつける #define ARRAY_LENGTH 100 int a[ARRAY_LENGTH]; for (i=0; i<ARRAY_LENGTH; i++) a[i] = 0; プログラム中に直接数値を書くと,値を変更し忘れたりするので, 極力名前を定義してそれを使う

typedef 通常の変数の型に違う名前をつけられる typedef int data_t; data_t x, y, z; ポインタの型なども定義できる typedef char *string_t; string_t name; // 文字列へのポインタ

struct (構造体)1 複数の変数をまとめたもの struct person { char *name; // 名前の文字列 int age; // 年齢 }; struct person P1; P1.name = “Kunihiko Sadakane”; P1.age = 10;

struct (構造体)2 typedef で構造体に名前をつけると便利 typedef struct { char *name; // 名前の文字列 int age; // 年齢 } person; person P1; P1.name = “Kunihiko Sadakane”; P1.age = 10;

struct (構造体)3 実行結果 age(P1) = 10 age(P2) = 11 構造体は関数の引数や返り値にできる person inc_age(person P) { person Q; Q = P; Q.age++; return Q; } int main() person P1, P2; P1.name = "Kunihiko Sadakane"; P1.age = 10; P2 = inc_age(P1); printf("age(P1) = %d\n", P1.age); printf("age(P2) = %d\n", P2.age); 構造体は関数の引数や返り値にできる 構造体変数間の代入もできる 実行結果 age(P1) = 10 age(P2) = 11

struct (構造体)4 実行結果 age(P1) = 11 age(P2) = 10 構造体のポインタを使うほうが一般的 int main() { person *P1, *P2; P1 = malloc(sizeof(person)); P1->name = "Kunihiko Sadakane"; P1->age = 10; P2 = malloc(sizeof(person)); *P2 = *P1; // 中身のコピー inc_age(P1); printf("age(P1) = %d\n", P1->age); printf("age(P2) = %d\n", P2->age); } #include <stdio.h> #include <stdlib.h> typedef struct { char *name; int age; } person; void inc_age(person *P) { P->age++; } 実行結果 age(P1) = 11 age(P2) = 10

struct (構造体)5 実行結果 age(P1) = 11 age(P2) = 11 注意:ポインタの代入では中身はコピーされない さらに注意:中身をコピーした場合でも,構造体の要素 name は ポインタなので,元の文字列を変更するとそれを参照している全ての変数 が変わる int main() { person *P1, *P2; P1 = malloc(sizeof(person)); P1->name = "Kunihiko Sadakane"; P1->age = 10; P2 = P1; // ポインタの代入 inc_age(P1); printf("age(P1) = %d\n", P1->age); printf("age(P2) = %d\n", P2->age); } #include <stdio.h> #include <stdlib.h> typedef struct { char *name; int age; } person; void inc_age(person *P) { P->age++; } 実行結果 age(P1) = 11 age(P2) = 11

行列を構造体で表す typedef struct { int n, m; // 行数,列数 double **A; // (行を表す配列)の配列へのポインタ } matrix; matrix *malloc_matrix(int n, int m) { matrix *a; int i; a = malloc(sizeof(*a)); a->n = n; a->m = m; a->A = malloc(n * sizeof(double *)); for (i=0; i<n; i++) { a->A[i] = malloc(m * sizeof(double *)); } return a; main() { matrix *a; a = malloc_matrix(10, 10); }

ファイル操作の手続き: ファイル操作 ファイルからのデータ読み込み ファイルへのデータ書き出し 基本的な手順 読みこむ/書き出すファイルを開く (fopen) 読み込み/書き出しの操作 (fscanf/fprintf) ファイルを閉じる (fclose)

ファイルを開く/閉じる: fopen/fclose fopen(ファイル名, モード) モード:r(読み込み), w(書き込み), a(追記) FILE *fp; // ファイルポインタの宣言 fp = fopen(“input.txt”, “r”) ; // 読み込みモードでinput.txtを開く fclose(fp); // 閉じる 各種ファイル処理

ファイルへの書き込み、読み込み: ファイルポインタ以外はprintf/scanfと同様 書き出し:fprintf(ファイルポインタ, …) fprintf(fp, “%d \n”, i) 読み込み:fscanf(ファイルポインタ, …) 整数は %d, 実数は %lf int x; double y; fscanf(fp, “%d %lf”, &x, &y); ファイルの最後に到達した場合 EOF を返す if ( fscanf(。。。) == EOF ){….}

コマンドライン引数の利用 ./a.out input.txt 10 0.1 と引数をつけて実行したとき argc = 4; argv[0] = “./a.out”; プログラム名 argv[1] = “input.txt”; argv[2] = “10”; argv[3] = “0.1”; int main(int argc, char *argv[]) { FILE *f; int n; double x; if (argc < 4) exit(1); // 引数が足りない f = fopen(argv[1], “r”); n = atoi(argv[2]); // 文字列を整数に x = atof(argv[3]); // 文字列を実数に }

課題 n 行 m 列の行列をファイルから読み込み,新たに確保した行列に代入 matrix *input_matrix(char *filename); 行列を入力と同じ形式でファイルに出力 void output_matrix(char *filename, matrix *a); 2つの行列 A, B の積を計算し,新たに確保した行列 C に代入 matrix *product(matrix *A, matrix *B); 行列のサイズが合わないときは C は確保せずに NULL を返す 行列のメモリを開放する void free_matrix(matrix *A);

行列のファイル形式 2 3 1.0 2.0 3.0 4.0 5.0 6.0 行数 列数 1行目 2行目

課題の提出: 本日(4/21)の18時までに提出 提出ファイルをメールに添付し以下に送付 宛先:miprogramming2014+3@gmail.com