任务:
现在有一个文件1.txt ,内容如下:
$ vi 1.txt
0.3
5
5.77
5.3
55
667
55
332
55.6
77.8
343.01
788
设计一个含 Makefile 文件的工程, 实现求最大数(文件max.c),最小数(文件min.c),算术平均数(文件m-mean.c),几何平均数(文件g-mean.c),方差(文件var.c), 写出:
- 写出Main.c 和各个子函数(主要是调用个子文件中的函数的流程)
- 写出Makefile
- 编译后,执行,贴出拷屏的结果。
注:以下所有文件均在同一个目录下,.h 文件就按 .c 文件中的去声明就OK
makefile
1 2 3 4 5 6 7 8 9 10 | CC = gcc # C语言对应gcc,C++为g++ CFLAGS = -Wall # 表示显示所有可能的警告 # 编译的顺序是从左到右的 即左边的文件依赖右边的文件 main:main.o var.o m_mean.o g_mean.o min.o max.o $(CC) -o main $^ -lm # 用-lm以使用数学库 %.o:%.c # 表示由.c文件生成同名的.o文件 $(CC) $(CFLAGS) -c $^ # $^表示所有依赖文件 clean: rm -rf main.o max.o min.o m_mean.o g_mean.o var.o |
main.c
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 | #include <stdio.h> #include <string.h> #include <stdlib.h> #include "max.h" #include "min.h" #include "m_mean.h" #include "g_mean.h" #include "var.h" int main() { char filename[] = "1.txt"; FILE *fp; char StrLine[10]; //max char numbers that can be read in each linew if((fp=fopen(filename,"r")) == NULL) //file not exists return -1; float arr[100]; int j=0; while(!feof(fp)) { fgets(StrLine,10,fp); //readline //strtok(StrLine,"\n"); StrLine[strlen(StrLine)-1]='\0'; //delete \n in the end arr[j]=(float)atof(StrLine); //change char to num //printf("%s ",StrLine); //print j++; } fclose(fp); //remenber to close int size=j-1; printf("read %d numbers in 1.txt\n",size); printf("they are:\n"); for(int i=0;i<size;i++) printf("%.2f ",arr[i]); printf("\n"); printf("max is %.2f \n",max(arr,size)); printf("min is %.2f \n",min(arr,size)); printf("m_mean is %.2f \n",m_mean(arr,size)); printf("g_mean is %.2f \n",g_mean(arr,size)); printf("var is %.2f \n",var(arr,size)); return 0; } |
max.c
1 2 3 4 5 6 7 8 9 10 | #include <stdio.h> float max(float arr[], int size) { float result=arr[0]; for(int i=0;i<size;i++) if(arr[i]>result) result=arr[i]; return result; } |
min.c
1 2 3 4 5 6 7 8 9 10 | #include <stdio.h> float min(float arr[], int size) { float result=arr[0]; for(int i=0;i<size;i++) if(arr[i]<result) result=arr[i]; return result; } |
g_mean.c
1 2 3 4 5 6 7 8 9 10 | #include <stdio.h> #include <math.h> float g_mean(float arr[],int size) { float mul=0; for(int i=0;i<size;i++) mul*=arr[i]; return size?pow(mul,1/size):-1; } |
m_mean.c
1 2 3 4 5 6 7 8 9 | #include <stdio.h> float m_mean(float arr[], int size) { float sum=0; for(int i=0;i<size;i++) sum+=arr[i]; return size?sum/size:-1; } |
var.c
1 2 3 4 5 6 7 8 9 10 11 12 | #include <stdio.h> #include "m_mean.h" float var(float arr[],int size) { float og_m = m_mean(arr,size); //m-mean of the original arr float new_arr[size]; for(int i=0;i<size;i++) new_arr[i] = arr[i] * arr[i]; float new_m = m_mean(new_arr,size); //m-mean of the new arr return new_m - og_m * og_m; } |
如何运行: