AB型の変わり者 三流プログラマー 業務の愚痴

[バックナンバー目次] [掲示板] [メルマガ登録・解除] [愚痴系TOPメニュー]

バックナンバー No.10 〜 No.14


[No.10 C言語 一文字入力、プログラムって?流れって? ]
[No.11 Excel使いに負けた日...ワークシート関数TRIM編]
[No.12 Access97 SP_CNV変更依頼...を題材にして]
[No.13 C言語 制御文IFその1 and 昔の話...]
[No.14 第二回 反省会?反響ランキング と クリック広告について]


No.10 1999/11/07
C言語 一文字入力、プログラムって?流れって?
[ページTOPへ戻る]
<C言語 一文字入力、プログラムって?流れって?>
目次 
1.はじめの挨拶
2.お前は、ソフトバンクのまわしものか?
3.一文字入力
4.プログラムって?流れって?
5.おわりの挨拶
----------------------------------------------------------------------------
/*
 * 1.こんにちは
*/
C言語の解説を待っていた方、お待たせしました。
今回、一文字入力とIf文を解説します。
サンプルや解説にキレがなかったら、
遠慮なく、ほどほどに、指摘メール・質問メール下さい。
^^^^^^^^^^^^^^^^^^^^^
↑日本語、変じゃねぇか?
 あっ、大丈夫・大丈夫、、今回の解説より変じゃないから、、、

わかったから、さっさと始めろよ、、、ハイ。

/*
 * 2.お前は、ソフトバンクのまわしものか?
*/

フリーのC言語コンパイラー、
LSI C-86 v3.30c 試食版、
C MAGAZIN(ソフトバンク)の付録CD中に
としか、書きませんでしたが、

下記の場所から、ダウンロードできますよ
とメールをいただきました。

エル・エス・アイ ジャパン株式会社
LSI C-86 v3.30c 試食版
http://www.lsi-j.ab.psiweb.com/freesoft/index.html

もしかして、Cマガ買ってしまった人、ゴメンナサイ。
でも、雑誌の記事、何かの役に立ったでしょ。。。
おいおい、開き直ったよ、、手がつけられないなぁもう。
正気に戻って、先に進みます。

/*
 * 3.一文字入力
*/
いきなり、
一文字入力のサンプルを以下に記述します。
( hosoku/010/test10.lzh にサンプル置いておきます )

ここでは標準関数getch()を使用しています。

filename : D:\NO10\TEST10_1.C

   1: /*
   2:  *  一文字入力
   3: */
   4: #include 
   5: #include 
   6: 
   7: /* メイン処理 */
   8: int main() {
   9: 
  10:     char    moji;           /* 文字変数宣言 */
  11: 
  12:     moji = getch();         /* 1文字入力 */
  13:     printf("入力された文字は[%c]です\n", moji);
  14:     printf("          codeは16進[%x] 10進[%d]です\n", moji, moji);
  15:     printf("          codeは16進[%X] 10進[%d]です\n", moji, moji);
  16: 
  17:     return 0;
  17: }

実行結果までの道のり、、、
まず、ソースファイルをメモ帳などで、作成します。
次に、DOSプロンプトから、前回作成したバッチファイル、
SETCを起動して、環境をセットします。
(Autoexecに組み込んだ人は、やらなくて、OKです)

D:\NO10>c:\setc
D:\NO10>PATH=C:\lsic330c\BIN;C:\WINDOWS;C:\WINDOWS\COMMAND
D:\NO10>set TZ=JST-9

次に、lcc test10_1.c と入力し、リターンキーを押します。
ソースファイルがコンパイルされます。
D:\NO10>lcc test10_1.c
lld @link.i

完成後、test10_1 リターンで、プログラムを実行します。
D:\NO10>test10_1

何か、キーを押すと、下記のようなメッセージがでます。
(ここでは、tキーを押した)

入力された文字は[t]です
          codeは16進[74] 10進[116]です
          codeは16進[74] 10進[116]です

解説
ア.インクルードファイルの指定
  ここでは、標準関数、printfとgetchを使用しているので、
   4: #include 
   5: #include 
  対応した、,を指定します。
  えっ何なんで?
  標準の関数を使うときは、指定しないといけないんですよ。
  そうなんだ、、とりあえず、決まりごととして、おぼえておくよ。
  どうも。
  あっ、なんで、getchって関数?だと、conio.hが必要ってわかるの?
  う〜ん、、、マニュアル・サンプルを見ると、書いてあるので、
  対応するヘッダファイルを選んでください。
  何か関数一覧なんて、あると、嬉しいんだけどなぁ、、、
  暇見て、探しておきますよ。
  ヨロシクネ。

イ.変数の定義
  キーボードから文字を受け取りたいので、
  10:     char    moji;           /* 文字変数宣言 */
  で、Char型の変数mojを定義します。

ウ.キーボードから、一文字受け取る
  getch関数を使用して(getchのリターン値で)、
  文字を受け取ります。
  12:     moji = getch();         /* 1文字入力 */
  変数mojiにgetch()の処理結果(キーコード)が入ります。

エ.結果表示
  結果を画面に表示します(変数mojiの中身を画面に出力)
  13:     printf("入力された文字は[%c]です\n", moji);
  14:     printf("          codeは16進[%x] 10進[%d]です\n", moji, moji);
  15:     printf("          codeは16進[%X] 10進[%d]です\n", moji, moji);
  これから、よく、お世話になるprintf関数で、結果を画面に出力します。
  %c --> コードに対応する文字を表示 
     (キャラクタコード表って、みたことありますか?)
  %x --> 16進数で値を表示
  %d --> 10進数で値を表示

簡単に書くと、こんな感じです。

枠外解説・グチ  --  おおスゴイと感動しましたか?面白いですか?

実際にやってみて、スゴイと感動しましたか?
感動まではいかなくても、好きですか?面白いですか?

いろいろな人に教えていて、わかりますが、
コンピュータが好き・プログラムが好きなヤツ・お嬢ちゃんほど、
飲み込み速いし、できるプログラマーになっていく気がします。
給料もらってやっているだけの職業プログラマー?だと、
なんか仕事も事務的なような。。。

いつも、遊んでいるテメエ(Ken3)より会社のためになってるって、、、
ごもっともなご意見です。。。

/*
 *  4.プログラムって?流れって?
*/
プログラムって言うと、何を思い浮かべますか?
競馬のレーシングプログラム、、、運動会のプログラム、、、など、、、

運動会のプログラムなどは、順番に上から下に進んでいきます。(競馬の出走順も)
・開会式
・100メートル走
・玉入れ
・昼休憩      ←あれ、もう昼?
・リレー
・閉会式      ←もう、終わり、、、騎馬戦ないの?...気にしないで、、

開会式から閉会式まで、上から下に、流れていきます。

一文字入力のプログラムも、下記のような順序で、流れてます。
・変数の定義(開会式?)
・一文字入力
・結果表示
・return 0; (閉会式?)
と、一直線に流れてました。

まぁ、通常は、そんな感じですが、
いつも同じことをするほど、(いつも同じじゃ、使えないでしょ)
プログラムは甘くなく、
変数の状態によってやること変えたり、(腹へったから、玉入れ中止、昼にする?)
繰り返したり、流れを組み合わせます。

ア.基本は、上から下に流れます。
  運動会のプログラムのように

イ.分岐する場合
  高校野球などのコールド試合(ルール知らないので、細かい点差、間違ってたら、、)
  通常は、1回から9回まで進みます。
  1回
  2回
   ・
   ・
  5回 ここで点差が10点以上ならコールドゲームで試合終了
   ・
   ・
  9回 得点の多いチームの勝ち 同点の場合は延長戦へ
  10回 どちらかが、多く得点を取るまで続く
   ・
   ・
    18回 引き分け再試合
  など、ある条件(ここでは、イニング回数と得点差ですね)
  で実行する作業(コールドなのか、、延長なのか、、再試合、、)
  を判断する。

ウ.繰り返し
  分岐と似ているのですが、繰り返し処理で(無限ループもある?)
  表現悪いですが、今風のたとえ話で、

  ストーカー君が好きな子に
  start
    ↓
  付き合ってください
    ↓
   イヤダ
    ↓
  ここで彼女は考える、そろそろ、警察につきだそうか、家族にそうだんするか
  (10回ぐらい付きまとわれた、、警察に相談-->ストーカー君end逮捕)
    ↓
  startへ戻るを繰り返す...
  (まったくストーカーってヤツは..頭の中の判断がおかしい、、、なんてね)

まぁ、冗談ですが、プログラムは、どんなものでも、
処理の流れ、分岐の繰り返し、組み合わせだと思います。

なんか、少し、ズレてる気がするけど、
今後のIf,while,forの講座を読んだ時、思い出してください。

/*
 * 5.おわりの挨拶
*/
メルマガで、図が書けないのが、ツライ。
図が書ければ、もうすこし、わかりやすく、説明できたんだけど。
じゃ、ホームページにGIFで載せたらイイジャン。
まだ容量、あまってるでしょ。
すぐわかる、言い訳こくなよコラ。
あっ、バレました?やっぱ。
実は、時間が無かったんですよ。。。すみません。次回は。。。

客先についたウソ・言い訳も、バレます、すぐに、、、
相手もそんなにバカじゃないんだし、、、
正直に話したほうが許してくれるかも?
(絶対に、許してくれないほうが多いと思うけど、、、)

新人君のついたウソも先輩にバレます(←これホント、新人さん達は注意してね)
Ken3「テストした?」
新人  「はい、しました」
Ken3「ハイ、これやり直し」(心の中で、うそつくなよ..真剣さが足りないんだよ)
ここでガツンと言いたい三流プログラマーのKen3でした。。。

では、また。。。 次回は、言い訳しないように、ガンバル(つもりです)


No.11 1999/11/08
Excel使いに負けた日...ワークシート関数TRIM編
[ページTOPへ戻る]
<Excel使いに負けた日...ワークシート関数TRIM編>
目次 
1.はじめの挨拶
2.それは、土曜出勤のことだった
3.「ExcelのTrim関数でできるよ」そんなバカな、、
4.飲み会でも、技術話?
5.おわりの挨拶
----------------------------------------------------------------------------
/*
 * 1.こんにちは
*/
こんにちは、今週も、始まりますね。(平和な一週間でありますように、、、)

今回は、先週土曜日、
Excel使いと戦って、負けた?ことを中心に書いていこうと思います。
*↑隣の部(データサービス)のやさしい部長さんです。
 負けたのに、飲み代も1000円だったしねぇ。

原因は、思い込みだったけど、、、う〜ん、くやしい。

前置きは、これくらいにして、そろそろ、始めます。

/*
 * 2.それは、土曜出勤のことだった
*/
先週、土曜日、出勤してました。
システム課のメンバー帰ったし、
一人になったので、メールチェックを行う。
*まったく、会社の設備を使って、、、とんでもないヤツだ。。。

おっ、メール来てるジャン。(チョット嬉しい)
なになに、がんばってください、、ハイ、ガンバリマスヨなんとか、
次は、
 >SP_CNV.MDBで姓と名の間に
 >半角スペースが複数存在(3個以上)する場合
 >全角スペースと半角スペースが混在する場合
 >全角スペースが複数存在(2個以上)する場合
 >はどう処理すれば良いでしょうか?
 >お知恵をお貸し下さい。
あっ、やられた、、、データの想定ミスだぁ。。。
確かに、半角スペースが3つだと、全角2つになってしまう。。
例)匿名   希望-->匿名□□希望
となってしまう。
ちぇ、またミスっちゃったなぁ。まぁいっかと思いつつ、帰る準備をする。

隣のデータサービス課(データパンチ関係の仕事してます)に
システム課帰りますと挨拶をしに行きました。2名まだ残ってました。

部長「あかしやき3人で食べに行かない?」と飲みの誘い。

何を思ったか、部長・スパーバイザーさんに、
「データ処理関係で、姓名間全角スペース一個とか指定って、よくあるんですか?」
と聞いたところ、
SP「よくあるよ、半角スペース2個じゃなくて、全角1つにしてとか」
と答えが返ってきました。
ここでやめときゃいいのに、
「半角の変換プログラムサンプルで作ったら、半角3つ入った時、処理できなくて」
と話を続けてしまった、、、

隣に座っていた、部長が一言、
「ExcelのTrim関数でできるよ」
と悪魔のささやき???(ほんとは、親切なので、天使の助言かな?)
これが、長い土曜日の始まりだった、、、

/*
 * 3.「ExcelのTrim関数でできるよ」そんなバカな、、
*/
心の中、で、できないでしょ、Trim関数じゃ、、、左右のスペース取るだけじゃないの?
と思い、「trimって、左右のスペース取るだけじゃないの?」と言葉の砲撃?
部長「じゃ、やってみよう」とパソコンの電源を入れる。
しばらくするとWin98のロゴ、
Excelを立ち上げて、データと関数を入れる。
   A列       B列
1 匿名   希望   =trim(a1)  --> 匿名 希望
2 匿名□□希望     =trim(a2)  --> 匿名□希望
あっ、なんで中のスペースが取れるの?と驚く。。。

心の中では、絶対できない、、、飲み代カケてもいいと思っていた。
(カケは勝って負けても嫌いなので、普段はやらないのですが、
 そんな私がカケけたくなるほど、自分の中では絶対の自信だった)

動揺しつつ、「半角3つを全角1つにしたいので」と言ってしまった。
Excel使いの部長には、なんでも無い攻撃で、
「=jis(trim(a1))でできる」
とあっさり、返された。

おみごと、、、でした。。。
Excel使いに負けた、、、と思いながら、飲みに行く。。。

枠外開設・グチ --- 思い込みとExcelワークシート関数

Excelワークシート関数とVBAの関数、
同名の関数でも動作が違うみたいです。
みなさんも、変な思い込みは無くして、相手の言葉を良く聞きましょう。
飲み代、カケなくてよかったなぁ、、、ほっとしてます。

だから、テメエは(思い込みの激しいKen3は)、
勝負ごと弱いんだよ。 
ハイ、了解。ゴメンネ。

ちなみに、VBAだと、真中のスペース取れません、安心?してください。
Sub Macro1()
    Dim a As String
    a = "匿名     希望"
    MsgBox Trim(a)
End Sub
だと、中のスペースはそのままで、表示されます。

Excelのテスト


VBAテストモジュール


テストのブックはここから
hosoku/011/index.html

/*
 *  4.飲み会でも、技術話?
*/
普通なら、3の敗戦で、マルマガ終わるんだけど、
飲み会でも技術話?の続きありました。

飲んでる時、やさしい部長より、
Excelで不思議な、質問、ありました。
IF(B5>"17:00","残業","")
だと、判断できないと、、、
って、飲んでる時、言われてもなぁ...
    B列    C列
5行 18:00 =IF(B5>"17:00","残業","")
6行 18:00 =IF(B6-"17:00">0,"残業","")
7行 18:00 =IF(B7>"17:00"+0,"残業","")
8行 18:00 =IF(B8>time(17,0,0),"残業","")

5行目の=IF(B5>"17:00","残業","")
ですんなり、できないみたいです。
なんか、あってる?ぽいけどなぁ。
で、
苦肉の策?で、
6行目の=IF(B6-"17:00">0,"残業","")
みたいに、17時を引いて、0以上だったら
に式を変更したらうまくいったらしいです。

また、7行目みたいに、+0(なんで0たすの?)
を入れると、思い通り、動作します。

その時、飲んでたので(言い訳?)
#17:00#と囲えば、=IF(B5>#17:00#,"残業","")
日付型になるからOKでは
と答えたのですが、本日、やってみたら、これは、ウソでした。
*#はVBAだけみたいです、、、ワークシート上はエラーになります。

お返しをしようと、#で囲うを教えたんだけど、、また、裏目でした。
だから、確認してから、答えようよ、、はいはい。。。

話は、戻って、
キレイ?に書くと、8行目のTime関数を使って、
時間(シリアル値)を返して、比較するのが良いみたいです。

"17:00"だけだと、時間と文字列を比較するので、ダメ。
b5(時間) - "17:00"(文字列)は、自動的に時間の引き算してくれるのでOK
"17:00"(文字列) + 0(数値)は、なぜか結果が時間になる?のでOK
お行儀よく書くなら、Time関数を使ってtime(時,分,秒)を使います
*VBAのタイム関数とは、動作が違うので、注意してください。

枠外解説・グチ -- Excel97...もう少し賢ければ、、
Excel2000だと、=IF(B5-"17:00">0,"残業","")で良いかもしれないので、
インストールしている人は、結果、教えてください。
ken3のExcel97では、ダメでした。

VBA 日付型 (Date) ヘルプから、引用
---
日付型 (Date) の変数は、IEEE 64 ビット (8 バイト) の浮動小数点数の変数です。西暦 
100 年 1 月 1 日〜西暦 9999 年 12 月 31 日の範囲の日付と、0:00:00 〜 23:59:59 の
範囲の時刻を表すことができます。日付型の変数には、日付リテラルとして認識可能な任
意の値を代入できます。日付リテラルの形式は、#1993 January 1# または 
#93 Jan 1 # のようにシャープ記号 (#) で囲む必要があります。

ワークシート関数 TIME のヘルプから、引用
----
指定された時刻に対応するシリアル値を返します。計算結果のシリアル値は、0 〜 0.
99999999 の範囲にある小数値で、0:00:00 (午前 0 時) から 23:59:59 (午後 11 時 
59 分 59 秒) までの時刻を表します。
書式
TIME(時, 分, 秒)
時   時を表す数値を 0 〜 23 の範囲で指定します。
分   分を表す数値を 0 〜 59 の範囲で指定します。
秒   秒を表す数値を 0 〜 59 の範囲で指定します。
使用例
ダブル クォーテーション (") は、戻り値が文字列であることを表します。
TIME(12,0,0) = 0.5 (正午に対応)
TIME(16,48,10) = 0.700115741 (午後 4 時 48 分 10 秒に対応)

/*
 * 5.おわりの挨拶
*/
長い?土曜日が終わって、日曜日、メルマガ書いてます。

ぜったいできる、、、と言って飲み代かけなくて、
よかったなぁ、、の結果レポートでした。
*何かの参考になれば、幸いです。。。

なんか、疲れが貯まったような。
まぁ、飲み代1000円で、いろいろな発見あったし、良かったかな?
でも、飲んでる時は、楽しい話をしましょうよ、、技術話じゃなくて。
やさしい部長に感謝の三流プログラマーKen3でした。。。

では、また。。。 次回は、Excel使いに勝った話をしたいですねぇ。
*今度は、今風・流行り言葉のリベンジだぁ〜、、、と変な気合を入れる。
  返討ちにあわないでね、、、はい。。。


No.12 1999/11/09
Access97 SP_CNV変更依頼...を題材にして
[ページTOPへ戻る]
<Access97 SP_CNV変更依頼...を題材にして>
目次 
1.こんにちは
2.現バージョンの考え方と問題点
3.問題点を考慮した、新バージョン
4.おわりの挨拶
----------------------------------------------------------------------------
/*
 * 1.こんにちは
*/
こんにちは。
匿名さんより、Access関係で出したサンプル、
SP_CNVの質問、いただきました。

質問内容
>漢字の時は「匿名 希望」姓と名の間は全角スペース一つで、半角(ア
>ルファベットの場合(Tokumei Kibou)、半角カタカナ(トクメイ キ
>ボウ(半角カナだと文字化けしますので、全角で表記します))の場合
>は姓と名の間に半角一つにする場合のやり方を教えて下さい。
>お願いします。

今回は、これを題材にして、
いつものように、AB型で気分屋のKen3が、一人二役で回答します。
*別なやり方を思いついた人、
 イヤこれは違う、、と一緒に毒舌したい人は、
 メール送ってください。

またまた、C言語から離れてしまった、、、、、、、

/*
 * 2.現バージョンの考え方と問題点
*/

No.006で書いたサンプル、簡単に説明します。
----
Public Function SP_Cnv(moji) As String
    Dim n As Integer
    Dim RET As String
    Dim ChkString As String
    
    RET = "" 'リターン値の初期化
    
    '文字数分ループする
    For n = 1 To Len(moji & "")
        ChkString = Mid(moji, n, 1)
        If ChkString = " " Then '半角スペースかチェック
            RET = RET & " " '全角スペースをプラスする
            If Mid(moji, (n + 1), 1) = " " Then '次の文字がスペースがチェック
                n = n + 1  'ループカウンタを小細工
            End If
        Else
            RET = RET & ChkString 'スペース以外の時、そのままプラスする
        End If
    Next n
    
    SP_Cnv = RET
End Function
----
関数の処理イメージとしては、
受け取った文字を左から1文字毎調べ、
半角スペースなら、全角スペースに置き換えます。
同時に、半角2個を全角1つにしたいために、
次の文字が半角か、チェックして、半角の場合、文字を飛ばしています。
----
この方法だと、以下の問題点か発生します
ア.半角スペースが3つの時、間の全角が2つになってしまう
  例)匿名   希望 --> 匿名□□希望
         123
  あっ、あれ、、、なんで?
  アレじゃねえだろ、、、データが半角1つか2つとしか考えてねぇから、
  3つの場合、全角2つに変換されちゃったんだろ、、、
  もっと、実際のデータは汚い?って考えなきゃ
イ.せっかく英字は変換されないのに、スペースは全角になる
  英字や半角カナを漢字に変換したくないために、
  strconv(a,vbwide)関数使わないで関数を自作しているのに、
  間のスペースが全角になってしまう
  例)Kibou Tokumei --> Kibou□Tokumei
  あっ、良く考えたら、抜けてますね。
  抜けてますねじゃねぇだろ、、、チョット考えれば(使用者の立場になって)
  わかるだろ、、、

/*
 *  3.問題点を考慮した、新バージョン
*/
う〜ん、、データって、奥が深いな、、と思いつつ、
問題点を考慮した処理を考える。
---
発想を半角スペースを見つけたら、全角スペースに置き換え処理をしよう
から
半角・全角スペースどちらか見つけたら、
氏名を、姓と名に分ける
間に半角・全角どちらを入れるか判断するために、
一番左側の一文字を取りだし、サイズを判断。
サイズが1なら、半角カナ・英数字と判断し、
半角スペースに、、2バイト(漢字)なら全角スペースにする
間に一つスペースを+し、文字列を完成させる。
に発想を変えます。
下記に変換後のサンプルを載せます。

--- ホームページに圧縮して置いておきます。よかったらダウンロードしてください。

Public Function SP_Cnv(moji As Variant) As Variant
    
    Dim n As Integer        'ループカウンタ
    Dim RET As Variant      'リターン値
    Dim ChkString As String 'チェックする文字
    Dim strSEI As String    '姓
    Dim strMEI As String    '名
    Dim strSPC As String    'スペース
    
    RET = moji 'リターン値の初期化
    
    '文字数分ループする  途中で、スペースが現れたら、分割処理を行う
    For n = 1 To Len(moji & "")
        ChkString = Mid(moji, n, 1)
        '半角スペース 及び 全角スペースかチェック
        If ChkString = " " Or ChkString = " " Then
            '姓名を分ける
            strSEI = Trim(Left(moji, n)) '左からn文字切り取り、空白を取って代入
            strMEI = Trim(Mid(moji, n, 255)) 'n文字目から255文字切取り空白を取る
            '漢字で入力されているか、チェックし、スペースの種類を判断
            '左側の一文字を取りだし、バイト数を判断、、、
            If LenB(StrConv(Left(strSEI, 1), vbFromUnicode)) = 1 Then
                strSPC = " "    '半角スペースを代入
            Else
                strSPC = " "   '全角スペースを代入
            End If
            RET = strSEI & strSPC & strMEI  'スペースをプラスし、リターン値を作る
            Exit For    '処理を抜ける
        End If
    Next n
    
    SP_Cnv = RET

End Function
---
で、できるの?
た、たぶん。。。できます。
今、言っていい?
はい、どうぞ、
3つに区切られてたら、どうなるの?
例)Tokumei Kibou Desu
氏名なんだから、、日本人は大丈夫でしょうキット。。。
*サンプル作ってから、また、気が付きました。
---
newconv.lzh
---
枠外解説・グチ -- LenB , Unicode
a="漢字"
? lenb(a) --> 4バイト、、当然でしょ
b="KA"
? lenb(b) --> 4バイト、、なんで?
私、ハマリましたが、有名な話みたいですね。

?マークの人は、Unicode、ヘルプで見てください。
勉強になりますよ。。。

なんでテメエが解説しないんだ、あっ、手間取りそうだからだろ?
バレました、、、今日はこのへんでカンベンしてください。。。
(どうしても?の時は、メールでリクエストしてください)

PS. IsNull関数があって、IsKanji関数が無いのは、、
    作ってほしいなぁ、、それとも、私の見落とし?

/*
 * 4.おわりの挨拶
*/
 素朴な疑問、これは、コッチの方がいいですよなどのアドバイス、
 何かありましたら、気軽に
 まで、メール下さい。

 新たな、毒舌まってます。 Ken3より
 では、また。。。

 次こそは、Cの講座(If)始めるぞ、、、
 *おいおい、いまさらそんなこと言っても、みんな、あてにしてないって....
  Access VBAこのまま続けたほうがいいって、
  そのうち言われるよキット。。。


No.13 1999/11/10
C言語 制御文IFその1 and 昔の話...
[ページTOPへ戻る]
<C言語 制御文IFその1 and 昔の話...>
目次 
1.はじめの挨拶 二兎を追うものは、一兎も〜
2.if文の文法?
3.if文(条件分岐) 例)文字の判断
4.if,else文(条件分岐) 例)Y,y の判断
5.おわりの挨拶
----------------------------------------------------------------------------
/*
 * 1.こんにちは
*/
C言語の解説を待っていた方、お待たせしました。
やっと、今回、制御文Ifの一回目?を解説します。
サンプルや解説にキレがなかったら、
遠慮なく、ほどほどに、指摘メール・質問メール下さい。
^^^^^^^^^^^^^^^^^^^^^
AccessやVBAの方が興味がある?
そんなこと言わないで、こちらのほうも、見てください。
*C言語興味がない方は、グチ・激論?だけでも読んでください。

オマエ、二兎を追うものは、一兎も〜。。。って言葉知ってる?
知ってるよ、、、う〜ん、、今後、どうしよう?

まぁ、先のことは、後で考えましょう、、、そろそろ、始めよ。。。

/*
 * 2.if文の文法?
*/
if文のイメージを下記に書きます。
*コレだけじゃないんだけど、、、数回に分けて説明します。

  if文の文法

  if( 条件 ) {
     条件が真の時
  } else {
     条件が偽の時
  }

  if(a==10) {
	printf("aは10です");
  }

  if(a < 100) {
    printf("100未満です");
  }

  if(a == 5 && b == 7) {
    printf("aが5でbも7です");
  }

  if(a == 5 || b == 7) {
    printf("aが5 か bが7 です");
  }

  && −−−> AND
  || −−−> OR
  == −−−> =
  <
  <=
  >
  >=
  !=
って、ざっと書いても?マークだと思うので、
今回から数回、サンプルを説明するので、感じを感覚でつかんでください。

/*
 * 3.if文(条件分岐) 例)文字の判断
*/

一文字入力して、入力された文字を判断し、
結果を画面に表示させます。

filename : D:\NO12\TEST12_1.C
-----
   1: /*
   2:  *  if文(条件分岐)
   3:  *  例)文字の判断
   4: */
   5: #include 
   6: #include 
   7: 
   8: /* メイン処理 */
   9: int main() {
  10: 
  11:     char    moji;           /* 文字変数宣言 */
  12: 
  13:     moji = getch();         /* 1文字入力 */
  14:     printf("入力された文字は[%c]です\n", moji);
  15: 
  16:         /* 数字判断 */
  17:     if('0' <= moji && moji <= '9') {
  18:         printf("この文字は数字です\n");
  19:     }
  20:         /* abc..判断 */
  21:     if('a' <= moji && moji <= 'z') {
  22:         printf("この文字はアルファベットの小文字です\n");
  23:     }
  24:         /* ABC..判断 */
  25:     if('A' <= moji && moji <= 'Z') {
  26:         printf("この文字はアルファベットの小文字です\n");
  27:     }
  28:     return 0; 
  29: }
-----
実行結果 
入力された文字は[5]です
この文字は数字です
-----
簡単な解説
  11:     char    moji;           /* 文字変数宣言 */
キーボードから文字を受け取るため、変数を定義します。

  13:     moji = getch();         /* 1文字入力 */
  14:     printf("入力された文字は[%c]です\n", moji);
標準関数Getchを使用して、一文字受け取ります。
 
  16:         /* 数字判断 */
  17:     if('0' <= moji && moji <= '9') {
  18:         printf("この文字は数字です\n");
  19:     }
ここでは、入力された文字が0以上9以下か、ききます(判断します)
ポイントは、'0'とシングルコーテーションで囲っているところです。
詳しくは、後日説明するので(またかよ)、
なんとなく、イメージでおぼえてください。

  20:         /* abc..判断 */
  21:     if('a' <= moji && moji <= 'z') {
  22:         printf("この文字はアルファベットの小文字です\n");
  23:     }
同様に、入力された文字がa〜zかききます(判断します)

  24:         /* ABC..判断 */
  25:     if('A' <= moji && moji <= 'Z') {
  26:         printf("この文字はアルファベットの大文字です\n");
  27:     }
同様に、入力された文字がA〜Zかききます(判断します)

簡単に書くと、こんな感じです。

枠外解説・グチ1  --  「きく」ってなに?

なにげなく、AがNullかきいて、その結果で判断、、、
なんて、会話してるけど、新人さんにとっては、???みたいですね。
先輩達の会話が違和感なく聞けるようになったら、一人前?。

コンピュータに聞くわけじゃないのに、ねぇ、、、
あっ、もしかして、うちの会社だけの方言?で、
一般的なソフト会社は、普通に
もし、AがNullだったら...とわかりやすい標準語シャベルノカナぁ?

会社によっての方言、、、いろいろありそうで、面白いかも?
テメエはナマリがひどすぎるって、、、ハイハイ。。
標準語話すように、努力しますよ。。。

枠外解説・グチ2  --  不等号の書き方、、、

これも、私の、変なクセの話ですが、
aが20〜の時を普通の人が書くと、
if( a > 20 ) {
なのですが、私の場合、
if( 20 < a )とよくします。
逆の20より下は、みなさんと同じで、
if( a < 20 )です。

>向きの不等号、、なぜか、嫌いなんですよ。
例題で、
if('0' <= moji && moji <= '9') {  // 0よりmojiが大きく9より小さい
と書きましたが、
if(moji >= '0' && moji <= '9') {  // mojiが0より大きく9より小さい
とちらも、大差ないのですが、なんか<の向きをそろえるへんなクセついてます。
教科書の書き方は、変数 比較演算子 定数 ですよねキット。

さすがに、
if( 0 == a ) とは書きませんが、、if( a==0 )ですね。。

みなさんは、どうでしょうか?
面白い話、あったら、聞かせてください。

/*
 *  4.if,else文(条件分岐) 例)Y,y の判断
*/
filename : D:\NO12\TEST12_2.C
-----
   1: /*
   2:  *  if,else文(条件分岐)    
   3:  *  例)Y,y の判断
   4: */
   5: #include 
   6: #include 
   7: 
   8: /* メイン処理 */
   9: int main() {
  10: 
  11:     char    moji;           /* 文字変数宣言 */
  12: 
  13:     moji = getch();         /* 1文字入力 */
  14:     printf("入力された文字は[%c]です\n", moji);
  15: 
  16:     if(moji == 'Y' || moji == 'y') {
  17:         printf("入力されたのはYです\n");
  18:     } else {
  19:         printf("Y以外の文字が入力されました\n");
  20:     }
  21:     return 0;
  22: }
-----
実行結果 
入力された文字は[y]です
入力されたのはYです
-----
簡単な解説
  11:     char    moji;           /* 文字変数宣言 */
キーボードから文字を受け取るため、変数を定義します。

  13:     moji = getch();         /* 1文字入力 */
  14:     printf("入力された文字は[%c]です\n", moji);
標準関数Getchを使用して、一文字受け取ります。

  16:     if(moji == 'Y' || moji == 'y') {
  17:         printf("入力されたのはYです\n");
  18:     } else {
  19:         printf("Y以外の文字が入力されました\n");
  20:     }
入力された文字がY,yか聞きます
(もし、変数mojiの中身が、Yかyだったら)
メッセージprintf("入力されたのはYです\n");を出力します。
それ(Y,y)意外のときは、printf("Y以外の文字が入力されました\n");
と表示します。

文字・文字列について(後日)、詳しく解説したいと思います。
テメエの解説は、政治家みたいに、先送りが多すぎるよ、、
この場で決着つけてほしいなぁ、、、
かんべんしてくださいよ、、、

枠外解説・グチ --- 昔話を一つ、、、NEC98のカナキー、、、、

その昔、C言語で工場関係のシステムを作ってました。
(コンベアを動かして、RS−232Cから重量実績データを受け取る)

で、「よろしいですか?(Y/N)」って、処理が実行前の確認で
ありました。
プログラムを今回の説明みたいに、
if(moji == 'Y' || moji == 'y') {
で組んでました。

オチ、わかった方もいると思いますが、
ある日、どうしても実行できないと問い合わせがあり、
電話対応でも原因がわからなくて、客先に行ってみました。
なんと、
カナキーが押してあり(ロックされていて)
Yじゃなくて、ンが返っていたんですね。。。
*なんとなく、怒る気にもなれなかった、、、、

それ以来、Yes,No確認は、
if(moji == 'Y' || moji == 'y' || moji == 'ン') { // ホントはンは半角
するようになりました。

世の中、何が起こるか、わかりませんね。。。
*これも、テメエの想定ミスだろ、、、

/*
 * 5.おわりの挨拶
*/
今回、簡単なIfの例を2つでした。
説明よりもグチ解説のほうが長かった気もしますが、、、

今日は、このへんで、、、
では、また。  グチの多い(一言多い)三流PGのKen3でした。


No.14 1999/11/11
第二回 反省会?反響ランキング と クリック広告について
[ページTOPへ戻る]
<第二回 反省会?反響ランキング と クリック広告について>
目次 
1.はじめの挨拶 
2.タイトルに偽りあり?ジャロに言うぞ・・・進め方編
3.Access97 SP_CONV編
4.今後、やってほしい、要望
5.クリック広告?について、、、相互リンク、広告?
6.おわりの挨拶
----------------------------------------------------------------------------
/*
 * 1.こんにちは
*/
今回は、メールで送られてきた、感想・苦情・要望をまとめ、
第二回 反省会?反響ランキング の発表(お知らせ)
と
友人が始めたクリックするとお金が入る?(どんなしくみだ?)
について、、、書きたいと思います。

あっ、私も、まぐクリックに申し込んでしまった、、、
だから、人のこと、あまり言えないんだけど、、、

さて、変なのが出てこないうちに、はじめますか。。。
*変なのって?....始めての人は、バックナンバー見てからのほうが
 わかりやすいかも。。。

/*
 * 2.タイトルに偽りあり?ジャロに言うぞ・・・進め方編
*/
まず、始めは、細かい話ですが、
タイトルに偽りあり?ジャロに言うぞ・・・進め方編です。

このメルマガのタイトル
三流プログラマーのプログラム講座
なのですが、本人言うのも何なのですが、あまり講座、うまくないです。
*あれ、認めちゃうの?今日は、素直だねぇ、、、

また、どの言語がメインか、、、と質問されても。。。

メールでいただいたのが、
・C言語をやるのか、AccessやVBAをやるのか、ハッキリさせてほしい。
 なんか、中途半端で読みにくい。
 --->う〜ん、、、私が、集中力無いので、いろいろ手をつけちゃって、
    混乱してる人は、すみません。
     火曜日はC,金曜日はVBAなど、決めればいいのかもしれませんが、
      このまま、来た話題を優先に続けていこうと思います。
・2・3日貯めて、濃いのを出したら
 --->一瞬、変な想像したのは、私だけ?
    そんなこと書いてると、女性読者無くすぞ、、
     なんのこと?、二・三日考えて、内容の濃いメルマガにしてください
      って、ことでしょ?
       ダメだよ、変な想像しちゃ???
・教え方がヘタ、他のメルマガ見て、研究したら?
・私は、C言語できるので、なんとなくわかりますが、
 はじめての人には、変数や書き方、コンパイルとは、
 もっと丁寧に行ったほうが
  --->他のメルマガみて、勉強?しました。
    私のより、丁寧・親切に書いてあります。はい。
     そちらで勉強して、ここも見るってのは、どうでしょうか?
      私の悪いメルマガ・プログラムの作りを反面教師にしたり、
       いろいろな見方があるんだなぁ、、と思っていただけると。
・愚痴解説をメインにしたら?タイトルも三流PGの愚痴にして
 --->ははは、そうですよね。
    説明はイマイチだけど、愚痴は面白いなんてメールもありました。

*タイトル、今のところ、このままで行きますが、
 何かこのメルマガに合ったタイトル、ギンゴン!と思いついた方は、メール下さい。
 あと、ジャロに言わないでね。。。

/*
 * 3.Access97 SP_CONV編
*/
Access97のSP_CONVが変、、、いろいろ、ありました。
時間をさいて、サンプルくれたり、調べてくれたり。
みんさんには、感謝です。

これぐらいのサンプルプログラムでも、データの想定など、
いろいろあることを知っていただけたら、、と思います。
*読者より先に、テメエが勉強になっただろ、、、ハイ。

サタンさんより、SP_CNV関数の修正版をいただきました。
(テンシさんって書いてくれればいいのに、、、)

コメントの付け方や、変数名がプロっぽいと感じました。
おいおい、お前も、プログラム作って会社から給料、お客から金取ってんだから、
プロだろ、、もっとしっかりしろよ。。。はい。。。

以下、サタンさんのメールを引用します。参考にしてください。
*足りない部分を解説とありましたが、そのまま載せます。
 この場をかりてサタンさんへ「どうもありがとうございます」
-----
・3つに区切られていた場合とか
・一文字ずつの空白のチェックとか
・255以上の文字列の場合とか
気になる部分をいろいろと改善して私が関数を作ってみました。
一応、関数名は変えておきましたが・・・。

Public Function xSP_Cnv(moji As Variant) As Variant

    Dim n As Long           '空白の文字位置
    Dim strSPC As String    'スペース

    Dim strMoji As String   '編集文字列
    Dim strLeft As String   '空白より左側の文字列
    Dim strRet As String    'リターン値

    '文字列の前後の空白を削除し、最初の1文字目が漢字で入力されているかを
チェックし、
    'スペースの種類を設定します。
    If LenB(StrConv(Left(Trim(moji), 1), vbFromUnicode)) = 1 Then
        strSPC = " "                        '半角スペースを代入
    Else
        strSPC = " "                       '全角スペースを代入
    End If

    strMoji = Trim(moji)    '編集対象文字列に代入
    n = InStr(StrConv(strMoji, vbWide), " ")   '空白の文字位置をチェック
    If n <> 0 Then
        strRet = Left(strMoji, n - 1)           '左からn文字切り取りリターン
値を作る
        strMoji = Trim(Mid(strMoji, n + 1))     'n文字目以降の文字をから空白
を取り編集文字列へ
        Do While InStr(StrConv(strMoji, vbWide), " ") <> 0
            n = InStr(StrConv(strMoji, vbWide), " ")
            '空白の前後の文字列を分ける
            strLeft = Left(strMoji, n - 1)      '左からn文字切り取り、空白を
取って代入
            strMoji = Trim(Mid(strMoji, n + 1)) 'n文字目以降の文字をから空白
を取り編集文字列へ
            strRet = strRet & strSPC & strLeft  'スペースをプラスし、リター
ン値を作る
        Loop
        strRet = strRet & strSPC & strMoji      'スペースをプラスし、リター
ン値を作る
    Else
        strRet = strMoji
    End If

    xSP_Cnv = strRet

End Function
-----
モジュールを貼りつけるときは、コメントが改行されてるので、
注意してください。

次からの例題モジュールは、データとかエラー処理をよく考えて、
いいもの作ろう、、、
はじめからその心だったら、よかったのにね。
チョットできると思って、天狗になってんじゃないの?
そうかなぁ?

/*
 * 4.今後、やってほしい、要望
*/
今後、やってほしい要望として、
・初心者をみすてないで  ---> 私の教え方が悪くって、、見捨ててませんよ
・VCってなに? ---> 私もC++勉強しないと、、Cしか知らないんですよ
・mswinsck.ocx を使ったpop3メールチェッカー --> 難しそう、、できたら感動しそう?
・C++Builderを題材にして頂きたい ---> Ver1.0のCD会社で寝てるので起きたら?
・AccessからExcel/Wordをコントロールしたい ---> いいですねぇ、楽しそう?
・VC6.0を頭から、、 ---> どこを頭って言うのか、、、一緒にやりますか?
なんて、イロイロ要望をいただいてますが、
 全てやりましょう?とは、言えないので、
  落ち着くまでは、C言語・VBA・・いつもの業務関係をからめた愚痴
   の三本柱で行きたいと思います。

VBA関係でこんなサンプルほしいなど、ありましたら、
 メール送ってください。

/*
 * 5.クリック広告?について、、、相互リンク、広告? 
*/
長々と反響に付き合っていただいて、どうも。
ホント長いよねぇ、いつも。 ほっといてよ。。
話を本題に戻して、
友人が1クリックしたらポイントが貯まって、
お金がもらえるシステム(換金される)を始めました。
http://click.gaiax.com/home/kanaaki/main
暇な人は、ホームページの上の広告をクリックしてあげてください。
ヨロシクお願いします、では。。
って言って終わりじゃなくて、

ここからいつものKen3のモードです。
ここで、人間は、魔が差す(漢字いいのかなぁ?)
ヤクザが公衆電話から、変造テレカを使用して、
自分自身のQ2の番組に電話をかけて、
NTTからお金をむしりとるみたいに、
まず、自分でクリックしたら、どうなる?
を考えますよね。。。
その次に、友達同士で押し合ったら、どうなる?
さらに進むと、機械任せで、自動的にクリックできないか?
など、楽して儲けようと考えます。
まぁ、しょうがないかなぁ?

でも、広告主の人は、、、クリック数が上がっているのに、
売上が上がらない、、、バナー広告なんて、意味が無い、、、やめよう
と自然な流れになってしまうんじゃないかと、他人事ながら、心配です。
*毎日、せっせと自分のページクリックしたけど、
 お金を換金する段階で、広告会社がツブレるとか、、、
**毎日クリックにかける時間で(時間で)
   得られるお金を割ったら、時給いくらになるのだろう?

ヤクザみたいに、悪魔に魂をうって、
悪いことしないと、もうからないのでしょうね。キット。

で、終わればいいのに、何を思ったか、
悪魔の手助けツール(自動クリックツール)
できないか、昨晩、いろいろ試してしまった。。。
まだ、私の実力では、作れないので、安心でした。
*オイオイ、やろうとする心が問題でしょ。。。

マグマグにも、まぐクリックってのが12月から始まります。
ここでも、やめればいいのに、申し込んでしまった。

はやく寝れば、いいのに、システム屋さんのクセで(私個人のクセ?)
チョット疑問点を考えてみた。

ヘッダに配信するだけで、0.2円から0.5円....
えっと、読者数が今、おかげさまで900だから、
0.2*900で、一回180円か、、、

ここで、悪魔のささやき?
一回に送る量を減らして、一日2回配信しようか?
また、訂正号なんて、白々しく作って、同様の内容を配信し、二重取り?
まぁ、こんなメルマガは、読者からも見放されたり、タレコミ?
があって、廃刊でしょうねキット。
でも、正直者が本当に間違えて訂正号送りたかったり、
配信システムのミスだったら?
このへんのシステムは、どうなっているのだろう?

お前の考えは、小学生なみの、二期作(社会かなぁ?)か、、、
品種を改良して、1回に取れる量を増やす
(魅力あるメルマガで読者を2倍にする)
は、考えないのかよ。もっとマトモにさ。。。

広告主さんへ、このシステムは、メルマガを読む時、必ず開くので、、
チョット待った、、、必ず?どこかで、イタイ目みた言葉だなぁ。。。
こんなヤツ居ないけど、無料の転送アドレスを200個用意する。
自分自身のメルマガを登録し、メールボックスがあふれないように、
受信だけする。。。キタネエなあ。
じゃ無料アドレス5000個、0.2円で一回1000円かよ。
*まぁ、そんなに登録できないと思うが、
 自動クリックシステムよりは、メルマガ読者自動登録は簡単そうだから、、、

Aさんは、メルマガを30誌取ってました。
同じ広告が入ってるんだよな、、なんてことは無いのかなぁ?
3000人に送ったつもりでも、実際に受け取る人は、100人*30誌だったりして
広告の効果って、、、まぁ、配送先のアドレスがダブらない、
システムができてるんだろうけどね。。。
*テメエが考えることは、一流のSEさんたちが考えてるから、
 ヨケイナ心配しなくて、いいんだよ。
 内容がツマラナくて、読者数が減る現実の心配したほうがいいんじゃない?
 ごもっともなご意見です。

抜け道が無いように?して、広告主さんを大事に、
NTTみたいに、
公衆電話からはQ2ダメ(無料のアドレスの発送はカウントしない)
や
5000円のテレカ禁止(一回の広告料の上限は1000円)
みたいに、ならないことを祈ってます。

ここに書いてない、取っておきのウラワザ教えてくださいって、、、
そんなの無いよ、、、そんなの考えるなら、
面白いメルマガ作って、まともに稼ごうよ。

以上、ヨケイナお節介の独り言でした。
*テメエには、0.2円も儲けさしたくない、、、解除だ。。
  そんなこと言わないで、、、、

/*
 * 6.おわりの挨拶
*/

あと、少しで読者1000名行きます。
あまり、読者数、気にしていなかったのですが、
クリック関係で、少し考えさせられました。

減れば、ヤッパ、魅力無いんだし。。。

最近、感想メール減って、なんとなくサビシイような、
ほっとしてるような状態です。
が、今後、
良い方向に進めたいと思うので、
手が空いたときに、感想メール・毒舌メールいただけると、うれしいです。

次回の第3回反響メール報告会、、、どうなるだろう?
今日は、このへんで、、、
では、また。

次回は、3日ぐらい貯めてから、濃いのを出したいと思います。
あっ、濃い内容ね。。。 (一言多い)三流PGのKen3でした。