所以我正在做另一项任务,我需要你的帮助。我制作了这个程序应该找到一个颜色并输出一个带有颜色坐标和颜色的点。当我输入类似“raudona”(红色)的东西时,它会输出所有内容,但我会在其间输入随机数。当我输入“geltona”(黄色)时,它只输出随机数。
以下是代码:(http://pastebin.com/YtN1vkFk - 使用Uncrustify自动缩进)
#include <iostream>
#include <fstream>
#include <string>
#include <iomanip>
using namespace std;
const int CMax = 100;
struct taskai
{
int x;
int y;
string spalva;
};
struct atrinkti
{
int x;
int y;
string spalva;
};
// --------------------------------
void duomenys(taskai T[], int &n);
void isvedimas(taskai T[], atrinkti A[], int n, string ispal, int maxr);
void spalva(taskai T[], int n);
void atrinkimas(taskai T[], atrinkti A[], int n, string ispal, int &maxr);
// --------------------------------
int main()
{
setlocale(LC_ALL, "Lithuanian");
string ispal;
int n, maxr = 0;
atrinkti A[CMax];
taskai T[CMax];
duomenys(T, n);
cout << "Iveskite spalva:" << endl;
cin >> ispal;
atrinkimas(T, A, n, ispal, maxr);
isvedimas(T, A, n, ispal, maxr);
return 0;
}
void duomenys(taskai T[], int &n)
{
ifstream duom("Duomenys.txt");
duom >> n;
for (int i = 0; i < n; i++)
{
duom >> T[i].spalva;
duom >> T[i].x >> T[i].y;
}
}
void isvedimas(taskai T[], atrinkti A[], int n, string ispal, int maxr)
{
ofstream ras("Rezultatai.txt");
ras << "Pradiniai duomenys: " << endl;
ras << endl;
ras << setfill('-') << setw(40) << "-" << endl;
ras << setfill(' ');
ras << "Spalva" << setw(30) << "Koordinatės" << endl;
ras << endl;
ras << setfill('-') << setw(40) << "-" << endl;
ras << setfill(' ');
for (int i = 0; i < n; i++)
{
ras << setw(5) << T[i].spalva << setw(20) << T[i].x << setw(4) << T[i].y << endl;
}
ras << setfill('-') << setw(40) << "-" << endl;
ras << setfill(' ');
ras << endl;
ras << setfill('_') << setw(40) << "_" << endl;
ras << setfill(' ');
ras << endl;
ras << "Taškai, turintys spalvą " << ispal << " yra: " << endl;
ras << endl;
ras << "Koordinatės" << setw(15) << "Spalva" << endl;
ras << setfill('_') << setw(40) << "_" << endl;
ras << setfill(' ');
for (int i = 0; i <= maxr; i++)
{
ras << setw(3) << A[i].x << setw(4) << A[i].y << setw(20) << A[i].spalva << endl;
}
}
void atrinkimas(taskai T[], atrinkti A[], int n, string ispal, int &maxr)
{
for (int i = 0; i < n; i++)
{
if (ispal == T[i].spalva)
{
A[i].x = T[i].x;
A[i].y = T[i].y;
A[i].spalva = T[i].spalva;
maxr++;
}
}
}
这是输入文件:(http://pastebin.com/3zvZgT8k)
5
raudona -5 1
juoda 1 1
raudona -4 3
geltona 5 5
geltona 6 6
第一个数字是n,然后是颜色和坐标。
答案 0 :(得分:2)
您的问题出在atrinkimas()
。
您同时将索引i
用于两个作业;你需要两个不同的计数器(第二个已经在代码中,称为maxr
):
void atrinkimas(taskai T[], atrinkti A[], int n, string ispal, int &maxr)
{
for (int i = 0; i < n; i++)
{
if (ispal == T[i].spalva)
{
A[maxr].x = T[i].x;
A[maxr].y = T[i].y;
A[maxr].spalva = T[i].spalva;
maxr++;
}
}
}
实际上,您正在将材料复制到A阵列中不一定是连续的位置,从而使大量记录未初始化。因此,例如,使用raudona
,您设置了A[0]
和A[2]
,但随后尝试使用A[0]
和A[1]
。使用geltona
,您设置了A[3]
和A[4]
,但尝试使用A[0]
和A[1]
。因此,印刷使用了未初始化的价值 - 而不是幸福的配方。