専門学校55日目(情報工学)6月28日(金)

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

前回6月21日で6章の繰返し文は終わりました。授業の最後に章末の練習問題もやりました。
練習問題の解説をして先に進みます。課題や試験はテキストファイルで提出してもらいますが、メモ帳に貼り付けるとき、インデントが崩れる場合があります。スペースキーでなく、タブキーでインデントを入れるときれいにできるかと思います。

1問目はfor文で回し、中にif文を入れて、i%2==0ならprintfで出力するやり方ができます。
2問目はwhile文でループを回し、入力が0であったらbreakさせる書き方でいいです。
3問目は九九の表を出力させる内容です。\tのタブコードで4桁分スペースを取り出力します。
4問目は*を出力させるものでした。1行目は*が1個、2行目は*が2個、と増やしていく。
5問目は入力した数が素数かどうかを判断するコードを書く問題でした。カウンター変数といわれるforループで使われるiがあります。そのほかの変数は1文字でなく何かしら意味を持った名前を付けておくといいでしょう。企業ごとのルールに則った変数名を付けることになるでしょう。チェックフラグという考えを使って解きます。フラグを1にして、ループで入力値をカウンター変数のiで割って割り切れたら、フラグを0にし、breakする。そうでなく割り切れなければフラグが1のままで、フラグの値で素数かどうかを判定するような解き方がある。シンプルにとらえてコードを書くとよいと思います。

少しでも疑問があれば残さずにメールなどで質問するようにしてほしいです。

今日からLesson7の配列を学びます。

変数がたくさん登場するとコードが複雑のなってしまう。
そのような時、配列という仕組みを利用すると便利です。
配列は同じ型の値をまとめて記憶することができる。
アドレス帳のように名前や住所など異なる種類の値を扱うには構造体というものを利用します。
配列の要素数は決まった数を指定する必要がある。
int test[5]と要素数5個で宣言したら、配列の順番は0から始まり4までの5つとなる。
配列の要素に代入するには変数と同じように=で代入したい値を右辺に書く。

キーボードからの入力を配列に入れるときはscanf_s("%d", &test[i]);
のように書く。

配列の利用には注意点もあります。配列の大きさを超えた要素を利用することができません。
int test[5];と5要素の配列を宣言して、test[10]=10;のように配列の10番目に値を代入するなどはできません。

配列も変数と同じように宣言と値の代入を同時にする初期化ができます。
型名 配列名 [要素数] = {値0, 値1, ・・・};
と波括弧を使って初期値を入れていきます。波括弧の中に入れる値を初期化子といいます。初期化する場合は配列の要素数を指定しなくても、初期化子の数に応じた要素数になる。配列の要素数を宣言し、初期化子を配列の要素数よりも少ない数にすると、あまった要素については0が自動的に格納される。

配列を使う課題を出され、問題を解きました。

#include <stdio.h>
int main(void) {
    //Lesson7課題
    /**/
    int gakunen[10];
    int count[6] = {0};
    int i = 0;
    int max = 0;
    printf("10人の生徒の学年を入力してください。\n");
    for (i = 0; i < 10; i++) {
        scanf_s("%d", &gakunen[i]);
    }
    for (i = 0; i < 10; i++) {
        if (gakunen[i] == 1)
            count[0]++;
        if (gakunen[i] == 2)
            count[1]++;
        if (gakunen[i] == 3)
            count[2]++;
        if (gakunen[i] == 4)
            count[3]++;
        if (gakunen[i] == 5)
            count[4]++;
        if (gakunen[i] == 6)
            count[5]++;
    }
    printf("各学年の生徒数は以下となります。\n");
    for (i = 0; i < 6; i++) {
        printf("%d年生は%d名です。\n", i+1, count[i]);
    }
    for (i = 0; i < 6; i++) {
        if (count[i] > max) {
            max = count[i];
        }
    }
    for (i = 0; i < 6; i++) {
        if (max == count[i]) {
            printf("一番多い学年は%d年生でした。\n", i+1);
            break;
        }
    }
    //*/
    return 0;
}

同じ人数の学年があった場合、最後のループ内で複数回出力してしまうので、break文でループを抜けるようにしています。先生の回答を見て、コードを簡潔にしたのが以下のものです。

#include <stdio.h>
int main(void) {
    /**
    int gakunen[10];
    int count[6] = { 0 };
    int igaku = 0;
    int i = 0;
    int max = 0;
    int maxgaku = 0;
    printf("10人の生徒の学年を入力してください。\n");
    for (i = 0; i < 10; i++) {
        scanf_s("%d", &gakunen[i]);
    }
    for (i = 0; i < 10; i++) {
        igaku = gakunen[i];
        count[igaku - 1]++;
    }
    printf("各学年の生徒数は以下となります。\n");
    for (i = 0; i < 6; i++) {
        printf("%d年生は%d名です。\n", i + 1, count[i]);
        if (count[i] > max) {
            max = count[i];
            maxgaku = i + 1;
        }
    }
    printf("一番多い学年は%d年生でした。\n", maxgaku);
    //*/
    return 0;
}

(解説)
どの部分を配列にするかを決めなければならない。必ずしも配列を使い必要はないですが、ここでは配列の学習をしているので使います。配列に入力が終わったら、集計する。そのためには学年を集計するための別な配列を作り、5年生だったら配列の5番目の値を+していく。
先生の解答は以下のようになっていました。
for文で配列に入力する。
学年ごとの人数を集計するにあたりigakunen変数を用意し、その変数番目の学年集計用配列の値をインクリメントします。
for文で各学年ごとの人数を表示する。for文の中にif文を入れ人数が最大の人数とその学年を求めていました。



マクロを利用する
#defineというものが登場します。
#define NUM 5
でNUMというのは5ですよということを示す。for文の中でもfor(i=0;i<NUM;i++)でNUMが5と認識される。
マクロは大文字で書くという慣例があります。

配列の応用
配列の並び替え(ソート)をする
ソートにはfor文の中にfor文を使うネスト構造と、for文の中にif文を入れ、配列の要素を比べ退避用の変数を使い、変数の値を入れ替えます。
配列の説明は時間がかかるので詳しくは次週に説明します。テストにも必ず出す内容なので、理解できるようにしてほしいです。


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

前回6月21日は演習問題を解きました。テーブルを分けてエリア名を別テーブルで管理し、元のテーブルと結合して表示させたりしました。
本日の課題は大問2題

create table ABC洋菓子店商品一覧 ( 
    ID integer, 
    商品名 varchar(20), 
    値段 integer default 0, 
    洋酒 varchar(3), 
    生クリーム varchar(3), 
    フルーツ varchar(3) 
    )

insert into ABC洋菓子店商品一覧
values (1, 'レアチーズ', 280, 'No', 'No', 'No')

insert into ABC洋菓子店商品一覧
values (2, 'ショートケーキ', 300, 'No', 'Yes', 'Yes')

insert into ABC洋菓子店商品一覧
values (3, 'アップルパイ', 300, 'No', 'No', 'Yes')

insert into ABC洋菓子店商品一覧
values (4, 'モンブラン', 320, 'Yes', 'Yes', 'Yes')

insert into ABC洋菓子店商品一覧
values (5, 'シフォンケーキ', 290, 'No', 'Yes', 'No')

insert into ABC洋菓子店商品一覧
values (6, 'チョコ生ケーキ', 350, 'No', 'No', 'No')

insert into ABC洋菓子店商品一覧
values (7, 'ティラミス', 250, 'Yes', 'No', 'No')

insert into ABC洋菓子店商品一覧
values (8, 'エクレア', 170, 'No', 'No', 'No')

insert into ABC洋菓子店商品一覧
values (9, 'ナポレオン', 400, 'No', 'Yes', 'Yes')

insert into ABC洋菓子店商品一覧
values (10, 'プリン ア・ラ・モード', 270, 'No', 'Yes', 'Yes')

insert into ABC洋菓子店商品一覧
values (11, 'チェリーパイ', 360, 'Yes', 'Yes', 'Yes')

insert into ABC洋菓子店商品一覧
values (12, '生シュークリーム', 190, 'No', 'Yes', 'No')

insert into ABC洋菓子店商品一覧
values (13, 'サバラン', 280, 'Yes', 'Yes', 'Yes')

insert into ABC洋菓子店商品一覧
values (14, 'ショコラ', 270, 'Yes', 'No', 'No')

insert into ABC洋菓子店商品一覧
values (15, 'バナナチョコレートパイ', 340, 'No', 'Yes', 'Yes')

insert into ABC洋菓子店商品一覧
values (16, 'ベークドチーズケーキ', 320, 'No', 'No', 'No')

insert into ABC洋菓子店商品一覧
values (17, 'デラックスショート', 350, 'No', 'Yes', 'Yes')

insert into ABC洋菓子店商品一覧
values (18, 'パンプキンパイ', 320, 'No', 'Yes', 'No')

insert into ABC洋菓子店商品一覧
values (19, 'フランボワーズ', 340, 'No', 'No', 'Yes')

insert into ABC洋菓子店商品一覧
values (20, '抹茶ショート', 320, 'No', 'Yes', 'No')

以上がテーブルの作成とデータの入力です。以下はデータベースの操作です。

select *
from ABC洋菓子店商品一覧
where 洋酒 = 'Yes'

select *
from ABC洋菓子店商品一覧
where フルーツ = 'No'

select *
from ABC洋菓子店商品一覧
where 洋酒 = 'No'
and 生クリーム = 'Yes'

select *
from ABC洋菓子店商品一覧
where 値段 >= 300

select *
from ABC洋菓子店商品一覧
where 値段 between 200 and 299

select *
from ABC洋菓子店商品一覧
order by 値段 desc

select *
from ABC洋菓子店商品一覧
order by 値段, ID

select *
from ABC洋菓子店商品一覧
order by 1 desc

select *
from ABC洋菓子店商品一覧
where 商品名 like '%ケーキ'

select *
from ABC洋菓子店商品一覧
where 商品名 like '%ショート%'

select *
from ABC洋菓子店商品一覧
where 商品名 like '%パイ'

update ABC洋菓子店商品一覧
set 商品名 = 'ショコラ・デラックス', 値段 = 320
where ID = 14

delete from ABC洋菓子店商品一覧
where ID = 8

alter table ABC洋菓子店商品一覧 add 人気商品 varchar(5)

update ABC洋菓子店商品一覧
set 人気商品 = '第1位!'
where ID = 2

第2問

create table 売上データ1月分 ( 
    ID integer, 
    商品名 varchar(20), 
    売上数 integer default 0 
    )

insert into 売上データ1月分
values (1, 'レアチーズ', 50)

insert into 売上データ1月分
values (2, 'ショートケーキ', 120)

insert into 売上データ1月分
values (3, 'アップルパイ', 45)

insert into 売上データ1月分
values (4, 'モンブラン', 66)

insert into 売上データ1月分
values (5, 'シフォンケーキ', 85)

insert into 売上データ1月分
values (6, 'チョコ生ケーキ', 52)

insert into 売上データ1月分
values (7, 'ティラミス', 87)
create table 売上データ2月分 ( 
    ID integer, 
    商品名 varchar(20), 
    売上数 integer default 0 
    )

insert into 売上データ2月分
values (1, 'レアチーズ', 55)

insert into 売上データ2月分
values (2, 'ショートケーキ', 150)

insert into 売上データ2月分
values (3, 'アップルパイ', 65)

insert into 売上データ2月分
values (4, 'モンブラン', 85)

insert into 売上データ2月分
values (5, 'シフォンケーキ', 90)

insert into 売上データ2月分
values (6, 'チョコ生ケーキ', 40)

insert into 売上データ2月分
values (7, 'ティラミス', 92)

insert into 売上データ2月分
values (8, 'エクレア', 75)

以上で2つのテーブルを作り、以下で操作していきます。

select 商品名, 売上数
from 売上データ1月分
order by 売上数 desc
offset 0 rows
fetch next 3 rows only

select 商品名, 売上数
from 売上データ2月分
order by 売上数 desc
offset 0 rows
fetch next 3 rows only

select 商品名, 売上数
from 売上データ1月分
order by 売上数
offset 0 rows
fetch next 3 rows only

select 商品名, 売上数
from 売上データ2月分
order by 売上数
offset 0 rows
fetch next 3 rows only

select 商品名
from 売上データ2月分
except
select 商品名
from 売上データ1月分

演習問題が終わったら、教科書のp.322にある練習問題10-1から10-3に取り組みました。
10-1
イ.drop table
ウ.create table
キ.alter table

10-2
create table 学部 (
ID char(1) primary key,
名前 varchar(20) not null unique,
備考 varchar(100) default '特になし' not null
)

10-3
create table 学生 (
学籍番号 char(8) primary key,
名前 varchar(30) not null,
生年月日 date not null,
血液型 char(2) check (血液型 in ('A', 'B', 'O', 'AB') or 血液型 is null),
学部ID char(1) references 学部(ID)
)

テーブルを作成後、適当な学部名を学部テーブルに登録して、その後学生テーブルにもデータを登録しました。血液型にDとかVとか入れると登録できなかったので制約が効いているようです。


6限目は教科書を進めます。
p.315-外部キーと参照整合性
これは後期の試験で出題します。
テーブル(表)、javaやCでとファイルという。
2種類ある。
1.マスタ系(手でやっていた時代の台帳)
2.トランザクション系(伝票)・・・費目マスタで予め準備が必要
分け方を覚えると設計も楽になります。
7月1日から新しく稼働しますよと、この日までにデータを入れておかないといけないのがマスタ系。
新人だとデータを打たされる。
トランザクション系は0件から始まる。空っぽでもいい。家計簿データ。どちらなのかを判断すると作りやすくなります。
学生システムとしては4月1日までに学生番号や氏名、住所などのデータを学生マスタを入れておく。学生にとってのトランザクションは成績で試験のたびに追加される。
マスタは普段は増えず、新商品を販売することになったときなどに追加していく。
トランザクションは毎日の売り上げなどを追加していく。

外部キーが指し示す先にあるべき行が存在してリレーションシップが成立している状態を参照整合性という。異常な状態は参照整合性の崩壊という。
なぜこういう状態が起きるのか原因は4つある。
①ほかの行から参照されている行を削除してしまう
②ほかの行から参照されている行の主キーを変更してしまう
この二つはマスタ系の問題

③存在しない行を参照する行を追加してしまう
④存在しない行を参照する行に更新してしまう
この二つはトランザクション系の問題

こうした崩壊を避けるために外部キーの制約を指定する。

講義が終わった後は章末練習問題の続きをしました。
10-4
学生テーブルの学部IDを学部テーブルに存在しないIDに変更しようとする。
学生テーブルから参照されている学部テーブルの行を削除する。

10-5
insert into 学部
values ('K', '工学部', null)
で工学部データを作り、
update 学生
set 学部ID = 'K'
where 学部ID = '1'
で更新する。
理学部の廃止は
delete from 学部
where ID = '1'

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