1.完成下列程序
*
*.*.
*..*..*..
*...*...*...*...
*....*....*....*....*....
*.....*.....*.....*.....*.....*.....
*......*......*......*......*......*......*......
*.......*.......*.......*.......*.......*.......*.......*.......
#define N 8
int main()
{
int i;
int j;
int k;
---------------------------------------------------------
| |
| |
| |
---------------------------------------------------------
return 0;
}
2.完成程序,实现对数组的降序排序
void sort();
int main()
{
int array[]={45,56,76,234,1,34,23,2,3}; //数字任//意给出
sort();
return 0;
}
void sort()
{
-----------------------------------------------------
| |
| |
| |
-----------------------------------------------------
}
3.费波那其数列,1,1,2,3,5……编写程序求第十项。可以用递归,也可以用其他方法,但要说明你选择的理由。
int Pheponatch(int);
int main()
{
printf("The 10th is %d",Pheponatch(10));
return 0;
}
int Pheponatch(int N)
{
--------------------------------
| |
| |
--------------------------------
}
4.下列程序运行时会崩溃,请找出错误并改正,并且说明原因。
#include <malloc.h>
typedef struct
{
TNode* left;
TNode* right;
int value;
} TNode;
TNode* root=NULL;
void append(int N);
int main()
{
append(63);
append(45);
append(32);
append(77);
append(96);
append(21);
append(17); // Again, 数字任意给出
}
void append(int N)
{
TNode* NewNode=(TNode *)malloc(sizeof(TNode));
NewNode->value=N;
if(root==NULL)
{
root=NewNode;
return;
}
else
{
TNode* temp;
temp=root;
while((N>=temp.value && temp.left!=NULL) || (N<temp. value && temp. right!=NULL))
{
while(N>=temp.value && temp.left!=NULL)
temp=temp.left;
while(N<temp.value && temp.right!=NULL)
temp=temp.right;
}
if(N>=temp.value)
temp.left=NewNode;
else
temp.right=NewNode;
return;
}
}
下面是我做的答案,如有问题,欢迎和我交流!
1.题目要求打印一个图形,可以看出此图形的规律是第i行(i=1,2,3,...8)由i个'*'后跟i-1个'.'的重复序列构成,重复的次数为i次.
程序代码如下:
#define N 8
int main()
{
int i; /* control the number of lines to draw */
int j; /* control the drawing of '*' each line */
int k; /* control the drawing of '.' following '*' each line */
for (i = 1; i <= N; i++)
{
for (j = 0; j < i; j++)
{
putchar('*');
for (k = 0; k < i; k++)
putchar('.');
}
putchar('\n');
}
return 0;
}
2.题目中的程序可能有些问题,我给sort()函数加上了2个参数,变为sort(int a[],int size),另外还添加了一个打印函数,以方便测试结果程序代码如下:
void sort(int a[], int size);
void print(int a[], int size);
int main()
{
int array[] = {45, 56, 76, 234, 1, 34, 23, 2, 3};
int size = sizeof(array) / sizeof(int);
printf("排序前:\n");
print(array, size);
sort(array, size);
printf("排序后:\n");
print(array, size);
return 0;
}
/* a simple select sort */
void sort(int a[], int size)
{
int i;
int j;
int max = 0; /* hold the index of max element*/
int tmp;
for (i = 0; i < size; i++)
{
max = i;
for (j = i; j < size; j++)
if (a[j] > a[max])
{
tmp = a[j];
a[j] = a[max];
a[max] = tmp;
}
}
}
void print(int a[], int size)
{
int i;
for (i = 0; i < size; i++)
printf("%d ", a[i]);
printf("\n");
}
3.分别给出了费波那其数列递归和非递归的解法, 递归程序需要的空间开销比较大,而且其中含有多次重复计算,所以效率上没非递归高,但是程序简洁
int Pheponatch(int);
int Pheponatch_recur(int);
int main()
{
int i;
for (i = 0; i < 10; i++)
printf("%d ", Pheponatch_recur(i));
printf("\n");
printf("The 10th is %d", Pheponatch_recur(10));
return 0;
}
/*
* an iteration version
* reduce some redundant computation comparied with
* recursive implementation
*/
int Pheponatch(int N)
{
int f0 = 1;
int f1 = 1;
int f2;
if (N < 2) return 1;
while ( --N )
{
f2 = f0 + f1;
f0 = f1;
f1 = f2;
}
return f2;
}
/*
* recursive version
* simple implementation ,but may lose some efficiency
* since it has some repeat computation
*/
int Pheponatch_recur(int N)
{
if (N < 2) return 1;
else
return Pheponatch_recur(N-2) + Pheponatch_recur(N-1);
}
4.此程序的功能是完成一个有序二叉树的建立,使得左子树结点的值小于根结点,右子树大于根结点. 题目程序中结构体定义的地方有误,在TNode名字出现之前,就在结构体内使用TNode,将导致编译错误.另外题目中append函数中的所有temp的点号操作符都应改成->,因为temp是个指针.至于题目中所说的程序在运行时崩溃出现在append函数中的对temp->left和temp->right操作时候, 因为每创建一个新结点的时候都没将left和right成员初始化为空指针,会导致append函数中的while循环访问到非法内存,从而导致程序崩溃. 为了方便测试,添加了函数print_tree打印树的结点内容,另外补充了一个函数free_tree来释放动态分配的内存.修改后的程序如下:
#include <stdlib.h>
#include <malloc.h>
struct tag_Node
{
struct tag_Node *left;
struct tag_Node *right;
int value;
};
typedef struct tag_Node TNode;
TNode *root = NULL;
void append(int N);
void free_tree(TNode *root);
void print_tree(TNode *root);
int main()
{
append(63);
append(45);
append(32);
append(77);
append(96);
append(21);
append(17); // Again, 数字任意给出
print_tree(root);
printf("\n");
free_tree(root);
printf("memory released!\n");
return 0;
}
void append(int N)
{
TNode* NewNode = (TNode *)malloc(sizeof(TNode));
if ( !NewNode )
{
printf("memory alloc failure!\n");
exit(1);
} /* 以下两行用来初始化每个新结点的left和right成员 如遗漏这两句,会导致程序运行时崩溃 */
NewNode->left = NULL;
NewNode->right = NULL;
NewNode->value=N;
if(root==NULL)
{
root = NewNode;
return;
}
else
{
TNode* temp;
temp=root;
while((N >= temp->value && temp->left != NULL) ||
(N < temp->value && temp->right != NULL))
{
while(N >= temp->value && temp->left != NULL)
temp = temp->left;
while(N < temp->value && temp->right != NULL)
temp = temp->right;
}
if(N >= temp->value)
temp->left =NewNode;
else
temp->right = NewNode;
return;
}
}
void free_tree(TNode *root)
{
if ( !root->left && !root->right)
{
free(root);
return;
}
if (root->left)
free_tree(root->left);
else
free_tree(root->right);
}
void print_tree(TNode *root)
{
if ( !root->left && !root->right)
{
printf("%d ", root->value);
return ;
}
if (root->right)
print_tree(root->right);
printf("%d ", root->value);
if (root->left)
print_tree(root->left);
}

浙公网安备 33010602011771号