C语言程序设计精髓第九周编程题
练兵区
1.二分法求根
题目内容:
用二分法求下面的一元三次方程在区间[-10, 10]上误差不大于的根。
用二分法求方程的根的基本原理是:若函数有实根,则函数曲线应当在根x*这一点上与x轴有一个交点,并且由于函数是单调的,在根附近的左右区间内,函数值的符号应当相反。利用这一特点,可以通过不断将求根区间二分的方法,每次将求根区间缩小为原来的一半,在新的折半后的区间内继续搜索方程的根,对根所在区间继续二分,直到求出方程的根为止。
该方法的关键在于要解决如下两个问题:
1)如何对区间进行二分,并在二分后的左右两个区间中确定下一次求根搜索的区间?
假设区间端点为x1和x2,则通过计算区间的中点x0,即可将区间[x1, x2]二分为[x1, x0]和[x0, x2]。这时,为了确定下一次求根搜索的区间,必须判断方程的根在哪一个区间内,由上图可知方程的根所在区间的两个端点处的函数值的符号一定是相反的。也就是说,如果f(x0)与f(x1)是异号的,则根一定在左区间[x1, x0]内,否则根一定在右区间[x0, x2]内。
2)如何终止这个搜索过程?即如何确定找到了方程的根?
对根所在区间继续二分,直到,即|f(x0)|≈0时,则认为x0是逼近函数f(x)的根。
程序中所有变量的数据类型均为float。
输入格式: “%f,%f”
输出格式: “x=%6.2f\n”
输入样例:
0,4
输出样例:
x=__1.32
注意:为避免出现格式错误,请直接拷贝粘贴上面给出的输入、输出提示信息和格式控制字符串!
(输出样例中下划线“_”代表空格,本例中数字1的前面有两个空格)
# include<stdio.h>
#include<math.h>
float Fun(float x)
{
return x * x * x - x -1;
}
int main()
{
float high, low, mid;
scanf("%f,%f", &low, &high);
mid = (low + high)/2;
while(fabs(Fun(mid))>=1E-6)
{
if(Fun(mid)*Fun(high)<0)
low = mid;
else
high = mid;
mid = (low + high)/2;
}
printf( "x=%6.2f\n", mid);
return 0;
}
2.矩阵转置
题目内容:
某二维数组存放的数据构成一个nn的方阵,其中n<=5。写程序,从键盘输入n的值(n<=5),该nn矩阵中各元素的值按下面的公式计算:
a[i][j] = i * n + j + 1
其中,a[i][j]表示第i行第j列的元素。要求分别输出该矩阵和它的转置矩阵。
注意:定义数字大小N时,请用
#define N 10
输入格式: “%d”
输出提示:“The original matrix is:\n”
输出提示:“The changed matrix is:\n”
输出格式: 矩阵的列与列之间为%3d,行与行之间为\n
输入样例1:
5↙
输出样例1:
The_original_matrix_is:
__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
The_changed_matrix_is:
__1__6_11_16_21
__2__7_12_17_22
__3__8_13_18_23
__4__9_14_18_24
__5_10_15_20_25
(输出样例中下划线“_”代表空格)
输入样例2:
4↙
输出样例2:
The original matrix is:
__1__2__3__4
__5__6__7__8
__9_10_11_12
_13_14_15_16
The changed matrix is:
__1__5__9_13
__2__6_10_14
__3__7_11_15
__4__8_12_16
注意:为避免出现格式错误,请直接拷贝粘贴上面给出的输入、输出提示信息和格式控制字符串!
(输出样例中下划线“_”代表空格)
# include<stdio.h>
#include<math.h>
#define N 10
int main()
{
int i, j, n,a[N][N];
scanf("%d", &n);
printf("The original matrix is:\n");
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
a[i][j]= i*n+j+1;
printf("%3d", a[i][j]);
}
printf("\n");
}
printf("The changed matrix is:\n");
for(j=0;j<n;j++)
{
for(i=0;i<n;i++)
{
printf("%3d", a[i][j]);
}
printf("\n");
}
return 0;
}
3. 程序改错
题目内容:
下面程序的功能是从键盘任意输入n个数,然后找出其中的最大数与最小数,并将其位置对换。目前程序中存在错误,请修改正确。并按照给出的程序运行结果示例检查修改后的程序。
程序运行结果示例1:
Input n(n<=10):
5↙
Input 5 Numbers:
12 4 6 7 0↙
After MaxMinExchange:
0 4 6 7 12
程序运行结果示例2:
Input n(n<=10):
6↙
Input 6 Numbers:
7 -3 2 0 56 18↙
After MaxMinExchange:
7 56 2 0 -3 18
#include <stdio.h>
#define ARR_SIZE 10
int main()
{
int a[ARR_SIZE], i, n;
printf("Input n(n<=10):\n");
scanf("%d", &n);
printf("Input %d Numbers:\n", n);
for (i=0; i<n; i++)
{
scanf("%d", &a[i]);
}
MaxMinExchang(a, n);
printf("After MaxMinExchange:\n");
for (i=0; i<n; i++)
{
printf("%d ", a[i]);
}
printf("\n");
return 0;
}
void MaxMinExchang(int *a, int n)
{
int maxValue = a[0], minValue = a[0], maxPos, minPos;
int i, temp;
for (i=0; i<n; i++)
{
if (a[i] > maxValue)
{
maxValue = a[i];
maxPos = i;
}
if (a[i] < minValue)
{
minValue = a[i];
minPos = i;
}
}
temp = a[maxPos];
a[maxPos] = a[minPos];
a[minPos] = temp;
修改后:
#include <stdio.h>
#define N 10
void MaxMinExchang(int *a, int n);
int main()
{
int a[N], i, n;
printf("Input n(n<=10):\n");
scanf("%d", &n);
printf("Input %d Numbers:\n", n);
for (i=0; i<n; i++)
{
scanf("%d", &a[i]);
}
MaxMinExchang(a, n);
printf("After MaxMinExchange:\n");
for (i=0; i<n; i++)
{
printf("%d ", a[i]);
}<