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

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

根据这个公式和求解原理,我们需要找到一个逼近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;
}
感谢阅读,欢迎给出建议和指导。
925

被折叠的 条评论
为什么被折叠?



