我正在尝试解决此问题,但是我无法弄清楚如何消除错误。我看过的其他使用数组和函数的代码看起来相同并且可以工作,但是由于某些原因我的代码无法工作。这些是我得到的错误:
Error E2121 Q1.cpp 27: Function call missing ) in function main()
Error E2449 Q1.cpp 32: Size of 'fifty' is unknown or zero
Error E2356 Q1.cpp 32: Type mismatch in redeclaration of 'fifty(int)'
Error E2344 Q1.cpp 10: Earlier declaration of 'fifty(int)'
Error E2063 Q1.cpp 32: Illegal initialization
Error E2293 Q1.cpp 32: ) expected
Error E2141 Q1.cpp 71: Declaration syntax error
#include <math.h>
#include <stdio.h>
#include <iostream>
void fifty(int money);
void twenty(int money);
void ten(int money);
void five(int money);
int main()
{
int money[5]; /*this contians all info about change and the money that you want change for*/
printf("Enter cash amount: ");
scanf("%d", &money[1]);
fifty(money[5]); /*Passing the array to each module*/
twenty(money[5]);
ten(money[5]);
five(money[5]);
/*The next two lines should print out how many of each denomination is needed*/
printf("Change to be given: \n");
printf("50 = %d, 20 = %d, 10 = %d, 5 = %d" money[1], money[2], money[3], money[4]);
return(0);
}
void fifty(int money, int 5)
{
/*This is getting the whole array from main() and modifying the values of each index*/
if (money[0] > 50) {
money[0] = money[0] - 50;
money[1]++;
}
return;
}
void twenty(int money, int 5)
{
if (money[0] > 20) {
money[0] = money[0] - 20;
money[2]++;
}
return;
}
void ten(int money, int 5)
{
if (money[0] > 10) {
money[0] = money[0] - 10;
money[3]++;
}
return;
}
void five(int money, int 5)
{
if (money[0] > 5) {
money[0] = money[0] - 5;
money[4]++;
}
return;
}
答案 0 :(得分:3)
在主要
中缺少逗号
printf("50 = %d, 20 = %d, 10 = %d, 5 = %d" money[1], money[2], money[3], money[4]);
必须
printf("50 = %d, 20 = %d, 10 = %d, 5 = %d", money[1], money[2], money[3], money[4]);
在
void fifty(int money, int 5)
您不能用数字命名参数,您期望什么?
void 函数末尾的return;
也没用
在 main 中,您没有初始化money[0]
,但是所有其他函数都测试了它的值,该行为未定义。可能你想做
scanf("%d", &money[0]);
我还建议您检查通过 scanf 输入的值,并检查返回1。请注意,您使用的是C ++,因此也可以使用 istream运算符>>
在另一个功能中,您增加了 money 中的条目,但这些条目未初始化,可能是您想要的:
int money[5] = {0};
将5个元素初始化为0
并且由于您需要在另一个函数中访问数组中的多个元素,因此不必给出特定的元素,而是给出所有数组,例如:
fifty(money[5]);
必须
fifty(money);
与其他通话相同
请注意,您假设每个值只有0或1倍,例如
void fifty(int money)
{
/*This is getting the whole array from main() and modifying the values of each index*/
if (money[0] > 50) {
money[0] = money[0] - 50;
money[1]++;
}
}
如果货币为100,则必须将money[1]
设置为2而不是1:
void fifty(int money[])
{
/*This is getting the whole array from main() and modifying the values of each index*/
money[1] = money[0]/50;
money[0] %= 50;
}
并为每个值对所有函数产生相似的定义,这是没有用的,您只能定义一个函数来获取值和要设置的索引,例如:
void count(int money[], int value, int index)
{
money[index] = money[0]/value;
money[0] %= value;
}
而不是打电话
fifty(money); twenty(money); ten(money); five(money);
你可以做
count(money, 50, 1);
count(money, 20, 2);
count(money, 10, 3);
count(money, 5, 4);
或使用其他任何方式,例如循环
请注意,您未指定值1的数量,这很奇怪
考虑到我的言论的提案:
#include <stdio.h>
void count(int money[], int index, int value);
int main()
{
int money[5]; // useless to initialize it because I just assign entries
printf("Enter cash amount: ");
if (scanf("%d", &money[0]) != 1) {
puts("invalid input, abort");
return -1;
}
count(money, 50, 1);
count(money, 20, 2);
count(money, 10, 3);
count(money, 5, 4);
/*The next two lines should print out how many of each denomination is needed*/
printf("Change to be given: \n");
printf("50 = %d, 20 = %d, 10 = %d, 5 = %d\n", money[1], money[2], money[3], money[4]);
return(0);
}
void count(int money[], int value, int index)
{
money[index] = money[0]/value;
money[0] %= value;
}
编译和执行:
pi@raspberrypi:/tmp $ g++ -pedantic -Wall -Werror e.cc
pi@raspberrypi:/tmp $ ./a.out
Enter cash amount: 275
Change to be given:
50 = 5, 20 = 1, 10 = 0, 5 = 1
pi@raspberrypi:/tmp $
并使用 iostream 而不是 stdio :
#include <iostream>
void count(int money[], int index, int value);
int main()
{
int money[5]; // useless to initialize it because I just assign entries
std::cout << "Enter cash amount: ";
if (! (std::cin >> money[0])) {
std::cout << "invalid input, abort" << std::endl;
return -1;
}
count(money, 50, 1);
count(money, 20, 2);
count(money, 10, 3);
count(money, 5, 4);
std::cout << "Change to be given: \n"
<< "50 = " << money[1]
<< ", 20 = " << money[2]
<< ", 10 = " << money[3]
<< ", 5 = " << money[4] << std::endl;
return(0);
}
void count(int money[], int value, int index)
{
money[index] = money[0]/value;
money[0] %= value;
}
最后是一个在数组中指示值的版本,只允许更改一行代码即可更改帐单列表:
#include <iostream>
void count(int money[], int value, int index);
int main()
{
const int value[] = { 50, 20, 10, 5, 1 }; // list of biils
int money[sizeof(value)/sizeof(value[0]) + 1];
std::cout << "Enter cash amount: ";
if (! (std::cin >> money[0])) {
std::cout << "invalid input, abort" << std::endl;
return -1;
}
for (size_t i = 0; i != sizeof(value)/sizeof(value[0]); ++i)
count(money, value[i], i+1);
std::cout << "Change to be given: \n";
for (size_t i = 0; i != sizeof(value)/sizeof(value[0]); ++i) {
if (i != 0)
std::cout << ", ";
std::cout << value[i] << " = " << money[i+1];
}
std::cout << std::endl;
return(0);
}
void count(int money[], int value, int index)
{
money[index] = money[0]/value;
money[0] %= value;
}
编译和执行:
pi@raspberrypi:/tmp $ ./a.out
Enter cash amount: 276
Change to be given:
50 = 5, 20 = 1, 10 = 0, 5 = 1, 1 = 1
现在 count 仅在代码中的一个位置被调用,因此可以移动它的主体以替换其调用来删除它:
#include <iostream>
int main()
{
const int value[] = { 50, 20, 10, 5, 1 }; // list of bills
int money[sizeof(value)/sizeof(value[0]) + 1];
std::cout << "Enter cash amount: ";
if (! (std::cin >> money[0])) {
std::cout << "invalid input, abort" << std::endl;
return -1;
}
for (size_t i = 0; i != sizeof(value)/sizeof(value[0]); ++i){
money[i + 1] = money[0]/value[i];
money[0] %= value[i];
}
std::cout << "Change to be given: \n";
for (size_t i = 0; i != sizeof(value)/sizeof(value[0]); ++i) {
if (i != 0)
std::cout << ", ";
std::cout << value[i] << " = " << money[i+1];
}
std::cout << std::endl;
return(0);
}
例如,如果我还要考虑100的账单,我只需要用const int value[] = { 50, 20, 10, 5, 1 };
替换const int value[] = { 100, 50, 20, 10, 5, 1 };
,而不必在代码中进行其他更改。这样做对于代码的可维护性非常重要。
答案 1 :(得分:1)
哦,亲爱的。这有很多错误。
#include <math.h>
#include <stdio.h>
#include <iostream>
void fifty(int money);
这声明了一个采用单个整数的函数。实际上,您需要传递五个整数的数组。不幸的是,您不能简单地声明一个函数,该函数采用正好由五个整数组成的数组,而只是声明它为一个指向整数的指针:
void fifty(int* money);
void twenty(int* money);
void ten(int* money);
void five(int* money);
int main()
{
/*this contians all info about change and the money that you want change for*/
int money[5];
Typo(应该是“ contains”),并且您已经定义了一个数组,但是尚未初始化它-因此它将包含不确定的值。您需要对其进行初始化,使其包含零(我进一步进行的某些更改实际上意味着您不需要对其进行初始化-因为我设置了变量而不是递增):
int money[5] = {};
printf("Enter cash amount: ");
scanf("%d", &money[1]);
这会将值存储在money[1]
中。您实际上想要money[0]
-所以:
scanf("%d", &money[0]);
fifty(money[5]); /*Passing the array to each module*/
不传递数组,而是传递偏移量为5的单个元素-不存在。仅有的条目是money[0]
,money[1]
,money[2]
,money[3]
,money[4]
。
fifty(money); // Pass the whole array to each function
twenty(money);
ten(money);
five(money);
/*The next two lines should print out how many of each denomination is needed*/
printf("Change to be given: \n");
printf("50 = %d, 20 = %d, 10 = %d, 5 = %d" money[1], money[2], money[3], money[4]);
您需要在字符串后加一个逗号:
printf("50 = %d, 20 = %d, 10 = %d, 5 = %d", money[1], money[2], money[3], money[4]);
return(0);
}
void fifty(int money, int 5)
这不是您声明一个将数组作为参数的函数的方式:
void fifty(int* money)
{
//This is getting the whole array from main() and modifying the values of each index
if (money[0] > 50) {
money[0] = money[0] - 50;
money[1]++;
}
return;
是的。这样就可以工作(一旦我们将数组初始化为零),但是如果我在提示符下输入440
会发生什么情况-这只会输出一张50美元的钞票-我要八个!
相反,您需要将money[1]
增加money[0]/50
(甚至更好,只需将其设置为该值),然后将money[0]
设置为余数。很好的效果是您然后不需要if
(因为除法向下取整)。
您也不需要退货-但您可以随意退还。
void fifty(int* money)
{
money[1] = money[0]/50;
money[0] = money[0]%50; // Must do this second.
return;
}
void twenty(int *money)
{
if (money[0] > 20) {
money[0] = money[0] - 20;
money[2]++;
}
return;
}
等一下!我们之前已经看过这段代码!除了它上次使用偏移量1和50的量。功能的时间。这有点讨厌,因为对两种类型都使用int
意味着以错误的方式获取参数实在太容易了。正确的解决方案是使money
成为struct
,并使用指向成员变量的指针来实现“偏移量”-但我怀疑目前这有点麻烦。
void change(int* money, int bill, int offset)
{
money[offset] = money[0]/bill;
money[0] = money[0]%bill; // Must be second.
}
void fifty(int* money)
{
change(money, 1, 50);
}
void twenty(int* money)
{
change(money, 2, 20);
}
void ten(int* money)
{
change(money, 3, 10);
}
void five(int* money)
{
change(money, 4, 5);
}
最后,以 just 为例,以错误的方式获取change
的参数是多么容易,上面的代码正是我键入的方式-我只是做了那。固定这些参数留给读者练习。