新・明解C言語(入門編)  ー演習問題回答ー まとめ

C言語

教科書の回答がありませんので、順番にまとめていきます。
本当の初心者ですので、間違いなどありましたらご教授のほどお願いいたします。
また、回答は私個人で作成していますので、ご了承くださいませ。

第1章 まずは慣れよう

演習問題 1-1(更新 2021年2月7日)

演習問題 1-2(更新 2021年2月7日)

演習問題 1-3(更新 2021年2月7日)

演習問題 1-4(更新 2021年2月7日)

演習問題 1-5(更新 2021年2月7日)

演習問題 1-6(更新 2021年2月7日)

演習問題 1-7(更新 2021年2月7日)

演習問題 1-8(更新 2021年2月7日)

演習問題 1-9(更新 2021年2月7日)

第2章 演算と型

演習問題 2-1(更新 2021年2月14日)

演習問題 2-2(更新 2021年2月14日)

演習問題 2-3(更新 2021年2月14日)

演習問題 2-4(更新 2021年2月14日)

演習問題 2-5(更新 2021年2月14日)

演習問題 2-6(更新 2021年2月14日)

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

演習問題 3-1(更新 2021年2月20日)

演習問題 3-2(更新 2021年2月20日)

演習問題 3-3(更新 2021年2月20日)

演習問題 3-4(更新 2021年2月20日)

演習問題 3-5(更新 2021年2月20日)

演習問題 3-6(更新 2021年2月20日)

演習問題 3-7(更新 2021年2月20日)

演習問題 3-8(更新 2021年2月20日)

演習問題 3-9(更新 2021年5月19日)

演習問題 3-10(更新 2021年2月20日)

演習問題 3-11(更新 2021年2月20日)

演習問題 3-12(更新 2021年2月20日)

演習問題 3-13(更新 2021年2月20日)

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

演習問題 4-1(更新 2021年3月2日)

演習問題 4-2(更新 2021年3月2日)

演習問題 4-3(更新 2021年3月2日)

演習問題 4-4(更新 2021年3月2日)

演習問題 4-5(更新 2021年3月2日)

演習問題 4-6(更新 2021年3月2日)

演習問題 4-7(更新 2021年3月2日)

演習問題 4-8(更新 2021年3月2日)

演習問題 4-9(更新 2021年3月2日)

演習問題 4-10(更新 2021年3月2日)

演習問題 4-11(更新 2021年3月2日)

演習問題 4-12(更新 2021年3月2日)

演習問題 4-13(更新 2021年3月2日)

演習問題 4-14(更新 2021年3月2日)

演習問題 4-15(更新 2021年3月2日)

演習問題 4-16(更新 2021年3月2日)

演習問題 4-17(更新 2021年3月2日)

演習問題 4-18(更新 2021年3月2日)

演習問題 4-19(更新 2021年3月2日)

演習問題 4-20(更新 2021年3月2日)

演習問題 4-21(更新 2021年3月2日)

演習問題 4-22(更新 2021年3月2日)

演習問題 4-23(更新 2021年3月2日)

演習問題 4-24(更新 2021年3月2日)

演習問題 4-25(更新 2021年3月2日)

第5章 配列

演習問題 5-1(更新 2021年3月26日)

演習問題 5-2(更新 2021年3月26日)

演習問題 5-3(更新 2021年3月26日)

演習問題 5-4(更新 2021年3月26日)

演習問題 5-5(更新 2021年3月26日)

演習問題 5-6(更新 2021年3月26日)

演習問題 5-7(更新 2021年3月26日)

演習問題 5-8(更新 2021年3月26日)

演習問題 5-9(更新 2021年3月26日)

演習問題 5-10(更新 2021年3月26日)

演習問題 5-11(更新 2021年3月26日)

演習問題 5-12(更新 2021年3月26日)

第6章 関数

演習問題 6-1(更新 2021年5月28日)

演習問題 6-2(更新 2021年3月28日)

演習問題 6-3(更新 2021年3月28日)

演習問題 6-4(更新 2021年3月28日)

演習問題 6-5(更新 2021年3月28日)

演習問題 6-6(更新 2021年3月28日)

演習問題 6-7(更新 2021年3月28日)

演習問題 6-8(更新 2021年3月28日)

演習問題 6-9(更新 2021年3月28日)

演習問題 6-10(更新 2021年3月28日)

演習問題 6-11(更新 2021年5月31日)

演習問題 6-12(更新 2021年3月28日)

演習問題 6-13(更新 2021年3月28日)

演習問題 6-14(更新 2021年3月28日)

演習問題 6-15(更新 2021年3月28日)

第7章 整数型と文字型

演習問題 7-1(更新 2021年3月28日)

演習問題 7-2(更新 2021年3月28日)

演習問題 7-3(更新 2021年3月28日)

演習問題 7-4(更新 2021年3月28日)

演習問題 7-5(更新 2021年3月28日)

演習問題 7-6(更新 2021年3月28日)

演習問題 7-7(更新 2021年3月28日)

演習問題 7-8(更新 2021年3月28日)

演習問題 7-9(更新 2021年3月28日)

演習問題 7-10(更新 2021年3月28日)

演習問題 7-11(更新 2021年3月28日)

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

演習問題 8-1(更新 2021年4月12日)

演習問題 8-2(更新 2021年4月12日)

演習問題 8-3(更新 2021年4月12日)

演習問題 8-4(更新 2021年4月12日)

演習問題 8-5(更新 2021年4月12日)

演習問題 8-6(更新 2021年4月12日)

演習問題 8-7(更新 2021年4月12日)

演習問題 8-8(更新 2021年4月12日)

演習問題 8-9(更新 2021年4月12日)

演習問題 8-10(更新 2021年4月12日)

第9章 文字列の基本

演習問題 9-1(更新 2021年4月12日)

演習問題 9-2(更新 2021年4月12日)

演習問題 9-3(更新 2021年5月23日)

演習問題 9-4(更新 2021年4月12日)

演習問題 9-5(更新 2021年4月12日)

演習問題 9-6(更新 2021年4月12日)

演習問題 9-7(更新 2021年4月12日)

演習問題 9-8(更新 2021年4月12日)

演習問題 9-9(更新 2021年4月12日)

演習問題 9-10(更新 2021年4月12日)

演習問題 9-11(更新 2021年4月12日)

演習問題 9-12(更新 2021年4月12日)

第10章 ポインタ

演習問題 10-1(更新 2021年4月24日)

演習問題 10-2(更新 2021年4月24日)

演習問題 10-3(更新 2021年4月24日)

演習問題 10-4(更新 2021年4月24日)

演習問題 10-5(更新 2021年4月24日)

第11章 文字列とポインタ

演習問題 11-1(更新 2021年4月24日)

演習問題 11-2(更新 2021年4月24日)

演習問題 11-3(更新 2021年4月24日)

演習問題 11-4(更新 2021年4月24日)

演習問題 11-5(更新 2021年4月24日)

演習問題 11-6(更新 2021年4月24日)

演習問題 11-7(更新 2021年4月24日)

演習問題 11-8(更新 2021年4月24日)

演習問題 11-9(更新 2021年4月24日)

演習問題 11-10(更新 2021年4月24日)

第12章 構造体

演習問題 12-1(更新 2021年5月3日)

演習問題 12-2(更新 2021年5月3日)

演習問題 12-3(更新 2021年5月3日)

演習問題 12-4(更新 2021年5月3日)

演習問題 12-5(更新 2021年5月3日)

第13章 ファイル処理

演習問題 13-1(更新 2021年5月3日)

演習問題 13-2(更新 2021年5月3日)

演習問題 13-3(更新 2021年5月3日)

演習問題 13-4(更新 2021年5月3日)

演習問題 13-5(更新 2021年5月3日)

演習問題 13-6(更新 2021年5月3日)

演習問題 13-7(更新 2021年5月3日)

演習問題 13-8(更新 2021年5月3日)

演習問題 13-9(更新 2021年5月3日)

演習問題 13-10(更新 2021年5月3日)

演習問題 13-11(更新 2021年5月3日)

演習問題 13-12(更新 2021年5月3日)

演習問題 13-13(更新 2021年5月3日)



第1章 (回答)まずは慣れよう

(回答)
演習問題 1-1

#include<stdio.h>

int main(void)
{    
     printf("15 + 37 を引いた値は%dです。\n" , 15 - 37);

return 0;
}

(回答) 
演習問題 1-2

#include<stdio.h>

int main(void)
{
printf("天\n地\n人");

return 0;
}

(回答) 
演習問題 1-3

#include<stdio.h>

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

    return 0;
}

(回答) 
演習問題 1
4

#include<stdio.h>

int main(void)
{
    int x = 3.14;
    int y = 5.7;

    printf("3.14は%dとなる。\n",x);
    printf("5.7は%dとなる。\n",y);

    return 0;
}

(回答) 
演習問題 1-
5

#include<stdio.h>

int main(void)
{
    int no ;
    printf("数値を入力してください。:");
    scanf("%d",&no);
    printf("%dに12を加えると%dです。\n", no , no + 12);

    return 0;
}

(回答) 
演習問題 1-
6

#include<stdio.h>

int main(void)
{
    int no ;
    printf("数値を入力してください。:");
    scanf("%d",&no);
    printf("%dに6を減じるとると%dです。\n", no , no - 6);

    return 0;
}

(回答) 
演習問題 1-
7

#include<stdio.h>

int main(void)
{
    puts("天\n地\n人\n");

    return 0;
}

(回答) 
演習問題 1-
8

#include<stdio.h>

int main(void)
{
    int n1,n2;
    int wa;

    puts("二つの整数を入力してください。");
    printf("整数1:");  scanf("%d",&n1);
    printf("整数2:");  scanf("%d",&n2);

    wa = n1 * n2;

    printf("それらの積は%dです。",wa);

    return 0;
}

(回答) 
演習問題 1-
9

#include<stdio.h>

int main(void)
{
    int n1,n2,n3;
    int wa;

    puts("三つの整数を入力してください。");
    printf("整数1:");  scanf("%d",&n1);
    printf("整数2:");  scanf("%d",&n2);
    printf("整数3:");  scanf("%d",&n3);

    wa = n1 +n2 + n3;

    printf("それらの和は%dです。",wa);
    
    return 0;
    }
第2章 (回答)演算と型

(回答) 
演習問題 2
-1

#include<stdio.h>

int main(void)
{
    int x , y;

    puts("二つの整数を入力してください。");
    printf("整数x:"); scanf("%d",&x);
    printf("整数y:"); scanf("%d",&y);

    printf("xの値はyの%d%です。\n", 100 * x / y);
    
    return 0;

}

(回答) 
演習問題 2-2

#include<stdio.h>

int main(void)
{
    int x , y;
    
    puts("二つの整数を入力してください。");
    printf("整数x:"); scanf("%d",&x);
    printf("整数y:"); scanf("%d",&y);

    printf("それらの和は%dで積は%dです。\n", x + y, x * y);
    
    return 0;

}

(回答) 
演習問題 2-
3

#include<stdio.h>

int main(void)
{
    double no;

    printf("実数を入力してください。:");
    scanf("%lf", &no);

    printf("あなたは%fと入力しましたね。\n",no);

    return 0;
}

(回答) 
演習問題 2-
4

#include<stdio.h>

int main(void)
{
    double no;

    printf("実数を入力してください。:");
    scanf("%lf", &no);

    printf("あなたは%fと入力しましたね。\n",no);

    return 0;
}

(回答) 
演習問題 2-
5

#include<stdio.h>

int main(void)
{
    int a, b;

    puts("二つの整数を入力してください。:");

    printf("整数a:"); scanf("%d", &a);
    printf("整数b:"); scanf("%d", &b);

    printf("aの値はbの%f%です。\n", (double)100 * a / b );

    return 0;    
}

(回答) 
演習問題 2-
6

#include<stdio.h>

int main(void)
{
    int a;
    double ave;

    printf("身長を入力してください。:");
    scanf("%d",&a);

    ave = (double)( a - 100) * 0.9;

    printf("標準体重は%3.1fです。\n", ave);

    return 0;
}
第3章 (回答)プログラムの流れの分岐

(回答) 
演習問題 3-
1

#include<stdio.h>

int main(void)
{
    int a, b;

    puts("二つの整数を入力してください。:");
    printf("整数A:"); scanf("%d",&a);
    printf("整数B:"); scanf("%d",&b);

    if(a % b)
        puts("BはAの約数ではありません。");
    else
        puts("BはAの約数です。");

    return 0;
}

(回答) 
演習問題 3-
2

#include<stdio.h>

int main(void)
{
    int no;

    printf("整数を入力してください。");
    scanf("%d",&no);

    if( no == 0)
        puts("その数は0です。");
    else if( no > 0)
        puts("その数は正です。");
    else if( no < 0)
        puts("その数は負です。");

    return 0;   
}

(回答) 
演習問題 3-
3

#include<stdio.h>

int main(void)
{
    int no;

    printf("整数を入力してください。:");
    scanf("%d",&no);

    if( no > 0)
        printf("絶対値は%dです。", no);
    else
        printf("絶対値は%dです。",-no);
    
    return 0;
}

(回答) 
演習問題 3-
4

 #include<stdio.h>

int main(void)
{
    int a, b;

    puts("二つの整数を入力してください。:");
    printf("整数A:"); scanf("%d",&a);
    printf("整数B:"); scanf("%d",&b);

    if( a == b)
        puts("AとBは等しいです。");
    else if( a > b)
        puts("AはBより大きいです。");
    else
        puts("AはBより小さいです。");
    
    return 0;
}

(回答) 
演習問題 3-
5

#include<stdio.h>

int main(void)
{
    int a, b;

    puts("二つの整数を入力してください。:");
    printf("整数a:"); scanf("%d",&a);
    printf("整数b:"); scanf("%d",&b);
    
    puts("等価演算子");
    if( a == 0)
        printf("a == b : 1\n");
    else
        printf("a == b : 0\n");
    
    if( a != 0)
        printf("a != b : 1\n");
    else
        printf("a != b : 0\n");
    
    puts("関係演算子");
    if( a < b)
        printf("a < b : 1\n");
    else
        printf("a < b : 0\n");
    
    if( a > b)
        printf("a > b : 1\n");
    else
        printf("a > b : 0\n");
    
    if( a <= b)
        printf("a <= b : 1\n");
    else
        printf("a <= b : 0\n");
    
    if( a >= b)
        printf("a <= b : 1\n");
    else
        printf("a <= b : 0\n");
    
    return 0;
}

(回答) 
演習問題 3-
6

#include<stdio.h>

int main(void)
{
    int n1, n2, n3, min;

    puts("三つの整数を入力してください。");
    printf("整数1:"); scanf("%d",&n1);
    printf("整数2:"); scanf("%d",&n2);
    printf("整数3:"); scanf("%d",&n3);

    min = n1;
    if( n2 < min) min = n2;
    if( n3 < min) min = n3;

    printf("入力した最小値は%dです。\n", min);

    return 0;
}

(回答) 
演習問題 3-
7

#include<stdio.h>

int main(void)
{
    int n1, n2, n3, n4, max;

    puts("四つの整数を入力してください。");
    printf("整数1:"); scanf("%d",&n1);
    printf("整数2:"); scanf("%d",&n2);
    printf("整数3:"); scanf("%d",&n3);
    printf("整数4:"); scanf("%d",&n4);

    max = n1;
    if( n2 > max) max = n2;
    if( n3 > max) max = n3;
    if( n4 > max) max = n4;

    printf("入力した最大値は%dです。\n", max);

    return 0;
}

(回答) 
演習問題 3-
8

#include<stdio.h>

int main(void)
{
    int n1, n2;

    puts("二つの整数を入力してください。");
    printf("整数1:"); scanf("%d",&n1);
    printf("整数2:"); scanf("%d",&n2);

    if( n1 > n2)
        printf("それらの差は%dです。\n", n1 - n2);
    else
        printf("それらの差は%dです。\n", n2 - n1);
    
    return 0;
}

(回答) 
演習問題 3-
9

#include<stdio.h>

int main(void)
{
    int n1, n2, n3, min;

    puts("三つの整数を入力してください。");
    printf("整数1:"); scanf("%d",&n1);
    printf("整数2:"); scanf("%d",&n2);
    printf("整数3:"); scanf("%d",&n3);

    min = (n1 < n2) ? n1 : n2;
    min = (min < n3) ? min : n3;

    printf("入力した最小値は%dです。\n", min);

    return 0;
}

(回答) 
演習問題 3-
10

#include<stdio.h>

int main(void)
{
    int n1, n2, n3;

    puts("三つの整数を入力してください。");
    printf("整数A:"); scanf("%d",&n1);
    printf("整数B:"); scanf("%d",&n2);
    printf("整数C:"); scanf("%d",&n3);

    if(n1 == n2 && n2 == n3)
        printf("三つの値は等しいです。\n");
    else if(n1 == n2 || n1 == n3 || n2 == n3)
        printf("二つの値が等しいです。\n");
    else
        printf("三つの値は異なります。\n");
    
    return 0;
}

(回答) 
演習問題 3-1
1

#include<stdio.h>

int main(void)
{
    int n1, n2;

    puts("二つの整数を入力してください。");
    printf("整数A:"); scanf("%d",&n1);
    printf("整数B:"); scanf("%d",&n2);
   
    if((n1 > n2 && n1 - n2 <= 10)  ||  (n2 > n1 && n2 - n1 <= 10))
        printf("それらの差は10以下です。\n");
    else
        printf("それらの差は11以上です。\n");

    return 0;
}

(回答) 
演習問題 3-1
2

#include<stdio.h>

int main(void)
{
    int no;

    printf("整数を入力してください。:");
    scanf("%d",&no);

    switch(no % 2){
        case 0:puts("その数は偶数です。"); break;
        default:puts("その数は奇数です。"); break;
    }
    return 0;
}

(回答) 
演習問題 3-1
3

#include<stdio.h>

int main(void)
{
    int month;

    printf("何月ですか。:");
    scanf("%d",&month);

    switch(month){
        case 1:
        case 2:printf("%d月は冬です。\n",month); break;
        case 3:
        case 4:
        case 5:printf("%d月は春です。\n",month); break;
        case 6:
        case 7:
        case 8:printf("%d月は夏です。\n",month); break;
        case 9:
        case 10:
        case 11:printf("%d月は秋です。\n",month); break;
        case 12:printf("%d月は冬です。\n",month); break;
        default:printf("%d月はありません。\n",month); break;
    }
    return 0;
}
第4章 (回答)プログラムの流れの繰返し

(回答) 
演習問題 4-
1

#include<stdio.h>

int main(void)
{
    int no;
    int retty;

    do{
        printf("整数を入力してください。:");
        scanf("%d",&no);

        if(no == 0)
            puts("その数は0です。");
        else if(no > 0)
            puts("その数は正です。");
        else
            puts("その数は負です。");

        printf("もう一度?【はい・・・0 / 終了・・・9】");
        scanf("%d",&retty);    
    }while( retty == 0);

    return 0;
}

(回答) 
演習問題 4-
2

#include<stdio.h>

int main(void)
{
    int a = 0;
    int b = 0;
    int f = 0;
    int sum = 0;

    puts("二つの整数を入力してください。");
    printf("整数A:"); scanf("%d",&a);
    printf("整数B:"); scanf("%d",&b);
        
    if(a <= b){
        do{
            sum = sum + a;
            a = a +1;
            f = f +1;
        }while( a <= b);
        printf("%d以上%d以下の全数値の和は%dです。\n", a - f, b, sum);
    }
    else{
        do{
            sum = sum + b;
            b = b + 1;
            f = f + 1;
        }while( a >= b );
        printf("%d以上%d以下の全数値の和は%dです。\n",b - f, a, sum);
    }

    return 0;
}

(回答) 
演習問題 4-
3

#include<stdio.h>

int main(void)
{
    int no;

    printf("正の整数を入力してください。:");
    scanf("%d",&no);

    while(no >= 0){
        printf("%d ",no);
        if(no == 0){
            printf("\n");
        }
        no--;
    }

    return 0;
}

(回答) 
演習問題 4-
4

#include<stdio.h>

int main(void)
{
    int no;

    printf("整数を入力してください。:");
    scanf("%d",&no);

    while(no >= 1){
        printf("%d ",no);
        no--;
    }
    
    return 0;
}

(回答) 
演習問題 4-
5

#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){
    printf("\n");
    }
    }
    return 0;
}

(回答) 
演習問題 4-
6

#include<stdio.h>

int main(void)
{
    int i = 2;
    int no;

    printf("整数を入力してください。:");
    scanf("%d",&no);

    while(i <= no){
        printf("%d ",i);
        i = i +2;
    }
   
    printf("\n");
        
    return 0;
}

(回答) 
演習問題 4-
7

#include<stdio.h>

int main(void)
{
    int i = 2;
    int no;

    printf("整数を入力してください。:");
    scanf("%d",&no);

    while(i <= no){
        printf("%d ",i);
        i = i * 2;
    }
   
    printf("\n");
        
    return 0;
}

(回答) 
演習問題 4-
8

#include<stdio.h>

int main(void)
{
    int no;

    printf("正の整数:");
    scanf("%d",&no);

    if(no > 1){
    while(no-- > 0)
        putchar('*');
    putchar('\n');

    return 0;
}
}

(回答) 
演習問題 4-
9

#include<stdio.h>

int main(void)
{
    int i = 0;
    int no;

    printf("正の整数:");
    scanf("%d", &no);

    while(i < no){
        i++;
        if(i % 2)
            putchar('+');
        else
            putchar('-');
    }    
        printf("\n");
    return 0;         
}

(回答) 
演習問題 4-
10

#include<stdio.h>

int main(void)
{
    int i = 0;
    int no;

    printf("正の整数:");
    scanf("%d", &no);

    while(i < no){
        putchar('*');
        i++;     
        printf("\n");
    }
    return 0;         
}

(回答) 
演習問題 4-1
1

#include<stdio.h>

int main(void)
{
    int no;

    do{
    printf("正の整数を入力してください。:");
    scanf("%d",&no);
    if(no <= 0)
    puts("\a正ではない数を入力しないでください。");
    }while(no <= 0);

    printf("%dを逆から読むと",no);

    while(no > 0){
        printf("%d", no % 10);
        no /= 10;
    }
    puts("です。");

    return 0;
}

(回答) 
演習問題 4-1
2

#include<stdio.h>

int main(void)
{
    int no;
    int count = 0;

    do{
    printf("正の整数を入力してください。:");
    scanf("%d",&no);
    if(no <= 0)
    puts("\a正ではない数を入力しないでください。");
    }while(no <= 0);

    printf("%d", no);

    while(no > 0){
        no /= 10;
        count++;
    }
    printf("は%d桁です。", count);

    return 0;
}

(回答) 
演習問題 4-1
3

#include<stdio.h>

int main(void)
{
    int n, i;
    int sum = 0;
    
    printf("nの値:");
    scanf("%d",&n);

    for(i = 0; i <= n; i++)
    sum = sum + i;

    printf("1から%dまでの和は%dです。", n, sum);

    return 0;
}

(回答) 
演習問題 4-1
4

#include<stdio.h>

int main(void)
{
    int i, no;

    printf("正の整数を入力してください。:");
    scanf("%d",&no);

    for(i = 1; i <= no; i++)
        printf("%d", i % 10);
    
    return 0;    
}

(回答) 
演習問題 4-1
5

#include<stdio.h>

int main(void)
{
    int no1, no2, i, ave;
    
    printf("何㎝から:"); scanf("%d",&no1);
    printf("何㎝まで:"); scanf("%d",&no2);

    for(i = no1; i <= no2; i += 5){
        printf("%dcm %.2fkg\n",i ,(double)(i -100) * 0.9);
    }
    return 0;
}

(回答) 
演習問題 4-1
6

#include<stdio.h>

int main(void)
{
    int i, n;

    printf("整数値:");
    scanf("%d",&n);

    for(i = 1; i <= n; i += 2)
        printf("%d ", i);
    putchar('\n');

    return 0;
}

(回答) 
演習問題 4-1
7

#include<stdio.h>

int main(void)
{
    int i, n;

    printf("nの整数値:");
    scanf("%d",&n);

    for(i = 1; i <= n; i++)
        printf("%dの2乗は%d\n", i, i * i);
    
    return 0;
}

(回答) 
演習問題 4-1
8

#include<stdio.h>

int main(void)
{
    int i, n;

    printf("何個*を表\示しますか。:");
    /*shify_JIS 0x5c問題「表」の表示をする為¥を挿入*/
    scanf("%d",&n);

    for(i = 1;i <= n;i++){
        putchar('*');
        if(i % 5 == 0){
        putchar('\n');
        }
    }
    return 0;
}

(回答) 
演習問題 4-1
9

#include<stdio.h>

int main(void)
{
    int i, n;
    int sum = 0;

    printf("整数値:");
    scanf("%d",&n);

    for(i = 1;i <= n;i++){
        if(n % i == 0){
        printf("%d\n",i);
        sum++;
        }
    }
    printf("約数は%d個です\n",sum);

    return 0;
}

(回答) 
演習問題 4-
20

#include<stdio.h>

int main(void)
{
    int i, j;

    do{
    printf("   |");
    for(i = 1; i <= 9; i++)
        printf("%3d",i);
    }while(i <= 9);
    putchar('\n');

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

(回答) 
演習問題 4-
2
1

#include<stdio.h>

int main(void)
{
    int i , j, n;

    puts("正方形を作ります。");
    printf("何段ですか。:");
    scanf("%d",&n);

    for(i = 1; i <= n; i++){
        for(j = 1; j <= n; j++)
        putchar('*');
    putchar('\n');
    }
    return 0;
}

(回答) 
演習問題 4-
2
2

#include<stdio.h>

int main(void)
{
    int n1, n2, i, j, height, wide;

    puts("横長の長方形を作ります。");
    printf("一辺(その一):"); scanf("%d",&n1);
    printf("一辺(その二):"); scanf("%d",&n2);

    if(n1 < n2){
        height = n1; wide = n2;
    }else{
        height = n2; wide = n1;
    }
    
    for(i = 1; i <= height; i++){
        for(j = 1; j <= wide; j++)
            putchar('*');
        putchar('\n');
    }
    return 0;
}

(回答) 
演習問題 4-
2
3①

#include<stdio.h>

int main(void)
{
    int i, j, len;

    puts("左上直角二等辺三角形を作ります。");
    printf("短辺:"); scanf("%d",&len);

    for(i = 1; i <= len; i++){
        for(j = len; j >= i; j--)
            putchar('*');
        putchar('\n');
    }
    return 0;
}

(回答) 
演習問題 4-
23

#include<stdio.h>

int main(void)
{
    int i, j, len;

    puts("右上直角二等辺三角形を作ります。");
    printf("短辺:"); scanf("%d",&len);

    for(i = 1; i <= len; i++){
        for(j = len; j >= len + 1; j--)
            putchar(' ');
        for(j = len; j >= i; j--)
            putchar('*');
        putchar('\n');
    }
    return 0;
}

(回答) 
演習問題 4-
2
4

#include<stdio.h>

int main(void)
{
    int i, j, len;

    puts("ピラミッドをつくります。");
    printf("何段ですか:"); scanf("%d",&len);

    for(i = 1; i <= len; i++){
        for(j = len - i; j > 0; j--){
            putchar(' ');
        }
        for(j = 0; j < ( i - 1 ) * 2 + 1; j++){
            putchar('*');
        }
        putchar('\n');
        }
    return 0;
    }

(回答) 
演習問題 4-
2
5

#include<stdio.h>

int main(void)
{
    int i, j, len;

    puts("下向きピラミッドを作ります。");
    printf("何段ですか:"); scanf("%d",&len);

    for(i = 1; i <= len; i++){
        for(j = 1; j < i; j++){
            putchar(' ');
        }
        for(j = 1; j <= ( len - i ) * 2 + 1; j++){
            printf("%d", i % 10);
        }
        putchar('\n');
        }
    return 0;
}
第5章 (回答)配列

(回答) 
演習問題 5-
1

#include<stdio.h>

int main(void)
{
    int i;
    int v[5];

    for(i = 0; i < 5; i++)
        v[i] = i;
    for(i = 0; i < 5; i++)
        printf("v[%d] = %d\n", i, v[i]);
    
    return 0;
}

(回答) 
演習問題 5-
2

#include<stdio.h>

int main(void)
{
    int i;
    int v[5];

    for(i = 0; i < 5; i++)
        v[i] = 5 - i;
    for(i = 0; i < 5; i++)
        printf("v[%d] = %d\n", i, v[i]);

    return 0;
}

(回答) 
演習問題 5-
3

#include<stdio.h>

int main(void)
{
    int i;
    int v[5] = {5, 4, 3, 2, 1};

    for(i = 0; i < 5; i++)
        printf("v[%d] = %d\n", i, v[i]);

    return 0;
}

(回答) 
演習問題 5-
4

#include<stdio.h>

int main(void)
{
    int i;
    int a[5] = {17, 23, 36};
    int b[5];

    for(i = 0; i < 5; i++)
        b[i] = a[5 - i];

puts("  a   b");
puts("--------");
for(i = 0; i < 5; i++)
    printf("%4d%4d\n",a[i], b[i]);

return 0;
}

(回答) 
演習問題 5-
5

#include<stdio.h>

#define NUMBER 7

int main(void)
{
    int i;
    int x[NUMBER];

    for(i = 0; i < NUMBER; i++){
        printf("x[%d]:", i);
        scanf("%d",&x[i]);
    }
    for(i = 0; i < NUMBER / 2; i++){
        int temp = x[i];
        x[i] = x[(NUMBER - 1) - i];
        x[(NUMBER - 1) - i] = temp;
    }
    puts("反転しました。");
    for(i = 0;i < NUMBER; i++)
        printf("x[%d] = %d\n", i, x[i]);
    
    return 0;
}

(回答) 
演習問題 5-
6

a = ( b = 1.5)であるため、bは整数に変換されるため「b = 1]となる。
a = 1 となり、aはdouble型であるため少数点を含む1.00となる。

(回答) 
演習問題 5-
7

#include<stdio.h>

#define NUMBER 80

int main(void)
{
    int i;
    int num;
    int tensu[NUMBER];

    printf("データ数:");
    scanf("%d",&num);

    for(i = 0; i < num; i++){
        printf("%d番:", i + 1);
        scanf("%d",&tensu[i]);
    }
    printf("{%d,",tensu[0]);

    for(i = 1; i < num - 1; i++){
        printf(" %d,", tensu[i]);
    }
    printf(" %d}\n", tensu[num -1]);

    return 0;
}

(回答) 
演習問題 5-
8

#include<stdio.h>

#define MEMBER 80

int main(void)
{
    int i, j;
    int num;
    int tensu[MEMBER];
    int bunpu[11] = {0};

    printf("人数を入力してください。:");
    do{
        scanf("%d",&num);
        if(num < 1 || num > MEMBER)
            printf("\a1~%dで入力して下さい。", MEMBER);
    }while( num < 1 || num > MEMBER);

    printf("%d人の点数を入力して下さい。:\n", num);
    for(i = 0; i < num; i++){
        printf("%2d番:", i + 1);
        do{
            scanf("%d",&tensu[i]);
            if(tensu[i] < 0 || tensu[i] > 100)
            printf("\a1~100で入力して下さい。:");
        }while(tensu[i] < 0 || tensu[i] > 100);
        bunpu[tensu[i] / 10]++;
    }
    puts("\n---分布グラグ---");
    
    for(i = 0; i <= num; i++){
        printf("%3d ~%3d:",i * 10, i * 10 + 9);
        for(j = 0; j < bunpu[i]; j++)
            putchar('*');
        putchar('\n');
    }
    printf("      100:");
    for(j = 0; j < bunpu[10]; j++)
        putchar('*');
    putchar('\n');

    return 0;
}

(回答) 
演習問題 5-
9

#include<stdio.h>

#define MEMBER 80

int main(void)
{
    int i, j;
    int num, max;
    int tensu[MEMBER];
    int bunpu[11] = {0};

    printf("人数を入力してください。:");
    do{
        scanf("%d",&num);
        if(num < 1 || num > MEMBER)
            printf("\a1~%dで入力して下さい。", MEMBER);
    }while( num < 1 || num > MEMBER);

    printf("%d人の点数を入力して下さい。:\n", num);
    for(i = 0; i < num; i++){
        printf("%2d番:", i + 1);
        do{
            scanf("%d",&tensu[i]);
            if(tensu[i] < 0 || tensu[i] > 100)
            printf("\a1~100で入力して下さい。:");
        }while(tensu[i] < 0 || tensu[i] > 100);
        bunpu[tensu[i] / 10]++;
    }
    printf("\n");

    max = bunpu[0];

    for(i = 1; i <= 10; i++){
        if(max < bunpu[i]){
            max = bunpu[i];
        }
    }

    for(i = max; i > 0; i--){
        for(j = 0; j <= 10; j++){
            if(i == bunpu[j]){
                printf(" * ");
                bunpu[j]--;
            }else{
                printf("   ");
            }
        }
    putchar('\n');
    }
    printf("--------------------------------\n");
    printf(" 0 10 20 30 40 50 60 70 80 90 100\n");
    return 0;
}

(回答) 
演習問題 5-
10

#include<stdio.h>

int main(void)
{
    int i, j, k;
    int a[4][3];
    int b[3][4];
    int sum = 0;

    puts("4行3列の数字を入力してください。");
    for(i = 0; i < 4; i++){
        for(j = 0; j < 3; j++){
            printf("%d行%d列の数値:", i, j);
            scanf("%d",&a[i][j]);
        }
        putchar('\n');
    }
    puts("3行4列の数字を入力して下さい。");
    for(i = 0; i < 3; i++){
        for(j = 0; j < 4; j++){
            printf("%d行%d列の数値:", i, j);
            scanf("%d",&b[i][j]);
        }
        putchar('\n');
    }
    printf("4行3列の行列と3行4列の積は:\n");
    for(k = 0; k < 4; k++){
        for(i = 0; i < 4; i++){
            for(j = 0; j < 3; j++){
                sum = sum + (a[k][j] * b[j][i]);
            }
            printf("%3d", sum);
            sum = 0;
        }
        printf("\n");
    }
    return 0;
}

(回答) 
演習問題 5-
11

#include<stdio.h>

int main(void)
{
    int i, j;
    int tensu[6][2] = {{50, 30},{30, 30},{40,50},{100,100},{80, 60},{90, 40}};
    int sum1 = 0;
    int sum2 = 0;
    int sum3 = 0;

    for(i = 0; i < 6; i++){
        sum1 = sum1 + tensu[i][0];
    }
    printf("国語の合計点数:%4d 平均点:%.2f\n", sum1, (double)sum1 / 6);

    for(i = 0; i < 6; i++){
        sum2 = sum2 + tensu[i][1];
    }
    printf("数学の合計点数:%4d 平均点:%.2f\n", sum2, (double)sum2 / 6);
    
    for(i = 0; i < 6; i++){
        for(j = 0; j < 2; j++){
            sum3 = sum3 + tensu[i][j];
        }
            printf("学生%d:合計点%3d 平均点%5.2f\n",i + 1, sum3, (double)sum3 / 2);
            sum3 = 0;
    }          

    return 0;
}

(回答) 
演習問題 5-12

#include<stdio.h>


int main(void)
{
    int i, j, k;
    int tensu[2][4][3] = {
        {{91, 72, 46},{67, 72, 46},{89, 34, 53},{32, 54, 34}},
        {{97 ,67, 82},{73, 43, 46},{97, 56, 21},{85, 46, 35}}};
    int sum[4][3] = {0};

    for(i = 0; i < 2; i++){
        printf("%d回目の点数\n",i +1);
            for(j = 0; j < 4; j++){
                for(k = 0; k < 3; k++){
                    printf("%4d", tensu[i][j][k]);
                }
        putchar('\n');
        }
    }
    for(j = 0; j < 4; j++){
        for(k = 0; k < 3; k++){
            for(i = 0; i < 2; i++){
                sum[j][k] = sum[j][k] + tensu[i][j][k];
            } 
        }
    }

    printf("合計点\n");
    for(j = 0; j < 4; j++){
        for(k = 0; k < 3; k++){
            printf("%4d",sum[j][k]);
        }
        putchar('\n');
    }
    return 0;
}
第6章 (回答)関数

(回答) 
演習問題 6-1

#include<stdio.h>

int min2(int a, int b)
{
    return(a < b) ? a : b;
}

int main(void)
{
    int a, b;

    puts("二つの整数を入力してください。");
    printf("整数1:"); scanf("%d",&a);
    printf("整数2:"); scanf("%d",&b);

    printf("最小値は%dです。\n", min2(a,b));

    return 0;
}

(回答) 
演習問題 6-
2

#include<stdio.h>

int min2(int a, int b, int c)
{
    int small = a;
    if(b < small) small = b;
    if(c < small) small = c;
    return small; 
}

int main(void)
{
    int a, b, c;

    puts("二つの整数を入力してください。");
    printf("整数1:"); scanf("%d",&a);
    printf("整数2:"); scanf("%d",&b);
    printf("整数3:"); scanf("%d",&c);

    printf("最小値は%dです。\n", min2(a, b, c));

    return 0;
}

(回答) 
演習問題 6-
3

#include<stdio.h>

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

int main(void)
{
    int x;

    puts("整数を入力してください。");
    printf("整数:"); scanf("%d",&x);
  
    printf("入力された整数の3乗は%dです。\n", cube(x));

    return 0;
}

(回答) 
演習問題 6-
4

#include<stdio.h>

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

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

int main(void)
{
    int x;

    puts("整数を入力してください。");
    printf("整数:"); scanf("%d",&x);
  
    printf("入力された整数の4乗は%dです。\n", pow4(x));

    return 0;
}

(回答) 
演習問題 6-
5

#include<stdio.h>

int sumup(int n)
{
    return (n + 1) * n / 2;
}

int main(void)
{
    int a;

    puts("整数を入力してください。:");
    printf("整数:"); scanf("%d",&a);

    printf("1から%dまでの全整数の和は%dです。\n",a , sumup(a));

    return 0;
}

(回答) 
演習問題 6-
6

#include<stdio.h>

void alert(int n)
{
    while(n-- > 0)
        putchar('\a');
}

int main(void)
{
    int i, n;

    printf("アラーム回数:");
    scanf("%d",&n);

    alert(n);

    return 0;
}

(回答) 
演習問題 6-
7

#include<stdio.h>

void hello(void)
{
    printf("こんにちは。\n");
}

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

(回答) 
演習問題 6-
8

#include<stdio.h>

#define NUMBER 5

int min_of(const int v[], int n)
{
    int i;
    int min = v[0];

    for(i = 0; i < n; i++){
        if(min > v[i])
            min = v[i];
    }
    return min;
}

int main(void)
{
    int i;
    int eng[NUMBER];
    int mat[NUMBER];
    int eng_min, mat_min;

    printf("%d人の点数を入力して下さい。\n",NUMBER);
    for(i = 0; i < NUMBER; i++){
        printf("[%d] 英語:", i + 1); scanf("%d",&eng[i]);
        printf("    数学:", i + 1); scanf("%d",&mat[i]);
    }
    eng_min = min_of(eng, NUMBER);
    mat_min = min_of(mat, NUMBER);

    printf("英語の最小点は%dです。\n", eng_min);
    printf("数学の最小点は%dです。\n", mat_min);

    return 0;
}

(回答) 
演習問題 6-
9

#include<stdio.h>

void rev_intary(int v[],int n)
{
    int i;
    for(i = 0; i < n / 2; i++){
        int temp = v[i];
        v[i] = v[n - i - 1];
        v[n - i - 1] = temp;
    }
    for(i = 0; i < n; i++)
        printf("v[%d]:%d\n",i,v[i]);
}

int main(void)
{
    int n;
    int i;

    printf("要素数を記入してください。:");
    scanf("%d",&n);

    int v[n];

    puts("要素に数字を記入してください。");
    for(i = 0; i < n; i++){
        printf("v[%d]:", i);
        scanf("%d",&v[i]);
    }

    puts("反転しました。"); 
    rev_intary(v, n);
    
    return 0;       
}

(回答) 
演習問題 6-
10

#include<stdio.h>

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

int main(void)
{
    int n;
    int i;

    printf("要素数を記入してください。:");
    scanf("%d",&n);

    int v1[n],v2[n];

    puts("要素に数字を記入してください。");
    for(i = 0; i < n; i++){
        printf("v[%d]:", i);
        scanf("%d",&v2[i]);
    }

    puts("反転しました。"); 
    intary_rcpy(v1,v2,n);

    for(i = 0; i < n; i++)
        printf("v[%d]:%d\n", i, v1[i]);
    
    return 0;       
}

(回答) 
演習問題 6-1
1

#include<stdio.h>

#define NUMBER 5

int idx[NUMBER];

int search_idx(const int v[], int idx[], int key, int n)
{
    int x = 0;
    for(int i = 0; i < n; i++){
        
        if(v[i] == key){
            idx[x] = i;
            x++;
        }
    }
    return x;
}

int main(void)
{
    int i,key,n = 0;
    int v[NUMBER];
    
    for(i = 0;i < NUMBER; i++){
        printf("v[%d]:",i);
        scanf("%d",&v[i]);
    }
    printf("探す値:");
    scanf("%d",&key);

    n = search_idx(v,idx,key,NUMBER);

    printf("等しい値の要素数は%dです。\n",n);
    printf("idx{");

    for(i = 0;i < n; i++){
        if(i == n - 1){
            printf("%2d",idx[n - 1]);
            break;
        }
        printf("%2d,", idx[i]);
    }
    printf("}\n");
    
    return 0;

}

(回答) 
演習問題 6-
12

#include<stdio.h>

#define NUMBER 5

int idx[NUMBER];

int search_idx(const int v[], int idx[],int key, int n)
{
    int i;

    for(i = 0; i < NUMBER; i++){
        if(v[i] == key){
            idx[n] = i;
            n++;
        }
    }
    return n;
}

int main(void)
{
    int i,key,n = 0;
    int v[NUMBER];
    
    for(i = 0;i < NUMBER; i++){
        printf("v[%d]:",i);
        scanf("%d",&v[i]);
    }
    printf("探す値:");
    scanf("%d",&key);

    n = search_idx(v,idx,key,n);

    printf("等しい値の要素数は%dです。\n",n);
    printf("idx{");

    for(i = 0;i < n; i++){
        if(i == n - 1){
            printf("%2d",idx[n - 1]);
            break;
        }
        printf("%2d,", idx[i]);
    }
    printf("}\n");
    
    return 0;

}

(回答) 
演習問題 6-
1
3

#include<stdio.h>

void mat_add(const int a[2][4][3], int b[1][4][3])
{
    int i, j, k;

    for(i = 0; i < 4; i++){
        for(j = 0; j < 3; j++){
            for(k = 0; k < 2; k++){
                b[0][i][j] += a[k][i][j];        
    }
    }
    }
}

void mat_print(const int m[2][4][3], int n)
{
    int i, j, k;
    
    for(i = 0; i < 4; i++){
        for(j = 0; j < 3; j++){
            printf("%4d",m[n][i][j]);
            }
            putchar('\n');
    }
}

int main(void)
{
    int tensu[2][4][3] = {{{91,63,78},{67,72,46},{89,34,53},{32,54,34}},{{97,67,82},{73,43,46},{97,56,21},{85,46,35}}};
    int sum[1][4][3] = {0};

    mat_add(tensu,sum);

    puts("1回目の点数"); mat_print(tensu,0);
    puts("2回目の点数"); mat_print(tensu,1);
    puts("合計点"); mat_print(sum,0);

    return 0;
}

(回答) 
演習問題 6-
1
4

#include<stdio.h>

double a[5];

int main(void)
{
    int i;
    static double b[5];

    for(i = 0; i < 5; i++){
        printf("a[%d] = %.1f  ",i,a[i]);
        printf("b[%d] = %.1f\n",i,b[i]);
    }
    return 0;

}

(回答) 
演習問題 6-
1
5

#include<stdio.h>

void put_count()
{
    static int a = 1;
    printf("put_count:%d回目",a++);
}

int main(void)
{
    int i,n;

    printf("何回呼び出しますか。:");
    scanf("%d",&n);

    for(i = 1; i <= n; i++){
        put_count();
        putchar('\n');
    }
    return 0;
}
第7章 (回答)基本形

(回答) 
演習問題 7-
1

#include<stdio.h>

#define n 3

int main(void)
{
    printf("sizeof 1 = %u\n", sizeof 1); /*int型なので4*/
    printf("sizeof+1 = %u\n", sizeof + 1);/*int型なので4*/
    printf("sizeof-1 = %u\n", sizeof - 1);/*int型なので4*/

    printf("sizeof(unsigend)-1 = %u\n", sizeof(unsigned) - 1);
   /*int型なので4-1=3*/
    printf("sizeof(double)-1 = %u\n", sizeof(double) - 1); 
  /*double型なので8-1=7*/
    printf("sizeof((double)-1)) = %u\n", sizeof((double) - 1)); 
  /*double型-int型なので8-1=7*/

    printf("sizeof n+2 = %u\n", sizeof n + 2); /*int型n+2=6*/
    printf("sizeof(n+2) = %u\n", sizeof(n + 2)); /*int型 + int型なので4*/
    printf("sizeof(n+2.0) = %u\n", sizeof(n + 2.0));  /*int型 + double型なので8*/

    return 0;
}

(回答) 
演習問題 7-
2

#include<stdio.h>

//2乗のn乗を計算
unsigned expo(unsigned n)
{
    unsigned pw = 1;
    while(n--){
        pw *= 2;
    }
    return(pw);
}

int main(void)
{
    unsigned n_mul, n_div, l_sht, r_sht;
    unsigned a, n;

    printf("整数を入力してください。:"); scanf("%u",&a);
    printf("いくつシフトしますか:"); scanf("%u",&n);

    n_mul = a * expo(n); /*2のn乗をかけた値*/
    n_div = a / expo(n); /*2のn乗で割った値*/

    l_sht = a << n; /*nビット左にシフト*/
    r_sht = a >> n; /*nビット右シフト*/

    printf("%u × (2の%u乗) = %u\n", a, n, n_mul);
    printf("%u << %u = %u\n", a, n, l_sht);
    printf("%u ÷ (2の%u乗) = %u\n", a, n, n_div);
    printf("%u >> %u = %u\n", a, n, r_sht);

    return 0;
}

(回答) 
演習問題 7-
3

#include<stdio.h>

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

int int_bits()
{
    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 x, n;
    

    printf("非負の整数を入力して下さい:"); scanf("%u",&x);
    printf("何ビット回転しますか:"); scanf("%u",&n);

    printf("\n整数       :"); print_bits(x);
    printf("\n右に%d回転  :",n); print_bits(rrotate(x,n));
    printf("\n左に%d回転  :",n); print_bits(lrotate(x,n));

    return 0;
}

(回答) 
演習問題 7-
4

#include<stdio.h>

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

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

unsigned set(unsigned x, int pos)
{
    return(x | lrotate(1U, pos - 1)); //1U = 0000000000000001(16bit)
}

unsigned reset(unsigned x, int pos)
{
    return(x & ~lrotate(1U, pos - 1));
}

unsigned inverse(unsigned x, int pos)
{
    return(x ^ lrotate(1U, pos - 1));
}


int main(void)
{
    unsigned x, pos;
    

    printf("非負の整数を入力して下さい:"); scanf("%u",&x);
    printf("何ビット目を変更しますか:"); scanf("%u",&pos);

    printf("\n整数                    :"); print_bits(x);
    printf("\n%dビット目を1にします。  :",pos); print_bits(set(x,pos));
    printf("\n%dビット目を0にします。  :",pos); print_bits(reset(x,pos));
    printf("\n%dビット目を反転します。 :",pos); print_bits(inverse(x,pos));

    putchar('\n');

    return 0;
}

(回答) 
演習問題 7-
5

#include<stdio.h>

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

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

unsigned set_n(unsigned x, int pos, int n)
{
    for(int i = pos ; i <= (pos + n); i ++){
        x = (x | lrotate(1U, i));
    }
    return x ;
}

unsigned reset_n(unsigned x, int pos, int n)
{
    for(int i = pos ; i <= (pos + n); i ++){
        x = (x & ~lrotate(1U, i));
    }
    return x ;
}

unsigned inverse_n(unsigned x, int pos, int n)
{ 
    for(int i = pos ; i <= (pos + n); i ++){
        x = (x ^ lrotate(1U, i));
    }
    return x ;
}

int main(void)
{
    unsigned x, pos, n;
    

    printf("非負の整数を入力して下さい:"); scanf("%u",&x);
    printf("何ビット目を変更しますか:"); scanf("%u",&pos);
    printf("何個変換しますか:"); scanf("%u",&n);

    printf("\n整数                                  :"); print_bits(x);
    printf("\n%dビット目から%d個のビット1にします。   :",pos, n); 
  print_bits(set_n(x,pos,n));
    printf("\n%dビット目から%d個のビット0にします。   :",pos, n); 
  print_bits(reset_n(x,pos,n));
    printf("\n%dビット目から%d個のビット反転にします。:",pos, n);
  print_bits(inverse_n(x,pos,n));

    putchar('\n');

    return 0;
}

(回答) 
演習問題 7-
6

#include<stdio.h>

#include<limits.h>

int main(void)
{

    unsigned x, y, z;

    printf("本環境の符号なし整数型の値の範囲\n");
    printf("unsigned int 型 : %u ~ %u\n", 0, UINT_MAX);

    x = UINT_MAX;


    printf("x     = %u\n",x);
    printf("x + 2 = %u\n", x + 2);
    printf("x × 2 = %u\n", x * 2);

    return 0;
}

(回答) 
演習問題 7-
7

#include<stdio.h>

int main(void)
{
    printf("少数点の数字を記入して下さい。\n");

    float a;
    double b;
    long double c;

    printf("long型        : "); scanf("%f",&a);
    printf("double型      : "); scanf("%lf",&b);
    printf("long double型 : "); scanf("%lf",&c);

    printf("float型の値は      %fです。\n", a);
    printf("double型の値は     %fです。\n", b);
    printf("lpng double型の値は%lfです。\n", c);

    return 0;
}

(回答) 
演習問題 7-
8

#include<stdio.h>

int main(void)
{

    float a;

    printf("少数点の数字を記入して下さい。:");
    scanf("%f",&a);

    double b = a;
    long double c = a;

    printf("float型       : %f\n",a);
    printf("double型      : %f\n",b); 
    printf("long double型 ; %LF\n",c);

    return 0;
}

(回答) 
演習問題 7-
9

#include<stdio.h>

int main(void)
{
    float a;
    double b;
    long double c;

    printf("float型       サイズ:%d\n",sizeof(a));
    printf("double型        サイズ:%d\n",sizeof(b));
    printf("long double型  サイズ:%d\n",sizeof(c));

    return 0;
}

(回答) 
演習問題 7-
10

#include<stdio.h>

int main(void)
{
    int i;
    float x = 0.0;
    float y;
    
    for(i = 0; i <= 100; i++){
        y = i / 100.0 ;
        printf("x = %f  x = %f\n", x, y);
        x += 0.01;
        
    }

    return 0;
}

(回答) 
演習問題 7-
1
1

#include<stdio.h>

int main(void)
{
    int i;
    float x = 0.0;
    float y;
    float a = 0.0;
    float b = 0.0;

    for(i = 0; i <= 100; i++){
        y = i / 100.0 ;
        x += 0.01;
        a += y;
        b += x;
    }

    printf(" List7-11 = %f  List7-12 = %f", a,b);
    return 0;
}
第8章 (回答)いろいろなプログラムを作ってみよう

(回答) 
演習問題 8-
1

#include<stdio.h>

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

int main(void)
{
    int a, b;

    printf("整数 a :"); scanf("%d",&a);
    printf("整数 b :"); scanf("%d",&b);

    printf("整数 a と整数 b の差は%dです。", diff(a,b));

    return 0;
}

(回答) 
演習問題 8-
2

#include<stdio.h>

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


max(max(a,b),max(c,d))
/*
? (a > b ? a : b)
? (c > b ? c : d)
? (? > ? ? ? : ?)
*/
max(max(a,b),c),d);
/*
? (a > b ? a : b)
? ? > c ? ? : c
?  ? > d ? ? : d
*/

(回答) 
演習問題 8-
3

#include<stdio.h>

#define swap(type, a, b) do{type t = a ; a = b ; b = t;}while(0)

int main(void)
{
    int a = 10;
    int b = 20;

    printf("a = %d  b = %d\n",a,b);
    swap(int,a,b);
    printf("入れ替えます\na = %d  b = %d\n",a,b);
    
    return 0;
}

(回答) 
演習問題 8-
4

#include<stdio.h>

#define NUMBER 5

void bsort(int a[], int n)
{
    int i, j;

    for(i = n - 1; i > 0; i--){
        for(j = 0; j < i ; j++){
            if(a[j + 1] > a[j]){
                int temp = a[j];
                a[j] = a[j + 1];
                a[j + 1] = temp;
            }
        }
    }
}

int main(void)
{
    int i;
    int height[NUMBER];

    printf("%d人の身長を入力して下さい。\n");
    for(i = 0; i < NUMBER; i++){
        printf("%2d番:",i + 1);
        scanf("%d",&height[i]);
    }

    bsort(height, NUMBER);

    puts("降順にソ\ートしました。");
    for(i = 0; i < NUMBER; i++)
        printf("%2d番:%d\n",i + 1, height[i]);

    return 0;
}

(回答) 
演習問題 8-
5

#include<stdio.h>

enum gender {Men, Women, Invalid};

void men(void)
{
    puts("男性です。");
}

void women(void)
{
    puts("女性です。");
}

enum gender select(void)
{
    int tmp;

    do{
        printf("0・・・男性 1・・・女性 2・・・終了 :");
        scanf("%d",&tmp);
    }while(tmp < Men || tmp > Invalid);
    return tmp;
}

int main(void)
{
    enum gender selected;

    do{
        switch (selected = select()){
            case Men   : men(); break;
            case Women : women(); break;
        }
    }while(selected != Invalid);

    return 0;
}

(回答) 
演習問題 8-
6

#include<stdio.h>

int main(void)
{
    int i, num;

    printf("整数を入力して下さい。:");
    scanf("%d",&num);

    int tmp  =  num;

    if(num <= 0)
        tmp = 1;

    for(i = (num - 1); i > 0; i--)
            tmp = tmp * i;       

    printf("%dの階乗は%dです。\n",num,tmp);

    return 0;
}

(回答) 
演習問題 8-
7

#include<stdio.h>

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

int main(void)
{
    int n, r;

    printf("いくつの個数:"); scanf("%d",&n);
    printf("いくつ取り出す:"); scanf("%d",&r);

    printf("組み合わせの数は%d通りです。\n",combination(n,r));

    return 0;
}

(回答) 
演習問題 8-
8

#include<stdio.h>

int gcd(int x, int y)
{
    int r;

    while(y != 0){
        r = x % y;
        x = y;
        y = r;
    }
    return x;
}

int main(void)
{
    int a, b, tmp;

    printf("2つの値の最大公約数を求めます。\n");
    printf("整数 a :"); scanf("%d",&a);
    printf("整数 b :"); scanf("%d",&b);

    if(a < b){
        tmp = a;
        a = b;
        b = tmp;
    }

    printf("最大公約数は%dです。",gcd(a,b));

    return 0;

}

(回答) 
演習問題 8-
9

#include<stdio.h>

int main(void)
{
    int i, ch;

    while((ch = getchar()) != EOF){
        if(ch == '\n')i++;
    }

    printf("行数は%dです。\n",i);
    
    return 0;
}

(回答) 
演習問題 8-
10

#include<stdio.h>

int main(void)
{
    int i, j, ch;
    int cnt[10] = {0};

    while((ch = getchar()) != EOF){
        if(ch >= '0' && ch <= '9')
            cnt[ch - '0']++;
    }

    puts("数学文字の出現回数");

    
    for(i = 0; i < 10; i++){
        printf("'%d' : ", i);
        for(j = 0; j < cnt[i]; j++)
            putchar('*');
        putchar('\n');
    }
    
    return 0;
}
第9章 (回答)文字列の基本

(回答) 
演習問題 9-
1

#include<stdio.h>

int main(void)
{
    char str[] = "ABC\0DEF";
    char str2[] = "ABC\\0DEF";
    /*初期化する際「\0」はナル文字として認識され文字列の終了と判断される*/
    /*「\0」を表記するには「\\0」と表記が必要*/

    printf("文字列strは\"%s\"です。\n",str);
    printf("文字列str2は\"%s\"です。", str2);

    return 0;
}

(回答) 
演習問題 9-
2

#include<stdio.h>

int main(void)
{
    char s[] = "ABC";
    printf("%s\n",s);

    s[0] = '\0';
    printf("%S\n",s);
    /*「A」にナル文字を代入することで文字列の終了を認識させる*/

    return 0;
}

(回答) 
演習問題 9-
3

#include<stdio.h>

#define NUMBER 10

int main(void)
{
    int i, j;
    int n = 0;
    char s[NUMBER][128] = {0};

    for(i = 0; i < NUMBER; i++){
        printf("s[%d] : ",i);
        scanf("%s",s[i]);

        n++;

        if(s[i][0] == '$' && s[i][1] == '$' && s[i][2] == '$' && s[i][3] == '$' && s[i][4] == '$'){
            i = NUMBER;
        }

    }
        
    for(i = 0; i < n; i++)
        printf("s[%d] = \"%s\"\n" , i,s[i]);

    return 0;
}

(回答) 
演習問題 9-
4

#include<stdio.h>

int null_string(char s[])
{
    s[0] = '\0';

    return s[0];
}

int main(void)
{
    char str[128];
    printf("文字列を入力して下さい。:");
    scanf("%s",str);

    printf("入力された文字は\"%s\"です。\n",str);

    null_string(str);

    printf("空文字変更:文字列は\"%s\"です。\n", str);

    return 0;
}

(回答) 
演習問題 9-
5

#include<stdio.h>

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

int main(void)
{
    int kekka;
    char str[128];
    printf("文字列を入力して下さい。:");
    scanf("%s",str);

    kekka = str_char(str, 'c');

    if(kekka == -1)
        printf("cは含まれていません「%d」\n",kekka);
    else
        printf("cは%d列目にあります。\n", kekka);

    return 0;
}

(回答) 
演習問題 9-
6

#include<stdio.h>

int str_chnum(const char s[], int c)
{
    int num = 0;

   for(int i = 0; s[i] != '\0'; i++){
       if(s[i] == c) num++;
   }
   return num;
}

int main(void)
{
    int kekka;
    char str[128];

    printf("文字列を入力して下さい。:");
    scanf("%s",str);

    kekka = str_chnum(str, 'c');

    printf("文字cが含まれている個数は%dです。\n", kekka);

    return 0;
}

(回答) 
演習問題 9-
7

#include<stdio.h>

void put_stringn(const char s[], int n)
{
    int i;
    for(i = 0; i < n; i++){
        printf("%s",s);
    }
    putchar('\n');
}

int main(void)
{
    char s[128];
    int n = 0;

    printf("文字を入力してください。:");
    scanf("%s",s);
    printf("何個繰り返しますか:");
    scanf("%d",&n);

    put_stringn(s,n);

    return 0;
}

(回答) 
演習問題 9-
8

#include<stdio.h>

void put_stringr(const char s[])
{
    int i;
    int moji = 0;
    for(i = 0; s[i] != '\0'; i++){
        moji++; /*文字列をint型mojiに格納*/
    }
    for(i = moji - 1; i >= 0; i--){
        /*moji -1 例えば 「A B C \0」 s[3] - 1 = s[2] 「A B C」の「c」から表示させる。*/
        /* '\0'を表示させないようにしている。*/
        printf("%c",s[i]);
    }
    putchar('\n');
}

int main(void)
{
    char s[128];

    printf("文字を入力してください。:");
    scanf("%s",s);

    printf("反転します。\n");

    put_stringr(s);

    return 0;
}

(回答) 
演習問題 9-
9

#include<stdio.h>

void rev_string(char s[])
{
    int i = 0;
    int moji = 0;
    char tmp[128];

    while(s[i]){
        tmp[i] = s[i];
        moji++;
        i++;
    }

    for(i = 0; i < moji; i++){
        s[i] = tmp[moji - 1  - i];
    }

}

int main(void)
{
    char s[128];

    printf("文字を入力してください。:");
    scanf("%s",s);

    printf("反転します。\n");

    rev_string(s);

    printf("\"%s\"\n",s);
    return 0;
}

(回答) 
演習問題 9-
10

#include<stdio.h>

void del_digit(char s[])
{
    int i , j = 0;

    while(s[i]){
        if(s[i] >= '0' && s[i] <= '9'){
            j++;
        }
        else{
            s[i - j] = s[i];
        }
        i++;
    }
    s[i - j] = '\0';
}

int main(void)
{
    char s[128];

    printf("文字列を入力してください。:");
    scanf("%s",s);

    del_digit(s);

    printf("数字文字削除:%s",s);

    return 0;
}

(回答) 
演習問題 9-
11

#include<stdio.h>

#define NUMBER 10
#define moji 128

int main(void)
{
    int i, j;
    int cnt = 0;
    char s[NUMBER][moji] = {0};

    for(i = 0; i < NUMBER; i++){
        printf("s[%d] : ",i);
        scanf("%s",s[i]);

        cnt++;

        for(j = 0; j < moji; j++){
            if( s[i][j] == '$') 
                i = NUMBER;
        }
        
    }

    puts("表\示します");

    for(i = 0; i < (cnt - 1); i++)
        printf("s[%d] = \"%s\"\n" , i,s[i]);

    return 0;
}

(回答) 
演習問題 9-
12

#include<stdio.h>

void rev_string(char s[][128], int n)
{
    int i, j, k;
    char t;

    for(j = 0; j < n; j++){
        for(k = 0; s[k][i] != '\0'; k++);
    for(j = 0; j < k / 2; j++){
        t = s[i][j];
        s[i][j] = s[i][k - j - 1];
        s[i][k - j - 1] = t;
    }
    }
    
}

int main(void)
{
    char s[][128] = {"SEC", "ABC"};
    int i;

    rev_string(s,2);

    for(i = 0; i < 2; i++)
        printf("\"%s\"",s[i]);
    printf("\n");

    return 0;
}
第10章 (回答)ポインタ

(回答) 
演習問題 10-
1

#include<stdio.h>

void adjust_poin(int *n)
{
    if(*n < 0) *n = 0;
    if(*n > 100) *n = 100;
}

int main(void)
{
    int i;

    printf("数字を入力してください。:");
    scanf("%d",&i);

    adjust_poin(&i);

    printf("%d",i);

    return 0;
}

(回答) 
演習問題 10-
2

#include<stdio.h>

void decrement_date(int *y, int *m, int *d)
{
    *d = *d - 1;

    /*0日の場合のみ計算*/
    if (*d < 1) {
        *m = *m - 1;
        if (*m == 4 || *m == 6 || *m == 9 || *m == 11) {
            *d = 30;
            }
    else if (*m == 2) { /*うるう年*/
        *d = 28;
        if (*y % 4 == 0) {
            *d = 29;
        }
    }
    else {
        *d = 31;
    }

    /*1月の場合年を減らす*/
    if (*m < 1) {
        *y = *y - 1;
        *m = 12;
        }
    }
}


void invrement_date(int *y, int *m, int *d)
{
    *d = *d + 1;

    if (*d > 28 && *m == 2) {
        *m = *m + 1;
        *d = 1;
        if (*y % 4 == 0) {
            *m = 2;
            *d = 29;
        }
    }

    if (*d > 30 && *m == 4 || *m == 6 || *m == 9 || *m == 11) {
        *m = *m + 1;
        *d = 1;
    }

    if (*d > 31) {
        *m = *m + 1;
        *d = 1;
        if (*m > 12) {
            *y = *y + 1;
            *m = 1;
        }
    }  

}


int main(void)
{
    int i;
    int nen,tuki,hi;

    printf("西暦:"); scanf("%d",&nen);
    printf("月:"); scanf("%d",&tuki);
    printf("日:"); scanf("%d",&hi);
    printf("%d年%d月%d日\n",nen,tuki,hi);

    printf("番号を入力してください。(1_1日増やす、2_1日減らす)\n");
    scanf("%d",&i);

    if(i == 1){
        invrement_date(&nen,&tuki,&hi);
        printf("%d年%d月%d日\n",nen,tuki,hi);
    }

    if(i == 2){
        decrement_date(&nen,&tuki,&hi);
        printf("%d年%d月%d日\n",nen,tuki,hi);
    }

    return 0;
}

(回答) 
演習問題 10-
3

#include<stdio.h>

void swap(int *px, int *py)
{
    int temp = *px;
    *px = *py;
    *py = temp;
}

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

int main(void)
{
    int na ,nb ,nc;

    puts("二つの整数を入力してください。");
    printf("整数A:"); scanf("%d",&na);
    printf("整数B:"); scanf("%d",&nb);
    printf("整数C:"); scanf("%d",&nc);


    sort3(&na,&nb,&nc);

    puts("昇順にソ\ートしました。");
    printf("整数Aは%dです。\n",na);
    printf("整数Bは%dです。\n",nb);
    printf("整数Cは%dです。\n",nc);

    return 0;
}

(回答) 
演習問題 10-
4

#include<stdio.h>

void set_idx(int v[], int n)
{
    int i;
    for(i = 0; i < n; i++)
        v[i] = i;
}

int main(void)
{
    int i;
    int s[] = {1,2,3,4,5};
    
    set_idx(s, 5);

    for(i = 0; i < 5; i++)
        printf("v[%d] = %d\n",i, s[i]);
    
    return 0;
}

(回答) 
演習問題 10-
5

#include<stdio.h>

void ary_set(int v[], int n, int val)
{
    int i;

    for(i = 0; i < n; i++)
        v[i] = val;
}

int main(void)
{
    int i;
    int a[] = {1,2,3,4,5};

    ary_set(&a[2],2,99);
    /*ary_set(a[2],2,99)を渡しいる。
    すなわち a[0] = a[2]のアドレスと判断する。
    n = 2 の為、a[2],a[3]の数字を入れ替え返す*/

    for(i = 0; i < 5; i++)
        printf("a[%d] = %d\n", i, a[i]);
    
    return 0;
}
第11章 (回答)文字列とポインタ

(回答) 
演習問題 11-1

#include<stdio.h>

int main(void)
{
    char *p = "123";
    printf("p = \"%s\"\n", p);

    p = "456" + 1;
    /* アドレス"456"を記憶して"4"のアドレスから1つプラスした
    アドレスを指すため"56"のみ記憶するため。*/
    

    printf("p = \"%s\"\n", p);

    return 0;
}

(回答) 
演習問題 11-2

#include<stdio.h>

int main(void)
{
    int i;
    char a[][5] = {"LISP","C","Ada" };
    char *p[] = {"PAUL","X","MAC"};

    /*配列全体のサイズ(配列の要素のサイズ×配列の要素数)sizeof(a)を
    配列の要素のサイズsizeof(a[0])で割ると配列の要素数が求められる*/
   
    printf("sizeof(a) = %d, sizeof(*a) = %d\n", sizeof(a), sizeof(*a));
    printf("sizeof(p) = %d, sizeof(*p) = %d\n", sizeof(p), sizeof(*p));
    
    for(i = 0; i < (sizeof(a) / sizeof(*a)); i++)
    /* sizeof(a)は要素全体のビット数 すなわち 3×5=15
       sizeof(*a) = a[0]の為 5 となり 15÷5= 3*/
        printf("a[%d] = \"%s\"\n",i ,a[i]);
    for(i = 0; i < (sizeof(p) / sizeof(*p)); i++)
        printf("a[%d] = \"%s\"\n",i ,p[i]);
    
    return 0;
}

(回答) 
演習問題 11-3

#include<stdio.h>

char *str_copy(char *d, const char *s)
{
    char *t = d;
    while(*d++ = *s++)
        ;
    return t;
}

int main(void)
{
    char str[128] = "ABC";
    char tmp[128];

    printf("コピーするのは:");
    scanf("%s", tmp);

    printf("コピーしました。\n");
    printf("str = \"%s\"\n", str_copy(str, tmp));

    return 0;
}

(回答) 
演習問題 11-4

#include<stdio.h>
#include<string.h>

void put_string(const char *s)
{
    int i;
    for(i = 0; i < strlen(s); i++){
        printf("%c", *(s + i));
    }
}

int main(void)
{
    char s[256];

    printf("文字を入力してください。");
    scanf("%s",s);

    put_string(s);

    return 0;
}

(回答) 
演習問題 11-5

#include <stdio.h>

int str_chnum(const char *s,int c)
{
    int k = 0;

    while(*s){
        if(*s++ == c) k++;
    }
    return k;
}

int main(void)
{
    char s[256];

    printf("文字を入力してください。:");
    scanf("%s",s);

    printf("入力した文字にcは%d個ある。\n",str_chnum(s,'c'));

    return 0;
}

(回答) 
演習問題 11-6

#include <stdio.h>
#include<string.h>

char *str_chr(const char *s, int c)
{
    do{
        if(*s == c){
           return s;
        }
    }while(*s++);

    return NULL;
}

int main(void)
{
    char s[128];
    int c;

    printf("文字列入力:");
    scanf("%s",s);

    printf("%s\n",str_chr(s, 'c'));

    return 0;
}

(回答) 
演習問題 11-7

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

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

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

int main(void)
{
    char str[128];

    printf("文字列を入力してください。:");
    scanf("%s",str);

    str_toupper(str);
    printf("大文字:%s\n",str);

    str_tolower(str);
    printf("小文字;%s\n",str);

    return 0;
}

(回答) 
演習問題 11-8

#include<stdio.h>

void del_digit(char *str)
{
    int i,d;

    for(i = 0; str[i]; i++){
        if(str[i] >= '0' && str[i] <= '9'){
            for(d = 0; str[d]; ++d)
                str[d] = str[d + 1];
                --i;
        }
    }
    return;
}

int main(void)
{
    char s[258];

    printf("文字や数字を入力してください。:");
    scanf("%s",s);

    del_digit(s);

    printf("%s\n", s);
}

(回答) 
演習問題 11-9

#include<stdio.h>
#include<string.h>


int main(void)
{
    int i;
    char s[258];
    char x[258];
    char m[258] = "ABCDEFG";

    printf("文字を入力してください。:");
    scanf("%s",s);

    printf("入力された文字列の長さは%dです。\n", strlen(&s));
    
    strcpy(x, s);
    printf("「x」へコピーします。:%s\n",x);
    strncpy(m,x,strlen(&x));
    printf("「m」へ「x」の文字数をコピーします。:%s\n",m);

    if(strcmp(x,s)==0){
        puts("文字列xと文字列sの文字列は一致しています。");
    }else{
        puts("文字列xと文字列sの文字列は一致していません。");
    }

     if(strncmp(m,x,strlen(&x))==0){
        puts("「m」と「x」の文字数の文字列は一致しています。");
    }else{
        puts("「m」と「x」の文字数の文字列は一致していません。");
    }
    return 0;
    }

(回答) 
演習問題 11-10

#include <stdio.h>
#include <string.h>

int strtoi(const char *nptr)
{
    int num = 0;
    num = atoi(nptr);

    return num;
}

long strtol(const char *nptr)
{
    long num = 0;
    num = atol(nptr);

    return num;
}

double power (double n){
    double o = 1;
    if(n > 0){
        while(n--){
            o *= 10;
        }
    }else if(n == 0){
        o *= 1;
    }else{
        while(n++){
            o /= 10;
        }
    }
    return o;
}

int integer (const char *nptr){
    int o = 0;
    while(*nptr){
        if(*nptr == '.') break;
        o++;
        nptr++;
    }
    return o;
}

double strtof(const char *nptr){
    int n = strlen(nptr);
    int i = integer(nptr);
    double o = 0;

    while(n--){
        if(i > 0){
            o += (*nptr - '0') * (int)power(i - 1);
        }else if(i < 0){
            o += (*nptr - '0') * (double)power(i);
        }
        nptr++;
        i--;
    }
    return o;

}

int main(void)
{
    char str[128];

    printf("文字を入力してください。:");
    scanf("%s",str);

    printf("%d\n",strtoi(&str));
    printf("%d\n",strtol(&str));
    printf("%f\n",strtof(&str));

    return 0;
}
第12章 (回答)構造体

(回答) 
演習問題 12-1

#include<stdio.h>
#include<string.h>

#define NAME_LEN 64

struct student{
    char name[NAME_LEN];
    int height;
    float weight;
    long schols;
};

int main(void)
{
    struct student takao = {"Takao", 173, 86.2};
    
    

    printf("氏名 = %p\n", &takao.name);
    printf("身長 = %p\n", &takao.height);
    printf("体重 = %p\n", &takao.weight);
    printf("奨学金 = %p\n", &takao.schols);

    return 0;
}

(回答) 
演習問題 12-2

#include<stdio.h>
#define NAME_LEN 64

typedef struct {
    char name[NAME_LEN];
    int height;
    float weight;
    long schols;
}student;

void hiroko(student *std)
{
    if(std->height < 180) std->height = 180;
    if(std->weight > 80) std->weight = 80;
}

int main(void)
{
    student sanaka;

    puts("各項目を記入してください。");
    printf("氏名:"); scanf("%s",&sanaka.name);
    printf("身長:"); scanf("%d",&sanaka.height);
    printf("体重:"); scanf("%f",&sanaka.weight);
    printf("奨学金の金額:"); scanf("%ld",&sanaka.schols);
    
    hiroko(&sanaka);
    
    printf("氏名 = %s\n",sanaka.name);
    printf("身長 = %d\n", sanaka.height);
    printf("体重 = %.lf\n", sanaka.weight);
    printf("奨学金 = %ld\n", sanaka.schols);

    return 0;
}

(回答) 
演習問題 12-3

#include<stdio.h>

struct xyz{
    int x;
    long y;
    double z;
};

struct xyz scan_xyz()
{
    struct xyz temp;

    printf("int型  :"); scanf("%d",&temp.x);
    printf("long型 :"); scanf("%ld",&temp.y);
    printf("double型:"); scanf("%lf",&temp.z);

    return temp;
}

int main(void)
{
    struct xyz x;

    x = scan_xyz();

    printf("xyz.x = %d\n",x.x);
    printf("xyz.y = %ld\n",x.y);
    printf("xyz.z = %f\n",x.z);

    return 0;
    
}

(回答) 
演習問題 12-4

#include <stdio.h>
#include <string.h>

#define NUMBER 5
#define NAME_LEN 64


typedef struct{
    char name[NAME_LEN];
    int height;
    float weight;
    long schols;
}Student;

void swap_Student(Student *x, Student *y){
    Student tmp = *x;
    *x = *y;
    *y = tmp;
}

void sort_by_height(Student a[], int n){

    int i, j;

    for(i = 0; i < n; i++){
        for(j = n - 1; j > i; j--){
            if(a[j - 1].height > a[j].height) swap_Student(&a[j - 1], &a[j]);
        }
    }
}

void sort_by_name(Student a[], int n){
   
    int i, j;

    for(i = 0; i < n; i++){
        for(j = n - 1; j > i; j--){
            if(strcmp(a[j - 1].name, a[j].name) > 0){
                swap_Student(&a[j - 1], &a[j]);
                }
        }
    }
}

int main(void){

    int i, n;

    Student std[256];

    for(i = 0; i < NUMBER; i++){
        printf("名前 : "); scanf("%s", std[i].name);
        printf("身長 : "); scanf("%d", &std[i].height);
        printf("体重 : "); scanf("%f", &std[i].weight);
        printf("奨学金 : "); scanf("%ld", &std[i].schols);
    }

    printf("ソ\ート方法を選んでください。 1.身長 2.名前 :"); scanf("%d",&n);

    if(n == 1){
        sort_by_height(std, n);
        printf("身長順にソ\ートしました\n");
    }
    else if(n == 2){
        sort_by_name(std, n);
        printf("名前順にソ\ートしました\n");
    }

    for(i = 0; i < NUMBER; i++){
        printf("%-8s %6d%6.1f%7ld\n", std[i].name, std[i].height, std[i].weight, std[i].schols);
    }

    return 0;
}

(回答) 
演習問題 12-5

#include<math.h>
#include<stdio.h>

#define sqr(n)  ((n) * (n))

typedef struct{
    double x;
    double y;
}Point;

typedef struct{
    Point pt;
    double fuel;
}Car;

double distance_of(Point pa, Point pb)
{
    return sqrt(sqr(pa.x - pb.x) + sqr(pa.y - pb.y));
}

void put_info(Car c)
{
    printf("現在位置:(%.2f, %.2f)\n", c.pt.x, c.pt.y);
    printf("残り燃料: %.2fリットル\n", c.fuel);
}

int move(Car *c, Point dest)
{
    double d = distance_of(c->pt, dest);
    if(d > c->fuel)
        return 0;
    c->pt = dest;
    c->fuel -= d;

    return 1;
}

int main(void)
{
    Car mycar = {{0.0, 0.0}, 90.0};

    while(1){
        int select;
        Point dest;
        put_info(mycar);
        printf("移動しますか【yes ... 1 / no ... 0】:");
        scanf("%d", &select);
        if(select != 1) break;
        printf("目的を入力 ・・・ 1 / 移動距離を入力 ・・・ 2 :");
        scanf("%d",&select);
        if(select == 1){
            printf("目的地のX座標:"); scanf("%lf", &dest.x);
            printf("    Y座標:"); scanf("%lf", &dest.y);
            if(!move(&mycar, dest))
            puts("\a燃料不足で移動できません。");
        }else if(select == 2){
            printf("X方向の移動距離:"); scanf("%lf", &dest.x);
            printf("Y方向の移動距離:"); scanf("%lf", &dest.y);
            dest.x += mycar.pt.x;
            dest.y += mycar.pt.y;
            if(!move(&mycar, dest))
            puts("\a燃料不足で移動できません。");
        }
    }
    return 0;
}
第13章 (回答)ファイル処理

(回答) 
演習問題 13-1

#include<stdio.h>

int main(void)
{
    FILE *fp;
    char x[128];

    printf("ファイル名を入力してください。:");
    scanf("%s",x);

    fp = fopen(x,"r");

    if(fp == NULL)
        printf("そのファイルは存在しません。\n");
    else{
        printf("そのファイルは存在します。\n");
        fclose(fp);
    }

    return 0;
}

(回答) 
演習問題 13-2

#include<stdio.h>

int main(void)
{
    FILE *fp;
    char x[128];

    printf("ファイル名を入力してください。:");
    scanf("%s",x);

    fp = fopen(x,"w");

    if(fp == NULL)
        printf("そのファイルは存在しません。\n");
    else{
        printf("そのファイルの中身を消去します。\n");
        fclose(fp);
    }

    return 0;
}

(回答) 
演習問題 13-3

#include<stdio.h>
#include<string.h>

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


void swap_hw(student *x, student *y)
{
    student tmp = *x;
    *x = *y;
    *y = tmp;
}

void sort_by_hw(student a[], int n)
{
    int i, j;

    for(i = 0; i < n; i++){
        for(j = n - 1; j > 1; j--){
            if(a[j - 1].height > a[j].height)
            swap_hw(&a[j - 1], &a[j]);
        }
    }
}

int main(void)
{
    FILE *fp;
    student std[256];
    int i, ninzu = 0;
    double hsum = 0.0;
    double wsum = 0.0;

    if((fp = fopen("hw.dat","r")) == NULL){
        printf("\aファイルをオープンできません。\n");
    }
    else{
    while(fscanf(fp,"%s%lf%lf", std[ninzu].name, &std[ninzu].height, &std[ninzu].weight) == 3){
            hsum += std[ninzu].height;
            wsum += std[ninzu].weight;
            ninzu++;
        }
    
    sort_by_hw(std, ninzu);

    for(i = 0; i < ninzu; i++){
        printf("%-10s %5.1f %5.1f\n", std[i].name, std[i].height, std[i].weight);
    }
    printf("---------------------\n");
    printf("平均     %5.1f %5.1f\n", hsum / ninzu, wsum / ninzu);
    fclose(fp);
    }
    return 0;
}

(回答) 
演習問題 13-4

#include<stdio.h>

int main(void)
{
    FILE *fp;
    int ninzu = 0;
    char name[100];
    double height, weight;
    double hsum;
    double wsum;

    int i = 0;

    if((fp = fopen("hw.dat", "w")) == NULL)
        printf("\aファイルをオープンできません。\n");
    else{
        while(1){
            printf("名前:"); scanf("%s", name);
            printf("身長:"); scanf("%lf", &height);
            printf("体重:"); scanf("%lf", &weight);
            fprintf(fp, "名前:%s 身長:%.1f 体重:%.1f\n", name, height, weight);

            printf("続けますか?(Yes : 1 / No : 0) : ");
            scanf("%d", &i);

        if(i==0){
        break;
            }
        }
    fclose(fp);
    }
    return 0;
}

(回答) 
演習問題 13-5

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

char data_file[] = "datatime.dat";

void get_data(void)
{
    FILE *fp;
    int year, month, day, h, m, s;
    char feel[100];

    if((fp = fopen(data_file, "r")) == NULL){
        printf("本プログラムを実行するのは初めてですね。\n");
    }else{    
        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 curret = time(NULL);
    struct tm *timer = localtime(&curret);
    char feel[100];

    if((fp = fopen(data_file, "w")) == NULL)
        printf("\aファイルをオープンできません。\n");
    else{
        printf("今日の気分は:"); scanf("%s", feel);
        fprintf(fp, "%d %d %d %d %d %d %s\n", 
            timer->tm_yday + 1900, timer->tm_mon + 1, timer->tm_mday,
            timer->tm_hour, timer->tm_min, timer->tm_sec, feel);
    fclose(fp);
    }
}

int main(void)
{
    get_data();
    put_data();

    return 0;
}

(回答) 
演習問題 13-6

#include<stdio.h>

int main(void)
{
    int ch;
    int count = 0;
    FILE *fp;
    char fname[FILENAME_MAX];

    printf("ファイル名:");
    scanf("%s", fname);

    if((fp = fopen(fname, "r")) == NULL)
        printf("\aファイルをオープンできません。\n");
    else{
        while((ch = fgetc(fp)) != EOF)
            if(ch == '\n') count++;
        fclose(fp);
        printf("改行文字は%d個です。\n", count);
    }
    return 0;
}

(回答) 
演習問題 13-7

#include<stdio.h>

int main(void)
{
    int ch;
    int count = 0;
    FILE *fp;
    char fname[FILENAME_MAX];

    printf("ファイル名:");
    scanf("%s", fname);

    if((fp = fopen(fname, "r")) == NULL)
        printf("\aファイルをオープンできません。\n");
    else{
        while((ch = fgetc(fp)) != EOF)
            if(ch >= '0' && ch <= '9') count++;
        fclose(fp);
        printf("数字文字は%d個です。\n", count);
    }
    return 0;
}

(回答) 
演習問題 13-8

#include<stdio.h>

int main(void)
{
    int ch;
    FILE *sfp;
    FILE *dfp;
    char sname[FILENAME_MAX];
    char dname[FILENAME_MAX];

    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);
                    fclose(dfp);
            }
            fclose(sfp);
    }
    return 0;

}

(回答) 
演習問題 13-9

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

int main(void)
{
    int ch;
    FILE *sfp;
    FILE *dfp;
    char sname[FILENAME_MAX];
    char dname[FILENAME_MAX];

    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-10

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

int main(void)
{
    int ch;
    FILE *sfp;
    FILE *dfp;
    char sname[FILENAME_MAX];
    char dname[FILENAME_MAX];

    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;

}

(回答) 
演習問題 13-11

#include<stdio.h>

#define N 10

int main(void)
{
    FILE *fp;
    int i;
    double pi[N] = {0,1,2,3,4,5,6,7,8,9};

    if((fp = fopen("PI.bin", "wb")) == NULL)
        printf("\aファイルをオープンできません。\n");
    else{
        fwrite(pi, sizeof(double), N, fp);
        fclose(fp);
    }

    if((fp = fopen("PI.bin", "rb")) == NULL)
        printf("\aファイルをオープンできません。\n");
    else{
        fread(pi, sizeof(double), N, fp);
        puts("配列の内容は:");
        for(i = 0; i < N; i++)
            printf("fp[%d] = %23.21lf\n", i, pi[i]);
        fclose(fp);
    }
    return 0;
}

(回答) 
演習問題 13-12

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

char data_file[] = "datatime.bin";

void get_data(void)
{
    FILE *fp;
    struct  tm times;    

    if((fp = fopen(data_file, "rb")) == NULL)
        printf("本プログラムを実行するのは初めてですね。\n");
    else{
        fread(&times, sizeof(struct tm), 1, fp);
        printf("前回は%d年%d月%d日%d時%d分%d秒でした。\n",
            times.tm_year + 1900, times.tm_mon + 1, times.tm_mday,
            times.tm_hour, times.tm_min, times.tm_sec);
        fclose(fp);
    }
}

void put_data(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);
    }
}


int main(void)
{
    get_data();
    put_data();

    return 0;
}

(回答) 
演習問題 13-13

#include<stdio.h>

int main(void)
{
    int ch;
    FILE *sfp;
    FILE *dfp;
    char sname[FILENAME_MAX];
    char dname[FILENAME_MAX];

    printf("コピー元ファイル名:"); scanf("%s", sname);
    printf("コピー先ファイル名:"); scanf("%s", dname);

    if((sfp = fopen(sname, "rb")) == NULL)
        printf("\aコピー元ファイルをオープンできません。\n");
    else{
        if((dfp = fopen(dname, "wb")) == NULL)
            printf("\aコピー先ファイルをオープンできません。\n");
            else{
                while((fread(&ch, sizeof(int), 1, sfp)) > 0){
                    fwrite(&ch, sizeof(int), 1, dfp);
                    putchar(ch);
                }
                fclose(dfp);
            }
            fclose(sfp);
    }
    return 0;

}

コメント