您的位置:首页 > 编程语言 > C语言/C++

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

2017-07-26 22:09 701 查看
任务代码:

【项目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
=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 确定区间[a,b],验证f(a)·f(b)<0  
2 求区间(a,b)的中点c  
3 判断  
(1) 若f(a)·f(c)<0,则令b=c;  
(2) 若f(c)·f(b)<0,则令a=c.  
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
>array[n+1])
{
t=array[n+1];
array[n+1]=array
;
array
=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:





内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐