我创建了一个小练习程序,用于练习从文件中读取的排序数据。我遇到的问题是,当我想要排序一个不同的特定列(在本例中为第二列)时,我得到了无法转换数据类型的错误。
我的目标是能够找到该列的中位数,最小值和最大值。现在,我知道这是一个数据类型不匹配问题,但我想知道是否有办法绕过它?因为否则我将不得不创建另一个看起来效率很低的minIndex函数。
以下是代码:
#include <iostream>
#include <fstream>
#include <iomanip>
#include <cstdlib>
using namespace std;
void readScore(ifstream & fin, double & x, int & y, string & z);
double median(double arr[], int n);
void swap(int & a, int & b);
int minIndex(double k[], int size, int startIndex);
void selectionSortAll(double k[], int l[], int size);
void selectionSortY(int l[], int size);
struct XYZ
{
double varx[4];
int vary[4];
string varz[4];
};
int main()
{
double x;
int y;
string z;
ofstream fout;
ifstream fin;
fin.open("struct fstream.txt");
XYZ calcX;
XYZ calcY;
XYZ calcZ;
double scoreSumX = 0;
int scoreSumY = 0;
for (int i = 0; i < 4; i++)
{
readScore(fin, x, y, z);
calcY.vary[i] = y;
calcX.varx[i] = x;
calcZ.varz[i] = z;
cout << calcX.varx[i] << " ";
cout << calcY.vary[i] << " ";
cout << calcZ.varz[i] << endl;
/*scoreSumX += calcX.varx[i];
scoreSumY += calcY.vary[i];
cout << "Current sum: " << scoreSumX << endl;
if (i >1)
{
cout << "Current average: " << scoreSumX / (i + 1) << endl;
}*/
}
cout << "" << endl;
selectionSortAll(calcX.varx, calcY.vary, 4);
for (int i = 0; i < 4; i++) {
cout << calcX.varx[i] << " ";
cout << calcY.vary[i] << " ";
cout << calcZ.varz[i] << endl;
}
cout << median(calcX.varx, 4);
fin.close();
fout.close();
return 0;
}
void readScore (ifstream & fin, double & x, int & y, string & z)
{
fin >> x >> y >> z;
}
double median(double arr[], int n)
{
if (n % 2 == 0)
return arr[n / 2];
else
return arr[n / 2];
}
void swap(int & a, int & b) {
int temp = a;
a = b;
b = temp;
}
int minIndex(double k[], int size, int startIndex) {
int minI = startIndex;
for (int i = startIndex; i < size; i++) {
if (k[i] < k[minI]) {
minI = i;
}
}
return minI;
}
void selectionSortAll(double k[], int l[], int size) {
int minI;
for (int startIndex = 0; startIndex < size; startIndex++) {
minI = minIndex(k, size, startIndex);
swap(k[startIndex], k[minI]);
swap(l[startIndex], l[minI]);
}
}
void selectionSortY(int l[], int size) {
int minI;
for (int startIndex = 0; startIndex < size; startIndex++) {
minI = minIndex(l, size, startIndex);
swap(l[startIndex], l[minI]);
}
}
最后一个函数&#34; selectionSortY&#34;发生错误,因为第一个参数&#34; l&#34;在这种情况下是 int ,但函数中的第一个参数&#34; minIndex&#34;是双。我是否必须创建另一个minIndex函数来索引不同的数据类型?
哦,作为参考,输入文件如下所示:
634 423 qwerty
115 935 jkl
968 156 asdf
439 593 iopu
感谢您的时间,非常感谢任何帮助=)
编辑:只是为了澄清,该程序在没有&#34; selectionSortY&#34;功能。 &#34; selectionSortAll&#34;按预期对前两列进行排序。
编辑2:我是编程的新手,所以如果我有点慢,或者如果我直接知道什么是什么,请耐心等待。另外对于实际的作业(比这还要大得多,所以我没有在这里发布),我对我允许使用的内容有所限制,因为这是初学者课程的第一个学期。
答案 0 :(得分:1)
尝试模板:
template<typename T>
int minIndex(T k[], int size, int startIndex) {
int minI = startIndex;
for (int i = startIndex; i < size; i++) {
if (k[i] < k[minI]) {
minI = i;
}
}
return minI;
}
顺便说一下,我会考虑更多地依靠<algorithm>
和STL containers来vector
来完成你的目标。 Finding the minimum element,for example。