- 締切済み
画面に表示させたいのですが
ランダムで生成した数字をソートするプログラムを作っています。 ソートした結果を画面に表示させたいのですが、 うまくいかず困ってます。 どなたかアドバイスください。 下はソートまでのプログラムです #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; }
- みんなの回答 (4)
- 専門家の回答
みんなの回答
- asuncion
- ベストアンサー率33% (2127/6289)
>私のプログラムで表示させるようにしたいのですが。 後はご自分でどうぞ。
- asuncion
- ベストアンサー率33% (2127/6289)
#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; }
- asuncion
- ベストアンサー率33% (2127/6289)
もっと単純に考えましょう。 #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; }
補足
書き忘れていましたが、マージソートです。
- asuncion
- ベストアンサー率33% (2127/6289)
>ソートした結果を画面に表示させたいのですが、 >うまくいかず困ってます。 どの部分がうまくいかないのですか? ソートですか? ソート後の結果の表示ですか? 何だか、ものすごくむずかしく考えてしまっているように見えます。
補足
ソート後の結果です。 とはいってもまだ、結果の表示がうまくいっていないので ソートがうまくいっているかわからないのですが。 このプログラムは、ソートまでのプログラムで 結果を表示するプログラムは含まれていません(エラーが出たので)
補足
できれば、私のプログラムで表示させるようにしたいのですが。 何度もすみません。