File: average.c

package info (click to toggle)
why 2.13-2
  • links: PTS, VCS
  • area: main
  • in suites: lenny
  • size: 12,608 kB
  • ctags: 16,817
  • sloc: ml: 102,672; java: 7,173; ansic: 4,439; makefile: 1,409; sh: 585
file content (52 lines) | stat: -rw-r--r-- 1,152 bytes parent folder | download | duplicates (4)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52

/*@ predicate is_min(int t[],int n,int min) {
  @	(\forall int i; 0 <= i < n => min <= t[i]) &&
  @	(\exists int i; 0 <= i < n && min == t[i]) 
  @ }
  @*/

/* analogue pour is_max */

/*@ requires n > 0 && \valid_range(t,0,n)
  @ ensures is_min(t,n,\result) 
  @*/
int min(int t[],int n) {
  int i;
  int tmp = t[0];  
  /*@ invariant 1 <= i <= n && is_min(t,i,tmp)
    @ variant n-i
    @*/
  for (i=1 ; i < n; i++) {
     if (t[i] < tmp) tmp = t[i];
  }
  return tmp;
}


/*@ logic int min(int t[],int n) reads t[..] */
/*@ logic int max(int t[],int n) reads t[..] */

/*@ axiom min_is_min:
  @    \forall int t[]; \forall int n; n > 0 => is_min(t,n,min(t,n))
  @*/

/*@ axiom is_min_is_min:
  @    \forall int t[]; \forall int n; n > 0 => \forall int m;
  @         is_min(t,n,m) => m == min(t,n)
  @*/

/*@ requires \valid_range(t,0,n) && n > 0
  @ ensures 
  @     min(t,n) <= \result 
  @*/
int average(int t[],int n) {
  int i;
  int sum = 0;  
  /*@ invariant 0 <= i <= n && i * min(t,i) <= sum
    @ variant n-i
    @*/
  for (i=0 ; i < n; i++) {
     sum += t[i];
  }
  return sum / n;
}