• 締切済み

画面に表示させたいのですが

ランダムで生成した数字をソートするプログラムを作っています。 ソートした結果を画面に表示させたいのですが、 うまくいかず困ってます。 どなたかアドバイスください。 下はソートまでのプログラムです #include<stdio.h> #include<stdlib.h> static int *data = NULL,*work; static int datasize; void merge_vec(int *a,int sa,int *b,int sb){ int c,*p = work; for(c=0;c<sa;c++) work[c]=a[c]; while(sa&&sb){ if(*p <= *b){ *a++ = *p++; sa--; }else{ *a++ = *b++; sb--; } } while(sa--){ *a++ = *p++; } } int merge_aux(int a[],int size){ int j; switch(size){ case 0 : case 1 : return(0); case 2 : if(a[0] > a[1]){ j = a[0]; a[0] = a[1]; a[1] = j; } break; default : j = size / 2; merge_aux(a,j); merge_aux(a+j,size-j); merge_vec(a,j,a+j,size-j); } return 0; } int merge(int p[],int size){ int j=1,c; if(size <= 2){ return merge_aux(p,size); } work = malloc(size * sizeof(int)); if(work == NULL) exit(2); merge_aux(p,size); free(work); return 0; } void make_data(int s,int n){ int i,*p; srand(s); p = malloc(n * sizeof(int)); if(p == NULL) exit(1); for(i = 0; i < n; i++) p[i] = rand(); data = p; datasize = n; } int print_data(void){ int *p = data; int n = datasize; printf("作られた乱数は\n"); while(n--){ printf("%d\n",*p++); } } int get_int(void) { int n; printf("作成する整数の数をを入力してください : "); scanf("%d", &n); return n; } int main(void){ int n,i; printf("乱数を生成します"); n = get_int(); if(data != NULL) free(data); make_data(2008,n); print_data(); merge(data,n); return 0; }

  • sasaq
  • お礼率5% (5/93)

みんなの回答

  • asuncion
  • ベストアンサー率33% (2126/6288)
回答No.4

>私のプログラムで表示させるようにしたいのですが。 後はご自分でどうぞ。

  • asuncion
  • ベストアンサー率33% (2126/6288)
回答No.3

#include <stdio.h> #include <stdlib.h> #include <time.h> void print_data(int *p, int n) { int i; for (i = 0; i < n; ++i) { printf("%d ", p[i]); } putchar('\n'); } void mergesort(int *p, int left, int right, int *t) { if (left < right) { int center = (left + right) / 2; int m = 0, i, j = 0, k = left; mergesort(p, left, center, t); mergesort(p, center + 1, right, t); for (i = left; i <= center; ++i) { t[m++] = p[i]; } while (i <= right && j < m) { p[k++] = (t[j] <= p[i]) ? t[j++] : p[i++]; } while (j < m) { p[k++] = t[j++]; } } } void sort_data(int *p, int n) { int *t; t = (int *) calloc(n, sizeof(int)); if (t == NULL) { fprintf(stderr, "memory allocation error\n"); exit(1); } mergesort(p, 0, n - 1, t); } void make_data(int *p, int n) { int i; for (i = 0; i < n; ++i) { p[i] = rand(); } } int *alloc_data(int n) { int *p; p = (int *) malloc(sizeof(int) * n); if (p == NULL) { fprintf(stderr, "memory allocation error\n"); exit(1); } return p; } int get_int(void) { int n; do { printf("作成する整数の数を入力してください : "); scanf("%d", &n); } while (n <= 0); return n; } int main(void) { int *p, n; srand((unsigned int) time(NULL)); printf("乱数を生成します。\n"); n = get_int(); p = alloc_data(n); make_data(p, n); printf("【ソート前】\n"); print_data(p, n); sort_data(p, n); printf("【ソート後】\n"); print_data(p, n); free(p); return 0; }

sasaq
質問者

補足

できれば、私のプログラムで表示させるようにしたいのですが。 何度もすみません。

  • asuncion
  • ベストアンサー率33% (2126/6288)
回答No.2

もっと単純に考えましょう。 #include <stdio.h> #include <stdlib.h> #include <time.h> void print_data(int *p, int n) { int i; for (i = 0; i < n; ++i) { printf("%d ", p[i]); } putchar('\n'); } void sort_data(int *p, int n) { int i, j, t; for (i = 0; i < n - 1; ++i) { for (j = i + 1; j < n; ++j) { if (p[i] > p[j]) { t = p[i]; p[i] = p[j]; p[j] = t; } } } } void make_data(int *p, int n) { int i; for (i = 0; i < n; ++i) { p[i] = rand(); } } int *alloc_data(int n) { int *p; p = malloc(sizeof(int) * n); if (p == NULL) { fprintf(stderr, "memory allocation error\n"); exit(1); } return p; } int get_int(void) { int n; do { printf("作成する整数の数を入力してください : "); scanf("%d", &n); } while (n <= 0); return n; } int main(void) { int *p, n; srand((unsigned int) time(NULL)); printf("乱数を生成します。\n"); n = get_int(); p = alloc_data(n); make_data(p, n); printf("【ソート前】\n"); print_data(p, n); sort_data(p, n); printf("【ソート後】\n"); print_data(p, n); free(p); return 0; }

sasaq
質問者

補足

書き忘れていましたが、マージソートです。

  • asuncion
  • ベストアンサー率33% (2126/6288)
回答No.1

>ソートした結果を画面に表示させたいのですが、 >うまくいかず困ってます。 どの部分がうまくいかないのですか? ソートですか? ソート後の結果の表示ですか? 何だか、ものすごくむずかしく考えてしまっているように見えます。

sasaq
質問者

補足

ソート後の結果です。 とはいってもまだ、結果の表示がうまくいっていないので ソートがうまくいっているかわからないのですが。 このプログラムは、ソートまでのプログラムで 結果を表示するプログラムは含まれていません(エラーが出たので)

関連するQ&A

  • マージソートのプログラム

    ↓が自分の作ったマージソートのプログラムなのですが、コンパイルするとエラーが起きてしまいます。 mergesort()にポインタを引数として渡してる、引数の数が足りない、ということが書いてありますが…。 ちゃんとint型を渡してるし、引数の数も合ってるように思います。 どこがおかしいのでしょう? #include<stdio.h> #include<stdlib.h> #include<time.h> #define Max 255 int A[Max]; main(){ int n,k; n=inputdata(); int w=1; mergesort(w,n); printdata(n); return(0); } inputdata(){ //配列に乱数を要素として入れていく int n,i; printf("n= "); scanf("%d",&n); //使用者にいくつの要素を入れるか指定してもらう srand(time(NULL)); for(i=1; i<=n; i++){ A[i]=1+rand()%30; } printf("A[%d]={%d,",n,A[1]); for(i=2;i<n;i++) printf("%d,",A[i]); printf("%d}\n",A[n]); return(n); } void mergesort(int p, int r){ int q; if(p<r){ q=(p+r)/2; mergesort(p,q); mergesort(q+1,r); merge(p,q,r); } } void merge(int p, int q, int r){ int i,j,k,B[Max]; i=p; j=q+1; for(k=p;k<=r;k++){ if((j>r) || ((i<=q)&&(A[i]<=A[j]))){ B[k]=A[i]; i++; }else{ B[k]=A[j]; j++; } } for(k=p; k<=r; k++) A[k]=B[k]; } printdata(int n){ int i; printf("A[%d]={%d,",n,A[1]); for(i=2; i<n; i++) printf("%d,",A[i]); printf("%d}\n",A[n]); } ・エラーメッセージ merge1.c: In function ‘main’: merge1.c:12: warning: passing argument 1 of ‘mergesort’ makes pointer from integer without a cast merge1.c:12: error: too few arguments to function ‘mergesort’ merge1.c: At top level: merge1.c:31: error: conflicting types for ‘mergesort’ /usr/include/stdlib.h:294: error: previous declaration of ‘mergesort’ was here merge1.c:41: warning: conflicting types for ‘merge’ merge1.c:37: warning: previous implicit declaration of ‘merge’ was here

  • 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回でした。 と表示させたいのですがうまくいきません。 どなたかご指導よろしくお願いします

  • 組み合わせ

    n個の集合からp個を取る組み合わせの総数を出力するプログラムなんですが nCp=n!/p!(n-p)!という式を使い #include<stdio.h> int kaijo(int m); int comb(int n,int p); int main(void) { int i,j; printf("n="); scanf("%d",&i); printf("p="); scanf("%d",&j); printf("comb(%d,%d)=%d\n",i,j,comb(i,j)); } int kaijo(int m) { if(m>0) return(m*kaijo(m-1)); else return 1; } int comb(int n,int p) { if(n>0) return((n*kaijo(n-1))/(p*kaijo(p-1)*(n-p)*kaijo(n-p-1))); else return 1; } と書いてみたのですがこれではnが大きいとC言語のint型で扱える最大値を超えてしまい正しい結果が出力されません。  そこでint型を使ったままでnやpが大きい場合でもある程度出力できるようにしたいのですがどう改良したらよいのでしょうか? おそらくnCp=n*(n-1)*・・・*(n-p+1)/p!という式を使うのですがよく分かりません。よろしくお願いします。

  • C言語<素数を求めるプログラム>

    #include<stdio.h> int j; int prime(int n) { int i; if(n < 2) return 0; if(n == 2) return 1; if(n%2 == 0) return 0; for(i = 3; i*i<= n; i += 2){ if(n%i == 0) return 0; } return 1; } int main(void) { int n; for(n=1; n <= 1000; n++) { if(prime(n)){ printf("%d\n",n); j++; } } printf("素数の個数は全部で %d 件見つかりました。\n",j); return 0; } このプログラムは1から1000までの素数のみを表示させるプログラムでありますが、このアルゴリズムが全くわかりません。 int prime(int n)の中身のアルゴリズムがどういう仕組みになっているのかお分かりになりますでしょうか?

  • C言語のアルゴリズム、マージソートについて質問です。

    C言語のアルゴリズム、マージソートについて質問です。 例えば下のプログラム #include <stdio.h> void merge(int first, int last, int *data, int *work); int main(void) { int data[9] = {1,8,3,6,5,4,7,2}; int work[9]; int i; merge(0,8,data,work); for(i = 0;i < 9;i++) printf("%d",data[i]); return 0; } void merge(int first, int last, int *data, int *work) { int middle, mae, ato, i; if (first == last) { return; } middle = (first + last) / 2; merge(first, middle, data, work); merge(middle + 1, last, data, work); i = first; mae = first; ato = middle + 1; while (mae <= middle && ato <= last) { if (data[mae] <= data[ato]) { work[i] = data[mae]; i++; mae++; } else { work[i] = data[ato]; i++; ato++; } } while (mae <= middle) { work[i] = data[mae]; i++; mae++; } while (ato <= last) { work[i] = data[ato]; i++; ato++; } for (i = first; i <= last; i++) { data[i] = work[i]; } } まずfirst=0,last=8でmerge関数に入り関数内8行目でmiddle=4となり、 10行目でfirst=0,last=4でmergeに入り同じく8行目でmiddle=2となり、 同じく10行目でfirst=0,last=2でmergeに入り同じく8行目でmiddle=1となり、 同じく10行目でfirst=0,last=1でmergeに入り同じく8行目でmiddle=0となり、 同じく10行目でfirst=0,last=0でmergeに入り3行目のifでreturnします。 そして前回のfirst=0,last=1,middle=0のmerge10行目に戻り, 12行目でfirst=1,last=1でmergeに入り3行目のifでreturnし、 12行目以下の作業をします。 そのまま一番下までいったあとはどうなるのでしょうか? また上で書いた手順もあっている自信はあまりないので ご指摘お願いします。

  • 数独を解くアルゴリズム

    バックトラック法で解いているのですが、どこがおかしいのか見当もつかないので教えてください。 コンパイルエラーはありません。 表示の関数は省いてあります。 よろしくお願いします。 #include <stdio.h> #define M 3 //小さいブロックのサイズ #define N M*M //全体のサイズ #define MTX N*N //全体のマス数 int sudoku[N][N]={    {0,2,4,5,0,0,6,0,0},    {0,0,6,3,2,0,0,0,4},    {0,0,5,0,9,0,0,8,3},    {0,0,8,4,0,3,0,0,1},    {0,6,1,9,0,0,4,3,0},    {7,0,0,1,0,0,5,0,0},    {8,3,0,0,4,0,9,0,0},    {4,0,0,0,3,5,8,0,0},    {0,0,7,0,0,9,3,4,0}    }; /* 候補がOKかどうかチェック */ int OKkouho(int x, int y, int k) {    int i,j;    int p,q;    for(i=0; i < N; i++){ //その行に候補は入るか       if(sudoku[y][i] == k)          return 0;    }    for(j=0; j < N; j++){ //その列に候補は入るか       if(sudoku[j][x] == k)          return 0;    }    p = x/M*M;    q = y/M*M;    //そのブロックに候補は入るか    for(j = q; j < q+M; j++){       for(i = p; i < p+M; i++){          if(sudoku[j][i] == k)             return 0;       }    }    return 1; } void Solve(int level) {    int k;    int x,y;    if(level >= MTX){       printf("OK");       return;    }    x = level%N;    y = level/N;    if(sudoku[y][x])       Solve(level+1);    else{       for(k = 1; k <= N; k++){          if(OKkouho(x,y,k)){             sudoku[y][x] = k;             Solve(level+1);             sudoku[y][x] = 0;             }       }    } } int main(void) {    Solve(0);    return 0; }

  • 助けてください・・・

    大学のプログラミングの講義で試験があり、以下の設問がありました。 次のプログラムのprintf文で何が表示されるか? #include<stdio.h> int pow2_a (int); int main (void) { printf("\n%d\n", pow2_a(12)); return 0; } int pow2_a (int n) { int p=1; if (n>0) { int tmp, m; m = n/2; printf("-- call pow2_a(%2d)\n", m); tmp = pow2_a(m); if (n%2==0) { p = tmp*tmp; } else { p = tmp*tmp*2; } } printf("-- return%8d\n", p); return p; } この答えが以下のようになるようです。   -- call pow2_a( 6) -- call pow2_a( 3) -- call pow2_a( 1) -- call pow2_a( 0) -- return 1 -- return 2 -- return 8 -- return 64 -- return 4096 そこで「--return 1 」と書いてあるところまでは分かるのですが、これ以下の表示が何故こうなるか理解できません。 お分かりの方教えてください。m(__)m

  • マージソート

    マージソートの実行時間を測定するプログラムを書いています。 コンパイルの時にはエラーが出ないのですが、実行するとコマンドプロンプトが強制終了されます。 どこが悪いか、どう直せばいいのか指摘していただけないでしょうか? よろしくお願いします。 ~qtime.c~ //マージソート実行用プログラム //bcc32 mtime.c merge.c m1.c sfmt.c #include <stdio.h> #include <stdlib.h> #include <time.h> #include "sfmt.h" #define MAX 5000 void merge_sort(int a[], int start, int end); main() { int i , x[MAX] , n; time_t start , end ; int sn; printf("適当な数字の入力 : "); scanf("%d", sn); init_gen_rand(sn); for(i=0; i<MAX; i++) x[i]= (gen_rand32()% MAX);; n=MAX; start = clock(); //測定対象プログラム merge_sort(x, 0, n-1); end = clock(); printf("sort\n"); for(i =0 ; i < n ; i++ ) if ( i == i/100*100) printf("%d\n" , x[i]); printf ("実行時間: %f sec\n" , (double)(end-start) /CLOCKS_PER_SEC); return 0; } ~merge.c~ int b[100]; void merge_array(int x[], int start, int end) { int mid, i, j, k; mid = (start + end) /2; i = start; j = mid + 1; for(k = start; k <= end; k++){ if(x[i] > x[j] && j <= end || i > mid){ b[k] = x[j]; j++; } else{ b[k] = x[i]; i++; } } for(k = start; k <= end; k++){ x[k] = b[k]; } } ~m1.c~ void merge_array(int x[], int start, int end); void merge_sort(int a[], int start, int end); void merge_sort(int a[], int start, int end) { int mid; if(start >= end) return; mid = (start + end) / 2; merge_sort(a, start, mid); merge_sort(a, mid + 1, end); merge_array(a, start, end); }

  • Cプログラムで15パズルを作ってみたのですがうまく動作しません。何処が

    Cプログラムで15パズルを作ってみたのですがうまく動作しません。何処が間違っているのかずっと考えているのですがいまだに解決策が見つかりません。ヒントでもいいのでお願します。 #include <stdio.h> int init(void); void show(void); int chk_cmp(void); char input(void); int move(char cmd); #define N 4 int panel[N][N] = { { 1, 2, 3, 4}, { 5, 6, 7, 8}, { 9, 10, 11, 0}, {13, 14, 15, 12} }; int x, y; int main(void) { printf("これは15パズルです。\n" "左上から右に向かって「1」から「15」が並ぶよう,\n" "「0」を動かしてください。\n" "操作はテンキーで行います。( 8(上),4(左),6(右),2(下) )\n"); if( !init() ) { printf("パネルの初期化に失敗しました。「0」のパネルがありません。\n"); return 1; } while(1) { show(); if( chk_cmp() ) { printf("完成です!\n"); break; } while(1) { if( move(input()) ) { break; } else { printf("そっちには動かせません。\n"); } } } return 0; } int init(void) { int i,j; for(i=0;i<=N-1;i++){ for(j=0;j<=N-1;j++){ if(panel[i][j]==0){ x=j; y=i; return 1; } } } return 0; } void show(void) { int i,j; printf("---------------\n"); for(i=0;i<=N-1;i++){ for(j=0;j<=N-1;j++){ printf("%3d",panel[i][j]); } printf("\n"); } printf("---------------\n\n"); } int chk_cmp(void) { int i,j; for(i=0;i<=N-1;i++){ for(j=0;j<=N-1;j++){ if(i==N-1&&j==N-1){ if(panel[i][j]!=0){ return 0; } }else{ if(panel[i][j]!=N*i+j+1){ return 0; } } } } return 1; } char input(void) { int comand; while(1){ scanf("%d",&comand); if(comand==8||comand==4||comand==6||comand==2){ break; } printf("8(上),4(左),6(右),2(下)を入力してください。"); } return comand; } int move(char cmd) { int dx=0, dy=0; if(cmd==8){dy=-1;}//上 if(cmd==4){dx=-1;}//左 if(cmd==6){dx=1;}//右 if(cmd==2){dy=1;}//下 if(x+dx>=0&&x+dx<=N-1&&y+dy>=0&&y+dy<=N-1){ panel[y][x]==panel[y+dy][x+dx]; panel[y+dy][x+dx]==0; y+=dy; x+=dx; return 1; } else{return 0;} }

  • 正しい結果が表示されない

    以下のプログラムはガウスの消去法を使って 解を求めるプログラムです。 しかし、gauss関数にprintf関数を入れてコンパイルすると 正しい結果 5 3 1 0 0 がでますが、gauss関数にprintf関数をいれずmain関数に書くと 0 0 0 0 0 となります。 なぜでしょうjか?? #include<stdio.h> #include<math.h> #define N 5 void gauss(double a[N][N+1]); int main(){ double a[N][N+1] = { { 1,-1,-1,-1,-1, 1}, {-1, 1,-1,-1,-1,-3}, {-1,-1, 1,-1,-1,-7}, {-1,-1,-1, 1,-1,-9}, {-1,-1,-1,-1, 1,-9} }; double x[N]; int i; gauss(a); printf("\n[x]=\n"); /* x[i] を表示する */ for(i=0; i<N; i++){ printf(" %8.3lf\n", x[i]); } return(0); } void gauss(double a[N][N+1]) { int i,j,k,p; double m, pmax, s, x[N]; for(k = 0; k < N-1; k++){ /* ピボット操作 */ p = k; /* p, pmax の初期値 */ pmax = fabs(a[k][k]); for(i = k+1; i < N; i++){ /* 最大値を検索 */ if(fabs(a[i][k]) > pmax){ p = i; pmax = fabs(a[i][k]); } } if(fabs(pmax) < 1.0e-12){ /* 最大値がゼロに近い時はエラー */ fprintf(stderr, "too small pivot!\n"); exit(1); } if(p != k){ /* ピボット操作 */ for(j = 0; j < N+1; j++) { s = a[k][j]; /* 値の入れ替え */ a[k][j] = a[p][j]; a[p][j] = s; } } for(i = k+1; i < N; i++) { /* 第 i 行 */ m = a[i][k] / a[k][k]; /* 倍率 m を計算 */ a[i][k] = 0; /* 注1 (下記参照) */ for(j = k+1; j < N+1; j++) { /* 第 j 列 */ a[i][j] = a[i][j] - a[k][j] * m; } } } for(i = N-1; i >= 0; i--){ /* 後退代入 */ m = 0; for(j = N-1; j > i; j--){ m = m + a[i][j] * x[j]; } x[i] = (a[i][N] - m) / a[i][i]; } }