Changes in src/examples/sum.c [097e2b0:6e7e2b36]
- File:
-
- 1 edited
-
src/examples/sum.c (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
-
src/examples/sum.c
r097e2b0 r6e7e2b36 7 7 // sum.c -- 8 8 // 9 // Author : Peter A. Buhr9 // Author : Richard C. Bilson 10 10 // Created On : Wed May 27 17:56:53 2015 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Mon Sep 28 15:09:55 201513 // Update Count : 1 1812 // Last Modified On : Mon Jun 1 20:46:35 2015 13 // Update Count : 18 14 14 // 15 15 16 16 extern "C" { 17 int printf( c har *, ... );17 int printf( const char *, ... ); 18 18 } 19 #include "fstream.h"20 19 21 20 context sumable( type T ) { 22 21 const T 0; 23 22 T ?+?( T, T ); 23 T ?++( T * ); 24 24 T ?+=?( T *, T ); 25 T ++?( T * );26 T ?++( T * );27 25 }; 28 26 29 27 forall( type T | sumable( T ) ) 30 T sum( unsigned int n, T a[] ) { 31 T total = 0; // instantiate T, select 0 32 for ( unsigned int i = 0; i < n; i += 1 ) 33 total += a[i]; // select + 28 T sum( int n, T a[] ) { 29 T total; // instantiate T, select 0 30 total = 0; 31 for ( int i = 0; i < n; i += 1 ) 32 total = total + a[i]; // select + 34 33 return total; 35 34 } … … 37 36 // Required to satisfy sumable as char does not have addition. 38 37 const char 0; 39 char ?+?( char op1, char op2 ) { return (int)op1 + op2; } // cast forces integer addition or recursion 40 char ++?( char *op ) { *op += 1; return *op; } 41 char ?++( char *op ) { char temp = *op; *op += 1; return temp; } 38 char ?+?( char op1, char op2 ) { return op1 + op2; } 39 char ?++( char *op ) { return *op + 1; } 40 41 const double 0; // TEMPORARY, incorrect use of int 0 42 42 43 43 int main() { 44 44 const int low = 5, High = 15, size = High - low; 45 46 ofstream *sout = ofstream_stdout(); 47 48 char s = 0, a[size]; 49 char v = low; 50 for ( int i = 0; i < size; i += 1, v += 1 ) { 51 s += v; 52 a[i] = v; 53 } 54 sout << "sum from " << low << " to " << High << " is " 55 << (int)sum( size, a ) << ", check " << (int)s << "\n"; 56 57 int s = 0, a[size]; 45 int si = 0, ai[size]; 58 46 int v = low; 59 47 for ( int i = 0; i < size; i += 1, v += 1 ) { 60 s += (int)v;61 a [i] = (int)v;48 si += v; 49 ai[i] = v; 62 50 } 63 sout << "sum from " << low << " to " << High << " is "64 << sum( size, (int *)a ) << ", check " << (int)s << "\n";51 printf( "sum from %d to %d is %d, check %d\n", 52 low, High, sum( size, ai ), si ); 65 53 66 double s = 0.0, a[size]; 54 // char ci[size]; 55 // char c = sum( size, ci ); 56 // float fi[size]; 57 // float f = sum( size, fi ); 58 59 double sd = 0.0, ad[size]; 67 60 double v = low / 10.0; 68 61 for ( int i = 0; i < size; i += 1, v += 0.1 ) { 69 s += (double)v;70 a [i] = (double)v;62 sd += v; 63 ad[i] = v; 71 64 } 72 printf( "%g\n", sum( size, (double *)a ) ); 73 // sout << "sum from " << low / 10.0 << " to " << High / 10.0 << " is " 74 // << sum( size, (double *)a ) << ", check " << (double)s << "\n"; 75 76 float s = 0.0, a[size]; 77 float v = low / 10.0; 78 for ( int i = 0; i < size; i += 1, v += 0.1f ) { 79 s += (float)v; 80 a[i] = (float)v; 81 } 82 printf( "%g\n", sum( size, (float *)a ) ); 83 // sout << "sum from " << low / 10.0 << " to " << High / 10.0 << " is " 84 // << sum( size, (float *)a ) << ", check " << (float)s << "\n"; 65 printf( "sum from %g to %g is %g, check %g\n", 66 low / 10.0, High / 10.0, sum( size, ad ), sd ); 85 67 } 86 68 87 69 // Local Variables: // 88 70 // tab-width: 4 // 89 // compile-command: "cfa sum.c fstream.o iostream.o" //71 // compile-command: "cfa sum.c" // 90 72 // End: //
Note:
See TracChangeset
for help on using the changeset viewer.