地域情報学 C言語プログラミング 第5回 ポインタ、関数、ファイル入出力 2017年11月17日

Slides:



Advertisements
Similar presentations
オブジェクト指向言語・ オブジェクト指向言語演習 中間試験回答例. Jan. 12, 2005 情報処理技術基礎演習 II 2 オブジェクト指向言語 中間試験解説 1  (1) 円柱の体積(円柱の体積 = 底面の円の面積 x 高さ) を求めるプログラムを作成しなさい。ただし、出力結果は、入 力した底面の円の半径.
Advertisements

ポインタ プログラミング入門2 第10回 芝浦工業大学情報工学科 青木 義満
情報基礎演習B 後半第5回 担当 岩村 TA 谷本君.
数理情報工学演習第一C プログラミング演習 (第3回 ) 2014/04/21
第13回構造体.
第12回構造体.
プログラミング入門2 第10回 構造体 情報工学科 篠埜 功.
プログラミング入門2 第10回 構造体 情報工学科 篠埜 功.
基礎プログラミングおよび演習 第9回
プログラミング言語Ⅰ(実習を含む。), 計算機言語Ⅰ・計算機言語演習Ⅰ, 情報処理言語Ⅰ(実習を含む。)
プログラミング演習(2組) 第12回
第13回 プログラミングⅡ 第13回
12: コマンドライン引数 C プログラミング入門 総機1 (月1) Linux にログインし、以下の講義ページ を開いておくこと
C言語講座 第4回 ポインタ.
12: コマンドライン引数 C プログラミング入門 基幹7 (水5) Linux にログインし、以下の講義ページ を開いておくこと
第8回 プログラミングⅡ 第8回
理由:文字数より要素数の多い配列を用いた時に,文字列の最後を示すため
理由:文字数より要素数の多い配列を用いた時に,文字列の最後を示すため
構造体.
プログラミング演習Ⅰ 課題2 10進数と2進数 2回目.
精密工学科プログラミング基礎 第9回資料 (12/11 実施)
C言語講座 第3回 ポインタ、配列.
プログラミング論 関数ポインタ と 応用(qsort)
ちょっとした練習問題① 配列iroを['R', 'W', 'R', 'R', 'W' , 'W' , 'W']を宣言して、「W」のときの配列の番号をprintfで表示するようなプログラムを記述しなさい。
プログラミング2 関数
プログラミング入門2 ファイルの入出力 ポインタ 芝浦工業大学情報工学科 青木 義満
関数と配列とポインタ 1次元配列 2次元配列 配列を使って結果を返す 演習問題
関数の定義.
プログラミング応用 printfと変数.
地域情報学演習 VBAプログラミング 第2回 2017年10月17日
プログラミング入門2 第8回 ポインタ 情報工学科 篠埜 功.
地域情報学演習 集中講義 C++プログラミング 集中講義 2017年11月18日
今までの練習問題の復習.
第7回 プログラミングⅡ 第7回
復習 前回の関数のまとめ(1) 関数はmain()関数または他の関数から呼び出されて実行される.
高度プログラミング演習 (08).
第11回 プログラミングⅡ 第11回
情報基礎Ⅱ (第11回) 月曜4限 担当:北川 晃.
P n ポインタの基礎 5 q m 5 7 int* p; int 型の変数を指すポインタ int* q; int 型の変数を指すポインタ int n=5, m=7; int 型の変数 int array[3]; int* pArray[3]; p = &n; ポインタにアドレスを代入しているのでOK.
地域情報学 C言語プログラミング 第1回 導入、変数、型変換、printf関数 2016年11月11日
復習 2次元配列 4列 j = 0 j = 1 j = 2 j = 3 i = 0 i = 1 i = 2 3行
関数への道.
プログラミング基礎B 文字列の扱い.
精密工学科プログラミング基礎Ⅱ 第4回資料 今回の授業で習得してほしいこと: 文字列の扱い ファイル入出力の方法 コマンドライン引数の使い方
第14章 ファイル操作 14.1 ファイルへの書き込み 14.2 ファイルからの読み込み 14.3 ファイルへの追加書き込み
第4回 ファイル入出力方法.
岩村雅一 知能情報工学演習I 第12回(C言語第6回) 岩村雅一
メモリとメモリアドレス, ポインタ変数,関数へのポインタ渡し
第14章 ファイル操作 14.1 ファイルへの書き込み 14.2 ファイルからの読み込み 14.3 ファイルへの追加書き込み
C言語 はじめに 2016年 吉田研究室.
プログラミング入門2 第9回 ポインタ 情報工学科 篠埜 功.
プログラミング序論演習.
地域情報学 C言語プログラミング 第1回 導入、標準出力、変数 2017年10月13日
地域情報学 C言語プログラミング 第2回 変数・配列、型変換、入力 2017年10月20日
IF文 START もしも宝くじが当たったら 就職活動する 就職活動しない YES END NO.
情報基礎演習B 後半第2回 担当 岩村 TA 谷本君.
第13回 ポインタ 1 1.
11.1 標準ライブラリ関数 11.2 関数呼び出しのオーバーヘッド 11.3 大域変数 11.4 プロトタイプ宣言 11.5 関数引数
地域情報学 C言語プログラミング 第4回 while文、do~while文、switch文、 2次元配列、ポインタ 2017年11月10日
第5回 プログラミングⅡ 第5回
高度プログラミング演習 (11).
地域情報学 C言語プログラミング 第3回 入力、if文、for文 2016年11月25日
岩村雅一 知能情報工学演習I 第12回(後半第6回) 岩村雅一
地域情報学 C言語プログラミング 第3回 入力、if文、for文 2017年11月1日
情報処理Ⅱ 2005年11月25日(金).
第14章 ファイル操作 14.1 ファイルへの書き込み 14.2 ファイルからの読み込み 14.3 ファイルへの追加書き込み
計算技術研究会 第5回 C言語勉強会 関数(function)を使う
プログラミング演習I 補講用課題
プログラミング 3 ポインタ(1).
12: コマンドライン引数 C プログラミング入門 基幹2 (月4) Linux にログインし、以下の講義ページ を開いておくこと
Presentation transcript:

地域情報学 C言語プログラミング 第5回 ポインタ、関数、ファイル入出力 2017年11月17日 三井真吾 メール:smitsui@staff.kanazawa-u.ac.jp 居室:工作実習棟 HP:佐々木敏彦研究室HP    http://next.w3.kanazawa-u.ac.jp/

ポインタ int x = 123; x //変数xの値123を表す(家) &x //変数xのアドレスを表す(住所) pt //アドレスを記録する変数(住所録) int a, b; int *pt; //ポインタptの宣言 pt = &a; //ポインタptにaのアドレスを記録 *pt = 100; //ptの指す中身に100を代入 b = *pt + 100; //bにptのさす中身+100を代入 メモリ 123 100 &a 200 変数 x a pt b アドレス &x &pt &b *ptはここを表す。

ポインタ 配列 char a[3] = “AB”; このときa == &a[0]となる。 変数とは異なることに注意。 ポインタ 配列 char a[3] = “AB”; このときa == &a[0]となる。 変数とは異なることに注意。 char st[]=“AB”; char *pt1, *pt2; pt1 = st; printf(“%c”, *pt1); printf(“%c”, *pt1+1); printf(“%c”, *pt1+2); pt2 = st; printf(“%c”, *pt2); pt2++; メモリ ‘A’ ‘B’ ‘\0’ 配列 a[0] a[1] a[2] アドレス &a[0] &a[1] &a[2] ポインタにこのアドレスを詰める。 配列名aだけだとこれを表す。 *pi1+1;とpt2++;とは次のアドレスに移動するという意味。 型によって移動量が異なる。

ポインタ 文字列 char *p = “ABC”; //”ABC”の先頭アドレスがポインタに詰められる。 char moji[4] = “ABC”; //文字列を定義 char *p; //ポインタを定義 p = moji; //ポインタに文字列の先頭アドレスを代入 //文字列は配列名だけで先頭アドレスを表す。 配列 moji[0] moji[1] moji[2] moji[3] char week[8][20] = {“Sunday”, ・・・・・・, “Saturday”} //それぞれの先頭アドレスがweek[0]、・・・・・・、 week[6]に詰められる。 例題 曜日をポインタを用いて出力せよ。 moji[4] = ‘A’ ‘B’ ‘C’ ‘\0’ 先頭アドレスをポインタpに代入。

関数 float wa(float x, float y); //関数waのプロトタイプ宣言 //始めのfloatは戻り値の型 int main () { float a=3, b=5; printf(“%f”, wa(a, b)); //関数waの戻り値を出力 //aとbを引数と呼ぶ return 0; } float wa(float x, float y){ //関数waの本体 float z=0; z = x + y; //和を計算する return z; //zの値を返す

関数 複数の戻り値 void swap(float *x, float *y); //戻り値がない時はvoid型 int main () { float a=3, b=5; printf(“a=%f, b=%f\n”, a, b); swap(&a, &b); //アドレスを渡す return 0; } void swap(float *x, float *y){ //アドレスをポインタに詰める float z=0; z = *x; *x = *y; //ポインタを書き換えることで *y = z; //見かけ上複数の値が返る

関数 配列の引数 float wa(float dt[5]); //仮引数に配列を指定 int main () { float sum[5]={1, 2, 3, 4, 5}; printf(“合計は%f”, wa(sum)); //引数に配列名を渡す return 0; } float wa(float dt[5]){ float z = 0; for(int i=0; i<5; i++){ printf(“%f ”, dt[i]); //通常の配列同様に使える z += dt[i]; return z;

関数 配列の引数(ポインタ) 例題 関数で配列を受け取り、中身を10倍するプログラムを作れ。 関数 配列の引数(ポインタ) float wa(float *dt); //ポインタで渡す int main () { float sum[5]={1, 2, 3, 4, 5}; printf(“合計は%f”, wa(sum)); return 0; } float wa(float *dt){ float z = 0; for(int i=0; i<5; i++){ printf(“%f”, *dt + i); z += *dt + i; //配列を進める return z; float wa(float *dt); int main () { float sum[5]={1, 2, 3, 4, 5}; printf(“合計は%f”, wa(sum)); return 0; } float wa(float *dt){ float z = 0; for(int i=0; i<5; i++){ printf(“%f”, dt[i]); z += dt[i];    //配列風に使える return z; 例題 関数で配列を受け取り、中身を10倍するプログラムを作れ。 ヒント:data[5]={1,2,3,4,5}を関数に渡すと10,20,30,40,50になって返ってくる。

関数 配列の戻り値 void change(float *dt); //ポインタで渡す int main () { float data[5]={1, 2, 3, 4, 5}; for(int i=0; i<5; i++)printf(“%f ”, data[i]); printf(“\n”); change(data); return 0; } void change(float *dt){ for(int i=0; i<5; i++) dt[i] = dt[i] * 10; //ポインタを書き換え

ファイル出力 #include <stdio.h> int main() { FILE *ofs; ofs = fopen(“test.txt”, “w”); fprintf(ofs, “name 12345”); fclose(ofs); return 0; } モード 動作 "r" 読み出し専用 "w" 書き込み専用 "a" 追加書き込み専用 "r+" 読み込みと書き込み "w+" 書き込みと読み込み "a+" 読み込みと追加書き込み

ファイル入力  #include <stdio.h> int main(){ FILE *ifs; ifs = fopen("data.txt", "r"); char str[3][10]; int no[3]={0}, i=0; while(!feof(ifs)){ fscanf(ifs, "%d %s", &no[i], str[i]); i++; } fclose(ifs); for(int j=0; j<3; j++) printf("%d %s\n", no[j], str[j]); return 0;