0
点赞
收藏
分享

微信扫一扫

基准报价计算程序(已知其它公司报价 真实案例)

这个程序是我多年前读大学时候写的一个程序,当时有一个浙江地区的公司需要一个报价计算程序,该公司可以通过一些方法知道其它公司的报价信息,

希望通过程序计算出该公司投标的基准报价。具体如下:

某公司收到若干报价,然后报价由低到高进行排序。设最低报价为F,最高报价为G。


n=0.2*(G-F)


设A,B,C,D,E五个等距区间并取:


A=[F,F+n)B=[F+n,F+2n) C=[F+2n,F+3n) D=[F+3n,F+4n) E=[F+4n,G)

所有的报价都按各自的大小,分别列入上面五个区间。各自区间内的最小报价为该区间的代表报价。如果某区间内没有报价则以小于该区间的且与

该区间相邻的区间内的最高报价代表该区间报价,如果该区间与与之相邻的较小区间内都没有报价则该区间不参加最后计算。

取各区间的代表值,求出其平均值做为评标基准报价。

#include "stdio.h"
main()
{ long double h[100]={0};
long double l[100]={0};
long double m[100]={0};
long double n[100]={0};
long double p[100]={0};
long double a1[100]={0};
long double ave;
long double v=5.0;
long double y;
long double b,c,d,e;
int j1=0,j2=0,j3=0,j4=0,j5=0;
long double z1=0.0,z2=0.0,z3=0.0,z4=0.0,z5=0.0;
long double t;
int w=0,x=0;
long double a[100]={0};
int i=0;
int j=0,k=0;
void fun(k,i,j,a);
void correct(a,k, i, j);
int m1;
while(1)
{ m1=0;
j1=0;j2=0;j3=0;j4=0;j5=0;
z1=0.0;z2=0.0;z3=0.0;z4=0.0;z5=0.0;
w=0;x=0;i=0;j=0;k=0;
v=5.0;
for(m1=0;m1<100;m1++) //每次计算时,将6个数组全部赋值为0
{
h[m1]=a1[m1];
l[m1]=a1[m1];
m[m1]=a1[m1];
n[m1]=a1[m1];
p[m1]=a1[m1];
a[m1]=a1[m1];
}



printf("********本程序为计算程序,当输入数值为0时结束输入********\n\n");
for(i=0;i<100;i++)
{
printf("***请输入第 %d 个数: \n",i+1);
scanf("%lf",&a[i]); //当输入为字符型时 错误,循环执行
if(a[i]==0)
{

printf("输入数据阶段结束................\n");
break;
}
}

printf("总共输入的个数为 : %d \n\n",i);

k=i;
fun(k, i,j,a);

k--;

for(i=0;i<k;i++) //冒泡排序法将输入数组a,按照从小到大的顺序排序
for(j=i+1;j<k+1;j++)
if(a[i]>a[j])
{
t=a[i]; a[i]=a[j]; a[j]=t;
}

printf("最大值为%.3f \n最小值为%.3f \n",a[k],a[0] );
y=0.2*(a[k]-a[0]);
b=a[0]+y;
c=b+y;
d=c+y;
e=d+y;



printf("%f %f %f %f \n ",b,c,d,e );///////////////////////每个区间的边值
printf("%f %f %f \n",a[0],a[1],a[2]); ///////////////////////////

for(i=0;i<k;i++) //将输入的数组a的数值按照区间赋值给h,l,m,n,p五个数组内
{
if(a[i]<b)
{h[j1]=a[i]; j1 ++;}
else if(a[i]<c)
{l[j2]=a[i];j2++;}
else if(a[i]<d)
{m[j3]=a[i];j3++;}
else if(a[i]<e)
{n[j4]=a[i];j4++;}
else{p[j5]=a[i];j5++;}
}


printf("%f %f \n",h[0],h[1]); ///////////////////////////////////
printf("%d %d %d %d %d\n",j1,j2,j3,j4,j5); //五个区间内,每个区间中的数值的个数

if(j5!=0) //先从数值最高的区间判断区间是否为空,若空紧邻小区间是否有值
{z5=p[0];} //判断每个区间的代表值
else if(j4!=0)
{z5=n[j4-1];z4=n[0];}

if(j4!=0)
{z4=n[0];}
else if(j3!=0)
{z4=m[j3-1];z3=m[0];}

if(j3!=0)
{z3=m[0];}
else if(j2!=0)
{z3=l[j2-1];z2=l[0];}

if(j2!=0)
{z2=l[0];}
else if(j1!=0)
{z2=h[j1-1];z1=h[0];}

z1=a[0];
printf("%f \n",z1);/////////////////////////
printf("%f \n",z2);///////////////////////////////////
printf("%f \n",z3);////////////////////////////////
printf("%f \n",z4);//////////////////////////////////
printf("%f \n",z5); //得出每个区间的代表值,如果某区间内无值则该代表值为0.0


if(z1==0.0)
{v=v-1.0;} //若区间无值,则该区间不参加计算
if(z2==0.0)
{v=v-1.0;}
if(z3==0.0)
{v=v-1.0;}
if(z4==0.0)
{v=v-1.0;}
if(z5==0.0)
{v=v-1.0;}

ave=(z1+z2+z3+z4+z5)/v;
printf("@@@@@@@@@@@@@@@最后结果为@@@@@@@@@@@@@@@@ : %.3f",ave);

printf("\n\n\n");
}
}



void fun(int k,int i,int j,long double a[100])
{

printf("所有输入的数据为下列数值:\n");
for(i=0;i<k;i++)
{
printf("第%d个数为 %.3f ",i+1,a[i]);
j++;
if(j==3)
{
printf("\n\n");
j=0;
}
}
printf("\n");
correct(a, k ,i, j);
}



void correct(long double a[100],int k ,int i, int j)
{
int w; int x;
printf("***该显示数据是否需要修改***\n*****输入1为修改,中断 ****** 2为不修改,继续*****\n\n请输入:");

scanf("%d",&w);
if(w==1)
{
printf("请输入要修改的数值为第几位,一次只限制修改一个数值\n\n位数:");
scanf("%d",&x);

while(x>=k+1||x<1)
{
printf("!!!你的输入位数不合规定:\n\n");
printf("请输入要修改的数值为第几位,一次只限制修改一个数值\n\n位数:");
scanf("%d",&x);

}


printf("请输入要修改后的数值\n改值:");
scanf("%lf",&a[x-1]);
printf("\n");
fun(k, i,j,a);
}else if(w==2)
{
printf("你的输入经确认无误,将进行继续运算\n");
}else
{
printf("!!!对不起,你的输入不符合规定,重新返回上级界面...........\n\n\n");
fun(k, i,j,a);

}
}

已知收到n个报价。再此基础上本公司也想参加报价报价值为x。加入x后变为n+1个报价按上述方法计算算得评标基准报价为y,此时x=y,

设计一个能求得该x的程序。


#include "stdio.h"
main()
{
int i2=0;
long double t;
void fun(k,i,j,a);
void correct(a,k, i, j);
long double gj(k,i,j,a,ave);
long double ave=0.0;
long double AVE=0.0;
long double a[100];
int i=0,i1=0,j1=0;
int j=0,k=0;
long double a1[100]={0};
int k1;
while(1)
{
k1=0;
i2=0;
ave=0.0; AVE=0.0; t=0.0;
i=0; i1=0;j1=0;
j=0;k=0;
for(k1=0;k1<100;k1++)
{
a[k1]=a1[k1];
}
printf("********本程序为计算程序,当输入数值为0时结束输入********\n\n");
for(i=0;i<100;i++)
{
printf("***请输入第 %d 个数: ",i+1);
scanf("%lf",&a[i]); //当输入为字符型时 错误,循环执行
if(a[i]==0)
{
printf("输入数据阶段结束................\n");
break;
}
}

printf("总共输入的个数为 : %d \n\n",i);

k=i;
fun(k, i,j,a);

k--;
for(i=0;i<k;i++)
for(j=i+1;j<k+1;j++)
if(a[i]>a[j])
{t=a[i]; a[i]=a[j]; a[j]=t;}
printf("最大值为%.3f \n最小值为%.3f \n",a[k],a[0] );



ave=gj(k,i,j,a);
k++;
a[k]=ave;
AVE=ave;
printf("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@以上其他公司的报价的平均值为 %.3f \n\n",ave);

for(i=0;i<k;i++)
for(j=i+1;j<k+1;j++)
if(a[i]>a[j])
{
t=a[i]; a[i]=a[j]; a[j]=t;
}
ave=gj(k,i,j,a);
printf(" @@@ %f",AVE);//n个数据的情况下标准值
printf(" @@@ %f",ave);//n+1个数据情况下的标准值,第n+1个数据为n个数据的标准值

while(i2<100000) // (i2<100000) 进行100000次迭代计算
{ i2++;
for(i=0;i<=k;i++)
{
if(a[i]==AVE) //找到上次计算所得的标准值,AVG
{
a[i]=ave; AVE=ave; //将数组a中上次计算的所得的标准值换为本次的计算标准值,迭代算法

for(i1=0;i1<k;i1++)//冒泡法将新得的n+1个数据从大到小重新排列
for(j1=i1+1;j1<k+1;j1++)
{
if(a[i1]>a[j1])
{
t=a[i1];a[i1]=a[j1];a[j1]=t;
}
}
}

ave=gj(k,i,j,a);//将排好顺序的n+1个数据重新计算得到新的标准值avg,本次计算的标准值avg
}

}


printf(" @@@ %f\n",AVE);
printf(" @@@ %f\n\n",ave);
printf(" @@@@@@@@@@@@@@@@@@@@@@@@本公司如要进行报价,则报价标额为 %.3f\n\n",ave);
}
}




//下列函数为得出所有报价的标准值
long double gj(int k,int i, int j,long double a[100])
{
long double ave;
long double v=5.0;
long double y;
long double b,c,d,e;
int j1=0,j2=0,j3=0,j4=0,j5=0;
long double z1=0.0,z2=0.0,z3=0.0,z4=0.0,z5=0.0;
long double h[100]={0},l[100]={0},m[100]={0},n[100]={0},p[100]={0};

int w=0,x=0;
y=0.2*(a[k]-a[0]);
b=a[0]+y;
c=b+y;
d=c+y;
e=d+y;
//printf("%f %f %f %f \n ",b,c,d,e );///////////////////////
//printf("%f %f %f \n",a[0],a[1],a[2]); ///////////////////////////



for(i=0;i<k;i++)
{
if(a[i]<b)
{h[j1]=a[i]; j1 ++;}
else if(a[i]<c)
{l[j2]=a[i];j2++;}
else if(a[i]<d)
{m[j3]=a[i];j3++;}
else if(a[i]<e)
{n[j4]=a[i];j4++;}
else{p[j5]=a[i];j5++;}
}
/*
printf("%f %f \n",h[0],h[1]); ///////////////////////////////////
printf("%d %d %d %d %d\n",j1,j2,j3,j4,j5); /////////////////////////////
*/


if(j5!=0)
{z5=p[0];}
else if(j4!=0)
{z5=n[j4-1];z4=n[0];}



if(j4!=0)
{z4=n[0];}
else if(j3!=0)
{z4=m[j3-1];z3=m[0];}


if(j3!=0)
{z3=m[0];}
else if(j2!=0)
{z3=l[j2-1];z2=l[0];}


if(j2!=0)
{z2=l[0];}
else if(j1!=0)
{z2=h[j1-1];z1=h[0];}


z1=a[0];
/*
printf("%f \n",z1);/////////////////////////
printf("%f \n",z2);///////////////////////////////////
printf("%f \n",z3);////////////////////////////////
printf("%f \n",z4);//////////////////////////////////
printf("%f \n",z5); //////////////////////////////////////////
*/




if(z1==0.0)
{v=v-1.0;}
if(z2==0.0)
{v=v-1.0;}
if(z3==0.0)
{v=v-1.0;}
if(z4==0.0)
{v=v-1.0;}
if(z5==0.0)
{v=v-1.0;}

ave=(z1+z2+z3+z4+z5)/v;


return ave;




}




//下函数是将所有的输入数值打印出来
void fun(int k,int i,int j,long double a[100])
{

printf("所有输入的数据为下列数值:\n");
for(i=0;i<k;i++)
{
printf("第%d个数为 %.3f ",i+1,a[i]);
j++;
if(j==3)
{
printf("\n\n");
j=0;
}
}
printf("\n");
correct(a, k ,i, j);

}



void correct(long double a[100],int k ,int i, int j)
{
int w; int x;
printf("***该显示数据是否需要修改***\n*****输入1为修改,中断 ****** 2为不修改,继续*****\n\n请输入:");

scanf("%d",&w);
if(w==1)
{
printf("请输入要修改的数值为第几位,一次只限制修改一个数值\n\n位数:");
scanf("%d",&x);

while(x>=k+1||x<1)
{
printf("!!!你的输入位数不合规定:\n\n");
printf("请输入要修改的数值为第几位,一次只限制修改一个数值\n\n位数:");
scanf("%d",&x);

}


printf("请输入要修改后的数值\n改值:");
scanf("%lf",&a[x-1]);
printf("\n");
fun(k, i,j,a);
}else if(w==2)
{
printf("你的输入经确认无误,将进行继续运算\n");
}else
{
printf("!!!对不起,你的输入不符合规定,重新返回上级界面...........\n\n\n");
fun(k, i,j,a);

}
}








举报

相关推荐

0 条评论