ForNext
Only Do What Only You Can Do
097. 5人の学生を 身長・体重で ソート (関数ポインタ)
VBScript
JScript
Perl
更新日 : 2010.10.18
$NINSU = 5; sub swap { my ($x, $y) = @_; $tmp = $$x; $$x = $$y; $$y = $tmp; } sub compare_height { my ($x, $y) = @_; return 1 if ($$x->{"height"} > $$y->{"height"}); return -1 if ($$x->{"height"} < $$y->{"height"}); return 0; } sub compare_weight { my ($x, $y) = @_; return 1 if ($$x->{"weight"} > $$y->{"weight"}); return -1 if ($$x->{"weight"} < $$y->{"weight"}); return 0; } sub sort { my ($data, $n, $compare) = @_; $k = $$n - 1; while ($k >= 0) { $j = -1; foreach $i(1..$k) { if ($compare->(\$$data[$i - 1], \$$data[$i]) > 0) { $j = $i - 1; &swap(\$$data[$i], \$$data[$j]); } } $k = $j; } } @data = ( {name => "Sato", height => 178, weight => 61.0}, {name => "Sanaka", height => 175, weight => 60.5}, {name => "Takao", height => 173, weight => 80.0}, {name => "Mike", height => 165, weight => 72.0}, {name => "Masaki", height => 179, weight => 77.5} ); print "ソート前:\n"; for (0..$NINSU-1) { printf("%2d:%-8s%4d%6.1f\n", $_ + 1, $data[$_]{"name"}, $data[$_]{"height"}, $data[$_]{"weight"}); } print "\n"; &sort(\@data, \$NINSU, \&compare_height); print "身長でソート後:\n"; for (0..$NINSU-1) { printf("%2d:%-8s%4d%6.1f\n", $_ + 1, $data[$_]{"name"}, $data[$_]{"height"}, $data[$_]{"weight"}); } print "\n"; &sort(\@data, \$NINSU, \&compare_weight); print "体重でソート後:\n"; for (0..$NINSU-1) { printf("%2d:%-8s%4d%6.1f\n", $_ + 1, $data[$_]{"name"}, $data[$_]{"height"}, $data[$_]{"weight"}); }
L:\>perl lesson_12_097.pl メ[ト前: 1:Sato 178 61.0 2:Sanaka 175 60.5 3:Takao 173 80.0 4:Mike 165 72.0 5:Masaki 179 77.5 身長でメ[ト後: 1:Mike 165 72.0 2:Takao 173 80.0 3:Sanaka 175 60.5 4:Sato 178 61.0 5:Masaki 179 77.5 体重でメ[ト後: 1:Sanaka 175 60.5 2:Sato 178 61.0 3:Mike 165 72.0 4:Masaki 179 77.5 5:Takao 173 80.0
PHP
更新日 : 2010.11.03
<?php $NINSU = 5; function swap(&$x, &$y) { $tmp = $x; $x = $y; $y = $tmp; } function compare_height($x, $y) { if ($x["height"] > $y["height"]) return 1; if ($x["height"] < $y["height"]) return -1; return 0; } function compare_weight($x, $y) { if ($x["weight"] > $y["weight"]) return 1; if ($x["weight"] < $y["weight"]) return -1; return 0; } function sort1(&$data, $n, $compare) { $k = $n - 1; while ($k >= 0) { $j = -1; for ($i = 1; $i <= $k; $i++) { if ($compare($data[$i - 1], $data[$i]) > 0) { $j = $i - 1; swap($data[$i], $data[$j]); } } $k = $j; } } $data = array( array(name => "Sato", height => 178, weight => 61.0), array(name => "Sanaka", height => 175, weight => 60.5), array(name => "Takao", height => 173, weight => 80.0), array(name => "Mike", height => 165, weight => 72.0), array(name => "Masaki", height => 179, weight => 77.5) ); print "ソート前:\n"; for ($i = 0; $i < $NINSU; $i++) { printf("%2d:%-8s%4d%6.1f\n", $i + 1, $data[$i]["name"], $data[$i]["height"], $data[$i]["weight"]); } print "\n"; sort1($data, $NINSU, "compare_height"); print "身長でソート後:\n"; for ($i = 0; $i < $NINSU; $i++) { printf("%2d:%-8s%4d%6.1f\n", $i + 1, $data[$i]["name"], $data[$i]["height"], $data[$i]["weight"]); } print "\n"; sort1($data, $NINSU, "compare_weight"); print "体重でソート後:\n"; for ($i = 0; $i < $NINSU; $i++) { printf("%2d:%-8s%4d%6.1f\n", $i + 1, $data[$i]["name"], $data[$i]["height"], $data[$i]["weight"]); } ?>
L:\>php lesson_12_097.php ソート前: 1:Sato 178 61.0 2:Sanaka 175 60.5 3:Takao 173 80.0 4:Mike 165 72.0 5:Masaki 179 77.5 身長でソート後: 1:Mike 165 72.0 2:Takao 173 80.0 3:Sanaka 175 60.5 4:Sato 178 61.0 5:Masaki 179 77.5 体重でソート後: 1:Sanaka 175 60.5 2:Sato 178 61.0 3:Mike 165 72.0 4:Masaki 179 77.5 5:Takao 173 80.0
Python
更新日 : 2010.11.17
# coding: Shift_JIS NINSU = 5 def compare_height(x, y): if (x["height"] > y["height"]): return 1 if (x["height"] < y["height"]): return -1 return 0 def compare_weight(x, y): if (x["weight"] > y["weight"]): return 1 if (x["weight"] < y["weight"]): return -1 return 0 def sort(data, n, compare): k = n - 1 while (k >= 0): j = -1; for i in range(1, k + 1, 1): if (compare(data[i - 1], data[i]) > 0): j = i - 1 data[i], data[j] = data[j], data[i] k = j data = [ {"name":"Sato", "height":178, "weight":61.0}, {"name":"Sanaka", "height":175, "weight":60.5}, {"name":"Takao", "height":173, "weight":80.0}, {"name":"Mike", "height":165, "weight":72.0}, {"name":"Masaki", "height":179, "weight":77.5} ] print "ソート前:" for i in range(0, NINSU, 1): print "%2d:%-8s%4d%6.1f" % (i + 1, data[i]["name"], data[i]["height"], data[i]["weight"]) print sort(data, NINSU, compare_height) print "身長でソート後:" for i in range(0, NINSU, 1): print "%2d:%-8s%4d%6.1f" % (i + 1, data[i]["name"], data[i]["height"], data[i]["weight"]) print sort(data, NINSU, compare_weight) print "体重でソート後:" for i in range(0, NINSU, 1): print "%2d:%-8s%4d%6.1f" % (i + 1, data[i]["name"], data[i]["height"], data[i]["weight"])
N:\>python lesson_12_097.py ソート前: 1:Sato 178 61.0 2:Sanaka 175 60.5 3:Takao 173 80.0 4:Mike 165 72.0 5:Masaki 179 77.5 身長でソート後: 1:Mike 165 72.0 2:Takao 173 80.0 3:Sanaka 175 60.5 4:Sato 178 61.0 5:Masaki 179 77.5 体重でソート後: 1:Sanaka 175 60.5 2:Sato 178 61.0 3:Mike 165 72.0 4:Masaki 179 77.5 5:Takao 173 80.0
Ruby
更新日 : 2010.11.01
NINSU = 5 def compare_height(x, y) return 1 if (x["height"] > y["height"]) return -1 if (x["height"] < y["height"]) return 0 end def compare_weight(x, y) return 1 if (x["weight"] > y["weight"]) return -1 if (x["weight"] < y["weight"]) return 0 end def sort(data, n, compare) k = n - 1 while (k >= 0) j = -1 for i in 1..k if (compare.call(data[i - 1], data[i]) > 0) j = i - 1 data[i], data[j] = data[j], data[i] end end k = j end end data = [ {"name" => "Sato", "height" => 178, "weight" => 61.0}, {"name" => "Sanaka", "height" => 175, "weight" => 60.5}, {"name" => "Takao", "height" => 173, "weight" => 80.0}, {"name" => "Mike", "height" => 165, "weight" => 72.0}, {"name" => "Masaki", "height" => 179, "weight" => 77.5} ] puts "ソート前:" data.each_with_index do |d, i| printf("%2d:%-8s%4d%6.1f\n", i + 1, d["name"], d["height"], d["weight"]) end puts "" sort(data, NINSU, method(:compare_height)) puts "身長でソート後:" data.each_with_index do |d, i| printf("%2d:%-8s%4d%6.1f\n", i + 1, d["name"], d["height"], d["weight"]) end puts "" sort(data, NINSU, method(:compare_weight)) puts "体重でソート後:" data.each_with_index do |d, i| printf("%2d:%-8s%4d%6.1f\n", i + 1, d["name"], d["height"], d["weight"]) end
L:\>ruby l:\lesson_12_097.rb メ[ト前: 1:Sato 178 61.0 2:Sanaka 175 60.5 3:Takao 173 80.0 4:Mike 165 72.0 5:Masaki 179 77.5 身長でメ[ト後: 1:Mike 165 72.0 2:Takao 173 80.0 3:Sanaka 175 60.5 4:Sato 178 61.0 5:Masaki 179 77.5 体重でメ[ト後: 1:Sanaka 175 60.5 2:Sato 178 61.0 3:Mike 165 72.0 4:Masaki 179 77.5 5:Takao 173 80.0
PowerShell
Scala
F#
C
更新日 : 2010.10.08
#include <stdio.h> #include <string.h> #define NINSU 5 typedef struct { char name[20]; int height; float weight; } gstudent; typedef int (*compare)(gstudent*, gstudent*); int compare_height(gstudent* x, gstudent* y) { if (x->height > y->height) return 1; if (x->height < y->height) return -1; return 0; } int compare_weight(gstudent* x, gstudent* y) { if (x->weight > y->weight) return 1; if (x->weight < y->weight) return -1; return 0; } void swap(gstudent* x, gstudent* y) { gstudent tmp = *x; *x = *y; *y = tmp; } void sort(gstudent data[], int n, compare comp) { int k = n - 1; while (k >= 0) { int i, j; for (i = 1, j = -1; i <= k; i++) { if (comp(&data[i - 1], &data[i]) > 0) { j = i - 1; swap(&data[i], &data[j]); } } k = j; } } int main(int argc, char* argv[]) { int i; gstudent data[] = { "Sato", 178, 61.0, "Sanaka", 175, 60.5, "Takao", 173, 80.0, "Mike", 165, 72.0, "Masaki", 179, 77.5 }; puts("ソート前:"); for (i = 0; i < NINSU; i++) printf("%2d:%-8s%4d%6.1f\n", i + 1, data[i].name, data[i].height, data[i].weight); puts(""); /* 身長でソート */ sort(data, NINSU, &compare_height); puts("身長でソート後:"); for (i = 0; i < NINSU; i++) printf("%2d:%-8s%4d%6.1f\n", i + 1, data[i].name, data[i].height, data[i].weight); puts(""); /* 体重でソート */ sort(data, NINSU, &compare_weight); puts("体重でソート後:"); for (i = 0; i < NINSU; i++) printf("%2d:%-8s%4d%6.1f\n", i + 1, data[i].name, data[i].height, data[i].weight); return 0; }
R:\>lesson097\project1.exe ソート前: 1:Sato 178 61.0 2:Sanaka 175 60.5 3:Takao 173 80.0 4:Mike 165 72.0 5:Masaki 179 77.5 身長でソート後: 1:Mike 165 72.0 2:Takao 173 80.0 3:Sanaka 175 60.5 4:Sato 178 61.0 5:Masaki 179 77.5 体重でソート後: 1:Sanaka 175 60.5 2:Sato 178 61.0 3:Mike 165 72.0 4:Masaki 179 77.5 5:Takao 173 80.0
C++
C++Builder
VC++
C#
Java
更新日 : 2010.11.05
class Lesson097 { static final int NINSU = 5; public static void main(String[] args) { CStudent[] data = new CStudent[NINSU]; data[0] = new CStudent("Sato", 178, 61.0); data[1] = new CStudent("Sanaka", 175, 60.5); data[2] = new CStudent("Takao", 173, 80.0); data[3] = new CStudent("Mike", 165, 72.0); data[4] = new CStudent("Masaki", 179, 77.5); System.out.println("ソート前:"); for (int i = 0; i < NINSU; i++) System.out.printf("%2d:%-8s%4d%6.1f\n", i + 1, data[i].name, data[i].height, data[i].weight); System.out.println(""); sort(data, NINSU, new IStudentCompare(){public int compare(CStudent x, CStudent y) {if (x.height > y.height) return 1; if (x.height < y.height) return -1; return 0;}}); System.out.println("身長でソート後:"); for (int i = 0; i < NINSU; i++) System.out.printf("%2d:%-8s%4d%6.1f\n", i + 1, data[i].name, data[i].height, data[i].weight); System.out.println(""); sort(data, NINSU, new IStudentCompare(){public int compare(CStudent x, CStudent y) {if (x.weight > y.weight) return 1; if (x.weight < y.weight) return -1; return 0;}}); System.out.println("体重でソート後:"); for (int i = 0; i < NINSU; i++) System.out.printf("%2d:%-8s%4d%6.1f\n", i + 1, data[i].name, data[i].height, data[i].weight); } static void sort(CStudent data[], int n, IStudentCompare stdComp) { int k = n - 1; while (k >= 0) { int j = -1; for (int i = 1; i <= k; i++) { if (stdComp.compare(data[i - 1], data[i]) > 0) { j = i - 1; CStudent tmp = data[i]; data[i] = data[j]; data[j] = tmp; } } k = j; } } } class CStudent { public String name; public int height; public double weight; public CStudent(String name, int height, double weight) { this.name = name; this.height = height; this.weight = weight; } } interface IStudentCompare { int compare(CStudent x, CStudent y); }
L:\>java Lesson097 ソート前: 1:Sato 178 61.0 2:Sanaka 175 60.5 3:Takao 173 80.0 4:Mike 165 72.0 5:Masaki 179 77.5 身長でソート後: 1:Mike 165 72.0 2:Takao 173 80.0 3:Sanaka 175 60.5 4:Sato 178 61.0 5:Masaki 179 77.5 体重でソート後: 1:Sanaka 175 60.5 2:Sato 178 61.0 3:Mike 165 72.0 4:Masaki 179 77.5 5:Takao 173 80.0
Objective-C
D
VB
VB.NET
Delphi
更新日 : 2010.09.24
program Project1; {$APPTYPE CONSOLE} uses SysUtils; const NINSU = 5; type TStudent = record name: String; height: Integer; weight: Real; end; type TCompare = function (x:TStudent; y:TStudent):Integer; function compare_height(x:TStudent; y:TStudent):Integer; begin if (x.height > y.height) then result := 1 else if (x.height < y.height) then result := -1 else result := 0; end; function compare_weight(x:TStudent; y:TStudent):Integer; begin if (x.weight > y.weight) then result := 1 else if (x.weight < y.weight) then result := -1 else result := 0; end; procedure swap(var x:TStudent; var y:TStudent); var tmp: TStudent; begin tmp := x; x := y; y := tmp; end; procedure sort(var data:array of TStudent; n:Integer; Comp:TCompare); var i, j, k: Integer; begin k := High(data); while (k >= 0) do begin j := -1; for i := Low(data) + 1 to k do begin if (Comp(data[i - 1], data[i]) > 0) then begin j := i - 1; swap(data[i], data[j]); end; end; k := j; end; end; procedure set_student(var data:TStudent; name:String; height:Integer; weight:Real); begin data.name := name; data.height := height; data.weight := weight; end; procedure main(); var i:Integer; data: array[1..5] of TStudent; begin set_student(data[1], 'Sato', 178, 61.0); set_student(data[2], 'Sanaka', 175, 60.5); set_student(data[3], 'Takao', 173, 80.0); set_student(data[4], 'Mike', 165, 72.0); set_student(data[5], 'Masaki', 179, 77.5); Writeln('ソート前:'); for i := 1 to NINSU do Writeln(Format('%2d:%-8s%4d%6.1f', [i, data[i].name, data[i].height, data[i].weight])); Writeln(''); (* 身長でソート *) sort(data, NINSU, compare_height); Writeln('身長でソート後:'); for i := 1 to NINSU do Writeln(Format('%2d:%-8s%4d%6.1f', [i, data[i].name, data[i].height, data[i].weight])); Writeln(''); (* 体重でソート *) sort(data, NINSU, compare_weight); Writeln('体重でソート後:'); for i := 1 to NINSU do Writeln(Format('%2d:%-8s%4d%6.1f', [i, data[i].name, data[i].height, data[i].weight])); end; begin main; end.
S:\>lesson097\project1.exe ソート前: 1:Sato 178 61.0 2:Sanaka 175 60.5 3:Takao 173 80.0 4:Mike 165 72.0 5:Masaki 179 77.5 身長でソート後: 1:Mike 165 72.0 2:Takao 173 80.0 3:Sanaka 175 60.5 4:Sato 178 61.0 5:Masaki 179 77.5 体重でソート後: 1:Sanaka 175 60.5 2:Sato 178 61.0 3:Mike 165 72.0 4:Masaki 179 77.5 5:Takao 173 80.0