---10.1--- #include #include int main(void) { char card[52]; char *suit[] = {"C", "D", "H", "S"}; char *pip[] = {"A", "2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K"}; int i, k, w; for (i = 0; i < 52; i++) card[i] = i; for (i = 51; i > 0; i--) { k = rand() % i; w = card[i]; card[i] = card[k]; card[k] = w; } for (i = 0; i < 52; i++) { printf("%s%s ", suit[card[i] / 13], pip[card[i] % 13]); if ((i + 1) % 13 == 0) printf("\n"); } return EXIT_SUCCESS; } ---10.2--- #include #include #include #include long fib_a(int n); int main(void) { int n; long f; time_t t0, t1; printf("0以上45以下の整数を入力して下さい:"); scanf("%d", &n); assert(0 <= n && n <=45) time(&t0); f = fib_a(n); time(&t1); printf("fib(%d) = %ldで,所要計算時間は%.0f秒です.\n", n, f, difftime(t1, t0)); return EXIT_SUCCESS; } long fib_a(int n) { return n < 2 ? 1 : fib_a(n - 1) + fib_a(n - 2); } ---10.3--- #include #include #include int isleap(int year); int main(void) { static char days[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; int i, y, m, d, wd; time_t t; struct tm *tp; time(&t); tp = localtime(&t); y = 1900 + tp->tm_year; m = tp->tm_mon; d = days[m]; wd = tp->tm_wday - (tp->tm_mday - 1) % 7; /* 当月の1日の曜日 */ if (wd < 0) wd += 7; if (m == 1 && isleap(y)) d++; printf("%14d年%2d月\n", y, m + 1); printf(" 日 月 火 水 木 金 土\n"); for (i = 0; i < wd; i++) printf(" "); for (i = 1; i <= d; i++) { printf("%4d", i); if ((i + wd) % 7 == 0) printf("\n"); } printf("\n"); return EXIT_SUCCESS; } int isleap(int year) { return (year % 400) || ((year % 100) && (year % 4 == 0)); } ---10.4--- #include #include #include #define SIZE 20 struct student { char name[11]; int point; }; int comp(const void *a, const void *b); void gen_str(char s[], int n); void display(struct student x[], int n); int main(void) { struct student group[SIZE], w; int i; for (i = 0; i < SIZE; i++) { gen_str(group[i].name, rand() % 5 + 6); group[i].point = rand() % 101; } printf("整列前:\n"); display(group, SIZE); qsort(group, SIZE, sizeof(struct student), &comp); printf("整列後:\n"); display(group, SIZE); return EXIT_SUCCESS; } int comp(const void *a, const void *b) { /* キャストとa, bの順序に注意 */ return ((struct student *)b)->point - ((struct student *)a)->point; } void display(struct student x[], int n) { int i; for (i = 0; i < n; i++) printf("%-15s%3d\n", x[i].name, x[i].point); } void gen_str(char s[], int n) { int i; for (i = 0; i < n; i++) s[i] = rand() % 26 + 'a'; s[i] = '\0'; } ---10.5--- #include #include #include void sort(int x[], int size); void display(int x[], int size); int comp(const void *a, const void *b); int ascend(void *base, size_t n, size_t size, int (*comp)(const void *, const void *)); int main() { int a[100]; int n, i; printf("1以上100以下の整数を入力して下さい:"); scanf("%d", &n); assert(1 <= n && n <= 100); for (i = 0; i < n; i++) a[i] = rand(); printf("整列前:\n"); display(a, n); if (ascend(a, n, sizeof(int), comp)) printf("整列しています.\n"); else printf("整列していません.\n"); sort(a, n); printf("\n整列後:\n"); display(a, n); if (ascend(a, n, sizeof(int), comp)) printf("整列しています.\n"); else printf("整列していません.\n"); return EXIT_SUCCESS; } int ascend(void *base, size_t n, size_t size, int (*comp)(const void *, const void *)) { int i; char *p; for (p = base, i = 1; i < n && comp(p, p + size) <= 0; i++, p += size) ; return i == n; } int comp(const void *a, const void *b) { return *(int *)a - *(int *)b; } void sort(int x[], int size) { int i, j, min, w; for (i = 0; i < size; i++) { min = i; for (j = i + 1; j < size; j++) if (x[j] < x[min]) min = j; w = x[i]; x[i] = x[min]; x[min] = w; } } void display(int x[], int size) { int i; for (i = 0; i < size; i++) { printf("%6d", x[i]); if ((i + 1) % 10 == 0) printf("\n"); } if (size % 10) printf("\n"); } ---10.6--- #include #include #include #include int maxval(int n, ...); int main(void) { int a[4]; int i, j; for (i = 0; i < 4; i++) { a[i] = rand(); printf("%d ", a[i]); } printf("\n"); printf("三つの中の最大値:%d\n", maxval(3, a[0], a[1], a[2])); printf("四つの中の最大値:%d\n", maxval(4, a[0], a[1], a[2], a[3])); return EXIT_SUCCESS; } int maxval(int n, ...) { va_list ap; int m, t; assert(n > 0); va_start(ap, n); m = va_arg(ap, int); while(--n) { t = va_arg(ap, int); if (t > m) m = t; } va_end(ap); return m; } ---10.7--- #include #include #include #include #include double maxval(char *s, ...); int main(void) { printf("二つの中の最大値:%f\n", maxval("ii", 5, 3)); printf("三つの中の最大値:%f\n", maxval("ldi", 5L, 7.0, 3)); return EXIT_SUCCESS; } double maxval(char *s, ...) { va_list ap; double m, t; char *p; assert(*s); p = s; va_start(ap, n); while (*p) { switch (*p) { case 'i': t = va_arg(ap, int); break; case 'l': t = va_arg(ap, long); break; case 'd': t = va_arg(ap, double); break; default: exit(EXIT_FAILURE); } if (p == s || t > m) m = t; p++; } va_end(ap); return m; } ---10.8--- #include #include #include #define new_assert(e, m) \ if (!(e)) {\ fprintf(stderr, "表明" #e "が成り立ちません.\n");\ fprintf(stderr, #m "\n");\ abort();\ } int main(void) { double a, b, c, s; printf("三つの実数を入力して下さい:"); scanf("%lf%lf%lf", &a, &b, &c); new_assert(a + b > c && c > fabs(a - b), 三角形になりません.); s = (a + b + c) / 2.0; printf("三角形の面積は%.2fです.\n", sqrt(s * (s - a) * (s - b) * (s - c))); return EXIT_SUCCESS; }