ポインタを用いた並び替え

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

ポインタを用いた並び替え

#1

投稿記事 by gore » 16年前

はじめまして 私はいま「要素数n個のint型配列の要素を降順に並び変える関数sortを作成し、main関数の中で宣言した要素数5個の配列変数x[5]をsortを用いて降順に並び変えるプログラムを作成せよ。
sortには配列変数のアドレスをポインタを用いて引き渡すこと。また、要素数を示す値nは引数としてsortに与えること。」というような課題をやっていて
#include<stdio.h>
void sort(int *);
int main(void)
{
	int x[5]={6,8,5,7,9};
    printf("%d\n",x);
	sort(x);
	getchar ();
	getchar ();
	return 0;
}
void sort(void *n)
{
	int temp,i;
	for(i=0;i<5;i++){
		temp=*n;
		*n=*(n+i);
		*(n+i)=temp;
	}
のようなプログラムを作成したのですがうまく動作しません。教えていただけませんか?

box

Re:ポインタを用いた並び替え

#2

投稿記事 by box » 16年前

うまく動きません、だけでは、
何も言っていないのと同じです。
どういう結果になったのでうまく動かないと判断されたかを
具体的に説明してください。

gore

Re:ポインタを用いた並び替え

#3

投稿記事 by gore » 16年前

返信ありがとうございます。
コンパイルすると16から18行の間でエラーが出ます

box

Re:ポインタを用いた並び替え

#4

投稿記事 by box » 16年前

コンパイルしたときにどんなエラーが出ましたか?

gore

Re:ポインタを用いた並び替え

#5

投稿記事 by gore » 16年前

int *からintに変換できないと出ます

non

Re:ポインタを用いた並び替え

#6

投稿記事 by non » 16年前

#include<stdio.h>
void sort(int *);
int main(void)
{
	int x[5]={6,8,5,7,9};
    printf("%d\n",x);
  ここでxは配列のアドレスです。アドレスを表示するなら%pです
	sort(x);
ソートした後の値を表示しないとソートされたかわかりません
	getchar ();
	getchar ();
	return 0;
}
void sort(void *n)
プロトタイプでは int *n です。
{
	int temp,i;
	for(i=0;i<5;i++){
		temp=*n;
		*n=*(n+i);
		*(n+i)=temp;
	}
ソートのアルゴリズムになっていません。
最後の閉じカッコがありません

gore

Re:ポインタを用いた並び替え

#7

投稿記事 by gore » 16年前

ご指摘ありがとうございます。直した結果
#include<stdio.h>
     void sort(int *);
     int main(void)
{
	int x[5]={6,8,5,7,9};
	sort(x);
	printf("%d",x);
	getchar ();
	getchar ();
	return 0;
}
void sort(int *n)
{
	int i,temp;
	
	for(i=0;i<4;i++){
		if(n<n+i){
		temp=n;
		n=n+i;
		n+i=temp;
	}
}
}
のようになったのですがまだ先ほどのようなエラーが消えません。教えていただけると助かります。

通りすがり

Re:ポインタを用いた並び替え

#8

投稿記事 by 通りすがり » 16年前

#include<stdio.h>

#define N 5

void print(int *);
void sort(int *);

int main(void)
{
    int x[N] = { 6, 8, 5, 7, 9 };
    
    printf("ソート前\n");
    print(x);
    sort(x);
    printf("ソート後\n");
    print(x);
    return 0;
}

void print(int *x)
{
    int i;
    
    for (i = 0; i < N; i++) {
        printf("%d ", x);
    }
    printf("\n");
}

void sort(int *x)
{
    int i, j;
    
    for (i = 0; i < N - 1; i++) {
        for (j = i + 1; j < N; ++j) {
            if (x < x[j]) {
                int t = x;
                x = x[j];
                x[j] = t;
            }
        }
    }
}

gore

Re:ポインタを用いた並び替え

#9

投稿記事 by gore » 16年前

ありがとうございました。参考にして完成させることができました。

non

Re:ポインタを用いた並び替え

#10

投稿記事 by non » 16年前

しかし、タイトルがポインタを用いた並び替えですからね。はたして、これをポインタを用いたと言って
いいのかと。いや、用いたと言えば・・・・用いたのかも?
だからといって、 xを *(x+i) とすればいいというものでもないだろうし・・・
質問者がよければこれでよいのですが・・・

通りすがり

Re:ポインタを用いた並び替え

#11

投稿記事 by 通りすがり » 16年前

参考にして、というよりは丸写しして、だと思います。

なぜ、あのソースでうまくいったのか、しっかり吟味してくださいね。

通りすがり

Re:ポインタを用いた並び替え

#12

投稿記事 by 通りすがり » 16年前

x[n]という書き方は*(x+n)の糖衣構文に過ぎないので、
あのコードでじゅうぶんポインタを使っていることになります。

フリオ

Re:ポインタを用いた並び替え

#13

投稿記事 by フリオ » 16年前

 
 課題文に、

sortには配列変数のアドレスをポインタを用いて引き渡すこと。
また、要素数を示す値nは引数としてsortに与えること。

とありますけど。

通りすがり

Re:ポインタを用いた並び替え

#14

投稿記事 by 通りすがり » 16年前

おっと失礼いたしました。
#include<stdio.h>

#define N 5

void print(int *, int);
void sort(int *, int);

int main(void)
{
    int x[N] = { 6, 8, 5, 7, 9 };
    
    printf("ソート前\n");
    print(x, N);
    sort(x, N);
    printf("ソート後\n");
    print(x, N);
    return 0;
}

void print(int *x, int n)
{
    int i;
    
    for (i = 0; i < n; i++) {
        printf("%d ", x);
    }
    printf("\n");
}

void sort(int *x, int n)
{
    int i, j;
    
    for (i = 0; i < n - 1; i++) {
        for (j = i + 1; j < n; ++j) {
            if (x < x[j]) {
                int t;
                t = x, x = x[j], x[j] = t;
            }
        }
    }
}

lbfuvab

Re:ポインタを用いた並び替え

#15

投稿記事 by lbfuvab » 16年前

交換の処理は
#define SWAP(a,b) #
do{               #
    a^=b;         #
    b^=a;         #
    a^=b;         #
}while(0);
って感じでどうでしょうかね。

閉鎖

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