C入門[0]

新しく入ってくる後輩にプログラミングを教えなければいけないので,そのための資料を作っておきます。

 

C入門,第0回。CUIGUIについて

 

プログラムには2種類あります。CUIプログラムとGUIプログラム。

あなたが普段使っているのはGUIの方です。WordやExcelInternet ExplorerGoogle Chrome,全部GUIです。ゲームも全部GUIです。ではCUIとは何なのか。

Windowsキー+「R」を押して下さい。画面左下に「ファイル名を指定して実行」が出てきます。名前の欄に「cmd」と入力してEnterを押してください。黒い画面が出てきます。これがコマンドプロンプトです。

コマンドプロンプトに「dir/s」と入力してEnterを押してください。

なんか止まらなくなります。

はい。こういうのがCUIです。

(ちなみにこれは「【厨二】誰でもハッカーっぽい画面を表示できる方法」という動画にあったものです。)

つまり,CUIとは「入力された文字列に応じて,何か文字列を出力するプログラム」です。そこには画像も無ければ,ボタンもありません。ただ黒い画面に白い文字が表示されるだけです。

C言語を勉強する人は,まずCUIから始めます。GUIは難しいからです。ちょっと例を挙げます。

例1) CUIで入力された数の2倍を出力するプログラム

#include <stdio.h>
int main(void){
 int a;
 scanf("%d", &a);
 printf("%d", a * 2);
 return 0;
}

例2) GUIでエディットボックスに入力された数の2倍を表示するプログラム

#include <stdio.h>
#include <windows.h>

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);

int WINAPI WinMain(HINSTANCE hInstance , HINSTANCE, PSTR, int){
	WNDCLASSEX WndClassEx;
	WndClassEx.cbSize = sizeof(WNDCLASSEX);
	WndClassEx.style = CS_HREDRAW | CS_VREDRAW;
	WndClassEx.lpfnWndProc = WndProc;
	WndClassEx.cbClsExtra = WndClassEx.cbWndExtra = 0;
	WndClassEx.hInstance = hInstance;
	WndClassEx.hIcon = LoadIcon(0, IDI_APPLICATION);
	WndClassEx.hCursor = LoadCursor(0, IDC_ARROW);
	WndClassEx.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
	WndClassEx.lpszMenuName = 0;
	WndClassEx.lpszClassName = TEXT("Main");
	WndClassEx.hIconSm = LoadIcon(0, IDI_APPLICATION);
	if(!RegisterClassEx(&WndClassEx)) return 0;

	HWND hwnd = CreateWindow(
		TEXT("Main"), TEXT("satiseni"),
		WS_OVERLAPPEDWINDOW | WS_VISIBLE,
		CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
		NULL, NULL, hInstance, NULL);
	if(hwnd == NULL) return 0;

	MSG msg;
	while(GetMessage(&msg, NULL, 0, 0)){
		TranslateMessage(&msg);
		DispatchMessage(&msg);
	}
	return msg.wParam;
}


LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wp, LPARAM lp){
	static HWND a, b;
	switch(msg){
	case WM_DESTROY:
		PostQuitMessage(0);
		return 0;
	case WM_CREATE:
		a = CreateWindow(TEXT("EDIT"), TEXT(""), WS_CHILD | WS_VISIBLE | WS_BORDER | ES_LEFT, 0, 0, 200, 30, hwnd, (HMENU)1, ((LPCREATESTRUCT)(lp))->hInstance, NULL);
		b = CreateWindow(TEXT("EDIT"), TEXT(""), WS_CHILD | WS_VISIBLE | WS_BORDER | ES_LEFT, 210, 0, 200, 30, hwnd, (HMENU)2, ((LPCREATESTRUCT)(lp))->hInstance, NULL);
		return 0;
	case WM_COMMAND:
		if(LOWORD(wp) == 1 && HIWORD(wp) == EN_UPDATE){
			char buf[64];
			GetWindowText(a, buf, 63);
			int a = atoi(buf);
			sprintf(buf, "%d", a * 2);
			SetWindowText(b, buf);
		}
		return 0;
	default:
		return DefWindowProc(hwnd, msg, wp, lp);
	}
}

 はい。これがCUIGUIの違いです。GUIの方はいろいろなことが長々と書かれていますが,実はそのほとんどがウィンドウを表示する機構に関するもので,実際に2倍を計算しているのは54行目だけです。つまりウィンドウを表示するというのはそれだけ面倒な作業だということです。

まあ,慣れてしまえば60行のプログラムだってそんなに長く感じないんですがね。

 

では次回(第1回)から実際にプログラムを作る方法を書いていきます。