専門学校50日目(情報工学)6月21日(金)

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

前回6章のループ、for文、while文を学びました。
テストや課題の提出についてルールが曖昧になっているので、決めて思うと思います。
/*期末テスト問題1*/
のように冒頭で書き、コードの終わりで//*/を付ける。
またコードを見やすくするためにインデントを付けること。
for (i=1;i<=100;i++) {
isum += 1;
}
のようにインデントを入れる。

本日は教科書p.166-
for文をif文を組み合わせる。この辺は大丈夫だと思います。
break文は処理の流れを強制的に終了し、そのブロックから抜ける。
ネストになっていると孫ループから抜け、親ループから抜けるわけではないということに注意しましょう。

#include <stdio.h>
int main(void) {
/*課題1*/
int num = 0;
int total = 0;
int count = 0;
double average = 0;
while (num != -1) {
    printf("点数を入力してください。\n");
    scanf_s("%d", &num);
    if (num != -1) {
        total += num;
        count++;
    }
    else {
        break;
    }
    }
    average = (double)total / count;
    printf("テストの点数の合計は%d点です。\n", total);
    printf("平均点は%f点です。\n", average);
//*/
    return 0;
}

結構難しかったです。入力に-1があったときbreakさせるので、scanf_s関数の下にif文を置いて条件判定させる必要があります。-1以外なら点数を足していって、人数をカウントします。-1が入力されたら加算やカウントは取らずにループをbreakで抜けます。whileの条件に1を入れると、breakされるまで無条件でループを繰り返す。そのように動かすためのテクニックなので覚えておいてもらえればと思います。

break文のほかに処理を強制的に変更するcontinue文があります。break文はループから抜けるが、continue文は何番目かを飛ばして実行せずに次のループに移る。for文を2つ重ねた九九の表示をするプログラムにcontinue文を入れて偶数行だけスキップするのは次のコードです。#includeなどは省略しています。

int i, j;
for (i = 1; i <= 9; i++) {
    if (i % 2 == 1) {
        continue;
    }
    for (j = 1; j <= 9; j++) {
        printf("%2d ", i * j);
    }
    printf("\n");
}

このcontinue文に代わりにbreakを入れると、1の段は奇数段なのでbreakしループを抜け何も表示されない。
処理の流れを強制的に変更させる文には他にもgoto文があります。
goto 識別子; とすると識別子の場所までジャンプする。
6章の章末問題を解いて授業は終わりました。

#include <stdio.h>
int main(void) {
    //6章練習問題1
    /**
    int i;
    printf("1~10までの偶数を出力します。\n");
    for (i = 2; i <= 10; i += 2) {
        printf("%d\n", i);
    }
    //*/

    //6章練習問題2
    /**
    int num;
    int total = 0;
    printf("テストの点数を入力してください。(0で終了)\n");
    while (1) {
        scanf_s("%d", &num);
        if (num == 0) {
            break;
        }
        else {
            total += num;
        }
    }
    printf("テストの合計点は%d点です。\n", total);
    //*/

    //6章練習問題3
    /**
    int i, j;
    for (i = 1; i <= 9; i++) {
        for (j = 1; j <= 9; j++) {
            printf("%d\t", i * j);
        }
        printf("\n");
    }
    //*/

    //6章練習問題4
    /**
    int i, j;
    for (i = 1; i <= 5; i++) {
        for (j = 1; j <= i; j++) {
            printf("*");
        }
        printf("\n");
    }
    //*/

    //6章練習問題5
    /**
    int num, i, check = 0;
    printf("2以上の整数を入力してください。\n");
    scanf_s("%d", &num);
    for (i = 2; i <= num; i++) {
        if (num % i == 0) {
            check = 1;
            break;
        }
        else {
            check = 0;
        }
    }
    if (check == 0) {
        printf("%dは素数です。\n", num);
    } else if (check == 1) {
        printf("%dは素数ではありません。\n", num);
    }
    //*/

    return 0;
}

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

前回はテーブルを複数に分けてから結合して、項目を指定して表示させるということをしました。ゲレンデマスタIDとエリアマスタIDをjoin onでつなげました。
今日は演習問題を多く解きました。大問1はjoinでつなげる問題が出てきました。大問2はoffsetで上位、下位から何番までを取得する問題と、union、except、intersectで和集合、差集合、積集合を取り、表示させる問題でした。
まずはcreate table文でテーブルを作り、insert intoでデータを追加していきます。

create table リゾートサービスマスタ (
    ID integer,
    サービス名 varchar(20),
    エリア名 varchar(3),
    電話番号 Char(15)
    )

insert into リゾートサービスマスタ
values (1, 'アクアダイビングクラブ', '富戸', '(0557)-11-1111')

insert into リゾートサービスマスタ
values (2, 'コーラルリーフ&フィッシュ', '八幡野', '(0557)-22-2222')

insert into リゾートサービスマスタ
values (3, 'シーサイドクラブ', '大川', '(0559)-33-3333')

insert into リゾートサービスマスタ
values (4, 'マリンサービス', '菖蒲沢', '(0558)-44-4444')

insert into リゾートサービスマスタ
values (5, 'シーマンズクラブ', '大瀬崎', '(0559)-55-5555')

insert into リゾートサービスマスタ
values (6, 'スプラッシュリゾート', '浮島', '(0556)-66-6666')

insert into リゾートサービスマスタ
values (7, 'ダイビングパレス', '網代', '(0557)-77-7777')

insert into リゾートサービスマスタ
values (8, 'スキューバクラブ', '大瀬崎', '(0559)-88-8888')

insert into リゾートサービスマスタ
values (9, 'ダイバーズ アクアルート', '大瀬崎', '(0559)-99-9999')

insert into リゾートサービスマスタ
values (10, 'ブルーエリアクラブ', '宇久須', '(0558)-00-0000')

insert into リゾートサービスマスタ
values (11, 'マリン ガイド&ナビゲーション', '富戸', '(0557)-11-1111')

insert into リゾートサービスマスタ
values (12, 'アクアマリンサービス', '八幡野', '(0557)-22-2222')

insert into リゾートサービスマスタ
values (13, 'ダイバーズ イン&ストア', '大瀬崎', '(0559)-33-3333')

insert into リゾートサービスマスタ
values (14, 'サーフサイドクラブ', '大川', '(0559)-44-4444')

insert into リゾートサービスマスタ
values (15, 'シーハウス', '浮島', '(0556)-55-5555')

insert into リゾートサービスマスタ
values (16, 'ダイビングプロショップ', '大瀬崎', '(0559)-66-6666')

insert into リゾートサービスマスタ
values (17, 'アクアベースゾーン', '菖蒲沢', '(0558)-77-7777')

insert into リゾートサービスマスタ
values (18, 'サーフ&ダイビング', '富戸', '(0557)-88-8888')

insert into リゾートサービスマスタ
values (19, 'ドルフィンクラブ', '宇久須', '(0558)-99-9999')

insert into リゾートサービスマスタ
values (20, 'ダイビングハウス', '網代', '(0557)-00-0000')

次はselect文でデータの取得です。

select *
from リゾートサービスマスタ
where エリア名 = '大瀬崎'

select *
from リゾートサービスマスタ
where エリア名 <> '大瀬崎'

select *
from リゾートサービスマスタ
where エリア名 in ('富戸', '八幡野')

select *
from リゾートサービスマスタ
where エリア名 not in ('富戸', '八幡野')

select *
from リゾートサービスマスタ
where ID between 6 and 10

select *
from リゾートサービスマスタ
where ID >= 10

select *
from リゾートサービスマスタ
where 電話番号 like '(0557)%'

select *
from リゾートサービスマスタ
order by ID desc

select *
from リゾートサービスマスタ
where サービス名 like '%クラブ'

select *
from リゾートサービスマスタ
where サービス名 like '%マリン%'

select *
from リゾートサービスマスタ
where サービス名 like 'サーフ%'

次はテーブルのデータを更新と削除です。

update リゾートサービスマスタ
set サービス名 = 'シーサイドマリンクラブ'
where ID = 3

delete from リゾートサービスマスタ
where ID = 8

次はテーブルを分離させエリアマスタテーブルを作るときに参考にするためにエリア名が何種類あるかを表示させる命令です。

select distinct エリア名
from リゾートサービスマスタ
order by エリア名

次はエリアマスタテーブルを作り、データを入力していきます。

create table エリアマスタ (
    ID integer,
    エリア名 varchar(3)
    )

insert into エリアマスタ
values (1, '八幡野')

insert into エリアマスタ
values (2, '大川')

insert into エリアマスタ
values (3, '大瀬崎')

insert into エリアマスタ
values (4, '宇久須')

insert into エリアマスタ
values (5, '富戸')

insert into エリアマスタ
values (6, '浮島')

insert into エリアマスタ
values (7, '網代')

insert into エリアマスタ
values (8, '菖蒲沢')

エリアマスタのほうでエリア名を管理するので、リゾートサービスマスタにエリアIDを新たに追加します。そして、エリアIDの番号を上のSQL文にある8種類のエリアに対応するように値を追加していきます。

alter table リゾートサービスマスタ add エリアID integer

update リゾートサービスマスタ
set エリアID = 1
where エリア名 = '八幡野'
 
update リゾートサービスマスタ
set エリアID = 2
where エリア名 = '大川'
 
update リゾートサービスマスタ
set エリアID = 3
where エリア名 = '大瀬崎'
 
update リゾートサービスマスタ
set エリアID = 4
where エリア名 = '宇久須'
 
update リゾートサービスマスタ
set エリアID = 5
where エリア名 = '富戸'
 
update リゾートサービスマスタ
set エリアID = 6
where エリア名 = '浮島'
 
update リゾートサービスマスタ
set エリアID = 7
where エリア名 = '網代'
 
update リゾートサービスマスタ
set エリアID = 8
where エリア名 = '菖蒲沢'

次にリゾートサービスマスタからエリア名を削除します。

alter table リゾートサービスマスタ drop エリア名

そして二つのテーブルをつないで、もとの表を再現します。

select リゾートサービスマスタ.ID, サービス名, エリア名, 電話番号
from リゾートサービスマスタ
join エリアマスタ
on リゾートサービスマスタ.エリアID = エリアマスタ.ID
order by リゾートサービスマスタ.ID

問2は成績データ1と成績データ2の二つのテーブルを作り操作します。

create table 成績データ1 (
    学籍番号 integer,
    氏名 varchar(10),
    点数 integer default 0,
    備考 varchar(20) default '問題なし'
    )
 
insert into 成績データ1
values (20220401, '青山 はじめ', 50)

insert into 成績データ1
values (20220402, '赤井 とおる', 66)

insert into 成績データ1
values (20220406, '白川 のりこ', 45)

insert into 成績データ1
values (20220407, '茶山 ひとし', 66)

insert into 成績データ1
values (20220408, '灰川 みつる', 85)

insert into 成績データ1
values (20220409, '緑川 かおる', 52)

insert into 成績データ1
values (20220410, '桃井 ひろし', 87)
create table 成績データ2 (
    学籍番号 integer,
    氏名 varchar(10),
    点数 integer default 0,
    備考 varchar(20) default '問題なし'
    )

insert into 成績データ2
values (20220401, '青山 はじめ', 55)

insert into 成績データ2
values (20220402, '赤井 とおる', 89)

insert into 成績データ2
values (20220403, '黄川 さとし', 65)

insert into 成績データ2
values (20220404, '黒沢 まもる', 85)

insert into 成績データ2
values (20220405, '紺野 ただし', 90)

insert into 成績データ2
values (20220406, '白川 のりこ', 40)

insert into 成績データ2
values (20220407, '茶山 ひとし', 92)

insert into 成績データ2
values (20220408, '灰川 みつる', 75)

そしてデータの取得をします。

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 distinct 氏名
from 成績データ1
union
select distinct 氏名
from 成績データ2

select 氏名
from 成績データ1
except
select 氏名
from 成績データ2

select 氏名
from 成績データ2
except
select 氏名
from 成績データ1

select 氏名
from 成績データ1
intersect
select 氏名
from 成績データ2

となります。unionでunion allとせずに単にunionだけで和集合を取るときは重複が自動的になくなるみたいでdistinctはいらないようです。

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