本日の目標
- 構造体をポインタを使って操作できる。
- 構造体の配列をポインタを使って操作できる。
予習・復習
以下のスライドを利用して、予習と復習をしよう。復習では、自分の理解度を確認するために、実際にプログラムを作成し、意図する結果が得られるか確認しよう。本日の講義・演習予定
- 構造体のポインタ
- 関数と構造体ポインタ
- 自己参照構造体
- 演習問題
- 提出課題
#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;
}