本日の目標
- 構造体をポインタを使って操作できる。
- 構造体の配列をポインタを使って操作できる。
予習・復習
以下のスライドを利用して、予習と復習をしよう。復習では、自分の理解度を確認するために、実際にプログラムを作成し、意図する結果が得られるか確認しよう。本日の講義・演習予定
- 構造体のポインタ
- 関数と構造体ポインタ
- 自己参照構造体
- 演習問題
- 提出課題
#include <stdio.h> struct point2D { int x; int y; }; int main(void) { struct point2D point; struct point2D *p; //構造体point2D型変数を指し示すポインタ point.x = 5; point.y = 7; p = &point; //構造体変数pointの先頭アドレスを代入 printf("座標 (%d, %d)\n", (*p).x,(*p).y); return 0; }
#include <stdio.h> struct point2D { int x; int y; }; int main(void) { struct point2D point; struct point2D *p; //構造体point2D型変数を指し示すポインタ point.x = 5; point.y = 7; p = &point; //構造体変数pointの先頭アドレスを代入 printf("座標 (%d, %d)\n", p->x,p->y); return 0; }
#include <stdio.h> struct point2D { int x; int y; }; typedef struct point2D point2D_t; int main(void) { point2D_t points[3] = {{2,3},{4,7},{6,9}}; int i; for(i=0; i<3; i++){ printf("座標%d (%d, %d)\n", i,points[i].x,points[i].y); } return 0; }
#include <stdio.h> struct point2D { int x; int y; }; typedef struct point2D point2D_t; int main(void) { point2D_t points[3] = {{2,3},{4,7},{6,9}}; point2D_t *p; int i; p = points; for(i=0; i<3; i++){ printf("座標%d (%d, %d)\n", i,(p+i)->x,(p+i)->y); } return 0; }
#include <stdio.h> #include <stdlib.h> #define N 3 struct point2D { int x; int y; }; typedef struct point2D point2D_t; int main(void) { //point2D_t型変数N個分の領域を確保 point2D_t *p = (point2D_t *)malloc(sizeof(point2D_t)*N); int i; for(i=0; i<N; i++){ printf("座標x> "); scanf("%d", &(p+i)->x); printf("座標y> "); scanf("%d", &(p+i)->y); } for(i=0; i<N; i++){ printf("座標(%d,%d)\n",(p+i)->x,(p+i)->y); } //領域を解放 free(p); return 0; }
#include <stdio.h> struct point2D { int x; int y; }; typedef struct point2D point2D_t; void print_point(point2D_t point); //プロトタイプ宣言 int main(void) { point2D_t point; point.x = 5; point.y = 7; print_point(point); return 0; } /* 座標の表示 */ void print_point(point2D_t point) { printf("座標(%d, %d)\n", point.x, point.y); }
#include <stdio.h> struct point2D { int x; int y; }; typedef struct point2D point2D_t; void set_point(point2D_t *pt, int x, int y); //プロトタイプ宣言 void print_point(point2D_t point); int main(void) { point2D_t point; point2D_t *p; //point2D_t型変数を指し示すポインタ //point2D_t *p = (point2D_t *)malloc(sizeof(point2D_t)); point.x = 5; point.y = 7; print_point(point); set_point(&point,12,23); print_point(point); //free(p); //領域解放 return 0; } /* 座標設定 */ void set_point(point2D_t *pt, int x, int y) { pt->x = x; pt->y = y; } /* 座標の表示 */ void print_point(point2D_t point) { printf("座標(%d, %d)\n", point.x, point.y); }
#include <stdio.h> struct node { int key; int value; struct node *next; //自分自身へのポインタ }; int main(void) { struct node node[5]; struct node *top,*np; int i; for(i=0; i<5; i++){ node[i].key = i + 1000; node[i].value = i*10; } top = &node[0]; //ポインタtopは先頭ノードを示す node[0].next = &node[1]; //先頭ノードのnextは次のノードを示す node[1].next = &node[2]; node[2].next = &node[3]; node[3].next = &node[4]; node[4].next = NULL; //nextが示すノードがないのでNULLとする for(np = top; np!=NULL; np = np->next){ //NULLになるまで次のノードへ printf("%d ",np->value); } printf("\n"); return 0; }
#include <stdio.h> #include <stdlib.h> struct student { int id; //学籍番号 int nation; //国語 int math; //数学 int english; //英語 float avg; //平均 }; typedef struct student student_t; void set_avg(student_t *s, int num); void sort(student_t *s, int num); int main(void) { student_t *st_p; int n,i; printf("生徒の人数を入力してください> "); scanf("%d",&n); st_p = (student_t *)malloc(sizeof(student_t)*n); printf("点数を入力してください。\n"); for(i=0; i<n; i++){ [[空欄ア]]id = i+1001; printf("学籍番号 %d\n",(st_p+i)->id); printf("国語> "); scanf("%d",[[空欄イ]]nation); printf("数学> "); scanf("%d",[[空欄ウ]]math); printf("英語> "); scanf("%d",[[空欄エ]]english); } set_avg(st_p,n); sort(st_p,n); puts(" No. | 国語 | 数学 | 英語 | 平均 "); puts("------+------+------+------+------"); for(i=0; i<n; i++){ printf(" %4d |",[[空欄オ]]id); printf(" %3d |",[[空欄カ]]nation); printf(" %3d |",[[空欄キ]]math); printf(" %3d |",[[空欄ク]]english); printf(" %.1f\n",[[空欄ケ]]avg); } free(st_p); return 0; } /* 平均値一覧の作成 */ void set_avg(student_t *s, int num) { int i; for(i=0; i<num; i++){ [[空欄コ]]avg = (float)([[空欄サ]]nation+[[空欄シ]]math + [[空欄ス]]english)/3; } } /* 成績順で並べ替え */ void sort(student_t *s, int num) { int i,j; student_t tmp; for(i=1; i<num; i++){ for(j=0; j<num-i; j++){ if([[空欄セ]]avg < [[空欄ソ]]avg){ tmp = [[空欄タ]]; [[空欄チ]]; [[空欄ツ]] = tmp; } } } }
今週の確認テスト テスト(PDF)
#include <stdio.h> #define N 3 typedef struct { int id; //学籍番号 int eng; //英語 int math; //数学 int sci; //理科 int total; //合計 } Seiseki; Seiseki data[N]; void sumof(Seiseki *x); //一人分の合計を求める void swap(Seiseki *a, Seiseki *b); //成績の交換 void sort(Seiseki x[], int n); //成績順で並べ替え void printSeiseki(Seiseki *x){ int i; printf(" ID. | 英語| 数学 | 理科 | 合計\n"); printf("------+------+------+------|------\n"); for(i=0; i<N; i++){ printf(" %4d | %4d |",x[i].id, x[i].eng); printf(" %4d | %4d | %4d\n",x[i].math,x[i].sci,x[i].total); } } int main(void) { int i; for(i=0; i<N; i++) scanf("%d %d %d %d", &data[i].id, &data[i].eng, &data[i].math, &data[i].sci); for(i=0; i<N; i++) sumof(&data[i]); printSeiseki(data); sort(data,N); printSeiseki(data); return 0; }