2014年4月5日土曜日

開発環境

Head First C ―頭とからだで覚えるCの基本(David Griffiths (著)、Dawn Griffiths (著) 中田 秀基(監訳)(翻訳)、木下 哲也 (翻訳)、オライリージャパン)の7章(高度な関数)、長いエクササイズ(p.328)を解いてみる。

その他参考書籍

長いエクササイズ(p.328)

コード(BBEdit, Emacs)

sample328.c

#include <stdio.h>
#include <string.h>
#include <stdlib.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;
  int height;
} rectangle;

int compare_areas(const void* a, const void* b)
{
  rectangle* rectangle_a = (rectangle*)a;
  rectangle* rectangle_b = (rectangle*)b;

  return rectangle_a->width * rectangle_a->height -
    rectangle_b->width * rectangle_b->height;
}

int compare_areas_desc(const void* a, const void* b)
{
  return compare_areas(b, a);
}

int compare_names(const void* a, const void* b)
{
  char* name_a = *(char**)a;
  char* name_b = *(char**)b;

  return strcmp(name_a, name_b);
}

int compare_names_desc(const void* a, const void* b)
{
  return compare_names(b, a);
}

void p_rectangle(rectangle r)
{
  printf("長方形 幅:%d 高さ:%d 面積:%d\n",
         r.width, r.height, r.width * r.height);
}

int main(int argc, char *argv[])
{
  int scores[] = {543, 323, 32, 554, 11, 3, 112};
  rectangle rectangles[] = {{9, 10}, {1, 2}, {7, 8}, {3, 4}, {5, 6}};
  char *names[] = {"c", "C", "scheme", "Scheme", "Abc", "Def"};
  int i;

  puts("点数一覧");
  for (i = 0; i < 7; ++i)
    printf("%d ", scores[i]);
  puts("\n降順");
  qsort(scores, 7, sizeof(int), compare_scores_desc);
  for (i = 0; i < 7; ++i)
    printf("%d ", scores[i]);

  puts("\n\n長方形一覧");
  for (i = 0; i < 5; ++i)
    p_rectangle(rectangles[i]);
  puts("面積の昇順");
  qsort(rectangles, 5, sizeof(rectangle), compare_areas);
  for (i = 0; i < 5; ++i)
    p_rectangle(rectangles[i]);
  puts("面積の降順");
  qsort(rectangles, 5, sizeof(rectangle), compare_areas_desc);
  for (i = 0; i < 5; ++i)
    p_rectangle(rectangles[i]);

  puts("\n名前一覧");
  for (i = 0; i < 6; ++i)
    printf("%s ", names[i]);
  puts("\n大文字小文字を区別したアルファベット順");
  qsort(names, 6, sizeof(char*), compare_names);
  for (i = 0; i < 6; ++i)
    printf("%s ", names[i]);
  puts("\n逆順");
  qsort(names, 6, sizeof(char*), compare_names_desc);
  for (i = 0; i < 6; ++i)
    printf("%s ", names[i]);
  puts("");
  
  return (0);
}

Makefile

all: sample328

sample328: sample328.c
 cc -g -o sample328 sample328.c

入出力結果(Terminal)

$ make && ./sample328
cc -g -o sample328 sample328.c
点数一覧
543 323 32 554 11 3 112 
降順
554 543 323 112 32 11 3 

長方形一覧
長方形 幅:9 高さ:10 面積:90
長方形 幅:1 高さ:2 面積:2
長方形 幅:7 高さ:8 面積:56
長方形 幅:3 高さ:4 面積:12
長方形 幅:5 高さ:6 面積:30
面積の昇順
長方形 幅:1 高さ:2 面積:2
長方形 幅:3 高さ:4 面積:12
長方形 幅:5 高さ:6 面積:30
長方形 幅:7 高さ:8 面積:56
長方形 幅:9 高さ:10 面積:90
面積の降順
長方形 幅:9 高さ:10 面積:90
長方形 幅:7 高さ:8 面積:56
長方形 幅:5 高さ:6 面積:30
長方形 幅:3 高さ:4 面積:12
長方形 幅:1 高さ:2 面積:2

名前一覧
c C scheme Scheme Abc Def 
大文字小文字を区別したアルファベット順
Abc C Def Scheme c scheme 
逆順
scheme c Scheme Def C Abc 
$

0 コメント:

コメントを投稿