Head First C ―頭とからだで覚えるCの基本
(オライリージャパン)
David Griffiths (著) Dawn Griffiths (著)
中田 秀基(監訳)(翻訳) 木下 哲也 (翻訳)
開発環境
- OS X Yosemite - Apple (OS)
- Emacs (CUI)、BBEdit - Bare Bones Software, Inc. (GUI) (Text Editor)
- C (プログラミング言語)
- LLVM/Clang (コンパイラ, Xcode - Apple)
Head First C ―頭とからだで覚えるCの基本(David Griffiths (著)、Dawn Griffiths (著) 中田 秀基(監訳)(翻訳)、木下 哲也 (翻訳)、オライリージャパン)の7章(高度な関数: 最大限に活用する)、長いエクササイズ(p.328)を解いてみる。
その他参考書籍
- 21st Century C: C Tips from the New School
- プログラミング言語C 第2版 ANSI規格準拠(B.W. カーニハンD.M. リッチー(著)、石田 晴久(翻訳)、共立出版)
- プログラミング言語Cアンサー・ブック 第2版 (クロビス・L.トンド、スコット・E.ギンペル(著)、矢吹 道郎(翻訳))
- C実践プログラミング 第3版(Steve Oualline(著)、望月 康司 (監訳)(翻訳)、谷口 功(翻訳)、 オライリージャパン)
長いエクササイズ(p.328)
コード(BBEdit, Emacs)
sample328.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int compare_scores_desc(const void* score_a, const void* score_b) {
int a = *(int*)score_a;
int b = *(int*)score_b;
return b - a;
}
typedef struct {
int width, height;
} rectangle;
int compare_areas(const void* a, const void* b) {
rectangle *rec_a = (rectangle*)a;
rectangle *rec_b = (rectangle*)b;
int area_a = rec_a->width * rec_a->height;
int area_b = rec_b->width * rec_b->height;
return area_a - area_b;
}
int compare_names(const void* a, const void* b) {
char** names_a = (char**)a;
char** names_b = (char**)b;
return strcmp(*names_a, *names_b);
}
int compare_areas_desc(const void* a, const void* b) {
return compare_areas(b, a);
}
int compare_names_desc(const void* a, const void* b) {
return compare_names(b, a);
}
void rectangle_p(rectangle *r, int length) {
for (int i = 0; i < length; i++) {
int width = r[i].width;
int height = r[i].height;
printf("%i x %i = %i\n", width, height, width * height);
}
}
void names_p(char **names, int length) {
for (int i = 0; i < length; i++)
printf("%s\n", names[i]);
}
int main() {
int scores[] = {543, 323, 32, 554, 11, 3, 112};
qsort(scores, 7, sizeof(int), compare_scores_desc);
for (int i = 0; i < 7; i++)
printf("%i\n", scores[i]);
rectangle rectangles[] = {{1, 5}, {1, 1}, {1, 4}, {1, 2}, {1, 3}};
qsort(rectangles, 5, sizeof(rectangle), compare_areas);
rectangle_p(rectangles, 5);
qsort(rectangles, 5, sizeof(rectangle), compare_areas_desc);
rectangle_p(rectangles, 5);
char *names[] = {"Abc", "Def"};
qsort(names, 2, sizeof(char*), compare_names);
names_p(names, 2);
qsort(names, 2, sizeof(char*), compare_names_desc);
names_p(names, 2);
}
入出力結果(Terminal)
$ crun.sh sample328 ... 554 543 323 112 32 11 3 1 x 1 = 1 1 x 2 = 2 1 x 3 = 3 1 x 4 = 4 1 x 5 = 5 1 x 5 = 5 1 x 4 = 4 1 x 3 = 3 1 x 2 = 2 1 x 1 = 1 Abc Def Def Abc $
0 コメント:
コメントを投稿