課題5
下記のプログラムでは、学生の成績データを構造体として取り扱っている。 構造体1の課題1と異なり、ここでは、
点であるが、実行結果は構造体1の課題1と同じになる。下記のプログラムを struct5.cとして保存しコンパイルして、 実行結果の通り正しく実行されるか確認せよ。
#include <stdio.h>
#define NUM 4
int main(void)
{
int i;
typedef struct student{
char name[20];
int english;
int math;
int japanese;
}STUDENT;
STUDENT data[]={{"佐藤", 82, 72, 58},
{"秋山", 77, 82, 79},
{"永田", 52, 62, 39},
{"藤田", 61, 82, 88}};
STUDENT *p;
/* ポインタ変数pにdataの先頭のアドレスを渡す */
p = data;
for(i=0; i<NUM; i++){
printf("%10s: 英語=%3d 数学=%3d 国語=%3d\n", p->name, p->english, p->math, p->japanese);
/* アドレスの移動 */
p++;
}
return 0;
}
(実行結果)
hp3225[susaki]502:~/program% ./a.out
佐藤: 英語= 82 数学= 72 国語= 58
秋山: 英語= 77 数学= 82 国語= 79
永田: 英語= 52 数学= 62 国語= 39
藤田: 英語= 61 数学= 82 国語= 88
課題6
上記の課題5において、ポインタが参照するアドレスを表示したい。下記の プログラムをstruct6.cとして保存しコンパイルして、実行結果を確認せよ。
#include <stdio.h>
#define NUM 4
int main(void)
{
int i;
typedef struct student{
char name[20];
int english;
int math;
int japanese;
}STUDENT;
STUDENT data[]={{"佐藤", 82, 72, 58},
{"秋山", 77, 82, 79},
{"永田", 52, 62, 39},
{"藤田", 61, 82, 88}};
STUDENT *p;
int adr_name, adr_english, adr_math, adr_japanese;
/* ポインタ変数pにdataの先頭のアドレスを渡す */
p = data;
for(i=0; i<NUM; i++){
printf("%10s: 英語=%3d 数学=%3d 国語=%3d\n", p->name, p->english, p->math, p->japanese);
adr_name = (int)&p->name;
adr_english = (int)&p->english;
adr_math = (int)&p->math;
adr_japanese = (int)&p->japanese;
printf("(アドレス)名前=%X: 英語=%X 数学=%X 国語=%X\n", adr_name, adr_english, adr_math, adr_japanese);
printf("(アドレス): 英語のアドレス-名前のアドレス=%d\n", adr_english-adr_name);
printf("(アドレス): 数学のアドレス-英語のアドレス=%d\n", adr_math-adr_english);
printf("(アドレス): 国語のアドレス-数学のアドレス=%d\n\n", adr_japanese-adr_math);
/* アドレスの移動 */
p++;
}
return 0;
}
(実行結果)
hp3225[susaki]504:~/program% ./a.out
佐藤: 英語= 82 数学= 72 国語= 58
(アドレス)名前=BFFFFB18: 英語=BFFFFB2C 数学=BFFFFB30 国語=BFFFFB34
(アドレス): 英語のアドレス-名前のアドレス=20
(アドレス): 数学のアドレス-英語のアドレス=4
(アドレス): 国語のアドレス-数学のアドレス=4
秋山: 英語= 77 数学= 82 国語= 79
(アドレス)名前=BFFFFB38: 英語=BFFFFB4C 数学=BFFFFB50 国語=BFFFFB54
(アドレス): 英語のアドレス-名前のアドレス=20
(アドレス): 数学のアドレス-英語のアドレス=4
(アドレス): 国語のアドレス-数学のアドレス=4
永田: 英語= 52 数学= 62 国語= 39
(アドレス)名前=BFFFFB58: 英語=BFFFFB6C 数学=BFFFFB70 国語=BFFFFB74
(アドレス): 英語のアドレス-名前のアドレス=20
(アドレス): 数学のアドレス-英語のアドレス=4
(アドレス): 国語のアドレス-数学のアドレス=4
藤田: 英語= 61 数学= 82 国語= 88
(アドレス)名前=BFFFFB78: 英語=BFFFFB8C 数学=BFFFFB90 国語=BFFFFB94
(アドレス): 英語のアドレス-名前のアドレス=20
(アドレス): 数学のアドレス-英語のアドレス=4
(アドレス): 国語のアドレス-数学のアドレス=4
課題7
ファーストフード店において、セットメニューの価格を計算するプログラムを作成した い。セット価格は、セットに含まれる単品価格の合計の1割引し、 10円未満を切り捨てた金額としたい。 その価格の計算部分が*******で隠されている。
また、この課題ではセットBの価格だけを計算するが、ポインタを使用した 構造体の接続部分も*******で隠されている。 *******で隠された部分を補ってstruct7.cとして保存し、 実行結果の通り正しく実行されるか確認せよ。
#include <stdio.h>
int main(void)
{
int i, total=0;
struct tanpin{
char *name;
int price;
struct tanpin *p;
};
struct set{
char *set_name;
int set_price;
struct tanpin *p;
};
struct set s[]={{"セットA", 0, NULL},
{"セットB", 0, NULL},
{"セットC", 0, NULL},
{"セットD", 0, NULL}};
struct tanpin burger[] = {{"ハンバーガー", 130, NULL},
{"チーズバーガー", 150, NULL},
{"チキンバーガー", 200, NULL}};
struct tanpin drink = {"ドリンク", 130, NULL};
struct tanpin potato = {"ポテト", 120, NULL};
struct tanpin ice = {"アイスクリーム", 150, NULL};
struct tanpin *pt;
/* セットB:チーズバーガー,ドリンク,ポテト */
/* セットBの単品をポインタで接続させることで,セットBを構成する */
*****************************
*****************************
*****************************
*****************************
*****************************
printf("***** %s *****\n", s[1].set_name);
/* セットBの単品の価格をポインタで参照し、セットBの価格を計算する */
for(pt = s[1].p; pt != NULL; pt = pt->p){
total += pt->price;
printf("%15s: %5d円\n", pt->name, pt->price);
}
printf(" ---------------------------\n");
printf(" 単価合計: %5d円\n", total);
s[1].set_price = *****************************; <- ここを補う
printf(" セット価格: %5d円\n", s[1].set_price);
return 0;
}
(実行結果)
hp3225[susaki]506:~/program% ./a.out
***** セットB *****
チーズバーガー: 150円
ドリンク: 130円
ポテト: 120円
---------------------------
単価合計: 400円
セット価格: 360円
課題8
課題7においては、セットBのみのセット価格を計算した。選択されたセットの価格 をswitch文を用いて計算したい。課題7のプログラム中に示されたヒントを参考にし て、下記の******で隠された部分を補ってstruct8.cとして保存し、 実行結果の通り正しく実行されるか確認せよ。
#include <stdio.h>
int main(void)
{
int i, total=0, select_num;
struct tanpin{
char *name;
int price;
struct tanpin *p;
};
struct set{
char *set_name;
int set_price;
struct tanpin *p;
};
struct set s[]={{"セットA", 0, NULL},
{"セットB", 0, NULL},
{"セットC", 0, NULL},
{"セットD", 0, NULL}};
struct tanpin burger[] = {{"ハンバーガー", 130, NULL},
{"チーズバーガー", 150, NULL},
{"チキンバーガー", 200, NULL}};
struct tanpin drink = {"ドリンク", 130, NULL};
struct tanpin potato = {"ポテト", 120, NULL};
struct tanpin ice = {"アイスクリーム", 150, NULL};
struct tanpin *pt;
printf("お好きなセットを選んでください。0-3の数字でお答え下さい。\n");
printf(" 0: セットA:ハンバーガー,ドリンク,ポテト\n");
printf(" 1: セットB:チーズバーガー,ドリンク,ポテト\n");
printf(" 2: セットC:チキンバーガー,ドリンク,ポテト\n");
printf(" 3: セットD:チキンバーガー,ドリンク,ポテト,アイスクリーム\n");
scanf("%d", &select_num);
switch(select_num){
case 0: /* セットA:ハンバーガー,ドリンク,ポテト */
*****************************
*****************************
*****************************
*****************************
*****************************
case 1: /* セットB:チーズバーガー,ドリンク,ポテト */
*****************************
*****************************
*****************************
*****************************
*****************************
case 2: /* セットC:チキンバーガー,ドリンク,ポテト */
*****************************
*****************************
*****************************
*****************************
*****************************
case 3: /* セットD:チキンバーガー,ドリンク,ポテト,アイスクリーム */
*****************************
*****************************
*****************************
*****************************
*****************************
}
printf("***** %s *****\n", s[select_num].set_name);
for(pt = s[select_num].p; pt != NULL; pt = pt->p){
total += pt->price;
printf("%15s: %5d円\n", pt->name, pt->price);
}
printf(" ---------------------------\n");
printf(" 単価合計: %5d円\n", total);
s[select_num].set_price = *****************************;
printf(" セット価格: %5d円\n", s[select_num].set_price);
return 0;
}
(実行結果)
hp3225[susaki]508:~/program% ./a.out
お好きなセットを選んでください。0-3の数字でお答え下さい。
0: セットA:ハンバーガー,ドリンク,ポテト
1: セットB:チーズバーガー,ドリンク,ポテト
2: セットC:チキンバーガー,ドリンク,ポテト
3: セットD:チキンバーガー,ドリンク,ポテト,アイスクリーム
0
***** セットA *****
ハンバーガー: 130円
ドリンク: 130円
ポテト: 120円
---------------------------
単価合計: 380円
セット価格: 340円
hp3225[susaki]509:~/program%
hp3225[susaki]509:~/program% a.out
お好きなセットを選んでください。0-3の数字でお答え下さい。
0: セットA:ハンバーガー,ドリンク,ポテト
1: セットB:チーズバーガー,ドリンク,ポテト
2: セットC:チキンバーガー,ドリンク,ポテト
3: セットD:チキンバーガー,ドリンク,ポテト,アイスクリーム
1
***** セットB *****
チーズバーガー: 150円
ドリンク: 130円
ポテト: 120円
---------------------------
単価合計: 400円
セット価格: 360円
hp3225[susaki]510:~/program%
hp3225[susaki]510:~/program% a.out
お好きなセットを選んでください。0-3の数字でお答え下さい。
0: セットA:ハンバーガー,ドリンク,ポテト
1: セットB:チーズバーガー,ドリンク,ポテト
2: セットC:チキンバーガー,ドリンク,ポテト
3: セットD:チキンバーガー,ドリンク,ポテト,アイスクリーム
2
***** セットC *****
チキンバーガー: 200円
ドリンク: 130円
ポテト: 120円
---------------------------
単価合計: 450円
セット価格: 400円
hp3225[susaki]511:~/program%
hp3225[susaki]511:~/program% a.out
お好きなセットを選んでください。0-3の数字でお答え下さい。
0: セットA:ハンバーガー,ドリンク,ポテト
1: セットB:チーズバーガー,ドリンク,ポテト
2: セットC:チキンバーガー,ドリンク,ポテト
3: セットD:チキンバーガー,ドリンク,ポテト,アイスクリーム
3
***** セットD *****
チキンバーガー: 200円
ドリンク: 130円
ポテト: 120円
アイスクリーム: 150円
---------------------------
単価合計: 600円
セット価格: 540円
課題9
情報大前のバス停に到着する時刻を与えることで、何時何分に千葉駅に 到着するのか下記 の3つのルートに関して調べ、最も早く千葉駅に到着するルートを知りたい。
| ルート1 | 情報大 | - バス -> | 千葉 | ||
| ルート2 | 情報大 | -バス-> | 千城台 | -モノレール-> | 千葉 |
| ルート3 | 情報大 | -バス-> | 都賀 | -JR総武線-> | 千葉 |
問題を簡単にするために、下記のような条件を設けるものとする。
この課題で仮想上設定した、各交通機関の時刻表、および乗り換え所要時間は下記の通りである。
| 交通機関 | 時刻表 |
|---|---|
| バス (千城台経由千葉行:情報大発車時刻) |
03, 12, 19, 25, 32, 39, 44, 51, 57 |
| バス(都賀行:情報大発車時刻) | 18 |
| モノレール(千城台発車時刻) | 05, 15, 25, 35, 45, 55 |
| JR総武線(都賀発車時刻) | 04, 17, 31, 48 |
| 交通機関と区間 | 所用時間(分) |
|---|---|
| バス(情報大->千葉) | 38 |
| バス(情報大->千城台) | 8 |
| バス(情報大->都賀) | 27 |
| モノレール(千城台->千葉) | 24 |
| JR総武線(都賀->千葉) | 6 |
| 各交通機関間の乗り換え | 所要時間(分) |
| (バス->モノレール、バス->JR) | 1 |
このような設定の元で、実行結果のような出力を得るプログラムを struct9.cとして完成させ、正しく実行されるか確認せよ。
注意: 構造体を使用して課題9を達成することを 期待するが、必ずしも構造体を使用しなければいけないわけではない。
(実行例) hp3225[susaki]501:~/program% hp3225[susaki]501:~/program% ./a.out 情報大前のバス停に何時何分に到着しますか?(入力例: 16 25)42 7 入力エラー: 正しく入力してください [0-23]時 [0-59]分 の間の数字を入れてください hp3225[susaki]502:~/program% hp3225[susaki]502:~/program% ./a.out 情報大前のバス停に何時何分に到着しますか?(入力例: 16 25)16 25 *** 情報大 -バス-> 千葉 *** バス: 情報大 -> 千葉 出発時刻: 16 時 25 分 到着時刻: 17 時 3 分 *** 情報大 -バス-> 千城台 -モノレール-> 千葉 *** バス: 情報大 -> 千城台 出発時刻: 16 時 25 分 到着時刻: 16 時 33 分 乗り換え後: 16 時 34 分 モノレール: 千城台 -> 千葉 出発時刻: 16 時 35 分 到着時刻: 16 時 59 分 *** 情報大 -バス-> 都賀 -総武線各駅-> 千葉 *** バス: 情報大 -> 都賀 出発時刻: 17 時 18 分 到着時刻: 17 時 45 分 乗り換え後: 17 時 46 分 JR: 都賀 -> 千葉 出発時刻: 17 時 48 分 到着時刻: 17 時 54 分 --- 最も早く千葉駅に着くルートは --- *** 情報大 -バス-> 千城台 -モノレール-> 千葉 *** hp3225[susaki]503:~/program% hp3225[susaki]503:~/program% ./a.out 情報大前のバス停に何時何分に到着しますか?(入力例: 16 25)18 56 *** 情報大 -バス-> 千葉 *** バス: 情報大 -> 千葉 出発時刻: 18 時 57 分 到着時刻: 19 時 35 分 *** 情報大 -バス-> 千城台 -モノレール-> 千葉 *** バス: 情報大 -> 千城台 出発時刻: 18 時 57 分 到着時刻: 19 時 5 分 乗り換え後: 19 時 6 分 モノレール: 千城台 -> 千葉 出発時刻: 19 時 15 分 到着時刻: 19 時 39 分 *** 情報大 -バス-> 都賀 -総武線各駅-> 千葉 *** バス: 情報大 -> 都賀 出発時刻: 19 時 18 分 到着時刻: 19 時 45 分 乗り換え後: 19 時 46 分 JR: 都賀 -> 千葉 出発時刻: 19 時 48 分 到着時刻: 19 時 54 分 --- 最も早く千葉駅に着くルートは --- *** 情報大 -バス-> 千葉 *** hp3225[susaki]504:~/program%