C语言:顺序,二分查找,冒泡排序实践项目

任务代码:

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


#include <stdio.h>
#define SIZE 100

int main()
{
    int n=0;
    double enter[SIZE],number;
    //输入数字
    printf("提示:请输入数字并且按0结束输入!\n");
    do
    {
        printf("请输入第%d个正数:",n+1);
        scanf("%lf",&number); //这里因为我们需要对输入的numebr 进行判断,所以不能直接将数字存入&enter[i]
       //判断结束
       if(number==0)
        break;
       //判断非负
       if(number<0)
        {
            printf("输入的数字必须是正数!\n");
            continue;
        }

        enter[n]=number;//赋值存入数组
        n++;
    }while(n<=100);

    //因为和数字顺序无关,所以只能采用顺序查找
    double key;
    int count=0;
    int i;
    printf("输入你想查找的数字:");
    scanf("%lf",&key);
    for(i=0;i<n;i++)
    {
      if(key==enter[i])
            count++;
    }

    printf("这个数字总共出现过:%d次",count);

    return 0;

}


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

算法:

  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>
#include <math.h>

double f(double);

int main()
{
  double a,b;
  printf("本函数求解f(x)=2x^3-5x^2+3x-6=0!\n");
  printf("请输入查找区间a,b的值:");
  scanf("%lf %lf",&a,&b);
  if (f(a)*f(b)>0)
  {
     printf("输入的权健必须使得函数值异号!\n");
     main();
  }
  printf("在[%.2f, %.2f]间,方程将有一个根\n",a, b);
//也可以用以下方法才判断
   /*do
      {
        printf("请输入一个范围x0 x1:");
        scanf("%lf %lf", &a, &b); //尝试输入a和b的值,即确定可能解所在的区间

      }while(f(a)*f(b)>=0); //要求这两点上的函数值异号,从而保证[a, b]之间有解
   */
  //二分法查找
  double low,high,mid;
  low=a;high=b;
  do
  {
   mid=(low+high)/2;
   if(f(mid)==0)
   {
       break;
   }
   else if(f(low)*f(mid)<0)//证明mid>在[0,b]
   {
     high=mid;
   }
   else if(f(high)*f(mid)<0)//证明mid在[a,0]
   {
     low=mid;
   }
  }while(fabs(f(mid))>1e-5);//当值无限接近于x轴的时候
  //输出结果
  printf("该方程的解是:x=%.5lf",mid);
  return 0;
}

double f(double x)
{
    double result;
    result=pow(2*x,3)-5*pow(x,2)+3*x-6;
    return result;
}


冒泡排序实践:
【项目4】

从文件salary.txt中读入工人的工资(不超过500人),全部增加20%(好事),然后对工资数据进行排序,将排序后的结果保存到文件ordered_salary.txt中。
做完打开文件看看结果,玩这么多数据于股掌之间,相信你会有成就感的。

#include <stdio.h>
#include <stdlib.h>

double f(double);

int main()
{
    //打开文件
    FILE *fpin,*fpout;
    int i=0,j;
    double array[500];//预留500个空间

    fpin=fopen("salary.txt","r");
    if(fpin==NULL)
    {
        printf("File open file!");
        exit(1);
    }



    //将文件中的工资取出来存入数组array[i]
    while(fscanf(fpin,"%lf",&array[i])!=EOF)
    {
      array[i]=array[i]*1.2; //工资增加
      i++;
    }
    fclose(fpin);

    //冒泡排序
    int m,n;
    double t;
    for(m=0;m<i-1;m++)//总共有i个数据,扫描i-1次
    {
        for(n=0;n<i-m-1;n++)//每次对比到arrar[i-m-1]项
        {
            if(array[n]>array[n+1])
                {
                    t=array[n+1];
                    array[n+1]=array[n];
                    array[n]=t;
                }
        }
    }

    //保存数据输出文件
    fpout=fopen("ordered_salary.txt","w");
    if(fpout==NULL)
    {
        printf("outputfile open fail!\n");
        exit(1);
    }
    
    for(j=0;j<i;j++)
    {
       fprintf(fpout,"%.3lf\n",array[j]);
    }
    printf("finish!byebye!\n");
    fclose(fpout);
    return 0;
}




执行情况:

项目1:



项目2:



项目4:


  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值