こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

printfの挿入箇所

#include <stdio.h>
#include <stdlib.h>

#define N 500

void bubblesort(int h, int k, int *A);
void swap(int i, int j, int *A);

int main(void)
{
int A[N];
int n, i;
FILE *file;

file=fopen("sortdata", "r"); /* データの読込み */
fscanf(file, "%d", &n);
if(n>N)
{
printf("Illegal array size n = %d for N = %d\n", n, N);
exit(1);
}
for(i=0; i<n; i++) fscanf(file, "%d", &A[i]);
/**/ printf("A = ");
/**/ printf("\n");
bubblesort(0, n-1, A); /* 配列A[0]からA[n-1]の整列 */
return(0);
}

/* A[k],...,A[h]の要素をバブルソートによって整列 */
void bubblesort(int h, int k, int *A)
{
int i, j, p;
int no;
int test; /* test==1; すでに整列済み */

for(i=h; i<k; i++) /* バブル操作の反復 */
{
test=1;
for(j=k; j>=i+1; j--)
{
for(no=0; no<j; no++) printf(" %d",A[no]);
if(A[j]<A[j-1])
{
printf(" > %d ",A[j]);
swap(j, j-1, A); test=0;
}
else
{
printf(" < %d ",A[j]);
}
for(no=j+1; no<=k; no++) printf(" %d ",A[no]);

printf("\n");
}
printf("\n");
if(test==1) return;
}
return;
}

/* Swap A[i] and A[j]. */
void swap(int i, int j, int *A)
{
int temp;
temp=A[i]; A[i]=A[j]; A[j]=temp;
return;
}

以上のプログラムを
A = パス1:
7 5 1 2 8 > 3
7 5 1 2 < 3 8
7 5 1 < 2 3 8
7 5 > 1 2 3 8
7 > 1 5 2 3 8
1 7 5 2 3 8
パス2:
1 7 5 2 3 < 8
1 7 5 2 < 3 8
1 7 5 > 2 3 8
1 7 > 2 5 3 8
1 2 7 5 3 8
パス3:
1 2 7 5 3 < 8
1 2 7 5 > 3 8
1 2 7 > 3 5 8
1 2 3 7 5 8
パス4:
1 2 3 7 5 < 8
1 2 3 7 > 5 8
1 2 3 5 5 8
パス5:
1 2 3 5 7 < 8
1 2 3 5 7 8
比較は15回でした。
交換は8回でした。

と表示させたいのですがうまくいきません。
どなたかご指導よろしくお願いします

投稿日時 - 2008-07-06 22:57:06

QNo.4156686

困ってます

質問者が選んだベストアンサー

#include <stdio.h>
#include <stdlib.h>

#define N 500

void bubblesort(int h, int k, int *A);
void swap(int i, int j, int *A);

/*

個人的な見易さの都合上
for (i = 0;i < n;i++) printf("%d",i);
のような表記を
for (i = 0;i < n;i++){
printf("%d",i);
}

と書き換えて,また
if ( k == 1 )
{

}
else
{

}



if ( k == 1 ){

}else{

}
と書き換え,

int main()
{
}

int main(){
}
と書いてます。

*/

/* 変数を増やした */
int swapcount = 0;
int comparecount = 0;

int main(void){
int A[N];
int n, i;
FILE *file;

file=fopen("sortdata", "r"); /* データの読込み */
fscanf(file, "%d", &n);
if(n>N){
printf("Illegal array size n = %d for N = %d\n", n, N);
exit(1);
}
for(i=0; i< n ; i++){
fscanf(file, "%d", &A[i]);
}
bubblesort(0, n-1, A); /* 配列A[0]からA[n-1]の整列 */
/*
別に表示はここでなくても構わない。
ソースコードをUTF-8で書いてあるが,
コマンドプロンプトは日本語版ではShift_JIS前提になっていて文字化けするため
比較回数,という日本語表記にはしていない。
*/
printf("compare count : %d\n",comparecount);
printf("swap count : %d\n",swapcount);

return(0);
}

/* A[k],...,A[h]の要素をバブルソートによって整列 */
void bubblesort(int h, int k, int *A){
int i, j, p;
int no;
int test; /* test==1; すでに整列済み */

for(i=h; i<k; i++){ /* バブル操作の反復 */

test=1;
for(j=k; j>=i+1; j--){

for(no=0; no<j; no++){
printf(" %d",A[no]);
}
if(A[j-1] > A[j]){/* 個人的に落ち着かなかったので表示と向きを統一しました。*/

printf(" > %d",A[j]);
swap(j, j-1, A);
test=0;
}else if (A[j-1] < A[j] ){
printf(" < %d",A[j]);
}else{
printf(" = %d",A[j]); /* 折角だから増やしてみる */
}


for(no=j+1; no<=k; no++){
printf(" %d",A[no]);
}

printf("\n");
comparecount++; /* 比較回数を増やす */
}

/*
出力結果自体は最後こう出力すべきみたいなので
体裁をそろえるために各prinf関数の後ろの半角空白を取り除いてます
*/
for(no=h; no<=k; no++){
printf(" %d",A[no]);
}
printf("\n");
printf("\n");
if(test==1){
return;
}
}
return;
}

/* Swap A[i] and A[j]. */
void swap(int i, int j, int *A){
int temp;
temp=A[i];
A[i]=A[j];
A[j]=temp;
swapcount++; /* 交換回数を増やす */
return;
}

投稿日時 - 2008-07-06 23:43:43

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(2)

訂正
パスのこと忘れてた。

for(i=h; i<k; i++){ /* バブル操作の反復 */
printf("pass%d:\n",i-h+1); /* ここ追加 */

printf("\n");
/* printf("\n"); ここ不要 */
if(test==1){

投稿日時 - 2008-07-06 23:49:15

あなたにオススメの質問