第12回(7月3日)

プログラミング演習(2組)
第12回
http://www.fit.ac.jp/~matsuki/PEB1.html
今日の内容
• 前回の課題の解説
• 今回の課題の説明
タイピング
• 喰人王を使用して結果を記録する
• ステージ:第一の店(中華)
• Excelのシートにスコアを毎回記録していく
– 残り時間⇒ FeedBackページで報告
– 総タイプ数
– ミスタイプ数
– 正確さ⇒ FeedBackページで報告
– 喰いっぷり ⇒ FeedBackページで報告
前回の課題
課題1:
配列を用いて、10個の整数値を入力させて、そ
の平均値、最大値を求めるGetAve関数と
GetMax関数を作れ。
課題2:
配列を用いて、10個の整数値を入力させて、大き
い順に並び替えるSort関数を作れ。
前回の課題
課題1:
配列を用いて、10個の整数値を入力させて、
その平均値、最大値を求めるGetAve関数と
GetMax関数を作れ。
関数の作り方
• Point1 関数の仕様を決める
– 戻り値の型
– 関数名
– 引数の個数、型、変数名
• Point2 関数のプロトタイプ宣言を書く
• Point3 関数の定義を書く
• Point4 呼び出し部分を正しく記述する
前回の課題
• GetAve関数:
– 関数名:GetAve
– 戻り値の型:double型
– 引数:int型の配列
• GetMax関数:
– 関数名:GetMax
– 戻り値の型:int型
– 引数:int型の配列
課題1の解答例
#include<stdio.h>
#define MAX_SIZE 10
int GetMax(int a[]);
double GetAve(int a[]);
配列の大きさをdefineで指定
プロトタイプ宣言
main()
{
int data[MAX_SIZE];
int i;
main()関数
printf("入力した整数値の最大値と平均値を求めます。\n");
printf("10個の整数値を入力してください。\n");
for(i = 0;i < MAX_SIZE;i++){
printf("%d個目の値:",i+1);
scanf("%d",&data[i]);
}
printf("最大値は%dです。\n",GetMax(data));
printf("平均値は%3.6lfです。\n",GetAve(data));
}
getMax関数の呼び出し
getAve関数の呼び出し
課題1の解答例
getAve()関数
double GetAve(int a[])
{
int k;
int sum;
double ave;
配列aを引数としている
sum = 0;
for(k = 0;k < MAX_SIZE;k++){
sum += a[k];
}
ave = sum /(double)k;
return ave;
}
配列要素の総和を計算
平均を計算
計算した平均を戻り値として返す
課題1の解答例
getMax()関数
int GetMax(int a[])
{
int j;
int max;
max = a[0];
配列aを引数としている
最初の要素a[0]を暫定最大値とし
ている
for(j = 1;j < MAX_SIZE;j++){
if(max < a[j])
max = a[j];
}
return max;
}
暫定最大値maxとすべ
ての要素を比較
求めた最大値を戻り値として返す
課題1の解答例
getMax()関数
int GetMax(int a[])
あくまで,getMax関数は
{
「最大値を計算する」と
int j;
いう機能を持つ
int max;
max = a[0];
for(j = 1;j < MAX_SIZE;j++){
if(max < a[j])
maxに最大値が入る
max = a[j];
}
printf(“最大値は%fです.\n”, max);
return max;
表示する機能はいらな
}
い(むしろ邪魔)
#include <math.h>
main()
{
sin()関数自体に表示す
double x, y;
る機能はいらない(むし
x = sqrt(2);
ろ邪魔)
y = sin(3.14 / 3);
printf(“x = %lf, y=%lf\n”,x,y);
}
前回の課題
課題2:
配列を用いて、10個の整数値を入力させて、大き
い順に並び替えるSort関数を作れ。
• いろいろな計算方法(アルゴリズムという)が存
在する.
• 最大値を配列の左側に集める方法を行う
方針(Step1)
a[0]とa[1]を比較
a[0]とa[2]を比較
a[0]とa[3]を比較
a[0]とa[4]を比較
a[0]
a[1]
a[2]
a[3]
a[4]
7
4
5
9
0
7
4
5
9
0
7
4
5
9
0
9
4
5
7
0
9
4
5
7
0
a[0]には,5つの中の最大値が入る
方針(Step2)
a[1]とa[2]を比較
a[1]とa[3]を比較
a[1]とa[4]を比較
a[0]
a[1]
a[2]
a[3]
a[4]
9
4
5
7
0
9
5
4
7
0
9
7
4
5
0
9
7
4
5
0
a[1]には,a[1]からa[4]までの
最大値が入る(全体で2番目の最大値)
方針(Step3)
a[2]とa[3]を比較
a[2]とa[4]を比較
a[0]
a[1]
a[2]
a[3]
a[4]
9
7
4
5
0
9
7
5
4
0
9
7
5
4
0
a[2]には,a[2]からa[4]までの
最大値が入る(全体で3番目の最大値)
方針(Step4)
a[3]とa[4]を比較
a[0]
a[1]
a[2]
a[3]
a[4]
9
7
5
4
0
9
7
5
4
0
a[3]には,a[3]からa[4]までの
最大値が入る(全体で4番目の最大値)
全体の最小値に確定
解答例
void Sort(int a[])
{
int j;
int k;
int tmp;
for(j = 0;j < MAX_SIZE-1;j++){
for(k = j+1;k < MAX_SIZE;k++){
if(a[j] < a[k]){
tmp = a[j];
a[j] = a[k];
a[k] = tmp;
}
}
}
}
確定
a[j]がa[k]よりも小さい
場合は交換
a[j]
a[k]
今日の課題(締切:7月30日)
課題1:次の仕様を満たす関数を作れ
・関数名:circleInfo
・戻り値:void
・引数:
double型 double r
double型へのポインタ double *pLength
double型へのポインタ double *pArea;
・機能:引数rを半径とする円の円周長と面積を求
め,それぞれの結果をポインタpLength, pAreaの
指すメモリに格納する(Call by reference)
課題2:
配列を初期化する関数InitArrayを以下の仕様に
従って作れ.但し,配列の大きさは#define
MAX_SIZEで指定されていると見なしてよい.
• 関数名:InitArray
• 引数:
– int型配列 int a[],
– int型変数 int value,
– int型変数 int num
• 戻り値: numがMAX_SIZEより大きい場合は0を,
そうでない場合は1を返す
• 機能:a[0]からa[num-1]までをvalueで初期化し,
それ以外はすべて0で初期化する(但し,num
がMAX_SIZEより大きい場合は,初期化処理は
行わない).
課題2のmain関数および宣言部分(例)
#include <stdio.h>
#define MAX_SIZE 10
int InitArray(int a[], int value, int num);
main()
{
int k;
int data[MAX_SIZE];
InitArray(data, 3, 8);
for (k=0;k<MAX_SIZE;k++)
printf(“%2d “,data[k]);
printf(“\n”);
}
今日の課題
課題3:
ポインタを使って,配列にint型の値を入力さ
せる関数InputArray2を作れ.
・関数名:InputArray2
・戻り値:void
・引数:int型へのポインタ int *pa
注意事項
• ソースファイルについて
ソースファイルは添付ファイルで送る
ソースファイル以外は送らない
ソースファイルの名前は,半角のみ使用
• メールについて
件名は,学籍番号+半角スペース+氏名
(例)S09F2099 松木裕二
本文にも短いカバーレター(説明)をつける
その他
• 講義に関する質問・課題提出など:
[email protected]
• Feed back page:
http://www.fit.ac.jp/~matsuki/cgi-bin/newpage11.html
メールアドレスの入力は不要です
ニックネームを決めてください(Ranking表示に使います)