Report#8 基数変換とSORT †入力した正の整数を降順に並べ換えて出力するプログラムを作成せよ。プログラムは個別にコンパイルし、makeコマンドで実行すること。 入力データは50以下とし、以下の数が混在しているとする。 16進数:先頭1文字がxまたはX(エックスの小文字か大文字) 8進数:先頭1文字が0(零) 10進数:先頭1文字が0(零)以外の数字 考察ポイント:複数あるポインタ変数が何を指しているかの把握、Makeコマンドでの実行 プログラムの一部 †/* Program : cardinal.c Comment : 基数変換と整列処理 */ #include <stdio.h> #include <string.h> #define MAX 256 void conv10(char **x, int *k, int n); void select_sort(int x[], int m[], int n); void print_num(char *x[], int m[], int n); void msg(); int main(){ char *dt[50], num[10], buf[MAX], *p=buf; int n=0, len, i10[50], move[50]; puts("-------- Input"); while(gets(num) != NULL) { len = strlen(num); if(p > ?_?_?_?_? ) break; strcpy(p, num); dt[n] = p; p += ?_?_?_?_?; n++; } puts("-------- Result"); conv10(?_?_?_?_?); select_sort(?_?_?_?_?); print_num(?_?_?_?_?); msg(); return(0); } /* Program : conv10.c */ void conv10(char **x, int *k, int n){ while(n-- > 0){ switch(**x){ case '0' : sscanf(?_?_?_?_?, "%o", k); break; case 'x' : case 'X' : sscanf(?_?_?_?_?, "%x", k); break; default : sscanf(?_?_?_?_?, "%u", k); break; } ?_?_?_?_?; ?_?_?_?_?; } } /* Program : select_sort.c */ void select_sort(int x[], int m[], int n){ int i, j, k, w; for(i=0; i<n; i++) m[i]=i; for(i=0; i<n-1; i++){ k=i; for(j=i+1; j<n; j++) if( ?_?_?_?_? ) k=j; w = x[i]; x[i] = x[k]; x[k] = w; w = m[i]; m[i] = m[k]; m[k] = w; } } /* Program : print_num.c */ void print_num(char *x[], int m[], int n){ int i; for(i=0; i<n; i++){ puts( ?_?_?_?_? ); } } /* Program : msg.c */ int msg(){ printf("#### Message from C #### By Taniguchi\n"); return(0); } 実行例 †-------- Input x21 021 055 22 ^D -------- Result 055 x21 22 021 #### Message from C #### By Taniguchi Report#7<== |