【问题标题】:Can't find the right max Value in my Array loop在我的数组循环中找不到正确的最大值
【发布时间】:2018-12-01 01:55:16
【问题描述】:

所以我的教授给了我们这个项目来读取一个文本文件并找到最大值、最小值和总和。但是由于某种原因,当我编写 for 循环以查找最大值时,它返回的数字甚至不在文本文件中……而且我不知道我做错了什么。我将附上我的代码以及输出。谢谢

int main () {

ifstream myFile;
char myArray[210];
int i;
int maxVal;
int j;
int minValue;
double myAverage;


myFile.open("Lab #5A Data File.Txt", ios::in | ios::out);

if (myFile.is_open()) {
    cout << "The file is open." << endl; 

    myFile >> noskipws;

while (!myFile.eof()){


for (i=0; i<210; ++i) {


    myFile >> myArray[i];
    cout << myArray[i];
     } 
     myFile >>myArray[i];

    }

maxVal=myArray[0];

for (j=0; j< 210; j++)
    if (myArray[j] > maxVal){

        maxVal=myArray[j];
    }

当我运行代码时我得到了什么:

文件已打开。

346 130 982 90 656 117 595 415 948 126 4 558 571 87 42 360 412 721 463 47 119 441 190 985 214 509 2 571 77 81 681 651 995 93 74 310 9 995 561 92 14 288 466 664 892 8 766 34 639 151 64 98 813 67 834 369

最大值是:51

【问题讨论】:

  • 当您尝试将最大值分配给 max 变量时:myArray[i]=maxVal;。它应该是 maxVal = myArray[j];(因为 myArray[j] 是您要与 maxVal 进行比较,而不是 myArray[i]
  • 为什么你把数字读成chars,而不是ints?为什么myFile &gt;&gt; noskipws;51 是字符 '3' 的 ASCII 码,它是从文件中读取的第一个值。

标签: c++ arrays for-loop


【解决方案1】:

51 来自线路:

maxVal=myArray[0];

在你的循环中尝试找到你拥有的最大元素:

for (j=0; j< 210; j++)
    if (myArray[j] > maxVal){
        myArray[i]=maxVal;
    }
}

但是,这会将maxVal 分配给myArray[i],这不是您想要的。首先,您需要分配myArray[j],而不是myArray[i],其次您需要将maxVal 分配给更大的值。因为它是 maxVal=myArray[0]; 是唯一一次您将任何东西分配给 maxVal,这就是为什么它是 51 (字符 3 的 ASCII 值,这是您读取的第一个字符)。您需要按照以下方式做一些事情:

if (myArray[j] > maxVal){
     maxVal = myArray[j];
}

我相信您希望 myArray 成为 int[]。还有一个更好的方法是不要有两个 for 循环并循环直到 EOF,循环 while myFile &gt;&gt; myArray[i]

int myArray[210];
int i = 0;
//...
while (myFile >> myArray[i]) {          
    cout << myArray[i] << " ";  
    if (myArray[i] > maxVal) {
        maxVal = myArray[i];
    }
    i++;
}   

哪个是输入文件:

346 130 982 90 656 117 595 
415 948 126 4 558 571 87 42 
360 412 721 463 47 119 441 
190 985 214 509 2 571 77 81 
681 651 995 93 74 310 9 995 
561 92 14 288 466 664 892 8 
766 34 639 151 64 98 813 67 834 369

返回:

995

【讨论】:

  • 我不想说什么,但你是在比较 char 和 int:if (myArray[j] &gt; maxVal){ 你当然想添加一片 atoi()
  • 没有提及为什么号码是51,即使它没有出现在使用的输入中?
  • @Skriptkiddie 如何比较char*intmyArray 是一个 char 数组 (char myArray[210];),使 myArray[j] 成为 char
  • 更正了我的评论!你是对的,但是在这种情况下将 char 与 int 进行比较同样是错误的!
  • @AlgirdasPreidžius 我编辑了我的帖子以解释 513 的 ASCII 值,这是 OP 正在读取的第一个字符
【解决方案2】:

要达到你想要的,你不能做这样的比较

if (myArray[j] > maxVal){

因为myArray[j] 是一个字符(绝对不包含您感兴趣的整数),而 maxVal 是一个整数。这也是您看到 51 的原因 - 当您尝试将整数存储到 char 中时,您实际上只从流中读取了 8 位(这导致了 0 到 254 之间的某个值,这基本上只是一些 8 位块您的输入流)。

你肯定想要类似的东西

char myArray[32][210]; 

能够将您的完整整数从流中读取到这 210 个 char* 插槽之一。 然后,在比较(并分配给 maxValue)时,您需要将文本 int 值转换为数值,例如,使用 atoi()。

【讨论】:

  • "这也是您看到 51 的原因 - 当您尝试将整数存储到 char 中时,您实际上只从流中读取了 8 位(这导致某个值介于 0和 254 基本上只是输入流中的一些 8 位块)。“这是错误的。您获得的价值 - 不仅仅是“流中的一些位”。你读到了char。 char等于'3'的值,在本例中,对应51的ASCII码。
  • W00t?当然,您只能从流中读取 8 位!那么你认为一个 char 有多少位?
猜你喜欢
  • 2015-02-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-15
  • 2020-03-04
  • 2021-06-17
  • 2017-09-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多