プログラミング+α学習ブログ

勉強したことの備忘録です。

配列を受け渡すプログラム

#include <stdio.h>

/*--- 配列の先頭三要素に1,2,3を代入 ---*/
void set123(int *vc)
{
    *vc = 1;    // vc[0] = 1;
    *(vc + 1) = 2; // vc[1] = 2;
    vc[2] = 3; // vc[2] = 3;
}

int main(void)
{
    int i;
    int ary[5] = { 0 }; // 全ての要素を0で初期化
    
    set123(ary);
    
    for (i = 0; i < 5; i++)
        printf("ary[%d] =  %d\n", i, ary[i]);
    
    return (0);
}

実行結果

ary[0] =  1
ary[1] =  2
ary[2] =  3
ary[3] =  0
ary[4] =  0

ポインタの比較と減算をするプログラム

#include <stdio.h>

int main(void)
{
    int vc[5];
    int *ptr = vc;
    
    printf("ptr    == vc     : %d\n", ptr    == vc);
    printf("ptr    == &vc[0] : %d\n", ptr    == &vc[0]);
    printf("ptr    == &vc[1] : %d\n", ptr    == &vc[1]);
    printf("&vc[1] <  &vc[2] : %d\n", &vc[1] <  &vc[2]);
    printf("&vc[2] -  vc     : %d\n", &vc[2] -  vc);
    
    return (0);
}

実行結果

ptr    == vc     : 1
ptr    == &vc[0] : 1
ptr    == &vc[1] : 0
&vc[1] <  &vc[2] : 1
&vc[2] -  vc     : 2

配列とポインタを用いて各要素を表示するプログラム

#include <stdio.h>

int main(void)
{
    int i;
    int vc[5] = {10, 20, 30, 40, 50};
    int *ptr = &vc[0];
    
    for (i = 0; i < 5; i++) {
        printf("vc[%d]=%d    %d[vc]=%d    ", i, vc[i],    i, i[vc]);
        printf("*(vc+%d)=%d    *(%d+vc)=%d\n", i, *(vc+i),    i, *(i+vc));
    }
    putchar('\n');
    
    for (i = 0; i < 5; i++) {
        printf("*(ptr+%d)=%d    *(%d+ptr)=%d    ", i, *(ptr+i),    i, *(i+ptr));
        printf("ptr[%d]=%d    %d[ptr]=%d\n", i, ptr[i],    i, i[ptr]);
    }
    
    return (0);
}

実行結果

vc[0]=10    0[vc]=10    *(vc+0)=10    *(0+vc)=10
vc[1]=20    1[vc]=20    *(vc+1)=20    *(1+vc)=20
vc[2]=30    2[vc]=30    *(vc+2)=30    *(2+vc)=30
vc[3]=40    3[vc]=40    *(vc+3)=40    *(3+vc)=40
vc[4]=50    4[vc]=50    *(vc+4)=50    *(4+vc)=50

*(ptr+0)=10    *(0+ptr)=10    ptr[0]=10    0[ptr]=10
*(ptr+1)=20    *(1+ptr)=20    ptr[1]=20    1[ptr]=20
*(ptr+2)=30    *(2+ptr)=30    ptr[2]=30    2[ptr]=30
*(ptr+3)=40    *(3+ptr)=40    ptr[3]=40    3[ptr]=40
*(ptr+4)=50    *(4+ptr)=50    ptr[4]=50    4[ptr]=50

三つの整数を昇順に並べ替える

#include <stdio.h>

/*--- nx, nyが指すオブジェクトの値を交換 ---*/
void swap(int *nx, int *ny)
{
    int temp = *nx;
    *nx = *ny;
    *ny = temp;
}

/*--- *n1≦*n2≦*n3となるように並べ替える ---*/
void sort3(int *n1, int *n2, int *n3)
{
    if (*n1 > *n2) swap(n1, n2);
    if (*n2 > *n3) swap(n2, n3);
    if (*n1 > *n2) swap(n1, n2);
}

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);
}

実行結果

三つの整数を入力してください。
整数A:32
整数B;48
整数C;15
これらの値を昇順に並べ替えました。
整数Aは15です。
整数Bは32です。
整数Cは48です。

二つの整数を昇順に並べるプログラム

#include <stdio.h>

/*--- nx,nyが指すオブジェクトの値を交換 ---*/
void swap(int *nx, int *ny)
{
    int temp = *nx;
    *nx = *ny;
    *ny = temp;
}

/*--- *n1≦*n2となるように並べる ---*/
void sort2(int *n1, int *n2)
{
    if (*n1 > *n2)
        swap(n1, n2);
}

int main(void)
{
    int na, nb;
    
    puts("二つの整数を入力してください。");
    printf("整数A:"); scanf("%d", &na);
    printf("整数B:"); scanf("%d", &nb);
    
    sort2(&na, &nb);
    
    puts("これらの値を昇順に並べました。");
    printf("整数Aは%dです。\n", na);
    printf("整数Bは%dです。\n", nb);
    
    return (0);
}

実行結果

二つの整数を入力してください。
整数A:57
整数B:21
これらの値を昇順に並べました。
整数Aは21です。
整数Bは57です。

読み込んだ日付の前の日付および次の日付を求めるプログラム

#include <stdio.h>

int day[2][13] = {
    { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 },
    { 0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 },
};

/*--- yearが閏年であれば1をそうでなければ0を返す ---*/
int isleap(int year)
{
    return (year % 4 == 0 && year % 100 != 0 || year % 400 == 0);
}

/*--- 受け取った日付の前の日を求める ---*/
void yesterday(int *y, int *m, int *d)
{
    if (*d != 1)    // 1日でなければ*dをデクリメント
        (*d)--;
    else {
        if (*m != 1)    // 1月以外の1日
            (*m)--;
        else {
            (*y)--;
            *m = 12;
        }
        *d = day[isleap(*y)][*m];
    }
}

/*--- 受け取った日付の次の日を求める ---*/
void tomorrow(int *y, int *m, int *d)
{
    if (*d != day[isleap(*y)][*m]) // 最終日でなければ*dをインクリメント
        (*d)++;
    else {
        if (*m != 12)   // 12月以外の最終日
            (*m)++;
        else {      // 12月31日
            (*y)++;
            *m = 1;
        }
        *d = 1;
    }
}

int main(void)
{
    int y, m, d;
    int ay, am, ad;
    int by, bm, bd;
    
    printf("年:"); scanf("%d", &y);
    printf("月:"); scanf("%d", &m);
    printf("日:"); scanf("%d", &d);
    
    ay = by = y;
    am = bm = m;
    ad = bd = d;
    
    yesterday( &ay, &am, &ad);  // 前の日
    tomorrow( &by, &bm, &bd);   // 次の日
    
    printf("前の日:%d%d%d\n", ay, am, ad);
    printf("次の日:%d%d%d\n", by, bm, bd);
    
    return (0);
}

実行結果

年:2000
月:2
日:20
前の日:2000年2月19日
次の日:2000年2月21日

二つの整数の和、差、積を求めるプログラム

#include <stdio.h>

/*--- n1とn2の和・差・積をsum,diff,mulが指す変数に格納 ---*/
void sum_diff_mul(int n1, int n2, int *sum, int *diff, int *mul)
{
    *sum = n1 + n2;
    *diff = (n1 > n2) ? n1 - n2 : n2 - n1;
    *mul = n1 * n2;
}

int main(void)
{
    int na, nb;
    int wa, sa, seki;
    
    puts("二つの整数を入力してください。");
    printf("整数A:"); scanf("%d", &na);
    printf("整数B:"); scanf("%d", &nb);
    
    sum_diff_mul(na, nb, &wa, &sa, &seki);
    
    printf("和は%dです。\n差は%dです。\n積は%dです。\n", wa, sa, seki);
    
    return (0);
}

実行結果

二つの整数を入力してください。
整数A:45
整数B:20
和は65です。
差は25です。
積は900です。