第二十课 查找的艺术 【项目1-4】

第二十课 查找的艺术



项目一【有几个】
请编程序,输入若干个正数(不超过100个,以0结束),保存在数组中。再输入一个正数n,输出n在前面出现过多少次?

代码:
#include<stdio.h>
#define SIZE 100
int main()
{
    int num,i,k=0,l=0;
    int a[SIZE];
    printf("输入一些数字,以0结束\n");
    for(i=0;i<SIZE;i++)
    {
        scanf("%d",&a[i]);
        if(a[i]==0)
            break;
        k++;
    }
    printf("请输入要查找的数字:");
    scanf("%d",&num);
    for(i=0;i<k;i++)
    {
        if(a[i]==num)
            l++;
    }
    printf("\n%d共出现了%d次\n",num,l);
    return 0;
}
运行结果:
第二十课 查找的艺术 【项目1-4】_第1张图片





项目二【二分法解方程】

二分法是在计算机科学中很重要的一种方法,用于查找产生二分查找算法,还可以用在很多场合。
  可以用二分法解方程。
  对于区间[a,b]上连续不断且f(a)·f(b)<0的函数y=f(x),通过不断地把函数f(x)的零点所在的区间一分为二,使区间的两个端点逐步逼近零点,进而得到零点近似值的方法叫二分法。
  假设要求方程f(x)=0的解,给定精确度ξ。其算法是:

[plain]  view plain  copy
 print ?
  1. 1 确定区间[a,b],验证f(a)·f(b)<0  
  2. 2 求区间(a,b)的中点c  
  3. 3 判断  
  4. (1) 若f(a)·f(c)<0,则令b=c;  
  5. (2) 若f(c)·f(b)<0,则令a=c.  
  6. 4 判断f(c)是否达到精确度ξ:即若┃f(c)┃<ξ,则x=c就是使f(x)接近零点的近似值,否则重复2-4.  
  请按照上面的算法,编程序求解方程f(x)=2x^3-5x^2+3x-6=0,要求精确到0.00001

代码:
#include<stdio.h>
double f(double);
int main()
{
    double a,b,c;
    do
    {
        printf("请输入范围(x x):");
        scanf("%lf %lf",&a,&b);
    }
    while(f(a)*f(b)>=0);
    do
    {
        c=(a+b)/2;
        if(f(a)*f(c)<0)
            b=c;
        else
            a=c;
    }
    while((f(c)>1e-5)||(f(c)<-1e-5));
    printf("\n解为:%lf\n",c);
    return 0;
}
double f(double x)
{
    return (3*x*x*x-5*x*x+3*x-6);
}
运行结果:





项目三【有序数组中插入数据】
定义好一个有10个元素的数组,先输入9个呈升序的数作为前9个元素,再输入一个数,要求按原来排序的规律将它插入数组中。
例如,9个呈升序的数为1 7 8 17 23 24 59 62 101,需要插入的数字为50,输出的序列则为1 7 8 17 23 24 50 59 62 101。

代码:
#include<stdio.h>
#define N 10
int main()
{
    int a[10]={11,22,33,44,55,66,77,88,99};
    int i,j,num,t;
    for(i=0;i<N-1;i++)
        printf("%d ",a[i]);
    printf("\n输入数字:");
    scanf("%d",&num);
    a[9]=num;
    for(j=0;j<N-1;j++)
        for(i=0;i<N-j-1;i++)
        {
            if(a[i]>a[i+1])
            {
                t=a[i];
                a[i]=a[i+1];
                a[i+1]=t;
            }
        }
    for(i=0;i<N;i++)
        printf("%d ",a[i]);
        printf("\n");
    return 0;
}
运行结果:
第二十课 查找的艺术 【项目1-4】_第2张图片





项目四【工资的排序】
从文件 salary.txt 中读入工人的工资(不超过500人),全部增加20%(好事),然后对工资数据进行排序,将排序后的结果保存到文件ordered_salary.txt中。
做完打开文件看看结果,玩这么多数据于股掌之间,相信你会有成就感的。
代码:
#include<stdio.h>
#include<stdlib.h>
#define N 500
int main()
{
    FILE *p;
    double a[N];
    int i,j,n=0;
    double t;
    p=fopen("salary.txt","r");
    if(p==NULL)
    {
        printf("file cannot open!\n");
        exit(0);
    }
    for(i=0;i<N;i++)
    {
        fscanf(p,"%lf",&a[i]);
        if(a[i]==EOF)
            break;
        a[i]=a[i]*1.2;
        n++;
    }
    fclose(p);
    for(i=0;i<n-1;i++)
    {
        for(j=0;j<n-i-1;j++)
        {
            if(a[j]>a[j+1])
            {
                t=a[j];
                a[j]=a[j+1];
                a[j+1]=t;
            }
        }
    }
    p=fopen("ordered_salary.txt","w");
    if(p==NULL)
    {
        printf("file cannot open!\n");
        exit(0);
    }
    for(i=0;i<n;i++)
    {
        fprintf(p,"%.2lf\n",a[i]);
    }
    printf("over\n");
    fclose(p);
    return 0;
}

运行结果:
第二十课 查找的艺术 【项目1-4】_第3张图片








数组的冒泡排序法作用非常大,利于排序后再用二分法查找数据
数据杂乱的情况下可以用排序法从小到大或从大到小的重排数字或者排序字符字母。












你可能感兴趣的:(第二十课 查找的艺术 【项目1-4】)