C++:使用函数模板编辑数组的问题
C++: Issue with using Function Templates to Edit Array
所以我有这个作业要求我使用函数模板从键盘加载数组数据,打印每个数组中的两个最小值,按降序排列数组,将数据保存到文本文件,然后检索该文本文件。
我的主要问题是我的 smallPrint 函数模板不断出现错误。一条错误消息如下:
"no instance of function template "smallPrint" 匹配参数列表
参数类型有:(float [7], int, int, const int)
当我尝试 运行 程序时弹出的另一件事是我的 printArray 函数模板中的一个问题。我没有看到任何错误。
非常感谢任何帮助。
这是作业:
”通过删除每个数组的数据重新分配并添加五个新函数模板来修改 arrtemp.cpp。
1.) 第一个新函数模板应该允许用户从键盘输入数组数据。
2.) 第二个新函数模板应该打印数组的最小值和次小值而不排序。您可以假设每个数组都包含不同的数据。
3.) 第三个新函数模板应该按降序对数组进行排序。
4.) 第四个新功能模板应该将保存数据保存到文本文件中。 5.) 第五个新函数模板应该从文本文件中检索数组数据。输出应包括每个数组的最小值和次小值,以及按降序打印两次的所有三个数组,一次在保存文本文件之前,一次在检索文本文件之后。确保在每个函数模板之前包含 [template ]。每个数组都应保存到一个单独的文本文件中。您还需要显示所有 3 个文本文件。"
下面是arrtemp.cpp和我写的:
arrtemp.cpp
#include <iostream>
using namespace std;
//function template to print an array
//works for multiple data types
template <class T>
void printarray (T *a, const int n)
{
for (int i = 0; i < n; i++)
cout << a[i] << " ";
cout << endl;
}
int main()
{
const int n1 = 5, n2 = 7, n3 = 6;
int a[n1] = {2, 4, 6, 8, 10};
float b[n2] = {1.1, 2.2, 3.3, 4.4, 5.5, 6.6, 7.7};
char c[n3] = "HELLO";
cout <<"the integer array" << endl;
printarray(a, n1);
cout <<"the float array" << endl;
printarray(b,n2);
cout <<"the string is" << endl;
printarray(c,n3);
return 0;
}
我写的:
#include<iostream>
#include<fstream>
using namespace std;
template <class T>
T loadArray(T *a, const int n )
{
for (int i = 0; i < n; i++)
{
cin >> a[i];
}
}
template <class T>
T smallPrint(T *a, T *small, T *small2, const int n)
{
small = a[0];
small2 = a[0];
for (int i = 1; i < n; i++)
{
if (a[i] < small)
small = a[i];
}
for (int i = 1; i < n; i++)
{
if (a[i] > small && a[i] < small2)
small2 = a[i];
}
cout << small << ' ' << small2;
cout << endl << endl;
}
template <class T>
T sort(T *a, const int n)
{
for (int i = 0; i < n; i++)
for (int j = 0; j < n; j++)
{
if (a[j] < a[j + 1])
{
T t = a[j];
a[j] = a[j + 1];
a[j + 1] = t;
}
}
}
template <class T>
T saveFile(T *a, T small, T small2, const int n, string filename)
{
ofstream outfile(filename, ios::out);
for (int i = 0; i < n; i++)
{
outfile << a[i] << ' ';
}
outfile << small << small2;
outfile.close();
}
template <class T>
T retrieveFile(T *a, T small, T small2, const int n, string filename)
{
ifstream infile(filename, ios::in);
for (int i = 0; i < n; i++)
{
infile >> a[i];
}
infile >> small >> small2;
infile.close();
}
template <class T>
T printArray(T*a, const int n)
{
for (int i = 0; int < n; i++)
cout << a[i] << ' ';
cout << endl;
}
int main()
{
const int n1 = 5, n2 = 7, n3 = 6;
int a[n1];
float b[n2];
char c[n3];
int smalli, smalli2;
float smallf, smallf2;
char smallc, smallc2;
loadArray(a, n1);
loadArray(b, n2);
loadArray(c, n3);
smallPrint(a, smalli, smalli2, n1);
smallPrint(b, smallf, smallf2, n2);
smallPrint(c, smallc, smallc2, n3);
sort(a, n1);
sort(b, n2);
sort(c, n3);
printArray(a, n1);
printArray(b, n2);
printArray(c, n3);
saveFile(a, smalli, smalli2, n1, "i:\ints.txt");
saveFile(b, smallf, smallf2, n2, "i:\floats.txt");
saveFile(c, smallc, smallc2, n3, "i:\chars.txt");
retrieveFile(a, smalli, smalli2, n1, "i:\ints.txt");
retrieveFile(b, smallf, smallf2, n2, "i:\floats.txt");
retrieveFile(c, smallc, smallc2, n3, "i:\chars.txt");
printArray(a, n1);
printArray(b, n2);
printArray(c, n3);
system("PAUSE");
return 0;
}
这是有效的更正版本:
#include<iostream>
#include<fstream>
using namespace std;
template <class T>
void loadArray(T *a, const int n)
{
for (int i = 0; i < n; i++)
{
cout << "Enter a number (" << n-i << " left): ";
cin >> a[i];
}
cout << endl;
}
template <class T>
void smallPrint(T *a, T &small, T &small2, const int n)
{
small = a[0];
small2 = a[0];
for (int i = 1; i < n; i++)
{
if (a[i] < small)
small = a[i];
}
for (int i = 1; i < n; i++)
{
if (a[i] > small && a[i] < small2)
small2 = a[i];
}
cout << small << ' ' << small2;
cout << endl << endl;
}
template <class T>
void sort(T *a, const int n)
{
for (int i = 0; i < n; i++)
for (int j = 0; j < n; j++)
{
if (a[j] < a[j + 1])
{
T t = a[j];
a[j] = a[j + 1];
a[j + 1] = t;
}
}
}
template <class T>
void saveFile(T *a, T small, T small2, const int n, string filename)
{
ofstream outfile(filename, ios::out);
for (int i = 0; i < n; i++)
{
outfile << a[i] << ' ';
}
outfile << small << ' ' << small2;
outfile.close();
}
template <class T>
void retrieveFile(T *a, T small, T small2, const int n, string filename)
{
ifstream infile(filename, ios::in);
for (int i = 0; i < n; i++)
{
infile >> a[i];
}
infile >> small >> small2;
infile.close();
}
template <class T>
void printArray(T*a, const int n)
{
for (int i = 0; i < n; i++)
cout << a[i] << ' ';
cout << endl;
}
int main()
{
const int n1 = 5, n2 = 7, n3 = 6;
int a[n1];
float b[n2];
char c[n3];
int smalli, smalli2;
float smallf, smallf2;
char smallc, smallc2;
loadArray(a, n1);
loadArray(b, n2);
loadArray(c, n3);
smallPrint(a, smalli, smalli2, n1);
smallPrint(b, smallf, smallf2, n2);
smallPrint(c, smallc, smallc2, n3);
sort(a, n1);
sort(b, n2);
sort(c, n3);
printArray(a, n1);
printArray(b, n2);
printArray(c, n3);
saveFile(a, smalli, smalli2, n1, "i:\ints.txt");
saveFile(b, smallf, smallf2, n2, "i:\floats.txt");
saveFile(c, smallc, smallc2, n3, "i:\chars.txt");
retrieveFile(a, smalli, smalli2, n1, "i:\ints.txt");
retrieveFile(b, smallf, smallf2, n2, "i:\floats.txt");
retrieveFile(c, smallc, smallc2, n3, "i:\chars.txt");
printArray(a, n1);
printArray(b, n2);
printArray(c, n3);
system("PAUSE");
return 0;
}`
您的 T smallPrint(T *a, T *small, T *small2, const int n)
应该是 T smallPrint(T *a, T small, T small2, const int n)
。
在你的 printArray
中你有 for (int i = 0; int < n; i++)
而不是 for (int i = 0; i < n; i++)
.
所以我有这个作业要求我使用函数模板从键盘加载数组数据,打印每个数组中的两个最小值,按降序排列数组,将数据保存到文本文件,然后检索该文本文件。 我的主要问题是我的 smallPrint 函数模板不断出现错误。一条错误消息如下: "no instance of function template "smallPrint" 匹配参数列表 参数类型有:(float [7], int, int, const int) 当我尝试 运行 程序时弹出的另一件事是我的 printArray 函数模板中的一个问题。我没有看到任何错误。
非常感谢任何帮助。
这是作业:
”通过删除每个数组的数据重新分配并添加五个新函数模板来修改 arrtemp.cpp。 1.) 第一个新函数模板应该允许用户从键盘输入数组数据。 2.) 第二个新函数模板应该打印数组的最小值和次小值而不排序。您可以假设每个数组都包含不同的数据。 3.) 第三个新函数模板应该按降序对数组进行排序。 4.) 第四个新功能模板应该将保存数据保存到文本文件中。 5.) 第五个新函数模板应该从文本文件中检索数组数据。输出应包括每个数组的最小值和次小值,以及按降序打印两次的所有三个数组,一次在保存文本文件之前,一次在检索文本文件之后。确保在每个函数模板之前包含 [template ]。每个数组都应保存到一个单独的文本文件中。您还需要显示所有 3 个文本文件。"
下面是arrtemp.cpp和我写的:
arrtemp.cpp
#include <iostream>
using namespace std;
//function template to print an array
//works for multiple data types
template <class T>
void printarray (T *a, const int n)
{
for (int i = 0; i < n; i++)
cout << a[i] << " ";
cout << endl;
}
int main()
{
const int n1 = 5, n2 = 7, n3 = 6;
int a[n1] = {2, 4, 6, 8, 10};
float b[n2] = {1.1, 2.2, 3.3, 4.4, 5.5, 6.6, 7.7};
char c[n3] = "HELLO";
cout <<"the integer array" << endl;
printarray(a, n1);
cout <<"the float array" << endl;
printarray(b,n2);
cout <<"the string is" << endl;
printarray(c,n3);
return 0;
}
我写的:
#include<iostream>
#include<fstream>
using namespace std;
template <class T>
T loadArray(T *a, const int n )
{
for (int i = 0; i < n; i++)
{
cin >> a[i];
}
}
template <class T>
T smallPrint(T *a, T *small, T *small2, const int n)
{
small = a[0];
small2 = a[0];
for (int i = 1; i < n; i++)
{
if (a[i] < small)
small = a[i];
}
for (int i = 1; i < n; i++)
{
if (a[i] > small && a[i] < small2)
small2 = a[i];
}
cout << small << ' ' << small2;
cout << endl << endl;
}
template <class T>
T sort(T *a, const int n)
{
for (int i = 0; i < n; i++)
for (int j = 0; j < n; j++)
{
if (a[j] < a[j + 1])
{
T t = a[j];
a[j] = a[j + 1];
a[j + 1] = t;
}
}
}
template <class T>
T saveFile(T *a, T small, T small2, const int n, string filename)
{
ofstream outfile(filename, ios::out);
for (int i = 0; i < n; i++)
{
outfile << a[i] << ' ';
}
outfile << small << small2;
outfile.close();
}
template <class T>
T retrieveFile(T *a, T small, T small2, const int n, string filename)
{
ifstream infile(filename, ios::in);
for (int i = 0; i < n; i++)
{
infile >> a[i];
}
infile >> small >> small2;
infile.close();
}
template <class T>
T printArray(T*a, const int n)
{
for (int i = 0; int < n; i++)
cout << a[i] << ' ';
cout << endl;
}
int main()
{
const int n1 = 5, n2 = 7, n3 = 6;
int a[n1];
float b[n2];
char c[n3];
int smalli, smalli2;
float smallf, smallf2;
char smallc, smallc2;
loadArray(a, n1);
loadArray(b, n2);
loadArray(c, n3);
smallPrint(a, smalli, smalli2, n1);
smallPrint(b, smallf, smallf2, n2);
smallPrint(c, smallc, smallc2, n3);
sort(a, n1);
sort(b, n2);
sort(c, n3);
printArray(a, n1);
printArray(b, n2);
printArray(c, n3);
saveFile(a, smalli, smalli2, n1, "i:\ints.txt");
saveFile(b, smallf, smallf2, n2, "i:\floats.txt");
saveFile(c, smallc, smallc2, n3, "i:\chars.txt");
retrieveFile(a, smalli, smalli2, n1, "i:\ints.txt");
retrieveFile(b, smallf, smallf2, n2, "i:\floats.txt");
retrieveFile(c, smallc, smallc2, n3, "i:\chars.txt");
printArray(a, n1);
printArray(b, n2);
printArray(c, n3);
system("PAUSE");
return 0;
}
这是有效的更正版本:
#include<iostream>
#include<fstream>
using namespace std;
template <class T>
void loadArray(T *a, const int n)
{
for (int i = 0; i < n; i++)
{
cout << "Enter a number (" << n-i << " left): ";
cin >> a[i];
}
cout << endl;
}
template <class T>
void smallPrint(T *a, T &small, T &small2, const int n)
{
small = a[0];
small2 = a[0];
for (int i = 1; i < n; i++)
{
if (a[i] < small)
small = a[i];
}
for (int i = 1; i < n; i++)
{
if (a[i] > small && a[i] < small2)
small2 = a[i];
}
cout << small << ' ' << small2;
cout << endl << endl;
}
template <class T>
void sort(T *a, const int n)
{
for (int i = 0; i < n; i++)
for (int j = 0; j < n; j++)
{
if (a[j] < a[j + 1])
{
T t = a[j];
a[j] = a[j + 1];
a[j + 1] = t;
}
}
}
template <class T>
void saveFile(T *a, T small, T small2, const int n, string filename)
{
ofstream outfile(filename, ios::out);
for (int i = 0; i < n; i++)
{
outfile << a[i] << ' ';
}
outfile << small << ' ' << small2;
outfile.close();
}
template <class T>
void retrieveFile(T *a, T small, T small2, const int n, string filename)
{
ifstream infile(filename, ios::in);
for (int i = 0; i < n; i++)
{
infile >> a[i];
}
infile >> small >> small2;
infile.close();
}
template <class T>
void printArray(T*a, const int n)
{
for (int i = 0; i < n; i++)
cout << a[i] << ' ';
cout << endl;
}
int main()
{
const int n1 = 5, n2 = 7, n3 = 6;
int a[n1];
float b[n2];
char c[n3];
int smalli, smalli2;
float smallf, smallf2;
char smallc, smallc2;
loadArray(a, n1);
loadArray(b, n2);
loadArray(c, n3);
smallPrint(a, smalli, smalli2, n1);
smallPrint(b, smallf, smallf2, n2);
smallPrint(c, smallc, smallc2, n3);
sort(a, n1);
sort(b, n2);
sort(c, n3);
printArray(a, n1);
printArray(b, n2);
printArray(c, n3);
saveFile(a, smalli, smalli2, n1, "i:\ints.txt");
saveFile(b, smallf, smallf2, n2, "i:\floats.txt");
saveFile(c, smallc, smallc2, n3, "i:\chars.txt");
retrieveFile(a, smalli, smalli2, n1, "i:\ints.txt");
retrieveFile(b, smallf, smallf2, n2, "i:\floats.txt");
retrieveFile(c, smallc, smallc2, n3, "i:\chars.txt");
printArray(a, n1);
printArray(b, n2);
printArray(c, n3);
system("PAUSE");
return 0;
}`
您的 T smallPrint(T *a, T *small, T *small2, const int n)
应该是 T smallPrint(T *a, T small, T small2, const int n)
。
在你的 printArray
中你有 for (int i = 0; int < n; i++)
而不是 for (int i = 0; i < n; i++)
.