二维数组与字符比较
2d array comparing with char
我有一个从文件中读取数据的数组,数据是二进制数字,例如 010011001001 等等,所以数据是我读入二维数组的字符串,但我一直在比较数组为 0。如有任何帮助,我们将不胜感激。
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
int main()
{
string myArr[5000][12];
int i = 0, zeroCount = 0, oneCount = 0;
ifstream inFile;
inFile.open("Day3.txt");
while(!inFile.eof())
{
for(int i = 0; i < 5000; i++)
{
for(int j = 0; j < 12; j++)
{
inFile >> myArr[i][j];
j++;
}
i++;
}
}
for(int j = 0; j < 12; j++)
{
for(int i = 0; i < 5000; i++)
{
if(myArr[i][j].compare("0") == 0)
{
zeroCount++;
}
else
{
oneCount++;
}
i++;
}
if(zeroCount > oneCount)
{
cout << "Gamma is zero for column " << i << endl;
}
else
{
cout << "Gamma is One for column " << i << endl;
}
j++;
}
}
来自文本文件的一些输入:
010110011101
101100111000
100100000011
111000010001
001100010011
010000111100
感谢您编辑问题并提供更多信息。现在,我们可以帮助您。你有2个主要的误解。
- for 循环如何工作?
- C++ 中的
std::string
是什么
让我们从 for 循环开始。您可以在 CPP 参考文献 here. Or, you could look also at the tutorial shown here.
中找到解释
for 循环基本上有 3 个部分:for (part1; part2; part3)
。都是可选的,你可以使用它们,但没有必要使用它们。
- part1 是初始化语句。这里可以declare/define/initialize一个变量。在你的例子中是
int i = 0
。您定义一个数据类型为 int 的变量,并用值 0 对其进行初始化
- part2是条件。循环将运行,直到条件变为假。条件将在循环开始时检查。
- part3 就是所谓的迭代表达式。这个词有点误导。它基本上是在循环结束时执行的语句,在下一个循环 运行 将被执行之前以及再次检查条件之前。
在伪代码中是这样的:
{
init-statement
while ( condition ) {
statement
iteration-expression ;
}
}
这意味着您的代码部分 for(int j = 0; j < 12; j++)
{
int j = 0; // init-statement
while ( j < 12 ) { // while ( condition ) {
inFile >> myArr[i][j]; // Your loop statements
j++; // Your loop statements PROBLEM
j++; // iteration-expression from the for loop
}
}
现在你明白问题所在了。不幸的是,您增加了 'j' 两次。你不需要那样做。 for
循环的最后一部分已经为您完成了。
所以请删除重复的增量语句。
接下来,std::string
字符串,顾名思义,是一串字符,或者在编程语言的上下文中,是一个字符数组。
在 C 中我们过去实际上写 char[42] = "abc";
。所以使用真正的字符数组。问题始终是这样一个字符串的固定长度。这里以 42 为例。在这样的数组中,您只能存储 41 个字符。如果字符串会更长,那么它就无法工作。
C++的发明者解决了这个问题。他们创建了一个动态字符数组,一个可以根据需要增长的数组。他们称这个东西为std::string
。它没有预定义的长度。它会根据需要增长。
所以写成string myArr[5000][12];
说明你没有完全理解这个概念。您不需要 [12]
,因为 string
已经可以容纳 12 个字符。所以,你可以删除它。他们的角色将隐含在那里。如果你写 inFile >> myString
那么提取器运算符 >>
将从流中读取字符直到下一个 space 然后将它存储在你的 myString 变量中,无论字符串有多长。
请阅读 this tutorial 关于字符串的内容。
与 C 风格琴弦相比,这是一个很大的优势。
那么您的代码可能如下所示:
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
int main()
{
string myArr[5000];
int zeroCount = 0, oneCount = 0;
ifstream inFile;
inFile.open("Day3.txt");
while (!inFile.eof())
{
for (int i = 0; i < 5000; i++)
{
inFile >> myArr[i];
}
}
for (int i = 0; i < 5000; i++)
{
zeroCount = 0; oneCount = 0;
for (int j = 0; j < 12; j++)
{
if (myArr[i][j]== '0')
{
zeroCount++;
}
else
{
oneCount++;
}
}
if (zeroCount > oneCount)
{
cout << "Gamma is zero for column " << i << endl;
}
else
{
cout << "Gamma is One for column " << i << endl;
}
}
}
但还有更多。您使用幻数 5000 作为字符串数组。你这样做是因为你认为 5000 总是足够大以容纳所有字符串。但是,如果不是呢?如果您的源文件中有超过 5000 个字符串,那么您的代码将会崩溃。
类似于字符数组的字符串问题,我们在 C++ 中也有一个用于任何类型数据的数组,它可以根据需要动态增长。它叫做 std::vector
,你可以阅读它 here. A tutorial can be found here。
有了它,您可以完全摆脱任何 C 样式数组。但是请继续深入学习C++这门语言,你会理解的越来越多。
您的代码中还有更细微的问题,例如 while(!inFile.eof())
,但这应该稍后解决。
希望能帮到你
我有一个从文件中读取数据的数组,数据是二进制数字,例如 010011001001 等等,所以数据是我读入二维数组的字符串,但我一直在比较数组为 0。如有任何帮助,我们将不胜感激。
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
int main()
{
string myArr[5000][12];
int i = 0, zeroCount = 0, oneCount = 0;
ifstream inFile;
inFile.open("Day3.txt");
while(!inFile.eof())
{
for(int i = 0; i < 5000; i++)
{
for(int j = 0; j < 12; j++)
{
inFile >> myArr[i][j];
j++;
}
i++;
}
}
for(int j = 0; j < 12; j++)
{
for(int i = 0; i < 5000; i++)
{
if(myArr[i][j].compare("0") == 0)
{
zeroCount++;
}
else
{
oneCount++;
}
i++;
}
if(zeroCount > oneCount)
{
cout << "Gamma is zero for column " << i << endl;
}
else
{
cout << "Gamma is One for column " << i << endl;
}
j++;
}
}
来自文本文件的一些输入: 010110011101 101100111000 100100000011 111000010001 001100010011 010000111100
感谢您编辑问题并提供更多信息。现在,我们可以帮助您。你有2个主要的误解。
- for 循环如何工作?
- C++ 中的
std::string
是什么
让我们从 for 循环开始。您可以在 CPP 参考文献 here. Or, you could look also at the tutorial shown here.
中找到解释for 循环基本上有 3 个部分:for (part1; part2; part3)
。都是可选的,你可以使用它们,但没有必要使用它们。
- part1 是初始化语句。这里可以declare/define/initialize一个变量。在你的例子中是
int i = 0
。您定义一个数据类型为 int 的变量,并用值 0 对其进行初始化
- part2是条件。循环将运行,直到条件变为假。条件将在循环开始时检查。
- part3 就是所谓的迭代表达式。这个词有点误导。它基本上是在循环结束时执行的语句,在下一个循环 运行 将被执行之前以及再次检查条件之前。
在伪代码中是这样的:
{
init-statement
while ( condition ) {
statement
iteration-expression ;
}
}
这意味着您的代码部分 for(int j = 0; j < 12; j++)
{
int j = 0; // init-statement
while ( j < 12 ) { // while ( condition ) {
inFile >> myArr[i][j]; // Your loop statements
j++; // Your loop statements PROBLEM
j++; // iteration-expression from the for loop
}
}
现在你明白问题所在了。不幸的是,您增加了 'j' 两次。你不需要那样做。 for
循环的最后一部分已经为您完成了。
所以请删除重复的增量语句。
接下来,std::string
字符串,顾名思义,是一串字符,或者在编程语言的上下文中,是一个字符数组。
在 C 中我们过去实际上写 char[42] = "abc";
。所以使用真正的字符数组。问题始终是这样一个字符串的固定长度。这里以 42 为例。在这样的数组中,您只能存储 41 个字符。如果字符串会更长,那么它就无法工作。
C++的发明者解决了这个问题。他们创建了一个动态字符数组,一个可以根据需要增长的数组。他们称这个东西为std::string
。它没有预定义的长度。它会根据需要增长。
所以写成string myArr[5000][12];
说明你没有完全理解这个概念。您不需要 [12]
,因为 string
已经可以容纳 12 个字符。所以,你可以删除它。他们的角色将隐含在那里。如果你写 inFile >> myString
那么提取器运算符 >>
将从流中读取字符直到下一个 space 然后将它存储在你的 myString 变量中,无论字符串有多长。
请阅读 this tutorial 关于字符串的内容。
与 C 风格琴弦相比,这是一个很大的优势。
那么您的代码可能如下所示:
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
int main()
{
string myArr[5000];
int zeroCount = 0, oneCount = 0;
ifstream inFile;
inFile.open("Day3.txt");
while (!inFile.eof())
{
for (int i = 0; i < 5000; i++)
{
inFile >> myArr[i];
}
}
for (int i = 0; i < 5000; i++)
{
zeroCount = 0; oneCount = 0;
for (int j = 0; j < 12; j++)
{
if (myArr[i][j]== '0')
{
zeroCount++;
}
else
{
oneCount++;
}
}
if (zeroCount > oneCount)
{
cout << "Gamma is zero for column " << i << endl;
}
else
{
cout << "Gamma is One for column " << i << endl;
}
}
}
但还有更多。您使用幻数 5000 作为字符串数组。你这样做是因为你认为 5000 总是足够大以容纳所有字符串。但是,如果不是呢?如果您的源文件中有超过 5000 个字符串,那么您的代码将会崩溃。
类似于字符数组的字符串问题,我们在 C++ 中也有一个用于任何类型数据的数组,它可以根据需要动态增长。它叫做 std::vector
,你可以阅读它 here. A tutorial can be found here。
有了它,您可以完全摆脱任何 C 样式数组。但是请继续深入学习C++这门语言,你会理解的越来越多。
您的代码中还有更细微的问题,例如 while(!inFile.eof())
,但这应该稍后解决。
希望能帮到你