首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

编了一个以向量干参数的函数,不知道错在哪里…

2012-11-20 
编了一个以向量做参数的函数,不知道错在哪里……#includeiostream#includefstream#includevectorusing

编了一个以向量做参数的函数,不知道错在哪里……
#include<iostream>
#include<fstream>
#include<vector>
using namespace std;
int f();
int main()
{
ifstream in("abc.txt");
vector<int> a;
for(int i;in>>i;)
a.push_back(i);
int f(a);
for(i=0;i<a.size();++i)
cout<<a[i]<<"\t";
return 0;
}
int f(vector<int>& a)
{
int t;
int s[20];
for(int i=0;i<a.size();++i)
a[i]=a[i]*a[i];
for(i=0;i<a.size();++i)
for(int j=0;j<a.size()-i;++j)
if(a[i]>a[i+1])
{t=a[i];a[i]=a[i+1];a[i+1]=t;}
return 0;
}
我把从文件abc.txt的几个数读入到向量中,并想设计一个函数,以该向量为参数,将向量中的数据按各位数字之平方和的大小排序,却遇到了点问题。请前辈指点!

[解决办法]
函数声明与调用有错。
f函数中i变量有问题。
好好看看书,自己动手改改吧,
[解决办法]
概括起来,有以下几个问题:
1、int f(a);这句,是定义一个叫f的int值,你应该把int去掉,改成f(a),否则应该编译不过。
2、既然用到stl,那么就应该尽量用它的工具,比如排序的时候直接用slt中的sort,不用自己写冒泡
3、遍历vector的时候,最好用迭代器,安全而且快
4、吹毛求疵点,a[i]=a[i]*a[i];这句可能会导致溢出。
[解决办法]

探讨

我看了两遍还是没发现函数声明和调用有什么错误诶……

[解决办法]
C++有自己的排序函数sort,这样可以方便许多
[解决办法]
问题很多,int f();的声明里没有参数,改成int f(vector<int>& );
for循环判断条件用in>>i这样是不会结束循环的,会一直让你输入,应该初始化i,在循环体内读入,判断i的值是否符合要求(或者说是输入非法字符来中断读入?

f里面问题就更多了,a[i]=a[i]*a[i];直接修改vector内元素了,后面就全错了,而且你要的是各位数字平方和,又不是整个数字的平方,定义的s[20]也没用到,应该是想先拆分各位数字放到s里面再求各位数字平方和的吧,这里可以考虑添加一个计算各位平方和的函数,然后排序的时候可以考虑直接对前面函数的返回值进行比较来排序,缺点是函数调用次数会比较多,效率可能有影响,或者再建一个vector<int>存放每个数字的各位平方和,排序的时候同步操作以达到目的


另外,for里面的i,一般要么在循环外定义然后重用,要么每次都重新定义,这样的写法好像不太规范,可能你的编译器支持这种写法吧
[解决办法]
C/C++ code
#include<iostream>#include<fstream>#include<vector>using namespace std;int f(vector<int>& a){    int t,i;       for(i=0;i<a.size();++i) //int i ->i        a[i]=a[i]*a[i];    for(i=0;i<a.size();++i)        for(int j=0;j<a.size()-i-1;++j)            if(a[j]>a[j+1])            {                t=a[j];                a[j]=a[j+1];                a[j+1]=t;            }            return 0;}int main(){    ifstream in("abc.txt");    vector<int> a;    int i;//add    for(;in>>i;)         a.push_back(i);    int result = f(a); //add result    for(i=0;i<a.size();++i)        cout<<a[i]<<"\t";    return 0;}
[解决办法]
你代码问题较多,干脆写了一个,供参考。 
C/C++ code
#include <iostream>#include <vector>#include <iterator>#include <algorithm> //各位数字的平方和long sum_of_cubic(int  n){  long sum = 0;   while(n)  {      div_t d = div(n, 10);      sum += d.rem *d.rem;      n = d.quot;  }  return sum;}bool compare_sum_of_cubic(int a, int b){    return sum_of_cubic(a) < sum_of_cubic(b);}int main (){    std::vector<int> data;    //从std::cin输入,若从文件输入,用重定向即可, 比如 test.exe < abc.txt 将从文件中abc.txt中读数据    std::istream_iterator<int> start(std::cin);    std::istream_iterator<int> end;    //用迭代器输入数据    std::copy(start, end, std::back_inserter(data));    //不用自己写函数了,std::sort就是给容器排序的,只需要提供排序算法    std::sort(data.begin(), data.end(), &compare_sum_of_cubic);    return 0;} 

热点排行