问题已附上,所以我试图解决这个问题,但我得到的输出是大数字,这可能是垃圾数据,因此绝对不正确。
这是我的代码
#include <iostream>
#include <fstream>
using namespace std;
const int size=8;
void readData(char filename[], int list[], int size)
{
ifstream fin;
fin.open("HW4_Q1data.txt");
int value=0;
for(int i=0;i<30;i++)
{
fin>>filename[i];
value=filename[i];
if (value >= 0 && value <= 24)
list[0]++;
else if (value >= 25 && value <= 49)
list[1]++;
else if (value >= 50 && value <= 74)
list[2]++;
else if (value >= 75 && value <= 99)
list[3]++;
else if (value >= 100 && value <= 124)
list[4]++;
else if (value >= 125 && value <= 149)
list[5]++;
else if (value >= 150 && value <= 174)
list[6]++;
else if (value >= 175 && value <= 200)
list[7]++;
}
fin.close();
}
void print(int list[], int size)
{
cout << " Range"<<'\t'<<"# of students"<<endl;
cout << "0-24: " <<'\t'<<list[0] << endl;
cout << "25-49: " << '\t'<<list[1] << endl;
cout << "50-74: " <<'\t'<< list[2] << endl;
cout << "75-99: " <<'\t'<< list[3] << endl;
cout << "100-124: " <<'\t'<< list[4] << endl;
cout << "125-149: " <<'\t'<<list[5] << endl;
cout << "150-174: " <<'\t'<< list[6] << endl;
cout << "175-200: " <<'\t'<< list[7] << endl;
}
int main()
{
char filename[70];
int list[size];
readData(filename,list,size);
print(list,size);
return 0;
}
答案 0 :(得分:2)
正如VTT所说,你没有初始化列表值,因此它有垃圾值。你应该用0初始化它们。
int main() {
// filename stuff
int list[size];
for(int i = 0 ; i < size; i++) {
list[i] = 0;
}
// read and write functions
}
此外,我可以从char filename[]
这个问题中读取该文件的名称:fin.open(filename);
修改强>
大部分程序,以解决您的问题:
void readData(char filename[], int list[], int size)
{
ifstream fin;
fin.open(filename);
int value;
for(inti= 0; i<30; i++) {
fin>>value;
if (value >= 0 && value <= 24)
list[0]++;
// ... other if else stuff
}
fin.close()
}
// print stuff
int main() {
int list[size] = {0}; // initialize the list with 0.
readData(*filename*, list, size); // replace *filename* with the real file name
print(list,size);
return 0;
}
答案 1 :(得分:-1)
您的假设是正确的,因为数组值未初始化,您将获得随机(标准所示的未定义行为)数据。有几种方法可以初始化静态数组:
您可以使用花括号初始化静态数组
int list[10] = {1,2,3,4,5,6,7,8,9,10} // will put 1,2...10 to your array
如果在括号中指定较少的元素,编译器会将0放在那里,因此可以轻松地将数组初始化为零(您可能经常这样做):
int list[10] = {}
如果您想使用任何数字,您可以轻松使用填充功能:
fill(std::begin(arr), std::end(arr), 25); //will fill all elements to 25
使用std :: end进行静态数组很方便,因为有时你无法确切地说有多少元素。您可以像以前一样使用10个元素定义数组,或者您可以在定义中使用大括号,然后让编译器为您计算元素
int list[] = {32,5,0,10};
在C(使用C样式代码的C ++中),您可以稍微获得这些信息hacky way:
int arraySize = sizeof(list)/sizeof(list[0]);
在您的情况下,使用C ++ std :: array而不是普通的旧静态数组可能更方便。它是一个简单的静态数组包装器,只有很少的好方法和重载运算符。
关于你的任务,我相信在用C ++编程时你不应该传递char指针,而是传递字符串,因为C ++提供了通常更安全和更方便使用的更高级别的类。我使用一些C ++功能编写了我的解决方案。
#include <iostream>
#include <fstream>
#include <array>
constexpr int arraySize = 8;
constexpr int maxNumber = 200;
using arrayType = std::array<int, arraySize>;
bool readData(const std::string &fileName, arrayType &results, count int numCount){
results.fill(0);
std::ifstream inFile(fileName, std::ifstream::in);
if (!inFile.is_open())
return false;
for(int i = 0; i < numCount; i++){
int val;
if(!(inFile >> val) || val < 0 || val > maxNumber)
return false;
results[std::min(maxNumber-1,val)/25]++; //Since 200 is included and the range contains 201 numbers
}
return true;
}
void print(const arrayType &count){
std::cout << "Range" << '\t' << "# of Students" << std::endl;
const auto printLine = [](const int minVal, const int maxVal, const int count){
std::cout << minVal << "-" << maxVal << '\t' << count << std::endl;
};
const int segmentSize = maxNumber/arraySize;
for(int i = 0; i < arraySize-1; i++){
printLine(i*segmentSize, (i+1)*segmentSize-1, count[i]);
}
printLine((arraySize-1)*segmentSize, maxNumber, count[arraySize-1]);
}
int main()
{
constexpr int numberCount = 30;
std::string fileName = R"(/mnt/d/Prog/C++/in2.txt)";
std::array<int,arraySize> frequences;
readData(fileName, frequences, numberCount);
print(frequences);
return 0;
}
除了使用不同的语言特性之外,我还尝试删除带有长列表if语句的部分,因为它可以用一行写成,这样跟随DRY principle,这是一个很好的事情要遵循(更少的bug) ,代码越短,未来错误的可能性越小,因为有人不会在所有地方更改代码。)