スライド 1

高度プログラミング演習
(11)
演習問題
• 曲名、時間をメンバにした構造体を作り、ある
音楽CDの曲情報を入力、出力できるプログ
ラムを作成せよ。
• そのCDの総時間出力するプログラムを作成
せよ。
void main()
{
struct my_cd cd;
int i;
int len;
printf("曲の数を入力して下さい: ");
my_cd_i_n(&cd);
for(i=0;i<my_cd_o_n(cd);i++){
printf("曲名: ");
my_cd_i_title(&cd,i);
printf("時間: ");
my_cd_i_len(&cd,i);
}
for(i=0;i<my_cd_o_n(cd);i++){
printf("%-16s %5d)\n",my_cd_o_title(cd,i),my_cd_o_len(cd,i));
len = len + my_cd_o_len(cd,i);
}
printf("このCDの長さは %d 分です。\n",len);
}
struct my_song {
char title[128];
int len;
};
struct my_cd {
int n;
struct my_song song[128];
};
void my_cd_i_n(struct my_cd *cd)
{
scanf("%d",&cd->n);
}
void my_cd_i_title(struct my_cd *cd,int i)
{
scanf("%s",cd->song[i].title);
}
void my_cd_i_len(struct my_cd *cd,int i)
{
scanf("%d",&cd->song[i].len);
}
int my_cd_o_n(struct my_cd cd)
{
return cd.n;
}
char *my_cd_o_title(struct my_cd cd,int i)
{
return cd.song[i].title;
}
int my_cd_o_len(struct my_cd cd,int i)
{
return cd.song[i].len;
}
復習
1. プログラミング環境になれる
2. 数値計算
3. 繰り返し計算
4. 配列
5. 条件分岐と場合分け
6. 関数
7. 再帰関数
8. ポインタ
9. 文字列
10.構造体
11.ファイル処理
• 変数
–
–
–
–
•
•
•
•
色々な型
配列
ポインタ、文字型
構造体
表示と入力
繰り返し
条件分岐・場合わけ
関数・再帰関数
変数
• 色々な型
– int, double, char
• 配列
– int data[100], char name[100]
• ポインタ・文字型
– int *data, char *name
• 構造体
struct xxxinfo {
int id;
char *name;
int data1;
int data2;
}
データの出力と入力
• 出力
– printf
– write (ファイル書き込み)
• 入力
– scanf
– getchar(文字), gets(文字列)
– read (ファイル読み込み)
繰り返し
• for 文、while 文
– 条件を満たすまで処理が繰り返される。
• 配列との併用
int data1[100];
int i;
for(i=0;i<100;i++)
data[i]= ....;
• ポインタとの併用
char data2[100];
char *p;
p=data2;
while(*p!=‘ ‘){
.....;
p = p +1;
}
条件分岐と場合分け
• 条件分岐 if 文
• 場合分け case 文
• こういう時には if 文を使えとか、case 文を使
えというのは特にない。
– 分岐の数が少ない場合、分岐後の処理が複雑な
場合 → if 文
– 分岐の数が多い場合、分岐後の処理が簡単な場
合 → case 文
条件分岐と場合わけ
if (条件) {
.....
....
....
......
} else {
.....
.....
....
..
}
switch (変数){
case A:
....
break;
case B:
....
break;
case C:
case D:
.....
break
case E:
....
case F:
......
}
関数
• プログラム中で何度も同じ処理を書くくらいな
ら、関数にしてしまう。
– → 構造体が使われた変数固有の処理(変数へ
の入力、出力など)
– 引数を扱う場合の注意
• 関数の中で引数の内容を変更したい場合
– ポインタを使う。
再帰関数
• 再帰
– 動作の対象が動作主そのもの。
• 主語 = 目的語
– 彼は自分のことが好きだ。
– He loves himself.
• 再帰関数
– 自分の中で自分自身を呼び出している関数。
void foo()
{
…………
…………
foo();
}
演習問題
• カレンダーを作成するプログラムを作成せよ。
月日から曜日を求める
int dayOfWeek(int year, int month, int day)
{
if (month == 1 || month == 2)
{
year--;
month += 12;
}
return (year + year/4 - year/100 + year/400 + (13*month+8)/5 + day) % 7;
}
引数
year 西暦で表される年号 month 月の値 (1 ~ 12) day 日の値
関数値
曜日に対応する 0 ~ 6 の値
0: 日、1: 月、2: 火、3: 水、4: 木、5: 金、6: 土
その年のある月が何日あるか求める。
int daysOfMonth(int year, int month)
{
static int days[12] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
if (month < 1 || month > 12)
month = 1; if (month == 2)
return days[1] + (year % 4 == 0 && year % 100 != 0 || year % 400 == 0);
else return days[month-1];
}