専門学校87日目/10月4日(金)

1時限~3時限
C言語基礎 やさしいC 第5版

本日で夏休み明けてから1週間が経ちます。
前期期末試験の答え合わせがありました。解説の後、新しい章で8章の関数を学びます。後期はポインタや構造体など難しいことも学んでいきます。

試験は120点満点で平均が66点ほど。
第1問は三角形の面積を求めるプログラムです。
真横で入力させるということができていない人が多かった。改行コードを取ることで真横に入力できる。
また適切にコメントを入れているかも採点しました。

第4問以降は正解が少なかった。
4問目は数値の配列だけでなく文字列の配列を並び替えする内容でした。

第5問は一見簡単に見えるが、習っていない関数の戻り値を利用したもので、インターネットで調べて知らないこともプログラミングできるかを試したものでした。入力されたのが整数なら2倍して表示し、プログラムを終了する。文字も含まれていたら再度入力させるもので、関数の戻り値はiret = scanf_s("%d", &inum);でscan関数からの戻り値が1かどうかをif文でiretを条件判定して処理を分岐させる。入力がされない、つまりnullの場合もgetchar()関数で判定する。

第6問は文字コードを調べて最終文字が0であれば、ループから抜ける。
出現回数の最も多い回数の出力は、imaxをint型で初期値0で宣言し、最大回数を更新していく。もっとも回数の多い文字の配列の番地を変数numに入れて配列のnum番目を出力させる。

試験の答えについては解答のファイルがあるので、自分なりに消化出来たら改めて追記をしようかと思います。


教科書p.216- 関数
いくつかの処理の中の共通する処理を関数として完成させておき、再利用するもの。関数の利用には関数を作成し、それを呼び出すことが必要です。プログラム全体もひとまとまりの処理なので関数の一つになっている。
戻り値の型 関数名(引数リスト)
{
  文;
  return 式;
}
{}で囲ったブロックの最後にセミコロンは付けない。

関数の呼び出しは
関数名(引数リスト);
と記述する。

void buy (void){
    printf("家を買いました。\n");
}

という関数を定義して、main関数の中でbuy();と書き呼び出しました。

int main(void)
{
    buy();
    printf("もう1軒家を購入します。\n");
    buy();
    return 0;
}

では2回呼び出しています。
ただこのくらいならわざわざ関数にせずにmain関数内に書いてもよい。もっと複雑な処理になってくると関数として別に書いておくメリットがある。
呼び出す際に関数に何かしら値を渡すとき、その値を引数という。関数内に書いた変数はmain関数内では使えない。関数の本体で定義される引数を仮引数、関数の呼び出し元で渡す引数を実引数という。
変数が渡されるというよりはそこの格納されている値が渡される。このような引数の渡し方を値渡しという。

関数は2個以上の引数を持たせることができる。複数ある場合は引数はカンマで区切って指定する。
この複数の引数を引数リストという。

引数がない時にはvoidを指定する必要がある。上で書いたbuy()関数は引数がないのでvoidを指定している。
実際にコードを書いて複数の変数を持つ関数を定義し、呼び出しました。課題のコードは以下のようです。

#include <stdio.h>

void area(int x, int y)
{
    printf("底辺が%d、高さが%dの三角形の面積は%fです。\n", x, y, x * y / 2.0);
}

int main(void)
{
    int teihen, takasa;
    printf("底辺の長さを入力してください。\n");
    scanf_s("%d", &teihen);
    printf("高さを入力してください。\n");
    scanf_s("%d", &takasa);
    area(teihen, takasa);
    return 0;
}

試験であった三角形の面積を求めるプログラムを関数で定義して呼び出すものです。関数areaはint型で2つの仮引数もint型です。面積は仮引数xとyを底辺と高さとして、それをかけたものを2.0で割った値を出力するprintf関数を関数内に書いています。そしてmain関数では実引数としてteihenとtakasaを宣言し、キーボード入力させています。area関数を呼び出すのにこれら変数を入れて、実行すると、キーボード入力の後に面積が表示されます。


■戻り値
関数で処理した結果を戻り値と理解する。引数は複数指定できるが、戻り値は1つだけ呼び出し元に返すことができる。
先に作った三角形の面積を求めるプログラムを少し変えて、戻り値で面積を受け取り、main関数内で出力する形にしたものが以下のコードです。

#include <stdio.h>

double area(int x, int y)
{
    return x * y / 2.0;
}

int main(void)
{
    int teihen, takasa;
    double ans;
    printf("三角形の面積を求めます。\n");
    printf("底辺の長さを入力してください。\n");
    scanf_s("%d", &teihen);
    printf("高さを入力してください。\n");
    scanf_s("%d", &takasa);
    ans = area(teihen, takasa); //面積を求める関数の呼び出し
    printf("三角形の面積は%fです。\n", ans);
    return 0;
}

関数の戻り値の型にdouble型を指定して、それをmain関数の変数ansに代入しています。

関数内部で関数自身を呼び出すことができて、これを再帰という。
次回、再帰の例を課題として取り組んでもらいます。
最後に入力した整数のうち最小値を出力するプログラムを作りました。

#include <stdio.h>

int min(int x, int y)
{
    if (x < y)
        return x;
    else
        return y;
}

int main(void){//
    int num1, num2, ans;
    printf("1番目の整数を入力してください。\n");
    scanf_s("%d", &num1);
    printf("2番目の整数を入力してください。\n");
    scanf_s("%d", &num2);
    ans = min(num1, num2);
    printf("最小値は%dです。\n", ans);
    return 0;
}

4時限~6時限
webDBシステム開発 スッキリわかるSQL入門第3版ドリル256問付き

前期の復習を兼ねて簡単な練習問題を解きました。

create table チーズ ( 
    ID integer, 
    名称 varchar(10), 
    チーズタイプ varchar(6), 
    原産国 varchar(6), 
    食べやすさ integer 
    )
 
insert into チーズ
values (1, 'カマンベール', '白カビ', 'フランス', 2)
 
insert into チーズ
values (2, 'ブルサン', 'フレッシュ', 'フランス', 2)
 
insert into チーズ
values (3, 'グリュイエール', 'ハード', 'スイス', 2)
 
insert into チーズ
values (4, 'ゴルゴンゾーラ', '青カビ', 'イタリア', 3)
 
insert into チーズ
values (5, 'マリボー', 'セミハード', 'デンマーク', 1)
 
insert into チーズ
values (6, 'クリーム ノブレス', 'プロセス', 'ドイツ', 1)
 
insert into チーズ
values (7, 'タレッジオ', 'ウォッシュ', 'イタリア', 2)
 
insert into チーズ
values (8, 'ロックフォール', '青カビ', 'フランス', 3)
 
insert into チーズ
values (9, 'マスカルポーネ', 'フレッシュ', 'イタリア', 1)
 
insert into チーズ
values (10, 'パルメジャーノ', 'ハード', 'イタリア', 2)
 
insert into チーズ
values (11, 'ブリー', '白カビ', 'フランス', 2)
 
insert into チーズ
values (12, 'ゴーダ', 'セミハード', 'オランダ', 1)
 
insert into チーズ
values (13, 'ラクレット', 'ハード', 'スイス', 2)
 
insert into チーズ
values (14, 'モッツアレラ', 'フレッシュ', 'イタリア', 1)
 
insert into チーズ
values (15, 'スティルトン', '青カビ', 'イギリス', 3)
 
insert into チーズ
values (16, 'エメンタール', 'ハード', 'スイス', 2)
 
insert into チーズ
values (17, 'サムソー', 'セミハード', 'デンマーク', 1)
 
insert into チーズ
values (18, 'カンボゾラ', '青カビ', 'ドイツ', 2)
 
insert into チーズ
values (19, 'ピコドン', '山羊乳', 'フランス', 3)
 
insert into チーズ
values (20, 'エダム', 'ハード', 'オランダ', 2)

ここまでがテーブルの作成とデータ追加です。以下がselect文などです。

select *
from チーズ
where チーズタイプ = 'フレッシュ'
 
select *
from チーズ
where チーズタイプ <> 'ハード'
 
select *
from チーズ
where チーズタイプ in ('白カビ', '青カビ')
 
select *
from チーズ
where チーズタイプ not in ('ハード', 'セミハード')
 
select *
from チーズ
where ID between 10 and 15
 
select 名称, 原産国
from チーズ
where 食べやすさ = 1
 
select *
from チーズ
order by 食べやすさ
 
select *
from チーズ
order by 食べやすさ desc
 
select *
from チーズ
where 原産国 in ('フランス', 'イギリス')
 
select *
from チーズ
where チーズタイプ = 'セミハード'
and 原産国 = 'デンマーク'
 
select *
from チーズ
where 原産国 = 'スイス'
or 食べやすさ = 2

update チーズ
set 食べやすさ = 1
where ID = 20

delete from チーズ
where ID = 12

授業はこれだけですが、月曜日に作った人生ゲームのプログラムの改良をするように言われました。JavaとSQLとは同じ先生です。ゲームの出力を見やすくした例を示してくださり、それに倣って直すというものです。アスキーアートで人生ゲームなどの見出しの出力を工夫しました。

この記事が気に入ったらサポートをしてみませんか?