PROG 11.2 変数の値の交換 (swap)

背景

#include <stdio.h>

int main (void) {
    int a, b, tmp;
 
    printf("a = ");
    scanf("%d", &a);
    printf("b = ");
    scanf("%d", &b);

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

    tmp = a;
    a = b;
    b = tmp;

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

    return (0);
}

[実行結果と問題1,2]

a = 4
b = 6
BEFORE : a =   4, b =   6
 AFTER : a =   6, b =   4

問題
  1. このプログラムで呼び出されるscanf("%d", &a);の&は、なぜ必要か。&をつけないと、どういう意味になるか。
  2. int型の変数bが確保されたアドレスをプリントする文を追加せよ。

[問題3]
  • 上のプログラムを改良する。swap関数を作成して、aとbの値を入れ替えなさい。下はmain関数からの呼び出し部である。
#include <stdio.h>

void swap (int *x, int *y);

int main (void) {
    int a, b;

    printf("a = ");
    scanf("%d", &a); 
    printf("b = ");
    scanf("%d", &b);

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

    swap(&a, &b); /* swap関数の呼び出し。引数はアドレス渡し */

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

    return (0);
}
[ 問題4]
  • swapプログラムを完成させたら、配列要素の交換にも、利用しよう。 (0701の問題を変形)
    #include <stdio.h>
    #define N 10
    
    void swap (int *x, int *y);
    
    int main (void) {
        int i, j;
        int a[N] = {42, 33, 78, 19, 46, 63, 25, 11, 54, 17};
        i = 2; j = 9;
    
        printf ("BEFORE : a[i] = %3d, a[j] = %3d \n", a[i], a[j]);
    
        swap(&a[i], &a[j]); /* 関数の呼び出し。引数はアドレス渡し */
    
        printf (" AFTER : a[i] = %3d, a[j] = %3d \n", a[i], a[j]);
    
        return (0);
    }
    例題集ページ
    • 0701 配列要素の交換

[問題3の解答プログラム]

#include <stdio.h>

void swap (int *x, int *y);

int main (void) {
    int a, b;

    printf("a = ");
    scanf("%d", &a); 
    printf("b = ");
    scanf("%d", &b);

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

    swap(&a, &b);

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

    return (0);
}

/* swap関数 */
void swap(int *x, int *y) {

     int tmp;
 
     tmp = *x;
     *x = *y;
     *y = tmp;
}