linux gcc makefile 简单例子

任务:

现在有一个文件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;
}

如何运行:

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值