要求:
(1)给出程序设计的基本思想、原理和算法描述。
(2)源程序给出合理适当的注释。
(3)保存和打印出程序的运行结果,并结合程序进行分析。
(4)使用c的数据结构定义。
(5) 重新改写主程序并运行,打印出文件清单和运行结果
字符串:
1、字符串匹配的简单算法。
int zfpp( char s[ ], char p[ ], int n , int m)
{
int i , j , k , flag;
i=0; flag=0;
while (i<=n-m && flag= =0)
{
i++;j=i;k=1;
while ( k<=m && s[j-1]= =p[k-1])j++,k++;
if ( k= =m+1) flag=1;
}
i--;
if ( flag= =0) i=-1;
return i;
}
2、字符串匹配的KMP算法。
int qfkmp (char s[ ], char p[ ])
{
int i, j, n , m , flag , *flink ;
void qlink ( );
n=strlen (s); m=strlen (p);
flink=malloc(m*sizeof (int));/* 建立失败链接数组空间 */
qlink (p, m , flink );/* 调用构造失败链接数组的函数 */
i=1;j=1;flag=0;
while ( i<=m && flag= =0)
{
while ( j!=0 && p[j-1]!=s[i-1]) j=flink[j-1];
if (j= =m) flag=1;
else i++, j++;
}
i=i-m;
If ( flag= =0) i= -1;
free (flink);
return i;
}
递归:
1、有如下递归函数:
Void print ( int w)
{
int i;
if ( w != 0)
{
print ( w-1);
for ( i=1;i<=w;i++) printf (“%3d”,w);
printf ( “\n”);
}
}
调用语句print(4)的结果为多少?
2、对如下给定的各递归函数求解调用结果,并分析算法功能。
(1)void PrintRV( int N)
{
if (N>0)
{
printf ( N %10) ;
PrintRV( N/10);
}
}
调用语句PrintRV(12345)。
(2)void PC ( int M , int N, int *K)
{
if ( N= =0 ) *K=1;
else {
PC( M-1, N-1, K);
*K=*K*M / N ;
}
}
调用语句PC(10,4,&M) ; printf ( “%d”, M ) ;
(3)int SS ( int N)
{
if ( N= =0 )return100;
else return SS( N-1)+N*N;
}
调用语句printf( “%d”, SS (6 ))
(4)int ACM ( int M , int N )
{
if (M<0 || N<0 ) printf (“ error”);
else if ( M= =0) ACM=N+1;
else if (N= =0) return ACM (M-1,1) ;
else return ACM (M-1 , ACM ( M , N-1));
}
调用语句printf(“%d”,ACM (2,2)) ;