c ++编程数组,用于查找范围内的整数数

时间:2017-05-18 10:55:24

标签: c++ arrays

问题已附上,所以我试图解决这个问题,但我得到的输出是大数字,这可能是垃圾数据,因此绝对不正确。

enter image description here

这是我的代码

#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;
}

2 个答案:

答案 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) ,代码越短,未来错误的可能性越小,因为有人不会在所有地方更改代码。)