if(min!
=0)
{tmp=array[0];
array[0]=array[min];
array[min]=tmp;
}
sort(a+1,n-1);
}
}
3.Conj函数的功能是将两个字符串s和t连接起来,连接后的串存放在动态内存分配区,返回指向连接后的串的指针
char*conj(char*s,char*t)
{char*p,*q;
p=q=newchar[strlen(s)+strlen(t)+1];
while(*s)*(q++)=*(s++);
while(*t)
{*q=*t;
q++;t++;
}
*q=‘\0’;
returnp;
}
4.所谓的回文,就是正读和反读都一样的字符串,如”abcba”。
以下是判断一个字符串是否为回文的函数的实现,请填空。
boolf(char*s,intn)
{
if(n<=1)
{
____returntrue__________;
}
else
{
if(s[0]==s[n-1])
{
__return_f(s+1,n-2)________;
}
else
{
__returnfalse____________;
}
}
}
5.如下是数字旋转方阵的递归实现。
函数fill有三个参数:
填入数字的初值、起始位置、矩阵规模。
如要填写下列矩阵,可调用fill(1,0,6)。
请填空
1
20
19
18
17
16
2
21
32
31
30
15
3
22
33
36
29
14
4
23
34
35
28
13
5
24
25
26
27
12
6
7
8
9
10
11
voidfill(intnumber,intbegin,intsize)
{inti,row=begin,col=begin;
if(size==0)return;
if(size==1){p[begin][begin]=number;return;}
p[row][col]=number;++number;
for(i=0;i{++row;p[row][col]=number;++number;}
for(i=0;i{++col;p[row][col]=number;++number;}
for(i=0;i{--row;p[row][col]=number;++number;}
for(i=0;i{--col;p[row][col]=number;++number;}
fill(number,begin+1.size–2);
}
四.编程题
我们知道,计算机在进行所有的实数运算时都是有误差的。
因此,用计算机解题要考虑的因素往往比数学课上的更为复杂。
例如求解一个一元二次方程(ax^2+bx+c=0),数学书上给出了非常明确的答案x=(-b+/-SQRT(b^2–4ac))/2a。
但如果我们用计算机来编写这样一个程序时,我们发现尽管我们的程序准确无误的实现了上面的算法,但当我们把求出的解代回方程时,我们发现结果并不等于零(甚至并不接近零)。
这就是计算误差造成的。
在这种情况下,我们可以通过迭代来逐步逼近方程的真解(使代回原方程的误差足够小,例如小于0.000001)。
编写一个求解一元二次方程根(ax^2+bx+c=0)的程序。
要求具备以下功能:
1.要求用户输入(a,b,c)三个实数。
2.根据不同的输入数据,确定不同的求解方法;同时对输入数据的合法性进行检验,并进行适当的错误处理。
(要求检查所有不同的非法可能)
3.验证你的结论是否正确,如果正确,输出你的结果;否则
4.按下面的方法进行迭代,直到你发现问题的真解
a)如果x是方程真根x*的一个近似值,则有
b)x*=x+∆x
c)令误差y=ax*^2+bx*+c
=a(x+∆x)^2+b(x+∆x)+c
=(ax^2+bx+c)+(2ax+b)∆x+∆x^2
略去高次项∆x^2后,令y=ax*^2+bx*+c=0则近似有
∆x=-(ax^2+bx+c)/(2ax+b)
d)将x=x+∆x再代回计算误差y,如果y<0.000001,x是真解,否则继续迭代。
要求:
1.对应下面给出的部分程序,实现一元二次方程的求解函数SolveQuadratic()和逼近真根的迭代函数Approach2RealRoot()。
你不可以修改下面给定的说明和程序逻辑。
答案:
2.设计一个函数,功能是合并二个升序链表为一个升序链表:
structlk
{intdata;
structlk*next;
}
structlk*merge(a,b)
structlk*a,*b;
{structlk*c,*p;
if(a->datadata){c=a;a=a->next;}