C言語 指定されたようにデータの並び替えをする

/*
 ・入力データを指定の順で並べ替え出力する。一行に出力するデータ個数の指定も行う。
 ・並び順、1行に出力する個数及び整数データを入力し、ソート前とソート後のデータを出力する。
 ・データは出力時に、内容がわかるようなメッセージも合わせて出力する。
 ・処理は繰り返し行えることとし、並び順に'E'が入力された場合に処理終了する。
 ---処理条件---
 入力データは-999から999の整数とし、入力データ件数は最大20個とする。
 1行のデータ出力個数は5から10とする。
 以下の関数を作成し、処理を行う。
 ①並び順の文字入力関数
 昇順:A、降順:D、処理終了:E
 上記以外はエラーとし再入力する。
 ②配列への整数データ(範囲チェック機能付き)
 ・入力データのチェックを行い、エラーの場合は再入力する。
 ・データ入力の終了
 引数で渡される入力最大件数分データを入力したか、入力終了(EOF)により終了する。
 ③ソート関数
 ・配列の内容を指定の並び順で並び替える。
 ④配列の整数データ出力関数
 ・メッセージは先頭行で終了する。
 */
#include <stdio.h>
#define N 20
char f_order(void);
int input(int n, int *data);
void output(int n, int *data);
void mysort1(int n, int *data);
void mysort2(int n, int *data);

int main(void) {
	char order[2];
	int n;
	int data[N];
	order[0] = f_order();
	if (order[0] == 'E')
		return 0;
	n = input(N, data);
	if (order[0] == 'A') {
		mysort1(n, data);
	}
	if (order[0] == 'D') {
		mysort2(n, data);
	}
	output(n, data);
}
/****************************/
char f_order(void) {
	char order[2];
	printf("整数データ(20件)を並び替えます。\nA,D,Eいずれかを入力してください。\n昇順:A 降順:D 処理終了:E\n");
	for (;;) {
		scanf("%s", order);
		if ((order[0] == 'A' || order[0] == 'D' || order[0] == 'E')
				&& order[1] == '\0') {
			return order[0];
		} else {
			printf("エラー、再入力\n");
		}
	}
}
/****************************/
int input(int n, int *data) {
	int i, *p, d, x;
	p = data;
	printf("-999〜999のデータを入力してください。\n");
	for (i = 0; i < n; i++) {
		printf("%d件目>", i + 1);
		x = scanf("%d", &d);
		if (x == EOF)
			return i;
		if (d < -999 || d > 999) {
			printf("-999〜999で");
			i--;
		} else {
			*(p + i) = d;
		}
	}
	return i;
}
/*****************************/
void mysort1(int n, int *data) {
	int i, j, tmp, *p;
	p = data;
	for (i = 0; i < n - 1; i++) {
		for (j = i + 1; j < n; j++) {
			if (*(p + i) > *(p + j)) {
				tmp = *(p + i);
				*(p + i) = *(p + j);
				*(p + j) = tmp;
			}
		}
	}
}
/*****************************/
void mysort2(int n, int *data) {
	int i, j, tmp, *p;
	p = data;
	for (i = 0; i < n - 1; i++) {
		for (j = i + 1; j < n; j++) {
			if (*(p + i) < *(p + j)) {
				tmp = *(p + i);
				*(p + i) = *(p + j);
				*(p + j) = tmp;
			}
		}
	}
}
/*****************************/
void output(int n, int *data) {
	int l, i;
	for (;;) {
		printf("1行に出力するデータの個数(5〜10)を入力してください。>");
		scanf("%d", &l);
		printf("%d個で1行", l);
		if (l > 10 || l < 5) {
			printf("エラー\n");
		} else {
			break;
		}
	}
	for (i = 0; i < n; i++) {
		printf("%4d ", *(data + i));
		if ((i + 1) % l == 0) {
			printf("\n");
		}
	}
	printf("\n");
}

「アルゴリズム」のキホン (イチバンやさしい理工系)

「アルゴリズム」のキホン (イチバンやさしい理工系)