明解C言語 -入門編- 演習の解答

「新版 明解C言語 -入門編-」(2004)
著者:柴田望洋
出版:ソフトバンククリエイティブ

*このページに記載されている内容は、正解を保証するものではありません。
*基本的に、その時点で習っていることしか使っていないはずです。
*より良い解答があれば、こっそり教えていただけると助かります。
*問題は各自で確認してください。
このプログラムは自己責任で使用してください。
*転載可。ただし、転載も自己責任でお願いします。
*インクルードの<>内がタグとして認識されていたので修正しました。07/06/30
*第7章のcount_bits、inverse_n関数を修正。10/01/15

戻る


解答の参照



1.第一章 まずは慣れよう

 演習1-01  <2007/05/20公開>
 演習1-02  <2007/05/20公開>
 演習1-03  <2007/05/20公開>
 演習1-04  <2007/05/20公開>
 演習1-05  <2007/05/20公開>
 演習1-06  <2007/05/20公開>
 演習1-07  <2007/05/20公開>
 演習1-08  <2007/05/20公開>



2.第二章 演算と型

 演習2-01  <2007/05/20公開>
 演習2-02  <2007/05/20公開>
 演習2-03  <2007/05/20公開>
 演習2-04  <2007/05/21公開>
 演習2-05  <2007/05/21公開>
 演習2-06  <2007/05/21公開>



3.第三章 プログラムの流れの分岐

 演習3-01  <2007/05/21公開>
 演習3-02  <2007/05/21公開>
 演習3-03  <2007/05/21公開>
 演習3-04  <2007/05/21公開>
 演習3-05  <2007/05/21公開>
 演習3-06  <2007/05/22公開>
 演習3-07  <2007/05/22公開>
 演習3-08  <2007/05/22公開>
 演習3-09  <2007/05/22公開>
 演習3-10  <2007/05/22公開>
 演習3-11  <2007/05/22公開>
 演習3-12  <2007/05/22公開>



4.第四章 プログラムの流れの繰返し

 演習4-01    <2007/05/22公開>
 演習4-02    <2007/05/22公開>
 演習4-03    <2007/05/22公開>
 演習4-04    <2007/05/23公開>
 演習4-05    <2007/05/23公開>
 演習4-06    <2007/05/23公開>
 演習4-07    <2007/05/23公開>
 演習4-08    <2007/05/23公開>
 演習4-09    <2007/05/23公開>
 演習4-10    <2007/05/23公開>
 演習4-11    <2007/05/23公開>
 演習4-12    <2007/05/23公開>
 演習4-13    <2007/05/23公開>
 演習4-14    <2007/05/23公開>
 演習4-15    <2007/05/24公開>
 演習4-16    <2007/05/24公開>
 演習4-17(1)  <2007/05/24公開>
 演習4-17(2)  <2007/05/24公開>
 演習4-18    <2007/05/24公開>



5.第五章 配列

 演習5-01  <2007/06/02公開>
 演習5-02  <2007/06/02公開>
 演習5-03  <2007/06/02公開>
 演習5-04  <2007/06/02公開>
 演習5-05  <2007/06/02公開>
 演習5-06  <2007/06/02公開>
 演習5-07  <2007/06/02公開>



6.第六章 関数

 演習6-01  <2007/06/03公開>
 演習6-02  <2007/06/03公開>
 演習6-03  <2007/06/03公開>
 演習6-04  <2007/06/03公開>
 演習6-05  <2007/06/03公開>
 演習6-06  <2007/06/03公開>
 演習6-07  <2007/06/03公開>
 演習6-08  <2007/06/03公開>
 演習6-09  <2007/06/03公開>
 演習6-10  <2007/06/03公開>
 演習6-11  <2007/06/03公開>
 演習6-12  <2007/06/03公開>



7.第七章 基本型

 演習7-01  <2007/06/07公開>
 演習7-02  <2010/01/15修正>New
 演習7-03  <2010/01/15修正>New
 演習7-04  <2010/01/15修正>New
 演習7-05  <2007/06/07公開>



8.第八章 いろいろなプログラムを作ってみよう

 演習8-01  <2007/06/07公開>
 演習8-02  <2007/06/07公開>
 演習8-03  <2007/06/07公開>
 演習8-04  <2007/09/07公開>
 演習8-05  <2007/06/09公開>
 演習8-06  <2007/06/09公開>
 演習8-07  <2007/06/09公開>
 演習8-08  <2007/06/09公開>



9.第九章 文字列の基本

 演習9-01  <2007/06/09公開>
 演習9-02  <2007/06/09公開>
 演習9-03  <2007/06/24公開>
 演習9-04  <2007/06/30公開>
 演習9-05  <2007/06/30公開>
 演習9-06  <2007/06/30公開>
 演習9-07  <2007/06/30公開>
 演習9-08  <2007/06/30公開>
 演習9-09  <2007/06/30公開>
 演習9-10  <2007/06/30公開>



10.第十章 ポインタ

 演習10-01  <2008/04/28更新>
 演習10-02  <2007/06/30公開>



11.第十一章 文字列とポインタ

 演習11-01  <2007/06/30公開>
 演習11-02  <2007/06/30公開>
 演習11-03  <2007/06/30公開>
 演習11-04  <2007/06/30公開>
 演習11-05  <2007/06/30公開>
 演習11-06  <2007/06/30公開>



12.第十二章 構造体

 演習12-01  <2007/07/04公開>
 演習12-02  <>



13.第十三章 ファイル処理

 演習13-01  <2007/09/05公開>
 演習13-02  <2007/09/05公開>
 演習13-03  <2007/09/05公開>
 演習13-04  <2007/09/05公開>
 演習13-05  <2007/09/05公開>
 演習13-06  <2007/09/05公開>
 演習13-07  <2007/09/05公開>
 演習13-08  <2007/09/05公開>
 演習13-09  <2007/09/05公開>
 演習13-10  <2007/09/05公開>
 演習13-11  <2007/09/05公開>
 演習13-12  <2007/09/05公開>



解答

第一章 まずは慣れよう

#include <stdio.h>

int main(void)
{
    printf("15から37を引いた数は%dです。\n", 15 - 37);
    return(0);
}

参照へ

#include <stdio.h>

int main(void)
{
    printf("風\n林\n火\n山\n");
    
    return(0);
}

参照へ

#include <stdio.h>

int main(void)
{
    printf("もしもし。\nこんにちは。\n\nそれでは。\n");
    
    return(0);
}

参照へ

#include <stdio.h>

int main(void)
{
    int no;
    printf("整数を入力してください。");
    scanf("%d", &no);
    
    printf("その数に10を加えると%dです。\n", no + 10);
    return(0);
}

参照へ

#include <stdio.h>

int main(void)
{
    int no;
    printf("整数を入力してください:");
    scanf("%d", &no);
    printf("その数から10を減じると%dです。\n", no - 10);
    
    return(0);
}

参照へ

#include <stdio.h>

int main(void)
{
    puts("風\n林\n火\n山");
    
    return(0);
}

参照へ

#include <stdio.h>

int main(void)
{
    int num1, num2;
    long ans = 0;
    
    puts("二つの整数を入力してください。");
    printf("整数1:"); scanf("%d", &num1);
    printf("整数2:"); scanf("%d", &num2);
    
    ans = num1 * num2;
    
    printf("それらの積は%dです。\n", ans);
    
    return(0);
}

参照へ

#include <stdio.h>

int main(void)
{
    int num1, num2, num3;
    int sum = 0;
    puts("三つの整数を入力してください。");
    printf("整数1:"); scanf("%d", &num1);
    printf("整数2:"); scanf("%d", &num2);
    printf("整数3:"); scanf("%d", &num3);
    
    sum = num1 + num2 + num3;
    
    printf("それらの和は%dです。\n", sum);
    
    return(0);
}

参照へ


第二章 演算と型


#include <stdio.h>

int main(void)
{
    int num1, num2;
    
    puts("二つの整数を入力してください。");
    printf("整数A:"); scanf("%d", &num1);
    printf("整数B:"); scanf("%d", &num2);
    
    printf("Aの値はBの%d%%です。", 100 * num1 / num2);
    
    return(0);
}

参照へ

#include <stdio.h>

int main(void)
{
    int num1, num2;
    
    puts("二つの整数を入力してください。");
    printf("整数A:"); scanf("%d", &num1);
    printf("整数B:"); scanf("%d", &num2);
    printf("それらの和は%dで積は%dです。\n", num1 + num2, num1 * num2);
    
    return(0);
}

参照へ

#include <stdio.h>

int main(void)
{
    double num;
    printf("実数を入力してください:"); scanf("%lf", &num);
    printf("あなたは%fと入力しましたね。\n", num);
    
    return(0);
}

参照へ

#include <stdio.h>

int main(void)
{
    int i = 20;
    double d = 2.0;
    
    puts("種々の計算を行なう。");
    printf("i = %d        d = %f\n", i, d);
    printf("i + d        = %f\n", i + d);
    printf("i + 22.2     = %f\n", i + 22.2);
    printf("i * d        = %f\n", i * d);
    printf("i * 3.0      = %f\n", i / 3.0);
    printf("i / d        = %f\n", i / d);
    printf("i / 4.0      = %f\n", i / 4.0);

    // 行なってはいけない printf("%d", 実数)
    puts("\n行なってはいけない計算の結果  printf(\"%d\", 実数)");
    printf("3.0 + 4      = %d\n", 3.0 + 4);
    printf("i + d        = %d\n", i + d);
    printf("i * 3.0      = %d\n", i * 3.0);
    printf("i / 4.0      = %d\n", i / 4.0);
    
    return(0);
}

参照へ

#include <stdio.h>

int main(void)
{
    int na, nb;
    
    puts("二つの整数を入力してください。");
    printf("整数A:"); scanf("%d", &na);
    printf("整数B:"); scanf("%d", &nb);
    
    printf("Aの値はBの%f%です。", 100.0 * na / nb);
    
    return(0);
}

参照へ

#include <stdio.h>

int main(void)
{
    int height;
    
    printf("身長を入力してください:"); scanf("%d", &height);
    printf("標準体重は%.1fです。", (height - 100) * 0.9);
    
    return(0);
}

参照へ


第三章 プログラムの流れの分岐


#include <stdio.h>

int main(void)
{
    int num1, num2;
    
    puts("二つの整数を入力してください。");
    printf("整数A:"); scanf("%d", &num1);
    printf("整数B:"); scanf("%d", &num2);
    
    if(num1 % num2) {
        puts("BはAの約数ではありません。");
    }
    else {
        puts("BはAの約数です。");
    }
    
    return(0);
}

参照へ

#include <stdio.h>

int main(void)
{
    printf("%d\n", 10 == 10);
    printf("%d\n", 10 == 9);
    printf("%d\n", 10 != 10);
    printf("%d\n", 10 != 9);
    printf("%d\n", 10 > 9);
    printf("%d\n", 10 < 9);
    
    return(0);
}

参照へ

#include <stdio.h>

int main(void)
{
    int num;
    printf("整数を入力してください:");
    scanf("%d", &num);
    
    if(num < 0) {
        num = -num;
    }
    
    printf("絶対値は%dです。", num);
    
    return(0);
}

参照へ

#include <stdio.h>

int main(void)
{
    int num1, num2;
    
    puts("二つの整数を入力してください。");
    printf("整数A:"); scanf("%d", &num1);
    printf("整数B:"); scanf("%d", &num2);
    
    if(num1 == num2) {
        puts("AとBは等しいです。");
    }
    else if(num1 < num2) {
        puts("AはBより小さいです。");
    }
    else {
        puts("AはBより大きいです。");
    }
    
    return(0);
}

参照へ

#include <stdio.h>

int main(void)
{
    int num1, num2, num3, min;
    
    puts("三つの整数を入力してください。");
    printf("整数1:"); scanf("%d", &num1);
    printf("整数2:"); scanf("%d", &num2);
    printf("整数3:"); scanf("%d", &num3);
    
    min = num1;
    if(num2 < min) min = num2;
    if(num3 < min) min = num3;
    
    printf("最小値は%dです。\n", min);
    
    return(0);
}

参照へ

#include <stdio.h>

int main(void)
{
    int num1, num2, num3, num4, max;
    
    puts("四つの整数を入力してください。");
    printf("整数1:"); scanf("%d", &num1);
    printf("整数2:"); scanf("%d", &num2);
    printf("整数3:"); scanf("%d", &num3);
    printf("整数4:"); scanf("%d", &num4);
    
    max = num1;
    if(num2 > max) max = num2;
    if(num3 > max) max = num3;
    if(num4 > max) max = num4;
    printf("最大値は%dです。", max);
    
    return(0);
}

参照へ

#include <stdio.h>

int main(void)
{
    int num1, num2, ans;
    
    puts("二つの整数を入力してください。");
    printf("整数1:"); scanf("%d", &num1);
    printf("整数2:"); scanf("%d", &num2);
    
    if(num1 > num2) ans = num1 - num2;
    else ans = num2 - num1;
    
    printf("それらの差は%dです。\n", ans);
    
    return(0);
}

参照へ

#include <stdio.h>

int main(void)
{
    int num1, num2, num3, max;
    
    puts("三つの整数を入力してください。");
    printf("整数1:"); scanf("%d", &num1);
    printf("整数2:"); scanf("%d", &num2);
    printf("整数3:"); scanf("%d", &num3);
    
    max = (num1 > num2) ? num1 : num2;
    max = (max < num3) ? num3 : max;
    
    printf("最大値は%dです。\n", max);
    
    return(0);
}

参照へ

#include <stdio.h>

int main(void)
{
    int num1, num2, num3;
    
    puts("三つの整数を入力してください。");
    
    printf("整数1:"); scanf("%d", &num1);
    printf("整数2:"); scanf("%d", &num2);
    printf("整数3:"); scanf("%d", &num3);
    
    if( num1 == num2 && num2 == num3) {
        puts("三つの値は等しいです。");
    }
    else if(num1 != num2 && num2 !=num3 && num3 != num1) {
        puts("三つの値は異なります。");
    }
    else {
        puts("二つの値が等しいです。");
    }
    
    return(0);
}

参照へ

#include <stdio.h>

int main(void)
{
    int num1, num2;
    
    puts("二つの整数を入力してください。");
    printf("整数1:"); scanf("%d", &num1);
    printf("整数2:"); scanf("%d", &num2);
    
    if( (num1 - num2) > 10 || (num1 - num2) < -10) {
        puts("それらの差は11以上です。");
    }
    else {
        puts("それらの差は10以下です。");
    }
    
    return(0);
}

参照へ

#include <stdio.h>

int main(void)
{
    int no;
    
    printf("整数を入力してください:");
    scanf("%d", &no);
    
    switch(no % 2) {
        case 0 : puts("その数は偶数です。"); break;
        case 1 : puts("その数は奇数です。"); break;
        default : puts("その数は対象外です。");
    }
    
    return(0);
}

参照へ

#include <stdio.h>

int main(void)
{
    int month;
    
    printf("何月ですか:");
    scanf("%d", &month);
    
    switch(month) {
        case 3 : 
        case 4 :
        case 5 : puts("春です。"); break;
        case 6 :
        case 7 :
        case 8 : puts("夏です。"); break;
        case 9 :
        case 10 :
        case 11 : puts("秋です。"); break;
        case 12 : 
        case 1 : 
        case 2 : puts("冬です。"); break;
        default : puts("そんな月はありませんよ!!\a");
    }
    
    return(0);
}

参照へ


第四章 プログラムの流れの繰返し


#include <stdio.h>

int main(void)
{
    int num;
    
    do {
        printf("非負の整数を入力してください:");
        scanf("%d", &num);
        if( num < 0 ) {
            puts("負の数を入力しないでください。\a");
        }
    } while (num < 0);
    
    printf("%dを逆から読むと", num);
    do {
        printf("%d", num % 10);
        num = num / 10;
    } while(num > 0);
    puts("です。");
    
    return(0);
}

参照へ

#include <stdio.h>

int main(void)
{
    int num;
    int dig = 0;
    
    do {
        printf("非負の整数を入力してください:");
        scanf("%d", &num);
        if(num < 0) {
            puts("\a負の数を入力しないでください。");
        }
    } while(num < 0);
    
    printf("%dは", num);
    
    do {
        num = num / 10;
        dig++;
    } while(num > 0);
    
    printf("%d桁です。\n", dig);
    
    return(0);
}

参照へ

#include <stdio.h>

int main(void)
{
    int max, min;
    int sum = 0;
    
    {
        int num1, num2;
        
        puts("二つの整数を入力してください。");
        printf("整数1:"); scanf("%d", &num1);
        printf("整数2:"); scanf("%d", &num2);
        if(num1 > num2) {
            max = num1;
            min = num2;
        }
        else {
            max = num2;
            min = num1;
        }
    }
    
    printf("%d以上%d以下の整数の和は", min, max);
    do {
        sum = sum + min;
        min = min + 1;
    } while(min < max + 1);
    
    printf("%dです。\n", sum);
    
    return(0);
}

参照へ

#include <stdio.h>

int main(void)
{
    int num;
    
    do {
        printf("非負の整数を入力してください:");
        scanf("%d", &num);
        if(num < 0) {
            puts("\a負の数を入力しないでください。");
        }
    } while(num < 0);
    
    printf("その数を逆から読むと");
    do {
        printf("%d", num % 10);
        num /= 10;
    } while(num > 0);
    puts("です。");
    
    return(0);
}

参照へ

#include <stdio.h>

int main(void)
{
    int num;
    int dig = 0;
    
    do {
        printf("非負の整数を入力してください:");
        scanf("%d", &num);
        if(num < 0) {
            puts("\a負の数を入力しないでください。");
        }
    } while (num < 0);
    
    do {
        num /= 10;
        dig++;
    } while (num > 0);
    printf("その数は%d桁です。\n", dig);
    
    return(0);
}

参照へ

#include <stdio.h>

int main(void)
{
    int no;
    printf("整数を入力してください:");
    scanf("%d", &no);
    
    while(no >= 0) {
        printf("%d ", no);
        no--;
        if(no < 0 ) {
            putchar('\n');
        }
    }
    
    return(0);
}

参照へ

#include <stdio.h>

int main(void)
{
    int no;
    
    printf("正の整数を入力してください:");
    scanf("%d", &no);
    
    while(no >= 1) {
        printf("%d ", no--);
        if (no < 1) {
            putchar('\n');
        }
    }
    
    return(0);
}

参照へ

#include <stdio.h>

int main(void)
{
    int i, no;
    
    printf("正の整数を入力してください:");
    scanf("%d", &no);
    
    i = 1;
    while(i <= no) {
        printf("%d ", i++);
        if(i == no + 1) {
            putchar('\n');
        }
    }
    
    return(0);
}

参照へ

#include <stdio>

int main(void)
{
    int i, no;
    
    printf("整数を入力してください:");
    scanf("%d", &no);
    
    if(no >= 2) {
        i = 1;
        while(2 * i <= no) {
            printf("%d ", 2 * i++);
        }
        putchar('\n');
    }
    
    return(0);
}

参照へ

#include <stdio.h>

int main(void)
{
    int i, no;
    
    printf("整数を入力してください:");
    scanf("%d", &no);
    
    if(no >= 2) {
        i = 2;
        
        while(i <= no) {
            printf("%d ", i);
            i *= 2;
        }
        putchar('\n');
    }
    
    return(0);
}

参照へ

#include <stdio.h>

int main(void)
{
    int no;
    
    printf("正の整数を入力してください:");
    scanf("%d", &no);
    
    while(no-- > 0) {
        puts("*");
    }
    
    return(0);
}

参照へ

#include <stdio.h>

int main(void)
{
    int sum = 0;
    int i;
        
    for(i = 1; i < 6; i++) {
        sum += i;
    }
    
    printf("1から5までの和は%dです。\n", sum);
    
    return(0);
}

参照へ

#include <stdio.h>

int main(void)
{
    int num;
    int i = 1;
    
    printf("整数を入力してください:");
    scanf("%d", &num);
    
    for(;i <= num; i++) {
        printf("%d", i % 10);
    }
    putchar('\n');
    
    return(0);
}

参照へ

#include <stdio.h>

int main(void)
{
    int start, end, digree;
    
    printf("何cmから:"); scanf("%d", &start);
    printf("何cmまで:"); scanf("%d", &end);
    printf("何cmごと:"); scanf("%d", &digree);
    
    for(; start <= end; start += digree) {
        printf("%dcm    %.2fkg\n", start, (double)(start - 100) * 0.9);
    }
    
    return(0);
}

参照へ

#include <stdio.h>

int main(void)
{
    int i, j;
    
    printf("   | ");
    for ( i = 1; i <= 9; i++) {
        printf("%3d", i);
    }
    putchar('\n');
    
    printf("----");
    for( i = 0; i <= 9; i++) {
        printf("---");
    }
    putchar('\n');
    
    for (i = 1; i <= 9; i++) {
        printf("%2d | ", i);
        for (j = 1; j <= 9; j++) {
            printf("%3d", i * j);
        }
        putchar('\n');
    }
    
    return(0);
}

参照へ

#include <stdio.h>

int main(void)
{
    int i, j, temp;
    int height, width;
    
    puts("長方形を作りましょう。");
    printf("一辺(その1):"); scanf("%d", &height);
    printf("一辺(その2):"); scanf("%d", &width);
    
    if(width > height) {
        temp = height;
        height = width;
        width = temp;
    }
    
    for(i = 0; i < width; i++) {
        for(j = 0; j < height; j++) {
            putchar('*');
        }
        putchar('\n');
    }
    
    return(0);
}

参照へ

/*
    直角三角形(左上が直角)を表示
*/

#include <stdio.h>

int main(void)
{
    int i, j, ln;
    
    printf("何段ですか:");
    scanf("%d", &ln);
    
    for(i = 1; i <= ln; i++) {
        for (j = 0; j <= ln - i; j++) {
            putchar('*');
        }
        putchar('\n');
    }
    
    return(0);
}

参照へ

/*
    直角三角形(右上が直角)を表示
*/

#include <stdio.h>

int main(void)
{
    int i, j, ln;
    
    printf("何段ですか:");
    scanf("%d", &ln);
    
    for(i = 1; i <= ln; i++) {
        for(j = 1; j < i; j++) {
            putchar(' ');
        }
        for(j = i; j <= ln; j++) {
            putchar('*');
        }
        putchar('\n');
    }
    
    return(0);
}

参照へ

#include <stdio.h>

int main(void)
{
    int i, j, ln;
    
    puts("ピラミッドを作りましょう。");
    printf("何段ですか:");
    scanf("%d", &ln);
    
    for(i = 1; i <= ln; i++) {
        for(j = ln - i; j > 0; j--) {
            putchar(' ');
        }
        for(j = 1; j <= (2 * i - 1); j++) {
            putchar('*');
        }
        putchar('\n');
    }
    
    return(0);
}

参照へ


第五章 配列


#include <stdio.h>

int main(void) {
    int i;
    int vc[5];
    
    for(i = 0; i < 5; i++) {
        vc[i] = i;
        printf("vc[%d] = %d\n", i, vc[i]);
    }
    
    return(0);
}

参照へ

;
#include <stdio.h>

int main(void)
{
    int i;
    int vc[5];
    
    for(i = 0; i < 5; i++) {
        vc[i] = 5 - i;
        printf("vc[%d] = %d\n", i, vc[i]);
    }
    
    return(0);
}

参照へ

#include <stdio.h>

int main(void)
{
    int i;
    int vc[5] = {5, 4, 3, 2, 1};
    
    for( i = 0; i < 5; i++) {
        printf("vc[%d] = %d\n", i, vc[i]);
    }
    
    return(0);
}

参照へ

#include <stdio.h>
#define NUMBER 5

int main(void)
{
    int i;
    int va[NUMBER] = {15, 20, 30};
    int vb[NUMBER];
    
    for(i = 0; i < 5; i++) {
        vb[i] = va[NUMBER - i - 1];
    }
    
    puts(" va vb");
    puts("-------");
    
    for(i = 0; i < 5; i++) {
        printf("%3d%3d\n", va[i], vb[i]);
    
    }
    
    return(0);
}

参照へ

#include <stdio.h>

#define NUMBER   8

int main(void)
{
    int i;
    int vx[NUMBER];
    
    for (i = 0; i < NUMBER; i++) {
        printf("vx[%d] : ", i);
        scanf("%d", &vx[i]);
    }
    
    for (i = 0; i < (int)(NUMBER / 2); i++) {
        int temp = vx[i];
        vx[i] = vx[NUMBER - i - 1];
        vx[NUMBER - i - 1] = temp;
    }
    
    for (i = 0; i < NUMBER; i++) {
        printf("vx[%d] = %d\n", i, vx[i]);
    }
    
    return(0);
}

参照へ

/*
    a = (b = 1.5)
    b = 1
    a = b
    a = 1
    結果:a も b も 1
*/
#include <stdio.h>

int main(void)
{
    double a;
    int b;
    
    puts("double a, int b の評価");
    puts("a = b = 1.5");
    
    a = b = 1.5;
    printf("a = %4.1f\n", a);
    printf("b = %4d\n", b);
    
    return(0);
}

参照へ

#include <stdio.h>

int main(void)
{
    int x[2][3] = {{1,2,3}, {4, 5, 6}};
    int y[3][2] = {{1, 5}, {5, 3}, {8, 1}};
    int ans[2][2] = {0};
    int i, j, k, temp;
    
    
    for(i = 0; i < 2; i++) {
        for (k = 0; k < 2; k++) {
            temp = 0;
            for(j = 0; j < 3; j++) {
                temp += x[i][j] * y[j][k];
            }
            ans[i][k] = temp;
        }
    }
    
    for(i = 0; i < 2; i++) {
        for(j = 0; j < 2; j++) {
            printf("%4d",ans[i][j]);
        }
        putchar('\n');
    }
    
    return(0);
}

参照へ


第六章 関数


;
#include <stdio.h>

int minof(int x, int y)
{
    return ( (x > y) ? y : x );
}

int main(void)
{
    int na, nb;
    
    puts("二つの整数を入力してください。");
    printf("整数1:"); scanf("%d", &na);
    printf("整数2:"); scanf("%d", &nb);
    
    printf("小さい方の値は%dです。\n", minof(na, nb));
    
    return(0);
}

参照へ

;
#include <stdio.h>

int min3(int x, int y, int z)
{
    int min = x;
    if(y < min) min = y;
    if(z < min) min = z;
    
    return(min);
}

int main(void)
{
    int na, nb, nc;
    
    puts("三つの整数を入力してください。");
    printf("整数1:"); scanf("%d", &na);
    printf("整数2:"); scanf("%d", &nb);
    printf("整数3:"); scanf("%d", &nc);
    
    printf("最も小さい値は%dです。\n", min3(na, nb, nc));
    
    return(0);
}

参照へ

#include <stdio.h>

int cube(int x)
{
    return ( x * x * x);
}

int main(void)
{
    int x;
    
    printf("整数を入力してください:");
    scanf("%d", &x);
    
    printf("その数の三乗は%dです。\n", cube(x));
    
    return(0);
}

参照へ

#include <stdio.h>

int sqr(int x)
{
    return(x * x);
}

int pow4(int x)
{
    return (sqr(x) * sqr(x));
}

int main(void)
{
    int x;
    printf("整数を入力してください:");
    scanf("%d", &x);
    printf("その数の4乗は%dです。\n", pow4(x));
    
    return(0);
}

参照へ

#include <stdio.h>

void alert(int no)
{
    while(no-- > 0) {
        printf("\a");
    }
}

int main(void)
{
    int n;
    printf("整数を入力してください:");
    scanf("%d", &n);
    
    alert(n);
    
    return(0);
}

参照へ

#include <stdio.h>

void hello(void)
{
    puts("こんにちは。");
}

int main(void)
{
    hello();
    
    return(0);
}

参照へ

#include <stdio.h>

#define NUMBER 5


int min_of(const int vc[], int no)
{
    int min = vc[--no];
    while (no-- > 0) {
        if(min > vc[no]) min = vc[no];
    }
    
    return(min);
}


int main(void)
{
    int tensu[NUMBER] = {0};
    int i = 0;
    
    puts("五つの整数を入力します。");
    
    for(; i < NUMBER; i++) {
        printf("整数を入力してください:");
        scanf("%d", &tensu[i]);
    }
    
    printf("最小の整数は%dです。\n", min_of(tensu, NUMBER));
    
    return(0);
}

参照へ

#include <stdio.h>

#define NUMBER 5

void rev_intary(int vc[], int no)
{
    int i = 0;
    int temp;
    
    for (; i < (no / 2) ; i++) {
        temp = vc[i];
        vc[i] = vc[no - i - 1];
        vc[no - i - 1] = temp;
    }
}


int main(void)
{
    int array1[NUMBER] = {0};
    int i = 0;
    
    for (; i < NUMBER; i++) {
        array1[i] = i;
        printf("array1[%d] = %d\n", i, array1[i]);
    }
    putchar('\n');
    
    rev_intary(array1, NUMBER);
    
    for(i = 0; i < NUMBER; i++) {
        printf("array1[%d] = %d\n", i, array1[i]);
    }
    
    return(0);
}

参照へ

#include <stdio.h>

#define NUMBER 5

void intary_rcpy(int v1[], const int v2[], int no)
{
    int i = 0;
    for(; i < no; i++) {
        v1[i] = v2[no - i - 1];
    }
}

int main(void)
{
    int array1[NUMBER] = {0};
    int array2[NUMBER] = {0};
    int i = 0;
    
    for (; i < NUMBER; i++) {
        array2[i] = i;
        printf("array2[%d] = %d\n", i, array2[i]);
    }
    putchar('\n');
    
    intary_rcpy(array1, array2, NUMBER);
    
    for(i = 0; i < NUMBER; i++) {
        printf("array1[%d] = %d\n", i, array1[i]);
    }
    
    return(0);
}

参照へ

#include <stdio.h>

void mul(const int ma[2][3], const mb[3][2], int mc[2][2]) 
{
    int i, j, k;
    for (i = 0; i < 2; i++) {
        for(k = 0; k < 2; k++) {
            for (j = 0; j < 3; j++) {
                
                mc[i][k] += ma[i][j] * mb[j][k];
            }
        }
    }
}

void main(void)
{
    int i, j;
    int ma[2][3] = { {1, 2, 3}, {4, 5, 6} };
    int mb[3][2] = { {3, 4}, {5, 6}, {7, 8} };
    int mc[2][2] = {0};
    
    mul(ma, mb, mc);
    
    for (i = 0; i < 2; i++) {
        for (j = 0; j < 2; j++) {
            printf("%3d", mc[i][j]);
        }
        putchar('\n');
    }
}

参照へ

#include <stdio.h>

#define STUDENTS 5
#define SUBJECTS 3
#define JAPANESE 0
#define MATH 1
#define ENGLISH 2

int max_point(const int tensu[STUDENTS][SUBJECTS], int subject)
{
    int i = 0;
    int max;
    max = tensu[i++][subject];
    for (; i < STUDENTS; i++) {
        if(max < tensu[i][subject]) max = tensu[i][subject];
    }
    return(max);
}

void person_av(const int tensu[STUDENTS][SUBJECTS], double ave[STUDENTS])
{
    int i, j;
    for (i = 0; i < STUDENTS; i++) {
        int temp = 0;
        for (j = 0; j < SUBJECTS; j++) {
            temp += tensu[i][j];
        }
        ave[i] = (double)temp / SUBJECTS;
    }
}

int main(void)
{
    int i;
    int tensu[STUDENTS][SUBJECTS] =
        { {88, 90, 73}, {44, 79, 40}, {74, 63, 55}, {95, 89, 99}, {77, 24, 34} };
    double ave[STUDENTS] = {0};
    person_av(tensu, ave);
    
    puts("各学生の平均点:");
    for(i = 0; i < STUDENTS; i++) {
        printf("%d番の学生 : %.2f\n", i, ave[i]);
    }
    
    putchar('\n');
    
    puts("各教科の最高点");
    for (i = 0; i < SUBJECTS; i++) {
        if(i == JAPANESE) printf("Japanese : ");
        else if(i == MATH) printf("Mathematics : ");
        else if(i == ENGLISH) printf("English : ");
        printf("%d\n", max_point(tensu, i));
    }
    
    return(0);
}

参照へ

#include <stdio.h>

int fx[3];
static int fsx[3];

int main(void)
{
    int i;
    int ax[3];
    static int sx[3];
    
    puts("  fx fsx  ax  sx");
    puts("----------------");
    for(i = 0; i < 3; i++) {
        printf("%4d%4d%4d%4d\n", fx[i], fsx[i], ax[i], sx[i]);
    }
    puts("----------------");
    
    return(0);
}

参照へ


第七章 基本型


;
/*
    単に計算結果を表示するだけでも可
*/
#include <stdio.h>

int main(void)
{
    unsigned int no, snum, temp, i;
    int temp_no, temp_snum;
    
    do {
        printf("非負の整数を入力してください:");
        scanf("%d", &temp_no);
    } while(temp_no < 0);
    no = (unsigned)temp_no;
    
    do {
        printf("シフトする数:");
        scanf("%d", &temp_snum);
    } while(temp_snum < 0);
    snum = (unsigned)temp_snum;
    
    putchar('\n');

    temp = no;
    for(i = 0; i < snum; i++) {
        temp *= 2;
    }
    
    printf("%u << %u = %u\n", no, snum, no << snum);
    printf("%u * (2 ^ %u)  = %u\n", no, snum, temp);
    
    putchar('\n');
    
    temp = no;
    for(i = 0; i < snum; i++) {
        temp /= 2;
    }
    
    printf("%u >> %u = %u\n", no, snum, no >> snum);
    printf("%u / (2 ^ %u)  = %u\n", no, snum, temp);
    
    return(0);
}

参照へ

;
#include <stdio.h>

int count_bits(unsigned x)
{
    int count = 0;
    while (x) {
        if(x & 1U) count++;
        x >>= 1;
    }
    
    return(count);
}

int int_bits(void)
{
    return count_bits(~0U);
}

void print_bits(unsigned x)
{
    int i;
    for ( i = int_bits() - 1; i >= 0; i--) {
        putchar(((x >> i) & 1U) ? '1' : '0');
    }
}

unsigned rrotate(unsigned x, int n)
{
    int i = int_bits();
    return (x >> n) | (x << (i - n) );
}

unsigned lrotate(unsigned x, int n)
{
    int i = int_bits();
    return (x << n) | (x >> (i - n) );
}

int main(void)
{
    unsigned no;
    int snum, temp_no;
    
    do {
        printf("非負の整数を入力してください:");
        scanf("%d", &temp_no);
    } while(temp_no < 0);
    no = (unsigned)temp_no;
    
    do {
        printf("左右にいくつ回転しますか:");
        scanf("%d", &snum);
    } while(snum < 0);
    
    putchar('\n');
    printf("入力した数のビット内容  :"); print_bits(no);
    putchar('\n');
    printf("右に%d回転したビット内容:", snum); print_bits(rrotate(no, snum));
    putchar('\n');
    printf("左に%d回転したビット内容:", snum); print_bits(lrotate(no, snum));
    putchar('\n');
    
    return(0);
}

参照へ

#include <stdio.h>

int count_bits(unsigned x)
{
    int count = 0;
    while (x) {
        if (x & 1U) count++;
        x >>= 1;
    }
    
    return(count);
}

int int_bits(void)
{
    return (count_bits(~0U));
}

void print_bits(unsigned x)
{
    int i;
    for (i = int_bits() - 1; i >= 0; i--) {
        putchar(((x >> i) & 1U) ? '1' : '0');
    }
}

unsigned set(unsigned x, int pos)
{
    unsigned temp = 1;
    for (; pos > 1; pos--) {
        temp *= 2;
    }
    return ( x | temp);
}

unsigned reset(unsigned x, int pos)
{
    return (x & ~set(0U, pos));
}

unsigned inverse(unsigned x, int pos)
{
    unsigned temp = x >> (pos - 1);
    if(temp & 1U) {
        temp = reset(x, pos);
    }
    else {
        temp = set(x, pos);
    }
    
    return(temp);
}

int main(void)
{
    unsigned no;
    int temp_no,snum;
    
    do {
        printf("非負の整数を入力してください:");
        scanf("%d", &temp_no);
    } while(temp_no < 0);
    no = (unsigned)temp_no;
    
    do {
        printf("何ビット目を変化させますか:");
        scanf("%d", &snum);
    } while(snum < 0);
    
    putchar('\n');
    
    printf("入力した数のビット内容    :"); print_bits(no);
    putchar('\n');
    printf("指定した位置を1にした内容:"); print_bits(set(no, snum));
    putchar('\n');
    printf("指定した位置を0にした内容:"); print_bits(reset(no, snum));
    putchar('\n');
    printf("指定した位置を反転した内容:"); print_bits(inverse(no, snum));
    putchar('\n');
    
    return(0);
}

参照へ

#include <stdio.h>

int count_bits(unsigned x)
{
    int count = 0;
    while (x) {
        if(x & 1U) count++;
        x >>=1;
    }
    return(count);
}

int int_bits(void)
{
    return (count_bits(~0U));
}

void print_bits(unsigned x)
{
    int i;
    for(i = int_bits() - 1; i >= 0; i--) {
        putchar(((x >> i) & 1U) ? '1' : '0');
    }
}

unsigned set(unsigned x, int pos) {
    unsigned temp = 1;
    for (; pos > 1; pos--) {
        temp *= 2;
    }
    return(temp | x);
}

unsigned reset(unsigned x, int pos) {
    return(x & ~set(0U, pos));
}

unsigned inverse(unsigned x, int pos) {
    unsigned temp;
    if(x >> (pos - 1) & 1U) {
        temp = reset(x, pos);
    }
    else {
        temp = set(x, pos);
    }
    
    return(temp);
}

unsigned set_n( unsigned x, int pos, int n)
{
    int i;
    unsigned temp;
    for (i = 0; i < n; i++) {
        x = set(x, pos + i);
    }
    
    return (x);
}

unsigned reset_n(unsigned x, int pos, int n)
{
    int i;
    unsigned temp;
    for (i = 0; i < n; i++) {
        x = reset(x, pos + i);
    }
    
    return(x);
}

unsigned inverse_n(unsigned x, int pos, int n)
{
    int i;
    for(i = 0; i < n; i++) {
        x = inverse(x, pos + i);
    }
    return(x);
}

int main(void)
{
    unsigned no;
    int temp_no,pos , n;
    
    do {
        printf("非負の整数を入力してください:");
        scanf("%d", &temp_no);
    } while(temp_no < 0);
    no = (unsigned)temp_no;
    
    do {
        printf("始点を入力してください:");
        scanf("%d", &pos);
    } while(pos < 0);
    
    do {
        printf("いくつビットを変更しますか:");
        scanf("%d", &n);
    } while(n < 0);
    
    putchar('\n');
    
    printf("入力した数のビット内容      :"); print_bits(no);
    putchar('\n');
    printf("指定位置を1にしたビット内容:"); print_bits(set_n(no, pos, n));
    putchar('\n');
    printf("指定位置を0にしたビット内容:"); print_bits(reset_n(no, pos, n));
    putchar('\n');
    printf("指定位置を反転したビット内容:"); print_bits(inverse_n(no, pos, n));
    putchar('\n');
    
    return(0);
}

参照へ

#include <stdio.h>
#include <limits.h>

int main(void)
{
    printf("符号なし整数の最高           = %u\n", UINT_MAX);
    printf("符号なし整数の最高数 + 83333 = %u\n", UINT_MAX + 83333);
    
    return(0);
}

参照へ


第八章 いろいろなプログラムを作ってみよう


;
#include <stdio.h>

#define diff(x, y) ((x > y) ? (x - y) : (y - x))

int main(void)
{
    int num1, num2;
    double num3, num4;
    
    printf("整数A:"); scanf("%d", &num1);
    printf("整数B:"); scanf("%d", &num2);
    printf("その差は%dです。\n", diff(num1, num2));
    
    printf("実数C:"); scanf("%lf", &num3);
    printf("実数D:"); scanf("%lf", &num4);
    printf("その差は%lfです。\n", diff(num3, num4));
    
    return(0);
}

参照へ

;
/*
    max(max(a, b), max(c, d))); は、
    
    ((((((a) > (b)) ? (a) : (b)))) > ((((c) > (d) ? (c) : (d))))
       ? ((((a) > (b)) ? (a) : (b))) : ((((c) > (d)) ? (c) : (d))));
    
    
    
    max(max(max(a,b), c), d)); は、
    
    ((((((((a) > (b)) ? (a) : (b))) > (c) ? 
      ((((a) > (b)) ? (a) : (b))) : (c))) > (d) ) ? 
        ((((((a) > (b)) ? (a) : (b))) > (c) ? 
          ((((a) > (b)) ? (a) : (b))) : (c))) : (d));
    
    
    
    と展開される。
    下記プログラムより正しく動作することは確認できるが、
    プログラムの効率は非常に悪い。
    
*/


#include <stdio.h>

#define max(x, y) (((x) > (y)) ? (x) : (y))

int main(void)
{
    int a, b, c, d, i;
    for(i = 0; i < 4; i++) {
    	// a b c d の大小が変わっても、常に最小値が表示されていることを確認する
        a = i % 4;
        b = (i + 1) % 4;
        c = (i + 2) % 4;
        d = (i + 3) % 4;
        printf("a = %d   b = %d  c = %d  d = %d\n", a, b, c, d);
        printf("max(max(a, b), max(c, d)) = %d\n", max(max(a, b), max(c, d)));
        printf("max(max(max(a, b), c), d) = %d\n", max(max(max(a,b), c),d));
        
        putchar('\n');
    }
    
    return(0);
}

参照へ

/*
    swap(type, a, b);
    は、以下のように展開される。
    
    {type temp; temp = a; a = b; b = temp;}; 
    
    つまり、
    {
        type temp:
        temp = a;
        a = b;
        b = temp;
    }
    ;
    
    となるのでセミコロンがあっても正常に動作する。
    また、{}内の宣言はそのスコープ内でのみ有効なので、
    下記のプログラムのように使用しても、
    tempの多重宣言とはならない。
*/



#include <stdio.h>

#define swap(type, a, b)   {type temp; temp = a; a = b; b = temp;}
#define alert() (putchar('\a'))

int main(void)
{
    int a = 2, b = 9;
    double c = 3.33, d = -22.3;
    
    printf("a = %d, b = %d\n", a, b);
    swap(int, a, b);
    printf("a = %d, b = %d\n", a, b);

    printf("c = %lf, d = %lf\n", c, d);
    swap(double, c, d);
    printf("c = %lf, d = %lf\n", c, d);
    
    alert();
    
    return(0);
}

参照へ

/*
    列挙体は、選択肢の中から一つを選ぶような場合に扱いやすい
    可読性が多少上がるような気もする
    以下はゲーム主人公の状態の例(適当)
*/

#include <stdio.h>

// ステータスの列挙
enum status {normal, paralysis, poison, stone, dying };

// 関数原型宣言
void setStatus(enum status *s);
void showStatus(enum status s);


int main(void)
{
    enum status s;
    
    while(1) {
        setStatus(&s);
        showStatus(s);
        
        printf("\n");
        
        if(s == dying) break;
    }
    
    return 0;
}

void setStatus(enum status *s)
{
    int temp;
    puts("マヒ...0, 毒...1, 石化...2, 攻撃...3, 回復...4, 何もしない...それ以外");
    scanf("%d", &temp);
    
    switch(temp) {
        case 0 : *s = paralysis;
            break;
        case 1 : *s = poison;
            break;
        case 2 : *s = stone;
            break;
        case 3 : *s = dying;
            break;
        case 4 : *s = normal;
            break;
    }
}

void showStatus(enum status s)
{
    switch(s) {
        case normal : puts("正常");
            break;
        case paralysis : puts("マヒ");
            break;
        case poison : puts("毒");
            break;
        case stone : puts("石化");
            break;
        case dying : puts("戦闘不能");
            break;
    }
}

参照へ

/*
	あまり大きな数を入力すると、int の表現できる範囲を超えてしまう。10くらいまで。
*/

#include <stdio.h>

int fact(int n)
{
    int temp = 1;
    for(; n > 1; n--) {
        temp *= n;
    }
    
    return(temp);
}

int main(void)
{
    int num;
    
    do {
        printf("正の整数を入力してください:");
        scanf("%d", &num);
    } while(num < 0);
    
    printf("%dの階乗は%dです。\n", num, fact(num));
    
    return(0);
}

参照へ

#include <stdio.h>

int combination(int n, int r)
{
    if(n == r) {
        return(1);
    }
    else if(r == 0) {
        return(1);
    }
    else {
        return( combination(n - 1, r - 1) + combination(n - 1, r));
    }
}

int main(void)
{
    int n, r;
    puts("nCrを求めます。");
    printf("n = "); scanf("%d", &n);
    printf("r = "); scanf("%d", &r);
    
    if (n >= 0 && r >= 0) {
        if(n > r - 1) {
            printf("%dC%d = %d\n", n, r, combination(n, r));
        }
    }
    else printf("定義できない数です。\n");
    
    return(0);
}

参照へ

#include <stdio.h>

int main(void)
{
    int i, ch;
    int count[10] = {0};   // 0〜9までの数字の個数を格納する。配列の添字がカウントする数を表す。
    
    while(1) {
        ch = getchar();
        if(ch == EOF) break;
        
        if (ch >= '0' && ch <= '9') { 
            count[ch - '0']++;
        }
    }
    
    puts("数字文字の出現回数");
    for (i = 0; i < 10; i++) {
        printf("'%d' : ", i);
        
        for(; count[i] > 0; count[i]--) {
            putchar('*');
        }
        putchar('\n');
    }
    
    return(0);
}

参照へ

#include <stdio.h>

int main(void)
{
    int ch;
    int count = 1;
    while( (ch = getchar()) != EOF) {
        if(ch == '\n') count++;
    }
    
    printf("行数は%dです。", count);
    
    return(0);
}

参照へ


第九章 文字列の基本


;
/*
    ヌル文字までを文字列として扱うので、ABCと表示される
*/

#include <stdio.h>

int main(void)
{
    char str[] = "ABC\0DEF";
    
    printf("%s\n", str);
    
    return(0);
}

参照へ

;
#include <stdio.h>

int main(void)
{
    char str[] = "ABC";
    printf("%s\n", str);
    str[0] = '\0';
    printf("%s\n", str);
    
    return(0);
}

参照へ

/*
    現在学んでいる内容だけだと、プログラムが汚くなる。
    scanf(" %c", &ch);
    は、空白(改行含む)を読み飛ばして文字を一文字読み込む。
    scanf("%*c", &ch);
    は、改行を読み飛ばして文字を一文字読み込む。
    
    これらを使わない場合、無限ループで改行や空白を読み飛ばす必要がある。
*/


#include <stdio.h>

int str_char(const char str[], int c)
{
    int i;
    for(i = 0; str[i] != 0; i++) {
        if(str[i] == c)  return (i);
    }
    
    return(-1);
}

int main(void)
{
    char str[128];
    char ch;
    int no;
    
    printf("文字列を入力してください:");
    scanf("%s", str);
    
    printf("検索する文字を入力してください:");
    scanf(" %c", &ch);
    
    no = str_char(str, ch);
    
    if(no == -1) {
        printf("%cは見つかりませんでした。\n", ch);
    }
    else {
        printf("%cは添え字%dにあります。\n", ch, no);
    }
    return(0);
}

参照へ

/*
    scanf("%c", &ch);
    ではなく、
    
    scanf(" %c", &ch);
    であることに注意する。
*/

#include <stdio.h>

int str_chnum(const char str[], int c)
{
    int count = 0;
    int i;
    
    for(i = 0; str[i] != '\0'; i++) {
        if(str[i] == c) count++;
    }
    
    return(count);
}

int main(void)
{
    char str[128];
    int ch;
    
    printf("文字列を入力してください:");
    scanf("%s", str);
    printf("検索する文字を入力してください:");
    scanf(" %c", &ch);
    
    printf("%cは%d個ありました。\n", ch, str_chnum(str, ch));
    
    return(0);
}

参照へ

#include <stdio.h>

void put_string(const char str[])
{
    printf("%s", str);
}

int main(void)
{
    char str[128];
    
    printf("文字列を入力してください:");
    scanf("%s", str);
    
    put_string(str);
    putchar('\n');
    
    return(0);
}

参照へ

#include <stdio.h>

void put_stringn(const char str[], int no)
{
    for(; no > 0; no--) {
        printf("%s", str);
    }
}

int main(void)
{
    int no;
    char str[128];
    
    printf("文字列を入力してください:");
    scanf("%s", str);
    printf("表示する回数を入力してください:");
    scanf("%d", &no);
    
    putchar('\n');
    
    put_stringn(str, no);
    
    return(0);
}

参照へ

#include <stdio.h>

void put_rstring(const char str[])
{
    unsigned length = 0;
    while(str[length]) {
        length++;
    }
    for(; length > 0; length--) {
        putchar(str[length - 1]);
    }
}

int main(void)
{
    char str[128];
    
    printf("文字列を入力してください:");
    scanf("%s", str);
    
    puts("その文字列の逆順");
    put_rstring(str);
    putchar('\n');
    
    return(0);
}

参照へ

#include <stdio.h>

void rev_string(char str[])
{
    char temp;
    unsigned i;
    unsigned length = 0;
    while(str[length]) {
        length++;
    }
    
    for(i = 0; i < (length / 2); i++) {
        temp = str[i];
        str[i] = str[length - i - 1];
        str[length - i - 1] = temp;
    }
    str[length] = '\0';
}

int main(void)
{
    char str[128];
    
    printf("文字列を入力してください:");
    scanf("%s", str);
    
    rev_string(str);
    printf("%s\n", str);
    
    return(0);
}

参照へ

#include <stdio.h>

void null_string(char str[])
{
    str[0] = '\0';
}

int main(void) {
    char str[128];
    printf("文字列を入力してください:");
    scanf("%s", str);
    
    null_string(str);
    printf("%s\n", str);
    
    return(0);
}

参照へ

#include <stdio.h>

void del_digit(char str[])
{
    unsigned i = 0, count = 0;
    
    while (str[i]) {
        if(str[i] >= '0' && str[i] <= '9') {
            count++;
        }
        else {
            str[i - count] = str[i];
        }
        i++;
    }
    str[i - count] = '\0';
}

int main(void)
{
    char str[128];
    
    printf("文字列を入力してください:");
    scanf("%s", str);
    
    del_digit(str);
    
    printf("数字文字を削除した内容:%s\n", str);
    
    return(0);
}

参照へ


第十章 ポインタ


;

#include <stdio.h>

enum {January = 1, February, March, April, May, June, July, August, September, October, November, December};

void yesterday(int *y, int *m, int *d)
{
    if(*d != 1) {
        (*d)--;    // *d++ は *(d++) と同じ
    }
    else {
        if(*m == 1) {
            (*y)--;
            *m = 12;
        }
        else {
            (*m)--; 
        }
        
        switch (*m) {
            case February :
                if ( *y % 400 == 0) {
                    *d = 29;
                } else if(*y % 100 == 0) {
                    *d = 28;
                } else if ( *y % 4 == 0) {
                    *d = 29;
                }
                else {
                    *d = 28;
                }
                break;
            case April :
            case June :
            case September :
            case November :
                *d = 30;
                break;
            default :
                *d = 31;
        }
    }
}

void tomorrow( int *y, int *m, int *d)
{
    int limit;
    switch (*m) {
        case February :
            if (*y % 400 == 0) {
                limit = 29;
            } else if(*y % 100 == 0) {
                limit = 28;
            } else if( *y % 4 == 0) {
                limit = 29;
            } else {
                limit = 28;
            }
            break;
         case April : 
         case June :
         case September :
         case November :
            limit = 30;
            break;
        default : 
            limit = 31;
    }
    
    if(*d != limit) {
        (*d)++;
    }
    else {
        if(*m == December) {
            (*y)++;
            *m = 1;
            *d = 1;
        }
        else {
            (*m)++;
            *d = 1;
        }
    }
}

int dateExist(int year, int month, int day)
{
    int boolean = 0;
    if(year >= 0) {
        if (month <= 12 && month >= 1) {
            if(day >= 1) {
                int limit;
                switch (month) {
                    case February :
                        if( year % 400 == 0) {
                            limit = 29;
                        } else if( year % 100 == 0) {
                            limit = 28;
                        } else if( year % 4 == 0) {
                            limit = 29;
                        } else  {
                            limit = 28;
                        }
                        break;
                    case April : 
                    case June :
                    case September :
                    case November :
                        limit = 30;
                        break;
                    default :
                        limit = 31;
                }
                if(day <= limit) boolean = 1;
            }
        }
    }
    
    return(boolean);
}

int main(void)
{
    int year, month, day;
    
    while(1) {
        puts("好きな日付を入力してください。");
        printf("西暦:"); scanf("%d", &year);
        printf("月  :"); scanf("%d", &month);
        printf("日  :"); scanf("%d", &day);
        
        if(dateExist(year, month, day)) break;
        printf("そのような日付は存在しません\n\a");
    }
    
    printf("入力した日付:%d年%2d月%2d日\n", year, month, day);
    
    tomorrow(&year, &month, &day);
    printf("その翌日  :%d年%2d月%2d日\n", year, month, day);
    
    yesterday(&year, &month, &day);
    yesterday(&year, &month, &day);
    printf("その前日  :%d年%2d月%2d日\n", year, month, day);
    
    return(0);
}


参照へ

;
#include <stdio.h>

/*
    List10-8を使い回す
*/

void swap(int *nx, int *ny)
{
    int temp = *nx;
    *nx = *ny;
    *ny = temp;
}

void sort2(int *n1, int *n2)
{
    if(*n1 > *n2) {
        swap(n1, n2);
    }
}

void sort3(int *n1, int *n2, int *n3)
{
    sort2(n1, n2);
    sort2(n2, n3);  // 最高値n3が決定する
    sort2(n1, n2);
}

int main(void)
{
    int num1, num2, num3;
    
    puts("三つの整数を入力してください。");
    printf("整数1:"); scanf("%d", &num1);
    printf("整数2:"); scanf("%d", &num2);
    printf("整数3:"); scanf("%d", &num3);
    
    putchar('\n');
    
    sort3(&num1, &num2, &num3);
    puts("これらを昇順に並べました。");
    printf("整数1:%d\n", num1);
    printf("整数2:%d\n", num2);
    printf("整数3:%d\n", num3);
    
    return(0);
}

参照へ


第十一章 文字列とポインタ


;
#include <stdio.h>

void put_string(const char *str)
{
    while(*str) {
        putchar(*str++);
    }
}

int main(void)
{
    char str[100];
    
    printf("文字列を入力してください:");
    scanf("%s", str);
    
    put_string(str);
    putchar('\n');
    
    return(0);
}

参照へ

;
#include <stdio.h>

/*
    scanf("%c", &search);
    ではなく
    scanf(" %c", &search);
    であることに注意する
*/

char *str_chr(const char *str, char c)
{
    char *find;
    find = NULL;
    
    do {
        if(*str == c) {
            find = (char*)str;
            break;
        }
    } while(*str++);
    
    return(find);
}

int main(void)
{
    char str[100] = {0};
    char search;
    char *find;
    
    printf("文字列を入力してください:");
    scanf("%s", str);
    
    printf("検索する文字を入力してください:");
    scanf(" %c", &search);
    
    find = str_chr(str, search);
    
    if(find == NULL) {
        puts("検索した文字は見つかりませんでした。");
    }
    else {
        printf("検索した文字 %c は\"%p\"にあります。\n", *find , find);
    }
    
    return(0);
}

参照へ

#include <stdio.h>

int str_chnum(const char *str, int c)
{
    int count = 0;
    
    do {
        if(*str == c) count++;
    } while (*str++);
    
    return(count);
}


int main(void)
{
    char *str[100];
    char search;
    
    printf("文字列を入力してください:");
    scanf("%s", str);
    
    printf("検索する文字を入力してください:");
    
    // 直前にキーボードスキャン等をすると、char に'\n'が代入されてしまうため
    do {
        scanf("%c", &search);
    } while (search == '\n' || search == '\0');
    
    printf("\'%c\'は%d個発見されました。\n", search, str_chnum(str, search));
    
    return(0);
}

参照へ

#include <stdio.h>
#include <ctype.h>

void str_toupper(char *str)
{
    while (*str = toupper(*str)) {
        *str++;
    }
}

void str_tolower(char *str)
{
    while(*str = tolower(*str)) {
        *str++;
    }
    
}

int main(void)
{
    char str[100];
    
    printf("文字列を入力してください:");
    scanf("%s", str);
    
    str_toupper(str);
    printf("大文字:%s\n", str);
    
    str_tolower(str);
    printf("小文字:%s\n", str);
    
    return(0);
}

参照へ

#include <stdio.h>

void del_digit(char *str)
{
    int count = 0;
    do {
        if( *str >= '0' &&  *str <= '9') {
            count++;
        }
        else if (count > 0) {
            *(str - count) = *str;
        }
    } while(*str++);
}

int main(void)
{
    char str[100];
    
    printf("文字列を入力してください:");
    scanf("%s", str);
    
    puts("文字列の中から数字を消去します。");
    del_digit(str);
    printf("%s\n", str);
    
    return(0);
}

参照へ

#include <stdio.h>

int strtoi(const char *nptr)
{
    int number = 0;
    do {
        if(*nptr <= '9' && *nptr >= '0') {
            number *= 10;
            number += (*nptr - '0');
        }
    } while (*nptr++);
    
    return(number);
}

long strtol(const char *nptr)
{
    long number = 0;
    do {
        if(*nptr <= '9' && *nptr >= '0') {
            number *= 10;
            number += (*nptr - '0');
        }
    } while (*nptr++);
    
    return(number);
}

double strtof(const char *nptr)
{
    int flag = 0;
    double number;
    int count = 0;
    int i;
    
    do {
        if (*nptr == '.') {
            flag = -1;
        }
        
        if (*nptr <= '9' && *nptr >= '0') {
            if(flag) {
                double temp = (*nptr - '0');
                count++;
                for (i = 0; i < count; i++) {
                    temp /= 10;
                }
                number += temp;
            }
            else {
                number *= 10;
                number += (*nptr - '0');
            }
        }
    } while (*nptr++);
    
    return(number);
}


int main(void)
{
    char str[100];
    int i_number;
    long l_number;
    double d_number;
    
    printf("整数を入力してください:");
    scanf("%s", str);
    
    i_number = strtoi(str);
    printf("整数:%d\n", i_number);
    
    
    printf("整数を入力してください:");
    scanf("%s", str);
    
    l_number = strtol(str);
    printf("整数:%d\n", l_number);
    
    printf("実数を入力してください:");
    scanf("%s", str);
    
    d_number = strtof(str);
    printf("浮動小数点数:%f\n", d_number);
    
    return(0);
}

参照へ


第十二章 構造体


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

void put_time(void)
{
    time_t current;
    struct tm *local;
    time(&current);
    
    local= localtime(&current);
    
    printf("%02d時%02d分%02d秒" , local->tm_hour
                                , local->tm_min
                                , local->tm_sec
    );
    
}

int main(void)
{
    puts("現在の時刻は");
    put_time();
    puts("です。");
    
    return(0);
}

参照へ

/*
    そのうち何か作ります
*/

参照へ


第十三章 ファイル処理


#include <stdio.h>

int main(void)
{
    FILE *fp;
    char filename[100];
    
    printf("オープンするファイルを入力してください:");
    scanf("%s", filename);
    
    fp = fopen(filename, "r");
    
    if(fp == NULL) {
        printf("\aファイルをオープンできません。\n");
    }
    else {
        fclose(fp);
    }
    
    return(0);
}

参照へ

#include <stdio.h>

int main(void)
{
    FILE *fp;
    char filename[100];
    
    printf("ファイル名を入力してください:");
    scanf("%s", filename);
    
    fp = fopen(filename, "rb");
    
    if (fp == NULL) {
        puts("ファイルは存在しません。");
    }
    else {
        puts("そのファイルは存在します。");
        
        fclose(fp);
    }
    
    return(0);
}

参照へ

#include <stdio.h>

#define NUMBER_OF_STUDENTS 6

typedef struct {
    char name[100];
    double height, weight;
} Student;

void swap(Student *x, Student *y)
{
    if(x->height > y->height) {
        Student temp = *x;
        *x = *y;
        *y = temp;
    }
}

void sort(Student data[], int n)
{
    int k = n - 1;
    while (k >= 0) {
        int i, j;
        for(i = 1, j = -1; i <= k; i++) {
            if(data[i-1].height > data[i].height) {
                j = i - 1;
                swap(&data[i], &data[j]);
            }
        }
        k = j;
    }
}

int main(void)
{
    FILE *fp;
    Student students[NUMBER_OF_STUDENTS];
    
    if(( fp = fopen("hw.dat", "r")) == NULL) {
        printf("\aファイルをオープンできません。\n");
    }
    else {
        int i = 0;
        int j;
        // fscanf は読み取った項目の数を返す
        while (fscanf(fp, "%s%lf%lf", students[i].name, &students[i].height, &students[i].weight) == 3) {
            i++;
        }
        
        sort(students, NUMBER_OF_STUDENTS);
        
        for(i = 0; i < NUMBER_OF_STUDENTS; i++) {
            printf("%-10s %5.1f %5.1f\n", students[i].name, students[i].height, students[i].weight);
        }
        
        fclose(fp);
    }
    
    return(0);
}

参照へ

#include <stdio.h>

void write_profile(FILE *fp)
{
    double height, weight;
    char name[100];
    printf("名前を入力してください:");
    scanf("%s", name);
    printf("身長を入力してください:");
    scanf("%lf", &height);
    printf("体重を入力してください:");
    scanf("%lf", &weight);
    
    fprintf(fp, "%s %f %f\n", name, height, weight);
    printf("ファイルに書き込みました。\n");
}


int main(void)
{
    FILE *fp;
    
    if((fp = fopen("practice1304_profile.dat", "a")) == NULL) {
        printf("\aファイルをオープンできません。\n");
    }
    else {
        int flag = 0;
        while(1) {
            write_profile(fp);
            printf("入力を続けますか?  Yes...1 / No...0\n");
            scanf("%d", &flag);
            
            if(!flag) break;
        }
        fclose(fp);
    }
    
    return(0);
}

参照へ

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

const char data_file[] = "practice1305_time_and_feel.dat";

void get_data(void)
{
    FILE *fp;
    
    if (( fp = fopen(data_file, "r")) == NULL) {
        printf("本プログラムを実行するのは初めてですね。\n");
    }
    else {
        int year, month, day, h, m, s;
        char feel[100];
        
        fscanf(fp, "%d%d%d%d%d%d%s", &year, &month, &day, &h, &m, &s, feel);
        printf("前回は%d年%d月%d日%d時%d分%d秒で、気分は%sでした。\n",
            year, month, day, h, m, s, feel);
        fclose(fp);
    }
}

void put_data(void)
{
    FILE *fp;
    time_t    t;
    struct tm *local;
    
    time(&t);
    local = localtime(&t);
    
    if (( fp = fopen(data_file, "w")) == NULL) {
        printf("\aファイルをオープンできません。\n");
    }
    else {
        char feel[100];
        printf("今の気分は:");
        scanf("%s", feel);
        fprintf(fp, "%d %d %d %d %d %d %s\n",
            local->tm_year + 1900, local->tm_mon + 1, local->tm_mday,
            local->tm_hour,        local->tm_min,    local->tm_sec,  feel);
        fclose(fp);
    }
}

int main(void)
{
    get_data();
    
    put_data();
    
    return(0);
}

参照へ

#include <stdio.h>

int main(void)
{
    int ch;
    FILE *fp;
    char fname[128];
    int count = 1;
    
    printf("ファイル名:");
    scanf("%s", fname);
    
    if((fp = fopen(fname, "r")) == NULL) {
        printf("\aファイルをオープンできません。\n");
    }
    else {
        while ((ch = getc(fp)) != EOF) {
            if(ch == '\n') count++;
        }
        fclose(fp);
        
        printf("このファイルの行数は%dです。\n", count);
    }
    
    return(0);
}

参照へ

#include <stdio.h>

int main(void)
{
    int ch;
    FILE *fp;
    char fname[64];
    int count = 0;
    
    printf("ファイル名:");
    scanf("%s", fname);
    
    if ((fp = fopen(fname, "r")) == NULL) {
        printf("\aファイルをオープンできません。\n");
    }
    else {
        while ((ch = fgetc(fp)) != EOF) {
            if (ch <= '9' && ch >= '0') count++;
        }
        
        fclose(fp);
        printf("このファイルに含まれる数字の数は%d個です。", count);
    }
    
    return(0);
}

参照へ

#include <stdio.h>

int main(void)
{
    int ch;
    FILE *sfp, *dfp;
    char sname[64], dname[64];
    
    printf("コピー元ファイル名:"); scanf("%s", sname);
    printf("コピー先ファイル名:"); scanf("%s", dname);
    
    if ((sfp = fopen(sname, "r")) == NULL ) {
        printf("\aコピー元ファイルをオープンできません。\n");
    }
    else {
        if (( dfp = fopen(dname, "w")) == NULL) {
            printf("\aコピー先ファイルをオープンできません。\n");
        }
        else {
            while ((ch = fgetc(sfp)) != EOF) {
                fputc(ch, dfp);
                
                / * 変更点 */
                putchar(ch);
                
            }
            fclose(dfp);
        }
        fclose(sfp);
    }
    
    return(0);
}

参照へ

#include <stdio.h>
#include <ctype.h>

int main(void)
{
    int ch;
    FILE *sfp, *dfp;
    char sname[64], dname[64];
    
    printf("コピー元ファイル名:"); scanf("%s", sname);
    printf("コピー先ファイル名:"); scanf("%s", dname);
    
    if((sfp = fopen(sname, "r")) == NULL) {
        printf("\aコピー元ファイルをオープンできません。\n");
    }
    else {
        if ((dfp = fopen(dname, "w")) == NULL) {
            printf("\aコピー先ファイルをオープンできません。\n");
        }
        else {
            while ((ch = fgetc(sfp)) != EOF) {
                /* 変更点 */
                ch = toupper(ch);
                
                
                fputc(ch, dfp);
            }
            fclose(dfp);
        }
        fclose(sfp);
    }
    
    return(0);
}


参照へ

/*
    要するに演習13-9 の
    toupper(ch);  ->  tolower(ch);
*/

#include <stdio.h>
#include <ctype.h>

int main(void)
{
    int ch;
    FILE *sfp, *dfp;
    char sname[64], dname[64];
    
    printf("コピー元ファイル名:"); scanf("%s", sname);
    printf("コピー先ファイル名:"); scanf("%s", dname);
    
    if ((sfp = fopen(sname, "r")) == NULL) {
        printf("\aコピー元ファイルをオープンできません。\n");
    }
    else {
        if ((dfp = fopen(dname, "w")) == NULL) {
            printf("\aコピー先ファイルをオープンできません。\n");
        }
        else {
            while ((ch = fgetc(sfp)) != EOF) {
                /* 変更点 */
                ch = tolower(ch);
                
                
                fputc(ch, dfp);
            }
            fclose(dfp);
        }
        fclose(sfp);
    }
    
    return(0);
}

参照へ

#include <stdio.h>

#define DATA_NUMBER 10

int main(void)
{
    FILE *fp;
    double data[DATA_NUMBER] = {10.3, 33, 12345, 11.1111, 3.14159265, 0, 7777, 
        91234, 12340, 5};
    
    if ((fp = fopen("practice1311_data.dat", "wb")) == NULL) {
        printf("\aファイルをオープンできません。\n");
    }
    else {
        fwrite(data, sizeof(double), DATA_NUMBER, fp);
        fclose(fp);
    }
    
    if ((fp = fopen("practice1311_data.dat", "rb")) == NULL) {
        printf("\aファイルをオープンできません。\n");
    }
    else {
        int i;
        fread(data, sizeof(double), DATA_NUMBER, fp);
        
        for(i = 0; i < DATA_NUMBER; i++) {
            printf("%22.10f\n", data[i]);
        }
        fclose(fp);
    }
    
    return(0);
}

参照へ

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

char data_file[] = "datetime.bin";

int main(void)
{
    FILE *fp;
    time_t t;
    struct tm * local;
    
    time(&t);
    local = localtime(&t);
    
    if ((fp = fopen(data_file, "wb")) == NULL) {
        printf("\aファイルをオープンできません。\n");
    }
    else {
        fwrite(local, sizeof(struct tm), 1, fp);
        fclose(fp);
    }
    
    if ((fp = fopen(data_file, "rb")) == NULL) {
        printf("\aファイルをオープンできません。\n");
    }
    else {
        fread(local, sizeof(struct tm), 1, fp);
        fclose(fp);
        
        printf("%d %d %d %d %d %d \n", 
            local->tm_year + 1900, local->tm_mon + 1, local->tm_mday,
            local->tm_hour,        local->tm_min,     local->tm_sec);
    }
    
    return(0);
}

参照へ


inserted by FC2 system