2013年4月19日金曜日

開発環境

プログラミング言語C 第2版 ANSI規格準拠 (B.W. カーニハン D.M. リッチー (著)、 石田 晴久 (翻訳)、共立出版)の第3章(制御の流れ)、3.6(do-while)の演習 3-4、3-5、3-6を解いてみる。

その他参考書籍

演習 3-4.

int型の最大値は2^(wordsize - 1) - 1だけど、負の数-(2^wordsize-1)はコードの

n = -n

の部分で正の数に変換するとき2^(wordsize - 1)となり最大値を超えてしまうから処理できない。

修正。

コード

sample.c

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

void itoa(int n, char s[]);

int main()
{
    char s1[1000], s2[1000], s3[1000], s4[1000], s5[1000];
    int a = -123456789, b = -987654321, c = 2147483647, d = -2147483648, e = -0;
    
    itoa(a, s1);
    itoa(b, s2);
    itoa(c, s3);
    itoa(d, s4);
    itoa(e, s5);
    
    printf("%d 文字列: %s\n", a, s1);
    printf("%d 文字列: %s\n", b, s2);
    printf("%d 文字列: %s\n", c, s3);
    printf("%d 文字列: %s\n", d, s4);
    printf("%d 文字列: %s\n", e, s5);
    
    return 0;
}

void itoa(int n, char s[])
{
    int i, sign, m;
    void reverse(char s[]);
    
    sign = n;
    
    i = 0;
    do {
        m = n % 10;
        if ( m < 0 )
            m *= -1;
        s[i++] = m + '0';
    } while ((n /= 10) != 0);
    
    if (sign < 0)
        s[i++] = '-';
    s[i] = '\0';
    reverse(s);
}

void reverse(char s[])
{
    int c, i, j;
    for (i = 0, j = strlen(s) - 1; i < j; i++, j--) {
        c = s[i];
        s[i] = s[j];
        s[j] = c;
    }
}

入出力結果(Terminal)

$ ./a.out
-123456789 文字列: -123456789
-987654321 文字列: -987654321
2147483647 文字列: 2147483647
-2147483648 文字列: -2147483648
0 文字列: 0
$

intの範囲はこちらの方法で取得。

演習3-5.

コード

sample.c

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

void itob(unsigned int n, char s[], int b);

int main()
{
    char s1[1000], s2[1000], s3[1000], s4[1000], 
         s5[1000], s6[1000], s7[1000], s8[1000];
    int a = 100, b = 2147483647, c = -2147483648, d = -0;
    
    itob(a, s1, 10);
    itob(a, s2, 2);
    itob(a, s3, 8);
    itob(a, s4, 16);
    itob(a, s5, 6);
    itob(b, s6, 10);
    itob(c, s7, 10);
    itob(d, s8, 4);
    
    printf("%d 文字列(%d進数): %s\n", a, 10, s1);
    printf("%d 文字列(%d進数): %s\n", a, 2, s2);
    printf("%d 文字列(%d進数): %s\n", a, 8, s3);
    printf("%d 文字列(%d進数): %s\n", a, 16, s4);
    printf("%d 文字列(%d進数): %s\n", a, 6, s5);
    printf("%d 文字列(%d進数): %s\n", b, 6, s6);
    printf("%d 文字列(%d進数): %s\n", c, 6, s7);
    printf("%d 文字列(%d進数): %s\n", d, 6, s8);
    
    return 0;
}

void itob(unsigned int n, char s[], int b)
{
    int i, sign, m;
    void reverse(char s[]);
    
    sign = n;
    
    i = 0;
    do {
        m = n % b;
        if (m < 0)
            m *= -1;
        if ( m < 10 )
            s[i++] = m + '0';
        else
            s[i++] = m - 10 + 'a';
    } while (( n /= b) != 0);
    
    if (sign < 0)
        s[i++] = '-';
    s[i] = '\0';
    reverse(s);
}

void reverse(char s[])
{
    int c, i, j;
    for (i = 0, j = strlen(s) - 1; i < j; i++, j--) {
        c = s[i];
        s[i] = s[j];
        s[j] = c;
    }
}

入出力結果(Terminal)

$ ./a.out
100 文字列(10進数): 100
100 文字列(2進数): 1100100
100 文字列(8進数): 144
100 文字列(16進数): 64
100 文字列(6進数): 244
2147483647 文字列(6進数): 2147483647
-2147483648 文字列(6進数): -2147483648
0 文字列(6進数): 0
$

演習3-6.

コード

sample.c

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

void itoa(int n, char s[], int cols);

int main()
{
    char s1[1000], s2[1000], s3[1000], s4[1000], s5[1000];
    int a = 1, b = 12, c = 123, d = 1234, e = 12345;
    
    itoa(a, s1, 10);
    itoa(b, s2, 10);
    itoa(c, s3, 10);
    itoa(d, s4, 10);
    itoa(e, s5, 10);
    
    printf("12345678901234567890\n");
    printf("%s\n", s1);
    printf("%s\n", s2);
    printf("%s\n", s3);
    printf("%s\n", s4);
    printf("%s\n\n", s5);
    
    itoa(-a, s1, 20);
    itoa(-b, s2, 20);
    itoa(-c, s3, 20);
    itoa(-d, s4, 20);
    itoa(-e, s5, 20);
    
    printf("12345678901234567890\n");
    printf("%s\n", s1);
    printf("%s\n", s2);
    printf("%s\n", s3);
    printf("%s\n", s4);
    printf("%s\n", s5);

    return 0;
}

void itoa(int n, char s[], int cols)
{
    int i, sign, m;
    void reverse(char s[]);
    
    sign = n;
    
    i = 0;
    do {
        m = n % 10;
        if ( m < 0 )
            m *= -1;
        s[i++] = m + '0';
    } while ((n /= 10) != 0);
    
    if (sign < 0)
        s[i++] = '-';
    
    while (i < cols)
        s[i++] = ' ';

    s[i] = '\0';
    reverse(s);
}

void reverse(char s[])
{
    int c, i, j;
    for (i = 0, j = strlen(s) - 1; i < j; i++, j--) {
        c = s[i];
        s[i] = s[j];
        s[j] = c;
    }
}

入出力結果(Terminal)

$ ./a.out
12345678901234567890
         1
        12
       123
      1234
     12345

12345678901234567890
                  -1
                 -12
                -123
               -1234
              -12345
$

0 コメント:

コメントを投稿