ページ 1 / 1
ポインタを用いた並び替え
Posted: 2008年11月26日(水) 20:15
by gore
はじめまして 私はいま「要素数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;
}
のようなプログラムを作成したのですがうまく動作しません。教えていただけませんか?
Re:ポインタを用いた並び替え
Posted: 2008年11月26日(水) 21:21
by box
うまく動きません、だけでは、
何も言っていないのと同じです。
どういう結果になったのでうまく動かないと判断されたかを
具体的に説明してください。
Re:ポインタを用いた並び替え
Posted: 2008年11月26日(水) 21:27
by gore
返信ありがとうございます。
コンパイルすると16から18行の間でエラーが出ます
Re:ポインタを用いた並び替え
Posted: 2008年11月26日(水) 21:31
by box
コンパイルしたときにどんなエラーが出ましたか?
Re:ポインタを用いた並び替え
Posted: 2008年11月26日(水) 21:40
by gore
int *からintに変換できないと出ます
Re:ポインタを用いた並び替え
Posted: 2008年11月26日(水) 22:00
by non
#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;
}
ソートのアルゴリズムになっていません。
最後の閉じカッコがありません
Re:ポインタを用いた並び替え
Posted: 2008年11月26日(水) 22:22
by gore
ご指摘ありがとうございます。直した結果
#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:ポインタを用いた並び替え
Posted: 2008年11月26日(水) 22:50
by 通りすがり
#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;
}
}
}
}
Re:ポインタを用いた並び替え
Posted: 2008年11月26日(水) 23:02
by gore
ありがとうございました。参考にして完成させることができました。
Re:ポインタを用いた並び替え
Posted: 2008年11月26日(水) 23:09
by non
しかし、タイトルがポインタを用いた並び替えですからね。はたして、これをポインタを用いたと言って
いいのかと。いや、用いたと言えば・・・・用いたのかも?
だからといって、 xを *(x+i) とすればいいというものでもないだろうし・・・
質問者がよければこれでよいのですが・・・
Re:ポインタを用いた並び替え
Posted: 2008年11月26日(水) 23:11
by 通りすがり
参考にして、というよりは丸写しして、だと思います。
なぜ、あのソースでうまくいったのか、しっかり吟味してくださいね。
Re:ポインタを用いた並び替え
Posted: 2008年11月26日(水) 23:17
by 通りすがり
x[n]という書き方は*(x+n)の糖衣構文に過ぎないので、
あのコードでじゅうぶんポインタを使っていることになります。
Re:ポインタを用いた並び替え
Posted: 2008年11月26日(水) 23:25
by フリオ
課題文に、
sortには配列変数のアドレスをポインタを用いて引き渡すこと。
また、要素数を示す値nは引数としてsortに与えること。
とありますけど。
Re:ポインタを用いた並び替え
Posted: 2008年11月26日(水) 23:41
by 通りすがり
おっと失礼いたしました。
#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;
}
}
}
}
Re:ポインタを用いた並び替え
Posted: 2008年11月28日(金) 01:32
by lbfuvab
交換の処理は
#define SWAP(a,b) #
do{ #
a^=b; #
b^=a; #
a^=b; #
}while(0);
って感じでどうでしょうかね。