练习c语言时 ,总是出现error C2731: 'main' : function cannot be overloaded

仙妮欧亚 2012-04-27 09:03:00
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <time.h>
#define TRUE 1
#define FALSE 0
int N;//数据个数
int K;//集合个数
int * CenterIndex;//初始化质心数组的索引
double * Center;//质心集合
double * CenterCopy;//质心集合副本
double * AllData;//数据集合
double ** Cluster;//簇的集合
int * Top;//集合中元素的个数,也会用作栈处理


//随机生成k个数x(0<=x<=n-1)作为起始的质心集合
void CreateRandomArray(int n, int k,int * center)
{
int i=0;
int j=0;
srand( (unsigned)time( NULL ) );
for( i=0;i<k;++i)//随机生成k个数
{
int a=rand()%n;
//判重
for(j=0;j<i;j++)
{
if(center[j]==a)//重复
{
break;
}
}
if(j>=i)//如果不重复,加入
{
center[i]=a;
}
else
{
i--;
//如果重复,本次重新随机生成
}
}
}

//返回距离最小的质心的序号
int GetIndex(double value,double * center)
{
int i=0;
int index=i;//最小的质心序号
double min=fabs(value-center[i]);//距质心最小距离
for(i=0;i<K;i++)
{
if(fabs(value-center[i])<min)//如果比当前距离还小,更新最小的质心序号和距离值
{
index=i;
min=fabs(value-center[i]);
}
}
return index;
}

//拷贝质心数组到副本
void CopyCenter()
{
int i=0;
for(i=0;i<K;i++)
{
CenterCopy[i]=Center[i];
}
}
//初始化质心,随机生成法
void InitCenter()
{
int i=0;
CreateRandomArray(N,K,CenterIndex);//产生随机的K个<N的不同的序列
for(i=0;i<K;i++)
{
Center[i]=AllData[CenterIndex[i]];//将对应数据赋值给质心数组
}
CopyCenter();//拷贝到质心副本
}
//加入一个数据到一个Cluster[index]集合
void AddToCluster(int index,double value)
{
Cluster[index][Top[index]++]=value;//这里同进栈操作
}

//重新计算簇集合
void UpdateCluster()
{
int i=0;
int tindex;
//将所有的集合清空,即将TOP置0
for(i=0;i<K;i++)
{
Top[i]=0;
}
for(i=0;i<N;i++)
{
tindex=GetIndex(AllData[i],Center);//得到与当前数据最小的质心索引
AddToCluster(tindex,AllData[i]); //加入到相应的集合中
}
}
//重新计算质心集合,对每一簇集合中的元素加总求平均即可
void UpdateCenter()
{
int i=0;
int j=0;
double sum=0;
for(i=0;i<K;i++)
{
sum=0;
//计算簇i的元素和
for(j=0;j<Top[i];j++)
{
sum+=Cluster[i][j];
}
if(Top[i]>0)//如果该簇元素不为空
{
Center[i]=sum/Top[i];//求其平均值
}
}
}
//判断2数组元素是否相等
int IsEqual(double * center1 ,double * center2)
{
int i;
for(i=0;i<K;i++)
{
if(fabs(center1[i]!=center2[i]))
{
return FALSE;
}
}
return TRUE;
}
//打印聚合结果
void Print()
{
int i,j;
printf("-------------------------------------- ");
for(i=0;i<K;i++)
{
printf("第%d组: 质心(%f) ",i,Center[i]);
for(j=0;j<Top[i];j++)
{
printf("%f ",Cluster[i][j]);
}
}
}
//初始化聚类的各种数据
void InitData()
{
int i=0;
int a;
printf("输入数据个数: ");
scanf("%d",&N);
printf("输入簇个数: ");
scanf("%d",&K);
if(K>N)
{
exit(0);
}
Center=(double *)malloc(sizeof(double)*K);//为质心集合申请空间
CenterIndex=(int *)malloc(sizeof(int)*K);//为质心集合索引申请空间
CenterCopy=(double *)malloc(sizeof(double)*K);//为质心集合副本申请空间
Top=(int *)malloc(sizeof(int)*K);
AllData=(double *)malloc(sizeof(double)*N);//为数据集合申请空间
Cluster=(double **)malloc(sizeof(double *)*K);//为簇集合申请空间
//初始化K个簇集合
for(i=0;i<K;i++)
{
Cluster[i]=(double *)malloc(sizeof(double)*N);
Top[i]=0;
}
printf("输入%d数据: ",N);
for(i=0;i<N;i++)
{
scanf("%d",&(a));
AllData[i]=a;
}
InitCenter();//初始化质心集合
UpdateCluster();//初始化K个簇集合

}
/*
算法描述:
K均值算法:
给定类的个数K,将N个对象分到K个类中去,
使得类内对象之间的相似性最大,而类之间的相似性最小。
*/
main()
{
int Flag=1;//迭代标志,若为false,则迭代结束
int i=0;
InitData();//初始化数据
while(Flag)//开始迭代
{
UpdateCluster();//更新各个聚类
UpdateCenter();//更新质心数组
if(IsEqual(Center,CenterCopy))//如果本次迭代与前次的质心聚合相等,即已收敛,结束退出
{
Flag=0;
}
else//否则将质心副本置为本次迭代得到的的质心集合
{
CopyCenter();//将质心副本置为本次迭代得到的的质心集合
}
}
Print();//输出结果
getchar();
getchar();

}
...全文
1468 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
yztundead123 2013-03-13
  • 打赏
  • 举报
回复
又仔細看了看, main() { int Flag=1;//迭代标志,若为false,则迭代结束 int i=0; InitData();//初始化数据 while(Flag)//开始迭代 { UpdateCluster();//更新各个聚类 UpdateCenter();//更新质心数组 if(IsEqual(Center,CenterCopy))//如果本次迭代与前次的质心聚合相等,即已收敛,结束退出 你在建立項目的時候,VS會自動生成: “ int main(array<System::String ^> ^args) { Console::WriteLine(L"Hello World"); return 0; } ” 程序中不能有2個main函數,把你的main添加到原來位置就好
yztundead123 2013-03-12
  • 打赏
  • 举报
回复
應該是頭文件沒有聲明的問題,我添加了 #include <tchar.h> 後面的輸出改成int _tmain(int argc, _TCHAR* argy[])就可以了。
liketjhd 2012-05-01
  • 打赏
  • 举报
回复
LZ基础 打好吧,以后还有的是长程序要编呢
仙妮欧亚 2012-05-01
  • 打赏
  • 举报
回复
谢谢大家了 前几天都不能编译通过 今天把vc6.0卸载了 又装了一遍 发现可以了
handsomekyle 2012-04-28
  • 打赏
  • 举报
回复
VC编译通过。
提示warnning。
加上void。无提示。
通过
lycleaner 2012-04-28
  • 打赏
  • 举报
回复
重建工程,粘贴代码看看是否再次出现
cbzjzsb123 2012-04-28
  • 打赏
  • 举报
回复

LZ的main函数没有return不知道是不是这个问题。大胆的猜想,可以试试。
liuhao 2012-04-28
  • 打赏
  • 举报
回复
LZ的main函数没有return不知道是不是这个问题。大胆的猜想,可以试试。
码农-彬少 2012-04-28
  • 打赏
  • 举报
回复
工程建错了,或者用Winmain()试试。
向立天 2012-04-28
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]
'main' : function cannot be overloaded
意思是main不能重载
main()换成void main()试一下
[/Quote]这么操作可以编译通过
你重建个空工程建一个空cpp文件
然后把这些代码拷进去试试
仙妮欧亚 2012-04-28
  • 打赏
  • 举报
回复
恩 是有这些文件 初学c语言 搞得不太清楚 要不你发个生成好的程序给我看一下 正好把老师给的验证数据做一下 我邮箱1032054460@qq.com 谢谢了
西山小月 2012-04-27
  • 打赏
  • 举报
回复
是不是工程里还有其他的文件?.h .cpp
仙妮欧亚 2012-04-27
  • 打赏
  • 举报
回复
win32控制台程序
  • 打赏
  • 举报
回复
你建的是什么工程
仙妮欧亚 2012-04-27
  • 打赏
  • 举报
回复
楼上 vc6.0还是报错 不知道什么原因
蓝鹰 2012-04-27
  • 打赏
  • 举报
回复
vc 6.0 编译通过, 不过标准c还是要用int main 或者void main
仙妮欧亚 2012-04-27
  • 打赏
  • 举报
回复
还是不行 我用的是vc进行编译的
zhuojohn 2012-04-27
  • 打赏
  • 举报
回复
你用的什么编译器,我用dev-cpp是可以通过的
试一下 int main(void)
{
....
return 0;
}
仙妮欧亚 2012-04-27
  • 打赏
  • 举报
回复

还是报错

error C2731: 'main' : function cannot be overloaded
cpp(205) : see declaration of 'main'
zhuojohn 2012-04-27
  • 打赏
  • 举报
回复
'main' : function cannot be overloaded
意思是main不能重载
main()换成void main()试一下
加载更多回复(2)

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧