我正在尝试编写一个程序,如果某个小狗主人的小狗离小狗主人一定距离,该程序会提醒用户。
具体来说,以下程序:
首先要求用户输入所有者的位置,即输入2个整数a
和b
。
然后要求用户输入所有者拥有的幼犬数量。这是一个正整数n
。
对于n个幼犬中的每只幼犬i
,程序要求用户输入幼犬i的位置。这是2个整数x
和y
,它们当然都取决于i。
如果计算出小狗i与主人的距离大于10个单位,则程序应通过打印i来通知用户。
最后,程序应告诉用户已打印其数量的幼犬总数。这个数字由变量count
(一个正整数)表示。
以下是示例案例
输入: (所有者位置)2 1 (幼犬数)4 (位置幼犬)(15 15),(14 -2),(1 3),(0 4)
输出: 幼犬1和幼犬2距离太远 共有2只幼犬距离太远
当我尝试运行该程序时,该程序输出一个问号而不是i
。请问我做错了什么?
#include <iostream>
#include <string>
#include <cmath>
using namespace std;
int main() {
string puppies;
int a,b;
cin>>a>>b;
int n;
cin>>n;
int i,x,y,count=0;
for (i=1;i<=n;i++){
cin>>x>>y;
int dist;
dist=abs(a-x)+abs(b-y);
if (dist>10){
count++;
puppies += i;
}
}
if (count==1){
cout<<"Puppy "<<puppies[0]<<" too far away"<<endl;
cout<<"Total "<< count <<" puppy too far away";
}
if (count>1){
int j;
for (j=0;j<=(count-2);j++){
cout<<"Puppy "<<puppies[j]<<" and"<<" ";
}
cout<<"Puppy "<<puppies[count-1]<<" too far away"<<endl;
cout<<"Total "<< count <<" puppies too far away";
}
if (count==0){
cout<<"No puppies too far away";
}
}
这是复制的输出(与上述情况相同)
小狗和小狗距离太远 共有2只幼犬距离太远按任何键继续。 。
这是屏幕截图
答案 0 :(得分:5)
您正在尝试使用std::string
作为数字的容器。当然,它可以对足够小的对象执行此操作,但是您可能需要切换到std::vector<int>
。
您实际上观察到的问题是puppies[0]
是char
,在std::cout << puppies[0]
中它被解释为单个文本字符,在您的情况下是对应于一个不可打印的字符,因此外壳显示了问号。您可以通过使用static_cast<int>(puppies[0])
进行显式转换来解决此问题,但是再次建议使用适合实际数字的容器。
答案 1 :(得分:3)
puppies += i;
如果查看过载集,您会发现int
没有过载。但是,char
有一个过载。所有整数类型都可以隐式转换为其他整数类型,在这种情况下,int
被转换为char
。附加到字符串的字符是用整数值表示的字符。什么整数值代表什么字符取决于系统使用的字符集。
您可能打算将整数附加在文本表示形式中。您可以使用std::to_string
将整数转换为字符串。
也就是说,将字符串用于此目的似乎是倒退,因为您似乎没有将其用作字符串,而是更像是整数数组。因此,整数向量可能是更明智的选择。