C语言自定义函数学习笔记

其实是今天写的两个习题作业,学习到了几个知识,记录总结一下。

先提供题目:

其实这道题主要是需要了解一下牛顿迭代法使用的公式,其他的地方并没有什么难点:

根据这个公式和求解原理,我们需要找到一个逼近1的解。我们可以将f(x)和f '(x)利用自定义函数写出来,每次要调用的时候将更新的x传入这两个函数中,就可以得到新的对应的f(x)和f '(x)。

那么什么时候输出结果呢?按照牛顿迭代法,X(n-1)和X非常非常接近的时候,那么X(n-1)就是解。我们可以将每次的X(n-1)-X的结果判断一下是否比一个极小值还要小,如果是就代表为解,输出即可。

这里提一个要注意的点,我们在判断X(n-1)-X是否比一个极小值还要小的时候,要考虑到X(n-1)-X为负数的情况,如果为负数的话,虽然比极小值还要小,但是却没有意义。所以我们需要将X(n-1)-X的值变成绝对值。那么就可以使用fabs函数,即fabs(X(n-1)-X)。注意头文件:math.h

代码的讲解就差不多了,下面给出我写的代码:


#include<stdio.h>

double f(int a, int b, int c, int d, double x)
{
	return a * x * x * x + b * x * x + c * x + d;
}

double df(int a, int b, int c, int d, double x)
{
	return 3*a* x * x + 2*b * x + c;
}

double jisuan()
{
	int a, b, c, d;
	double x = 1.0;
	double xs;
	double min = 1e-6;
	scanf("%d%d%d%d", &a, &b, &c, &d);
	for (int i = 0; i < 100; i++)
	{
		xs = x - f(a, b, c, d, x) / df(a, b, c, d, x);
		if (fabs(xs - x) < min)
		{
			return xs;
		}
		x = xs;
	}

}

int main()
{
	double xx;
	xx=jisuan();
	printf("%.6lf", xx);
	return 0;
}


接下来是第2题:

其实这道题的思路还是非常简单的,一个题有三个流程,分别对应输入,排序,折半查找。

我在写这道题时,问题主要出在姓名的输入,不知道怎么定义一个存放姓名的变量。

然后学习之后,发现可以这样,char name[10][20],我们可以将每一个姓名看做一个一维数组,20就是给每个姓名所提供的空间,10就是10个姓名。在每次输入的时候,我们也可以直接用name[i],即只要行下标就可以,因为printf或者scanf函数等等会自动识别到"\0"。

然后第二个我用的是选择排序,在给职工号交换位置的时候,同时将对应位置上的姓名也交换位置即可。

折半查找还是挺简单的,如果大家不太懂,在博客上有很多特别详细的文章。

下面给出我写的代码:


#include<stdio.h>
#include<string.h>
void shuru(char name[10][20], int numb[])
{
	
	for (int i = 0; i < 10; i++)
	{
		printf("姓名:");
		scanf("%s", name[i]);
		printf("职工号:");
		scanf("%d", &numb[i]);
	}
	return;
}

void paixu(char name[10][20], int numb[])
{
	int flag = 0;
	int ex = 0;
	
	for (int i = 0; i < 10; i++)
	{
		flag = i;
		for (int j = i+1; j < 10; j++)
		{
			if (numb[j] < numb[i])
			{
				flag = j;
			}
		}
		if (flag != i)
		{
			ex = numb[flag];//交换职工号
			numb[flag] = numb[i];
			numb[i] = ex;

			char exs[20];
			strcpy(exs, name[flag]);//交换姓名
			strcpy(name[flag], name[i]);
			strcpy(name[i], exs);
		}

	}
	/*for (int i = 0; i < 10; i++)
	{
		printf("%s ", name[i]);
		printf("%d\n", numb[i]);
		
	}*/
}

void find(char name[10][20], int numb[])
{
	printf("输入要查找的员工的职工号:");
	int ids = 0;
	scanf("%d", &ids);
	int left = 0;
	int right = 9;
	int mid = 0;
	while (left <= right)
	{
		mid = (left + right) / 2;
		if (numb[mid] > ids)
		{
			right = mid - 1;
		}
		else if (numb[mid] < ids)
		{
			left = mid + 1;
		}
		else if (numb[mid] == ids)
		{
			printf("%s", name[mid]);
			break;
		}
	}
	
}
int main()
{
	int numb[10];
	char name[10][20];
	shuru(name,numb);
	paixu(name,numb);
	find(name, numb);
	return 0;
}

感谢阅读,欢迎给出建议和指导。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值