情報基礎演習B 後半第4回 担当 岩村 TA 谷本君 前回の復習(part 1) ポインタの演算 配列の添え字と同じ double a[10], *pa; pa=&a; このとき、*(pa+3) と a[3]は同じものを表す 前回の復習(part 2) メモリ(配列)の動的な確保 必要な理由 配列(int data[10];のこと)では、配列の大きさ をコンパイル前に決めなければいけない でも、プログラムを実行した後に配列の大きさ を決めたい!!! mallocを使う 前回の課題 任意の個数の数字をソートするプログラムを 作成しなさい 要素数は最初に入力してもらう mallocを使う ソートのプログラム #include<stdio.h> void swap(int *a, int *b) { int tmp; tmp =*a; *a = *b; *b = tmp; } for(i = 0; i < 9; i++){ for(j = i+1; j < 10; j++){ if(data[i] > data[j]){ swap(&data[i],&data[j]); } } } for(i = 0; i < 10; i++) printf("%d ", data[i]); printf("\n"); int main (void){ int data[10], i, j; for(i = 0; i < 10; i++){ printf("Input: "); scanf("%d", &data[i]); } return(1); } ソートのプログラム(課題の解答) n for(i = 0; i < 10; i++){ #include<stdio.h> printf("Input: "); #include <stdlib.h> malloc, free, exitのため scanf("%d", &data[i]); void swap(int *a, int *b) { } int tmp; n-1 配列の大きさの入力 tmp =*a; n for(i = 0; i < 9; i++){ *a = *b; for(j = i+1; j < 10; j++){ *b = tmp; if(data[i] > data[j]){ } swap(&data[i],&data[j]); } int main (void){ } int data[10], i, j; ポインタの宣言 } int *data, n; n printf("n:"); scanf("%d", &n); data=(int *)malloc(sizeof(int)*n); if (data==NULL) { printf("Cannot allocate memory.\n"); exit(1); メモリ(配列)の確保 } for(i = 0; i < 10; i++) printf("%d ", data[i]); printf("\n"); free(data); メモリの解放 return(1); } 後半の予定 関数 2. ポインタ(前半) 3. ポインタ(後半) & メモリの動的確保 4. 構造体 & ファイルの入出力 5. 文字列処理 & コマンドライン引数の処理 (または、ポインタのポインタ & 2次元のメモリの 動的確保) 1. 構造体 関連のある変数をまとめて扱う方法 人(プログラマー)にとって考えやすい 一般に、行う処理は同じ 例)5人分の身長と体重を扱うとき 例)5人分の身長と体重を扱うとき 構造体を使わない場合 構造体を使う場合 メンバの参照 メンバを参照するときは “.”(ドット)をつける struct hitoという新しい変数 の型を定義 変数名.メンバ サンプルプログラム1(構造体) 構造体の定義 メンバの参照 struct data型の配列hitoを宣言 サンプルプログラム1と同等のプログラム (構造体を使わない) typedef演算子 新しいデータ型を定義する typedef 既存のデータ型 新しいデータ型 例1 typedef int seisuu; seisuu a; int a;と同じ 例2 typedef struct hito ningen; ningen a; struct hito a;と同じ ファイルの入出力 データの読み込み データの書き込み C言語では、ファイルポインタを介してファイ ルを扱う 書式 ファイルポインタの宣言 FILE *fp; ファイルのオープン fp=fopen(“ファイル名”, “モード”); モード r: 読み込み(ファイルがなければエラー) w: 書き込み(既にファイルがあれば破棄して上書き) a: 追加(ファイルがあれば。なければwと同じ) ファイルのクローズ fclose(fp); 入出力関数 書式付きファイル入出力 fprintf(fp,”文字列等のフォーマット”, 変数…) printfとの違いはファイルポインタを指定すること fscanf(fp,”フォーマット”, &変数…) scanfとの違いはファイルポインタを指定すること ファイル中のデータは空白やタブ、改行で区切られる 他に、1文字単位や1行単位の入出力関数な どがある サンプルプログラム2(ファイルへの出力) #include<stdio.h> #include<stdlib.h> int main(void) { FILE *fp; fp=fopen("test.txt","w"); if (fp==NULL) { printf("Cannot open file.\n"); exit(1); } fprintf(fp,"hello!!\n"); fclose(fp); return(0); } ファイルポインタの宣言 ファイルのオープン ファイルのオープンを確認 (オープンに失敗した場合 は終了) データの書き出し ファイルのクローズ ファイルをオープンした後は ファイルポインタを使う サンプルプログラム3 (ファイルからの入力) 書き込みの場合との相違点 #include<stdio.h> #include<stdlib.h> int main(void){ int data, i, n; FILE *fp; fp=fopen("readtest.txt","r"); if (fp==NULL) { printf("Cannot open file.\n"); exit(1); } fscanf(fp,"%d", &n); for (i=0; i<n; i++) { fscanf(fp,"%d", &data); printf("%d\n",data); } fclose(fp); return(0); }
© Copyright 2024 ExpyDoc