这次作业主要是以流程图为主,我没怎么用过流程图= =所以画的不好。。

第一题是要求实现分段函数,画出的流程图如下所示:

http://7xibui.com1.z0.glb.clouddn.com/2015/03/1_1.png

代码如下:

/*************************************************************************
    > File Name: 1_1.c
    > Author: Netcan
    > Mail: 1469709759@qq.com 
    > Created Time: 2015/3/14 13:05:07
 ************************************************************************/

#include<stdio.h>

int main()
{
    double x;
    while(1) {
        printf("请输入x(Ctrl+C退出): "); 
        scanf("%lf", &x);
        printf("y=");
        if(x>0)
            puts("1");
        else if(0==x)
            puts("0");
        else
            puts("-1");
    }
    return 0;
}

运行结果:

F:\workspace\Programming\c\homework>1_1.exe
请输入x(Ctrl+C退出): 10
y=1
请输入x(Ctrl+C退出): 0
y=0
请输入x(Ctrl+C退出): -10.2
y=-1

第二题是利用欧几里得求最大公约数,我画的流程图如下:
http://7xibui.com1.z0.glb.clouddn.com/2015/03/1_2.png

代码如下:

/*************************************************************************
    > File Name: 1_2.c
    > Author: Netcan
    > Mail: 1469709759@qq.com 
    > Created Time: 2015/3/14 13:28:34
 ************************************************************************/

#include<stdio.h>

int main()
{
    int a, b;
    printf("输入a, b,用空格隔开两个数(按Ctrl+C退出): ");
    while(scanf("%d%d", &a, &b) ==2 ) {
        printf("%d和%d的最大公约数: ", a, b);
        if(a < b) {
            int t = a;
            a = b;
            b = t;
        }
        int c;
        while(c=a%b) {
            a = b;
            b = c;
        }
        printf("%d\n", b);
        printf("输入a, b,用空格隔开两个数(按Ctrl+C退出): ");
    }
    return 0;
}

运行结果:

F:\workspace\Programming\c\homework>1_2.exe
输入a, b,用空格隔开两个数(按Ctrl+C退出): 15 25
15和25的最大公约数: 5
输入a, b,用空格隔开两个数(按Ctrl+C退出): 12 27
12和27的最大公约数: 3

第三题是找出现实生活中可以用算法描述的一件事,这个我用排序做例子吧,比如归并排序。

假设有两组数据有序(升序),比如13679,02458,那么可以归并成一组升序数列,即0123456789,将这个思想用到普通无序数列中,例如1549326780(这个数据是随便举的),可以先分两半,(15493)(26780),这两组数据都是无序的,不能合并,那么继续分。(15)(49)(32)(67)(80),可以发现每组数据有些是无序的,不如(32),那么继续分割,分成一个数为一组,(1)(5)(4)(9)(3)(2)(6)(7)(8)(0),在两两(升序)合并,(15)(49)(23)(67)(08),在两两(升序)合并,(1459)(2367)(08),两两(升序)合并,(12345679)(08),继续升序合并,(0123456789)就是最后的结果了。

流程图就不画了,没必要。

上函数片段:

void Merge_Array(int *n,int *tmp,int first,int mid,int last) 
{
/* 归并数组
 * 将两个有序数组合成为一个有序数组
 *
 */
    int i = first, j = mid+1, k=0;
    while(i <= mid && j <= last)
        if(n[i] <= n[j])
            tmp[k++] = n[i++];
        else
            tmp[k++] = n[j++];
    while(i <= mid)
        tmp[k++] = n[i++];
    while(j <= last)
        tmp[k++] = n[j++];
    memcpy(n+first,tmp,(k)*sizeof(int));  // 将归并后的数组拷贝到n中
}

运行结果:

Merge_Sort:
2   5   6  17  23  23  28  28  29  42  42  53  58  61  63  70  71  76  76  79  80  83  88  89 100