所以我的上学任务如下:
编写一个程序,要求用户输入一系列单个数字的数字,而不会将它们分开。将输入读取为C字符串对象。程序应显示字符串中所有单位数字的总和。例如,如果用户输入2518,程序应显示16,即2,5,1和8的总和。程序还应显示字符串中的最高位和最低位。
示例输出:
输入一系列数字,它们之间没有空格。
2518
这些数字的总和是16
最高位是8
最低位是1
这是我的代码:
#include<iostream>
#include <cstdlib>
#include<cstring>
using namespace std;
char input[100];
int x[100];
void user_input(char[]);
void char_int_conversion(char[],int[]);
void lowest_highest_digit(int[]);
int main()
{
user_input(input);
char_int_conversion(input,x);
lowest_highest_digit(x);
return 0;
}
void user_input(char input[])
{
cout<<"Enter a series of digits with no spaces between them";
cin>>input;
}
void char_int_conversion(char input[],int x[])
{
for(int i=0;i<=100,i++;)
x[i]=atoi(input[i]);
}
void lowest_highest_digit(int x[])
{
int lowest=x[0];
int highest=x[0];
int total=0;
for(int i=0;i<=100,i++;)
if(x[i]<lowest)
lowest=x[i];
for(int i=0;i<=100,i++;)
if(x[i]>highest)
highest=x[i];
for(int i=0;i<=100,i++;)
total = total+x[i];
cout<<"The sum of those digits is: "<<total<<endl
<<"The highest digit is: "<<highest<<endl
<<"The lowest digit is: "<<lowest<<endl;
}
在第31行,我使用atoi函数将char数组输入转换为整数数组x,我得到一个错误,说明类型&#34; char的参数与类型&#34; const char&#34的参数不兼容;。
如果我从atoi(input [i])删除[i]我可以得到程序来构建,但是所有的输出变量都等于0;
非常感谢任何帮助!
答案 0 :(得分:2)
最重要的解决方法是:
for(int i=0;i<=100,i++;)
x[i]=atoi(input[i]);
应该是这样的:
for (int i = 0; i < n; i++)
x[i] = input[i] - '0';
你看,数组的索引从零开始,以size_of_array结尾 - 1.因此,你应该使用<
而不是<=
。
此外,for循环语法错误。
此外,您希望将每个数字转换为整数,因此atoi()
不是您想要的。相反,你应该使用我上面写的,取自this回答。
一个基本问题是,无论用户键入多少位数,您都会读取整个数组,所有100个单元格。您应该只检查数组的第一个n
单元格,其中n
是用户键入的位数。
char c;
while ((cin.peek()!='\n') && cin >> c)
{
input[n] = c;
n++;
}
您看,我使用n
来跟踪用户键入的位数!
其他单元格,在n
第一个未初始化之后,它们包含垃圾值!
把它们放在一起你有:
#include <iostream>
#include <cstdlib>
#include <cstring>
using namespace std;
char input[100];
int x[100];
int n = 0;
void user_input(char[]);
void char_int_conversion(char[], int[]);
void lowest_highest_digit(int[]);
int main() {
user_input(input);
char_int_conversion(input, x);
lowest_highest_digit(x);
return 0;
}
void user_input(char input[]) {
cout << "Enter a series of digits with no spaces between them\n";
char c;
while ((cin.peek()!='\n') && cin >> c)
{
input[n] = c;
n++;
}
}
void char_int_conversion(char input[], int x[]) {
//for (int i = 0; i <= 100, i++;)
for (int i = 0; i < n; i++)
x[i] = input[i] - '0';
}
void lowest_highest_digit(int x[]) {
int lowest = x[0];
int highest = x[0];
int total = 0;
for (int i = 0; i < n; i++)
if (x[i] < lowest)
lowest = x[i];
for (int i = 0; i < n; i++)
if (x[i] > highest)
highest = x[i];
for (int i = 0; i < n; i++)
total = total + x[i];
cout << "The sum of those digits is: " << total << endl
<< "The highest digit is: " << highest << endl << "The lowest digit is: "
<< lowest << endl;
}
我相信你还没有学会如何将变量传递给函数,这就是你使用全局变量的原因。如果不是这样,那么就摆脱全局变量。
此外,由于这是C ++,您可能希望使用std::vector。这样您就不必考虑阵列应该有多少单元格,或者跟踪手动给出的数字。请参阅warsac的答案,该答案在编辑后可能无效,但提出了使用向量解决问题的想法。
答案 1 :(得分:1)
for(int i=0;i<=100,i++;)
应为for(int i=0;i<100;i++)
&lt; - 这可能会产生垃圾值。有关更详细的解释,请参阅Samaras的答案
atoi拿了一个指针,你正在传递一个数字。
答案 2 :(得分:1)
编辑:自问题更新以来,这显然无效。
如果您知道要从标准输入中读取多少个数字,您可以执行以下操作:
#include <vector>
#include <iostream>
using namespace std;
void PrintLargeSmallAndSum(const vector<int>& v)
{
if(v.empty())
return;
int min = v[0];
int max = v[0];
int sum = 0;
for(int i = 0; i < v.size(); ++i)
{
sum += v[i];
if(v[i] < min)
min = v[i];
if(v[i] > max)
max = v[i];
}
cout<<"The sum of those digits is: "<<sum<<endl
<<"The highest digit is: "<<max<<endl
<<"The lowest digit is: "<<min<<endl;
}
int main()
{
vector<int> v;
for(int i = 0; i < 100; ++i)
{
int number;
cin >> number;
v.push_back(number);
}
PrintLargeSmallAndSum(v);
}