ポインタを使用した2つの整数の記憶場所を交換するプログラムについて

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
Makoto

ポインタを使用した2つの整数の記憶場所を交換するプログラムについて

#1

投稿記事 by Makoto » 11ヶ月前

2つの整数の記憶場所を交換するにはどのようにすればよいのでしょうか?下は問題文です。
intへのポインタ引数xとyをもつswap関数を定義し,2つの整数の記憶場所を交換するプログラムを作成しなさい.
void swap(int *x, int *y);
/* ポインタ引数x, yが指す変数の値を入れ替える */
main関数では,scanf関数を使って2つの整数を入力し,swap関数を呼んでから2つの整数値を出力する.
swap関数にはprintf, scanfを書いてはいけない.main関数にはif文を書いてはいけない.大域変数を使ってはいけない.
実行例
整数を2つ入力
7 -1
swap前:7 -1
swap後:-1 7

int main(void)
{
int a, b;

printf("整数を2つ入力¥n");
scanf("%d %d", &a, &b);
printf("swap前:%d %d¥n", a, b);
swap( … );
printf("swap後:%d %d¥n", a, b);

return 0;
}

コード: 全て選択

#include <stdio.h>

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

int main(void)
{
    int a, b;
 
    printf("整数を2つ入力\n");
    scanf("%d %d", &a, &b);
    printf("swap前:%d %d\n" a, b);
    swap();
    printf("swap後:%d %d\n" a, b);
   
    return 0;
}

void swap(int *x, int *y)
{
    *y = ;    
    *x = ;
    return a, b;
}

白い変人

Re: ポインタを使用した2つの整数の記憶場所を交換するプログラムについて

#2

投稿記事 by 白い変人 » 11ヶ月前

main関数にもミスが見られるようですが、凡ミスなのか本当に分からなかったのかでは意味が違いますので、何処が間違いだったのかは質問者様で探してご確認下さい。

swap関数に関しては、戻り値の型にvoidを指定しておきながら、返却値を記述しているのかが不明ですし、しかも複数・・・。
基本的な文法の確認もしておくべきかと思います。

以下、動作する程度に添削した回答例。(これで動くみたいだからOKではなく、何故動くようになったのかは、添削前のプログラムと比較して理解しましょう。)

コード: 全て選択

 
#include <stdio.h>

void swap(int *x, int *y){
	if(x==y || *x==*y) return;

	*x+=*y;
	*y=*x-*y;
	*x=*x-*y;
}

int main(void){
    int a, b;
	 
    printf("整数を2つ入力\n");
    scanf("%d %d", &a, &b);
    printf("swap前:%d %d\n", a, b);
    swap(&a,&b);
    printf("swap後:%d %d\n", a, b);
   
    return 0;
}

 

Makoto

Re: ポインタを使用した2つの整数の記憶場所を交換するプログラムについて

#3

投稿記事 by Makoto » 11ヶ月前

白い変人さん、理解して解決できました!回答ありがとうございましたm(_ _)m

かずま

Re: ポインタを使用した2つの整数の記憶場所を交換するプログラムについて

#4

投稿記事 by かずま » 11ヶ月前

別解です。こちらも理解できますか?

コード: 全て選択

#include <stdio.h>
 
void swap(int *x, int *y);
 
int main(void)
{
    int a, b;
     
    printf("整数を2つ入力\n");
    scanf("%d%d", &a, &b);
    printf("swap前: %d %d\n", a, b);
    swap(&a,&b);
    printf("swap後: %d %d\n", a, b);
    return 0;
}

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

    t = *x;
    *x = *y;
    *y = t;
}
出題者は、「ポインタを使うと、呼出し元の変数を読み書きできる」と
いうことを理解させようとしているのではないでしょうか?
一時変数を使わずに値の交換を行うことは想定していないと思うんですが。

返信

“C言語何でも質問掲示板” へ戻る