専門学校25日目(情報工学科)5月17日(金)

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

教科書p.82-
演算子の種類
復習を兼ねて問題を見ました。

これは整数型の変数を二つ宣言し、商と余りを求める演算子を使っています。
int num1, num2;
num1 = 5;
num2 = 3;
num1/num2, num1%num2


visual studioをうまく使えない場合は、新しいプロジェクトから空のプロジェクトを選んで次へを押してください。ファイル名は拡張子を.cにします。またファイルの数を増やして、記述したmain関数(int main(void))が2つ以上になると実行時にエラーが出てしまいます。その場合は、1つのファイルにまとめて実行するコード以外はコメントアウトするとよいです。

p.84-
インクリメントとデクリメント演算子
a++;
a--;
変数aの値をそれぞれ1増やし、1減らす演算を行う。
どういうときに使うか。例えば100人のテストを採点し70点以上の人をカウントするときにインクリメントを使ったりする。
前置と後置
a++;とa--;が後置
++a;と--a;が前置。
後置は代入してから1増やす。前置は増やしてから代入する。
a = a + 1;
b = a;
が前置インクリメントで
b = a;
a = a + 1;
が後置インクリメントの値の増減の順番です。

p.88- 代入演算子
= はこれまでもよく使ってきました。これには+=、-=、*=、/=、%=などの複合代入演算子と呼ばれる演算です。これはJava基礎の授業でも習いましたね。
a += b; は a = a + b; と同じ演算です。
a %= 5;
ならaを5で割った余りをaに代入する。ここで気を付けることは、%=の%と=の間にスペースを入れてはいけないということです。

p.92- sizeof演算子
あまり使うことはないのでさらっと触れるだけです。
sizeof(int)など型を引数として入力し、型のサイズを出力する。

p.93- シフト演算子
数値を2進数で表した場合の桁を左、右に指定した数だけずらす。
2進数00101を2ビット左にずらすと10100となる。左にずれた分の空いたところには0が入ります。5から20に値が変化する。

101を2ビット右にシフトすると、あふれたビットは捨てるので001になる。これは10進数で1です。
左シフトは2倍、4倍、と値を増やしていく。
右シフトは1/2倍、1/4倍、値を減らしていく。
昔のコンピュータだと、シフト演算のほうが早かったが、最近は処理速度は上がっているので、普通の演算でも速度は十分によくなっている。そのため実社会ではあまり使うことはない。

p.96- 演算子の優先順位
a + 2 * 5は2 * 5が先に評価されます。
代入演算子は四則演算子よりも優先順位が低い。
同じ優先順位の演算子を同時に使った場合、四則演算では左から順に計算する規則になっている。このような順序を左結合という。逆に右から評価される演算子もあり、これを右結合という。代入演算子=は右結合。

p.100- 型変換
サイズの違う変数を演算したときどうなるか見ていく。一般にC言語では大きなサイズの型の変数に小さなサイズの型の値を代入できる。代入すると型が変換される。これを型変換といいます。
大きなサイズの型の変数を小さなサイズの型の変数に代入すると、小数点以下が切り捨てられたりします。つまり数値の一部が失われる。

キャスト演算子
型を変換することをコード中に明示的に書くことができる。
             (型)   式
inum = (int)dnum;
というように書く。ここではdnumをキャスト変換してinumに代入しています。
大きなサイズの型に変換することのほうが多い。
int a = 3;
int b = 2;
という状態で、
printf("%f", a / b);
出力するときにint型同士では1と出力されるが、
printf("%f", (double)a / b);
とすると、より大きな型(double型)に変換して小数を含めて出力できる。
int型とdouble型を計算するとdouble型になる。

 #include  <stdio.h>
int main(void)
{
    int d = 2;
    double pi = 3.14;
    printf("直径が%dセンチの円の\n", d);
    printf("円周は%fセンチです。\n", d * pi);
    return 0;
}

p.106- 同じ型同士演算する
(double)num1 / (double) num2は両方にキャスト演算子を付けていますが(double) num1 / num2でもdouble型とint型の計算で同じ結果を得ることができます。
最後に教科書の章末練習問題を解きました。先生の回答とは少し違います。

 #include  <stdio.h>
int main(void)
{
    //練習問題Lesson4
    //1問目
    /*
    int a = 0;
    int b = 4;
    printf("%d", a - b);
    */
    /*
    double d = 3.14;
    int e = 2;
    printf("%f", d * e);
    */
    /*
    int f = 5;
    int g = 3;
    double h = (double)f / g;
    printf("%f", h);
    */
    /*
    int i = 30;
    int j = 7;
    printf("%d", i % j);
    */
    /*
    int k = 7;
    int l = 32;
    int m = 5;
    printf("%f",(double)(k + l) / m);
    */
    //2問目
    /*
    double n;
    printf("正方形の辺の長さを入力してください。\n");
    scanf_s("%lf", &n);
    printf("正方形の面積は%fです。\n", n*n);
    */
    //3問目
    /*
    double o, p;
    printf("三角形の高さを入力してください。\n");
    scanf_s("%lf", &o);
    printf("三角形の底辺を入力してください。\n");
    scanf_s("%lf", &p);
    printf("三角形の面積は%fです。\n", (o * p)/ 2);
    */
    //4問目
    /*
    int q;
    printf("整数を入力してください。\n");
    scanf_s("%d", &q);
    printf("正負を反転すると%dです。\n", q * -1);
    */
    //5問目
    /*
    int num1, num2, num3, num4, num5, total;
    double ave;

    printf("科目1の点数を入力してください。\n");
    scanf_s("%d", &num1);

    printf("科目2の点数を入力してください。\n");
    scanf_s("%d", &num2);

    printf("科目3の点数を入力してください。\n");
    scanf_s("%d", &num3);
    
    printf("科目4の点数を入力してください。\n");
    scanf_s("%d", &num4);
    
    printf("科目5の点数を入力してください。\n");
    scanf_s("%d", &num5);

    total = num1 + num2 + num3 + num4 + num5;
    printf("5科目の合計点は%d点です。\n", total);

    ave = (double)(num1 + num2 + num3 + num4 + num5) / 5;
    printf("5科目の平均点は%f点です。\n", ave);
    */
    return 0;
}
Visual Studio 2022を開いてコードを貼り付ければコメントアウトを解除すれば実行できます。

中間テストは教科書の1章から5章までが出題範囲だそうです。今日で4章まで終わりましたので、あと2回の授業で5章まで終わらせます。


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

まずは練習問題をやりました。回答のコードだけ書いておきます。

CREATE TABLE 釣り場データ ( 
    ID integer,
    名前 varchar(20),
    所在地 varchar(6),
    竿 varchar(10),
    ボート varchar(3),
    テント varchar(3),
    バーベキュー varchar(3),
    ひとこと varchar(30)
    )

insert into 釣り場データ
values (1, 'レジーナの森フィッシングクラブ', '福島県', 'Yes', 'Yes', 'No', 'No', '森に囲まれた広い池で、思う存分楽しむ。')

insert into 釣り場データ
values (2, 'フィッシングリゾート姫木湖', '長野県', 'No', 'Yes', 'Yes', 'No', '緑あふれる森の池')

insert into 釣り場データ
values (3, 'フィッシングランド鹿島槍', '長野県', 'Yes', 'No', 'No', 'Yes', 'のんびりした自然の中で1日中楽しめる。')

insert into 釣り場データ
values (4, 'フライ・リゾート乗鞍', '岐阜県', 'Yes', 'Yes', 'Yes', 'Yes', '何でもその場で揃う便利さが魅力。')

insert into 釣り場データ
values (5, 'フライフィッシングエリア那須', '栃木県', 'Yes', 'No', 'Yes', 'No', '限りなく一般渓流に近い渓相。')


select *
from 釣り場データ
where 名前 like '%フィッシング%'


select *
from 釣り場データ
where 名前 like 'フィッシング%'


select *
from 釣り場データ
where ひとこと like '%池'


select 名前, 竿, ボート, テント, バーベキュー
from 釣り場データ


select id, 名前
from 釣り場データ
where 名前 like '%リゾート%'


select 名前, 所在地
from 釣り場データ
where ボート = 'Yes'


select 名前, ひとこと
from 釣り場データ
where 所在地 = '長野県'

練習問題を解いて先生のチェックが終わった人から教科書の以下のページの問題に取り組みました。できたところまでだけ書いておきます。

dokoqlのページからライブラリを選び第4版のところの付録から銀行口座データベースを選び、データベースを読み込みます。SQL文で操作するにはサインインが必要だと思います。

教科書p.451- の問題9-23と
p.457- の問題6-24
(p.451-の9-22までやりました)

select *
from 口座
where 口座番号 = '0037651'

select *
from 口座
where 残高 > 0

select *
from 口座
where 口座番号 < '1000000'

select *
from 口座
where 更新日 < '2023-12-31'

select *
from 口座
where 残高 > 1000000

select *
from 口座
where 種別 <> '1'

select *
from 口座
where 更新日 is null

select *
from 口座
where 名義 like '%ハシ%'

select *
from 口座
where 更新日 between '2024-01-01' and '2024-01-31'

select *
from 口座
where 種別 in ('2', '3')

select *
from 口座
where 名義 in ('サカタ リョウヘイ', 'マツモト ミワコ', 'ハマダ サトシ')

select *
from 口座
where 更新日 between '2023-12-30' and '2024-01-04'

select *
from 口座
where 残高 < 10000
and 更新日 is not null

select *
from 口座
where 口座番号 between '2000000' and '2999999'
or 名義 like 'エ__%コ'

6限目は教科書を進めました。
p.108- select文の修飾子
distinct
これは重複レコードを除外する
select distinct 列名 ...
from テーブル名
のように記述します。何種類のデータがあるかがわかりやすくなります。

select distinct 費目
from 家計簿

order by
これは並べ替えに使います。orderとbyの間に半角スペースが入っています。select文の最後にorder by句をつけます。
select レコード名 from テーブル
order by レコード名 並び順
ascで昇順、descで降順になります。

select *
from 家計簿
order by 日付 desc

複数のレコードを基準にした並び替え。レコードの数を2つ以上にして並び替えができる。入金額で降順に並べ替えして、入金額が同じデータはさらに出金額で降順に並べ替えして、、、とできます。

select *
from 家計簿
order by 入金額 desc, 出金額 desc

列(レコード)の番号を指定した並べ替え

select *
from 家計簿
order by 4 desc, 5 desc

のように書ける。レコードの4番目と5番目で並べ替えている。レコードの4番目が入金額、5番目が出金額ならそれで並び替えるということです。
SQLをチェックする場合は番号よりも文字で指定したほうがわかりやすい。

SQLでデータを抽出する場合、asc(昇順)やdesc(降順)を指定しないとプリンタなどで印刷する場合、並び方がどうなるかが保証されません。売上の高い順、金額順などorder byで並び替えをしてください。

offset-fetch
行数を限定して取得する。上位10件など。この修飾子だけ基本情報技術者試験では出ないようです。他の修飾子は出題されるようです。

select レコード from テーブル名
order by ...      (並び替え、例えば降順にしたとする)
offset 0 rows     (上から0行除外する、つまり除外はしない)
fetch next 3 rows only (上位3行を抽出する)
もしoffsetで2行除外していたら、3位から5位までfetchで取得することになる。

集合演算子union、except、intersect
データが増えると動きが遅くなる。そのため先月より前のデータは別に保存しておこうかとなる。それが家計簿アーカイブテーブル(dokoQL上のサンプルデータ)。その分けた複数のデータベースを操作する演算子になります。
unionは和集合、exceptは差集合、intersectは積集合

unionはor演算、どっちも対象にする
select 文1
union
select 文2

select 費目, 入金額, 出金額 from 家計簿
union
select 費目, 入金額, 出金額 from 家計簿アーカイブ

こんな感じで記述します。

select (レコード名) from 家計簿
union
select (1つ目のselectと同じレコード名と数にする) from 家計簿アーカイブ
order by 2, 3, 1

except

select 費目 from 家計簿
except
select 費目 from 家計簿アーカイブ

で交際費だけが抽出される。

intersect

select 費目 from 家計簿
intersect
select 費目 from 家計簿アーカイブ

繰返しになりますがselectで対象とするレコードと数は揃えなくてはいけません。ここでは費目の1項目で揃えています。

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