ForNext
Only Do What Only You Can Do
099. 構造体の動的配列 (realloc)
VBScript
JScript
Perl
PHP
Python
Ruby
PowerShell
Scala
F#
C
更新日 : 2010.10.08
#include <stdio.h> #include <string.h> #include <alloc.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; } } void set_student(gstudent* std, char name[], int height, float weight) { strcpy(std->name, name); std->height = height; std->weight = weight; } int main(int argc, char* argv[]) { int i; gstudent* data; data = (gstudent*)malloc(sizeof(gstudent) * 3); set_student(&data[0], "Sato", 178, 61.0); set_student(&data[1], "Sanaka", 175, 60.5); set_student(&data[2], "Takao", 173, 80.0); data = (gstudent*)realloc(data, sizeof(gstudent) * 5); set_student(&data[3], "Mike", 165, 72.0); set_student(&data[4], "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); free(data); return 0; }
R:\>lesson099\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
Objective-C
D
VB
VB.NET
Delphi
更新日 : 2010.09.24
program Project1; {$APPTYPE CONSOLE} uses SysUtils; const NINSU = 5; type TStudent = record name: array[0..19] of Char; height: Integer; weight: Real; end; 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 := 4; while (k >= 0) do begin j := -1; for i := 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 StrCopy(data.name, PChar(name)); data.height := height; data.weight := weight; end; procedure main(); var i:Integer; data: array of TStudent; begin GetMem(data, SizeOf(TStudent) * 3); set_student(data[0], 'Sato', 178, 61.0); set_student(data[1], 'Sanaka', 175, 60.5); set_student(data[2], 'Takao', 173, 80.0); ReallocMem(data, SizeOf(TStudent) * 5); set_student(data[3], 'Mike', 165, 72.0); set_student(data[4], 'Masaki', 179, 77.5); Writeln('ソート前:'); for i := 0 to 4 do Writeln(Format('%2d:%-8s%4d%6.1f', [i + 1, data[i].name, data[i].height, data[i].weight])); Writeln(''); (* 身長でソート *) sort(data, NINSU, compare_height); Writeln('身長でソート後:'); for i := 0 to 4 do Writeln(Format('%2d:%-8s%4d%6.1f', [i + 1, data[i].name, data[i].height, data[i].weight])); Writeln(''); (* 体重でソート *) sort(data, NINSU, compare_weight); Writeln('体重でソート後:'); for i := 0 to 4 do Writeln(Format('%2d:%-8s%4d%6.1f', [i + 1, data[i].name, data[i].height, data[i].weight])); FreeMem(data); end; begin main; end.
S:\>lesson099\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