講義で教えないC言語

太田研究室 | 電気電子システム学科 | 岡山理科大学

はじめに

あれやこれやの理由により、講義では取り扱わないC言語プログラムを紹介します。 解説は特にしませんので自分で勉強してください。

これらのプログラムは以下の環境で動作することを確認しています。

! Visual C++ Express 2013 でコンパイルする場合は、SDLチェックを外してください。

無限ループ

プログラミングの重要なファクターにも関わらず、存在を無視されがちなgoto文。使い方だけでも覚えてあげましょう。
プログラムの実行を中断するには、[Ctrl]+[C]を押してください。

#include <stdio.h>

int main(void)
{
    int i = 0;

A:
    printf("%d\n", i++);
    goto A;
    
    return 0;
}

a×b=1234567を満たす10000以下のaとbの値を探す

goto文は多重ループを強制的に抜け出るときなどに便利です。

#include <stdio.h>

int main(void)
{
    int  a, b;

    for(a = 1; a <= 10000; a++){
        for(b = 1; b <= 10000; b++){
            if(a*b == 1234567) goto OWARI;
        }
    }

OWARI:
    if(a <= 10000){
        printf("%d×%d = %d\n", a, b, a*b);
    }else{
        printf("見つからなかった。\n");
    }

    return 0;
}

if文を使わないで条件分岐

関係演算子を使うよ。実用性は全く無いよ。

#include <stdio.h>

int main(void)
{
    int  a = 0, b = 0;

    a == b && printf("a=bです。\n") ||  printf("a≠bです。\n");

    a = 2;

    a == b && printf("a=bです。\n") ||  printf("a≠bです。\n");

    return 0;
}

2変数の値の交換

テンポラリ変数なんか使わなくても交換できます。

#include <stdio.h>

int main(void)
{
    int  a = 70, b = -5;

    printf("a = %d, b = %d\n", a, b);

    a = a+b;
    b = a-b;
    a = a-b;

    printf("a = %d, b = %d\n", a, b);

    return 0;
}

2変数の値の交換(其の二)

こういう書き方もあります。

#include <stdio.h>

int main(void)
{
    int  a = 70, b = -5;

    printf("a = %d, b = %d\n", a, b);

    a ^= b ^= a ^= b;

    printf("a = %d, b = %d\n", a, b);

    return 0;
}

Windowsの電卓アプリを起動する

電卓アプリを起動します。

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
    system("calc");

    return 0;
}

Windowsを1分後に再起動する

! このプログラムはWindowsのシャットダウンを行いますので、実行する前に他のアプリケーションを終了させてください。 このプログラムは自己責任のもとで実行してください。パソコンに不具合など生じても当方は一切責任を負いません。

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
    system("shutdown /r /t 60");

    return 0;
}

ラーメンタイマー

3分を計ります。

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

int main(void)
{
    printf("3分を計ります。\n\a");
    Sleep(60000);
    printf("あと2分です。\n\a");
    Sleep(60000);
    printf("あと1分です。\n\a");
    Sleep(60000);
    printf("3分になりました。\n\a\a\a");

    return 0;
}

ルーレット式おみくじ

どれかキーを押しておみくじを引きます。

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

int main(void)
{
    char *omikuji[] = {"大吉", "中吉", "小吉", "吉  ", "末吉", "凶  ", "大凶"};
    int  i = 0, n;

    n = sizeof(omikuji) / sizeof(char*);

    printf("どれかキーを押してください。\n\nあなたの運勢は\n");

    while(!kbhit()){
        printf("%s\r", omikuji[i]);
        i = (i+1) % n;
        Sleep(20);
    }
    getch();
    printf("\n");

    return 0;
}

ストップウォッチ

ミリ秒単位で時間を計ります。

#include <stdio.h>
#include <conio.h>
#include <time.h>

int main(void)
{
    long  a, b;

    printf("どれかキーを押すと計測を始めます。\n");
    getch();

    printf("どれかキーを押すと計測を止めます。\n");
    a = clock();
    while(!kbhit()){
        b = clock() - a;
        printf("%03d'%02d.%03d\r", b/60000, (b%60000)/1000, (b%60000)%1000);
    }
    getch();

    printf("\n計測おわり!\n");

    return 0;
}

プログレスバー

処理の進捗状況を示すプログレスバー(もどき)を表示します。

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

int main(void)
{
    int  i;

    for(i = 0; i <= 100; i++){
        printf("%-20.*s %3d%%\r", i/5, "********************", i);

        Sleep(100);
    }
    printf("\n");

    return 0;
}

©2014 OHTA Hiroshi@Okayama University of Science