任务:

现在有一个文件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),  写出:

  1. 写出Main.c 和各个子函数(主要是调用个子文件中的函数的流程)
  2. 写出Makefile
  3. 编译后,执行,贴出拷屏的结果。

 

注:以下所有文件均在同一个目录下,.h 文件就按 .c 文件中的去声明就OK

makefile

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

#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

#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

#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

#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

#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

#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;
}

如何运行:

linux gcc makefile 简单例子_c语言